diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..7090209 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,223 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } + +.medium .chart { border:1px solid #666; } +.medium .cover-fill { background: #666; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } +.medium { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..c7ff5a5 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,79 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..dcdc51e --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ All files +

+
+
+ 0% + Statements + 0/521 +
+
+ 0% + Branches + 0/278 +
+
+ 0% + Functions + 0/133 +
+
+ 0% + Lines + 0/506 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
tailored.js
0%0/5210%0/2780%0/1330%0/506
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/lib/index.html b/coverage/lcov-report/lib/index.html new file mode 100644 index 0000000..0a8d0fa --- /dev/null +++ b/coverage/lcov-report/lib/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for lib + + + + + + + +
+
+

+ All files lib +

+
+
+ 0% + Statements + 0/521 +
+
+ 0% + Branches + 0/278 +
+
+ 0% + Functions + 0/133 +
+
+ 0% + Lines + 0/506 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
tailored.js
0%0/5210%0/2780%0/1330%0/506
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/lib/tailored.js.html b/coverage/lcov-report/lib/tailored.js.html new file mode 100644 index 0000000..25ffff4 --- /dev/null +++ b/coverage/lcov-report/lib/tailored.js.html @@ -0,0 +1,3483 @@ + + + + Code coverage report for lib/tailored.js + + + + + + + +
+
+

+ All files / lib tailored.js +

+
+
+ 0% + Statements + 0/521 +
+
+ 0% + Branches + 0/278 +
+
+ 0% + Functions + 0/133 +
+
+ 0% + Lines + 0/506 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
'use strict';
+ 
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+ 
+var ErlangTypes = _interopDefault(require('erlang-types'));
+ 
+/* @flow */
+ 
+class Variable {
+  constructor(name = null, default_value = Symbol.for('tailored.no_value')) {
+    this.name = name;
+    this.default_value = default_value;
+  }
+}
+ 
+class Wildcard {
+  constructor() {}
+}
+ 
+class StartsWith {
+  constructor(prefix) {
+    this.prefix = prefix;
+  }
+}
+ 
+class Capture {
+  constructor(value) {
+    this.value = value;
+  }
+}
+ 
+class HeadTail {
+  constructor(head, tail) {
+    this.head = head;
+    this.tail = tail;
+  }
+}
+ 
+class Type {
+  constructor(type, objPattern = {}) {
+    this.type = type;
+    this.objPattern = objPattern;
+  }
+}
+ 
+class Bound {
+  constructor(value) {
+    this.value = value;
+  }
+}
+ 
+class BitStringMatch {
+  constructor(...values) {
+    this.values = values;
+  }
+ 
+  length() {
+    return values.length;
+  }
+ 
+  bit_size() {
+    return this.byte_size() * 8;
+  }
+ 
+  byte_size() {
+    let s = 0;
+ 
+    for (let val of this.values) {
+      s = s + val.unit * val.size / 8;
+    }
+ 
+    return s;
+  }
+ 
+  getValue(index) {
+    return this.values(index);
+  }
+ 
+  getSizeOfValue(index) {
+    let val = this.getValue(index);
+    return val.unit * val.size;
+  }
+ 
+  getTypeOfValue(index) {
+    return this.getValue(index).type;
+  }
+}
+ 
+class NamedVariableResult {
+  constructor(name, value) {
+    this.name = name;
+    this.value = value;
+  }
+}
+ 
+function variable(name = null, default_value = Symbol.for('tailored.no_value')) {
+  return new Variable(name, default_value);
+}
+ 
+function wildcard() {
+  return new Wildcard();
+}
+ 
+function startsWith(prefix) {
+  return new StartsWith(prefix);
+}
+ 
+function capture(value) {
+  return new Capture(value);
+}
+ 
+function headTail(head, tail) {
+  return new HeadTail(head, tail);
+}
+ 
+function type(type, objPattern = {}) {
+  return new Type(type, objPattern);
+}
+ 
+function bound(value) {
+  return new Bound(value);
+}
+ 
+function bitStringMatch(...values) {
+  return new BitStringMatch(...values);
+}
+ 
+function namedVariableResult(name, value) {
+  return new NamedVariableResult(name, value);
+}
+ 
+/* @flow */
+ 
+function is_number(value) {
+  return typeof value === 'number';
+}
+ 
+function is_string(value) {
+  return typeof value === 'string';
+}
+ 
+function is_boolean(value) {
+  return typeof value === 'boolean';
+}
+ 
+function is_symbol(value) {
+  return typeof value === 'symbol';
+}
+ 
+function is_object(value) {
+  return typeof value === 'object';
+}
+ 
+function is_variable(value) {
+  return value instanceof Variable;
+}
+ 
+function is_bitstring(value) {
+  return value instanceof BitStringMatch;
+}
+ 
+function is_null(value) {
+  return value === null;
+}
+ 
+function is_array(value) {
+  return Array.isArray(value);
+}
+ 
+function is_function(value) {
+  return typeof value === 'function' || value instanceof Function;
+}
+ 
+function is_map(value) {
+  return value instanceof Map;
+}
+ 
+function is_pid(value) {
+  return value instanceof ErlangTypes.PID;
+}
+ 
+function is_tuple(value) {
+  return value instanceof ErlangTypes.Tuple;
+}
+ 
+function is_reference(value) {
+  return value instanceof ErlangTypes.Reference;
+}
+ 
+function arrayEquals(left, right) {
+  if (!Array.isArray(right)) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  for (let i = 0; i < left.length; i++) {
+    if (equals(left[i], right[i]) === false) {
+      return false;
+    }
+  }
+ 
+  return true;
+}
+ 
+function tupleEquals(left, right) {
+  if (right instanceof ErlangTypes.Tuple === false) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  return arrayEquals(left.values, right.values);
+}
+ 
+function bitstringEquals(left, right) {
+  if (right instanceof ErlangTypes.BitString === false) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  return arrayEquals(left.value, right.value);
+}
+ 
+function pidEquals(left, right) {
+  if (right instanceof ErlangTypes.PID === false) {
+    return false;
+  }
+ 
+  return left.id === right.id;
+}
+ 
+function referenceEquals(left, right) {
+  if (right instanceof ErlangTypes.Reference === false) {
+    return false;
+  }
+ 
+  return left.id === right.id;
+}
+ 
+function mapEquals(left, right) {
+  if (right instanceof Map === false) {
+    return false;
+  }
+ 
+  const leftEntries = Array.from(left.entries());
+  const rightEntries = Array.from(right.entries());
+ 
+  return arrayEquals(leftEntries, rightEntries);
+}
+ 
+function equals(left, right) {
+  if (Array.isArray(left)) {
+    return arrayEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.Tuple) {
+    return tupleEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.PID) {
+    return pidEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.BitString) {
+    return bitstringEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.Reference) {
+    return referenceEquals(left, right);
+  }
+ 
+  if (left instanceof Map) {
+    return mapEquals(left, right);
+  }
+ 
+  return left === right;
+}
+ 
+function is_non_primitive(key) {
+  return is_array(key) || is_map(key) || is_pid(key) || is_reference(key) || is_bitstring(key) || is_tuple(key);
+}
+ 
+function has(map, key) {
+  if (is_non_primitive(key)) {
+    for (const map_key of map.keys()) {
+      if (equals(map_key, key)) {
+        return true;
+      }
+    }
+ 
+    return false;
+  }
+ 
+  return map.has(key);
+}
+ 
+function get(map, key) {
+  if (is_non_primitive(key)) {
+    for (const map_key of map.keys()) {
+      if (equals(map_key, key)) {
+        return map.get(map_key);
+      }
+    }
+ 
+    return null;
+  }
+ 
+  return map.get(key);
+}
+ 
+var Utils = {
+  get,
+  has,
+  equals
+};
+ 
+/* @flow */
+ 
+const BitString = ErlangTypes.BitString;
+function resolveSymbol(pattern) {
+  return function (value) {
+    return is_symbol(value) && value === pattern;
+  };
+}
+ 
+function resolveString(pattern) {
+  return function (value) {
+    return is_string(value) && value === pattern;
+  };
+}
+ 
+function resolveNumber(pattern) {
+  return function (value) {
+    return is_number(value) && value === pattern;
+  };
+}
+ 
+function resolveBoolean(pattern) {
+  return function (value) {
+    return is_boolean(value) && value === pattern;
+  };
+}
+ 
+function resolveFunction(pattern) {
+  return function (value) {
+    return is_function(value) && value === pattern;
+  };
+}
+ 
+function resolveNull(pattern) {
+  return function (value) {
+    return is_null(value);
+  };
+}
+ 
+function resolveBound(pattern) {
+  return function (value, args) {
+    if (typeof value === typeof pattern.value && value === pattern.value) {
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveWildcard() {
+  return function () {
+    return true;
+  };
+}
+ 
+function resolveVariable(pattern) {
+  return function (value, args) {
+    if (pattern.name === null) {
+      args.push(value);
+    } else if (pattern.name !== '_') {
+      args.push(namedVariableResult(pattern.name, value));
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveHeadTail(pattern) {
+  const headMatches = buildMatch(pattern.head);
+  const tailMatches = buildMatch(pattern.tail);
+ 
+  return function (value, args) {
+    if (!is_array(value) || value.length === 0) {
+      return false;
+    }
+ 
+    const head = value[0];
+    const tail = value.slice(1);
+ 
+    if (headMatches(head, args) && tailMatches(tail, args)) {
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveCapture(pattern) {
+  const matches = buildMatch(pattern.value);
+ 
+  return function (value, args) {
+    if (matches(value, args)) {
+      args.push(value);
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveStartsWith(pattern) {
+  const prefix = pattern.prefix;
+ 
+  return function (value, args) {
+    if (is_string(value) && value.startsWith(prefix)) {
+      args.push(value.substring(prefix.length));
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveType(pattern) {
+  return function (value, args) {
+    if (value instanceof pattern.type) {
+      const matches = buildMatch(pattern.objPattern);
+      return matches(value, args);
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveArray(pattern) {
+  const matches = pattern.map(x => buildMatch(x));
+ 
+  return function (value, args) {
+    if (!is_array(value) || value.length != pattern.length) {
+      return false;
+    }
+ 
+    return value.every(function (v, i) {
+      return matches[i](value[i], args);
+    });
+  };
+}
+ 
+function resolveMap(pattern) {
+  let matches = new Map();
+ 
+  const keys = Array.from(pattern.keys());
+ 
+  for (let key of keys) {
+    matches.set(key, buildMatch(pattern.get(key)));
+  }
+ 
+  return function (value, args) {
+    if (!is_map(value) || pattern.size > value.size) {
+      return false;
+    }
+ 
+    for (const key of keys) {
+      if (!Utils.has(value, key) || !Utils.get(matches, key)(Utils.get(value, key), args)) {
+        return false;
+      }
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveObject(pattern) {
+  let matches = {};
+ 
+  const keys = Object.keys(pattern).concat(Object.getOwnPropertySymbols(pattern));
+ 
+  for (let key of keys) {
+    matches[key] = buildMatch(pattern[key]);
+  }
+ 
+  return function (value, args) {
+    if (!is_object(value) || pattern.length > value.length) {
+      return false;
+    }
+ 
+    for (let key of keys) {
+      if (!(key in value) || !matches[key](value[key], args)) {
+        return false;
+      }
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveBitString(pattern) {
+  let patternBitString = [];
+ 
+  for (let bitstringMatchPart of pattern.values) {
+    if (is_variable(bitstringMatchPart.value)) {
+      let size = getSize(bitstringMatchPart.unit, bitstringMatchPart.size);
+      fillArray(patternBitString, size);
+    } else {
+      patternBitString = patternBitString.concat(new BitString(bitstringMatchPart).value);
+    }
+  }
+ 
+  let patternValues = pattern.values;
+ 
+  return function (value, args) {
+    let bsValue = null;
+ 
+    if (!is_string(value) && !(value instanceof BitString)) {
+      return false;
+    }
+ 
+    if (is_string(value)) {
+      bsValue = new BitString(BitString.binary(value));
+    } else {
+      bsValue = value;
+    }
+ 
+    let beginningIndex = 0;
+ 
+    for (let i = 0; i < patternValues.length; i++) {
+      let bitstringMatchPart = patternValues[i];
+ 
+      if (is_variable(bitstringMatchPart.value) && bitstringMatchPart.type == 'binary' && bitstringMatchPart.size === undefined && i < patternValues.length - 1) {
+        throw new Error('a binary field without size is only allowed at the end of a binary pattern');
+      }
+ 
+      let size = 0;
+      let bsValueArrayPart = [];
+      let patternBitStringArrayPart = [];
+      size = getSize(bitstringMatchPart.unit, bitstringMatchPart.size);
+ 
+      if (i === patternValues.length - 1) {
+        bsValueArrayPart = bsValue.value.slice(beginningIndex);
+        patternBitStringArrayPart = patternBitString.slice(beginningIndex);
+      } else {
+        bsValueArrayPart = bsValue.value.slice(beginningIndex, beginningIndex + size);
+        patternBitStringArrayPart = patternBitString.slice(beginningIndex, beginningIndex + size);
+      }
+ 
+      if (is_variable(bitstringMatchPart.value)) {
+        switch (bitstringMatchPart.type) {
+          case 'integer':
+            if (bitstringMatchPart.attributes && bitstringMatchPart.attributes.indexOf('signed') != -1) {
+              args.push(new Int8Array([bsValueArrayPart[0]])[0]);
+            } else {
+              args.push(new Uint8Array([bsValueArrayPart[0]])[0]);
+            }
+            break;
+ 
+          case 'float':
+            if (size === 64) {
+              args.push(Float64Array.from(bsValueArrayPart)[0]);
+            } else if (size === 32) {
+              args.push(Float32Array.from(bsValueArrayPart)[0]);
+            } else {
+              return false;
+            }
+            break;
+ 
+          case 'bitstring':
+            args.push(createBitString(bsValueArrayPart));
+            break;
+ 
+          case 'binary':
+            args.push(String.fromCharCode.apply(null, new Uint8Array(bsValueArrayPart)));
+            break;
+ 
+          case 'utf8':
+            args.push(String.fromCharCode.apply(null, new Uint8Array(bsValueArrayPart)));
+            break;
+ 
+          case 'utf16':
+            args.push(String.fromCharCode.apply(null, new Uint16Array(bsValueArrayPart)));
+            break;
+ 
+          case 'utf32':
+            args.push(String.fromCharCode.apply(null, new Uint32Array(bsValueArrayPart)));
+            break;
+ 
+          default:
+            return false;
+        }
+      } else if (!arraysEqual(bsValueArrayPart, patternBitStringArrayPart)) {
+        return false;
+      }
+ 
+      beginningIndex = beginningIndex + size;
+    }
+ 
+    return true;
+  };
+}
+ 
+function getSize(unit, size) {
+  return unit * size / 8;
+}
+ 
+function arraysEqual(a, b) {
+  if (a === b) return true;
+  if (a == null || b == null) return false;
+  if (a.length != b.length) return false;
+ 
+  for (var i = 0; i < a.length; ++i) {
+    if (a[i] !== b[i]) return false;
+  }
+ 
+  return true;
+}
+ 
+function fillArray(arr, num) {
+  for (let i = 0; i < num; i++) {
+    arr.push(0);
+  }
+}
+ 
+function createBitString(arr) {
+  let integerParts = arr.map(elem => BitString.integer(elem));
+  return new BitString(...integerParts);
+}
+ 
+function resolveNoMatch() {
+  return function () {
+    return false;
+  };
+}
+ 
+const patternMap = new Map();
+patternMap.set(Variable.prototype, resolveVariable);
+patternMap.set(Wildcard.prototype, resolveWildcard);
+patternMap.set(HeadTail.prototype, resolveHeadTail);
+patternMap.set(StartsWith.prototype, resolveStartsWith);
+patternMap.set(Capture.prototype, resolveCapture);
+patternMap.set(Bound.prototype, resolveBound);
+patternMap.set(Type.prototype, resolveType);
+patternMap.set(BitStringMatch.prototype, resolveBitString);
+patternMap.set(Number.prototype, resolveNumber);
+patternMap.set(Symbol.prototype, resolveSymbol);
+patternMap.set(Map.prototype, resolveMap);
+patternMap.set(Array.prototype, resolveArray);
+patternMap.set(String.prototype, resolveString);
+patternMap.set(Boolean.prototype, resolveBoolean);
+patternMap.set(Function.prototype, resolveFunction);
+patternMap.set(Object.prototype, resolveObject);
+ 
+function buildMatch(pattern) {
+  if (pattern === null) {
+    return resolveNull(pattern);
+  }
+ 
+  if (typeof pattern === 'undefined') {
+    return resolveWildcard(pattern);
+  }
+ 
+  if (typeof pattern === 'function') {
+    return resolveFunction(pattern);
+  }
+ 
+  const type$$1 = pattern.constructor.prototype;
+  const resolver = patternMap.get(type$$1);
+ 
+  if (resolver) {
+    return resolver(pattern);
+  }
+ 
+  if (typeof pattern === 'object') {
+    return resolveObject(pattern);
+  }
+ 
+  return resolveNoMatch();
+}
+ 
+class MatchError extends Error {
+  constructor(arg) {
+    super();
+ 
+    if (typeof arg === 'symbol') {
+      this.message = 'No match for: ' + arg.toString();
+    } else if (Array.isArray(arg)) {
+      let mappedValues = arg.map(x => {
+        if (x === null) {
+          return 'null';
+        } else if (typeof x === 'undefined') {
+          return 'undefined';
+        }
+ 
+        return x.toString();
+      });
+ 
+      this.message = 'No match for: ' + mappedValues;
+    } else {
+      this.message = 'No match for: ' + arg;
+    }
+ 
+    this.name = this.constructor.name;
+  }
+}
+ 
+class Clause {
+  constructor(pattern, fn, guard = () => true) {
+    this.pattern = buildMatch(pattern);
+    this.arity = pattern.length;
+    this.optionals = getOptionalValues(pattern);
+    this.fn = fn;
+    this.guard = guard;
+  }
+}
+ 
+function clause(pattern, fn, guard = () => true) {
+  return new Clause(pattern, fn, guard);
+}
+ 
+ 
+ 
+function defmatch(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return function (...args) {
+    let [funcToCall, params] = findMatchingFunction(args, arities);
+    return funcToCall.apply(this, params);
+  };
+}
+ 
+function defmatchgen(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return function* (...args) {
+    if (arities.has(args.length)) {
+      const arityClauses = arities.get(args.length);
+ 
+      let funcToCall = null;
+      let params = null;
+      for (let processedClause of arityClauses) {
+        let result = [];
+        args = fillInOptionalValues(args, processedClause.arity, processedClause.optionals);
+ 
+        const doesMatch = processedClause.pattern(args, result);
+        const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+        if (doesMatch && allNamesMatch && (yield* processedClause.guard.apply(this, filteredResult))) {
+          funcToCall = processedClause.fn;
+          params = filteredResult;
+          break;
+        }
+      }
+ 
+      if (!funcToCall) {
+        console.error('No match for:', args);
+        throw new MatchError(args);
+      }
+ 
+      return yield* funcToCall.apply(this, params);
+    } else {
+      console.error('Arity of', args.length, 'not found. No match for:', args);
+      throw new MatchError(args);
+    }
+  };
+}
+ 
+function defmatchGen(...args) {
+  return defmatchgen(...args);
+}
+ 
+function defmatchAsync(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return async function (...args) {
+    if (arities.has(args.length)) {
+      const arityClauses = arities.get(args.length);
+ 
+      let funcToCall = null;
+      let params = null;
+      for (let processedClause of arityClauses) {
+        let result = [];
+        args = fillInOptionalValues(args, processedClause.arity, processedClause.optionals);
+ 
+        const doesMatch = processedClause.pattern(args, result);
+        const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+        if (doesMatch && allNamesMatch && (await processedClause.guard.apply(this, filteredResult))) {
+          funcToCall = processedClause.fn;
+          params = filteredResult;
+          break;
+        }
+      }
+ 
+      if (!funcToCall) {
+        console.error('No match for:', args);
+        throw new MatchError(args);
+      }
+ 
+      return funcToCall.apply(this, params);
+    } else {
+      console.error('Arity of', args.length, 'not found. No match for:', args);
+      throw new MatchError(args);
+    }
+  };
+}
+ 
+function findMatchingFunction(args, arities) {
+  if (arities.has(args.length)) {
+    const arityClauses = arities.get(args.length);
+ 
+    let funcToCall = null;
+    let params = null;
+    for (let processedClause of arityClauses) {
+      let result = [];
+      args = fillInOptionalValues(args, processedClause.arity, processedClause.optionals);
+ 
+      const doesMatch = processedClause.pattern(args, result);
+      const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+      if (doesMatch && allNamesMatch && processedClause.guard.apply(this, filteredResult)) {
+        funcToCall = processedClause.fn;
+        params = filteredResult;
+        break;
+      }
+    }
+ 
+    if (!funcToCall) {
+      console.error('No match for:', args);
+      throw new MatchError(args);
+    }
+ 
+    return [funcToCall, params];
+  } else {
+    console.error('Arity of', args.length, 'not found. No match for:', args);
+    throw new MatchError(args);
+  }
+}
+ 
+function getArityMap(clauses) {
+  let map = new Map();
+ 
+  for (const clause of clauses) {
+    const range = getArityRange(clause);
+ 
+    for (const arity of range) {
+      let arityClauses = [];
+ 
+      if (map.has(arity)) {
+        arityClauses = map.get(arity);
+      }
+ 
+      arityClauses.push(clause);
+      map.set(arity, arityClauses);
+    }
+  }
+ 
+  return map;
+}
+ 
+function getArityRange(clause) {
+  const min = clause.arity - clause.optionals.length;
+  const max = clause.arity;
+ 
+  let range = [min];
+ 
+  while (range[range.length - 1] != max) {
+    range.push(range[range.length - 1] + 1);
+  }
+ 
+  return range;
+}
+ 
+function getOptionalValues(pattern) {
+  let optionals = [];
+ 
+  for (let i = 0; i < pattern.length; i++) {
+    if (pattern[i] instanceof Variable && pattern[i].default_value != Symbol.for('tailored.no_value')) {
+      optionals.push([i, pattern[i].default_value]);
+    }
+  }
+ 
+  return optionals;
+}
+ 
+function fillInOptionalValues(args, arity, optionals) {
+  if (args.length === arity || optionals.length === 0) {
+    return args;
+  }
+ 
+  if (args.length + optionals.length < arity) {
+    return args;
+  }
+ 
+  let numberOfOptionalsToFill = arity - args.length;
+  let optionalsToRemove = optionals.length - numberOfOptionalsToFill;
+ 
+  let optionalsToUse = optionals.slice(optionalsToRemove);
+ 
+  for (let [index, value] of optionalsToUse) {
+    args.splice(index, 0, value);
+    if (args.length === arity) {
+      break;
+    }
+  }
+ 
+  return args;
+}
+ 
+function match(pattern, expr, guard = () => true) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+  if (doesMatch && allNamesMatch && guard.apply(this, filteredResult)) {
+    return filteredResult;
+  } else {
+    console.error('No match for:', expr);
+    throw new MatchError(expr);
+  }
+}
+ 
+function* match_gen(pattern, expr, guard = function* () {
+  return true;
+}) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (yield* guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    console.error('No match for:', expr);
+    throw new MatchError(expr);
+  }
+}
+ 
+function checkNamedVariables(results) {
+  const namesMap = {};
+  const filteredResults = [];
+ 
+  for (let i = 0; i < results.length; i++) {
+    const current = results[i];
+    if (current instanceof NamedVariableResult) {
+      if (namesMap[current.name] && namesMap[current.name] !== current.value) {
+        return [results, false];
+      } else if (namesMap[current.name] && namesMap[current.name] === current.value) {
+        filteredResults.push(current.value);
+      } else {
+        namesMap[current.name] = current.value;
+        filteredResults.push(current.value);
+      }
+    } else {
+      filteredResults.push(current);
+    }
+  }
+ 
+  return [filteredResults, true];
+}
+ 
+function match_or_default(pattern, expr, guard = () => true, default_value = null) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+  if (doesMatch && allNamesMatch && guard.apply(this, filteredResult)) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+function* match_or_default_gen(pattern, expr, guard = function* () {
+  return true;
+}, default_value = null) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (yield* guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+async function match_or_default_async(pattern, expr, guard = async () => true, default_value = null) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (await guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+const NO_MATCH = Symbol();
+ 
+function bitstring_generator(pattern, bitstring) {
+  return function () {
+    let returnResult = [];
+    let bsSlice = bitstring.slice(0, pattern.byte_size());
+    let i = 1;
+ 
+    while (bsSlice.byte_size == pattern.byte_size()) {
+      const result = match_or_default(pattern, bsSlice, () => true, NO_MATCH);
+ 
+      if (result != NO_MATCH) {
+        const [value] = result;
+        returnResult.push(result);
+      }
+ 
+      bsSlice = bitstring.slice(pattern.byte_size() * i, pattern.byte_size() * (i + 1));
+ 
+      i++;
+    }
+ 
+    return returnResult;
+  };
+}
+ 
+function list_generator(pattern, list) {
+  return function () {
+    let returnResult = [];
+    for (let i of list) {
+      const result = match_or_default(pattern, i, () => true, NO_MATCH);
+      if (result != NO_MATCH) {
+        const [value] = result;
+        returnResult.push(value);
+      }
+    }
+ 
+    return returnResult;
+  };
+}
+ 
+function list_comprehension(expression, generators) {
+  const generatedValues = run_generators(generators.pop()(), generators);
+ 
+  let result = [];
+ 
+  for (let value of generatedValues) {
+    if (expression.guard.apply(this, value)) {
+      result.push(expression.fn.apply(this, value));
+    }
+  }
+ 
+  return result;
+}
+ 
+function run_generators(generator, generators) {
+  if (generators.length == 0) {
+    return generator.map(x => {
+      if (Array.isArray(x)) {
+        return x;
+      } else {
+        return [x];
+      }
+    });
+  } else {
+    const list = generators.pop();
+ 
+    let next_gen = [];
+    for (let j of list()) {
+      for (let i of generator) {
+        next_gen.push([j].concat(i));
+      }
+    }
+ 
+    return run_generators(next_gen, generators);
+  }
+}
+ 
+function bitstring_comprehension(expression, generators) {
+  const generatedValues = run_generators(generators.pop()(), generators);
+ 
+  let result = [];
+ 
+  for (let value of generatedValues) {
+    if (expression.guard.apply(this, value)) {
+      result.push(expression.fn.apply(this, value));
+    }
+  }
+ 
+  result = result.map(x => ErlangTypes.BitString.integer(x));
+  return new ErlangTypes.BitString(...result);
+}
+ 
+var index = {
+  defmatch,
+  match,
+  match_gen,
+  MatchError,
+  variable,
+  wildcard,
+  startsWith,
+  capture,
+  headTail,
+  type,
+  bound,
+  Clause,
+  clause,
+  bitStringMatch,
+  match_or_default,
+  match_or_default_gen,
+  match_or_default_async,
+  defmatchgen,
+  list_comprehension,
+  list_generator,
+  bitstring_generator,
+  bitstring_comprehension,
+  defmatchGen,
+  defmatchAsync
+};
+ 
+module.exports = index;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbG9yZWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWlsb3JlZC90eXBlcy5qcyIsIi4uL3NyYy90YWlsb3JlZC9jaGVja3MuanMiLCIuLi9zcmMvdGFpbG9yZWQvdXRpbHMuanMiLCIuLi9zcmMvdGFpbG9yZWQvcmVzb2x2ZXJzLmpzIiwiLi4vc3JjL3RhaWxvcmVkL21hdGNoLmpzIiwiLi4vc3JjL3RhaWxvcmVkL2RlZm1hdGNoLmpzIiwiLi4vc3JjL3RhaWxvcmVkL2NvbXByZWhlbnNpb25zLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIEBmbG93ICovXG5cbmNsYXNzIFZhcmlhYmxlIHtcbiAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIGRlZmF1bHRfdmFsdWUgPSBTeW1ib2wuZm9yKCd0YWlsb3JlZC5ub192YWx1ZScpKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRlZmF1bHRfdmFsdWUgPSBkZWZhdWx0X3ZhbHVlO1xuICB9XG59XG5cbmNsYXNzIFdpbGRjYXJkIHtcbiAgY29uc3RydWN0b3IoKSB7fVxufVxuXG5jbGFzcyBTdGFydHNXaXRoIHtcbiAgY29uc3RydWN0b3IocHJlZml4KSB7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gIH1cbn1cblxuY2xhc3MgQ2FwdHVyZSB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbmNsYXNzIEhlYWRUYWlsIHtcbiAgY29uc3RydWN0b3IoaGVhZCwgdGFpbCkge1xuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgdGhpcy50YWlsID0gdGFpbDtcbiAgfVxufVxuXG5jbGFzcyBUeXBlIHtcbiAgY29uc3RydWN0b3IodHlwZSwgb2JqUGF0dGVybiA9IHt9KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm9ialBhdHRlcm4gPSBvYmpQYXR0ZXJuO1xuICB9XG59XG5cbmNsYXNzIEJvdW5kIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuY2xhc3MgQml0U3RyaW5nTWF0Y2gge1xuICBjb25zdHJ1Y3RvciguLi52YWx1ZXMpIHtcbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aDtcbiAgfVxuXG4gIGJpdF9zaXplKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVfc2l6ZSgpICogODtcbiAgfVxuXG4gIGJ5dGVfc2l6ZSgpIHtcbiAgICBsZXQgcyA9IDA7XG5cbiAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy52YWx1ZXMpIHtcbiAgICAgIHMgPSBzICsgdmFsLnVuaXQgKiB2YWwuc2l6ZSAvIDg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICBnZXRWYWx1ZShpbmRleCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcyhpbmRleCk7XG4gIH1cblxuICBnZXRTaXplT2ZWYWx1ZShpbmRleCkge1xuICAgIGxldCB2YWwgPSB0aGlzLmdldFZhbHVlKGluZGV4KTtcbiAgICByZXR1cm4gdmFsLnVuaXQgKiB2YWwuc2l6ZTtcbiAgfVxuXG4gIGdldFR5cGVPZlZhbHVlKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoaW5kZXgpLnR5cGU7XG4gIH1cbn1cblxuY2xhc3MgTmFtZWRWYXJpYWJsZVJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFyaWFibGUoXG4gIG5hbWUgPSBudWxsLFxuICBkZWZhdWx0X3ZhbHVlID0gU3ltYm9sLmZvcigndGFpbG9yZWQubm9fdmFsdWUnKVxuKSB7XG4gIHJldHVybiBuZXcgVmFyaWFibGUobmFtZSwgZGVmYXVsdF92YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHdpbGRjYXJkKCkge1xuICByZXR1cm4gbmV3IFdpbGRjYXJkKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgocHJlZml4KSB7XG4gIHJldHVybiBuZXcgU3RhcnRzV2l0aChwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBjYXB0dXJlKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgQ2FwdHVyZSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGhlYWRUYWlsKGhlYWQsIHRhaWwpIHtcbiAgcmV0dXJuIG5ldyBIZWFkVGFpbChoZWFkLCB0YWlsKTtcbn1cblxuZnVuY3Rpb24gdHlwZSh0eXBlLCBvYmpQYXR0ZXJuID0ge30pIHtcbiAgcmV0dXJuIG5ldyBUeXBlKHR5cGUsIG9ialBhdHRlcm4pO1xufVxuXG5mdW5jdGlvbiBib3VuZCh2YWx1ZSkge1xuICByZXR1cm4gbmV3IEJvdW5kKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gYml0U3RyaW5nTWF0Y2goLi4udmFsdWVzKSB7XG4gIHJldHVybiBuZXcgQml0U3RyaW5nTWF0Y2goLi4udmFsdWVzKTtcbn1cblxuZnVuY3Rpb24gbmFtZWRWYXJpYWJsZVJlc3VsdChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gbmV3IE5hbWVkVmFyaWFibGVSZXN1bHQobmFtZSwgdmFsdWUpO1xufVxuXG5leHBvcnQge1xuICBWYXJpYWJsZSxcbiAgV2lsZGNhcmQsXG4gIFN0YXJ0c1dpdGgsXG4gIENhcHR1cmUsXG4gIEhlYWRUYWlsLFxuICBUeXBlLFxuICBCb3VuZCxcbiAgQml0U3RyaW5nTWF0Y2gsXG4gIHZhcmlhYmxlLFxuICB3aWxkY2FyZCxcbiAgc3RhcnRzV2l0aCxcbiAgY2FwdHVyZSxcbiAgaGVhZFRhaWwsXG4gIHR5cGUsXG4gIGJvdW5kLFxuICBiaXRTdHJpbmdNYXRjaCxcbiAgTmFtZWRWYXJpYWJsZVJlc3VsdCxcbiAgbmFtZWRWYXJpYWJsZVJlc3VsdFxufTtcbiIsIi8qIEBmbG93ICovXG5cbmltcG9ydCB7XG4gIFZhcmlhYmxlLFxuICBXaWxkY2FyZCxcbiAgSGVhZFRhaWwsXG4gIENhcHR1cmUsXG4gIFR5cGUsXG4gIFN0YXJ0c1dpdGgsXG4gIEJvdW5kLFxuICBCaXRTdHJpbmdNYXRjaFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IEVybGFuZ1R5cGVzIGZyb20gJ2VybGFuZy10eXBlcyc7XG5cbmZ1bmN0aW9uIGlzX251bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNfc3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc19ib29sZWFuKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNfc3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnO1xufVxuXG5mdW5jdGlvbiBpc191bmRlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGlzX29iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gaXNfdmFyaWFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIGlzX3dpbGRjYXJkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdpbGRjYXJkO1xufVxuXG5mdW5jdGlvbiBpc19oZWFkVGFpbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBIZWFkVGFpbDtcbn1cblxuZnVuY3Rpb24gaXNfY2FwdHVyZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBDYXB0dXJlO1xufVxuXG5mdW5jdGlvbiBpc190eXBlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzX3N0YXJ0c1dpdGgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU3RhcnRzV2l0aDtcbn1cblxuZnVuY3Rpb24gaXNfYm91bmQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQm91bmQ7XG59XG5cbmZ1bmN0aW9uIGlzX2JpdHN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBCaXRTdHJpbmdNYXRjaDtcbn1cblxuZnVuY3Rpb24gaXNfbnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzX2FycmF5KHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xufVxuXG5mdW5jdGlvbiBpc19tYXAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG5mdW5jdGlvbiBpc19waWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuUElEO1xufVxuXG5mdW5jdGlvbiBpc190dXBsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFcmxhbmdUeXBlcy5UdXBsZTtcbn1cblxuZnVuY3Rpb24gaXNfcmVmZXJlbmNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVybGFuZ1R5cGVzLlJlZmVyZW5jZTtcbn1cblxuZXhwb3J0IHtcbiAgaXNfbnVtYmVyLFxuICBpc19zdHJpbmcsXG4gIGlzX2Jvb2xlYW4sXG4gIGlzX3N5bWJvbCxcbiAgaXNfbnVsbCxcbiAgaXNfdW5kZWZpbmVkLFxuICBpc19mdW5jdGlvbixcbiAgaXNfdmFyaWFibGUsXG4gIGlzX3dpbGRjYXJkLFxuICBpc19oZWFkVGFpbCxcbiAgaXNfY2FwdHVyZSxcbiAgaXNfdHlwZSxcbiAgaXNfc3RhcnRzV2l0aCxcbiAgaXNfYm91bmQsXG4gIGlzX29iamVjdCxcbiAgaXNfYXJyYXksXG4gIGlzX2JpdHN0cmluZyxcbiAgaXNfbWFwLFxuICBpc190dXBsZSxcbiAgaXNfcGlkLFxuICBpc19yZWZlcmVuY2UsXG59O1xuIiwiaW1wb3J0ICogYXMgQ2hlY2tzIGZyb20gJy4vY2hlY2tzJztcbmltcG9ydCBFcmxhbmdUeXBlcyBmcm9tICdlcmxhbmctdHlwZXMnO1xuXG5mdW5jdGlvbiBhcnJheUVxdWFscyhsZWZ0LCByaWdodCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZXF1YWxzKGxlZnRbaV0sIHJpZ2h0W2ldKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdHVwbGVFcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuVHVwbGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlFcXVhbHMobGVmdC52YWx1ZXMsIHJpZ2h0LnZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIGJpdHN0cmluZ0VxdWFscyhsZWZ0LCByaWdodCkge1xuICBpZiAocmlnaHQgaW5zdGFuY2VvZiBFcmxhbmdUeXBlcy5CaXRTdHJpbmcgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlFcXVhbHMobGVmdC52YWx1ZSwgcmlnaHQudmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwaWRFcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuUElEID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBsZWZ0LmlkID09PSByaWdodC5pZDtcbn1cblxuZnVuY3Rpb24gcmVmZXJlbmNlRXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChyaWdodCBpbnN0YW5jZW9mIEVybGFuZ1R5cGVzLlJlZmVyZW5jZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbGVmdC5pZCA9PT0gcmlnaHQuaWQ7XG59XG5cbmZ1bmN0aW9uIG1hcEVxdWFscyhsZWZ0LCByaWdodCkge1xuICBpZiAocmlnaHQgaW5zdGFuY2VvZiBNYXAgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGVmdEVudHJpZXMgPSBBcnJheS5mcm9tKGxlZnQuZW50cmllcygpKTtcbiAgY29uc3QgcmlnaHRFbnRyaWVzID0gQXJyYXkuZnJvbShyaWdodC5lbnRyaWVzKCkpO1xuXG4gIHJldHVybiBhcnJheUVxdWFscyhsZWZ0RW50cmllcywgcmlnaHRFbnRyaWVzKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpKSB7XG4gICAgcmV0dXJuIGFycmF5RXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIGlmIChsZWZ0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuVHVwbGUpIHtcbiAgICByZXR1cm4gdHVwbGVFcXVhbHMobGVmdCwgcmlnaHQpO1xuICB9XG5cbiAgaWYgKGxlZnQgaW5zdGFuY2VvZiBFcmxhbmdUeXBlcy5QSUQpIHtcbiAgICByZXR1cm4gcGlkRXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIGlmIChsZWZ0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuQml0U3RyaW5nKSB7XG4gICAgcmV0dXJuIGJpdHN0cmluZ0VxdWFscyhsZWZ0LCByaWdodCk7XG4gIH1cblxuICBpZiAobGVmdCBpbnN0YW5jZW9mIEVybGFuZ1R5cGVzLlJlZmVyZW5jZSkge1xuICAgIHJldHVybiByZWZlcmVuY2VFcXVhbHMobGVmdCwgcmlnaHQpO1xuICB9XG5cbiAgaWYgKGxlZnQgaW5zdGFuY2VvZiBNYXApIHtcbiAgICByZXR1cm4gbWFwRXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBsZWZ0ID09PSByaWdodDtcbn1cblxuZnVuY3Rpb24gaXNfbm9uX3ByaW1pdGl2ZShrZXkpIHtcbiAgcmV0dXJuIChcbiAgICBDaGVja3MuaXNfYXJyYXkoa2V5KSB8fFxuICAgIENoZWNrcy5pc19tYXAoa2V5KSB8fFxuICAgIENoZWNrcy5pc19waWQoa2V5KSB8fFxuICAgIENoZWNrcy5pc19yZWZlcmVuY2Uoa2V5KSB8fFxuICAgIENoZWNrcy5pc19iaXRzdHJpbmcoa2V5KSB8fFxuICAgIENoZWNrcy5pc190dXBsZShrZXkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhcyhtYXAsIGtleSkge1xuICBpZiAoaXNfbm9uX3ByaW1pdGl2ZShrZXkpKSB7XG4gICAgZm9yIChjb25zdCBtYXBfa2V5IG9mIG1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChlcXVhbHMobWFwX2tleSwga2V5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbWFwLmhhcyhrZXkpO1xufVxuXG5mdW5jdGlvbiBnZXQobWFwLCBrZXkpIHtcbiAgaWYgKGlzX25vbl9wcmltaXRpdmUoa2V5KSkge1xuICAgIGZvciAoY29uc3QgbWFwX2tleSBvZiBtYXAua2V5cygpKSB7XG4gICAgICBpZiAoZXF1YWxzKG1hcF9rZXksIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQobWFwX2tleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gbWFwLmdldChrZXkpO1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0LFxuICBoYXMsXG4gIGVxdWFscyxcbn1cbiIsIi8qIEBmbG93ICovXG5cbmltcG9ydCAqIGFzIENoZWNrcyBmcm9tICcuL2NoZWNrcyc7XG5pbXBvcnQgKiBhcyBUeXBlcyBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGJ1aWxkTWF0Y2ggfSBmcm9tICcuL21hdGNoJztcbmltcG9ydCBFcmxhbmdUeXBlcyBmcm9tICdlcmxhbmctdHlwZXMnO1xuY29uc3QgQml0U3RyaW5nID0gRXJsYW5nVHlwZXMuQml0U3RyaW5nO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMnXG5cbmZ1bmN0aW9uIHJlc29sdmVTeW1ib2wocGF0dGVybikge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQ2hlY2tzLmlzX3N5bWJvbCh2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdHJpbmcocGF0dGVybikge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQ2hlY2tzLmlzX3N0cmluZyh2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOdW1iZXIocGF0dGVybikge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQ2hlY2tzLmlzX251bWJlcih2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVCb29sZWFuKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIENoZWNrcy5pc19ib29sZWFuKHZhbHVlKSAmJiB2YWx1ZSA9PT0gcGF0dGVybjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIENoZWNrcy5pc19mdW5jdGlvbih2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOdWxsKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIENoZWNrcy5pc19udWxsKHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJvdW5kKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gdHlwZW9mIHBhdHRlcm4udmFsdWUgJiYgdmFsdWUgPT09IHBhdHRlcm4udmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVdpbGRjYXJkKCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVWYXJpYWJsZShwYXR0ZXJuKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgYXJncykge1xuICAgIGlmIChwYXR0ZXJuLm5hbWUgPT09IG51bGwpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuLm5hbWUgIT09ICdfJykge1xuICAgICAgYXJncy5wdXNoKFR5cGVzLm5hbWVkVmFyaWFibGVSZXN1bHQocGF0dGVybi5uYW1lLCB2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSGVhZFRhaWwocGF0dGVybikge1xuICBjb25zdCBoZWFkTWF0Y2hlcyA9IGJ1aWxkTWF0Y2gocGF0dGVybi5oZWFkKTtcbiAgY29uc3QgdGFpbE1hdGNoZXMgPSBidWlsZE1hdGNoKHBhdHRlcm4udGFpbCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKCFDaGVja3MuaXNfYXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWQgPSB2YWx1ZVswXTtcbiAgICBjb25zdCB0YWlsID0gdmFsdWUuc2xpY2UoMSk7XG5cbiAgICBpZiAoaGVhZE1hdGNoZXMoaGVhZCwgYXJncykgJiYgdGFpbE1hdGNoZXModGFpbCwgYXJncykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNhcHR1cmUocGF0dGVybikge1xuICBjb25zdCBtYXRjaGVzID0gYnVpbGRNYXRjaChwYXR0ZXJuLnZhbHVlKTtcblxuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGFyZ3MpIHtcbiAgICBpZiAobWF0Y2hlcyh2YWx1ZSwgYXJncykpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdGFydHNXaXRoKHBhdHRlcm4pIHtcbiAgY29uc3QgcHJlZml4ID0gcGF0dGVybi5wcmVmaXg7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKENoZWNrcy5pc19zdHJpbmcodmFsdWUpICYmIHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgYXJncy5wdXNoKHZhbHVlLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybi50eXBlKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gYnVpbGRNYXRjaChwYXR0ZXJuLm9ialBhdHRlcm4pO1xuICAgICAgcmV0dXJuIG1hdGNoZXModmFsdWUsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFycmF5KHBhdHRlcm4pIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHBhdHRlcm4ubWFwKHggPT4gYnVpbGRNYXRjaCh4KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKCFDaGVja3MuaXNfYXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCAhPSBwYXR0ZXJuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZS5ldmVyeShmdW5jdGlvbih2LCBpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1tpXSh2YWx1ZVtpXSwgYXJncyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNYXAocGF0dGVybikge1xuICBsZXQgbWF0Y2hlcyA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShwYXR0ZXJuLmtleXMoKSk7XG5cbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBtYXRjaGVzLnNldChrZXksIGJ1aWxkTWF0Y2gocGF0dGVybi5nZXQoa2V5KSkpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKCFDaGVja3MuaXNfbWFwKHZhbHVlKSB8fCBwYXR0ZXJuLnNpemUgPiB2YWx1ZS5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFVdGlscy5oYXModmFsdWUsIGtleSkgfHwgIVV0aWxzLmdldChtYXRjaGVzLCBrZXkpKFV0aWxzLmdldCh2YWx1ZSwga2V5KSwgYXJncykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlT2JqZWN0KHBhdHRlcm4pIHtcbiAgbGV0IG1hdGNoZXMgPSB7fTtcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGF0dGVybikuY29uY2F0KFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocGF0dGVybilcbiAgKTtcblxuICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgIG1hdGNoZXNba2V5XSA9IGJ1aWxkTWF0Y2gocGF0dGVybltrZXldKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgYXJncykge1xuICAgIGlmICghQ2hlY2tzLmlzX29iamVjdCh2YWx1ZSkgfHwgcGF0dGVybi5sZW5ndGggPiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCEoa2V5IGluIHZhbHVlKSB8fCAhbWF0Y2hlc1trZXldKHZhbHVlW2tleV0sIGFyZ3MpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJpdFN0cmluZyhwYXR0ZXJuKSB7XG4gIGxldCBwYXR0ZXJuQml0U3RyaW5nID0gW107XG5cbiAgZm9yIChsZXQgYml0c3RyaW5nTWF0Y2hQYXJ0IG9mIHBhdHRlcm4udmFsdWVzKSB7XG4gICAgaWYgKENoZWNrcy5pc192YXJpYWJsZShiaXRzdHJpbmdNYXRjaFBhcnQudmFsdWUpKSB7XG4gICAgICBsZXQgc2l6ZSA9IGdldFNpemUoYml0c3RyaW5nTWF0Y2hQYXJ0LnVuaXQsIGJpdHN0cmluZ01hdGNoUGFydC5zaXplKTtcbiAgICAgIGZpbGxBcnJheShwYXR0ZXJuQml0U3RyaW5nLCBzaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0dGVybkJpdFN0cmluZyA9IHBhdHRlcm5CaXRTdHJpbmcuY29uY2F0KFxuICAgICAgICBuZXcgQml0U3RyaW5nKGJpdHN0cmluZ01hdGNoUGFydCkudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHBhdHRlcm5WYWx1ZXMgPSBwYXR0ZXJuLnZhbHVlcztcblxuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGFyZ3MpIHtcbiAgICBsZXQgYnNWYWx1ZSA9IG51bGw7XG5cbiAgICBpZiAoIUNoZWNrcy5pc19zdHJpbmcodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBCaXRTdHJpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKENoZWNrcy5pc19zdHJpbmcodmFsdWUpKSB7XG4gICAgICBic1ZhbHVlID0gbmV3IEJpdFN0cmluZyhCaXRTdHJpbmcuYmluYXJ5KHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJzVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgYmVnaW5uaW5nSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYml0c3RyaW5nTWF0Y2hQYXJ0ID0gcGF0dGVyblZhbHVlc1tpXTtcblxuICAgICAgaWYgKFxuICAgICAgICBDaGVja3MuaXNfdmFyaWFibGUoYml0c3RyaW5nTWF0Y2hQYXJ0LnZhbHVlKSAmJlxuICAgICAgICBiaXRzdHJpbmdNYXRjaFBhcnQudHlwZSA9PSAnYmluYXJ5JyAmJlxuICAgICAgICBiaXRzdHJpbmdNYXRjaFBhcnQuc2l6ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGkgPCBwYXR0ZXJuVmFsdWVzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2EgYmluYXJ5IGZpZWxkIHdpdGhvdXQgc2l6ZSBpcyBvbmx5IGFsbG93ZWQgYXQgdGhlIGVuZCBvZiBhIGJpbmFyeSBwYXR0ZXJuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICBsZXQgYnNWYWx1ZUFycmF5UGFydCA9IFtdO1xuICAgICAgbGV0IHBhdHRlcm5CaXRTdHJpbmdBcnJheVBhcnQgPSBbXTtcbiAgICAgIHNpemUgPSBnZXRTaXplKGJpdHN0cmluZ01hdGNoUGFydC51bml0LCBiaXRzdHJpbmdNYXRjaFBhcnQuc2l6ZSk7XG5cbiAgICAgIGlmIChpID09PSBwYXR0ZXJuVmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgYnNWYWx1ZUFycmF5UGFydCA9IGJzVmFsdWUudmFsdWUuc2xpY2UoYmVnaW5uaW5nSW5kZXgpO1xuICAgICAgICBwYXR0ZXJuQml0U3RyaW5nQXJyYXlQYXJ0ID0gcGF0dGVybkJpdFN0cmluZy5zbGljZShiZWdpbm5pbmdJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBic1ZhbHVlQXJyYXlQYXJ0ID0gYnNWYWx1ZS52YWx1ZS5zbGljZShcbiAgICAgICAgICBiZWdpbm5pbmdJbmRleCxcbiAgICAgICAgICBiZWdpbm5pbmdJbmRleCArIHNpemVcbiAgICAgICAgKTtcbiAgICAgICAgcGF0dGVybkJpdFN0cmluZ0FycmF5UGFydCA9IHBhdHRlcm5CaXRTdHJpbmcuc2xpY2UoXG4gICAgICAgICAgYmVnaW5uaW5nSW5kZXgsXG4gICAgICAgICAgYmVnaW5uaW5nSW5kZXggKyBzaXplXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChDaGVja3MuaXNfdmFyaWFibGUoYml0c3RyaW5nTWF0Y2hQYXJ0LnZhbHVlKSkge1xuICAgICAgICBzd2l0Y2ggKGJpdHN0cmluZ01hdGNoUGFydC50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGJpdHN0cmluZ01hdGNoUGFydC5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICAgIGJpdHN0cmluZ01hdGNoUGFydC5hdHRyaWJ1dGVzLmluZGV4T2YoJ3NpZ25lZCcpICE9IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYXJncy5wdXNoKG5ldyBJbnQ4QXJyYXkoW2JzVmFsdWVBcnJheVBhcnRbMF1dKVswXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcmdzLnB1c2gobmV3IFVpbnQ4QXJyYXkoW2JzVmFsdWVBcnJheVBhcnRbMF1dKVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgIGlmIChzaXplID09PSA2NCkge1xuICAgICAgICAgICAgICBhcmdzLnB1c2goRmxvYXQ2NEFycmF5LmZyb20oYnNWYWx1ZUFycmF5UGFydClbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID09PSAzMikge1xuICAgICAgICAgICAgICBhcmdzLnB1c2goRmxvYXQzMkFycmF5LmZyb20oYnNWYWx1ZUFycmF5UGFydClbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdiaXRzdHJpbmcnOlxuICAgICAgICAgICAgYXJncy5wdXNoKGNyZWF0ZUJpdFN0cmluZyhic1ZhbHVlQXJyYXlQYXJ0KSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgICBhcmdzLnB1c2goXG4gICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnNWYWx1ZUFycmF5UGFydCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICAgIGFyZ3MucHVzaChcbiAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShic1ZhbHVlQXJyYXlQYXJ0KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3V0ZjE2JzpcbiAgICAgICAgICAgIGFyZ3MucHVzaChcbiAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkoYnNWYWx1ZUFycmF5UGFydCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd1dGYzMic6XG4gICAgICAgICAgICBhcmdzLnB1c2goXG4gICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQzMkFycmF5KGJzVmFsdWVBcnJheVBhcnQpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYXJyYXlzRXF1YWwoYnNWYWx1ZUFycmF5UGFydCwgcGF0dGVybkJpdFN0cmluZ0FycmF5UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBiZWdpbm5pbmdJbmRleCA9IGJlZ2lubmluZ0luZGV4ICsgc2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2l6ZSh1bml0LCBzaXplKSB7XG4gIHJldHVybiB1bml0ICogc2l6ZSAvIDg7XG59XG5cbmZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZpbGxBcnJheShhcnIsIG51bSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgYXJyLnB1c2goMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQml0U3RyaW5nKGFycikge1xuICBsZXQgaW50ZWdlclBhcnRzID0gYXJyLm1hcChlbGVtID0+IEJpdFN0cmluZy5pbnRlZ2VyKGVsZW0pKTtcbiAgcmV0dXJuIG5ldyBCaXRTdHJpbmcoLi4uaW50ZWdlclBhcnRzKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5vTWF0Y2goKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmV4cG9ydCB7XG4gIHJlc29sdmVCb3VuZCxcbiAgcmVzb2x2ZVdpbGRjYXJkLFxuICByZXNvbHZlVmFyaWFibGUsXG4gIHJlc29sdmVIZWFkVGFpbCxcbiAgcmVzb2x2ZUNhcHR1cmUsXG4gIHJlc29sdmVTdGFydHNXaXRoLFxuICByZXNvbHZlVHlwZSxcbiAgcmVzb2x2ZUFycmF5LFxuICByZXNvbHZlT2JqZWN0LFxuICByZXNvbHZlTm9NYXRjaCxcbiAgcmVzb2x2ZVN5bWJvbCxcbiAgcmVzb2x2ZVN0cmluZyxcbiAgcmVzb2x2ZU51bWJlcixcbiAgcmVzb2x2ZUJvb2xlYW4sXG4gIHJlc29sdmVGdW5jdGlvbixcbiAgcmVzb2x2ZU51bGwsXG4gIHJlc29sdmVCaXRTdHJpbmcsXG4gIHJlc29sdmVNYXBcbn07XG4iLCJpbXBvcnQgKiBhcyBSZXNvbHZlcnMgZnJvbSAnLi9yZXNvbHZlcnMnO1xuaW1wb3J0IHtcbiAgVmFyaWFibGUsXG4gIFdpbGRjYXJkLFxuICBIZWFkVGFpbCxcbiAgQ2FwdHVyZSxcbiAgVHlwZSxcbiAgU3RhcnRzV2l0aCxcbiAgQm91bmQsXG4gIEJpdFN0cmluZ01hdGNoXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBwYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xucGF0dGVybk1hcC5zZXQoVmFyaWFibGUucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZVZhcmlhYmxlKTtcbnBhdHRlcm5NYXAuc2V0KFdpbGRjYXJkLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVXaWxkY2FyZCk7XG5wYXR0ZXJuTWFwLnNldChIZWFkVGFpbC5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlSGVhZFRhaWwpO1xucGF0dGVybk1hcC5zZXQoU3RhcnRzV2l0aC5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlU3RhcnRzV2l0aCk7XG5wYXR0ZXJuTWFwLnNldChDYXB0dXJlLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVDYXB0dXJlKTtcbnBhdHRlcm5NYXAuc2V0KEJvdW5kLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVCb3VuZCk7XG5wYXR0ZXJuTWFwLnNldChUeXBlLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVUeXBlKTtcbnBhdHRlcm5NYXAuc2V0KEJpdFN0cmluZ01hdGNoLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVCaXRTdHJpbmcpO1xucGF0dGVybk1hcC5zZXQoTnVtYmVyLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVOdW1iZXIpO1xucGF0dGVybk1hcC5zZXQoU3ltYm9sLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVTeW1ib2wpO1xucGF0dGVybk1hcC5zZXQoTWFwLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVNYXApO1xucGF0dGVybk1hcC5zZXQoQXJyYXkucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZUFycmF5KTtcbnBhdHRlcm5NYXAuc2V0KFN0cmluZy5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlU3RyaW5nKTtcbnBhdHRlcm5NYXAuc2V0KEJvb2xlYW4ucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZUJvb2xlYW4pO1xucGF0dGVybk1hcC5zZXQoRnVuY3Rpb24ucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZUZ1bmN0aW9uKTtcbnBhdHRlcm5NYXAuc2V0KE9iamVjdC5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlT2JqZWN0KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2gocGF0dGVybikge1xuICBpZiAocGF0dGVybiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBSZXNvbHZlcnMucmVzb2x2ZU51bGwocGF0dGVybik7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIFJlc29sdmVycy5yZXNvbHZlV2lsZGNhcmQocGF0dGVybik7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gUmVzb2x2ZXJzLnJlc29sdmVGdW5jdGlvbihwYXR0ZXJuKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBwYXR0ZXJuLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgY29uc3QgcmVzb2x2ZXIgPSBwYXR0ZXJuTWFwLmdldCh0eXBlKTtcblxuICBpZiAocmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZXIocGF0dGVybik7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIFJlc29sdmVycy5yZXNvbHZlT2JqZWN0KHBhdHRlcm4pO1xuICB9XG5cbiAgcmV0dXJuIFJlc29sdmVycy5yZXNvbHZlTm9NYXRjaCgpO1xufVxuIiwiaW1wb3J0IHsgYnVpbGRNYXRjaCB9IGZyb20gJy4vbWF0Y2gnO1xuaW1wb3J0ICogYXMgVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEZVTkMgPSBTeW1ib2woKTtcblxuZXhwb3J0IGNsYXNzIE1hdGNoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGFyZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdObyBtYXRjaCBmb3I6ICcgKyBhcmcudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgbGV0IG1hcHBlZFZhbHVlcyA9IGFyZy5tYXAoeCA9PiB7XG4gICAgICAgIGlmICh4ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geC50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubWVzc2FnZSA9ICdObyBtYXRjaCBmb3I6ICcgKyBtYXBwZWRWYWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdObyBtYXRjaCBmb3I6ICcgKyBhcmc7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGF1c2Uge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuLCBmbiwgZ3VhcmQgPSAoKSA9PiB0cnVlKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gYnVpbGRNYXRjaChwYXR0ZXJuKTtcbiAgICB0aGlzLmFyaXR5ID0gcGF0dGVybi5sZW5ndGg7XG4gICAgdGhpcy5vcHRpb25hbHMgPSBnZXRPcHRpb25hbFZhbHVlcyhwYXR0ZXJuKTtcbiAgICB0aGlzLmZuID0gZm47XG4gICAgdGhpcy5ndWFyZCA9IGd1YXJkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGF1c2UocGF0dGVybiwgZm4sIGd1YXJkID0gKCkgPT4gdHJ1ZSkge1xuICByZXR1cm4gbmV3IENsYXVzZShwYXR0ZXJuLCBmbiwgZ3VhcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbXBvbGluZShmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgbGV0IHJlcyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgd2hpbGUgKHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICByZXMgPSByZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZm1hdGNoKC4uLmNsYXVzZXMpIHtcbiAgY29uc3QgYXJpdGllcyA9IGdldEFyaXR5TWFwKGNsYXVzZXMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgbGV0IFtmdW5jVG9DYWxsLCBwYXJhbXNdID0gZmluZE1hdGNoaW5nRnVuY3Rpb24oYXJncywgYXJpdGllcyk7XG4gICAgcmV0dXJuIGZ1bmNUb0NhbGwuYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZm1hdGNoZ2VuKC4uLmNsYXVzZXMpIHtcbiAgY29uc3QgYXJpdGllcyA9IGdldEFyaXR5TWFwKGNsYXVzZXMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiooLi4uYXJncykge1xuICAgIGlmIChhcml0aWVzLmhhcyhhcmdzLmxlbmd0aCkpIHtcbiAgICAgIGNvbnN0IGFyaXR5Q2xhdXNlcyA9IGFyaXRpZXMuZ2V0KGFyZ3MubGVuZ3RoKTtcblxuICAgICAgbGV0IGZ1bmNUb0NhbGwgPSBudWxsO1xuICAgICAgbGV0IHBhcmFtcyA9IG51bGw7XG4gICAgICBmb3IgKGxldCBwcm9jZXNzZWRDbGF1c2Ugb2YgYXJpdHlDbGF1c2VzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgYXJncyA9IGZpbGxJbk9wdGlvbmFsVmFsdWVzKFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgcHJvY2Vzc2VkQ2xhdXNlLmFyaXR5LFxuICAgICAgICAgIHByb2Nlc3NlZENsYXVzZS5vcHRpb25hbHNcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRDbGF1c2UucGF0dGVybihhcmdzLCByZXN1bHQpO1xuICAgICAgICBjb25zdCBbZmlsdGVyZWRSZXN1bHQsIGFsbE5hbWVzTWF0Y2hdID0gY2hlY2tOYW1lZFZhcmlhYmxlcyhyZXN1bHQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkb2VzTWF0Y2ggJiZcbiAgICAgICAgICBhbGxOYW1lc01hdGNoICYmXG4gICAgICAgICAgKHlpZWxkKiBwcm9jZXNzZWRDbGF1c2UuZ3VhcmQuYXBwbHkodGhpcywgZmlsdGVyZWRSZXN1bHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICBmdW5jVG9DYWxsID0gcHJvY2Vzc2VkQ2xhdXNlLmZuO1xuICAgICAgICAgIHBhcmFtcyA9IGZpbHRlcmVkUmVzdWx0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZnVuY1RvQ2FsbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBtYXRjaCBmb3I6JywgYXJncyk7XG4gICAgICAgIHRocm93IG5ldyBNYXRjaEVycm9yKGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geWllbGQqIGZ1bmNUb0NhbGwuYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQXJpdHkgb2YnLCBhcmdzLmxlbmd0aCwgJ25vdCBmb3VuZC4gTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgICAgdGhyb3cgbmV3IE1hdGNoRXJyb3IoYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmbWF0Y2hHZW4oLi4uYXJncykge1xuICByZXR1cm4gZGVmbWF0Y2hnZW4oLi4uYXJncyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZtYXRjaEFzeW5jKC4uLmNsYXVzZXMpIHtcbiAgY29uc3QgYXJpdGllcyA9IGdldEFyaXR5TWFwKGNsYXVzZXMpO1xuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgaWYgKGFyaXRpZXMuaGFzKGFyZ3MubGVuZ3RoKSkge1xuICAgICAgY29uc3QgYXJpdHlDbGF1c2VzID0gYXJpdGllcy5nZXQoYXJncy5sZW5ndGgpO1xuXG4gICAgICBsZXQgZnVuY1RvQ2FsbCA9IG51bGw7XG4gICAgICBsZXQgcGFyYW1zID0gbnVsbDtcbiAgICAgIGZvciAobGV0IHByb2Nlc3NlZENsYXVzZSBvZiBhcml0eUNsYXVzZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBhcmdzID0gZmlsbEluT3B0aW9uYWxWYWx1ZXMoXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBwcm9jZXNzZWRDbGF1c2UuYXJpdHksXG4gICAgICAgICAgcHJvY2Vzc2VkQ2xhdXNlLm9wdGlvbmFsc1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRvZXNNYXRjaCA9IHByb2Nlc3NlZENsYXVzZS5wYXR0ZXJuKGFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvZXNNYXRjaCAmJlxuICAgICAgICAgIGFsbE5hbWVzTWF0Y2ggJiZcbiAgICAgICAgICAoYXdhaXQgcHJvY2Vzc2VkQ2xhdXNlLmd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZnVuY1RvQ2FsbCA9IHByb2Nlc3NlZENsYXVzZS5mbjtcbiAgICAgICAgICBwYXJhbXMgPSBmaWx0ZXJlZFJlc3VsdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZ1bmNUb0NhbGwpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgICAgICB0aHJvdyBuZXcgTWF0Y2hFcnJvcihhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmNUb0NhbGwuYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQXJpdHkgb2YnLCBhcmdzLmxlbmd0aCwgJ25vdCBmb3VuZC4gTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgICAgdGhyb3cgbmV3IE1hdGNoRXJyb3IoYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdGdW5jdGlvbihhcmdzLCBhcml0aWVzKSB7XG4gIGlmIChhcml0aWVzLmhhcyhhcmdzLmxlbmd0aCkpIHtcbiAgICBjb25zdCBhcml0eUNsYXVzZXMgPSBhcml0aWVzLmdldChhcmdzLmxlbmd0aCk7XG5cbiAgICBsZXQgZnVuY1RvQ2FsbCA9IG51bGw7XG4gICAgbGV0IHBhcmFtcyA9IG51bGw7XG4gICAgZm9yIChsZXQgcHJvY2Vzc2VkQ2xhdXNlIG9mIGFyaXR5Q2xhdXNlcykge1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgYXJncyA9IGZpbGxJbk9wdGlvbmFsVmFsdWVzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBwcm9jZXNzZWRDbGF1c2UuYXJpdHksXG4gICAgICAgIHByb2Nlc3NlZENsYXVzZS5vcHRpb25hbHNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRvZXNNYXRjaCA9IHByb2Nlc3NlZENsYXVzZS5wYXR0ZXJuKGFyZ3MsIHJlc3VsdCk7XG4gICAgICBjb25zdCBbZmlsdGVyZWRSZXN1bHQsIGFsbE5hbWVzTWF0Y2hdID0gY2hlY2tOYW1lZFZhcmlhYmxlcyhyZXN1bHQpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRvZXNNYXRjaCAmJlxuICAgICAgICBhbGxOYW1lc01hdGNoICYmXG4gICAgICAgIHByb2Nlc3NlZENsYXVzZS5ndWFyZC5hcHBseSh0aGlzLCBmaWx0ZXJlZFJlc3VsdClcbiAgICAgICkge1xuICAgICAgICBmdW5jVG9DYWxsID0gcHJvY2Vzc2VkQ2xhdXNlLmZuO1xuICAgICAgICBwYXJhbXMgPSBmaWx0ZXJlZFJlc3VsdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFmdW5jVG9DYWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBtYXRjaCBmb3I6JywgYXJncyk7XG4gICAgICB0aHJvdyBuZXcgTWF0Y2hFcnJvcihhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2Z1bmNUb0NhbGwsIHBhcmFtc107XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignQXJpdHkgb2YnLCBhcmdzLmxlbmd0aCwgJ25vdCBmb3VuZC4gTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgIHRocm93IG5ldyBNYXRjaEVycm9yKGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFyaXR5TWFwKGNsYXVzZXMpIHtcbiAgbGV0IG1hcCA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBjbGF1c2VzKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBnZXRBcml0eVJhbmdlKGNsYXVzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGFyaXR5IG9mIHJhbmdlKSB7XG4gICAgICBsZXQgYXJpdHlDbGF1c2VzID0gW107XG5cbiAgICAgIGlmIChtYXAuaGFzKGFyaXR5KSkge1xuICAgICAgICBhcml0eUNsYXVzZXMgPSBtYXAuZ2V0KGFyaXR5KTtcbiAgICAgIH1cblxuICAgICAgYXJpdHlDbGF1c2VzLnB1c2goY2xhdXNlKTtcbiAgICAgIG1hcC5zZXQoYXJpdHksIGFyaXR5Q2xhdXNlcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0QXJpdHlSYW5nZShjbGF1c2UpIHtcbiAgY29uc3QgbWluID0gY2xhdXNlLmFyaXR5IC0gY2xhdXNlLm9wdGlvbmFscy5sZW5ndGg7XG4gIGNvbnN0IG1heCA9IGNsYXVzZS5hcml0eTtcblxuICBsZXQgcmFuZ2UgPSBbbWluXTtcblxuICB3aGlsZSAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT0gbWF4KSB7XG4gICAgcmFuZ2UucHVzaChyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSArIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25hbFZhbHVlcyhwYXR0ZXJuKSB7XG4gIGxldCBvcHRpb25hbHMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoXG4gICAgICBwYXR0ZXJuW2ldIGluc3RhbmNlb2YgVHlwZXMuVmFyaWFibGUgJiZcbiAgICAgIHBhdHRlcm5baV0uZGVmYXVsdF92YWx1ZSAhPSBTeW1ib2wuZm9yKCd0YWlsb3JlZC5ub192YWx1ZScpXG4gICAgKSB7XG4gICAgICBvcHRpb25hbHMucHVzaChbaSwgcGF0dGVybltpXS5kZWZhdWx0X3ZhbHVlXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbmFscztcbn1cblxuZnVuY3Rpb24gZmlsbEluT3B0aW9uYWxWYWx1ZXMoYXJncywgYXJpdHksIG9wdGlvbmFscykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IGFyaXR5IHx8IG9wdGlvbmFscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIGlmIChhcmdzLmxlbmd0aCArIG9wdGlvbmFscy5sZW5ndGggPCBhcml0eSkge1xuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgbGV0IG51bWJlck9mT3B0aW9uYWxzVG9GaWxsID0gYXJpdHkgLSBhcmdzLmxlbmd0aDtcbiAgbGV0IG9wdGlvbmFsc1RvUmVtb3ZlID0gb3B0aW9uYWxzLmxlbmd0aCAtIG51bWJlck9mT3B0aW9uYWxzVG9GaWxsO1xuXG4gIGxldCBvcHRpb25hbHNUb1VzZSA9IG9wdGlvbmFscy5zbGljZShvcHRpb25hbHNUb1JlbW92ZSk7XG5cbiAgZm9yIChsZXQgW2luZGV4LCB2YWx1ZV0gb2Ygb3B0aW9uYWxzVG9Vc2UpIHtcbiAgICBhcmdzLnNwbGljZShpbmRleCwgMCwgdmFsdWUpO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gYXJpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2gocGF0dGVybiwgZXhwciwgZ3VhcmQgPSAoKSA9PiB0cnVlKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG5cbiAgaWYgKGRvZXNNYXRjaCAmJiBhbGxOYW1lc01hdGNoICYmIGd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKCdObyBtYXRjaCBmb3I6JywgZXhwcik7XG4gICAgdGhyb3cgbmV3IE1hdGNoRXJyb3IoZXhwcik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBtYXRjaF9nZW4oXG4gIHBhdHRlcm4sXG4gIGV4cHIsXG4gIGd1YXJkID0gZnVuY3Rpb24qICgpIHsgcmV0dXJuIHRydWUgfVxuKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBkb2VzTWF0Y2ggJiYgYWxsTmFtZXNNYXRjaDtcblxuICBpZiAobWF0Y2hlcyAmJiAoeWllbGQqIGd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSkpIHtcbiAgICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gbWF0Y2ggZm9yOicsIGV4cHIpO1xuICAgIHRocm93IG5ldyBNYXRjaEVycm9yKGV4cHIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmFtZWRWYXJpYWJsZXMocmVzdWx0cykge1xuICBjb25zdCBuYW1lc01hcCA9IHt9O1xuICBjb25zdCBmaWx0ZXJlZFJlc3VsdHMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gcmVzdWx0c1tpXTtcbiAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFR5cGVzLk5hbWVkVmFyaWFibGVSZXN1bHQpIHtcbiAgICAgIGlmIChuYW1lc01hcFtjdXJyZW50Lm5hbWVdICYmIG5hbWVzTWFwW2N1cnJlbnQubmFtZV0gIT09IGN1cnJlbnQudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFtyZXN1bHRzLCBmYWxzZV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBuYW1lc01hcFtjdXJyZW50Lm5hbWVdICYmXG4gICAgICAgIG5hbWVzTWFwW2N1cnJlbnQubmFtZV0gPT09IGN1cnJlbnQudmFsdWVcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJlZFJlc3VsdHMucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWVzTWFwW2N1cnJlbnQubmFtZV0gPSBjdXJyZW50LnZhbHVlO1xuICAgICAgICBmaWx0ZXJlZFJlc3VsdHMucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVyZWRSZXN1bHRzLnB1c2goY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtmaWx0ZXJlZFJlc3VsdHMsIHRydWVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hfb3JfZGVmYXVsdChcbiAgcGF0dGVybixcbiAgZXhwcixcbiAgZ3VhcmQgPSAoKSA9PiB0cnVlLFxuICBkZWZhdWx0X3ZhbHVlID0gbnVsbFxuKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG5cbiAgaWYgKGRvZXNNYXRjaCAmJiBhbGxOYW1lc01hdGNoICYmIGd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIG1hdGNoX29yX2RlZmF1bHRfZ2VuKFxuICBwYXR0ZXJuLFxuICBleHByLFxuICBndWFyZCA9IGZ1bmN0aW9uKiAoKSB7IHJldHVybiB0cnVlIH0sXG4gIGRlZmF1bHRfdmFsdWUgPSBudWxsXG4pIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuICBsZXQgcHJvY2Vzc2VkUGF0dGVybiA9IGJ1aWxkTWF0Y2gocGF0dGVybik7XG4gIGNvbnN0IGRvZXNNYXRjaCA9IHByb2Nlc3NlZFBhdHRlcm4oZXhwciwgcmVzdWx0KTtcbiAgY29uc3QgW2ZpbHRlcmVkUmVzdWx0LCBhbGxOYW1lc01hdGNoXSA9IGNoZWNrTmFtZWRWYXJpYWJsZXMocmVzdWx0KTtcbiAgY29uc3QgbWF0Y2hlcyA9IGRvZXNNYXRjaCAmJiBhbGxOYW1lc01hdGNoO1xuXG4gIGlmIChtYXRjaGVzICYmICh5aWVsZCogZ3VhcmQuYXBwbHkodGhpcywgZmlsdGVyZWRSZXN1bHQpKSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0Y2hfb3JfZGVmYXVsdF9hc3luYyhcbiAgcGF0dGVybixcbiAgZXhwcixcbiAgZ3VhcmQgPSBhc3luYyAoKSA9PiB0cnVlLFxuICBkZWZhdWx0X3ZhbHVlID0gbnVsbFxuKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBkb2VzTWF0Y2ggJiYgYWxsTmFtZXNNYXRjaDtcblxuICBpZiAobWF0Y2hlcyAmJiAoYXdhaXQgZ3VhcmQuYXBwbHkodGhpcywgZmlsdGVyZWRSZXN1bHQpKSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbWF0Y2hfb3JfZGVmYXVsdCB9IGZyb20gXCIuL2RlZm1hdGNoXCI7XG5pbXBvcnQgRXJsYW5nVHlwZXMgZnJvbSBcImVybGFuZy10eXBlc1wiO1xuXG5jb25zdCBOT19NQVRDSCA9IFN5bWJvbCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gYml0c3RyaW5nX2dlbmVyYXRvcihwYXR0ZXJuLCBiaXRzdHJpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGxldCByZXR1cm5SZXN1bHQgPSBbXTtcbiAgICBsZXQgYnNTbGljZSA9IGJpdHN0cmluZy5zbGljZSgwLCBwYXR0ZXJuLmJ5dGVfc2l6ZSgpKTtcbiAgICBsZXQgaSA9IDE7XG5cbiAgICB3aGlsZSAoYnNTbGljZS5ieXRlX3NpemUgPT0gcGF0dGVybi5ieXRlX3NpemUoKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWF0Y2hfb3JfZGVmYXVsdChwYXR0ZXJuLCBic1NsaWNlLCAoKSA9PiB0cnVlLCBOT19NQVRDSCk7XG5cbiAgICAgIGlmIChyZXN1bHQgIT0gTk9fTUFUQ0gpIHtcbiAgICAgICAgY29uc3QgW3ZhbHVlXSA9IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuUmVzdWx0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgYnNTbGljZSA9IGJpdHN0cmluZy5zbGljZShcbiAgICAgICAgcGF0dGVybi5ieXRlX3NpemUoKSAqIGksXG4gICAgICAgIHBhdHRlcm4uYnl0ZV9zaXplKCkgKiAoaSArIDEpXG4gICAgICApO1xuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RfZ2VuZXJhdG9yKHBhdHRlcm4sIGxpc3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGxldCByZXR1cm5SZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpIG9mIGxpc3QpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1hdGNoX29yX2RlZmF1bHQocGF0dGVybiwgaSwgKCkgPT4gdHJ1ZSwgTk9fTUFUQ0gpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBOT19NQVRDSCkge1xuICAgICAgICBjb25zdCBbdmFsdWVdID0gcmVzdWx0O1xuICAgICAgICByZXR1cm5SZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RfY29tcHJlaGVuc2lvbihleHByZXNzaW9uLCBnZW5lcmF0b3JzKSB7XG4gIGNvbnN0IGdlbmVyYXRlZFZhbHVlcyA9IHJ1bl9nZW5lcmF0b3JzKGdlbmVyYXRvcnMucG9wKCkoKSwgZ2VuZXJhdG9ycyk7XG5cbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IHZhbHVlIG9mIGdlbmVyYXRlZFZhbHVlcykge1xuICAgIGlmIChleHByZXNzaW9uLmd1YXJkLmFwcGx5KHRoaXMsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0LnB1c2goZXhwcmVzc2lvbi5mbi5hcHBseSh0aGlzLCB2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJ1bl9nZW5lcmF0b3JzKGdlbmVyYXRvciwgZ2VuZXJhdG9ycykge1xuICBpZiAoZ2VuZXJhdG9ycy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiBnZW5lcmF0b3IubWFwKHggPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3hdO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxpc3QgPSBnZW5lcmF0b3JzLnBvcCgpO1xuXG4gICAgbGV0IG5leHRfZ2VuID0gW107XG4gICAgZm9yIChsZXQgaiBvZiBsaXN0KCkpIHtcbiAgICAgIGZvciAobGV0IGkgb2YgZ2VuZXJhdG9yKSB7XG4gICAgICAgIG5leHRfZ2VuLnB1c2goW2pdLmNvbmNhdChpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bl9nZW5lcmF0b3JzKG5leHRfZ2VuLCBnZW5lcmF0b3JzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYml0c3RyaW5nX2NvbXByZWhlbnNpb24oZXhwcmVzc2lvbiwgZ2VuZXJhdG9ycykge1xuICBjb25zdCBnZW5lcmF0ZWRWYWx1ZXMgPSBydW5fZ2VuZXJhdG9ycyhnZW5lcmF0b3JzLnBvcCgpKCksIGdlbmVyYXRvcnMpO1xuXG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBmb3IgKGxldCB2YWx1ZSBvZiBnZW5lcmF0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5ndWFyZC5hcHBseSh0aGlzLCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGV4cHJlc3Npb24uZm4uYXBwbHkodGhpcywgdmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQgPSByZXN1bHQubWFwKHggPT4gRXJsYW5nVHlwZXMuQml0U3RyaW5nLmludGVnZXIoeCkpO1xuICByZXR1cm4gbmV3IEVybGFuZ1R5cGVzLkJpdFN0cmluZyguLi5yZXN1bHQpO1xufVxuIiwiaW1wb3J0IHtcbiAgZGVmbWF0Y2gsXG4gIG1hdGNoLFxuICBtYXRjaF9nZW4sXG4gIE1hdGNoRXJyb3IsXG4gIENsYXVzZSxcbiAgY2xhdXNlLFxuICBtYXRjaF9vcl9kZWZhdWx0LFxuICBtYXRjaF9vcl9kZWZhdWx0X2dlbixcbiAgbWF0Y2hfb3JfZGVmYXVsdF9hc3luYyxcbiAgZGVmbWF0Y2hnZW4sXG4gIGRlZm1hdGNoR2VuLFxuICBkZWZtYXRjaEFzeW5jXG59IGZyb20gJy4vdGFpbG9yZWQvZGVmbWF0Y2gnO1xuaW1wb3J0IHtcbiAgdmFyaWFibGUsXG4gIHdpbGRjYXJkLFxuICBzdGFydHNXaXRoLFxuICBjYXB0dXJlLFxuICBoZWFkVGFpbCxcbiAgdHlwZSxcbiAgYm91bmQsXG4gIGJpdFN0cmluZ01hdGNoXG59IGZyb20gJy4vdGFpbG9yZWQvdHlwZXMnO1xuXG5pbXBvcnQge1xuICBsaXN0X2dlbmVyYXRvcixcbiAgbGlzdF9jb21wcmVoZW5zaW9uLFxuICBiaXRzdHJpbmdfZ2VuZXJhdG9yLFxuICBiaXRzdHJpbmdfY29tcHJlaGVuc2lvblxufSBmcm9tICcuL3RhaWxvcmVkL2NvbXByZWhlbnNpb25zJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkZWZtYXRjaCxcbiAgbWF0Y2gsXG4gIG1hdGNoX2dlbixcbiAgTWF0Y2hFcnJvcixcbiAgdmFyaWFibGUsXG4gIHdpbGRjYXJkLFxuICBzdGFydHNXaXRoLFxuICBjYXB0dXJlLFxuICBoZWFkVGFpbCxcbiAgdHlwZSxcbiAgYm91bmQsXG4gIENsYXVzZSxcbiAgY2xhdXNlLFxuICBiaXRTdHJpbmdNYXRjaCxcbiAgbWF0Y2hfb3JfZGVmYXVsdCxcbiAgbWF0Y2hfb3JfZGVmYXVsdF9nZW4sXG4gIG1hdGNoX29yX2RlZmF1bHRfYXN5bmMsXG4gIGRlZm1hdGNoZ2VuLFxuICBsaXN0X2NvbXByZWhlbnNpb24sXG4gIGxpc3RfZ2VuZXJhdG9yLFxuICBiaXRzdHJpbmdfZ2VuZXJhdG9yLFxuICBiaXRzdHJpbmdfY29tcHJlaGVuc2lvbixcbiAgZGVmbWF0Y2hHZW4sXG4gIGRlZm1hdGNoQXN5bmNcbn07XG4iXSwibmFtZXMiOlsiVmFyaWFibGUiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsIlN5bWJvbCIsImZvciIsIldpbGRjYXJkIiwiU3RhcnRzV2l0aCIsInByZWZpeCIsIkNhcHR1cmUiLCJ2YWx1ZSIsIkhlYWRUYWlsIiwiaGVhZCIsInRhaWwiLCJUeXBlIiwidHlwZSIsIm9ialBhdHRlcm4iLCJCb3VuZCIsIkJpdFN0cmluZ01hdGNoIiwidmFsdWVzIiwibGVuZ3RoIiwiYnl0ZV9zaXplIiwicyIsInZhbCIsInVuaXQiLCJzaXplIiwiaW5kZXgiLCJnZXRWYWx1ZSIsIk5hbWVkVmFyaWFibGVSZXN1bHQiLCJ2YXJpYWJsZSIsIndpbGRjYXJkIiwic3RhcnRzV2l0aCIsImNhcHR1cmUiLCJoZWFkVGFpbCIsImJvdW5kIiwiYml0U3RyaW5nTWF0Y2giLCJuYW1lZFZhcmlhYmxlUmVzdWx0IiwiaXNfbnVtYmVyIiwiaXNfc3RyaW5nIiwiaXNfYm9vbGVhbiIsImlzX3N5bWJvbCIsImlzX29iamVjdCIsImlzX3ZhcmlhYmxlIiwiaXNfYml0c3RyaW5nIiwiaXNfbnVsbCIsImlzX2FycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNfZnVuY3Rpb24iLCJGdW5jdGlvbiIsImlzX21hcCIsIk1hcCIsImlzX3BpZCIsIkVybGFuZ1R5cGVzIiwiUElEIiwiaXNfdHVwbGUiLCJUdXBsZSIsImlzX3JlZmVyZW5jZSIsIlJlZmVyZW5jZSIsImFycmF5RXF1YWxzIiwibGVmdCIsInJpZ2h0IiwiaSIsImVxdWFscyIsInR1cGxlRXF1YWxzIiwiYml0c3RyaW5nRXF1YWxzIiwiQml0U3RyaW5nIiwicGlkRXF1YWxzIiwiaWQiLCJyZWZlcmVuY2VFcXVhbHMiLCJtYXBFcXVhbHMiLCJsZWZ0RW50cmllcyIsImZyb20iLCJlbnRyaWVzIiwicmlnaHRFbnRyaWVzIiwiaXNfbm9uX3ByaW1pdGl2ZSIsImtleSIsIkNoZWNrcyIsImhhcyIsIm1hcCIsIm1hcF9rZXkiLCJrZXlzIiwiZ2V0IiwicmVzb2x2ZVN5bWJvbCIsInBhdHRlcm4iLCJyZXNvbHZlU3RyaW5nIiwicmVzb2x2ZU51bWJlciIsInJlc29sdmVCb29sZWFuIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVzb2x2ZU51bGwiLCJyZXNvbHZlQm91bmQiLCJhcmdzIiwicmVzb2x2ZVdpbGRjYXJkIiwicmVzb2x2ZVZhcmlhYmxlIiwicHVzaCIsIlR5cGVzIiwicmVzb2x2ZUhlYWRUYWlsIiwiaGVhZE1hdGNoZXMiLCJidWlsZE1hdGNoIiwidGFpbE1hdGNoZXMiLCJzbGljZSIsInJlc29sdmVDYXB0dXJlIiwibWF0Y2hlcyIsInJlc29sdmVTdGFydHNXaXRoIiwic3Vic3RyaW5nIiwicmVzb2x2ZVR5cGUiLCJyZXNvbHZlQXJyYXkiLCJ4IiwiZXZlcnkiLCJ2IiwicmVzb2x2ZU1hcCIsInNldCIsIlV0aWxzIiwicmVzb2x2ZU9iamVjdCIsIk9iamVjdCIsImNvbmNhdCIsImdldE93blByb3BlcnR5U3ltYm9scyIsInJlc29sdmVCaXRTdHJpbmciLCJwYXR0ZXJuQml0U3RyaW5nIiwiYml0c3RyaW5nTWF0Y2hQYXJ0IiwiZ2V0U2l6ZSIsInBhdHRlcm5WYWx1ZXMiLCJic1ZhbHVlIiwiYmluYXJ5IiwiYmVnaW5uaW5nSW5kZXgiLCJ1bmRlZmluZWQiLCJFcnJvciIsImJzVmFsdWVBcnJheVBhcnQiLCJwYXR0ZXJuQml0U3RyaW5nQXJyYXlQYXJ0IiwiYXR0cmlidXRlcyIsImluZGV4T2YiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRmxvYXQzMkFycmF5IiwiY3JlYXRlQml0U3RyaW5nIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYXBwbHkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiYXJyYXlzRXF1YWwiLCJhIiwiYiIsImZpbGxBcnJheSIsImFyciIsIm51bSIsImludGVnZXJQYXJ0cyIsImVsZW0iLCJpbnRlZ2VyIiwicmVzb2x2ZU5vTWF0Y2giLCJwYXR0ZXJuTWFwIiwicHJvdG90eXBlIiwiUmVzb2x2ZXJzIiwiTnVtYmVyIiwiQm9vbGVhbiIsImNvbnN0cnVjdG9yIiwicmVzb2x2ZXIiLCJNYXRjaEVycm9yIiwiYXJnIiwibWVzc2FnZSIsInRvU3RyaW5nIiwibWFwcGVkVmFsdWVzIiwiQ2xhdXNlIiwiZm4iLCJndWFyZCIsImFyaXR5Iiwib3B0aW9uYWxzIiwiZ2V0T3B0aW9uYWxWYWx1ZXMiLCJjbGF1c2UiLCJkZWZtYXRjaCIsImNsYXVzZXMiLCJhcml0aWVzIiwiZ2V0QXJpdHlNYXAiLCJmdW5jVG9DYWxsIiwicGFyYW1zIiwiZmluZE1hdGNoaW5nRnVuY3Rpb24iLCJkZWZtYXRjaGdlbiIsImFyaXR5Q2xhdXNlcyIsInByb2Nlc3NlZENsYXVzZSIsInJlc3VsdCIsImZpbGxJbk9wdGlvbmFsVmFsdWVzIiwiZG9lc01hdGNoIiwiZmlsdGVyZWRSZXN1bHQiLCJhbGxOYW1lc01hdGNoIiwiY2hlY2tOYW1lZFZhcmlhYmxlcyIsImVycm9yIiwiZGVmbWF0Y2hHZW4iLCJkZWZtYXRjaEFzeW5jIiwicmFuZ2UiLCJnZXRBcml0eVJhbmdlIiwibWluIiwibWF4IiwibnVtYmVyT2ZPcHRpb25hbHNUb0ZpbGwiLCJvcHRpb25hbHNUb1JlbW92ZSIsIm9wdGlvbmFsc1RvVXNlIiwic3BsaWNlIiwibWF0Y2giLCJleHByIiwicHJvY2Vzc2VkUGF0dGVybiIsIm1hdGNoX2dlbiIsInJlc3VsdHMiLCJuYW1lc01hcCIsImZpbHRlcmVkUmVzdWx0cyIsImN1cnJlbnQiLCJtYXRjaF9vcl9kZWZhdWx0IiwibWF0Y2hfb3JfZGVmYXVsdF9nZW4iLCJtYXRjaF9vcl9kZWZhdWx0X2FzeW5jIiwiTk9fTUFUQ0giLCJiaXRzdHJpbmdfZ2VuZXJhdG9yIiwiYml0c3RyaW5nIiwicmV0dXJuUmVzdWx0IiwiYnNTbGljZSIsImxpc3RfZ2VuZXJhdG9yIiwibGlzdCIsImxpc3RfY29tcHJlaGVuc2lvbiIsImV4cHJlc3Npb24iLCJnZW5lcmF0b3JzIiwiZ2VuZXJhdGVkVmFsdWVzIiwicnVuX2dlbmVyYXRvcnMiLCJwb3AiLCJnZW5lcmF0b3IiLCJuZXh0X2dlbiIsImoiLCJiaXRzdHJpbmdfY29tcHJlaGVuc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsUUFBTixDQUFlO2NBQ0RDLE9BQU8sSUFBbkIsRUFBeUJDLGdCQUFnQkMsT0FBT0MsR0FBUCxDQUFXLG1CQUFYLENBQXpDLEVBQTBFO1NBQ25FSCxJQUFMLEdBQVlBLElBQVo7U0FDS0MsYUFBTCxHQUFxQkEsYUFBckI7Ozs7QUFJSixNQUFNRyxRQUFOLENBQWU7Z0JB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
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000..acf609d Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..5547cfc --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,170 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/index.html b/coverage/lcov-report/src/index.html new file mode 100644 index 0000000..a2e0dc4 --- /dev/null +++ b/coverage/lcov-report/src/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for src + + + + + + + +
+
+

+ All files src +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/00%0/00%0/00%0/0
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/index.js.html b/coverage/lcov-report/src/index.js.html new file mode 100644 index 0000000..e32ee9a --- /dev/null +++ b/coverage/lcov-report/src/index.js.html @@ -0,0 +1,243 @@ + + + + Code coverage report for src/index.js + + + + + + + +
+
+

+ All files / src index.js +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  defmatch,
+  match,
+  match_gen,
+  MatchError,
+  Clause,
+  clause,
+  match_or_default,
+  match_or_default_gen,
+  match_or_default_async,
+  defmatchgen,
+  defmatchGen,
+  defmatchAsync
+} from './tailored/defmatch';
+import {
+  variable,
+  wildcard,
+  startsWith,
+  capture,
+  headTail,
+  type,
+  bound,
+  bitStringMatch
+} from './tailored/types';
+ 
+import {
+  list_generator,
+  list_comprehension,
+  bitstring_generator,
+  bitstring_comprehension
+} from './tailored/comprehensions';
+ 
+export default {
+  defmatch,
+  match,
+  match_gen,
+  MatchError,
+  variable,
+  wildcard,
+  startsWith,
+  capture,
+  headTail,
+  type,
+  bound,
+  Clause,
+  clause,
+  bitStringMatch,
+  match_or_default,
+  match_or_default_gen,
+  match_or_default_async,
+  defmatchgen,
+  list_comprehension,
+  list_generator,
+  bitstring_generator,
+  bitstring_comprehension,
+  defmatchGen,
+  defmatchAsync
+};
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/checks.js.html b/coverage/lcov-report/src/tailored/checks.js.html new file mode 100644 index 0000000..ca58147 --- /dev/null +++ b/coverage/lcov-report/src/tailored/checks.js.html @@ -0,0 +1,435 @@ + + + + Code coverage report for src/tailored/checks.js + + + + + + + +
+
+

+ All files / src/tailored checks.js +

+
+
+ 0% + Statements + 0/21 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/21 +
+
+ 0% + Lines + 0/21 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/* @flow */
+ 
+import {
+  Variable,
+  Wildcard,
+  HeadTail,
+  Capture,
+  Type,
+  StartsWith,
+  Bound,
+  BitStringMatch
+} from './types';
+ 
+import ErlangTypes from 'erlang-types';
+ 
+function is_number(value) {
+  return typeof value === 'number';
+}
+ 
+function is_string(value) {
+  return typeof value === 'string';
+}
+ 
+function is_boolean(value) {
+  return typeof value === 'boolean';
+}
+ 
+function is_symbol(value) {
+  return typeof value === 'symbol';
+}
+ 
+function is_undefined(value) {
+  return typeof value === 'undefined';
+}
+ 
+function is_object(value) {
+  return typeof value === 'object';
+}
+ 
+function is_variable(value) {
+  return value instanceof Variable;
+}
+ 
+function is_wildcard(value) {
+  return value instanceof Wildcard;
+}
+ 
+function is_headTail(value) {
+  return value instanceof HeadTail;
+}
+ 
+function is_capture(value) {
+  return value instanceof Capture;
+}
+ 
+function is_type(value) {
+  return value instanceof Type;
+}
+ 
+function is_startsWith(value) {
+  return value instanceof StartsWith;
+}
+ 
+function is_bound(value) {
+  return value instanceof Bound;
+}
+ 
+function is_bitstring(value) {
+  return value instanceof BitStringMatch;
+}
+ 
+function is_null(value) {
+  return value === null;
+}
+ 
+function is_array(value) {
+  return Array.isArray(value);
+}
+ 
+function is_function(value) {
+  return typeof value === 'function' || value instanceof Function;
+}
+ 
+function is_map(value) {
+  return value instanceof Map;
+}
+ 
+function is_pid(value) {
+  return value instanceof ErlangTypes.PID;
+}
+ 
+function is_tuple(value) {
+  return value instanceof ErlangTypes.Tuple;
+}
+ 
+function is_reference(value) {
+  return value instanceof ErlangTypes.Reference;
+}
+ 
+export {
+  is_number,
+  is_string,
+  is_boolean,
+  is_symbol,
+  is_null,
+  is_undefined,
+  is_function,
+  is_variable,
+  is_wildcard,
+  is_headTail,
+  is_capture,
+  is_type,
+  is_startsWith,
+  is_bound,
+  is_object,
+  is_array,
+  is_bitstring,
+  is_map,
+  is_tuple,
+  is_pid,
+  is_reference,
+};
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/comprehensions.js.html b/coverage/lcov-report/src/tailored/comprehensions.js.html new file mode 100644 index 0000000..7b9342b --- /dev/null +++ b/coverage/lcov-report/src/tailored/comprehensions.js.html @@ -0,0 +1,360 @@ + + + + Code coverage report for src/tailored/comprehensions.js + + + + + + + +
+
+

+ All files / src/tailored comprehensions.js +

+
+
+ 0% + Statements + 0/48 +
+
+ 0% + Branches + 0/12 +
+
+ 0% + Functions + 0/11 +
+
+ 0% + Lines + 0/45 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { match_or_default } from "./defmatch";
+import ErlangTypes from "erlang-types";
+ 
+const NO_MATCH = Symbol();
+ 
+export function bitstring_generator(pattern, bitstring) {
+  return function() {
+    let returnResult = [];
+    let bsSlice = bitstring.slice(0, pattern.byte_size());
+    let i = 1;
+ 
+    while (bsSlice.byte_size == pattern.byte_size()) {
+      const result = match_or_default(pattern, bsSlice, () => true, NO_MATCH);
+ 
+      if (result != NO_MATCH) {
+        const [value] = result;
+        returnResult.push(result);
+      }
+ 
+      bsSlice = bitstring.slice(
+        pattern.byte_size() * i,
+        pattern.byte_size() * (i + 1)
+      );
+ 
+      i++;
+    }
+ 
+    return returnResult;
+  };
+}
+ 
+export function list_generator(pattern, list) {
+  return function() {
+    let returnResult = [];
+    for (let i of list) {
+      const result = match_or_default(pattern, i, () => true, NO_MATCH);
+      if (result != NO_MATCH) {
+        const [value] = result;
+        returnResult.push(value);
+      }
+    }
+ 
+    return returnResult;
+  };
+}
+ 
+export function list_comprehension(expression, generators) {
+  const generatedValues = run_generators(generators.pop()(), generators);
+ 
+  let result = [];
+ 
+  for (let value of generatedValues) {
+    if (expression.guard.apply(this, value)) {
+      result.push(expression.fn.apply(this, value));
+    }
+  }
+ 
+  return result;
+}
+ 
+function run_generators(generator, generators) {
+  if (generators.length == 0) {
+    return generator.map(x => {
+      if (Array.isArray(x)) {
+        return x;
+      } else {
+        return [x];
+      }
+    });
+  } else {
+    const list = generators.pop();
+ 
+    let next_gen = [];
+    for (let j of list()) {
+      for (let i of generator) {
+        next_gen.push([j].concat(i));
+      }
+    }
+ 
+    return run_generators(next_gen, generators);
+  }
+}
+ 
+export function bitstring_comprehension(expression, generators) {
+  const generatedValues = run_generators(generators.pop()(), generators);
+ 
+  let result = [];
+ 
+  for (let value of generatedValues) {
+    if (expression.guard.apply(this, value)) {
+      result.push(expression.fn.apply(this, value));
+    }
+  }
+ 
+  result = result.map(x => ErlangTypes.BitString.integer(x));
+  return new ErlangTypes.BitString(...result);
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/defmatch.js.html b/coverage/lcov-report/src/tailored/defmatch.js.html new file mode 100644 index 0000000..33f38e0 --- /dev/null +++ b/coverage/lcov-report/src/tailored/defmatch.js.html @@ -0,0 +1,1218 @@ + + + + Code coverage report for src/tailored/defmatch.js + + + + + + + +
+
+

+ All files / src/tailored defmatch.js +

+
+
+ 0% + Statements + 0/186 +
+
+ 0% + Branches + 0/97 +
+
+ 0% + Functions + 0/31 +
+
+ 0% + Lines + 0/184 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { buildMatch } from './match';
+import * as Types from './types';
+ 
+const FUNC = Symbol();
+ 
+export class MatchError extends Error {
+  constructor(arg) {
+    super();
+ 
+    if (typeof arg === 'symbol') {
+      this.message = 'No match for: ' + arg.toString();
+    } else if (Array.isArray(arg)) {
+      let mappedValues = arg.map(x => {
+        if (x === null) {
+          return 'null';
+        } else if (typeof x === 'undefined') {
+          return 'undefined';
+        }
+ 
+        return x.toString();
+      });
+ 
+      this.message = 'No match for: ' + mappedValues;
+    } else {
+      this.message = 'No match for: ' + arg;
+    }
+ 
+    this.name = this.constructor.name;
+  }
+}
+ 
+export class Clause {
+  constructor(pattern, fn, guard = () => true) {
+    this.pattern = buildMatch(pattern);
+    this.arity = pattern.length;
+    this.optionals = getOptionalValues(pattern);
+    this.fn = fn;
+    this.guard = guard;
+  }
+}
+ 
+export function clause(pattern, fn, guard = () => true) {
+  return new Clause(pattern, fn, guard);
+}
+ 
+export function trampoline(fn) {
+  return function() {
+    let res = fn.apply(this, arguments);
+    while (res instanceof Function) {
+      res = res();
+    }
+    return res;
+  };
+}
+ 
+export function defmatch(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return function(...args) {
+    let [funcToCall, params] = findMatchingFunction(args, arities);
+    return funcToCall.apply(this, params);
+  };
+}
+ 
+export function defmatchgen(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return function*(...args) {
+    if (arities.has(args.length)) {
+      const arityClauses = arities.get(args.length);
+ 
+      let funcToCall = null;
+      let params = null;
+      for (let processedClause of arityClauses) {
+        let result = [];
+        args = fillInOptionalValues(
+          args,
+          processedClause.arity,
+          processedClause.optionals
+        );
+ 
+        const doesMatch = processedClause.pattern(args, result);
+        const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+        if (
+          doesMatch &&
+          allNamesMatch &&
+          (yield* processedClause.guard.apply(this, filteredResult))
+        ) {
+          funcToCall = processedClause.fn;
+          params = filteredResult;
+          break;
+        }
+      }
+ 
+      if (!funcToCall) {
+        console.error('No match for:', args);
+        throw new MatchError(args);
+      }
+ 
+      return yield* funcToCall.apply(this, params);
+    } else {
+      console.error('Arity of', args.length, 'not found. No match for:', args);
+      throw new MatchError(args);
+    }
+  };
+}
+ 
+export function defmatchGen(...args) {
+  return defmatchgen(...args);
+}
+ 
+export function defmatchAsync(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return async function(...args) {
+    if (arities.has(args.length)) {
+      const arityClauses = arities.get(args.length);
+ 
+      let funcToCall = null;
+      let params = null;
+      for (let processedClause of arityClauses) {
+        let result = [];
+        args = fillInOptionalValues(
+          args,
+          processedClause.arity,
+          processedClause.optionals
+        );
+ 
+        const doesMatch = processedClause.pattern(args, result);
+        const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+        if (
+          doesMatch &&
+          allNamesMatch &&
+          (await processedClause.guard.apply(this, filteredResult))
+        ) {
+          funcToCall = processedClause.fn;
+          params = filteredResult;
+          break;
+        }
+      }
+ 
+      if (!funcToCall) {
+        console.error('No match for:', args);
+        throw new MatchError(args);
+      }
+ 
+      return funcToCall.apply(this, params);
+    } else {
+      console.error('Arity of', args.length, 'not found. No match for:', args);
+      throw new MatchError(args);
+    }
+  };
+}
+ 
+function findMatchingFunction(args, arities) {
+  if (arities.has(args.length)) {
+    const arityClauses = arities.get(args.length);
+ 
+    let funcToCall = null;
+    let params = null;
+    for (let processedClause of arityClauses) {
+      let result = [];
+      args = fillInOptionalValues(
+        args,
+        processedClause.arity,
+        processedClause.optionals
+      );
+ 
+      const doesMatch = processedClause.pattern(args, result);
+      const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+      if (
+        doesMatch &&
+        allNamesMatch &&
+        processedClause.guard.apply(this, filteredResult)
+      ) {
+        funcToCall = processedClause.fn;
+        params = filteredResult;
+        break;
+      }
+    }
+ 
+    if (!funcToCall) {
+      console.error('No match for:', args);
+      throw new MatchError(args);
+    }
+ 
+    return [funcToCall, params];
+  } else {
+    console.error('Arity of', args.length, 'not found. No match for:', args);
+    throw new MatchError(args);
+  }
+}
+ 
+function getArityMap(clauses) {
+  let map = new Map();
+ 
+  for (const clause of clauses) {
+    const range = getArityRange(clause);
+ 
+    for (const arity of range) {
+      let arityClauses = [];
+ 
+      if (map.has(arity)) {
+        arityClauses = map.get(arity);
+      }
+ 
+      arityClauses.push(clause);
+      map.set(arity, arityClauses);
+    }
+  }
+ 
+  return map;
+}
+ 
+function getArityRange(clause) {
+  const min = clause.arity - clause.optionals.length;
+  const max = clause.arity;
+ 
+  let range = [min];
+ 
+  while (range[range.length - 1] != max) {
+    range.push(range[range.length - 1] + 1);
+  }
+ 
+  return range;
+}
+ 
+function getOptionalValues(pattern) {
+  let optionals = [];
+ 
+  for (let i = 0; i < pattern.length; i++) {
+    if (
+      pattern[i] instanceof Types.Variable &&
+      pattern[i].default_value != Symbol.for('tailored.no_value')
+    ) {
+      optionals.push([i, pattern[i].default_value]);
+    }
+  }
+ 
+  return optionals;
+}
+ 
+function fillInOptionalValues(args, arity, optionals) {
+  if (args.length === arity || optionals.length === 0) {
+    return args;
+  }
+ 
+  if (args.length + optionals.length < arity) {
+    return args;
+  }
+ 
+  let numberOfOptionalsToFill = arity - args.length;
+  let optionalsToRemove = optionals.length - numberOfOptionalsToFill;
+ 
+  let optionalsToUse = optionals.slice(optionalsToRemove);
+ 
+  for (let [index, value] of optionalsToUse) {
+    args.splice(index, 0, value);
+    if (args.length === arity) {
+      break;
+    }
+  }
+ 
+  return args;
+}
+ 
+export function match(pattern, expr, guard = () => true) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+  if (doesMatch && allNamesMatch && guard.apply(this, filteredResult)) {
+    return filteredResult;
+  } else {
+    console.error('No match for:', expr);
+    throw new MatchError(expr);
+  }
+}
+ 
+export function* match_gen(
+  pattern,
+  expr,
+  guard = function* () { return true }
+) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (yield* guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    console.error('No match for:', expr);
+    throw new MatchError(expr);
+  }
+}
+ 
+function checkNamedVariables(results) {
+  const namesMap = {};
+  const filteredResults = [];
+ 
+  for (let i = 0; i < results.length; i++) {
+    const current = results[i];
+    if (current instanceof Types.NamedVariableResult) {
+      if (namesMap[current.name] && namesMap[current.name] !== current.value) {
+        return [results, false];
+      } else if (
+        namesMap[current.name] &&
+        namesMap[current.name] === current.value
+      ) {
+        filteredResults.push(current.value);
+      } else {
+        namesMap[current.name] = current.value;
+        filteredResults.push(current.value);
+      }
+    } else {
+      filteredResults.push(current);
+    }
+  }
+ 
+  return [filteredResults, true];
+}
+ 
+export function match_or_default(
+  pattern,
+  expr,
+  guard = () => true,
+  default_value = null
+) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+  if (doesMatch && allNamesMatch && guard.apply(this, filteredResult)) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+export function* match_or_default_gen(
+  pattern,
+  expr,
+  guard = function* () { return true },
+  default_value = null
+) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (yield* guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+export async function match_or_default_async(
+  pattern,
+  expr,
+  guard = async () => true,
+  default_value = null
+) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (await guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/index.html b/coverage/lcov-report/src/tailored/index.html new file mode 100644 index 0000000..1ab4678 --- /dev/null +++ b/coverage/lcov-report/src/tailored/index.html @@ -0,0 +1,175 @@ + + + + Code coverage report for src/tailored + + + + + + + +
+
+

+ All files src/tailored +

+
+
+ 0% + Statements + 0/529 +
+
+ 0% + Branches + 0/273 +
+
+ 0% + Functions + 0/141 +
+
+ 0% + Lines + 0/514 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
checks.js
0%0/210%0/20%0/210%0/21
comprehensions.js
0%0/480%0/120%0/110%0/45
defmatch.js
0%0/1860%0/970%0/310%0/184
match.js
0%0/300%0/100%0/10%0/30
resolvers.js
0%0/1570%0/1000%0/430%0/148
types.js
0%0/310%0/60%0/240%0/31
utils.js
0%0/560%0/460%0/100%0/55
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/match.js.html b/coverage/lcov-report/src/tailored/match.js.html new file mode 100644 index 0000000..f5a7f46 --- /dev/null +++ b/coverage/lcov-report/src/tailored/match.js.html @@ -0,0 +1,237 @@ + + + + Code coverage report for src/tailored/match.js + + + + + + + +
+
+

+ All files / src/tailored match.js +

+
+
+ 0% + Statements + 0/30 +
+
+ 0% + Branches + 0/10 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/30 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as Resolvers from './resolvers';
+import {
+  Variable,
+  Wildcard,
+  HeadTail,
+  Capture,
+  Type,
+  StartsWith,
+  Bound,
+  BitStringMatch
+} from './types';
+ 
+const patternMap = new Map();
+patternMap.set(Variable.prototype, Resolvers.resolveVariable);
+patternMap.set(Wildcard.prototype, Resolvers.resolveWildcard);
+patternMap.set(HeadTail.prototype, Resolvers.resolveHeadTail);
+patternMap.set(StartsWith.prototype, Resolvers.resolveStartsWith);
+patternMap.set(Capture.prototype, Resolvers.resolveCapture);
+patternMap.set(Bound.prototype, Resolvers.resolveBound);
+patternMap.set(Type.prototype, Resolvers.resolveType);
+patternMap.set(BitStringMatch.prototype, Resolvers.resolveBitString);
+patternMap.set(Number.prototype, Resolvers.resolveNumber);
+patternMap.set(Symbol.prototype, Resolvers.resolveSymbol);
+patternMap.set(Map.prototype, Resolvers.resolveMap);
+patternMap.set(Array.prototype, Resolvers.resolveArray);
+patternMap.set(String.prototype, Resolvers.resolveString);
+patternMap.set(Boolean.prototype, Resolvers.resolveBoolean);
+patternMap.set(Function.prototype, Resolvers.resolveFunction);
+patternMap.set(Object.prototype, Resolvers.resolveObject);
+ 
+export function buildMatch(pattern) {
+  if (pattern === null) {
+    return Resolvers.resolveNull(pattern);
+  }
+ 
+  if (typeof pattern === 'undefined') {
+    return Resolvers.resolveWildcard(pattern);
+  }
+ 
+  if (typeof pattern === 'function') {
+    return Resolvers.resolveFunction(pattern);
+  }
+ 
+  const type = pattern.constructor.prototype;
+  const resolver = patternMap.get(type);
+ 
+  if (resolver) {
+    return resolver(pattern);
+  }
+ 
+  if (typeof pattern === 'object') {
+    return Resolvers.resolveObject(pattern);
+  }
+ 
+  return Resolvers.resolveNoMatch();
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/resolvers.js.html b/coverage/lcov-report/src/tailored/resolvers.js.html new file mode 100644 index 0000000..f30a384 --- /dev/null +++ b/coverage/lcov-report/src/tailored/resolvers.js.html @@ -0,0 +1,1197 @@ + + + + Code coverage report for src/tailored/resolvers.js + + + + + + + +
+
+

+ All files / src/tailored resolvers.js +

+
+
+ 0% + Statements + 0/157 +
+
+ 0% + Branches + 0/100 +
+
+ 0% + Functions + 0/43 +
+
+ 0% + Lines + 0/148 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/* @flow */
+ 
+import * as Checks from './checks';
+import * as Types from './types';
+import { buildMatch } from './match';
+import ErlangTypes from 'erlang-types';
+const BitString = ErlangTypes.BitString;
+import Utils from './utils'
+ 
+function resolveSymbol(pattern) {
+  return function(value) {
+    return Checks.is_symbol(value) && value === pattern;
+  };
+}
+ 
+function resolveString(pattern) {
+  return function(value) {
+    return Checks.is_string(value) && value === pattern;
+  };
+}
+ 
+function resolveNumber(pattern) {
+  return function(value) {
+    return Checks.is_number(value) && value === pattern;
+  };
+}
+ 
+function resolveBoolean(pattern) {
+  return function(value) {
+    return Checks.is_boolean(value) && value === pattern;
+  };
+}
+ 
+function resolveFunction(pattern) {
+  return function(value) {
+    return Checks.is_function(value) && value === pattern;
+  };
+}
+ 
+function resolveNull(pattern) {
+  return function(value) {
+    return Checks.is_null(value);
+  };
+}
+ 
+function resolveBound(pattern) {
+  return function(value, args) {
+    if (typeof value === typeof pattern.value && value === pattern.value) {
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveWildcard() {
+  return function() {
+    return true;
+  };
+}
+ 
+function resolveVariable(pattern) {
+  return function(value, args) {
+    if (pattern.name === null) {
+      args.push(value);
+    } else if (pattern.name !== '_') {
+      args.push(Types.namedVariableResult(pattern.name, value));
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveHeadTail(pattern) {
+  const headMatches = buildMatch(pattern.head);
+  const tailMatches = buildMatch(pattern.tail);
+ 
+  return function(value, args) {
+    if (!Checks.is_array(value) || value.length === 0) {
+      return false;
+    }
+ 
+    const head = value[0];
+    const tail = value.slice(1);
+ 
+    if (headMatches(head, args) && tailMatches(tail, args)) {
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveCapture(pattern) {
+  const matches = buildMatch(pattern.value);
+ 
+  return function(value, args) {
+    if (matches(value, args)) {
+      args.push(value);
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveStartsWith(pattern) {
+  const prefix = pattern.prefix;
+ 
+  return function(value, args) {
+    if (Checks.is_string(value) && value.startsWith(prefix)) {
+      args.push(value.substring(prefix.length));
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveType(pattern) {
+  return function(value, args) {
+    if (value instanceof pattern.type) {
+      const matches = buildMatch(pattern.objPattern);
+      return matches(value, args);
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveArray(pattern) {
+  const matches = pattern.map(x => buildMatch(x));
+ 
+  return function(value, args) {
+    if (!Checks.is_array(value) || value.length != pattern.length) {
+      return false;
+    }
+ 
+    return value.every(function(v, i) {
+      return matches[i](value[i], args);
+    });
+  };
+}
+ 
+function resolveMap(pattern) {
+  let matches = new Map();
+ 
+  const keys = Array.from(pattern.keys());
+ 
+  for (let key of keys) {
+    matches.set(key, buildMatch(pattern.get(key)));
+  }
+ 
+  return function(value, args) {
+    if (!Checks.is_map(value) || pattern.size > value.size) {
+      return false;
+    }
+ 
+    for (const key of keys) {
+      if (!Utils.has(value, key) || !Utils.get(matches, key)(Utils.get(value, key), args)) {
+        return false;
+      }
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveObject(pattern) {
+  let matches = {};
+ 
+  const keys = Object.keys(pattern).concat(
+    Object.getOwnPropertySymbols(pattern)
+  );
+ 
+  for (let key of keys) {
+    matches[key] = buildMatch(pattern[key]);
+  }
+ 
+  return function(value, args) {
+    if (!Checks.is_object(value) || pattern.length > value.length) {
+      return false;
+    }
+ 
+    for (let key of keys) {
+      if (!(key in value) || !matches[key](value[key], args)) {
+        return false;
+      }
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveBitString(pattern) {
+  let patternBitString = [];
+ 
+  for (let bitstringMatchPart of pattern.values) {
+    if (Checks.is_variable(bitstringMatchPart.value)) {
+      let size = getSize(bitstringMatchPart.unit, bitstringMatchPart.size);
+      fillArray(patternBitString, size);
+    } else {
+      patternBitString = patternBitString.concat(
+        new BitString(bitstringMatchPart).value
+      );
+    }
+  }
+ 
+  let patternValues = pattern.values;
+ 
+  return function(value, args) {
+    let bsValue = null;
+ 
+    if (!Checks.is_string(value) && !(value instanceof BitString)) {
+      return false;
+    }
+ 
+    if (Checks.is_string(value)) {
+      bsValue = new BitString(BitString.binary(value));
+    } else {
+      bsValue = value;
+    }
+ 
+    let beginningIndex = 0;
+ 
+    for (let i = 0; i < patternValues.length; i++) {
+      let bitstringMatchPart = patternValues[i];
+ 
+      if (
+        Checks.is_variable(bitstringMatchPart.value) &&
+        bitstringMatchPart.type == 'binary' &&
+        bitstringMatchPart.size === undefined &&
+        i < patternValues.length - 1
+      ) {
+        throw new Error(
+          'a binary field without size is only allowed at the end of a binary pattern'
+        );
+      }
+ 
+      let size = 0;
+      let bsValueArrayPart = [];
+      let patternBitStringArrayPart = [];
+      size = getSize(bitstringMatchPart.unit, bitstringMatchPart.size);
+ 
+      if (i === patternValues.length - 1) {
+        bsValueArrayPart = bsValue.value.slice(beginningIndex);
+        patternBitStringArrayPart = patternBitString.slice(beginningIndex);
+      } else {
+        bsValueArrayPart = bsValue.value.slice(
+          beginningIndex,
+          beginningIndex + size
+        );
+        patternBitStringArrayPart = patternBitString.slice(
+          beginningIndex,
+          beginningIndex + size
+        );
+      }
+ 
+      if (Checks.is_variable(bitstringMatchPart.value)) {
+        switch (bitstringMatchPart.type) {
+          case 'integer':
+            if (
+              bitstringMatchPart.attributes &&
+              bitstringMatchPart.attributes.indexOf('signed') != -1
+            ) {
+              args.push(new Int8Array([bsValueArrayPart[0]])[0]);
+            } else {
+              args.push(new Uint8Array([bsValueArrayPart[0]])[0]);
+            }
+            break;
+ 
+          case 'float':
+            if (size === 64) {
+              args.push(Float64Array.from(bsValueArrayPart)[0]);
+            } else if (size === 32) {
+              args.push(Float32Array.from(bsValueArrayPart)[0]);
+            } else {
+              return false;
+            }
+            break;
+ 
+          case 'bitstring':
+            args.push(createBitString(bsValueArrayPart));
+            break;
+ 
+          case 'binary':
+            args.push(
+              String.fromCharCode.apply(null, new Uint8Array(bsValueArrayPart))
+            );
+            break;
+ 
+          case 'utf8':
+            args.push(
+              String.fromCharCode.apply(null, new Uint8Array(bsValueArrayPart))
+            );
+            break;
+ 
+          case 'utf16':
+            args.push(
+              String.fromCharCode.apply(null, new Uint16Array(bsValueArrayPart))
+            );
+            break;
+ 
+          case 'utf32':
+            args.push(
+              String.fromCharCode.apply(null, new Uint32Array(bsValueArrayPart))
+            );
+            break;
+ 
+          default:
+            return false;
+        }
+      } else if (!arraysEqual(bsValueArrayPart, patternBitStringArrayPart)) {
+        return false;
+      }
+ 
+      beginningIndex = beginningIndex + size;
+    }
+ 
+    return true;
+  };
+}
+ 
+function getSize(unit, size) {
+  return unit * size / 8;
+}
+ 
+function arraysEqual(a, b) {
+  if (a === b) return true;
+  if (a == null || b == null) return false;
+  if (a.length != b.length) return false;
+ 
+  for (var i = 0; i < a.length; ++i) {
+    if (a[i] !== b[i]) return false;
+  }
+ 
+  return true;
+}
+ 
+function fillArray(arr, num) {
+  for (let i = 0; i < num; i++) {
+    arr.push(0);
+  }
+}
+ 
+function createBitString(arr) {
+  let integerParts = arr.map(elem => BitString.integer(elem));
+  return new BitString(...integerParts);
+}
+ 
+function resolveNoMatch() {
+  return function() {
+    return false;
+  };
+}
+ 
+export {
+  resolveBound,
+  resolveWildcard,
+  resolveVariable,
+  resolveHeadTail,
+  resolveCapture,
+  resolveStartsWith,
+  resolveType,
+  resolveArray,
+  resolveObject,
+  resolveNoMatch,
+  resolveSymbol,
+  resolveString,
+  resolveNumber,
+  resolveBoolean,
+  resolveFunction,
+  resolveNull,
+  resolveBitString,
+  resolveMap
+};
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/types.js.html b/coverage/lcov-report/src/tailored/types.js.html new file mode 100644 index 0000000..9f8068d --- /dev/null +++ b/coverage/lcov-report/src/tailored/types.js.html @@ -0,0 +1,513 @@ + + + + Code coverage report for src/tailored/types.js + + + + + + + +
+
+

+ All files / src/tailored types.js +

+
+
+ 0% + Statements + 0/31 +
+
+ 0% + Branches + 0/6 +
+
+ 0% + Functions + 0/24 +
+
+ 0% + Lines + 0/31 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/* @flow */
+ 
+class Variable {
+  constructor(name = null, default_value = Symbol.for('tailored.no_value')) {
+    this.name = name;
+    this.default_value = default_value;
+  }
+}
+ 
+class Wildcard {
+  constructor() {}
+}
+ 
+class StartsWith {
+  constructor(prefix) {
+    this.prefix = prefix;
+  }
+}
+ 
+class Capture {
+  constructor(value) {
+    this.value = value;
+  }
+}
+ 
+class HeadTail {
+  constructor(head, tail) {
+    this.head = head;
+    this.tail = tail;
+  }
+}
+ 
+class Type {
+  constructor(type, objPattern = {}) {
+    this.type = type;
+    this.objPattern = objPattern;
+  }
+}
+ 
+class Bound {
+  constructor(value) {
+    this.value = value;
+  }
+}
+ 
+class BitStringMatch {
+  constructor(...values) {
+    this.values = values;
+  }
+ 
+  length() {
+    return values.length;
+  }
+ 
+  bit_size() {
+    return this.byte_size() * 8;
+  }
+ 
+  byte_size() {
+    let s = 0;
+ 
+    for (let val of this.values) {
+      s = s + val.unit * val.size / 8;
+    }
+ 
+    return s;
+  }
+ 
+  getValue(index) {
+    return this.values(index);
+  }
+ 
+  getSizeOfValue(index) {
+    let val = this.getValue(index);
+    return val.unit * val.size;
+  }
+ 
+  getTypeOfValue(index) {
+    return this.getValue(index).type;
+  }
+}
+ 
+class NamedVariableResult {
+  constructor(name, value) {
+    this.name = name;
+    this.value = value;
+  }
+}
+ 
+function variable(
+  name = null,
+  default_value = Symbol.for('tailored.no_value')
+) {
+  return new Variable(name, default_value);
+}
+ 
+function wildcard() {
+  return new Wildcard();
+}
+ 
+function startsWith(prefix) {
+  return new StartsWith(prefix);
+}
+ 
+function capture(value) {
+  return new Capture(value);
+}
+ 
+function headTail(head, tail) {
+  return new HeadTail(head, tail);
+}
+ 
+function type(type, objPattern = {}) {
+  return new Type(type, objPattern);
+}
+ 
+function bound(value) {
+  return new Bound(value);
+}
+ 
+function bitStringMatch(...values) {
+  return new BitStringMatch(...values);
+}
+ 
+function namedVariableResult(name, value) {
+  return new NamedVariableResult(name, value);
+}
+ 
+export {
+  Variable,
+  Wildcard,
+  StartsWith,
+  Capture,
+  HeadTail,
+  Type,
+  Bound,
+  BitStringMatch,
+  variable,
+  wildcard,
+  startsWith,
+  capture,
+  headTail,
+  type,
+  bound,
+  bitStringMatch,
+  NamedVariableResult,
+  namedVariableResult
+};
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/src/tailored/utils.js.html b/coverage/lcov-report/src/tailored/utils.js.html new file mode 100644 index 0000000..ef273d3 --- /dev/null +++ b/coverage/lcov-report/src/tailored/utils.js.html @@ -0,0 +1,504 @@ + + + + Code coverage report for src/tailored/utils.js + + + + + + + +
+
+

+ All files / src/tailored utils.js +

+
+
+ 0% + Statements + 0/56 +
+
+ 0% + Branches + 0/46 +
+
+ 0% + Functions + 0/10 +
+
+ 0% + Lines + 0/55 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as Checks from './checks';
+import ErlangTypes from 'erlang-types';
+ 
+function arrayEquals(left, right) {
+  if (!Array.isArray(right)) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  for (let i = 0; i < left.length; i++) {
+    if (equals(left[i], right[i]) === false) {
+      return false;
+    }
+  }
+ 
+  return true;
+}
+ 
+function tupleEquals(left, right) {
+  if (right instanceof ErlangTypes.Tuple === false) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  return arrayEquals(left.values, right.values);
+}
+ 
+function bitstringEquals(left, right) {
+  if (right instanceof ErlangTypes.BitString === false) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  return arrayEquals(left.value, right.value);
+}
+ 
+function pidEquals(left, right) {
+  if (right instanceof ErlangTypes.PID === false) {
+    return false;
+  }
+ 
+  return left.id === right.id;
+}
+ 
+function referenceEquals(left, right) {
+  if (right instanceof ErlangTypes.Reference === false) {
+    return false;
+  }
+ 
+  return left.id === right.id;
+}
+ 
+function mapEquals(left, right) {
+  if (right instanceof Map === false) {
+    return false;
+  }
+ 
+  const leftEntries = Array.from(left.entries());
+  const rightEntries = Array.from(right.entries());
+ 
+  return arrayEquals(leftEntries, rightEntries);
+}
+ 
+function equals(left, right) {
+  if (Array.isArray(left)) {
+    return arrayEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.Tuple) {
+    return tupleEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.PID) {
+    return pidEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.BitString) {
+    return bitstringEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.Reference) {
+    return referenceEquals(left, right);
+  }
+ 
+  if (left instanceof Map) {
+    return mapEquals(left, right);
+  }
+ 
+  return left === right;
+}
+ 
+function is_non_primitive(key) {
+  return (
+    Checks.is_array(key) ||
+    Checks.is_map(key) ||
+    Checks.is_pid(key) ||
+    Checks.is_reference(key) ||
+    Checks.is_bitstring(key) ||
+    Checks.is_tuple(key)
+  );
+}
+ 
+function has(map, key) {
+  if (is_non_primitive(key)) {
+    for (const map_key of map.keys()) {
+      if (equals(map_key, key)) {
+        return true;
+      }
+    }
+ 
+    return false;
+  }
+ 
+  return map.has(key);
+}
+ 
+function get(map, key) {
+  if (is_non_primitive(key)) {
+    for (const map_key of map.keys()) {
+      if (equals(map_key, key)) {
+        return map.get(map_key);
+      }
+    }
+ 
+    return null;
+  }
+ 
+  return map.get(key);
+}
+ 
+ 
+export default {
+  get,
+  has,
+  equals,
+}
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/tailored.js.html b/coverage/lcov-report/tailored.js.html new file mode 100644 index 0000000..297f67f --- /dev/null +++ b/coverage/lcov-report/tailored.js.html @@ -0,0 +1,3483 @@ + + + + Code coverage report for tailored.js + + + + + + + +
+
+

+ All files tailored.js +

+
+
+ 0% + Statements + 0/521 +
+
+ 0% + Branches + 0/278 +
+
+ 0% + Functions + 0/133 +
+
+ 0% + Lines + 0/506 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
'use strict';
+ 
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+ 
+var ErlangTypes = _interopDefault(require('erlang-types'));
+ 
+/* @flow */
+ 
+class Variable {
+  constructor(name = null, default_value = Symbol.for('tailored.no_value')) {
+    this.name = name;
+    this.default_value = default_value;
+  }
+}
+ 
+class Wildcard {
+  constructor() {}
+}
+ 
+class StartsWith {
+  constructor(prefix) {
+    this.prefix = prefix;
+  }
+}
+ 
+class Capture {
+  constructor(value) {
+    this.value = value;
+  }
+}
+ 
+class HeadTail {
+  constructor(head, tail) {
+    this.head = head;
+    this.tail = tail;
+  }
+}
+ 
+class Type {
+  constructor(type, objPattern = {}) {
+    this.type = type;
+    this.objPattern = objPattern;
+  }
+}
+ 
+class Bound {
+  constructor(value) {
+    this.value = value;
+  }
+}
+ 
+class BitStringMatch {
+  constructor(...values) {
+    this.values = values;
+  }
+ 
+  length() {
+    return values.length;
+  }
+ 
+  bit_size() {
+    return this.byte_size() * 8;
+  }
+ 
+  byte_size() {
+    let s = 0;
+ 
+    for (let val of this.values) {
+      s = s + val.unit * val.size / 8;
+    }
+ 
+    return s;
+  }
+ 
+  getValue(index) {
+    return this.values(index);
+  }
+ 
+  getSizeOfValue(index) {
+    let val = this.getValue(index);
+    return val.unit * val.size;
+  }
+ 
+  getTypeOfValue(index) {
+    return this.getValue(index).type;
+  }
+}
+ 
+class NamedVariableResult {
+  constructor(name, value) {
+    this.name = name;
+    this.value = value;
+  }
+}
+ 
+function variable(name = null, default_value = Symbol.for('tailored.no_value')) {
+  return new Variable(name, default_value);
+}
+ 
+function wildcard() {
+  return new Wildcard();
+}
+ 
+function startsWith(prefix) {
+  return new StartsWith(prefix);
+}
+ 
+function capture(value) {
+  return new Capture(value);
+}
+ 
+function headTail(head, tail) {
+  return new HeadTail(head, tail);
+}
+ 
+function type(type, objPattern = {}) {
+  return new Type(type, objPattern);
+}
+ 
+function bound(value) {
+  return new Bound(value);
+}
+ 
+function bitStringMatch(...values) {
+  return new BitStringMatch(...values);
+}
+ 
+function namedVariableResult(name, value) {
+  return new NamedVariableResult(name, value);
+}
+ 
+/* @flow */
+ 
+function is_number(value) {
+  return typeof value === 'number';
+}
+ 
+function is_string(value) {
+  return typeof value === 'string';
+}
+ 
+function is_boolean(value) {
+  return typeof value === 'boolean';
+}
+ 
+function is_symbol(value) {
+  return typeof value === 'symbol';
+}
+ 
+function is_object(value) {
+  return typeof value === 'object';
+}
+ 
+function is_variable(value) {
+  return value instanceof Variable;
+}
+ 
+function is_bitstring(value) {
+  return value instanceof BitStringMatch;
+}
+ 
+function is_null(value) {
+  return value === null;
+}
+ 
+function is_array(value) {
+  return Array.isArray(value);
+}
+ 
+function is_function(value) {
+  return typeof value === 'function' || value instanceof Function;
+}
+ 
+function is_map(value) {
+  return value instanceof Map;
+}
+ 
+function is_pid(value) {
+  return value instanceof ErlangTypes.PID;
+}
+ 
+function is_tuple(value) {
+  return value instanceof ErlangTypes.Tuple;
+}
+ 
+function is_reference(value) {
+  return value instanceof ErlangTypes.Reference;
+}
+ 
+function arrayEquals(left, right) {
+  if (!Array.isArray(right)) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  for (let i = 0; i < left.length; i++) {
+    if (equals(left[i], right[i]) === false) {
+      return false;
+    }
+  }
+ 
+  return true;
+}
+ 
+function tupleEquals(left, right) {
+  if (right instanceof ErlangTypes.Tuple === false) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  return arrayEquals(left.values, right.values);
+}
+ 
+function bitstringEquals(left, right) {
+  if (right instanceof ErlangTypes.BitString === false) {
+    return false;
+  }
+ 
+  if (left.length !== right.length) {
+    return false;
+  }
+ 
+  return arrayEquals(left.value, right.value);
+}
+ 
+function pidEquals(left, right) {
+  if (right instanceof ErlangTypes.PID === false) {
+    return false;
+  }
+ 
+  return left.id === right.id;
+}
+ 
+function referenceEquals(left, right) {
+  if (right instanceof ErlangTypes.Reference === false) {
+    return false;
+  }
+ 
+  return left.id === right.id;
+}
+ 
+function mapEquals(left, right) {
+  if (right instanceof Map === false) {
+    return false;
+  }
+ 
+  const leftEntries = Array.from(left.entries());
+  const rightEntries = Array.from(right.entries());
+ 
+  return arrayEquals(leftEntries, rightEntries);
+}
+ 
+function equals(left, right) {
+  if (Array.isArray(left)) {
+    return arrayEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.Tuple) {
+    return tupleEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.PID) {
+    return pidEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.BitString) {
+    return bitstringEquals(left, right);
+  }
+ 
+  if (left instanceof ErlangTypes.Reference) {
+    return referenceEquals(left, right);
+  }
+ 
+  if (left instanceof Map) {
+    return mapEquals(left, right);
+  }
+ 
+  return left === right;
+}
+ 
+function is_non_primitive(key) {
+  return is_array(key) || is_map(key) || is_pid(key) || is_reference(key) || is_bitstring(key) || is_tuple(key);
+}
+ 
+function has(map, key) {
+  if (is_non_primitive(key)) {
+    for (const map_key of map.keys()) {
+      if (equals(map_key, key)) {
+        return true;
+      }
+    }
+ 
+    return false;
+  }
+ 
+  return map.has(key);
+}
+ 
+function get(map, key) {
+  if (is_non_primitive(key)) {
+    for (const map_key of map.keys()) {
+      if (equals(map_key, key)) {
+        return map.get(map_key);
+      }
+    }
+ 
+    return null;
+  }
+ 
+  return map.get(key);
+}
+ 
+var Utils = {
+  get,
+  has,
+  equals
+};
+ 
+/* @flow */
+ 
+const BitString = ErlangTypes.BitString;
+function resolveSymbol(pattern) {
+  return function (value) {
+    return is_symbol(value) && value === pattern;
+  };
+}
+ 
+function resolveString(pattern) {
+  return function (value) {
+    return is_string(value) && value === pattern;
+  };
+}
+ 
+function resolveNumber(pattern) {
+  return function (value) {
+    return is_number(value) && value === pattern;
+  };
+}
+ 
+function resolveBoolean(pattern) {
+  return function (value) {
+    return is_boolean(value) && value === pattern;
+  };
+}
+ 
+function resolveFunction(pattern) {
+  return function (value) {
+    return is_function(value) && value === pattern;
+  };
+}
+ 
+function resolveNull(pattern) {
+  return function (value) {
+    return is_null(value);
+  };
+}
+ 
+function resolveBound(pattern) {
+  return function (value, args) {
+    if (typeof value === typeof pattern.value && value === pattern.value) {
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveWildcard() {
+  return function () {
+    return true;
+  };
+}
+ 
+function resolveVariable(pattern) {
+  return function (value, args) {
+    if (pattern.name === null) {
+      args.push(value);
+    } else if (pattern.name !== '_') {
+      args.push(namedVariableResult(pattern.name, value));
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveHeadTail(pattern) {
+  const headMatches = buildMatch(pattern.head);
+  const tailMatches = buildMatch(pattern.tail);
+ 
+  return function (value, args) {
+    if (!is_array(value) || value.length === 0) {
+      return false;
+    }
+ 
+    const head = value[0];
+    const tail = value.slice(1);
+ 
+    if (headMatches(head, args) && tailMatches(tail, args)) {
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveCapture(pattern) {
+  const matches = buildMatch(pattern.value);
+ 
+  return function (value, args) {
+    if (matches(value, args)) {
+      args.push(value);
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveStartsWith(pattern) {
+  const prefix = pattern.prefix;
+ 
+  return function (value, args) {
+    if (is_string(value) && value.startsWith(prefix)) {
+      args.push(value.substring(prefix.length));
+      return true;
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveType(pattern) {
+  return function (value, args) {
+    if (value instanceof pattern.type) {
+      const matches = buildMatch(pattern.objPattern);
+      return matches(value, args);
+    }
+ 
+    return false;
+  };
+}
+ 
+function resolveArray(pattern) {
+  const matches = pattern.map(x => buildMatch(x));
+ 
+  return function (value, args) {
+    if (!is_array(value) || value.length != pattern.length) {
+      return false;
+    }
+ 
+    return value.every(function (v, i) {
+      return matches[i](value[i], args);
+    });
+  };
+}
+ 
+function resolveMap(pattern) {
+  let matches = new Map();
+ 
+  const keys = Array.from(pattern.keys());
+ 
+  for (let key of keys) {
+    matches.set(key, buildMatch(pattern.get(key)));
+  }
+ 
+  return function (value, args) {
+    if (!is_map(value) || pattern.size > value.size) {
+      return false;
+    }
+ 
+    for (const key of keys) {
+      if (!Utils.has(value, key) || !Utils.get(matches, key)(Utils.get(value, key), args)) {
+        return false;
+      }
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveObject(pattern) {
+  let matches = {};
+ 
+  const keys = Object.keys(pattern).concat(Object.getOwnPropertySymbols(pattern));
+ 
+  for (let key of keys) {
+    matches[key] = buildMatch(pattern[key]);
+  }
+ 
+  return function (value, args) {
+    if (!is_object(value) || pattern.length > value.length) {
+      return false;
+    }
+ 
+    for (let key of keys) {
+      if (!(key in value) || !matches[key](value[key], args)) {
+        return false;
+      }
+    }
+ 
+    return true;
+  };
+}
+ 
+function resolveBitString(pattern) {
+  let patternBitString = [];
+ 
+  for (let bitstringMatchPart of pattern.values) {
+    if (is_variable(bitstringMatchPart.value)) {
+      let size = getSize(bitstringMatchPart.unit, bitstringMatchPart.size);
+      fillArray(patternBitString, size);
+    } else {
+      patternBitString = patternBitString.concat(new BitString(bitstringMatchPart).value);
+    }
+  }
+ 
+  let patternValues = pattern.values;
+ 
+  return function (value, args) {
+    let bsValue = null;
+ 
+    if (!is_string(value) && !(value instanceof BitString)) {
+      return false;
+    }
+ 
+    if (is_string(value)) {
+      bsValue = new BitString(BitString.binary(value));
+    } else {
+      bsValue = value;
+    }
+ 
+    let beginningIndex = 0;
+ 
+    for (let i = 0; i < patternValues.length; i++) {
+      let bitstringMatchPart = patternValues[i];
+ 
+      if (is_variable(bitstringMatchPart.value) && bitstringMatchPart.type == 'binary' && bitstringMatchPart.size === undefined && i < patternValues.length - 1) {
+        throw new Error('a binary field without size is only allowed at the end of a binary pattern');
+      }
+ 
+      let size = 0;
+      let bsValueArrayPart = [];
+      let patternBitStringArrayPart = [];
+      size = getSize(bitstringMatchPart.unit, bitstringMatchPart.size);
+ 
+      if (i === patternValues.length - 1) {
+        bsValueArrayPart = bsValue.value.slice(beginningIndex);
+        patternBitStringArrayPart = patternBitString.slice(beginningIndex);
+      } else {
+        bsValueArrayPart = bsValue.value.slice(beginningIndex, beginningIndex + size);
+        patternBitStringArrayPart = patternBitString.slice(beginningIndex, beginningIndex + size);
+      }
+ 
+      if (is_variable(bitstringMatchPart.value)) {
+        switch (bitstringMatchPart.type) {
+          case 'integer':
+            if (bitstringMatchPart.attributes && bitstringMatchPart.attributes.indexOf('signed') != -1) {
+              args.push(new Int8Array([bsValueArrayPart[0]])[0]);
+            } else {
+              args.push(new Uint8Array([bsValueArrayPart[0]])[0]);
+            }
+            break;
+ 
+          case 'float':
+            if (size === 64) {
+              args.push(Float64Array.from(bsValueArrayPart)[0]);
+            } else if (size === 32) {
+              args.push(Float32Array.from(bsValueArrayPart)[0]);
+            } else {
+              return false;
+            }
+            break;
+ 
+          case 'bitstring':
+            args.push(createBitString(bsValueArrayPart));
+            break;
+ 
+          case 'binary':
+            args.push(String.fromCharCode.apply(null, new Uint8Array(bsValueArrayPart)));
+            break;
+ 
+          case 'utf8':
+            args.push(String.fromCharCode.apply(null, new Uint8Array(bsValueArrayPart)));
+            break;
+ 
+          case 'utf16':
+            args.push(String.fromCharCode.apply(null, new Uint16Array(bsValueArrayPart)));
+            break;
+ 
+          case 'utf32':
+            args.push(String.fromCharCode.apply(null, new Uint32Array(bsValueArrayPart)));
+            break;
+ 
+          default:
+            return false;
+        }
+      } else if (!arraysEqual(bsValueArrayPart, patternBitStringArrayPart)) {
+        return false;
+      }
+ 
+      beginningIndex = beginningIndex + size;
+    }
+ 
+    return true;
+  };
+}
+ 
+function getSize(unit, size) {
+  return unit * size / 8;
+}
+ 
+function arraysEqual(a, b) {
+  if (a === b) return true;
+  if (a == null || b == null) return false;
+  if (a.length != b.length) return false;
+ 
+  for (var i = 0; i < a.length; ++i) {
+    if (a[i] !== b[i]) return false;
+  }
+ 
+  return true;
+}
+ 
+function fillArray(arr, num) {
+  for (let i = 0; i < num; i++) {
+    arr.push(0);
+  }
+}
+ 
+function createBitString(arr) {
+  let integerParts = arr.map(elem => BitString.integer(elem));
+  return new BitString(...integerParts);
+}
+ 
+function resolveNoMatch() {
+  return function () {
+    return false;
+  };
+}
+ 
+const patternMap = new Map();
+patternMap.set(Variable.prototype, resolveVariable);
+patternMap.set(Wildcard.prototype, resolveWildcard);
+patternMap.set(HeadTail.prototype, resolveHeadTail);
+patternMap.set(StartsWith.prototype, resolveStartsWith);
+patternMap.set(Capture.prototype, resolveCapture);
+patternMap.set(Bound.prototype, resolveBound);
+patternMap.set(Type.prototype, resolveType);
+patternMap.set(BitStringMatch.prototype, resolveBitString);
+patternMap.set(Number.prototype, resolveNumber);
+patternMap.set(Symbol.prototype, resolveSymbol);
+patternMap.set(Map.prototype, resolveMap);
+patternMap.set(Array.prototype, resolveArray);
+patternMap.set(String.prototype, resolveString);
+patternMap.set(Boolean.prototype, resolveBoolean);
+patternMap.set(Function.prototype, resolveFunction);
+patternMap.set(Object.prototype, resolveObject);
+ 
+function buildMatch(pattern) {
+  if (pattern === null) {
+    return resolveNull(pattern);
+  }
+ 
+  if (typeof pattern === 'undefined') {
+    return resolveWildcard(pattern);
+  }
+ 
+  if (typeof pattern === 'function') {
+    return resolveFunction(pattern);
+  }
+ 
+  const type$$1 = pattern.constructor.prototype;
+  const resolver = patternMap.get(type$$1);
+ 
+  if (resolver) {
+    return resolver(pattern);
+  }
+ 
+  if (typeof pattern === 'object') {
+    return resolveObject(pattern);
+  }
+ 
+  return resolveNoMatch();
+}
+ 
+class MatchError extends Error {
+  constructor(arg) {
+    super();
+ 
+    if (typeof arg === 'symbol') {
+      this.message = 'No match for: ' + arg.toString();
+    } else if (Array.isArray(arg)) {
+      let mappedValues = arg.map(x => {
+        if (x === null) {
+          return 'null';
+        } else if (typeof x === 'undefined') {
+          return 'undefined';
+        }
+ 
+        return x.toString();
+      });
+ 
+      this.message = 'No match for: ' + mappedValues;
+    } else {
+      this.message = 'No match for: ' + arg;
+    }
+ 
+    this.name = this.constructor.name;
+  }
+}
+ 
+class Clause {
+  constructor(pattern, fn, guard = () => true) {
+    this.pattern = buildMatch(pattern);
+    this.arity = pattern.length;
+    this.optionals = getOptionalValues(pattern);
+    this.fn = fn;
+    this.guard = guard;
+  }
+}
+ 
+function clause(pattern, fn, guard = () => true) {
+  return new Clause(pattern, fn, guard);
+}
+ 
+ 
+ 
+function defmatch(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return function (...args) {
+    let [funcToCall, params] = findMatchingFunction(args, arities);
+    return funcToCall.apply(this, params);
+  };
+}
+ 
+function defmatchgen(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return function* (...args) {
+    if (arities.has(args.length)) {
+      const arityClauses = arities.get(args.length);
+ 
+      let funcToCall = null;
+      let params = null;
+      for (let processedClause of arityClauses) {
+        let result = [];
+        args = fillInOptionalValues(args, processedClause.arity, processedClause.optionals);
+ 
+        const doesMatch = processedClause.pattern(args, result);
+        const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+        if (doesMatch && allNamesMatch && (yield* processedClause.guard.apply(this, filteredResult))) {
+          funcToCall = processedClause.fn;
+          params = filteredResult;
+          break;
+        }
+      }
+ 
+      if (!funcToCall) {
+        console.error('No match for:', args);
+        throw new MatchError(args);
+      }
+ 
+      return yield* funcToCall.apply(this, params);
+    } else {
+      console.error('Arity of', args.length, 'not found. No match for:', args);
+      throw new MatchError(args);
+    }
+  };
+}
+ 
+function defmatchGen(...args) {
+  return defmatchgen(...args);
+}
+ 
+function defmatchAsync(...clauses) {
+  const arities = getArityMap(clauses);
+ 
+  return async function (...args) {
+    if (arities.has(args.length)) {
+      const arityClauses = arities.get(args.length);
+ 
+      let funcToCall = null;
+      let params = null;
+      for (let processedClause of arityClauses) {
+        let result = [];
+        args = fillInOptionalValues(args, processedClause.arity, processedClause.optionals);
+ 
+        const doesMatch = processedClause.pattern(args, result);
+        const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+        if (doesMatch && allNamesMatch && (await processedClause.guard.apply(this, filteredResult))) {
+          funcToCall = processedClause.fn;
+          params = filteredResult;
+          break;
+        }
+      }
+ 
+      if (!funcToCall) {
+        console.error('No match for:', args);
+        throw new MatchError(args);
+      }
+ 
+      return funcToCall.apply(this, params);
+    } else {
+      console.error('Arity of', args.length, 'not found. No match for:', args);
+      throw new MatchError(args);
+    }
+  };
+}
+ 
+function findMatchingFunction(args, arities) {
+  if (arities.has(args.length)) {
+    const arityClauses = arities.get(args.length);
+ 
+    let funcToCall = null;
+    let params = null;
+    for (let processedClause of arityClauses) {
+      let result = [];
+      args = fillInOptionalValues(args, processedClause.arity, processedClause.optionals);
+ 
+      const doesMatch = processedClause.pattern(args, result);
+      const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+      if (doesMatch && allNamesMatch && processedClause.guard.apply(this, filteredResult)) {
+        funcToCall = processedClause.fn;
+        params = filteredResult;
+        break;
+      }
+    }
+ 
+    if (!funcToCall) {
+      console.error('No match for:', args);
+      throw new MatchError(args);
+    }
+ 
+    return [funcToCall, params];
+  } else {
+    console.error('Arity of', args.length, 'not found. No match for:', args);
+    throw new MatchError(args);
+  }
+}
+ 
+function getArityMap(clauses) {
+  let map = new Map();
+ 
+  for (const clause of clauses) {
+    const range = getArityRange(clause);
+ 
+    for (const arity of range) {
+      let arityClauses = [];
+ 
+      if (map.has(arity)) {
+        arityClauses = map.get(arity);
+      }
+ 
+      arityClauses.push(clause);
+      map.set(arity, arityClauses);
+    }
+  }
+ 
+  return map;
+}
+ 
+function getArityRange(clause) {
+  const min = clause.arity - clause.optionals.length;
+  const max = clause.arity;
+ 
+  let range = [min];
+ 
+  while (range[range.length - 1] != max) {
+    range.push(range[range.length - 1] + 1);
+  }
+ 
+  return range;
+}
+ 
+function getOptionalValues(pattern) {
+  let optionals = [];
+ 
+  for (let i = 0; i < pattern.length; i++) {
+    if (pattern[i] instanceof Variable && pattern[i].default_value != Symbol.for('tailored.no_value')) {
+      optionals.push([i, pattern[i].default_value]);
+    }
+  }
+ 
+  return optionals;
+}
+ 
+function fillInOptionalValues(args, arity, optionals) {
+  if (args.length === arity || optionals.length === 0) {
+    return args;
+  }
+ 
+  if (args.length + optionals.length < arity) {
+    return args;
+  }
+ 
+  let numberOfOptionalsToFill = arity - args.length;
+  let optionalsToRemove = optionals.length - numberOfOptionalsToFill;
+ 
+  let optionalsToUse = optionals.slice(optionalsToRemove);
+ 
+  for (let [index, value] of optionalsToUse) {
+    args.splice(index, 0, value);
+    if (args.length === arity) {
+      break;
+    }
+  }
+ 
+  return args;
+}
+ 
+function match(pattern, expr, guard = () => true) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+  if (doesMatch && allNamesMatch && guard.apply(this, filteredResult)) {
+    return filteredResult;
+  } else {
+    console.error('No match for:', expr);
+    throw new MatchError(expr);
+  }
+}
+ 
+function* match_gen(pattern, expr, guard = function* () {
+  return true;
+}) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (yield* guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    console.error('No match for:', expr);
+    throw new MatchError(expr);
+  }
+}
+ 
+function checkNamedVariables(results) {
+  const namesMap = {};
+  const filteredResults = [];
+ 
+  for (let i = 0; i < results.length; i++) {
+    const current = results[i];
+    if (current instanceof NamedVariableResult) {
+      if (namesMap[current.name] && namesMap[current.name] !== current.value) {
+        return [results, false];
+      } else if (namesMap[current.name] && namesMap[current.name] === current.value) {
+        filteredResults.push(current.value);
+      } else {
+        namesMap[current.name] = current.value;
+        filteredResults.push(current.value);
+      }
+    } else {
+      filteredResults.push(current);
+    }
+  }
+ 
+  return [filteredResults, true];
+}
+ 
+function match_or_default(pattern, expr, guard = () => true, default_value = null) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+ 
+  if (doesMatch && allNamesMatch && guard.apply(this, filteredResult)) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+function* match_or_default_gen(pattern, expr, guard = function* () {
+  return true;
+}, default_value = null) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (yield* guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+async function match_or_default_async(pattern, expr, guard = async () => true, default_value = null) {
+  let result = [];
+  let processedPattern = buildMatch(pattern);
+  const doesMatch = processedPattern(expr, result);
+  const [filteredResult, allNamesMatch] = checkNamedVariables(result);
+  const matches = doesMatch && allNamesMatch;
+ 
+  if (matches && (await guard.apply(this, filteredResult))) {
+    return filteredResult;
+  } else {
+    return default_value;
+  }
+}
+ 
+const NO_MATCH = Symbol();
+ 
+function bitstring_generator(pattern, bitstring) {
+  return function () {
+    let returnResult = [];
+    let bsSlice = bitstring.slice(0, pattern.byte_size());
+    let i = 1;
+ 
+    while (bsSlice.byte_size == pattern.byte_size()) {
+      const result = match_or_default(pattern, bsSlice, () => true, NO_MATCH);
+ 
+      if (result != NO_MATCH) {
+        const [value] = result;
+        returnResult.push(result);
+      }
+ 
+      bsSlice = bitstring.slice(pattern.byte_size() * i, pattern.byte_size() * (i + 1));
+ 
+      i++;
+    }
+ 
+    return returnResult;
+  };
+}
+ 
+function list_generator(pattern, list) {
+  return function () {
+    let returnResult = [];
+    for (let i of list) {
+      const result = match_or_default(pattern, i, () => true, NO_MATCH);
+      if (result != NO_MATCH) {
+        const [value] = result;
+        returnResult.push(value);
+      }
+    }
+ 
+    return returnResult;
+  };
+}
+ 
+function list_comprehension(expression, generators) {
+  const generatedValues = run_generators(generators.pop()(), generators);
+ 
+  let result = [];
+ 
+  for (let value of generatedValues) {
+    if (expression.guard.apply(this, value)) {
+      result.push(expression.fn.apply(this, value));
+    }
+  }
+ 
+  return result;
+}
+ 
+function run_generators(generator, generators) {
+  if (generators.length == 0) {
+    return generator.map(x => {
+      if (Array.isArray(x)) {
+        return x;
+      } else {
+        return [x];
+      }
+    });
+  } else {
+    const list = generators.pop();
+ 
+    let next_gen = [];
+    for (let j of list()) {
+      for (let i of generator) {
+        next_gen.push([j].concat(i));
+      }
+    }
+ 
+    return run_generators(next_gen, generators);
+  }
+}
+ 
+function bitstring_comprehension(expression, generators) {
+  const generatedValues = run_generators(generators.pop()(), generators);
+ 
+  let result = [];
+ 
+  for (let value of generatedValues) {
+    if (expression.guard.apply(this, value)) {
+      result.push(expression.fn.apply(this, value));
+    }
+  }
+ 
+  result = result.map(x => ErlangTypes.BitString.integer(x));
+  return new ErlangTypes.BitString(...result);
+}
+ 
+var index = {
+  defmatch,
+  match,
+  match_gen,
+  MatchError,
+  variable,
+  wildcard,
+  startsWith,
+  capture,
+  headTail,
+  type,
+  bound,
+  Clause,
+  clause,
+  bitStringMatch,
+  match_or_default,
+  match_or_default_gen,
+  match_or_default_async,
+  defmatchgen,
+  list_comprehension,
+  list_generator,
+  bitstring_generator,
+  bitstring_comprehension,
+  defmatchGen,
+  defmatchAsync
+};
+ 
+module.exports = index;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbG9yZWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWlsb3JlZC90eXBlcy5qcyIsIi4uL3NyYy90YWlsb3JlZC9jaGVja3MuanMiLCIuLi9zcmMvdGFpbG9yZWQvdXRpbHMuanMiLCIuLi9zcmMvdGFpbG9yZWQvcmVzb2x2ZXJzLmpzIiwiLi4vc3JjL3RhaWxvcmVkL21hdGNoLmpzIiwiLi4vc3JjL3RhaWxvcmVkL2RlZm1hdGNoLmpzIiwiLi4vc3JjL3RhaWxvcmVkL2NvbXByZWhlbnNpb25zLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIEBmbG93ICovXG5cbmNsYXNzIFZhcmlhYmxlIHtcbiAgY29uc3RydWN0b3IobmFtZSA9IG51bGwsIGRlZmF1bHRfdmFsdWUgPSBTeW1ib2wuZm9yKCd0YWlsb3JlZC5ub192YWx1ZScpKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRlZmF1bHRfdmFsdWUgPSBkZWZhdWx0X3ZhbHVlO1xuICB9XG59XG5cbmNsYXNzIFdpbGRjYXJkIHtcbiAgY29uc3RydWN0b3IoKSB7fVxufVxuXG5jbGFzcyBTdGFydHNXaXRoIHtcbiAgY29uc3RydWN0b3IocHJlZml4KSB7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gIH1cbn1cblxuY2xhc3MgQ2FwdHVyZSB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbmNsYXNzIEhlYWRUYWlsIHtcbiAgY29uc3RydWN0b3IoaGVhZCwgdGFpbCkge1xuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgdGhpcy50YWlsID0gdGFpbDtcbiAgfVxufVxuXG5jbGFzcyBUeXBlIHtcbiAgY29uc3RydWN0b3IodHlwZSwgb2JqUGF0dGVybiA9IHt9KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm9ialBhdHRlcm4gPSBvYmpQYXR0ZXJuO1xuICB9XG59XG5cbmNsYXNzIEJvdW5kIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuY2xhc3MgQml0U3RyaW5nTWF0Y2gge1xuICBjb25zdHJ1Y3RvciguLi52YWx1ZXMpIHtcbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aDtcbiAgfVxuXG4gIGJpdF9zaXplKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVfc2l6ZSgpICogODtcbiAgfVxuXG4gIGJ5dGVfc2l6ZSgpIHtcbiAgICBsZXQgcyA9IDA7XG5cbiAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy52YWx1ZXMpIHtcbiAgICAgIHMgPSBzICsgdmFsLnVuaXQgKiB2YWwuc2l6ZSAvIDg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICBnZXRWYWx1ZShpbmRleCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcyhpbmRleCk7XG4gIH1cblxuICBnZXRTaXplT2ZWYWx1ZShpbmRleCkge1xuICAgIGxldCB2YWwgPSB0aGlzLmdldFZhbHVlKGluZGV4KTtcbiAgICByZXR1cm4gdmFsLnVuaXQgKiB2YWwuc2l6ZTtcbiAgfVxuXG4gIGdldFR5cGVPZlZhbHVlKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoaW5kZXgpLnR5cGU7XG4gIH1cbn1cblxuY2xhc3MgTmFtZWRWYXJpYWJsZVJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFyaWFibGUoXG4gIG5hbWUgPSBudWxsLFxuICBkZWZhdWx0X3ZhbHVlID0gU3ltYm9sLmZvcigndGFpbG9yZWQubm9fdmFsdWUnKVxuKSB7XG4gIHJldHVybiBuZXcgVmFyaWFibGUobmFtZSwgZGVmYXVsdF92YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHdpbGRjYXJkKCkge1xuICByZXR1cm4gbmV3IFdpbGRjYXJkKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgocHJlZml4KSB7XG4gIHJldHVybiBuZXcgU3RhcnRzV2l0aChwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBjYXB0dXJlKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgQ2FwdHVyZSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGhlYWRUYWlsKGhlYWQsIHRhaWwpIHtcbiAgcmV0dXJuIG5ldyBIZWFkVGFpbChoZWFkLCB0YWlsKTtcbn1cblxuZnVuY3Rpb24gdHlwZSh0eXBlLCBvYmpQYXR0ZXJuID0ge30pIHtcbiAgcmV0dXJuIG5ldyBUeXBlKHR5cGUsIG9ialBhdHRlcm4pO1xufVxuXG5mdW5jdGlvbiBib3VuZCh2YWx1ZSkge1xuICByZXR1cm4gbmV3IEJvdW5kKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gYml0U3RyaW5nTWF0Y2goLi4udmFsdWVzKSB7XG4gIHJldHVybiBuZXcgQml0U3RyaW5nTWF0Y2goLi4udmFsdWVzKTtcbn1cblxuZnVuY3Rpb24gbmFtZWRWYXJpYWJsZVJlc3VsdChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gbmV3IE5hbWVkVmFyaWFibGVSZXN1bHQobmFtZSwgdmFsdWUpO1xufVxuXG5leHBvcnQge1xuICBWYXJpYWJsZSxcbiAgV2lsZGNhcmQsXG4gIFN0YXJ0c1dpdGgsXG4gIENhcHR1cmUsXG4gIEhlYWRUYWlsLFxuICBUeXBlLFxuICBCb3VuZCxcbiAgQml0U3RyaW5nTWF0Y2gsXG4gIHZhcmlhYmxlLFxuICB3aWxkY2FyZCxcbiAgc3RhcnRzV2l0aCxcbiAgY2FwdHVyZSxcbiAgaGVhZFRhaWwsXG4gIHR5cGUsXG4gIGJvdW5kLFxuICBiaXRTdHJpbmdNYXRjaCxcbiAgTmFtZWRWYXJpYWJsZVJlc3VsdCxcbiAgbmFtZWRWYXJpYWJsZVJlc3VsdFxufTtcbiIsIi8qIEBmbG93ICovXG5cbmltcG9ydCB7XG4gIFZhcmlhYmxlLFxuICBXaWxkY2FyZCxcbiAgSGVhZFRhaWwsXG4gIENhcHR1cmUsXG4gIFR5cGUsXG4gIFN0YXJ0c1dpdGgsXG4gIEJvdW5kLFxuICBCaXRTdHJpbmdNYXRjaFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IEVybGFuZ1R5cGVzIGZyb20gJ2VybGFuZy10eXBlcyc7XG5cbmZ1bmN0aW9uIGlzX251bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNfc3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc19ib29sZWFuKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNfc3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnO1xufVxuXG5mdW5jdGlvbiBpc191bmRlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGlzX29iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gaXNfdmFyaWFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIGlzX3dpbGRjYXJkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdpbGRjYXJkO1xufVxuXG5mdW5jdGlvbiBpc19oZWFkVGFpbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBIZWFkVGFpbDtcbn1cblxuZnVuY3Rpb24gaXNfY2FwdHVyZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBDYXB0dXJlO1xufVxuXG5mdW5jdGlvbiBpc190eXBlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzX3N0YXJ0c1dpdGgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU3RhcnRzV2l0aDtcbn1cblxuZnVuY3Rpb24gaXNfYm91bmQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQm91bmQ7XG59XG5cbmZ1bmN0aW9uIGlzX2JpdHN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBCaXRTdHJpbmdNYXRjaDtcbn1cblxuZnVuY3Rpb24gaXNfbnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzX2FycmF5KHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xufVxuXG5mdW5jdGlvbiBpc19tYXAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG5mdW5jdGlvbiBpc19waWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuUElEO1xufVxuXG5mdW5jdGlvbiBpc190dXBsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFcmxhbmdUeXBlcy5UdXBsZTtcbn1cblxuZnVuY3Rpb24gaXNfcmVmZXJlbmNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVybGFuZ1R5cGVzLlJlZmVyZW5jZTtcbn1cblxuZXhwb3J0IHtcbiAgaXNfbnVtYmVyLFxuICBpc19zdHJpbmcsXG4gIGlzX2Jvb2xlYW4sXG4gIGlzX3N5bWJvbCxcbiAgaXNfbnVsbCxcbiAgaXNfdW5kZWZpbmVkLFxuICBpc19mdW5jdGlvbixcbiAgaXNfdmFyaWFibGUsXG4gIGlzX3dpbGRjYXJkLFxuICBpc19oZWFkVGFpbCxcbiAgaXNfY2FwdHVyZSxcbiAgaXNfdHlwZSxcbiAgaXNfc3RhcnRzV2l0aCxcbiAgaXNfYm91bmQsXG4gIGlzX29iamVjdCxcbiAgaXNfYXJyYXksXG4gIGlzX2JpdHN0cmluZyxcbiAgaXNfbWFwLFxuICBpc190dXBsZSxcbiAgaXNfcGlkLFxuICBpc19yZWZlcmVuY2UsXG59O1xuIiwiaW1wb3J0ICogYXMgQ2hlY2tzIGZyb20gJy4vY2hlY2tzJztcbmltcG9ydCBFcmxhbmdUeXBlcyBmcm9tICdlcmxhbmctdHlwZXMnO1xuXG5mdW5jdGlvbiBhcnJheUVxdWFscyhsZWZ0LCByaWdodCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZXF1YWxzKGxlZnRbaV0sIHJpZ2h0W2ldKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdHVwbGVFcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuVHVwbGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlFcXVhbHMobGVmdC52YWx1ZXMsIHJpZ2h0LnZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIGJpdHN0cmluZ0VxdWFscyhsZWZ0LCByaWdodCkge1xuICBpZiAocmlnaHQgaW5zdGFuY2VvZiBFcmxhbmdUeXBlcy5CaXRTdHJpbmcgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGxlZnQubGVuZ3RoICE9PSByaWdodC5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYXJyYXlFcXVhbHMobGVmdC52YWx1ZSwgcmlnaHQudmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwaWRFcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuUElEID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBsZWZ0LmlkID09PSByaWdodC5pZDtcbn1cblxuZnVuY3Rpb24gcmVmZXJlbmNlRXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChyaWdodCBpbnN0YW5jZW9mIEVybGFuZ1R5cGVzLlJlZmVyZW5jZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbGVmdC5pZCA9PT0gcmlnaHQuaWQ7XG59XG5cbmZ1bmN0aW9uIG1hcEVxdWFscyhsZWZ0LCByaWdodCkge1xuICBpZiAocmlnaHQgaW5zdGFuY2VvZiBNYXAgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGVmdEVudHJpZXMgPSBBcnJheS5mcm9tKGxlZnQuZW50cmllcygpKTtcbiAgY29uc3QgcmlnaHRFbnRyaWVzID0gQXJyYXkuZnJvbShyaWdodC5lbnRyaWVzKCkpO1xuXG4gIHJldHVybiBhcnJheUVxdWFscyhsZWZ0RW50cmllcywgcmlnaHRFbnRyaWVzKTtcbn1cblxuZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpKSB7XG4gICAgcmV0dXJuIGFycmF5RXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIGlmIChsZWZ0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuVHVwbGUpIHtcbiAgICByZXR1cm4gdHVwbGVFcXVhbHMobGVmdCwgcmlnaHQpO1xuICB9XG5cbiAgaWYgKGxlZnQgaW5zdGFuY2VvZiBFcmxhbmdUeXBlcy5QSUQpIHtcbiAgICByZXR1cm4gcGlkRXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIGlmIChsZWZ0IGluc3RhbmNlb2YgRXJsYW5nVHlwZXMuQml0U3RyaW5nKSB7XG4gICAgcmV0dXJuIGJpdHN0cmluZ0VxdWFscyhsZWZ0LCByaWdodCk7XG4gIH1cblxuICBpZiAobGVmdCBpbnN0YW5jZW9mIEVybGFuZ1R5cGVzLlJlZmVyZW5jZSkge1xuICAgIHJldHVybiByZWZlcmVuY2VFcXVhbHMobGVmdCwgcmlnaHQpO1xuICB9XG5cbiAgaWYgKGxlZnQgaW5zdGFuY2VvZiBNYXApIHtcbiAgICByZXR1cm4gbWFwRXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBsZWZ0ID09PSByaWdodDtcbn1cblxuZnVuY3Rpb24gaXNfbm9uX3ByaW1pdGl2ZShrZXkpIHtcbiAgcmV0dXJuIChcbiAgICBDaGVja3MuaXNfYXJyYXkoa2V5KSB8fFxuICAgIENoZWNrcy5pc19tYXAoa2V5KSB8fFxuICAgIENoZWNrcy5pc19waWQoa2V5KSB8fFxuICAgIENoZWNrcy5pc19yZWZlcmVuY2Uoa2V5KSB8fFxuICAgIENoZWNrcy5pc19iaXRzdHJpbmcoa2V5KSB8fFxuICAgIENoZWNrcy5pc190dXBsZShrZXkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhcyhtYXAsIGtleSkge1xuICBpZiAoaXNfbm9uX3ByaW1pdGl2ZShrZXkpKSB7XG4gICAgZm9yIChjb25zdCBtYXBfa2V5IG9mIG1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChlcXVhbHMobWFwX2tleSwga2V5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbWFwLmhhcyhrZXkpO1xufVxuXG5mdW5jdGlvbiBnZXQobWFwLCBrZXkpIHtcbiAgaWYgKGlzX25vbl9wcmltaXRpdmUoa2V5KSkge1xuICAgIGZvciAoY29uc3QgbWFwX2tleSBvZiBtYXAua2V5cygpKSB7XG4gICAgICBpZiAoZXF1YWxzKG1hcF9rZXksIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG1hcC5nZXQobWFwX2tleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gbWFwLmdldChrZXkpO1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0LFxuICBoYXMsXG4gIGVxdWFscyxcbn1cbiIsIi8qIEBmbG93ICovXG5cbmltcG9ydCAqIGFzIENoZWNrcyBmcm9tICcuL2NoZWNrcyc7XG5pbXBvcnQgKiBhcyBUeXBlcyBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGJ1aWxkTWF0Y2ggfSBmcm9tICcuL21hdGNoJztcbmltcG9ydCBFcmxhbmdUeXBlcyBmcm9tICdlcmxhbmctdHlwZXMnO1xuY29uc3QgQml0U3RyaW5nID0gRXJsYW5nVHlwZXMuQml0U3RyaW5nO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMnXG5cbmZ1bmN0aW9uIHJlc29sdmVTeW1ib2wocGF0dGVybikge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQ2hlY2tzLmlzX3N5bWJvbCh2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdHJpbmcocGF0dGVybikge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQ2hlY2tzLmlzX3N0cmluZyh2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOdW1iZXIocGF0dGVybikge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gQ2hlY2tzLmlzX251bWJlcih2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVCb29sZWFuKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIENoZWNrcy5pc19ib29sZWFuKHZhbHVlKSAmJiB2YWx1ZSA9PT0gcGF0dGVybjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIENoZWNrcy5pc19mdW5jdGlvbih2YWx1ZSkgJiYgdmFsdWUgPT09IHBhdHRlcm47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOdWxsKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIENoZWNrcy5pc19udWxsKHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJvdW5kKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gdHlwZW9mIHBhdHRlcm4udmFsdWUgJiYgdmFsdWUgPT09IHBhdHRlcm4udmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVdpbGRjYXJkKCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVWYXJpYWJsZShwYXR0ZXJuKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgYXJncykge1xuICAgIGlmIChwYXR0ZXJuLm5hbWUgPT09IG51bGwpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuLm5hbWUgIT09ICdfJykge1xuICAgICAgYXJncy5wdXNoKFR5cGVzLm5hbWVkVmFyaWFibGVSZXN1bHQocGF0dGVybi5uYW1lLCB2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSGVhZFRhaWwocGF0dGVybikge1xuICBjb25zdCBoZWFkTWF0Y2hlcyA9IGJ1aWxkTWF0Y2gocGF0dGVybi5oZWFkKTtcbiAgY29uc3QgdGFpbE1hdGNoZXMgPSBidWlsZE1hdGNoKHBhdHRlcm4udGFpbCk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKCFDaGVja3MuaXNfYXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWQgPSB2YWx1ZVswXTtcbiAgICBjb25zdCB0YWlsID0gdmFsdWUuc2xpY2UoMSk7XG5cbiAgICBpZiAoaGVhZE1hdGNoZXMoaGVhZCwgYXJncykgJiYgdGFpbE1hdGNoZXModGFpbCwgYXJncykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNhcHR1cmUocGF0dGVybikge1xuICBjb25zdCBtYXRjaGVzID0gYnVpbGRNYXRjaChwYXR0ZXJuLnZhbHVlKTtcblxuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGFyZ3MpIHtcbiAgICBpZiAobWF0Y2hlcyh2YWx1ZSwgYXJncykpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdGFydHNXaXRoKHBhdHRlcm4pIHtcbiAgY29uc3QgcHJlZml4ID0gcGF0dGVybi5wcmVmaXg7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKENoZWNrcy5pc19zdHJpbmcodmFsdWUpICYmIHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgYXJncy5wdXNoKHZhbHVlLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlKHBhdHRlcm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybi50eXBlKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gYnVpbGRNYXRjaChwYXR0ZXJuLm9ialBhdHRlcm4pO1xuICAgICAgcmV0dXJuIG1hdGNoZXModmFsdWUsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFycmF5KHBhdHRlcm4pIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHBhdHRlcm4ubWFwKHggPT4gYnVpbGRNYXRjaCh4KSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKCFDaGVja3MuaXNfYXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCAhPSBwYXR0ZXJuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZS5ldmVyeShmdW5jdGlvbih2LCBpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1tpXSh2YWx1ZVtpXSwgYXJncyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNYXAocGF0dGVybikge1xuICBsZXQgbWF0Y2hlcyA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShwYXR0ZXJuLmtleXMoKSk7XG5cbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBtYXRjaGVzLnNldChrZXksIGJ1aWxkTWF0Y2gocGF0dGVybi5nZXQoa2V5KSkpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBhcmdzKSB7XG4gICAgaWYgKCFDaGVja3MuaXNfbWFwKHZhbHVlKSB8fCBwYXR0ZXJuLnNpemUgPiB2YWx1ZS5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFVdGlscy5oYXModmFsdWUsIGtleSkgfHwgIVV0aWxzLmdldChtYXRjaGVzLCBrZXkpKFV0aWxzLmdldCh2YWx1ZSwga2V5KSwgYXJncykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlT2JqZWN0KHBhdHRlcm4pIHtcbiAgbGV0IG1hdGNoZXMgPSB7fTtcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGF0dGVybikuY29uY2F0KFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocGF0dGVybilcbiAgKTtcblxuICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgIG1hdGNoZXNba2V5XSA9IGJ1aWxkTWF0Y2gocGF0dGVybltrZXldKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgYXJncykge1xuICAgIGlmICghQ2hlY2tzLmlzX29iamVjdCh2YWx1ZSkgfHwgcGF0dGVybi5sZW5ndGggPiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCEoa2V5IGluIHZhbHVlKSB8fCAhbWF0Y2hlc1trZXldKHZhbHVlW2tleV0sIGFyZ3MpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJpdFN0cmluZyhwYXR0ZXJuKSB7XG4gIGxldCBwYXR0ZXJuQml0U3RyaW5nID0gW107XG5cbiAgZm9yIChsZXQgYml0c3RyaW5nTWF0Y2hQYXJ0IG9mIHBhdHRlcm4udmFsdWVzKSB7XG4gICAgaWYgKENoZWNrcy5pc192YXJpYWJsZShiaXRzdHJpbmdNYXRjaFBhcnQudmFsdWUpKSB7XG4gICAgICBsZXQgc2l6ZSA9IGdldFNpemUoYml0c3RyaW5nTWF0Y2hQYXJ0LnVuaXQsIGJpdHN0cmluZ01hdGNoUGFydC5zaXplKTtcbiAgICAgIGZpbGxBcnJheShwYXR0ZXJuQml0U3RyaW5nLCBzaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0dGVybkJpdFN0cmluZyA9IHBhdHRlcm5CaXRTdHJpbmcuY29uY2F0KFxuICAgICAgICBuZXcgQml0U3RyaW5nKGJpdHN0cmluZ01hdGNoUGFydCkudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHBhdHRlcm5WYWx1ZXMgPSBwYXR0ZXJuLnZhbHVlcztcblxuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGFyZ3MpIHtcbiAgICBsZXQgYnNWYWx1ZSA9IG51bGw7XG5cbiAgICBpZiAoIUNoZWNrcy5pc19zdHJpbmcodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBCaXRTdHJpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKENoZWNrcy5pc19zdHJpbmcodmFsdWUpKSB7XG4gICAgICBic1ZhbHVlID0gbmV3IEJpdFN0cmluZyhCaXRTdHJpbmcuYmluYXJ5KHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJzVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgYmVnaW5uaW5nSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYml0c3RyaW5nTWF0Y2hQYXJ0ID0gcGF0dGVyblZhbHVlc1tpXTtcblxuICAgICAgaWYgKFxuICAgICAgICBDaGVja3MuaXNfdmFyaWFibGUoYml0c3RyaW5nTWF0Y2hQYXJ0LnZhbHVlKSAmJlxuICAgICAgICBiaXRzdHJpbmdNYXRjaFBhcnQudHlwZSA9PSAnYmluYXJ5JyAmJlxuICAgICAgICBiaXRzdHJpbmdNYXRjaFBhcnQuc2l6ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGkgPCBwYXR0ZXJuVmFsdWVzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2EgYmluYXJ5IGZpZWxkIHdpdGhvdXQgc2l6ZSBpcyBvbmx5IGFsbG93ZWQgYXQgdGhlIGVuZCBvZiBhIGJpbmFyeSBwYXR0ZXJuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICBsZXQgYnNWYWx1ZUFycmF5UGFydCA9IFtdO1xuICAgICAgbGV0IHBhdHRlcm5CaXRTdHJpbmdBcnJheVBhcnQgPSBbXTtcbiAgICAgIHNpemUgPSBnZXRTaXplKGJpdHN0cmluZ01hdGNoUGFydC51bml0LCBiaXRzdHJpbmdNYXRjaFBhcnQuc2l6ZSk7XG5cbiAgICAgIGlmIChpID09PSBwYXR0ZXJuVmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgYnNWYWx1ZUFycmF5UGFydCA9IGJzVmFsdWUudmFsdWUuc2xpY2UoYmVnaW5uaW5nSW5kZXgpO1xuICAgICAgICBwYXR0ZXJuQml0U3RyaW5nQXJyYXlQYXJ0ID0gcGF0dGVybkJpdFN0cmluZy5zbGljZShiZWdpbm5pbmdJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBic1ZhbHVlQXJyYXlQYXJ0ID0gYnNWYWx1ZS52YWx1ZS5zbGljZShcbiAgICAgICAgICBiZWdpbm5pbmdJbmRleCxcbiAgICAgICAgICBiZWdpbm5pbmdJbmRleCArIHNpemVcbiAgICAgICAgKTtcbiAgICAgICAgcGF0dGVybkJpdFN0cmluZ0FycmF5UGFydCA9IHBhdHRlcm5CaXRTdHJpbmcuc2xpY2UoXG4gICAgICAgICAgYmVnaW5uaW5nSW5kZXgsXG4gICAgICAgICAgYmVnaW5uaW5nSW5kZXggKyBzaXplXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChDaGVja3MuaXNfdmFyaWFibGUoYml0c3RyaW5nTWF0Y2hQYXJ0LnZhbHVlKSkge1xuICAgICAgICBzd2l0Y2ggKGJpdHN0cmluZ01hdGNoUGFydC50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGJpdHN0cmluZ01hdGNoUGFydC5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICAgIGJpdHN0cmluZ01hdGNoUGFydC5hdHRyaWJ1dGVzLmluZGV4T2YoJ3NpZ25lZCcpICE9IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYXJncy5wdXNoKG5ldyBJbnQ4QXJyYXkoW2JzVmFsdWVBcnJheVBhcnRbMF1dKVswXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcmdzLnB1c2gobmV3IFVpbnQ4QXJyYXkoW2JzVmFsdWVBcnJheVBhcnRbMF1dKVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgIGlmIChzaXplID09PSA2NCkge1xuICAgICAgICAgICAgICBhcmdzLnB1c2goRmxvYXQ2NEFycmF5LmZyb20oYnNWYWx1ZUFycmF5UGFydClbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID09PSAzMikge1xuICAgICAgICAgICAgICBhcmdzLnB1c2goRmxvYXQzMkFycmF5LmZyb20oYnNWYWx1ZUFycmF5UGFydClbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdiaXRzdHJpbmcnOlxuICAgICAgICAgICAgYXJncy5wdXNoKGNyZWF0ZUJpdFN0cmluZyhic1ZhbHVlQXJyYXlQYXJ0KSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgICBhcmdzLnB1c2goXG4gICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnNWYWx1ZUFycmF5UGFydCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICAgIGFyZ3MucHVzaChcbiAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShic1ZhbHVlQXJyYXlQYXJ0KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3V0ZjE2JzpcbiAgICAgICAgICAgIGFyZ3MucHVzaChcbiAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkoYnNWYWx1ZUFycmF5UGFydCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd1dGYzMic6XG4gICAgICAgICAgICBhcmdzLnB1c2goXG4gICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQzMkFycmF5KGJzVmFsdWVBcnJheVBhcnQpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYXJyYXlzRXF1YWwoYnNWYWx1ZUFycmF5UGFydCwgcGF0dGVybkJpdFN0cmluZ0FycmF5UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBiZWdpbm5pbmdJbmRleCA9IGJlZ2lubmluZ0luZGV4ICsgc2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2l6ZSh1bml0LCBzaXplKSB7XG4gIHJldHVybiB1bml0ICogc2l6ZSAvIDg7XG59XG5cbmZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZpbGxBcnJheShhcnIsIG51bSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgYXJyLnB1c2goMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQml0U3RyaW5nKGFycikge1xuICBsZXQgaW50ZWdlclBhcnRzID0gYXJyLm1hcChlbGVtID0+IEJpdFN0cmluZy5pbnRlZ2VyKGVsZW0pKTtcbiAgcmV0dXJuIG5ldyBCaXRTdHJpbmcoLi4uaW50ZWdlclBhcnRzKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5vTWF0Y2goKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmV4cG9ydCB7XG4gIHJlc29sdmVCb3VuZCxcbiAgcmVzb2x2ZVdpbGRjYXJkLFxuICByZXNvbHZlVmFyaWFibGUsXG4gIHJlc29sdmVIZWFkVGFpbCxcbiAgcmVzb2x2ZUNhcHR1cmUsXG4gIHJlc29sdmVTdGFydHNXaXRoLFxuICByZXNvbHZlVHlwZSxcbiAgcmVzb2x2ZUFycmF5LFxuICByZXNvbHZlT2JqZWN0LFxuICByZXNvbHZlTm9NYXRjaCxcbiAgcmVzb2x2ZVN5bWJvbCxcbiAgcmVzb2x2ZVN0cmluZyxcbiAgcmVzb2x2ZU51bWJlcixcbiAgcmVzb2x2ZUJvb2xlYW4sXG4gIHJlc29sdmVGdW5jdGlvbixcbiAgcmVzb2x2ZU51bGwsXG4gIHJlc29sdmVCaXRTdHJpbmcsXG4gIHJlc29sdmVNYXBcbn07XG4iLCJpbXBvcnQgKiBhcyBSZXNvbHZlcnMgZnJvbSAnLi9yZXNvbHZlcnMnO1xuaW1wb3J0IHtcbiAgVmFyaWFibGUsXG4gIFdpbGRjYXJkLFxuICBIZWFkVGFpbCxcbiAgQ2FwdHVyZSxcbiAgVHlwZSxcbiAgU3RhcnRzV2l0aCxcbiAgQm91bmQsXG4gIEJpdFN0cmluZ01hdGNoXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBwYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xucGF0dGVybk1hcC5zZXQoVmFyaWFibGUucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZVZhcmlhYmxlKTtcbnBhdHRlcm5NYXAuc2V0KFdpbGRjYXJkLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVXaWxkY2FyZCk7XG5wYXR0ZXJuTWFwLnNldChIZWFkVGFpbC5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlSGVhZFRhaWwpO1xucGF0dGVybk1hcC5zZXQoU3RhcnRzV2l0aC5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlU3RhcnRzV2l0aCk7XG5wYXR0ZXJuTWFwLnNldChDYXB0dXJlLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVDYXB0dXJlKTtcbnBhdHRlcm5NYXAuc2V0KEJvdW5kLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVCb3VuZCk7XG5wYXR0ZXJuTWFwLnNldChUeXBlLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVUeXBlKTtcbnBhdHRlcm5NYXAuc2V0KEJpdFN0cmluZ01hdGNoLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVCaXRTdHJpbmcpO1xucGF0dGVybk1hcC5zZXQoTnVtYmVyLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVOdW1iZXIpO1xucGF0dGVybk1hcC5zZXQoU3ltYm9sLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVTeW1ib2wpO1xucGF0dGVybk1hcC5zZXQoTWFwLnByb3RvdHlwZSwgUmVzb2x2ZXJzLnJlc29sdmVNYXApO1xucGF0dGVybk1hcC5zZXQoQXJyYXkucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZUFycmF5KTtcbnBhdHRlcm5NYXAuc2V0KFN0cmluZy5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlU3RyaW5nKTtcbnBhdHRlcm5NYXAuc2V0KEJvb2xlYW4ucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZUJvb2xlYW4pO1xucGF0dGVybk1hcC5zZXQoRnVuY3Rpb24ucHJvdG90eXBlLCBSZXNvbHZlcnMucmVzb2x2ZUZ1bmN0aW9uKTtcbnBhdHRlcm5NYXAuc2V0KE9iamVjdC5wcm90b3R5cGUsIFJlc29sdmVycy5yZXNvbHZlT2JqZWN0KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2gocGF0dGVybikge1xuICBpZiAocGF0dGVybiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBSZXNvbHZlcnMucmVzb2x2ZU51bGwocGF0dGVybik7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIFJlc29sdmVycy5yZXNvbHZlV2lsZGNhcmQocGF0dGVybik7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gUmVzb2x2ZXJzLnJlc29sdmVGdW5jdGlvbihwYXR0ZXJuKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBwYXR0ZXJuLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgY29uc3QgcmVzb2x2ZXIgPSBwYXR0ZXJuTWFwLmdldCh0eXBlKTtcblxuICBpZiAocmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZXIocGF0dGVybik7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIFJlc29sdmVycy5yZXNvbHZlT2JqZWN0KHBhdHRlcm4pO1xuICB9XG5cbiAgcmV0dXJuIFJlc29sdmVycy5yZXNvbHZlTm9NYXRjaCgpO1xufVxuIiwiaW1wb3J0IHsgYnVpbGRNYXRjaCB9IGZyb20gJy4vbWF0Y2gnO1xuaW1wb3J0ICogYXMgVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEZVTkMgPSBTeW1ib2woKTtcblxuZXhwb3J0IGNsYXNzIE1hdGNoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGFyZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdObyBtYXRjaCBmb3I6ICcgKyBhcmcudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgbGV0IG1hcHBlZFZhbHVlcyA9IGFyZy5tYXAoeCA9PiB7XG4gICAgICAgIGlmICh4ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geC50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubWVzc2FnZSA9ICdObyBtYXRjaCBmb3I6ICcgKyBtYXBwZWRWYWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdObyBtYXRjaCBmb3I6ICcgKyBhcmc7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGF1c2Uge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuLCBmbiwgZ3VhcmQgPSAoKSA9PiB0cnVlKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gYnVpbGRNYXRjaChwYXR0ZXJuKTtcbiAgICB0aGlzLmFyaXR5ID0gcGF0dGVybi5sZW5ndGg7XG4gICAgdGhpcy5vcHRpb25hbHMgPSBnZXRPcHRpb25hbFZhbHVlcyhwYXR0ZXJuKTtcbiAgICB0aGlzLmZuID0gZm47XG4gICAgdGhpcy5ndWFyZCA9IGd1YXJkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGF1c2UocGF0dGVybiwgZm4sIGd1YXJkID0gKCkgPT4gdHJ1ZSkge1xuICByZXR1cm4gbmV3IENsYXVzZShwYXR0ZXJuLCBmbiwgZ3VhcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbXBvbGluZShmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgbGV0IHJlcyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgd2hpbGUgKHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICByZXMgPSByZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZm1hdGNoKC4uLmNsYXVzZXMpIHtcbiAgY29uc3QgYXJpdGllcyA9IGdldEFyaXR5TWFwKGNsYXVzZXMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgbGV0IFtmdW5jVG9DYWxsLCBwYXJhbXNdID0gZmluZE1hdGNoaW5nRnVuY3Rpb24oYXJncywgYXJpdGllcyk7XG4gICAgcmV0dXJuIGZ1bmNUb0NhbGwuYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZm1hdGNoZ2VuKC4uLmNsYXVzZXMpIHtcbiAgY29uc3QgYXJpdGllcyA9IGdldEFyaXR5TWFwKGNsYXVzZXMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiooLi4uYXJncykge1xuICAgIGlmIChhcml0aWVzLmhhcyhhcmdzLmxlbmd0aCkpIHtcbiAgICAgIGNvbnN0IGFyaXR5Q2xhdXNlcyA9IGFyaXRpZXMuZ2V0KGFyZ3MubGVuZ3RoKTtcblxuICAgICAgbGV0IGZ1bmNUb0NhbGwgPSBudWxsO1xuICAgICAgbGV0IHBhcmFtcyA9IG51bGw7XG4gICAgICBmb3IgKGxldCBwcm9jZXNzZWRDbGF1c2Ugb2YgYXJpdHlDbGF1c2VzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgYXJncyA9IGZpbGxJbk9wdGlvbmFsVmFsdWVzKFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgcHJvY2Vzc2VkQ2xhdXNlLmFyaXR5LFxuICAgICAgICAgIHByb2Nlc3NlZENsYXVzZS5vcHRpb25hbHNcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRDbGF1c2UucGF0dGVybihhcmdzLCByZXN1bHQpO1xuICAgICAgICBjb25zdCBbZmlsdGVyZWRSZXN1bHQsIGFsbE5hbWVzTWF0Y2hdID0gY2hlY2tOYW1lZFZhcmlhYmxlcyhyZXN1bHQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkb2VzTWF0Y2ggJiZcbiAgICAgICAgICBhbGxOYW1lc01hdGNoICYmXG4gICAgICAgICAgKHlpZWxkKiBwcm9jZXNzZWRDbGF1c2UuZ3VhcmQuYXBwbHkodGhpcywgZmlsdGVyZWRSZXN1bHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICBmdW5jVG9DYWxsID0gcHJvY2Vzc2VkQ2xhdXNlLmZuO1xuICAgICAgICAgIHBhcmFtcyA9IGZpbHRlcmVkUmVzdWx0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZnVuY1RvQ2FsbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBtYXRjaCBmb3I6JywgYXJncyk7XG4gICAgICAgIHRocm93IG5ldyBNYXRjaEVycm9yKGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geWllbGQqIGZ1bmNUb0NhbGwuYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQXJpdHkgb2YnLCBhcmdzLmxlbmd0aCwgJ25vdCBmb3VuZC4gTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgICAgdGhyb3cgbmV3IE1hdGNoRXJyb3IoYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmbWF0Y2hHZW4oLi4uYXJncykge1xuICByZXR1cm4gZGVmbWF0Y2hnZW4oLi4uYXJncyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZtYXRjaEFzeW5jKC4uLmNsYXVzZXMpIHtcbiAgY29uc3QgYXJpdGllcyA9IGdldEFyaXR5TWFwKGNsYXVzZXMpO1xuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgaWYgKGFyaXRpZXMuaGFzKGFyZ3MubGVuZ3RoKSkge1xuICAgICAgY29uc3QgYXJpdHlDbGF1c2VzID0gYXJpdGllcy5nZXQoYXJncy5sZW5ndGgpO1xuXG4gICAgICBsZXQgZnVuY1RvQ2FsbCA9IG51bGw7XG4gICAgICBsZXQgcGFyYW1zID0gbnVsbDtcbiAgICAgIGZvciAobGV0IHByb2Nlc3NlZENsYXVzZSBvZiBhcml0eUNsYXVzZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBhcmdzID0gZmlsbEluT3B0aW9uYWxWYWx1ZXMoXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBwcm9jZXNzZWRDbGF1c2UuYXJpdHksXG4gICAgICAgICAgcHJvY2Vzc2VkQ2xhdXNlLm9wdGlvbmFsc1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRvZXNNYXRjaCA9IHByb2Nlc3NlZENsYXVzZS5wYXR0ZXJuKGFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvZXNNYXRjaCAmJlxuICAgICAgICAgIGFsbE5hbWVzTWF0Y2ggJiZcbiAgICAgICAgICAoYXdhaXQgcHJvY2Vzc2VkQ2xhdXNlLmd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZnVuY1RvQ2FsbCA9IHByb2Nlc3NlZENsYXVzZS5mbjtcbiAgICAgICAgICBwYXJhbXMgPSBmaWx0ZXJlZFJlc3VsdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWZ1bmNUb0NhbGwpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgICAgICB0aHJvdyBuZXcgTWF0Y2hFcnJvcihhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmNUb0NhbGwuYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQXJpdHkgb2YnLCBhcmdzLmxlbmd0aCwgJ25vdCBmb3VuZC4gTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgICAgdGhyb3cgbmV3IE1hdGNoRXJyb3IoYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdGdW5jdGlvbihhcmdzLCBhcml0aWVzKSB7XG4gIGlmIChhcml0aWVzLmhhcyhhcmdzLmxlbmd0aCkpIHtcbiAgICBjb25zdCBhcml0eUNsYXVzZXMgPSBhcml0aWVzLmdldChhcmdzLmxlbmd0aCk7XG5cbiAgICBsZXQgZnVuY1RvQ2FsbCA9IG51bGw7XG4gICAgbGV0IHBhcmFtcyA9IG51bGw7XG4gICAgZm9yIChsZXQgcHJvY2Vzc2VkQ2xhdXNlIG9mIGFyaXR5Q2xhdXNlcykge1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgYXJncyA9IGZpbGxJbk9wdGlvbmFsVmFsdWVzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBwcm9jZXNzZWRDbGF1c2UuYXJpdHksXG4gICAgICAgIHByb2Nlc3NlZENsYXVzZS5vcHRpb25hbHNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRvZXNNYXRjaCA9IHByb2Nlc3NlZENsYXVzZS5wYXR0ZXJuKGFyZ3MsIHJlc3VsdCk7XG4gICAgICBjb25zdCBbZmlsdGVyZWRSZXN1bHQsIGFsbE5hbWVzTWF0Y2hdID0gY2hlY2tOYW1lZFZhcmlhYmxlcyhyZXN1bHQpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRvZXNNYXRjaCAmJlxuICAgICAgICBhbGxOYW1lc01hdGNoICYmXG4gICAgICAgIHByb2Nlc3NlZENsYXVzZS5ndWFyZC5hcHBseSh0aGlzLCBmaWx0ZXJlZFJlc3VsdClcbiAgICAgICkge1xuICAgICAgICBmdW5jVG9DYWxsID0gcHJvY2Vzc2VkQ2xhdXNlLmZuO1xuICAgICAgICBwYXJhbXMgPSBmaWx0ZXJlZFJlc3VsdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFmdW5jVG9DYWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBtYXRjaCBmb3I6JywgYXJncyk7XG4gICAgICB0aHJvdyBuZXcgTWF0Y2hFcnJvcihhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2Z1bmNUb0NhbGwsIHBhcmFtc107XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignQXJpdHkgb2YnLCBhcmdzLmxlbmd0aCwgJ25vdCBmb3VuZC4gTm8gbWF0Y2ggZm9yOicsIGFyZ3MpO1xuICAgIHRocm93IG5ldyBNYXRjaEVycm9yKGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFyaXR5TWFwKGNsYXVzZXMpIHtcbiAgbGV0IG1hcCA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBjbGF1c2VzKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBnZXRBcml0eVJhbmdlKGNsYXVzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGFyaXR5IG9mIHJhbmdlKSB7XG4gICAgICBsZXQgYXJpdHlDbGF1c2VzID0gW107XG5cbiAgICAgIGlmIChtYXAuaGFzKGFyaXR5KSkge1xuICAgICAgICBhcml0eUNsYXVzZXMgPSBtYXAuZ2V0KGFyaXR5KTtcbiAgICAgIH1cblxuICAgICAgYXJpdHlDbGF1c2VzLnB1c2goY2xhdXNlKTtcbiAgICAgIG1hcC5zZXQoYXJpdHksIGFyaXR5Q2xhdXNlcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gZ2V0QXJpdHlSYW5nZShjbGF1c2UpIHtcbiAgY29uc3QgbWluID0gY2xhdXNlLmFyaXR5IC0gY2xhdXNlLm9wdGlvbmFscy5sZW5ndGg7XG4gIGNvbnN0IG1heCA9IGNsYXVzZS5hcml0eTtcblxuICBsZXQgcmFuZ2UgPSBbbWluXTtcblxuICB3aGlsZSAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT0gbWF4KSB7XG4gICAgcmFuZ2UucHVzaChyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSArIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25hbFZhbHVlcyhwYXR0ZXJuKSB7XG4gIGxldCBvcHRpb25hbHMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoXG4gICAgICBwYXR0ZXJuW2ldIGluc3RhbmNlb2YgVHlwZXMuVmFyaWFibGUgJiZcbiAgICAgIHBhdHRlcm5baV0uZGVmYXVsdF92YWx1ZSAhPSBTeW1ib2wuZm9yKCd0YWlsb3JlZC5ub192YWx1ZScpXG4gICAgKSB7XG4gICAgICBvcHRpb25hbHMucHVzaChbaSwgcGF0dGVybltpXS5kZWZhdWx0X3ZhbHVlXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbmFscztcbn1cblxuZnVuY3Rpb24gZmlsbEluT3B0aW9uYWxWYWx1ZXMoYXJncywgYXJpdHksIG9wdGlvbmFscykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IGFyaXR5IHx8IG9wdGlvbmFscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIGlmIChhcmdzLmxlbmd0aCArIG9wdGlvbmFscy5sZW5ndGggPCBhcml0eSkge1xuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgbGV0IG51bWJlck9mT3B0aW9uYWxzVG9GaWxsID0gYXJpdHkgLSBhcmdzLmxlbmd0aDtcbiAgbGV0IG9wdGlvbmFsc1RvUmVtb3ZlID0gb3B0aW9uYWxzLmxlbmd0aCAtIG51bWJlck9mT3B0aW9uYWxzVG9GaWxsO1xuXG4gIGxldCBvcHRpb25hbHNUb1VzZSA9IG9wdGlvbmFscy5zbGljZShvcHRpb25hbHNUb1JlbW92ZSk7XG5cbiAgZm9yIChsZXQgW2luZGV4LCB2YWx1ZV0gb2Ygb3B0aW9uYWxzVG9Vc2UpIHtcbiAgICBhcmdzLnNwbGljZShpbmRleCwgMCwgdmFsdWUpO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gYXJpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2gocGF0dGVybiwgZXhwciwgZ3VhcmQgPSAoKSA9PiB0cnVlKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG5cbiAgaWYgKGRvZXNNYXRjaCAmJiBhbGxOYW1lc01hdGNoICYmIGd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKCdObyBtYXRjaCBmb3I6JywgZXhwcik7XG4gICAgdGhyb3cgbmV3IE1hdGNoRXJyb3IoZXhwcik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBtYXRjaF9nZW4oXG4gIHBhdHRlcm4sXG4gIGV4cHIsXG4gIGd1YXJkID0gZnVuY3Rpb24qICgpIHsgcmV0dXJuIHRydWUgfVxuKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBkb2VzTWF0Y2ggJiYgYWxsTmFtZXNNYXRjaDtcblxuICBpZiAobWF0Y2hlcyAmJiAoeWllbGQqIGd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSkpIHtcbiAgICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gbWF0Y2ggZm9yOicsIGV4cHIpO1xuICAgIHRocm93IG5ldyBNYXRjaEVycm9yKGV4cHIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmFtZWRWYXJpYWJsZXMocmVzdWx0cykge1xuICBjb25zdCBuYW1lc01hcCA9IHt9O1xuICBjb25zdCBmaWx0ZXJlZFJlc3VsdHMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gcmVzdWx0c1tpXTtcbiAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFR5cGVzLk5hbWVkVmFyaWFibGVSZXN1bHQpIHtcbiAgICAgIGlmIChuYW1lc01hcFtjdXJyZW50Lm5hbWVdICYmIG5hbWVzTWFwW2N1cnJlbnQubmFtZV0gIT09IGN1cnJlbnQudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFtyZXN1bHRzLCBmYWxzZV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBuYW1lc01hcFtjdXJyZW50Lm5hbWVdICYmXG4gICAgICAgIG5hbWVzTWFwW2N1cnJlbnQubmFtZV0gPT09IGN1cnJlbnQudmFsdWVcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJlZFJlc3VsdHMucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWVzTWFwW2N1cnJlbnQubmFtZV0gPSBjdXJyZW50LnZhbHVlO1xuICAgICAgICBmaWx0ZXJlZFJlc3VsdHMucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVyZWRSZXN1bHRzLnB1c2goY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtmaWx0ZXJlZFJlc3VsdHMsIHRydWVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hfb3JfZGVmYXVsdChcbiAgcGF0dGVybixcbiAgZXhwcixcbiAgZ3VhcmQgPSAoKSA9PiB0cnVlLFxuICBkZWZhdWx0X3ZhbHVlID0gbnVsbFxuKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG5cbiAgaWYgKGRvZXNNYXRjaCAmJiBhbGxOYW1lc01hdGNoICYmIGd1YXJkLmFwcGx5KHRoaXMsIGZpbHRlcmVkUmVzdWx0KSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIG1hdGNoX29yX2RlZmF1bHRfZ2VuKFxuICBwYXR0ZXJuLFxuICBleHByLFxuICBndWFyZCA9IGZ1bmN0aW9uKiAoKSB7IHJldHVybiB0cnVlIH0sXG4gIGRlZmF1bHRfdmFsdWUgPSBudWxsXG4pIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuICBsZXQgcHJvY2Vzc2VkUGF0dGVybiA9IGJ1aWxkTWF0Y2gocGF0dGVybik7XG4gIGNvbnN0IGRvZXNNYXRjaCA9IHByb2Nlc3NlZFBhdHRlcm4oZXhwciwgcmVzdWx0KTtcbiAgY29uc3QgW2ZpbHRlcmVkUmVzdWx0LCBhbGxOYW1lc01hdGNoXSA9IGNoZWNrTmFtZWRWYXJpYWJsZXMocmVzdWx0KTtcbiAgY29uc3QgbWF0Y2hlcyA9IGRvZXNNYXRjaCAmJiBhbGxOYW1lc01hdGNoO1xuXG4gIGlmIChtYXRjaGVzICYmICh5aWVsZCogZ3VhcmQuYXBwbHkodGhpcywgZmlsdGVyZWRSZXN1bHQpKSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0Y2hfb3JfZGVmYXVsdF9hc3luYyhcbiAgcGF0dGVybixcbiAgZXhwcixcbiAgZ3VhcmQgPSBhc3luYyAoKSA9PiB0cnVlLFxuICBkZWZhdWx0X3ZhbHVlID0gbnVsbFxuKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IHByb2Nlc3NlZFBhdHRlcm4gPSBidWlsZE1hdGNoKHBhdHRlcm4pO1xuICBjb25zdCBkb2VzTWF0Y2ggPSBwcm9jZXNzZWRQYXR0ZXJuKGV4cHIsIHJlc3VsdCk7XG4gIGNvbnN0IFtmaWx0ZXJlZFJlc3VsdCwgYWxsTmFtZXNNYXRjaF0gPSBjaGVja05hbWVkVmFyaWFibGVzKHJlc3VsdCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBkb2VzTWF0Y2ggJiYgYWxsTmFtZXNNYXRjaDtcblxuICBpZiAobWF0Y2hlcyAmJiAoYXdhaXQgZ3VhcmQuYXBwbHkodGhpcywgZmlsdGVyZWRSZXN1bHQpKSkge1xuICAgIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbWF0Y2hfb3JfZGVmYXVsdCB9IGZyb20gXCIuL2RlZm1hdGNoXCI7XG5pbXBvcnQgRXJsYW5nVHlwZXMgZnJvbSBcImVybGFuZy10eXBlc1wiO1xuXG5jb25zdCBOT19NQVRDSCA9IFN5bWJvbCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gYml0c3RyaW5nX2dlbmVyYXRvcihwYXR0ZXJuLCBiaXRzdHJpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGxldCByZXR1cm5SZXN1bHQgPSBbXTtcbiAgICBsZXQgYnNTbGljZSA9IGJpdHN0cmluZy5zbGljZSgwLCBwYXR0ZXJuLmJ5dGVfc2l6ZSgpKTtcbiAgICBsZXQgaSA9IDE7XG5cbiAgICB3aGlsZSAoYnNTbGljZS5ieXRlX3NpemUgPT0gcGF0dGVybi5ieXRlX3NpemUoKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWF0Y2hfb3JfZGVmYXVsdChwYXR0ZXJuLCBic1NsaWNlLCAoKSA9PiB0cnVlLCBOT19NQVRDSCk7XG5cbiAgICAgIGlmIChyZXN1bHQgIT0gTk9fTUFUQ0gpIHtcbiAgICAgICAgY29uc3QgW3ZhbHVlXSA9IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuUmVzdWx0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgYnNTbGljZSA9IGJpdHN0cmluZy5zbGljZShcbiAgICAgICAgcGF0dGVybi5ieXRlX3NpemUoKSAqIGksXG4gICAgICAgIHBhdHRlcm4uYnl0ZV9zaXplKCkgKiAoaSArIDEpXG4gICAgICApO1xuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RfZ2VuZXJhdG9yKHBhdHRlcm4sIGxpc3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGxldCByZXR1cm5SZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpIG9mIGxpc3QpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1hdGNoX29yX2RlZmF1bHQocGF0dGVybiwgaSwgKCkgPT4gdHJ1ZSwgTk9fTUFUQ0gpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBOT19NQVRDSCkge1xuICAgICAgICBjb25zdCBbdmFsdWVdID0gcmVzdWx0O1xuICAgICAgICByZXR1cm5SZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RfY29tcHJlaGVuc2lvbihleHByZXNzaW9uLCBnZW5lcmF0b3JzKSB7XG4gIGNvbnN0IGdlbmVyYXRlZFZhbHVlcyA9IHJ1bl9nZW5lcmF0b3JzKGdlbmVyYXRvcnMucG9wKCkoKSwgZ2VuZXJhdG9ycyk7XG5cbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IHZhbHVlIG9mIGdlbmVyYXRlZFZhbHVlcykge1xuICAgIGlmIChleHByZXNzaW9uLmd1YXJkLmFwcGx5KHRoaXMsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0LnB1c2goZXhwcmVzc2lvbi5mbi5hcHBseSh0aGlzLCB2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJ1bl9nZW5lcmF0b3JzKGdlbmVyYXRvciwgZ2VuZXJhdG9ycykge1xuICBpZiAoZ2VuZXJhdG9ycy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiBnZW5lcmF0b3IubWFwKHggPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3hdO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxpc3QgPSBnZW5lcmF0b3JzLnBvcCgpO1xuXG4gICAgbGV0IG5leHRfZ2VuID0gW107XG4gICAgZm9yIChsZXQgaiBvZiBsaXN0KCkpIHtcbiAgICAgIGZvciAobGV0IGkgb2YgZ2VuZXJhdG9yKSB7XG4gICAgICAgIG5leHRfZ2VuLnB1c2goW2pdLmNvbmNhdChpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bl9nZW5lcmF0b3JzKG5leHRfZ2VuLCBnZW5lcmF0b3JzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYml0c3RyaW5nX2NvbXByZWhlbnNpb24oZXhwcmVzc2lvbiwgZ2VuZXJhdG9ycykge1xuICBjb25zdCBnZW5lcmF0ZWRWYWx1ZXMgPSBydW5fZ2VuZXJhdG9ycyhnZW5lcmF0b3JzLnBvcCgpKCksIGdlbmVyYXRvcnMpO1xuXG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBmb3IgKGxldCB2YWx1ZSBvZiBnZW5lcmF0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5ndWFyZC5hcHBseSh0aGlzLCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGV4cHJlc3Npb24uZm4uYXBwbHkodGhpcywgdmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQgPSByZXN1bHQubWFwKHggPT4gRXJsYW5nVHlwZXMuQml0U3RyaW5nLmludGVnZXIoeCkpO1xuICByZXR1cm4gbmV3IEVybGFuZ1R5cGVzLkJpdFN0cmluZyguLi5yZXN1bHQpO1xufVxuIiwiaW1wb3J0IHtcbiAgZGVmbWF0Y2gsXG4gIG1hdGNoLFxuICBtYXRjaF9nZW4sXG4gIE1hdGNoRXJyb3IsXG4gIENsYXVzZSxcbiAgY2xhdXNlLFxuICBtYXRjaF9vcl9kZWZhdWx0LFxuICBtYXRjaF9vcl9kZWZhdWx0X2dlbixcbiAgbWF0Y2hfb3JfZGVmYXVsdF9hc3luYyxcbiAgZGVmbWF0Y2hnZW4sXG4gIGRlZm1hdGNoR2VuLFxuICBkZWZtYXRjaEFzeW5jXG59IGZyb20gJy4vdGFpbG9yZWQvZGVmbWF0Y2gnO1xuaW1wb3J0IHtcbiAgdmFyaWFibGUsXG4gIHdpbGRjYXJkLFxuICBzdGFydHNXaXRoLFxuICBjYXB0dXJlLFxuICBoZWFkVGFpbCxcbiAgdHlwZSxcbiAgYm91bmQsXG4gIGJpdFN0cmluZ01hdGNoXG59IGZyb20gJy4vdGFpbG9yZWQvdHlwZXMnO1xuXG5pbXBvcnQge1xuICBsaXN0X2dlbmVyYXRvcixcbiAgbGlzdF9jb21wcmVoZW5zaW9uLFxuICBiaXRzdHJpbmdfZ2VuZXJhdG9yLFxuICBiaXRzdHJpbmdfY29tcHJlaGVuc2lvblxufSBmcm9tICcuL3RhaWxvcmVkL2NvbXByZWhlbnNpb25zJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkZWZtYXRjaCxcbiAgbWF0Y2gsXG4gIG1hdGNoX2dlbixcbiAgTWF0Y2hFcnJvcixcbiAgdmFyaWFibGUsXG4gIHdpbGRjYXJkLFxuICBzdGFydHNXaXRoLFxuICBjYXB0dXJlLFxuICBoZWFkVGFpbCxcbiAgdHlwZSxcbiAgYm91bmQsXG4gIENsYXVzZSxcbiAgY2xhdXNlLFxuICBiaXRTdHJpbmdNYXRjaCxcbiAgbWF0Y2hfb3JfZGVmYXVsdCxcbiAgbWF0Y2hfb3JfZGVmYXVsdF9nZW4sXG4gIG1hdGNoX29yX2RlZmF1bHRfYXN5bmMsXG4gIGRlZm1hdGNoZ2VuLFxuICBsaXN0X2NvbXByZWhlbnNpb24sXG4gIGxpc3RfZ2VuZXJhdG9yLFxuICBiaXRzdHJpbmdfZ2VuZXJhdG9yLFxuICBiaXRzdHJpbmdfY29tcHJlaGVuc2lvbixcbiAgZGVmbWF0Y2hHZW4sXG4gIGRlZm1hdGNoQXN5bmNcbn07XG4iXSwibmFtZXMiOlsiVmFyaWFibGUiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsIlN5bWJvbCIsImZvciIsIldpbGRjYXJkIiwiU3RhcnRzV2l0aCIsInByZWZpeCIsIkNhcHR1cmUiLCJ2YWx1ZSIsIkhlYWRUYWlsIiwiaGVhZCIsInRhaWwiLCJUeXBlIiwidHlwZSIsIm9ialBhdHRlcm4iLCJCb3VuZCIsIkJpdFN0cmluZ01hdGNoIiwidmFsdWVzIiwibGVuZ3RoIiwiYnl0ZV9zaXplIiwicyIsInZhbCIsInVuaXQiLCJzaXplIiwiaW5kZXgiLCJnZXRWYWx1ZSIsIk5hbWVkVmFyaWFibGVSZXN1bHQiLCJ2YXJpYWJsZSIsIndpbGRjYXJkIiwic3RhcnRzV2l0aCIsImNhcHR1cmUiLCJoZWFkVGFpbCIsImJvdW5kIiwiYml0U3RyaW5nTWF0Y2giLCJuYW1lZFZhcmlhYmxlUmVzdWx0IiwiaXNfbnVtYmVyIiwiaXNfc3RyaW5nIiwiaXNfYm9vbGVhbiIsImlzX3N5bWJvbCIsImlzX29iamVjdCIsImlzX3ZhcmlhYmxlIiwiaXNfYml0c3RyaW5nIiwiaXNfbnVsbCIsImlzX2FycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNfZnVuY3Rpb24iLCJGdW5jdGlvbiIsImlzX21hcCIsIk1hcCIsImlzX3BpZCIsIkVybGFuZ1R5cGVzIiwiUElEIiwiaXNfdHVwbGUiLCJUdXBsZSIsImlzX3JlZmVyZW5jZSIsIlJlZmVyZW5jZSIsImFycmF5RXF1YWxzIiwibGVmdCIsInJpZ2h0IiwiaSIsImVxdWFscyIsInR1cGxlRXF1YWxzIiwiYml0c3RyaW5nRXF1YWxzIiwiQml0U3RyaW5nIiwicGlkRXF1YWxzIiwiaWQiLCJyZWZlcmVuY2VFcXVhbHMiLCJtYXBFcXVhbHMiLCJsZWZ0RW50cmllcyIsImZyb20iLCJlbnRyaWVzIiwicmlnaHRFbnRyaWVzIiwiaXNfbm9uX3ByaW1pdGl2ZSIsImtleSIsIkNoZWNrcyIsImhhcyIsIm1hcCIsIm1hcF9rZXkiLCJrZXlzIiwiZ2V0IiwicmVzb2x2ZVN5bWJvbCIsInBhdHRlcm4iLCJyZXNvbHZlU3RyaW5nIiwicmVzb2x2ZU51bWJlciIsInJlc29sdmVCb29sZWFuIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVzb2x2ZU51bGwiLCJyZXNvbHZlQm91bmQiLCJhcmdzIiwicmVzb2x2ZVdpbGRjYXJkIiwicmVzb2x2ZVZhcmlhYmxlIiwicHVzaCIsIlR5cGVzIiwicmVzb2x2ZUhlYWRUYWlsIiwiaGVhZE1hdGNoZXMiLCJidWlsZE1hdGNoIiwidGFpbE1hdGNoZXMiLCJzbGljZSIsInJlc29sdmVDYXB0dXJlIiwibWF0Y2hlcyIsInJlc29sdmVTdGFydHNXaXRoIiwic3Vic3RyaW5nIiwicmVzb2x2ZVR5cGUiLCJyZXNvbHZlQXJyYXkiLCJ4IiwiZXZlcnkiLCJ2IiwicmVzb2x2ZU1hcCIsInNldCIsIlV0aWxzIiwicmVzb2x2ZU9iamVjdCIsIk9iamVjdCIsImNvbmNhdCIsImdldE93blByb3BlcnR5U3ltYm9scyIsInJlc29sdmVCaXRTdHJpbmciLCJwYXR0ZXJuQml0U3RyaW5nIiwiYml0c3RyaW5nTWF0Y2hQYXJ0IiwiZ2V0U2l6ZSIsInBhdHRlcm5WYWx1ZXMiLCJic1ZhbHVlIiwiYmluYXJ5IiwiYmVnaW5uaW5nSW5kZXgiLCJ1bmRlZmluZWQiLCJFcnJvciIsImJzVmFsdWVBcnJheVBhcnQiLCJwYXR0ZXJuQml0U3RyaW5nQXJyYXlQYXJ0IiwiYXR0cmlidXRlcyIsImluZGV4T2YiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRmxvYXQzMkFycmF5IiwiY3JlYXRlQml0U3RyaW5nIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYXBwbHkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiYXJyYXlzRXF1YWwiLCJhIiwiYiIsImZpbGxBcnJheSIsImFyciIsIm51bSIsImludGVnZXJQYXJ0cyIsImVsZW0iLCJpbnRlZ2VyIiwicmVzb2x2ZU5vTWF0Y2giLCJwYXR0ZXJuTWFwIiwicHJvdG90eXBlIiwiUmVzb2x2ZXJzIiwiTnVtYmVyIiwiQm9vbGVhbiIsImNvbnN0cnVjdG9yIiwicmVzb2x2ZXIiLCJNYXRjaEVycm9yIiwiYXJnIiwibWVzc2FnZSIsInRvU3RyaW5nIiwibWFwcGVkVmFsdWVzIiwiQ2xhdXNlIiwiZm4iLCJndWFyZCIsImFyaXR5Iiwib3B0aW9uYWxzIiwiZ2V0T3B0aW9uYWxWYWx1ZXMiLCJjbGF1c2UiLCJkZWZtYXRjaCIsImNsYXVzZXMiLCJhcml0aWVzIiwiZ2V0QXJpdHlNYXAiLCJmdW5jVG9DYWxsIiwicGFyYW1zIiwiZmluZE1hdGNoaW5nRnVuY3Rpb24iLCJkZWZtYXRjaGdlbiIsImFyaXR5Q2xhdXNlcyIsInByb2Nlc3NlZENsYXVzZSIsInJlc3VsdCIsImZpbGxJbk9wdGlvbmFsVmFsdWVzIiwiZG9lc01hdGNoIiwiZmlsdGVyZWRSZXN1bHQiLCJhbGxOYW1lc01hdGNoIiwiY2hlY2tOYW1lZFZhcmlhYmxlcyIsImVycm9yIiwiZGVmbWF0Y2hHZW4iLCJkZWZtYXRjaEFzeW5jIiwicmFuZ2UiLCJnZXRBcml0eVJhbmdlIiwibWluIiwibWF4IiwibnVtYmVyT2ZPcHRpb25hbHNUb0ZpbGwiLCJvcHRpb25hbHNUb1JlbW92ZSIsIm9wdGlvbmFsc1RvVXNlIiwic3BsaWNlIiwibWF0Y2giLCJleHByIiwicHJvY2Vzc2VkUGF0dGVybiIsIm1hdGNoX2dlbiIsInJlc3VsdHMiLCJuYW1lc01hcCIsImZpbHRlcmVkUmVzdWx0cyIsImN1cnJlbnQiLCJtYXRjaF9vcl9kZWZhdWx0IiwibWF0Y2hfb3JfZGVmYXVsdF9nZW4iLCJtYXRjaF9vcl9kZWZhdWx0X2FzeW5jIiwiTk9fTUFUQ0giLCJiaXRzdHJpbmdfZ2VuZXJhdG9yIiwiYml0c3RyaW5nIiwicmV0dXJuUmVzdWx0IiwiYnNTbGljZSIsImxpc3RfZ2VuZXJhdG9yIiwibGlzdCIsImxpc3RfY29tcHJlaGVuc2lvbiIsImV4cHJlc3Npb24iLCJnZW5lcmF0b3JzIiwiZ2VuZXJhdGVkVmFsdWVzIiwicnVuX2dlbmVyYXRvcnMiLCJwb3AiLCJnZW5lcmF0b3IiLCJuZXh0X2dlbiIsImoiLCJiaXRzdHJpbmdfY29tcHJlaGVuc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsUUFBTixDQUFlO2NBQ0RDLE9BQU8sSUFBbkIsRUFBeUJDLGdCQUFnQkMsT0FBT0MsR0FBUCxDQUFXLG1CQUFYLENBQXpDLEVBQTBFO1NBQ25FSCxJQUFMLEdBQVlBLElBQVo7U0FDS0MsYUFBTCxHQUFxQkEsYUFBckI7Ozs7QUFJSixNQUFNRyxRQUFOLENBQWU7Z0JB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
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/test/comprehension.spec.js.html b/coverage/lcov-report/test/comprehension.spec.js.html new file mode 100644 index 0000000..79a9648 --- /dev/null +++ b/coverage/lcov-report/test/comprehension.spec.js.html @@ -0,0 +1,408 @@ + + + + Code coverage report for test/comprehension.spec.js + + + + + + + +
+
+

+ All files / test comprehension.spec.js +

+
+
+ 0% + Statements + 0/50 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/16 +
+
+ 0% + Lines + 0/48 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
'use strict';
+ 
+import chai from 'chai';
+var expect = chai.expect;
+ 
+import Tailored from '../src/index.js';
+import ErlangTypes from 'erlang-types';
+const Tuple = ErlangTypes.Tuple;
+const BitString = ErlangTypes.BitString;
+ 
+const _ = Tailored.wildcard();
+const $ = Tailored.variable();
+ 
+describe('list generator', () => {
+  it('must work on simple case', () => {
+    let gen = Tailored.list_generator($, [1, 2, 3, 4]);
+ 
+    let result = [];
+ 
+    for (let a of gen()) {
+      result.push(a);
+    }
+ 
+    expect(result).to.eql([1, 2, 3, 4]);
+  });
+ 
+  it('must only result matching values', () => {
+    let gen = Tailored.list_generator(
+      Tailored.capture(Tailored.type(Tuple, {values: [1, 2, 3]})),
+      [new Tuple(1, 2, 3), 2, 3, 4]
+    );
+ 
+    let result = [];
+ 
+    for (let a of gen()) {
+      result.push(a);
+    }
+ 
+    expect(result).to.eql([new Tuple(1, 2, 3)]);
+  });
+});
+ 
+describe('list comprehension', () => {
+  it('must work on simple case', () => {
+    let gen = Tailored.list_generator($, [1, 2, 3, 4]);
+    let comp = Tailored.list_comprehension(Tailored.clause([$], x => x), [gen]);
+ 
+    expect(comp).to.eql([1, 2, 3, 4]);
+  });
+ 
+  it('must work on two generators', () => {
+    let gen = Tailored.list_generator($, [1, 2]);
+    let gen2 = Tailored.list_generator($, [3, 4]);
+    let comp = Tailored.list_comprehension(
+      Tailored.clause([$, $], (x, y) => x * y),
+      [gen, gen2]
+    );
+ 
+    expect(comp).to.eql([3, 4, 6, 8]);
+  });
+ 
+  it('must work on three generators', () => {
+    let gen = Tailored.list_generator($, [1, 2]);
+    let gen2 = Tailored.list_generator($, [3, 4]);
+    let gen3 = Tailored.list_generator($, [5, 6]);
+ 
+    let comp = Tailored.list_comprehension(
+      Tailored.clause([$, $, $], (x, y, z) => x * y * z),
+      [gen, gen2, gen3]
+    );
+ 
+    expect(comp).to.eql([15, 18, 20, 24, 30, 36, 40, 48]);
+  });
+ 
+  it('must work with guards', () => {
+    let gen = Tailored.list_generator($, [1, 2]);
+    let gen2 = Tailored.list_generator($, [3, 4]);
+    let comp = Tailored.list_comprehension(
+      Tailored.clause([$, $], (x, y) => x * y, x => x > 1),
+      [gen, gen2]
+    );
+ 
+    expect(comp).to.eql([6, 8]);
+  });
+});
+ 
+describe('binary comprehension', () => {
+  it('must work on simple case', () => {
+    let gen = Tailored.bitstring_generator(
+      Tailored.bitStringMatch(BitString.integer({value: $})),
+      new BitString(
+        BitString.integer(1),
+        BitString.integer(2),
+        BitString.integer(3)
+      )
+    );
+    let comp = Tailored.bitstring_comprehension(
+      Tailored.clause(
+        [Tailored.bitStringMatch(BitString.integer({value: $}))],
+        x => x * 2
+      ),
+      [gen]
+    );
+ 
+    expect(comp).to.eql(
+      new BitString(
+        BitString.integer(2),
+        BitString.integer(4),
+        BitString.integer(6)
+      )
+    );
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/test/defmatch.spec.js.html b/coverage/lcov-report/test/defmatch.spec.js.html new file mode 100644 index 0000000..6e09fb1 --- /dev/null +++ b/coverage/lcov-report/test/defmatch.spec.js.html @@ -0,0 +1,1281 @@ + + + + Code coverage report for test/defmatch.spec.js + + + + + + + +
+
+

+ All files / test defmatch.spec.js +

+
+
+ 0% + Statements + 0/147 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/62 +
+
+ 0% + Lines + 0/142 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
'use strict';
+ 
+import chai from 'chai';
+var expect = chai.expect;
+ 
+import Tailored from '../src/index.js';
+import ErlangTypes from 'erlang-types';
+const Tuple = ErlangTypes.Tuple;
+const BitString = ErlangTypes.BitString;
+ 
+const _ = Tailored.wildcard();
+const $ = Tailored.variable();
+ 
+describe('defmatch', () => {
+  it('must throw error when no match is found', () => {
+    let fn = Tailored.defmatch(Tailored.clause([0], () => 1));
+ 
+    expect(fn.bind(fn, 1)).to.throw('No match for: 1');
+  });
+ 
+  it('must have wildcard except everything', () => {
+    let fn = Tailored.defmatch(Tailored.clause([_], () => 1));
+ 
+    expect(fn(1)).to.equal(1);
+    expect(fn('1')).to.equal(1);
+    expect(fn('ABC')).to.equal(1);
+    expect(fn(() => 34)).to.equal(1);
+  });
+ 
+  it('must work symbols', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([Symbol.for('infinity')], () => 1)
+    );
+ 
+    expect(fn(Symbol.for('infinity'))).to.equal(1);
+    expect(fn.bind(fn, Symbol('infinity'))).to.throw(
+      'No match for: Symbol(infinity)'
+    );
+  });
+ 
+  it('must match on values in object', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([{ value: $ }], val => 1 + val),
+      Tailored.clause([{ a: { b: { c: $ } } }], val => 1 - val)
+    );
+ 
+    expect(fn({ value: 20 })).to.equal(21);
+    expect(fn({ a: { b: { c: 20 } } })).to.equal(-19);
+  });
+ 
+  it('must match on objects even when value has more keys', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([{ value: $ }], val => 1 + val),
+      Tailored.clause([{ a: { b: { c: $ } } }], val => 1 - val)
+    );
+ 
+    expect(fn({ value: 20 })).to.equal(21);
+    expect(fn({ a: { b: { c: 20 }, d: 10 } })).to.equal(-19);
+  });
+ 
+  it('must match on substrings', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([Tailored.startsWith('Bearer ')], token => token)
+    );
+ 
+    expect(fn('Bearer 1234')).to.equal('1234');
+  });
+ 
+  it('must work with guards', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([$], number => number, number => number > 0)
+    );
+ 
+    expect(fn(3)).to.equal(3);
+    expect(fn.bind(fn, -1)).to.throw('No match for: -1');
+  });
+ 
+  it('must capture entire match as parameter', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause(
+        [Tailored.capture({ a: { b: { c: $ } } })],
+        (val, bound_value) => bound_value['a']['b']['c']
+      )
+    );
+ 
+    expect(fn({ a: { b: { c: 20 } } })).to.equal(20);
+ 
+    fn = Tailored.defmatch(
+      Tailored.clause(
+        [Tailored.capture([1, $, 3, $])],
+        (a, b, bound_value) => bound_value.length
+      )
+    );
+ 
+    expect(fn([1, 2, 3, 4])).to.equal(4);
+ 
+    fn = Tailored.defmatch(
+      Tailored.clause(
+        [Tailored.capture([1, Tailored.capture({ a: { b: { c: $ } } }), 3, $])],
+        (c, two, four, arg) => two['a']['b']['c']
+      )
+    );
+ 
+    expect(fn([1, { a: { b: { c: 20 } } }, 3, 4])).to.equal(20);
+  });
+ 
+  it('must produce a head and a tail', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([Tailored.headTail($, $)], (head, tail) => tail)
+    );
+ 
+    expect(fn([3, 1, 2, 4]).length).to.equal(3);
+  });
+ 
+  it('must produce a head and a tail with one element array', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([Tailored.headTail($, $)], (head, tail) => tail)
+    );
+ 
+    expect(fn([3]).length).to.equal(0);
+  });
+ 
+  it('must match on tuple', () => {
+    let fn = Tailored.defmatch(
+      Tailored.clause([Tailored.type(Tuple, { values: [1, 2, 3] })], () => 3)
+    );
+ 
+    expect(fn(new Tuple(1, 2, 3))).to.equal(3);
+    expect(fn.bind(fn, new Tuple(1, 2, 4))).to.throw('No match for: {1, 2, 4}');
+  });
+ 
+  describe('BitString', () => {
+    it('must match on a string', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.bitStringMatch(
+              BitString.integer(102),
+              BitString.integer(111),
+              BitString.integer(111)
+            )
+          ],
+          () => 3
+        )
+      );
+ 
+      expect(fn('foo')).to.equal(3);
+      expect(fn.bind(fn, 'bar')).to.throw('No match for: bar');
+    });
+ 
+    it('must match on a bitstring', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.bitStringMatch(
+              BitString.integer(102),
+              BitString.integer(111),
+              BitString.integer(111)
+            )
+          ],
+          () => 3
+        )
+      );
+ 
+      expect(
+        fn(
+          new BitString(
+            BitString.integer(102),
+            BitString.integer(111),
+            BitString.integer(111)
+          )
+        )
+      ).to.equal(3);
+    });
+ 
+    it('must allow for variables', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.bitStringMatch(
+              BitString.integer({ value: $ }),
+              BitString.integer(111),
+              BitString.integer(111)
+            )
+          ],
+          pattern => pattern
+        )
+      );
+ 
+      expect(
+        fn(
+          new BitString(
+            BitString.integer(102),
+            BitString.integer(111),
+            BitString.integer(111)
+          )
+        )
+      ).to.equal(102);
+    });
+ 
+    it('must match on variable and convert to type', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.bitStringMatch(
+              BitString.integer(102),
+              BitString.binary({ value: $ })
+            )
+          ],
+          b => b
+        )
+      );
+ 
+      expect(
+        fn(
+          new BitString(
+            BitString.integer(102),
+            BitString.integer(111),
+            BitString.integer(111)
+          )
+        )
+      ).to.equal('oo');
+    });
+ 
+    it('throw error when binary is used without size', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.bitStringMatch(
+              BitString.binary({ value: $ }),
+              BitString.binary(' the '),
+              BitString.binary({ value: $ })
+            )
+          ],
+          (name, species) => name
+        )
+      );
+ 
+      expect(fn.bind(fn, 'Frank the Walrus')).to.throw(
+        'a binary field without size is only allowed at the end of a binary pattern'
+      );
+    });
+ 
+    it('allow binary pattern with size', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.bitStringMatch(
+              BitString.size(BitString.binary({ value: $ }), 5),
+              BitString.binary(' the '),
+              BitString.binary({ value: $ })
+            )
+          ],
+          (name, species) => name
+        )
+      );
+ 
+      expect(fn('Frank the Walrus')).to.equal('Frank');
+    });
+ 
+    it('allow unsigned integer', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [Tailored.bitStringMatch(BitString.integer({ value: $ }))],
+          int => int
+        )
+      );
+ 
+      expect(fn(new BitString(BitString.integer(-100)))).to.equal(156);
+    });
+  });
+ 
+  describe('Optional Arguments', () => {
+    it('single optional argument', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause([Tailored.variable(null, 2)], arg => arg)
+      );
+ 
+      expect(fn()).to.equal(2);
+      expect(fn(3)).to.equal(3);
+    });
+ 
+    it('single optional argument and one required argument', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [Tailored.variable(), Tailored.variable(null, 2)],
+          (arg1, arg2) => arg1 + arg2
+        )
+      );
+ 
+      expect(fn.bind(fn)).to.throw('No match for:');
+      expect(fn(1)).to.equal(3);
+      expect(fn(3, 4)).to.equal(7);
+    });
+ 
+    it('two optional arguments and one required argument', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.variable(null, 3),
+            Tailored.variable(),
+            Tailored.variable(null, 2)
+          ],
+          (arg1, arg2, arg3) => arg1 + arg2 + arg3
+        )
+      );
+ 
+      expect(fn(1)).to.equal(6);
+      expect(fn(3, 4)).to.equal(9);
+    });
+ 
+    it('two optional arguments in between 2 required', () => {
+      let fn = Tailored.defmatch(
+        Tailored.clause(
+          [
+            Tailored.variable(),
+            Tailored.variable(null, 2),
+            Tailored.variable(null, 3),
+            Tailored.variable()
+          ],
+          (arg1, arg2, arg3, arg4) => arg1 + arg2 + arg3 + arg4
+        )
+      );
+ 
+      expect(fn(1, 4)).to.equal(10);
+      expect(fn(1, 5, 4)).to.equal(13);
+      expect(fn(1, 5, 7, 4)).to.equal(17);
+    });
+ 
+    it('must match on objects with symbol keys', () => {
+      const bound_value = {
+        [Symbol.for('__struct__')]: Symbol.for('Elixir.Blueprint.AssertError')
+      };
+ 
+      const value = {
+        [Symbol.for('__struct__')]: Symbol.for('Elixir.Blueprint.AssertError'),
+        [Symbol.for('msg')]: 'somthing'
+      };
+ 
+      let fn = Tailored.defmatch(
+        Tailored.clause([Tailored.capture(bound_value)], val => true)
+      );
+ 
+      expect(fn(value)).to.equal(true);
+    });
+ 
+    it('must match on maps with symbol keys', () => {
+      const bound_value = new Map([
+        [Symbol.for('__struct__'), Symbol.for('Elixir.Blueprint.AssertError')]
+      ]);
+ 
+      const value = new Map([
+        [Symbol.for('__struct__'), Symbol.for('Elixir.Blueprint.AssertError')],
+        [Symbol.for('msg'), 'something']
+      ]);
+ 
+      let fn = Tailored.defmatch(
+        Tailored.clause([Tailored.capture(bound_value)], val => true)
+      );
+ 
+      expect(fn(value)).to.equal(true);
+    });
+ 
+    it('must work with maps', () => {
+      const pattern = [
+        new Map([
+          [Symbol.for('a'), 1],
+          [Symbol.for('b'), Tailored.variable('b')],
+          [Symbol.for('c'), Tailored.variable('c')]
+        ])
+      ];
+ 
+      const value = new Map([
+        [Symbol.for('a'), 1],
+        [Symbol.for('b'), 2],
+        [Symbol.for('c'), 3]
+      ]);
+ 
+      let fn = Tailored.defmatch(Tailored.clause(pattern, (b, c) => b + c));
+ 
+      expect(fn(value)).to.equal(5);
+    });
+ 
+    it('works with bound keys', () => {
+      const key0 = new Tuple(1)
+ 
+      const map0 = new Map([
+        [new Tuple(1), "pie"]
+      ])
+ 
+      const map = new Map([
+        [key0, Tailored.variable('value')]
+      ])
+ 
+      const v = Tailored.defmatch(Tailored.clause([map], (value0) => {
+        return value0;
+      }, (value0) => {
+          return true;
+      })).call(this, map0)
+ 
+      expect(v).to.equal('pie')
+    })
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/test/index.html b/coverage/lcov-report/test/index.html new file mode 100644 index 0000000..cc83a69 --- /dev/null +++ b/coverage/lcov-report/test/index.html @@ -0,0 +1,123 @@ + + + + Code coverage report for test + + + + + + + +
+
+

+ All files test +

+
+
+ 0% + Statements + 0/200 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/79 +
+
+ 0% + Lines + 0/195 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
defmatch.spec.js
0%0/147100%0/00%0/620%0/142
match.spec.js
0%0/45100%0/00%0/130%0/45
tailcall.spec.js
0%0/8100%0/00%0/40%0/8
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/test/match.spec.js.html b/coverage/lcov-report/test/match.spec.js.html new file mode 100644 index 0000000..b2645fd --- /dev/null +++ b/coverage/lcov-report/test/match.spec.js.html @@ -0,0 +1,342 @@ + + + + Code coverage report for test/match.spec.js + + + + + + + +
+
+

+ All files / test match.spec.js +

+
+
+ 0% + Statements + 0/45 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/13 +
+
+ 0% + Lines + 0/45 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
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  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
'use strict';
+ 
+import Tailored from '../src/index.js';
+const expect = require('chai').expect;
+const ErlangTypes = require('erlang-types');
+const Tuple = ErlangTypes.Tuple;
+ 
+const _ = Tailored.wildcard();
+const $ = Tailored.variable();
+ 
+describe('match', () => {
+  it('must return value on parameter', () => {
+    let [a] = Tailored.match($, 1);
+    expect(a).to.equal(1);
+  });
+ 
+  it('must ignore value when wildcard given', () => {
+    let [a] = Tailored.match(_, 1);
+    expect(a).to.equal(undefined);
+  });
+ 
+  it('must match on multiple values when an array is given', () => {
+    let [a] = Tailored.match([$, 2, _, 4], [1, 2, 3, 4]);
+    expect(a).to.equal(1);
+  });
+ 
+  it('must throw an error when there is no match', () => {
+    expect(Tailored.match.bind(Tailored.match, [$, 2, _, 4], 1)).to.throw(
+      'No match for: 1'
+    );
+  });
+ 
+  it('must match values in object', () => {
+    let [a] = Tailored.match({ a: [1, $, 3] }, { a: [1, 2, 3] });
+    expect(a).to.equal(2);
+  });
+ 
+  it('must match on capture variables', () => {
+    let a = 1;
+ 
+    let [b] = Tailored.match(Tailored.capture(a), 1);
+    expect(b).to.equal(1);
+ 
+    let c = { a: 1 };
+ 
+    let [d] = Tailored.match(Tailored.capture(c), { a: 1 });
+    expect(d['a']).to.equal(1);
+  });
+ 
+  it('must throw an error when capture value does not match', () => {
+    let a = 1;
+    expect(
+      Tailored.match.bind(Tailored.match, Tailored.capture(a), 2)
+    ).to.throw('No match for: 2');
+  });
+ 
+  it('must work with type values', () => {
+    let matches = Tailored.match_or_default(
+      new Tuple(Symbol.for('ok'), $),
+      new Tuple(Symbol.for('ok'), 1)
+    );
+ 
+    expect(matches.length).to.equal(1);
+    expect(matches[0]).to.equal(1);
+  });
+ 
+  it('must match variable names when values are the same', () => {
+    let matches = Tailored.match_or_default(
+      [Tailored.variable('name'), Tailored.variable('name')],
+      [3, 3]
+    );
+ 
+    expect(matches.length).to.equal(2);
+    expect(matches[0]).to.equal(3);
+  });
+ 
+  it('must not match variable names with values are different', () => {
+    let matches = Tailored.match_or_default(
+      [Tailored.variable('name'), Tailored.variable('name')],
+      [3, 4]
+    );
+ 
+    expect(matches).to.equal(null);
+  });
+ 
+  it('matches async function', () => {
+    const f = async function() {};
+    let matches = Tailored.match_or_default(f, f);
+    expect(matches.length).to.equal(0);
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov-report/test/tailcall.spec.js.html b/coverage/lcov-report/test/tailcall.spec.js.html new file mode 100644 index 0000000..2745304 --- /dev/null +++ b/coverage/lcov-report/test/tailcall.spec.js.html @@ -0,0 +1,135 @@ + + + + Code coverage report for test/tailcall.spec.js + + + + + + + +
+
+

+ All files / test tailcall.spec.js +

+
+
+ 0% + Statements + 0/8 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/4 +
+
+ 0% + Lines + 0/8 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
'use strict';
+ 
+import chai from 'chai';
+var expect = chai.expect;
+ 
+import Tailored from '../src/index.js';
+import ErlangTypes from 'erlang-types';
+ 
+const _ = Tailored.wildcard();
+const $ = Tailored.variable();
+ 
+describe('tailcall', () => {
+  it('factorial must work correctly', () => {
+    let fact = Tailored.defmatch(
+      Tailored.clause([0], () => 1),
+      Tailored.clause([$], n => n * fact(n - 1)),
+    );
+ 
+    //let response = fact(32768);
+    //expect(response).to.equal(Infinity);
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..d374a67 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,1059 @@ +TN: +SF:/Users/bryanjos/projects/tailored/lib/tailored.js +FN:3,_interopDefault +FN:10,(anonymous_1) +FN:17,(anonymous_2) +FN:21,(anonymous_3) +FN:27,(anonymous_4) +FN:33,(anonymous_5) +FN:40,(anonymous_6) +FN:47,(anonymous_7) +FN:53,(anonymous_8) +FN:57,(anonymous_9) +FN:61,(anonymous_10) +FN:65,(anonymous_11) +FN:75,(anonymous_12) +FN:79,(anonymous_13) +FN:84,(anonymous_14) +FN:90,(anonymous_15) +FN:96,variable +FN:100,wildcard +FN:104,startsWith +FN:108,capture +FN:112,headTail +FN:116,type +FN:120,bound +FN:124,bitStringMatch +FN:128,namedVariableResult +FN:134,is_number +FN:138,is_string +FN:142,is_boolean +FN:146,is_symbol +FN:150,is_object +FN:154,is_variable +FN:158,is_bitstring +FN:162,is_null +FN:166,is_array +FN:170,is_function +FN:174,is_map +FN:178,is_pid +FN:182,is_tuple +FN:186,is_reference +FN:190,arrayEquals +FN:208,tupleEquals +FN:220,bitstringEquals +FN:232,pidEquals +FN:240,referenceEquals +FN:248,mapEquals +FN:259,equals +FN:287,is_non_primitive +FN:291,has +FN:305,get +FN:328,resolveSymbol +FN:329,(anonymous_50) +FN:334,resolveString +FN:335,(anonymous_52) +FN:340,resolveNumber +FN:341,(anonymous_54) +FN:346,resolveBoolean +FN:347,(anonymous_56) +FN:352,resolveFunction +FN:353,(anonymous_58) +FN:358,resolveNull +FN:359,(anonymous_60) +FN:364,resolveBound +FN:365,(anonymous_62) +FN:374,resolveWildcard +FN:375,(anonymous_64) +FN:380,resolveVariable +FN:381,(anonymous_66) +FN:392,resolveHeadTail +FN:396,(anonymous_68) +FN:412,resolveCapture +FN:415,(anonymous_70) +FN:425,resolveStartsWith +FN:428,(anonymous_72) +FN:438,resolveType +FN:439,(anonymous_74) +FN:449,resolveArray +FN:450,(anonymous_76) +FN:452,(anonymous_77) +FN:457,(anonymous_78) +FN:463,resolveMap +FN:472,(anonymous_80) +FN:487,resolveObject +FN:496,(anonymous_82) +FN:511,resolveBitString +FN:525,(anonymous_84) +FN:614,getSize +FN:618,arraysEqual +FN:630,fillArray +FN:636,createBitString +FN:637,(anonymous_89) +FN:641,resolveNoMatch +FN:642,(anonymous_91) +FN:665,buildMatch +FN:693,(anonymous_93) +FN:699,(anonymous_94) +FN:719,(anonymous_95) +FN:719,(anonymous_96) +FN:728,clause +FN:728,(anonymous_98) +FN:734,defmatch +FN:737,(anonymous_100) +FN:743,defmatchgen +FN:746,(anonymous_102) +FN:779,defmatchGen +FN:783,defmatchAsync +FN:786,(anonymous_105) +FN:819,findMatchingFunction +FN:851,getArityMap +FN:872,getArityRange +FN:885,getOptionalValues +FN:897,fillInOptionalValues +FN:921,match +FN:921,(anonymous_112) +FN:935,match_gen +FN:935,(anonymous_114) +FN:952,checkNamedVariables +FN:975,match_or_default +FN:975,(anonymous_117) +FN:988,match_or_default_gen +FN:988,(anonymous_119) +FN:1004,match_or_default_async +FN:1004,(anonymous_121) +FN:1020,bitstring_generator +FN:1021,(anonymous_123) +FN:1027,(anonymous_124) +FN:1043,list_generator +FN:1044,(anonymous_126) +FN:1047,(anonymous_127) +FN:1058,list_comprehension +FN:1072,run_generators +FN:1074,(anonymous_130) +FN:1095,bitstring_comprehension +FN:1106,(anonymous_132) +FNF:133 +FNH:0 +FNDA:0,_interopDefault +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,variable +FNDA:0,wildcard +FNDA:0,startsWith +FNDA:0,capture +FNDA:0,headTail +FNDA:0,type +FNDA:0,bound +FNDA:0,bitStringMatch +FNDA:0,namedVariableResult +FNDA:0,is_number +FNDA:0,is_string +FNDA:0,is_boolean +FNDA:0,is_symbol +FNDA:0,is_object +FNDA:0,is_variable +FNDA:0,is_bitstring +FNDA:0,is_null +FNDA:0,is_array +FNDA:0,is_function +FNDA:0,is_map +FNDA:0,is_pid +FNDA:0,is_tuple +FNDA:0,is_reference +FNDA:0,arrayEquals +FNDA:0,tupleEquals +FNDA:0,bitstringEquals +FNDA:0,pidEquals +FNDA:0,referenceEquals +FNDA:0,mapEquals +FNDA:0,equals +FNDA:0,is_non_primitive +FNDA:0,has +FNDA:0,get +FNDA:0,resolveSymbol +FNDA:0,(anonymous_50) +FNDA:0,resolveString +FNDA:0,(anonymous_52) +FNDA:0,resolveNumber +FNDA:0,(anonymous_54) +FNDA:0,resolveBoolean +FNDA:0,(anonymous_56) +FNDA:0,resolveFunction +FNDA:0,(anonymous_58) +FNDA:0,resolveNull +FNDA:0,(anonymous_60) +FNDA:0,resolveBound +FNDA:0,(anonymous_62) +FNDA:0,resolveWildcard +FNDA:0,(anonymous_64) +FNDA:0,resolveVariable +FNDA:0,(anonymous_66) +FNDA:0,resolveHeadTail +FNDA:0,(anonymous_68) +FNDA:0,resolveCapture +FNDA:0,(anonymous_70) +FNDA:0,resolveStartsWith +FNDA:0,(anonymous_72) +FNDA:0,resolveType +FNDA:0,(anonymous_74) +FNDA:0,resolveArray +FNDA:0,(anonymous_76) +FNDA:0,(anonymous_77) +FNDA:0,(anonymous_78) +FNDA:0,resolveMap +FNDA:0,(anonymous_80) +FNDA:0,resolveObject +FNDA:0,(anonymous_82) +FNDA:0,resolveBitString +FNDA:0,(anonymous_84) +FNDA:0,getSize +FNDA:0,arraysEqual +FNDA:0,fillArray +FNDA:0,createBitString +FNDA:0,(anonymous_89) +FNDA:0,resolveNoMatch +FNDA:0,(anonymous_91) +FNDA:0,buildMatch +FNDA:0,(anonymous_93) +FNDA:0,(anonymous_94) +FNDA:0,(anonymous_95) +FNDA:0,(anonymous_96) +FNDA:0,clause +FNDA:0,(anonymous_98) +FNDA:0,defmatch +FNDA:0,(anonymous_100) +FNDA:0,defmatchgen +FNDA:0,(anonymous_102) +FNDA:0,defmatchGen +FNDA:0,defmatchAsync +FNDA:0,(anonymous_105) +FNDA:0,findMatchingFunction +FNDA:0,getArityMap +FNDA:0,getArityRange +FNDA:0,getOptionalValues +FNDA:0,fillInOptionalValues +FNDA:0,match +FNDA:0,(anonymous_112) +FNDA:0,match_gen +FNDA:0,(anonymous_114) +FNDA:0,checkNamedVariables +FNDA:0,match_or_default +FNDA:0,(anonymous_117) +FNDA:0,match_or_default_gen +FNDA:0,(anonymous_119) +FNDA:0,match_or_default_async +FNDA:0,(anonymous_121) +FNDA:0,bitstring_generator +FNDA:0,(anonymous_123) +FNDA:0,(anonymous_124) +FNDA:0,list_generator +FNDA:0,(anonymous_126) +FNDA:0,(anonymous_127) +FNDA:0,list_comprehension +FNDA:0,run_generators +FNDA:0,(anonymous_130) +FNDA:0,bitstring_comprehension +FNDA:0,(anonymous_132) +DA:3,0 +DA:5,0 +DA:11,0 +DA:12,0 +DA:22,0 +DA:28,0 +DA:34,0 +DA:35,0 +DA:41,0 +DA:42,0 +DA:48,0 +DA:54,0 +DA:58,0 +DA:62,0 +DA:66,0 +DA:68,0 +DA:69,0 +DA:72,0 +DA:76,0 +DA:80,0 +DA:81,0 +DA:85,0 +DA:91,0 +DA:92,0 +DA:97,0 +DA:101,0 +DA:105,0 +DA:109,0 +DA:113,0 +DA:117,0 +DA:121,0 +DA:125,0 +DA:129,0 +DA:135,0 +DA:139,0 +DA:143,0 +DA:147,0 +DA:151,0 +DA:155,0 +DA:159,0 +DA:163,0 +DA:167,0 +DA:171,0 +DA:175,0 +DA:179,0 +DA:183,0 +DA:187,0 +DA:191,0 +DA:192,0 +DA:195,0 +DA:196,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:205,0 +DA:209,0 +DA:210,0 +DA:213,0 +DA:214,0 +DA:217,0 +DA:221,0 +DA:222,0 +DA:225,0 +DA:226,0 +DA:229,0 +DA:233,0 +DA:234,0 +DA:237,0 +DA:241,0 +DA:242,0 +DA:245,0 +DA:249,0 +DA:250,0 +DA:253,0 +DA:254,0 +DA:256,0 +DA:260,0 +DA:261,0 +DA:264,0 +DA:265,0 +DA:268,0 +DA:269,0 +DA:272,0 +DA:273,0 +DA:276,0 +DA:277,0 +DA:280,0 +DA:281,0 +DA:284,0 +DA:288,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:299,0 +DA:302,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:313,0 +DA:316,0 +DA:319,0 +DA:327,0 +DA:329,0 +DA:330,0 +DA:335,0 +DA:336,0 +DA:341,0 +DA:342,0 +DA:347,0 +DA:348,0 +DA:353,0 +DA:354,0 +DA:359,0 +DA:360,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:370,0 +DA:375,0 +DA:376,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:388,0 +DA:393,0 +DA:394,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:401,0 +DA:402,0 +DA:404,0 +DA:405,0 +DA:408,0 +DA:413,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:421,0 +DA:426,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:434,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:445,0 +DA:450,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:457,0 +DA:458,0 +DA:464,0 +DA:466,0 +DA:468,0 +DA:469,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:483,0 +DA:488,0 +DA:490,0 +DA:492,0 +DA:493,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:507,0 +DA:512,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:519,0 +DA:523,0 +DA:525,0 +DA:526,0 +DA:528,0 +DA:529,0 +DA:532,0 +DA:533,0 +DA:535,0 +DA:538,0 +DA:540,0 +DA:541,0 +DA:543,0 +DA:544,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:556,0 +DA:557,0 +DA:560,0 +DA:561,0 +DA:563,0 +DA:564,0 +DA:566,0 +DA:568,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:576,0 +DA:578,0 +DA:581,0 +DA:582,0 +DA:585,0 +DA:586,0 +DA:589,0 +DA:590,0 +DA:593,0 +DA:594,0 +DA:597,0 +DA:598,0 +DA:601,0 +DA:603,0 +DA:604,0 +DA:607,0 +DA:610,0 +DA:615,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:623,0 +DA:624,0 +DA:627,0 +DA:631,0 +DA:632,0 +DA:637,0 +DA:638,0 +DA:642,0 +DA:643,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:666,0 +DA:667,0 +DA:670,0 +DA:671,0 +DA:674,0 +DA:675,0 +DA:678,0 +DA:679,0 +DA:681,0 +DA:682,0 +DA:685,0 +DA:686,0 +DA:689,0 +DA:694,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:706,0 +DA:709,0 +DA:711,0 +DA:714,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:728,0 +DA:729,0 +DA:735,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:744,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:756,0 +DA:757,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:771,0 +DA:773,0 +DA:774,0 +DA:780,0 +DA:784,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:796,0 +DA:797,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:811,0 +DA:813,0 +DA:814,0 +DA:820,0 +DA:821,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:829,0 +DA:830,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:844,0 +DA:846,0 +DA:847,0 +DA:852,0 +DA:854,0 +DA:855,0 +DA:857,0 +DA:858,0 +DA:860,0 +DA:861,0 +DA:864,0 +DA:865,0 +DA:869,0 +DA:873,0 +DA:874,0 +DA:876,0 +DA:878,0 +DA:879,0 +DA:882,0 +DA:886,0 +DA:888,0 +DA:889,0 +DA:890,0 +DA:894,0 +DA:898,0 +DA:899,0 +DA:902,0 +DA:903,0 +DA:906,0 +DA:907,0 +DA:909,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,0 +DA:918,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:927,0 +DA:928,0 +DA:930,0 +DA:931,0 +DA:936,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,0 +DA:944,0 +DA:945,0 +DA:947,0 +DA:948,0 +DA:953,0 +DA:954,0 +DA:956,0 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:961,0 +DA:962,0 +DA:964,0 +DA:965,0 +DA:968,0 +DA:972,0 +DA:975,0 +DA:976,0 +DA:977,0 +DA:978,0 +DA:979,0 +DA:981,0 +DA:982,0 +DA:984,0 +DA:989,0 +DA:991,0 +DA:992,0 +DA:993,0 +DA:994,0 +DA:995,0 +DA:997,0 +DA:998,0 +DA:1000,0 +DA:1004,0 +DA:1005,0 +DA:1006,0 +DA:1007,0 +DA:1008,0 +DA:1009,0 +DA:1011,0 +DA:1012,0 +DA:1014,0 +DA:1018,0 +DA:1021,0 +DA:1022,0 +DA:1023,0 +DA:1024,0 +DA:1026,0 +DA:1027,0 +DA:1029,0 +DA:1030,0 +DA:1031,0 +DA:1034,0 +DA:1036,0 +DA:1039,0 +DA:1044,0 +DA:1045,0 +DA:1046,0 +DA:1047,0 +DA:1048,0 +DA:1049,0 +DA:1050,0 +DA:1054,0 +DA:1059,0 +DA:1061,0 +DA:1063,0 +DA:1064,0 +DA:1065,0 +DA:1069,0 +DA:1073,0 +DA:1074,0 +DA:1075,0 +DA:1076,0 +DA:1078,0 +DA:1082,0 +DA:1084,0 +DA:1085,0 +DA:1086,0 +DA:1087,0 +DA:1091,0 +DA:1096,0 +DA:1098,0 +DA:1100,0 +DA:1101,0 +DA:1102,0 +DA:1106,0 +DA:1107,0 +DA:1110,0 +DA:1137,0 +LF:506 +LH:0 +BRDA:3,0,0,0 +BRDA:3,0,1,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,1,2,0 +BRDA:10,2,0,0 +BRDA:10,3,0,0 +BRDA:40,4,0,0 +BRDA:96,5,0,0 +BRDA:96,6,0,0 +BRDA:116,7,0,0 +BRDA:171,8,0,0 +BRDA:171,8,1,0 +BRDA:191,9,0,0 +BRDA:191,9,1,0 +BRDA:195,10,0,0 +BRDA:195,10,1,0 +BRDA:200,11,0,0 +BRDA:200,11,1,0 +BRDA:209,12,0,0 +BRDA:209,12,1,0 +BRDA:213,13,0,0 +BRDA:213,13,1,0 +BRDA:221,14,0,0 +BRDA:221,14,1,0 +BRDA:225,15,0,0 +BRDA:225,15,1,0 +BRDA:233,16,0,0 +BRDA:233,16,1,0 +BRDA:241,17,0,0 +BRDA:241,17,1,0 +BRDA:249,18,0,0 +BRDA:249,18,1,0 +BRDA:260,19,0,0 +BRDA:260,19,1,0 +BRDA:264,20,0,0 +BRDA:264,20,1,0 +BRDA:268,21,0,0 +BRDA:268,21,1,0 +BRDA:272,22,0,0 +BRDA:272,22,1,0 +BRDA:276,23,0,0 +BRDA:276,23,1,0 +BRDA:280,24,0,0 +BRDA:280,24,1,0 +BRDA:288,25,0,0 +BRDA:288,25,1,0 +BRDA:288,25,2,0 +BRDA:288,25,3,0 +BRDA:288,25,4,0 +BRDA:288,25,5,0 +BRDA:292,26,0,0 +BRDA:292,26,1,0 +BRDA:294,27,0,0 +BRDA:294,27,1,0 +BRDA:306,28,0,0 +BRDA:306,28,1,0 +BRDA:308,29,0,0 +BRDA:308,29,1,0 +BRDA:330,30,0,0 +BRDA:330,30,1,0 +BRDA:336,31,0,0 +BRDA:336,31,1,0 +BRDA:342,32,0,0 +BRDA:342,32,1,0 +BRDA:348,33,0,0 +BRDA:348,33,1,0 +BRDA:354,34,0,0 +BRDA:354,34,1,0 +BRDA:366,35,0,0 +BRDA:366,35,1,0 +BRDA:366,36,0,0 +BRDA:366,36,1,0 +BRDA:382,37,0,0 +BRDA:382,37,1,0 +BRDA:384,38,0,0 +BRDA:384,38,1,0 +BRDA:397,39,0,0 +BRDA:397,39,1,0 +BRDA:397,40,0,0 +BRDA:397,40,1,0 +BRDA:404,41,0,0 +BRDA:404,41,1,0 +BRDA:404,42,0,0 +BRDA:404,42,1,0 +BRDA:416,43,0,0 +BRDA:416,43,1,0 +BRDA:429,44,0,0 +BRDA:429,44,1,0 +BRDA:429,45,0,0 +BRDA:429,45,1,0 +BRDA:440,46,0,0 +BRDA:440,46,1,0 +BRDA:453,47,0,0 +BRDA:453,47,1,0 +BRDA:453,48,0,0 +BRDA:453,48,1,0 +BRDA:473,49,0,0 +BRDA:473,49,1,0 +BRDA:473,50,0,0 +BRDA:473,50,1,0 +BRDA:478,51,0,0 +BRDA:478,51,1,0 +BRDA:478,52,0,0 +BRDA:478,52,1,0 +BRDA:497,53,0,0 +BRDA:497,53,1,0 +BRDA:497,54,0,0 +BRDA:497,54,1,0 +BRDA:502,55,0,0 +BRDA:502,55,1,0 +BRDA:502,56,0,0 +BRDA:502,56,1,0 +BRDA:515,57,0,0 +BRDA:515,57,1,0 +BRDA:528,58,0,0 +BRDA:528,58,1,0 +BRDA:528,59,0,0 +BRDA:528,59,1,0 +BRDA:532,60,0,0 +BRDA:532,60,1,0 +BRDA:543,61,0,0 +BRDA:543,61,1,0 +BRDA:543,62,0,0 +BRDA:543,62,1,0 +BRDA:543,62,2,0 +BRDA:543,62,3,0 +BRDA:552,63,0,0 +BRDA:552,63,1,0 +BRDA:560,64,0,0 +BRDA:560,64,1,0 +BRDA:561,65,0,0 +BRDA:561,65,1,0 +BRDA:561,65,2,0 +BRDA:561,65,3,0 +BRDA:561,65,4,0 +BRDA:561,65,5,0 +BRDA:561,65,6,0 +BRDA:561,65,7,0 +BRDA:563,66,0,0 +BRDA:563,66,1,0 +BRDA:563,67,0,0 +BRDA:563,67,1,0 +BRDA:571,68,0,0 +BRDA:571,68,1,0 +BRDA:573,69,0,0 +BRDA:573,69,1,0 +BRDA:603,70,0,0 +BRDA:603,70,1,0 +BRDA:619,71,0,0 +BRDA:619,71,1,0 +BRDA:620,72,0,0 +BRDA:620,72,1,0 +BRDA:620,73,0,0 +BRDA:620,73,1,0 +BRDA:621,74,0,0 +BRDA:621,74,1,0 +BRDA:624,75,0,0 +BRDA:624,75,1,0 +BRDA:666,76,0,0 +BRDA:666,76,1,0 +BRDA:670,77,0,0 +BRDA:670,77,1,0 +BRDA:674,78,0,0 +BRDA:674,78,1,0 +BRDA:681,79,0,0 +BRDA:681,79,1,0 +BRDA:685,80,0,0 +BRDA:685,80,1,0 +BRDA:696,81,0,0 +BRDA:696,81,1,0 +BRDA:698,82,0,0 +BRDA:698,82,1,0 +BRDA:700,83,0,0 +BRDA:700,83,1,0 +BRDA:702,84,0,0 +BRDA:702,84,1,0 +BRDA:719,85,0,0 +BRDA:728,86,0,0 +BRDA:747,87,0,0 +BRDA:747,87,1,0 +BRDA:759,88,0,0 +BRDA:759,88,1,0 +BRDA:759,89,0,0 +BRDA:759,89,1,0 +BRDA:759,89,2,0 +BRDA:766,90,0,0 +BRDA:766,90,1,0 +BRDA:787,91,0,0 +BRDA:787,91,1,0 +BRDA:799,92,0,0 +BRDA:799,92,1,0 +BRDA:799,93,0,0 +BRDA:799,93,1,0 +BRDA:799,93,2,0 +BRDA:806,94,0,0 +BRDA:806,94,1,0 +BRDA:820,95,0,0 +BRDA:820,95,1,0 +BRDA:832,96,0,0 +BRDA:832,96,1,0 +BRDA:832,97,0,0 +BRDA:832,97,1,0 +BRDA:832,97,2,0 +BRDA:839,98,0,0 +BRDA:839,98,1,0 +BRDA:860,99,0,0 +BRDA:860,99,1,0 +BRDA:889,100,0,0 +BRDA:889,100,1,0 +BRDA:889,101,0,0 +BRDA:889,101,1,0 +BRDA:898,102,0,0 +BRDA:898,102,1,0 +BRDA:898,103,0,0 +BRDA:898,103,1,0 +BRDA:902,104,0,0 +BRDA:902,104,1,0 +BRDA:913,105,0,0 +BRDA:913,105,1,0 +BRDA:921,106,0,0 +BRDA:927,107,0,0 +BRDA:927,107,1,0 +BRDA:927,108,0,0 +BRDA:927,108,1,0 +BRDA:927,108,2,0 +BRDA:935,109,0,0 +BRDA:942,110,0,0 +BRDA:942,110,1,0 +BRDA:944,111,0,0 +BRDA:944,111,1,0 +BRDA:944,112,0,0 +BRDA:944,112,1,0 +BRDA:958,113,0,0 +BRDA:958,113,1,0 +BRDA:959,114,0,0 +BRDA:959,114,1,0 +BRDA:959,115,0,0 +BRDA:959,115,1,0 +BRDA:961,116,0,0 +BRDA:961,116,1,0 +BRDA:961,117,0,0 +BRDA:961,117,1,0 +BRDA:975,118,0,0 +BRDA:975,119,0,0 +BRDA:981,120,0,0 +BRDA:981,120,1,0 +BRDA:981,121,0,0 +BRDA:981,121,1,0 +BRDA:981,121,2,0 +BRDA:988,122,0,0 +BRDA:990,123,0,0 +BRDA:995,124,0,0 +BRDA:995,124,1,0 +BRDA:997,125,0,0 +BRDA:997,125,1,0 +BRDA:997,126,0,0 +BRDA:997,126,1,0 +BRDA:1004,127,0,0 +BRDA:1004,128,0,0 +BRDA:1009,129,0,0 +BRDA:1009,129,1,0 +BRDA:1011,130,0,0 +BRDA:1011,130,1,0 +BRDA:1011,131,0,0 +BRDA:1011,131,1,0 +BRDA:1029,132,0,0 +BRDA:1029,132,1,0 +BRDA:1048,133,0,0 +BRDA:1048,133,1,0 +BRDA:1064,134,0,0 +BRDA:1064,134,1,0 +BRDA:1073,135,0,0 +BRDA:1073,135,1,0 +BRDA:1075,136,0,0 +BRDA:1075,136,1,0 +BRDA:1101,137,0,0 +BRDA:1101,137,1,0 +BRF:278 +BRH:0 +end_of_record diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..40c9e9f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3688 @@ +{ + "name": "tailored", + "version": "2.7.5", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.2.tgz", + "integrity": "sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.0.tgz", + "integrity": "sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@types/chai": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", + "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/fs-extra": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.5.tgz", + "integrity": "sha512-w7iqhDH9mN8eLClQOYTkhdYUOSpp25eXxfc6VbFOGtzxW34JcvctH2bKjj4jD4++z4R5iO5D+pg48W2e03I65A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/handlebars": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==", + "dev": true, + "requires": { + "handlebars": "*" + } + }, + "@types/highlight.js": { + "version": "9.12.3", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz", + "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.123", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", + "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", + "dev": true + }, + "@types/marked": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", + "integrity": "sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mocha": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", + "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==" + }, + "@types/node": { + "version": "11.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.12.2.tgz", + "integrity": "sha512-c82MtnqWB/CqqK7/zit74Ob8H1dBdV7bK+BcErwtXbe0+nUGkgzq5NTDmRW/pAv2lFtmeNmW95b0zK2hxpeklg==", + "dev": true + }, + "@types/shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-miY41hqc5SkRlsZDod3heDa4OS9xv8G77EMBQuSpqq86HBn66l7F+f8y9YKm+1PIuwC8QEZVwN8YxOOG7Y67fA==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", + "dev": true + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "optional": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "erlang-types": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/erlang-types/-/erlang-types-1.1.3.tgz", + "integrity": "sha512-HZWcirSqKIdasr04DT9NnYgVyqvUaefDPp2LhNgtBnM2ovOkUhJ4DEKVQZ71POKsu4wiR64EWhahA8AE9r796g==" + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "highlight.js": { + "version": "9.15.6", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz", + "integrity": "sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", + "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.0.2.tgz", + "integrity": "sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "findup-sync": "2.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.12.0", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.4", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "12.0.5", + "yargs-parser": "11.1.1", + "yargs-unparser": "1.5.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-environment-flags": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz", + "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", + "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^3.0.1", + "convert-source-map": "^1.6.0", + "find-cache-dir": "^2.0.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.3", + "istanbul-lib-hook": "^2.0.3", + "istanbul-lib-instrument": "^3.1.0", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.2", + "istanbul-reports": "^2.1.1", + "make-dir": "^1.3.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.1.0", + "uuid": "^3.3.2", + "yargs": "^12.0.5", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caching-transform": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^1.3.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "camelcase": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "hasha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "supports-color": "^6.0.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "^4.1.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "bundled": true, + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, + "uglify-js": { + "version": "3.4.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "12.0.5", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typedoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.14.2.tgz", + "integrity": "sha512-aEbgJXV8/KqaVhcedT7xG6d2r+mOvB5ep3eIz1KuB5sc4fDYXcepEEMdU7XSqLFO5hVPu0nllHi1QxX2h/QlpQ==", + "dev": true, + "requires": { + "@types/fs-extra": "^5.0.3", + "@types/handlebars": "^4.0.38", + "@types/highlight.js": "^9.12.3", + "@types/lodash": "^4.14.110", + "@types/marked": "^0.4.0", + "@types/minimatch": "3.0.3", + "@types/shelljs": "^0.8.0", + "fs-extra": "^7.0.0", + "handlebars": "^4.0.6", + "highlight.js": "^9.13.1", + "lodash": "^4.17.10", + "marked": "^0.4.0", + "minimatch": "^3.0.0", + "progress": "^2.0.0", + "shelljs": "^0.8.2", + "typedoc-default-themes": "^0.5.0", + "typescript": "3.2.x" + }, + "dependencies": { + "typescript": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", + "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", + "dev": true + } + } + }, + "typedoc-default-themes": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz", + "integrity": "sha1-bcJDPnjti+qOiHo6zeLzF4W9Yic=", + "dev": true + }, + "typescript": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.1.tgz", + "integrity": "sha512-3NSMb2VzDQm8oBTLH6Nj55VVtUEpe/rgkIzMir0qVoLyjDZlnMBva0U6vDiV3IH+sl/Yu6oP5QwsAQtHPmDd2Q==", + "dev": true + }, + "uglify-js": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.2.tgz", + "integrity": "sha512-imog1WIsi9Yb56yRt5TfYVxGmnWs3WSGU73ieSOlMVFwhJCA9W8fqFFMMj4kgDqiS/80LGdsYnWL7O9UcjEBlg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 5213189..c61c1b5 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,15 @@ "version": "2.7.5", "description": "Pattern matching library", "main": "lib/tailored.js", - "jsnext:main": "src/index.js", + "types": "lib/index.d.ts", "scripts": { - "build": "rollup -c rollup.config.js", - "test": "mocha test --recursive --compilers js:babel-register" + "build": "tsc", + "test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\", \"esModuleInterop\": true}' NODE_ENV=test nyc --all --reporter=text --reporter=lcov mocha --require ts-node/register test/*.spec.[jt]s*" }, - "keywords": ["pattern-matching", "functional"], + "keywords": [ + "pattern-matching", + "functional" + ], "repository": { "type": "git", "url": "https://github.com/elixirscript/tailored.git" @@ -16,15 +19,23 @@ "author": "Bryan Joseph ", "license": "MIT", "devDependencies": { - "babel-core": "^6.25.0", - "babel-preset-env": "^1.6.0", - "babel-register": "^6.24.1", - "chai": "^4.1.0", + "ts-node": "^7.0.1", + "typedoc": "^0.14.0", + "typescript": "^3.2.2", + "chai": "^4.1.2", "mocha": "^6.0.2", - "rollup": "^0.45.2", - "rollup-plugin-babel": "^2.7.1" + "nyc": "^13.0.1", + "@types/chai": "^4.1.7", + "@types/mocha": "^5.2.6" }, "dependencies": { "erlang-types": "^1.0.1" + }, + "nyc": { + "exclude": [ + "*.config.js", + "**/*_test.js", + "coverage/**/*" + ] } } diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index f72f319..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,27 +0,0 @@ -import { rollup } from 'rollup'; -import babel from 'rollup-plugin-babel'; - -export default { - entry: 'src/index.js', - dest: 'lib/tailored.js', - sourceMap: 'inline', - format: 'cjs', - plugins: [ - babel({ - babelrc: false, - presets: [ - [ - 'env', - { - targets: { - node: 'current', - }, - modules: false, - loose: true, - }, - ], - ], - }), - ], - external: ['erlang-types'], -}; diff --git a/src/index.js b/src/index.ts similarity index 100% rename from src/index.js rename to src/index.ts diff --git a/src/tailored/checks.js b/src/tailored/checks.ts similarity index 100% rename from src/tailored/checks.js rename to src/tailored/checks.ts diff --git a/src/tailored/comprehensions.js b/src/tailored/comprehensions.ts similarity index 100% rename from src/tailored/comprehensions.js rename to src/tailored/comprehensions.ts diff --git a/src/tailored/defmatch.js b/src/tailored/defmatch.ts similarity index 100% rename from src/tailored/defmatch.js rename to src/tailored/defmatch.ts diff --git a/src/tailored/match.js b/src/tailored/match.ts similarity index 100% rename from src/tailored/match.js rename to src/tailored/match.ts diff --git a/src/tailored/resolvers.js b/src/tailored/resolvers.ts similarity index 100% rename from src/tailored/resolvers.js rename to src/tailored/resolvers.ts diff --git a/src/tailored/types.js b/src/tailored/types.ts similarity index 100% rename from src/tailored/types.js rename to src/tailored/types.ts diff --git a/src/tailored/utils.js b/src/tailored/utils.ts similarity index 80% rename from src/tailored/utils.js rename to src/tailored/utils.ts index c439f8a..61a4c8e 100644 --- a/src/tailored/utils.js +++ b/src/tailored/utils.ts @@ -1,7 +1,7 @@ import * as Checks from './checks'; import ErlangTypes from 'erlang-types'; -function arrayEquals(left, right) { +function arrayEquals(left: any, right: any): boolean { if (!Array.isArray(right)) { return false; } @@ -19,7 +19,7 @@ function arrayEquals(left, right) { return true; } -function tupleEquals(left, right) { +function tupleEquals(left: any, right: any): boolean { if (right instanceof ErlangTypes.Tuple === false) { return false; } @@ -31,7 +31,7 @@ function tupleEquals(left, right) { return arrayEquals(left.values, right.values); } -function bitstringEquals(left, right) { +function bitstringEquals(left: any, right: any): boolean { if (right instanceof ErlangTypes.BitString === false) { return false; } @@ -43,7 +43,7 @@ function bitstringEquals(left, right) { return arrayEquals(left.value, right.value); } -function pidEquals(left, right) { +function pidEquals(left: any, right: any): boolean { if (right instanceof ErlangTypes.PID === false) { return false; } @@ -51,7 +51,7 @@ function pidEquals(left, right) { return left.id === right.id; } -function referenceEquals(left, right) { +function referenceEquals(left: any, right: any): boolean { if (right instanceof ErlangTypes.Reference === false) { return false; } @@ -59,7 +59,7 @@ function referenceEquals(left, right) { return left.id === right.id; } -function mapEquals(left, right) { +function mapEquals(left: any, right: any): boolean { if (right instanceof Map === false) { return false; } @@ -70,7 +70,7 @@ function mapEquals(left, right) { return arrayEquals(leftEntries, rightEntries); } -function equals(left, right) { +function equals(left: any, right: any): boolean { if (Array.isArray(left)) { return arrayEquals(left, right); } @@ -98,7 +98,7 @@ function equals(left, right) { return left === right; } -function is_non_primitive(key) { +function is_non_primitive(key: any): boolean { return ( Checks.is_array(key) || Checks.is_map(key) || @@ -109,7 +109,7 @@ function is_non_primitive(key) { ); } -function has(map, key) { +function has(map: Map, key: any): boolean { if (is_non_primitive(key)) { for (const map_key of map.keys()) { if (equals(map_key, key)) { @@ -123,7 +123,7 @@ function has(map, key) { return map.has(key); } -function get(map, key) { +function get(map: Map, key: any): any | null { if (is_non_primitive(key)) { for (const map_key of map.keys()) { if (equals(map_key, key)) { @@ -137,9 +137,8 @@ function get(map, key) { return map.get(key); } - export default { get, has, - equals, -} + equals +}; diff --git a/test/comprehension.spec.js b/test/comprehension.spec.ts similarity index 92% rename from test/comprehension.spec.js rename to test/comprehension.spec.ts index 5be880e..4cc5564 100644 --- a/test/comprehension.spec.js +++ b/test/comprehension.spec.ts @@ -1,5 +1,3 @@ -'use strict'; - import chai from 'chai'; var expect = chai.expect; @@ -26,7 +24,7 @@ describe('list generator', () => { it('must only result matching values', () => { let gen = Tailored.list_generator( - Tailored.capture(Tailored.type(Tuple, { values: [1, 2, 3] })), + Tailored.capture(Tailored.type(Tuple, {values: [1, 2, 3]})), [new Tuple(1, 2, 3), 2, 3, 4] ); @@ -87,7 +85,7 @@ describe('list comprehension', () => { describe('binary comprehension', () => { it('must work on simple case', () => { let gen = Tailored.bitstring_generator( - Tailored.bitStringMatch(BitString.integer({ value: $ })), + Tailored.bitStringMatch(BitString.integer({value: $})), new BitString( BitString.integer(1), BitString.integer(2), @@ -96,7 +94,7 @@ describe('binary comprehension', () => { ); let comp = Tailored.bitstring_comprehension( Tailored.clause( - [Tailored.bitStringMatch(BitString.integer({ value: $ }))], + [Tailored.bitStringMatch(BitString.integer({value: $}))], x => x * 2 ), [gen] diff --git a/test/defmatch.spec.js b/test/defmatch.spec.ts similarity index 100% rename from test/defmatch.spec.js rename to test/defmatch.spec.ts diff --git a/test/match.spec.js b/test/match.spec.ts similarity index 100% rename from test/match.spec.js rename to test/match.spec.ts diff --git a/test/tailcall.spec.js b/test/tailcall.spec.ts similarity index 100% rename from test/tailcall.spec.js rename to test/tailcall.spec.ts diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1b3fd48 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,61 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "ES2017" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + //"allowJs": true /* Allow javascript files to be compiled. */, + //"checkJs": true /* Report errors in .js files. */, + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + //"outFile": "./lib/processes.js" /* Concatenate and emit output to single file. */, + "outDir": "./lib/" /* Redirect output structure to the directory. */, + //"rootDir": "./src/" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "test/**/*.*"] +} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index e3d3717..0000000 --- a/yarn.lock +++ /dev/null @@ -1,2034 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - -babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -babel-core@6, babel-core@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.0.tgz#8f36a0a77f5c155aed6f920b844d23ba56742a02" - dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.24.0" - babel-helpers "^6.23.0" - babel-messages "^6.23.0" - babel-register "^6.24.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - slash "^1.0.0" - source-map "^0.5.0" - -babel-core@^6.24.1, babel-core@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" - dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.25.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.25.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - slash "^1.0.0" - source-map "^0.5.0" - -babel-generator@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.23.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -babel-generator@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz#29df56be144d81bdeac08262bfa41d2c5e91cdcd" - dependencies: - babel-helper-explode-assignable-expression "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-helper-call-delegate@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef" - dependencies: - babel-helper-hoist-variables "^6.22.0" - babel-runtime "^6.22.0" - babel-traverse "^6.22.0" - babel-types "^6.22.0" - -babel-helper-define-map@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7" - dependencies: - babel-helper-function-name "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.23.0" - lodash "^4.2.0" - -babel-helper-explode-assignable-expression@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.22.0.tgz#c97bf76eed3e0bae4048121f2b9dae1a4e7d0478" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.22.0" - babel-types "^6.22.0" - -babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6" - dependencies: - babel-helper-get-function-arity "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-helper-get-function-arity@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-helper-hoist-variables@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-helper-optimise-call-expression@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.23.0" - -babel-helper-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - lodash "^4.2.0" - -babel-helper-remap-async-to-generator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.22.0.tgz#2186ae73278ed03b8b15ced089609da981053383" - dependencies: - babel-helper-function-name "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.22.0" - babel-traverse "^6.22.0" - babel-types "^6.22.0" - -babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd" - dependencies: - babel-helper-optimise-call-expression "^6.23.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-helpers@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.23.0" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.22.0.tgz#194b6938ec195ad36efc4c33a971acf00d8cd35e" - dependencies: - babel-helper-remap-async-to-generator "^6.22.0" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - lodash "^4.2.0" - -babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.9.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1" - dependencies: - babel-helper-define-map "^6.23.0" - babel-helper-function-name "^6.23.0" - babel-helper-optimise-call-expression "^6.23.0" - babel-helper-replace-supers "^6.23.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.22.0" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104" - dependencies: - babel-helper-function-name "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz#a1911fb9b7ec7e05a43a63c5995007557bcf6a2e" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.0" - babel-runtime "^6.22.0" - babel-template "^6.22.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz#e921aefb72c2cc26cb03d107626156413222134f" - dependencies: - babel-plugin-transform-strict-mode "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0" - dependencies: - babel-helper-hoist-variables "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz#fd5fa63521cae8d273927c3958afd7c067733450" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc" - dependencies: - babel-helper-replace-supers "^6.22.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b" - dependencies: - babel-helper-call-delegate "^6.22.0" - babel-helper-get-function-arity "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593" - dependencies: - babel-helper-regex "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20" - dependencies: - babel-helper-regex "^6.22.0" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.22.0.tgz#d57c8335281918e54ef053118ce6eb108468084d" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.22.0" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" - dependencies: - regenerator-transform "0.9.8" - -babel-plugin-transform-strict-mode@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-preset-env@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.0.tgz#5e89f8463ba9970356d02eb07dabe3308b080cfd" - dependencies: - babel-core "^6.24.0" - babel-runtime "^6.22.0" - core-js "^2.4.0" - home-or-tmp "^2.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - source-map-support "^0.4.2" - -babel-register@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" - dependencies: - babel-core "^6.24.1" - babel-runtime "^6.22.0" - core-js "^2.4.0" - home-or-tmp "^2.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - source-map-support "^0.4.2" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-template@^6.22.0, babel-template@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-template@^6.24.1, babel-template@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - lodash "^4.2.0" - -babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: - version "6.23.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.23.0" - babylon "^6.15.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-traverse@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - babylon "^6.17.2" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babel-types@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.11.0, babylon@^6.15.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" - -babylon@^6.17.2: - version "6.17.4" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - -browserslist@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.2.0.tgz#5e35ec993e467c6464b8cb708447386891de9f50" - dependencies: - caniuse-lite "^1.0.30000701" - electron-to-chromium "^1.3.15" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -camelcase@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" - -caniuse-lite@^1.0.30000701: - version "1.0.30000701" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000701.tgz#9d673cf6b74dcb3d5c21d213176b011ac6a45baa" - -chai@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.0.tgz#331a0391b55c3af8740ae9c3b7458bc1c3805e6d" - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^2.0.1" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - -chalk@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -convert-source-map@^1.1.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - dependencies: - ms "^2.1.1" - -debug@^2.1.1, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -deep-eql@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" - dependencies: - type-detect "^3.0.0" - -define-properties@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -electron-to-chromium@^1.3.15: - version "1.3.15" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369" - -end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -erlang-types@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/erlang-types/-/erlang-types-1.0.1.tgz#943a57a9324e0d0edc0273690a8c702686d9b780" - -es-abstract@^1.5.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - -estree-walker@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - dependencies: - locate-path "^3.0.0" - -findup-sync@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - dependencies: - is-buffer "~2.0.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globals@^9.0.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - dependencies: - parse-passwd "^1.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -invariant@^2.2.0, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-buffer@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" - -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - dependencies: - has-symbols "^1.0.0" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" - -js-yaml@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - dependencies: - invert-kv "^2.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - -lodash@^4.2.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - dependencies: - chalk "^2.0.1" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -mem@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025" - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -micromatch@^3.0.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mimic-fn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" - -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.0.2.tgz#cdc1a6fdf66472c079b5605bac59d29807702d2c" - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - findup-sync "2.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.12.0" - log-symbols "2.2.0" - minimatch "3.0.4" - mkdirp "0.5.1" - ms "2.1.1" - node-environment-flags "1.0.4" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "12.0.5" - yargs-parser "11.1.1" - yargs-unparser "1.5.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -ms@2.1.1, ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - -node-environment-flags@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.4.tgz#0b784a6551426bfc16d3b2208424dcbc2b2ff038" - dependencies: - object.getownpropertydescriptors "^2.0.3" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.11, object-keys@^1.0.12: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-is-promise@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" - -p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.1.0.tgz#c1a0f1030e97de018bb2c718929d2af59463e505" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -private@^0.1.6: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" - -regenerator-runtime@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" - -regenerator-transform@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -rollup-plugin-babel@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" - dependencies: - babel-core "6" - babel-plugin-transform-es2015-classes "^6.9.0" - object-assign "^4.1.0" - rollup-pluginutils "^1.5.0" - -rollup-pluginutils@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" - dependencies: - estree-walker "^0.2.1" - minimatch "^3.0.2" - -rollup@^0.45.2: - version "0.45.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.45.2.tgz#63a284c2b31234656f24e9e9717fabb6a7f0fa43" - dependencies: - source-map-support "^0.4.0" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -semver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -semver@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.0, source-map-support@^0.4.2: - version "0.4.14" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - dependencies: - has-flag "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - dependencies: - has-flag "^3.0.0" - -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -type-detect@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" - -type-detect@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@1.3.1, which@^1.2.14, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -"y18n@^3.2.1 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - -yargs-parser@11.1.1, yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" - dependencies: - flat "^4.1.0" - lodash "^4.17.11" - yargs "^12.0.5" - -yargs@12.0.5, yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1"