Showing
7 changed files
with
68 additions
and
1896 deletions
... | @@ -1368,9 +1368,7 @@ | ... | @@ -1368,9 +1368,7 @@ |
1368 | "abbrev": { | 1368 | "abbrev": { |
1369 | "version": "1.1.1", | 1369 | "version": "1.1.1", |
1370 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", | 1370 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", |
1371 | - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", | 1371 | + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" |
1372 | - "dev": true, | ||
1373 | - "optional": true | ||
1374 | }, | 1372 | }, |
1375 | "acorn": { | 1373 | "acorn": { |
1376 | "version": "7.4.1", | 1374 | "version": "7.4.1", |
... | @@ -1433,9 +1431,7 @@ | ... | @@ -1433,9 +1431,7 @@ |
1433 | "ansi-regex": { | 1431 | "ansi-regex": { |
1434 | "version": "2.1.1", | 1432 | "version": "2.1.1", |
1435 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", | 1433 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", |
1436 | - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", | 1434 | + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" |
1437 | - "dev": true, | ||
1438 | - "optional": true | ||
1439 | }, | 1435 | }, |
1440 | "ansi-styles": { | 1436 | "ansi-styles": { |
1441 | "version": "3.2.1", | 1437 | "version": "3.2.1", |
... | @@ -1471,16 +1467,12 @@ | ... | @@ -1471,16 +1467,12 @@ |
1471 | "aproba": { | 1467 | "aproba": { |
1472 | "version": "1.2.0", | 1468 | "version": "1.2.0", |
1473 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", | 1469 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", |
1474 | - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", | 1470 | + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" |
1475 | - "dev": true, | ||
1476 | - "optional": true | ||
1477 | }, | 1471 | }, |
1478 | "are-we-there-yet": { | 1472 | "are-we-there-yet": { |
1479 | "version": "1.1.5", | 1473 | "version": "1.1.5", |
1480 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", | 1474 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", |
1481 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", | 1475 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", |
1482 | - "dev": true, | ||
1483 | - "optional": true, | ||
1484 | "requires": { | 1476 | "requires": { |
1485 | "delegates": "^1.0.0", | 1477 | "delegates": "^1.0.0", |
1486 | "readable-stream": "^2.0.6" | 1478 | "readable-stream": "^2.0.6" |
... | @@ -1670,8 +1662,7 @@ | ... | @@ -1670,8 +1662,7 @@ |
1670 | "balanced-match": { | 1662 | "balanced-match": { |
1671 | "version": "1.0.2", | 1663 | "version": "1.0.2", |
1672 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", | 1664 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", |
1673 | - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", | 1665 | + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" |
1674 | - "dev": true | ||
1675 | }, | 1666 | }, |
1676 | "base": { | 1667 | "base": { |
1677 | "version": "0.11.2", | 1668 | "version": "0.11.2", |
... | @@ -1760,7 +1751,6 @@ | ... | @@ -1760,7 +1751,6 @@ |
1760 | "version": "1.1.11", | 1751 | "version": "1.1.11", |
1761 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | 1752 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
1762 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | 1753 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |
1763 | - "dev": true, | ||
1764 | "requires": { | 1754 | "requires": { |
1765 | "balanced-match": "^1.0.0", | 1755 | "balanced-match": "^1.0.0", |
1766 | "concat-map": "0.0.1" | 1756 | "concat-map": "0.0.1" |
... | @@ -1861,8 +1851,6 @@ | ... | @@ -1861,8 +1851,6 @@ |
1861 | "version": "2.7.0", | 1851 | "version": "2.7.0", |
1862 | "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.7.0.tgz", | 1852 | "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.7.0.tgz", |
1863 | "integrity": "sha512-pzCxtkHb+5su5MQjTtepMDlIOtaXo277x0C0u3nMOxtkhTyQ+h2yNKhlROAaDllWgRyePAUitC08sXw26Eb6aw==", | 1853 | "integrity": "sha512-pzCxtkHb+5su5MQjTtepMDlIOtaXo277x0C0u3nMOxtkhTyQ+h2yNKhlROAaDllWgRyePAUitC08sXw26Eb6aw==", |
1864 | - "dev": true, | ||
1865 | - "optional": true, | ||
1866 | "requires": { | 1854 | "requires": { |
1867 | "nan": "^2.14.0", | 1855 | "nan": "^2.14.0", |
1868 | "node-pre-gyp": "^0.15.0", | 1856 | "node-pre-gyp": "^0.15.0", |
... | @@ -1873,8 +1861,6 @@ | ... | @@ -1873,8 +1861,6 @@ |
1873 | "version": "0.15.0", | 1861 | "version": "0.15.0", |
1874 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", | 1862 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", |
1875 | "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", | 1863 | "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", |
1876 | - "dev": true, | ||
1877 | - "optional": true, | ||
1878 | "requires": { | 1864 | "requires": { |
1879 | "detect-libc": "^1.0.2", | 1865 | "detect-libc": "^1.0.2", |
1880 | "mkdirp": "^0.5.3", | 1866 | "mkdirp": "^0.5.3", |
... | @@ -2014,9 +2000,7 @@ | ... | @@ -2014,9 +2000,7 @@ |
2014 | "chownr": { | 2000 | "chownr": { |
2015 | "version": "1.1.4", | 2001 | "version": "1.1.4", |
2016 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", | 2002 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", |
2017 | - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", | 2003 | + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" |
2018 | - "dev": true, | ||
2019 | - "optional": true | ||
2020 | }, | 2004 | }, |
2021 | "chrome-trace-event": { | 2005 | "chrome-trace-event": { |
2022 | "version": "1.0.3", | 2006 | "version": "1.0.3", |
... | @@ -2063,9 +2047,7 @@ | ... | @@ -2063,9 +2047,7 @@ |
2063 | "code-point-at": { | 2047 | "code-point-at": { |
2064 | "version": "1.1.0", | 2048 | "version": "1.1.0", |
2065 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", | 2049 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", |
2066 | - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", | 2050 | + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" |
2067 | - "dev": true, | ||
2068 | - "optional": true | ||
2069 | }, | 2051 | }, |
2070 | "collection-visit": { | 2052 | "collection-visit": { |
2071 | "version": "1.0.0", | 2053 | "version": "1.0.0", |
... | @@ -2129,15 +2111,12 @@ | ... | @@ -2129,15 +2111,12 @@ |
2129 | "concat-map": { | 2111 | "concat-map": { |
2130 | "version": "0.0.1", | 2112 | "version": "0.0.1", |
2131 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | 2113 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", |
2132 | - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | 2114 | + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" |
2133 | - "dev": true | ||
2134 | }, | 2115 | }, |
2135 | "console-control-strings": { | 2116 | "console-control-strings": { |
2136 | "version": "1.1.0", | 2117 | "version": "1.1.0", |
2137 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", | 2118 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", |
2138 | - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", | 2119 | + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" |
2139 | - "dev": true, | ||
2140 | - "optional": true | ||
2141 | }, | 2120 | }, |
2142 | "convert-source-map": { | 2121 | "convert-source-map": { |
2143 | "version": "1.7.0", | 2122 | "version": "1.7.0", |
... | @@ -2176,9 +2155,7 @@ | ... | @@ -2176,9 +2155,7 @@ |
2176 | "core-util-is": { | 2155 | "core-util-is": { |
2177 | "version": "1.0.2", | 2156 | "version": "1.0.2", |
2178 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", | 2157 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", |
2179 | - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", | 2158 | + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" |
2180 | - "dev": true, | ||
2181 | - "optional": true | ||
2182 | }, | 2159 | }, |
2183 | "cross-spawn": { | 2160 | "cross-spawn": { |
2184 | "version": "7.0.3", | 2161 | "version": "7.0.3", |
... | @@ -2243,8 +2220,6 @@ | ... | @@ -2243,8 +2220,6 @@ |
2243 | "version": "3.2.7", | 2220 | "version": "3.2.7", |
2244 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", | 2221 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", |
2245 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", | 2222 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", |
2246 | - "dev": true, | ||
2247 | - "optional": true, | ||
2248 | "requires": { | 2223 | "requires": { |
2249 | "ms": "^2.1.1" | 2224 | "ms": "^2.1.1" |
2250 | } | 2225 | } |
... | @@ -2260,8 +2235,6 @@ | ... | @@ -2260,8 +2235,6 @@ |
2260 | "version": "4.2.1", | 2235 | "version": "4.2.1", |
2261 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", | 2236 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", |
2262 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", | 2237 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", |
2263 | - "dev": true, | ||
2264 | - "optional": true, | ||
2265 | "requires": { | 2238 | "requires": { |
2266 | "mimic-response": "^2.0.0" | 2239 | "mimic-response": "^2.0.0" |
2267 | } | 2240 | } |
... | @@ -2269,9 +2242,7 @@ | ... | @@ -2269,9 +2242,7 @@ |
2269 | "deep-extend": { | 2242 | "deep-extend": { |
2270 | "version": "0.6.0", | 2243 | "version": "0.6.0", |
2271 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", | 2244 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", |
2272 | - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", | 2245 | + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" |
2273 | - "dev": true, | ||
2274 | - "optional": true | ||
2275 | }, | 2246 | }, |
2276 | "deep-is": { | 2247 | "deep-is": { |
2277 | "version": "0.1.3", | 2248 | "version": "0.1.3", |
... | @@ -2344,16 +2315,12 @@ | ... | @@ -2344,16 +2315,12 @@ |
2344 | "delegates": { | 2315 | "delegates": { |
2345 | "version": "1.0.0", | 2316 | "version": "1.0.0", |
2346 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", | 2317 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", |
2347 | - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", | 2318 | + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" |
2348 | - "dev": true, | ||
2349 | - "optional": true | ||
2350 | }, | 2319 | }, |
2351 | "detect-libc": { | 2320 | "detect-libc": { |
2352 | "version": "1.0.3", | 2321 | "version": "1.0.3", |
2353 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", | 2322 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", |
2354 | - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", | 2323 | + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" |
2355 | - "dev": true, | ||
2356 | - "optional": true | ||
2357 | }, | 2324 | }, |
2358 | "domexception": { | 2325 | "domexception": { |
2359 | "version": "1.0.1", | 2326 | "version": "1.0.1", |
... | @@ -2382,6 +2349,11 @@ | ... | @@ -2382,6 +2349,11 @@ |
2382 | "integrity": "sha512-XbklBVCDiUeho0PZQCjC25Ha6uBwqqJeyDhPLwLwfWRAo4x+FZFsmu1pPPkXT+B4MQMQoQULfyaMltDopfeiHQ==", | 2349 | "integrity": "sha512-XbklBVCDiUeho0PZQCjC25Ha6uBwqqJeyDhPLwLwfWRAo4x+FZFsmu1pPPkXT+B4MQMQoQULfyaMltDopfeiHQ==", |
2383 | "dev": true | 2350 | "dev": true |
2384 | }, | 2351 | }, |
2352 | + "emitter-component": { | ||
2353 | + "version": "1.1.1", | ||
2354 | + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz", | ||
2355 | + "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=" | ||
2356 | + }, | ||
2385 | "emojis-list": { | 2357 | "emojis-list": { |
2386 | "version": "3.0.0", | 2358 | "version": "3.0.0", |
2387 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", | 2359 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", |
... | @@ -2814,8 +2786,6 @@ | ... | @@ -2814,8 +2786,6 @@ |
2814 | "version": "1.2.7", | 2786 | "version": "1.2.7", |
2815 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", | 2787 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", |
2816 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", | 2788 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", |
2817 | - "dev": true, | ||
2818 | - "optional": true, | ||
2819 | "requires": { | 2789 | "requires": { |
2820 | "minipass": "^2.6.0" | 2790 | "minipass": "^2.6.0" |
2821 | } | 2791 | } |
... | @@ -2829,8 +2799,7 @@ | ... | @@ -2829,8 +2799,7 @@ |
2829 | "fs.realpath": { | 2799 | "fs.realpath": { |
2830 | "version": "1.0.0", | 2800 | "version": "1.0.0", |
2831 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | 2801 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", |
2832 | - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | 2802 | + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" |
2833 | - "dev": true | ||
2834 | }, | 2803 | }, |
2835 | "fsevents": { | 2804 | "fsevents": { |
2836 | "version": "2.3.2", | 2805 | "version": "2.3.2", |
... | @@ -2849,8 +2818,6 @@ | ... | @@ -2849,8 +2818,6 @@ |
2849 | "version": "2.7.4", | 2818 | "version": "2.7.4", |
2850 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", | 2819 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", |
2851 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", | 2820 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", |
2852 | - "dev": true, | ||
2853 | - "optional": true, | ||
2854 | "requires": { | 2821 | "requires": { |
2855 | "aproba": "^1.0.3", | 2822 | "aproba": "^1.0.3", |
2856 | "console-control-strings": "^1.0.0", | 2823 | "console-control-strings": "^1.0.0", |
... | @@ -2902,11 +2869,18 @@ | ... | @@ -2902,11 +2869,18 @@ |
2902 | "assert-plus": "^1.0.0" | 2869 | "assert-plus": "^1.0.0" |
2903 | } | 2870 | } |
2904 | }, | 2871 | }, |
2872 | + "gifencoder": { | ||
2873 | + "version": "2.0.1", | ||
2874 | + "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz", | ||
2875 | + "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==", | ||
2876 | + "requires": { | ||
2877 | + "canvas": "^2.2.0" | ||
2878 | + } | ||
2879 | + }, | ||
2905 | "glob": { | 2880 | "glob": { |
2906 | "version": "7.1.6", | 2881 | "version": "7.1.6", |
2907 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", | 2882 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", |
2908 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | 2883 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", |
2909 | - "dev": true, | ||
2910 | "requires": { | 2884 | "requires": { |
2911 | "fs.realpath": "^1.0.0", | 2885 | "fs.realpath": "^1.0.0", |
2912 | "inflight": "^1.0.4", | 2886 | "inflight": "^1.0.4", |
... | @@ -2997,9 +2971,7 @@ | ... | @@ -2997,9 +2971,7 @@ |
2997 | "has-unicode": { | 2971 | "has-unicode": { |
2998 | "version": "2.0.1", | 2972 | "version": "2.0.1", |
2999 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", | 2973 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", |
3000 | - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", | 2974 | + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" |
3001 | - "dev": true, | ||
3002 | - "optional": true | ||
3003 | }, | 2975 | }, |
3004 | "has-value": { | 2976 | "has-value": { |
3005 | "version": "1.0.0", | 2977 | "version": "1.0.0", |
... | @@ -3068,8 +3040,6 @@ | ... | @@ -3068,8 +3040,6 @@ |
3068 | "version": "0.4.24", | 3040 | "version": "0.4.24", |
3069 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", | 3041 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", |
3070 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", | 3042 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", |
3071 | - "dev": true, | ||
3072 | - "optional": true, | ||
3073 | "requires": { | 3043 | "requires": { |
3074 | "safer-buffer": ">= 2.1.2 < 3" | 3044 | "safer-buffer": ">= 2.1.2 < 3" |
3075 | } | 3045 | } |
... | @@ -3078,8 +3048,6 @@ | ... | @@ -3078,8 +3048,6 @@ |
3078 | "version": "3.0.3", | 3048 | "version": "3.0.3", |
3079 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", | 3049 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", |
3080 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", | 3050 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", |
3081 | - "dev": true, | ||
3082 | - "optional": true, | ||
3083 | "requires": { | 3051 | "requires": { |
3084 | "minimatch": "^3.0.4" | 3052 | "minimatch": "^3.0.4" |
3085 | } | 3053 | } |
... | @@ -3098,7 +3066,6 @@ | ... | @@ -3098,7 +3066,6 @@ |
3098 | "version": "1.0.6", | 3066 | "version": "1.0.6", |
3099 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | 3067 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |
3100 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | 3068 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", |
3101 | - "dev": true, | ||
3102 | "requires": { | 3069 | "requires": { |
3103 | "once": "^1.3.0", | 3070 | "once": "^1.3.0", |
3104 | "wrappy": "1" | 3071 | "wrappy": "1" |
... | @@ -3107,15 +3074,12 @@ | ... | @@ -3107,15 +3074,12 @@ |
3107 | "inherits": { | 3074 | "inherits": { |
3108 | "version": "2.0.4", | 3075 | "version": "2.0.4", |
3109 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | 3076 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |
3110 | - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | 3077 | + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |
3111 | - "dev": true | ||
3112 | }, | 3078 | }, |
3113 | "ini": { | 3079 | "ini": { |
3114 | "version": "1.3.8", | 3080 | "version": "1.3.8", |
3115 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", | 3081 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", |
3116 | - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", | 3082 | + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" |
3117 | - "dev": true, | ||
3118 | - "optional": true | ||
3119 | }, | 3083 | }, |
3120 | "interpret": { | 3084 | "interpret": { |
3121 | "version": "2.2.0", | 3085 | "version": "2.2.0", |
... | @@ -3239,8 +3203,6 @@ | ... | @@ -3239,8 +3203,6 @@ |
3239 | "version": "1.0.0", | 3203 | "version": "1.0.0", |
3240 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", | 3204 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", |
3241 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | 3205 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", |
3242 | - "dev": true, | ||
3243 | - "optional": true, | ||
3244 | "requires": { | 3206 | "requires": { |
3245 | "number-is-nan": "^1.0.0" | 3207 | "number-is-nan": "^1.0.0" |
3246 | } | 3208 | } |
... | @@ -3309,9 +3271,7 @@ | ... | @@ -3309,9 +3271,7 @@ |
3309 | "isarray": { | 3271 | "isarray": { |
3310 | "version": "1.0.0", | 3272 | "version": "1.0.0", |
3311 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | 3273 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", |
3312 | - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", | 3274 | + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" |
3313 | - "dev": true, | ||
3314 | - "optional": true | ||
3315 | }, | 3275 | }, |
3316 | "isexe": { | 3276 | "isexe": { |
3317 | "version": "2.0.0", | 3277 | "version": "2.0.0", |
... | @@ -3611,15 +3571,12 @@ | ... | @@ -3611,15 +3571,12 @@ |
3611 | "mimic-response": { | 3571 | "mimic-response": { |
3612 | "version": "2.1.0", | 3572 | "version": "2.1.0", |
3613 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", | 3573 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", |
3614 | - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", | 3574 | + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" |
3615 | - "dev": true, | ||
3616 | - "optional": true | ||
3617 | }, | 3575 | }, |
3618 | "minimatch": { | 3576 | "minimatch": { |
3619 | "version": "3.0.4", | 3577 | "version": "3.0.4", |
3620 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | 3578 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", |
3621 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | 3579 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", |
3622 | - "dev": true, | ||
3623 | "requires": { | 3580 | "requires": { |
3624 | "brace-expansion": "^1.1.7" | 3581 | "brace-expansion": "^1.1.7" |
3625 | } | 3582 | } |
... | @@ -3627,15 +3584,12 @@ | ... | @@ -3627,15 +3584,12 @@ |
3627 | "minimist": { | 3584 | "minimist": { |
3628 | "version": "1.2.5", | 3585 | "version": "1.2.5", |
3629 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | 3586 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", |
3630 | - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | 3587 | + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" |
3631 | - "dev": true | ||
3632 | }, | 3588 | }, |
3633 | "minipass": { | 3589 | "minipass": { |
3634 | "version": "2.9.0", | 3590 | "version": "2.9.0", |
3635 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", | 3591 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", |
3636 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", | 3592 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", |
3637 | - "dev": true, | ||
3638 | - "optional": true, | ||
3639 | "requires": { | 3593 | "requires": { |
3640 | "safe-buffer": "^5.1.2", | 3594 | "safe-buffer": "^5.1.2", |
3641 | "yallist": "^3.0.0" | 3595 | "yallist": "^3.0.0" |
... | @@ -3645,8 +3599,6 @@ | ... | @@ -3645,8 +3599,6 @@ |
3645 | "version": "1.3.3", | 3599 | "version": "1.3.3", |
3646 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", | 3600 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", |
3647 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", | 3601 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", |
3648 | - "dev": true, | ||
3649 | - "optional": true, | ||
3650 | "requires": { | 3602 | "requires": { |
3651 | "minipass": "^2.9.0" | 3603 | "minipass": "^2.9.0" |
3652 | } | 3604 | } |
... | @@ -3678,8 +3630,6 @@ | ... | @@ -3678,8 +3630,6 @@ |
3678 | "version": "0.5.5", | 3630 | "version": "0.5.5", |
3679 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", | 3631 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", |
3680 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", | 3632 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", |
3681 | - "dev": true, | ||
3682 | - "optional": true, | ||
3683 | "requires": { | 3633 | "requires": { |
3684 | "minimist": "^1.2.5" | 3634 | "minimist": "^1.2.5" |
3685 | } | 3635 | } |
... | @@ -3687,16 +3637,12 @@ | ... | @@ -3687,16 +3637,12 @@ |
3687 | "ms": { | 3637 | "ms": { |
3688 | "version": "2.1.3", | 3638 | "version": "2.1.3", |
3689 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | 3639 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", |
3690 | - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", | 3640 | + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" |
3691 | - "dev": true, | ||
3692 | - "optional": true | ||
3693 | }, | 3641 | }, |
3694 | "nan": { | 3642 | "nan": { |
3695 | "version": "2.14.2", | 3643 | "version": "2.14.2", |
3696 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", | 3644 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", |
3697 | - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", | 3645 | + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" |
3698 | - "dev": true, | ||
3699 | - "optional": true | ||
3700 | }, | 3646 | }, |
3701 | "nanomatch": { | 3647 | "nanomatch": { |
3702 | "version": "1.2.13", | 3648 | "version": "1.2.13", |
... | @@ -3722,8 +3668,6 @@ | ... | @@ -3722,8 +3668,6 @@ |
3722 | "version": "2.6.0", | 3668 | "version": "2.6.0", |
3723 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", | 3669 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", |
3724 | "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", | 3670 | "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", |
3725 | - "dev": true, | ||
3726 | - "optional": true, | ||
3727 | "requires": { | 3671 | "requires": { |
3728 | "debug": "^3.2.6", | 3672 | "debug": "^3.2.6", |
3729 | "iconv-lite": "^0.4.4", | 3673 | "iconv-lite": "^0.4.4", |
... | @@ -3746,8 +3690,6 @@ | ... | @@ -3746,8 +3690,6 @@ |
3746 | "version": "4.0.3", | 3690 | "version": "4.0.3", |
3747 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", | 3691 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", |
3748 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", | 3692 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", |
3749 | - "dev": true, | ||
3750 | - "optional": true, | ||
3751 | "requires": { | 3693 | "requires": { |
3752 | "abbrev": "1", | 3694 | "abbrev": "1", |
3753 | "osenv": "^0.1.4" | 3695 | "osenv": "^0.1.4" |
... | @@ -3764,8 +3706,6 @@ | ... | @@ -3764,8 +3706,6 @@ |
3764 | "version": "1.1.1", | 3706 | "version": "1.1.1", |
3765 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", | 3707 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", |
3766 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", | 3708 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", |
3767 | - "dev": true, | ||
3768 | - "optional": true, | ||
3769 | "requires": { | 3709 | "requires": { |
3770 | "npm-normalize-package-bin": "^1.0.1" | 3710 | "npm-normalize-package-bin": "^1.0.1" |
3771 | } | 3711 | } |
... | @@ -3773,16 +3713,12 @@ | ... | @@ -3773,16 +3713,12 @@ |
3773 | "npm-normalize-package-bin": { | 3713 | "npm-normalize-package-bin": { |
3774 | "version": "1.0.1", | 3714 | "version": "1.0.1", |
3775 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", | 3715 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", |
3776 | - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", | 3716 | + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" |
3777 | - "dev": true, | ||
3778 | - "optional": true | ||
3779 | }, | 3717 | }, |
3780 | "npm-packlist": { | 3718 | "npm-packlist": { |
3781 | "version": "1.4.8", | 3719 | "version": "1.4.8", |
3782 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", | 3720 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", |
3783 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", | 3721 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", |
3784 | - "dev": true, | ||
3785 | - "optional": true, | ||
3786 | "requires": { | 3722 | "requires": { |
3787 | "ignore-walk": "^3.0.1", | 3723 | "ignore-walk": "^3.0.1", |
3788 | "npm-bundled": "^1.0.1", | 3724 | "npm-bundled": "^1.0.1", |
... | @@ -3802,8 +3738,6 @@ | ... | @@ -3802,8 +3738,6 @@ |
3802 | "version": "4.1.2", | 3738 | "version": "4.1.2", |
3803 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", | 3739 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", |
3804 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", | 3740 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", |
3805 | - "dev": true, | ||
3806 | - "optional": true, | ||
3807 | "requires": { | 3741 | "requires": { |
3808 | "are-we-there-yet": "~1.1.2", | 3742 | "are-we-there-yet": "~1.1.2", |
3809 | "console-control-strings": "~1.1.0", | 3743 | "console-control-strings": "~1.1.0", |
... | @@ -3814,9 +3748,7 @@ | ... | @@ -3814,9 +3748,7 @@ |
3814 | "number-is-nan": { | 3748 | "number-is-nan": { |
3815 | "version": "1.0.1", | 3749 | "version": "1.0.1", |
3816 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", | 3750 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", |
3817 | - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", | 3751 | + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" |
3818 | - "dev": true, | ||
3819 | - "optional": true | ||
3820 | }, | 3752 | }, |
3821 | "nwsapi": { | 3753 | "nwsapi": { |
3822 | "version": "2.2.0", | 3754 | "version": "2.2.0", |
... | @@ -3835,9 +3767,7 @@ | ... | @@ -3835,9 +3767,7 @@ |
3835 | "object-assign": { | 3767 | "object-assign": { |
3836 | "version": "4.1.1", | 3768 | "version": "4.1.1", |
3837 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | 3769 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", |
3838 | - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", | 3770 | + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" |
3839 | - "dev": true, | ||
3840 | - "optional": true | ||
3841 | }, | 3771 | }, |
3842 | "object-copy": { | 3772 | "object-copy": { |
3843 | "version": "0.1.0", | 3773 | "version": "0.1.0", |
... | @@ -3915,7 +3845,6 @@ | ... | @@ -3915,7 +3845,6 @@ |
3915 | "version": "1.4.0", | 3845 | "version": "1.4.0", |
3916 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | 3846 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", |
3917 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | 3847 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", |
3918 | - "dev": true, | ||
3919 | "requires": { | 3848 | "requires": { |
3920 | "wrappy": "1" | 3849 | "wrappy": "1" |
3921 | } | 3850 | } |
... | @@ -3947,23 +3876,17 @@ | ... | @@ -3947,23 +3876,17 @@ |
3947 | "os-homedir": { | 3876 | "os-homedir": { |
3948 | "version": "1.0.2", | 3877 | "version": "1.0.2", |
3949 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", | 3878 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", |
3950 | - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", | 3879 | + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" |
3951 | - "dev": true, | ||
3952 | - "optional": true | ||
3953 | }, | 3880 | }, |
3954 | "os-tmpdir": { | 3881 | "os-tmpdir": { |
3955 | "version": "1.0.2", | 3882 | "version": "1.0.2", |
3956 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", | 3883 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", |
3957 | - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", | 3884 | + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" |
3958 | - "dev": true, | ||
3959 | - "optional": true | ||
3960 | }, | 3885 | }, |
3961 | "osenv": { | 3886 | "osenv": { |
3962 | "version": "0.1.5", | 3887 | "version": "0.1.5", |
3963 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", | 3888 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", |
3964 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", | 3889 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", |
3965 | - "dev": true, | ||
3966 | - "optional": true, | ||
3967 | "requires": { | 3890 | "requires": { |
3968 | "os-homedir": "^1.0.0", | 3891 | "os-homedir": "^1.0.0", |
3969 | "os-tmpdir": "^1.0.0" | 3892 | "os-tmpdir": "^1.0.0" |
... | @@ -4034,8 +3957,7 @@ | ... | @@ -4034,8 +3957,7 @@ |
4034 | "path-is-absolute": { | 3957 | "path-is-absolute": { |
4035 | "version": "1.0.1", | 3958 | "version": "1.0.1", |
4036 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | 3959 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", |
4037 | - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | 3960 | + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" |
4038 | - "dev": true | ||
4039 | }, | 3961 | }, |
4040 | "path-key": { | 3962 | "path-key": { |
4041 | "version": "3.1.1", | 3963 | "version": "3.1.1", |
... | @@ -4102,9 +4024,7 @@ | ... | @@ -4102,9 +4024,7 @@ |
4102 | "process-nextick-args": { | 4024 | "process-nextick-args": { |
4103 | "version": "2.0.1", | 4025 | "version": "2.0.1", |
4104 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | 4026 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", |
4105 | - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", | 4027 | + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" |
4106 | - "dev": true, | ||
4107 | - "optional": true | ||
4108 | }, | 4028 | }, |
4109 | "psl": { | 4029 | "psl": { |
4110 | "version": "1.8.0", | 4030 | "version": "1.8.0", |
... | @@ -4139,8 +4059,6 @@ | ... | @@ -4139,8 +4059,6 @@ |
4139 | "version": "1.2.8", | 4059 | "version": "1.2.8", |
4140 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", | 4060 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", |
4141 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | 4061 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", |
4142 | - "dev": true, | ||
4143 | - "optional": true, | ||
4144 | "requires": { | 4062 | "requires": { |
4145 | "deep-extend": "^0.6.0", | 4063 | "deep-extend": "^0.6.0", |
4146 | "ini": "~1.3.0", | 4064 | "ini": "~1.3.0", |
... | @@ -4152,8 +4070,6 @@ | ... | @@ -4152,8 +4070,6 @@ |
4152 | "version": "2.3.7", | 4070 | "version": "2.3.7", |
4153 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | 4071 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", |
4154 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | 4072 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", |
4155 | - "dev": true, | ||
4156 | - "optional": true, | ||
4157 | "requires": { | 4073 | "requires": { |
4158 | "core-util-is": "~1.0.0", | 4074 | "core-util-is": "~1.0.0", |
4159 | "inherits": "~2.0.3", | 4075 | "inherits": "~2.0.3", |
... | @@ -4404,8 +4320,6 @@ | ... | @@ -4404,8 +4320,6 @@ |
4404 | "version": "2.7.1", | 4320 | "version": "2.7.1", |
4405 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", | 4321 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", |
4406 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", | 4322 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", |
4407 | - "dev": true, | ||
4408 | - "optional": true, | ||
4409 | "requires": { | 4323 | "requires": { |
4410 | "glob": "^7.1.3" | 4324 | "glob": "^7.1.3" |
4411 | } | 4325 | } |
... | @@ -4413,8 +4327,7 @@ | ... | @@ -4413,8 +4327,7 @@ |
4413 | "safe-buffer": { | 4327 | "safe-buffer": { |
4414 | "version": "5.1.2", | 4328 | "version": "5.1.2", |
4415 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | 4329 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
4416 | - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", | 4330 | + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
4417 | - "dev": true | ||
4418 | }, | 4331 | }, |
4419 | "safe-regex": { | 4332 | "safe-regex": { |
4420 | "version": "1.1.0", | 4333 | "version": "1.1.0", |
... | @@ -4429,16 +4342,12 @@ | ... | @@ -4429,16 +4342,12 @@ |
4429 | "safer-buffer": { | 4342 | "safer-buffer": { |
4430 | "version": "2.1.2", | 4343 | "version": "2.1.2", |
4431 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | 4344 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
4432 | - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", | 4345 | + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |
4433 | - "dev": true, | ||
4434 | - "optional": true | ||
4435 | }, | 4346 | }, |
4436 | "sax": { | 4347 | "sax": { |
4437 | "version": "1.2.4", | 4348 | "version": "1.2.4", |
4438 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", | 4349 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", |
4439 | - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", | 4350 | + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" |
4440 | - "dev": true, | ||
4441 | - "optional": true | ||
4442 | }, | 4351 | }, |
4443 | "saxes": { | 4352 | "saxes": { |
4444 | "version": "3.1.11", | 4353 | "version": "3.1.11", |
... | @@ -4464,8 +4373,7 @@ | ... | @@ -4464,8 +4373,7 @@ |
4464 | "semver": { | 4373 | "semver": { |
4465 | "version": "5.7.1", | 4374 | "version": "5.7.1", |
4466 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", | 4375 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", |
4467 | - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", | 4376 | + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" |
4468 | - "dev": true | ||
4469 | }, | 4377 | }, |
4470 | "serialize-javascript": { | 4378 | "serialize-javascript": { |
4471 | "version": "5.0.1", | 4379 | "version": "5.0.1", |
... | @@ -4479,9 +4387,7 @@ | ... | @@ -4479,9 +4387,7 @@ |
4479 | "set-blocking": { | 4387 | "set-blocking": { |
4480 | "version": "2.0.0", | 4388 | "version": "2.0.0", |
4481 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", | 4389 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", |
4482 | - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", | 4390 | + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" |
4483 | - "dev": true, | ||
4484 | - "optional": true | ||
4485 | }, | 4391 | }, |
4486 | "set-value": { | 4392 | "set-value": { |
4487 | "version": "2.0.1", | 4393 | "version": "2.0.1", |
... | @@ -4535,22 +4441,17 @@ | ... | @@ -4535,22 +4441,17 @@ |
4535 | "signal-exit": { | 4441 | "signal-exit": { |
4536 | "version": "3.0.3", | 4442 | "version": "3.0.3", |
4537 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", | 4443 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", |
4538 | - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", | 4444 | + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" |
4539 | - "dev": true | ||
4540 | }, | 4445 | }, |
4541 | "simple-concat": { | 4446 | "simple-concat": { |
4542 | "version": "1.0.1", | 4447 | "version": "1.0.1", |
4543 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", | 4448 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", |
4544 | - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", | 4449 | + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" |
4545 | - "dev": true, | ||
4546 | - "optional": true | ||
4547 | }, | 4450 | }, |
4548 | "simple-get": { | 4451 | "simple-get": { |
4549 | "version": "3.1.0", | 4452 | "version": "3.1.0", |
4550 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", | 4453 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", |
4551 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", | 4454 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", |
4552 | - "dev": true, | ||
4553 | - "optional": true, | ||
4554 | "requires": { | 4455 | "requires": { |
4555 | "decompress-response": "^4.2.0", | 4456 | "decompress-response": "^4.2.0", |
4556 | "once": "^1.3.1", | 4457 | "once": "^1.3.1", |
... | @@ -4805,12 +4706,18 @@ | ... | @@ -4805,12 +4706,18 @@ |
4805 | "dev": true, | 4706 | "dev": true, |
4806 | "optional": true | 4707 | "optional": true |
4807 | }, | 4708 | }, |
4709 | + "stream": { | ||
4710 | + "version": "0.0.2", | ||
4711 | + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", | ||
4712 | + "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=", | ||
4713 | + "requires": { | ||
4714 | + "emitter-component": "^1.1.1" | ||
4715 | + } | ||
4716 | + }, | ||
4808 | "string-width": { | 4717 | "string-width": { |
4809 | "version": "1.0.2", | 4718 | "version": "1.0.2", |
4810 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", | 4719 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", |
4811 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | 4720 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", |
4812 | - "dev": true, | ||
4813 | - "optional": true, | ||
4814 | "requires": { | 4721 | "requires": { |
4815 | "code-point-at": "^1.0.0", | 4722 | "code-point-at": "^1.0.0", |
4816 | "is-fullwidth-code-point": "^1.0.0", | 4723 | "is-fullwidth-code-point": "^1.0.0", |
... | @@ -4821,8 +4728,6 @@ | ... | @@ -4821,8 +4728,6 @@ |
4821 | "version": "1.1.1", | 4728 | "version": "1.1.1", |
4822 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | 4729 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", |
4823 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | 4730 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", |
4824 | - "dev": true, | ||
4825 | - "optional": true, | ||
4826 | "requires": { | 4731 | "requires": { |
4827 | "safe-buffer": "~5.1.0" | 4732 | "safe-buffer": "~5.1.0" |
4828 | } | 4733 | } |
... | @@ -4831,8 +4736,6 @@ | ... | @@ -4831,8 +4736,6 @@ |
4831 | "version": "3.0.1", | 4736 | "version": "3.0.1", |
4832 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", | 4737 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", |
4833 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | 4738 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", |
4834 | - "dev": true, | ||
4835 | - "optional": true, | ||
4836 | "requires": { | 4739 | "requires": { |
4837 | "ansi-regex": "^2.0.0" | 4740 | "ansi-regex": "^2.0.0" |
4838 | } | 4741 | } |
... | @@ -4846,9 +4749,7 @@ | ... | @@ -4846,9 +4749,7 @@ |
4846 | "strip-json-comments": { | 4749 | "strip-json-comments": { |
4847 | "version": "2.0.1", | 4750 | "version": "2.0.1", |
4848 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | 4751 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", |
4849 | - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", | 4752 | + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" |
4850 | - "dev": true, | ||
4851 | - "optional": true | ||
4852 | }, | 4753 | }, |
4853 | "supports-color": { | 4754 | "supports-color": { |
4854 | "version": "5.5.0", | 4755 | "version": "5.5.0", |
... | @@ -4875,8 +4776,6 @@ | ... | @@ -4875,8 +4776,6 @@ |
4875 | "version": "4.4.13", | 4776 | "version": "4.4.13", |
4876 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", | 4777 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", |
4877 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", | 4778 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", |
4878 | - "dev": true, | ||
4879 | - "optional": true, | ||
4880 | "requires": { | 4779 | "requires": { |
4881 | "chownr": "^1.1.1", | 4780 | "chownr": "^1.1.1", |
4882 | "fs-minipass": "^1.2.5", | 4781 | "fs-minipass": "^1.2.5", |
... | @@ -5144,9 +5043,7 @@ | ... | @@ -5144,9 +5043,7 @@ |
5144 | "util-deprecate": { | 5043 | "util-deprecate": { |
5145 | "version": "1.0.2", | 5044 | "version": "1.0.2", |
5146 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | 5045 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |
5147 | - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", | 5046 | + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" |
5148 | - "dev": true, | ||
5149 | - "optional": true | ||
5150 | }, | 5047 | }, |
5151 | "uuid": { | 5048 | "uuid": { |
5152 | "version": "3.4.0", | 5049 | "version": "3.4.0", |
... | @@ -5343,8 +5240,6 @@ | ... | @@ -5343,8 +5240,6 @@ |
5343 | "version": "1.1.3", | 5240 | "version": "1.1.3", |
5344 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", | 5241 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", |
5345 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", | 5242 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", |
5346 | - "dev": true, | ||
5347 | - "optional": true, | ||
5348 | "requires": { | 5243 | "requires": { |
5349 | "string-width": "^1.0.2 || 2" | 5244 | "string-width": "^1.0.2 || 2" |
5350 | } | 5245 | } |
... | @@ -5365,8 +5260,7 @@ | ... | @@ -5365,8 +5260,7 @@ |
5365 | "wrappy": { | 5260 | "wrappy": { |
5366 | "version": "1.0.2", | 5261 | "version": "1.0.2", |
5367 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | 5262 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", |
5368 | - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | 5263 | + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" |
5369 | - "dev": true | ||
5370 | }, | 5264 | }, |
5371 | "ws": { | 5265 | "ws": { |
5372 | "version": "7.4.4", | 5266 | "version": "7.4.4", |
... | @@ -5392,9 +5286,7 @@ | ... | @@ -5392,9 +5286,7 @@ |
5392 | "yallist": { | 5286 | "yallist": { |
5393 | "version": "3.1.1", | 5287 | "version": "3.1.1", |
5394 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", | 5288 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", |
5395 | - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", | 5289 | + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" |
5396 | - "dev": true, | ||
5397 | - "optional": true | ||
5398 | }, | 5290 | }, |
5399 | "yocto-queue": { | 5291 | "yocto-queue": { |
5400 | "version": "0.1.0", | 5292 | "version": "0.1.0", | ... | ... |
... | @@ -19,6 +19,8 @@ | ... | @@ -19,6 +19,8 @@ |
19 | "webpack-cli": "^4.6.0" | 19 | "webpack-cli": "^4.6.0" |
20 | }, | 20 | }, |
21 | "dependencies": { | 21 | "dependencies": { |
22 | - "@babel/plugin-proposal-class-properties": "^7.13.0" | 22 | + "@babel/plugin-proposal-class-properties": "^7.13.0", |
23 | + "gifencoder": "^2.0.1", | ||
24 | + "stream": "0.0.2" | ||
23 | } | 25 | } |
24 | } | 26 | } | ... | ... |
1 | -import GIF from "./lib/GIFEncoder"; | 1 | +import GIF from "gifencoder"; |
2 | 2 | ||
3 | class GifGenerator { | 3 | class GifGenerator { |
4 | constructor(canvas) { | 4 | constructor(canvas) { |
... | @@ -7,32 +7,22 @@ class GifGenerator { | ... | @@ -7,32 +7,22 @@ class GifGenerator { |
7 | this.height = canvas.getHeight(); | 7 | this.height = canvas.getHeight(); |
8 | this.gif = new GIF(this.width, this.height); | 8 | this.gif = new GIF(this.width, this.height); |
9 | 9 | ||
10 | - this.gif.writeHeader(); | 10 | + this.gif.start(); |
11 | this.gif.setTransparent(null); | 11 | this.gif.setTransparent(null); |
12 | this.gif.setRepeat(0); | 12 | this.gif.setRepeat(0); |
13 | this.gif.setQuality(10); | 13 | this.gif.setQuality(10); |
14 | - this.gif.setDither(false); | ||
15 | - this.gif.setGlobalPalette(false); | ||
16 | } | 14 | } |
17 | 15 | ||
18 | addFrame(delay = 0) { | 16 | addFrame(delay = 0) { |
19 | this.gif.setDelay(delay); | 17 | this.gif.setDelay(delay); |
20 | - this.gif.addFrame( | 18 | + this.gif.addFrame(this.canvas.getContext()); |
21 | - this.canvas.getContext().getImageData(0, 0, this.width, this.height).data | ||
22 | - ); | ||
23 | } | 19 | } |
24 | 20 | ||
25 | render() { | 21 | render() { |
26 | this.gif.finish(); | 22 | this.gif.finish(); |
27 | - const stream = this.gif.stream(); | 23 | + const byte = new Uint8Array(this.gif.out.data); |
28 | 24 | ||
29 | - let bytes = []; | 25 | + return new Blob([byte], { type: "image/gif" }); |
30 | - stream.pages.map((page) => { | ||
31 | - bytes = bytes.concat([...page]); | ||
32 | - }); | ||
33 | - bytes = new Uint8Array(bytes); | ||
34 | - | ||
35 | - return new Blob([bytes], { type: "image/gif" }); | ||
36 | } | 26 | } |
37 | } | 27 | } |
38 | 28 | ... | ... |
gif-generator/src/lib/GIFEncoder.js
deleted
100644 → 0
1 | -/* | ||
2 | - GIFEncoder.js | ||
3 | - | ||
4 | - Authors | ||
5 | - Kevin Weiner (original Java version - kweiner@fmsware.com) | ||
6 | - Thibault Imbert (AS3 version - bytearray.org) | ||
7 | - Johan Nordberg (JS version - code@johan-nordberg.com) | ||
8 | -*/ | ||
9 | - | ||
10 | -var NeuQuant = require("./TypedNeuQuant.js"); | ||
11 | -var LZWEncoder = require("./LZWEncoder.js"); | ||
12 | - | ||
13 | -function ByteArray() { | ||
14 | - this.page = -1; | ||
15 | - this.pages = []; | ||
16 | - this.newPage(); | ||
17 | -} | ||
18 | - | ||
19 | -ByteArray.pageSize = 4096; | ||
20 | -ByteArray.charMap = {}; | ||
21 | - | ||
22 | -for (var i = 0; i < 256; i++) ByteArray.charMap[i] = String.fromCharCode(i); | ||
23 | - | ||
24 | -ByteArray.prototype.newPage = function () { | ||
25 | - this.pages[++this.page] = new Uint8Array(ByteArray.pageSize); | ||
26 | - this.cursor = 0; | ||
27 | -}; | ||
28 | - | ||
29 | -ByteArray.prototype.getData = function () { | ||
30 | - var rv = ""; | ||
31 | - for (var p = 0; p < this.pages.length; p++) { | ||
32 | - for (var i = 0; i < ByteArray.pageSize; i++) { | ||
33 | - rv += ByteArray.charMap[this.pages[p][i]]; | ||
34 | - } | ||
35 | - } | ||
36 | - return rv; | ||
37 | -}; | ||
38 | - | ||
39 | -ByteArray.prototype.writeByte = function (val) { | ||
40 | - if (this.cursor >= ByteArray.pageSize) this.newPage(); | ||
41 | - this.pages[this.page][this.cursor++] = val; | ||
42 | -}; | ||
43 | - | ||
44 | -ByteArray.prototype.writeUTFBytes = function (string) { | ||
45 | - for (var l = string.length, i = 0; i < l; i++) | ||
46 | - this.writeByte(string.charCodeAt(i)); | ||
47 | -}; | ||
48 | - | ||
49 | -ByteArray.prototype.writeBytes = function (array, offset, length) { | ||
50 | - for (var l = length || array.length, i = offset || 0; i < l; i++) | ||
51 | - this.writeByte(array[i]); | ||
52 | -}; | ||
53 | - | ||
54 | -function GIFEncoder(width, height) { | ||
55 | - // image size | ||
56 | - this.width = ~~width; | ||
57 | - this.height = ~~height; | ||
58 | - | ||
59 | - // transparent color if given | ||
60 | - this.transparent = null; | ||
61 | - | ||
62 | - // transparent index in color table | ||
63 | - this.transIndex = 0; | ||
64 | - | ||
65 | - // -1 = no repeat, 0 = forever. anything else is repeat count | ||
66 | - this.repeat = -1; | ||
67 | - | ||
68 | - // frame delay (hundredths) | ||
69 | - this.delay = 0; | ||
70 | - | ||
71 | - this.image = null; // current frame | ||
72 | - this.pixels = null; // BGR byte array from frame | ||
73 | - this.indexedPixels = null; // converted frame indexed to palette | ||
74 | - this.colorDepth = null; // number of bit planes | ||
75 | - this.colorTab = null; // RGB palette | ||
76 | - this.neuQuant = null; // NeuQuant instance that was used to generate this.colorTab. | ||
77 | - this.usedEntry = new Array(); // active palette entries | ||
78 | - this.palSize = 7; // color table size (bits-1) | ||
79 | - this.dispose = -1; // disposal code (-1 = use default) | ||
80 | - this.firstFrame = true; | ||
81 | - this.sample = 10; // default sample interval for quantizer | ||
82 | - this.dither = false; // default dithering | ||
83 | - this.globalPalette = false; | ||
84 | - | ||
85 | - this.out = new ByteArray(); | ||
86 | -} | ||
87 | - | ||
88 | -/* | ||
89 | - Sets the delay time between each frame, or changes it for subsequent frames | ||
90 | - (applies to last frame added) | ||
91 | -*/ | ||
92 | -GIFEncoder.prototype.setDelay = function (milliseconds) { | ||
93 | - this.delay = Math.round(milliseconds / 10); | ||
94 | -}; | ||
95 | - | ||
96 | -/* | ||
97 | - Sets frame rate in frames per second. | ||
98 | -*/ | ||
99 | -GIFEncoder.prototype.setFrameRate = function (fps) { | ||
100 | - this.delay = Math.round(100 / fps); | ||
101 | -}; | ||
102 | - | ||
103 | -/* | ||
104 | - Sets the GIF frame disposal code for the last added frame and any | ||
105 | - subsequent frames. | ||
106 | - | ||
107 | - Default is 0 if no transparent color has been set, otherwise 2. | ||
108 | -*/ | ||
109 | -GIFEncoder.prototype.setDispose = function (disposalCode) { | ||
110 | - if (disposalCode >= 0) this.dispose = disposalCode; | ||
111 | -}; | ||
112 | - | ||
113 | -/* | ||
114 | - Sets the number of times the set of GIF frames should be played. | ||
115 | - | ||
116 | - -1 = play once | ||
117 | - 0 = repeat indefinitely | ||
118 | - | ||
119 | - Default is -1 | ||
120 | - | ||
121 | - Must be invoked before the first image is added | ||
122 | -*/ | ||
123 | - | ||
124 | -GIFEncoder.prototype.setRepeat = function (repeat) { | ||
125 | - this.repeat = repeat; | ||
126 | -}; | ||
127 | - | ||
128 | -/* | ||
129 | - Sets the transparent color for the last added frame and any subsequent | ||
130 | - frames. Since all colors are subject to modification in the quantization | ||
131 | - process, the color in the final palette for each frame closest to the given | ||
132 | - color becomes the transparent color for that frame. May be set to null to | ||
133 | - indicate no transparent color. | ||
134 | -*/ | ||
135 | -GIFEncoder.prototype.setTransparent = function (color) { | ||
136 | - this.transparent = color; | ||
137 | -}; | ||
138 | - | ||
139 | -/* | ||
140 | - Adds next GIF frame. The frame is not written immediately, but is | ||
141 | - actually deferred until the next frame is received so that timing | ||
142 | - data can be inserted. Invoking finish() flushes all frames. | ||
143 | -*/ | ||
144 | -GIFEncoder.prototype.addFrame = function (imageData) { | ||
145 | - this.image = imageData; | ||
146 | - | ||
147 | - this.colorTab = | ||
148 | - this.globalPalette && this.globalPalette.slice ? this.globalPalette : null; | ||
149 | - | ||
150 | - this.getImagePixels(); // convert to correct format if necessary | ||
151 | - this.analyzePixels(); // build color table & map pixels | ||
152 | - | ||
153 | - if (this.globalPalette === true) this.globalPalette = this.colorTab; | ||
154 | - | ||
155 | - if (this.firstFrame) { | ||
156 | - this.writeLSD(); // logical screen descriptior | ||
157 | - this.writePalette(); // global color table | ||
158 | - if (this.repeat >= 0) { | ||
159 | - // use NS app extension to indicate reps | ||
160 | - this.writeNetscapeExt(); | ||
161 | - } | ||
162 | - } | ||
163 | - | ||
164 | - this.writeGraphicCtrlExt(); // write graphic control extension | ||
165 | - this.writeImageDesc(); // image descriptor | ||
166 | - if (!this.firstFrame && !this.globalPalette) this.writePalette(); // local color table | ||
167 | - this.writePixels(); // encode and write pixel data | ||
168 | - | ||
169 | - this.firstFrame = false; | ||
170 | -}; | ||
171 | - | ||
172 | -/* | ||
173 | - Adds final trailer to the GIF stream, if you don't call the finish method | ||
174 | - the GIF stream will not be valid. | ||
175 | -*/ | ||
176 | -GIFEncoder.prototype.finish = function () { | ||
177 | - this.out.writeByte(0x3b); // gif trailer | ||
178 | -}; | ||
179 | - | ||
180 | -/* | ||
181 | - Sets quality of color quantization (conversion of images to the maximum 256 | ||
182 | - colors allowed by the GIF specification). Lower values (minimum = 1) | ||
183 | - produce better colors, but slow processing significantly. 10 is the | ||
184 | - default, and produces good color mapping at reasonable speeds. Values | ||
185 | - greater than 20 do not yield significant improvements in speed. | ||
186 | -*/ | ||
187 | -GIFEncoder.prototype.setQuality = function (quality) { | ||
188 | - if (quality < 1) quality = 1; | ||
189 | - this.sample = quality; | ||
190 | -}; | ||
191 | - | ||
192 | -/* | ||
193 | - Sets dithering method. Available are: | ||
194 | - - FALSE no dithering | ||
195 | - - TRUE or FloydSteinberg | ||
196 | - - FalseFloydSteinberg | ||
197 | - - Stucki | ||
198 | - - Atkinson | ||
199 | - You can add '-serpentine' to use serpentine scanning | ||
200 | -*/ | ||
201 | -GIFEncoder.prototype.setDither = function (dither) { | ||
202 | - if (dither === true) dither = "FloydSteinberg"; | ||
203 | - this.dither = dither; | ||
204 | -}; | ||
205 | - | ||
206 | -/* | ||
207 | - Sets global palette for all frames. | ||
208 | - You can provide TRUE to create global palette from first picture. | ||
209 | - Or an array of r,g,b,r,g,b,... | ||
210 | -*/ | ||
211 | -GIFEncoder.prototype.setGlobalPalette = function (palette) { | ||
212 | - this.globalPalette = palette; | ||
213 | -}; | ||
214 | - | ||
215 | -/* | ||
216 | - Returns global palette used for all frames. | ||
217 | - If setGlobalPalette(true) was used, then this function will return | ||
218 | - calculated palette after the first frame is added. | ||
219 | -*/ | ||
220 | -GIFEncoder.prototype.getGlobalPalette = function () { | ||
221 | - return ( | ||
222 | - (this.globalPalette && | ||
223 | - this.globalPalette.slice && | ||
224 | - this.globalPalette.slice(0)) || | ||
225 | - this.globalPalette | ||
226 | - ); | ||
227 | -}; | ||
228 | - | ||
229 | -/* | ||
230 | - Writes GIF file header | ||
231 | -*/ | ||
232 | -GIFEncoder.prototype.writeHeader = function () { | ||
233 | - this.out.writeUTFBytes("GIF89a"); | ||
234 | -}; | ||
235 | - | ||
236 | -/* | ||
237 | - Analyzes current frame colors and creates color map. | ||
238 | -*/ | ||
239 | -GIFEncoder.prototype.analyzePixels = function () { | ||
240 | - if (!this.colorTab) { | ||
241 | - this.neuQuant = new NeuQuant(this.pixels, this.sample); | ||
242 | - this.neuQuant.buildColormap(); // create reduced palette | ||
243 | - this.colorTab = this.neuQuant.getColormap(); | ||
244 | - } | ||
245 | - | ||
246 | - // map image pixels to new palette | ||
247 | - if (this.dither) { | ||
248 | - this.ditherPixels( | ||
249 | - this.dither.replace("-serpentine", ""), | ||
250 | - this.dither.match(/-serpentine/) !== null | ||
251 | - ); | ||
252 | - } else { | ||
253 | - this.indexPixels(); | ||
254 | - } | ||
255 | - | ||
256 | - this.pixels = null; | ||
257 | - this.colorDepth = 8; | ||
258 | - this.palSize = 7; | ||
259 | - | ||
260 | - // get closest match to transparent color if specified | ||
261 | - if (this.transparent !== null) { | ||
262 | - this.transIndex = this.findClosest(this.transparent, true); | ||
263 | - } | ||
264 | -}; | ||
265 | - | ||
266 | -/* | ||
267 | - Index pixels, without dithering | ||
268 | -*/ | ||
269 | -GIFEncoder.prototype.indexPixels = function (imgq) { | ||
270 | - var nPix = this.pixels.length / 3; | ||
271 | - this.indexedPixels = new Uint8Array(nPix); | ||
272 | - var k = 0; | ||
273 | - for (var j = 0; j < nPix; j++) { | ||
274 | - var index = this.findClosestRGB( | ||
275 | - this.pixels[k++] & 0xff, | ||
276 | - this.pixels[k++] & 0xff, | ||
277 | - this.pixels[k++] & 0xff | ||
278 | - ); | ||
279 | - this.usedEntry[index] = true; | ||
280 | - this.indexedPixels[j] = index; | ||
281 | - } | ||
282 | -}; | ||
283 | - | ||
284 | -/* | ||
285 | - Taken from http://jsbin.com/iXofIji/2/edit by PAEz | ||
286 | -*/ | ||
287 | -GIFEncoder.prototype.ditherPixels = function (kernel, serpentine) { | ||
288 | - var kernels = { | ||
289 | - FalseFloydSteinberg: [ | ||
290 | - [3 / 8, 1, 0], | ||
291 | - [3 / 8, 0, 1], | ||
292 | - [2 / 8, 1, 1], | ||
293 | - ], | ||
294 | - FloydSteinberg: [ | ||
295 | - [7 / 16, 1, 0], | ||
296 | - [3 / 16, -1, 1], | ||
297 | - [5 / 16, 0, 1], | ||
298 | - [1 / 16, 1, 1], | ||
299 | - ], | ||
300 | - Stucki: [ | ||
301 | - [8 / 42, 1, 0], | ||
302 | - [4 / 42, 2, 0], | ||
303 | - [2 / 42, -2, 1], | ||
304 | - [4 / 42, -1, 1], | ||
305 | - [8 / 42, 0, 1], | ||
306 | - [4 / 42, 1, 1], | ||
307 | - [2 / 42, 2, 1], | ||
308 | - [1 / 42, -2, 2], | ||
309 | - [2 / 42, -1, 2], | ||
310 | - [4 / 42, 0, 2], | ||
311 | - [2 / 42, 1, 2], | ||
312 | - [1 / 42, 2, 2], | ||
313 | - ], | ||
314 | - Atkinson: [ | ||
315 | - [1 / 8, 1, 0], | ||
316 | - [1 / 8, 2, 0], | ||
317 | - [1 / 8, -1, 1], | ||
318 | - [1 / 8, 0, 1], | ||
319 | - [1 / 8, 1, 1], | ||
320 | - [1 / 8, 0, 2], | ||
321 | - ], | ||
322 | - }; | ||
323 | - | ||
324 | - if (!kernel || !kernels[kernel]) { | ||
325 | - throw "Unknown dithering kernel: " + kernel; | ||
326 | - } | ||
327 | - | ||
328 | - var ds = kernels[kernel]; | ||
329 | - var index = 0, | ||
330 | - height = this.height, | ||
331 | - width = this.width, | ||
332 | - data = this.pixels; | ||
333 | - var direction = serpentine ? -1 : 1; | ||
334 | - | ||
335 | - this.indexedPixels = new Uint8Array(this.pixels.length / 3); | ||
336 | - | ||
337 | - for (var y = 0; y < height; y++) { | ||
338 | - if (serpentine) direction = direction * -1; | ||
339 | - | ||
340 | - for ( | ||
341 | - var x = direction == 1 ? 0 : width - 1, xend = direction == 1 ? width : 0; | ||
342 | - x !== xend; | ||
343 | - x += direction | ||
344 | - ) { | ||
345 | - index = y * width + x; | ||
346 | - // Get original colour | ||
347 | - var idx = index * 3; | ||
348 | - var r1 = data[idx]; | ||
349 | - var g1 = data[idx + 1]; | ||
350 | - var b1 = data[idx + 2]; | ||
351 | - | ||
352 | - // Get converted colour | ||
353 | - idx = this.findClosestRGB(r1, g1, b1); | ||
354 | - this.usedEntry[idx] = true; | ||
355 | - this.indexedPixels[index] = idx; | ||
356 | - idx *= 3; | ||
357 | - var r2 = this.colorTab[idx]; | ||
358 | - var g2 = this.colorTab[idx + 1]; | ||
359 | - var b2 = this.colorTab[idx + 2]; | ||
360 | - | ||
361 | - var er = r1 - r2; | ||
362 | - var eg = g1 - g2; | ||
363 | - var eb = b1 - b2; | ||
364 | - | ||
365 | - for ( | ||
366 | - var i = direction == 1 ? 0 : ds.length - 1, | ||
367 | - end = direction == 1 ? ds.length : 0; | ||
368 | - i !== end; | ||
369 | - i += direction | ||
370 | - ) { | ||
371 | - var x1 = ds[i][1]; // *direction; // Should this by timesd by direction?..to make the kernel go in the opposite direction....got no idea.... | ||
372 | - var y1 = ds[i][2]; | ||
373 | - if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { | ||
374 | - var d = ds[i][0]; | ||
375 | - idx = index + x1 + y1 * width; | ||
376 | - idx *= 3; | ||
377 | - | ||
378 | - data[idx] = Math.max(0, Math.min(255, data[idx] + er * d)); | ||
379 | - data[idx + 1] = Math.max(0, Math.min(255, data[idx + 1] + eg * d)); | ||
380 | - data[idx + 2] = Math.max(0, Math.min(255, data[idx + 2] + eb * d)); | ||
381 | - } | ||
382 | - } | ||
383 | - } | ||
384 | - } | ||
385 | -}; | ||
386 | - | ||
387 | -/* | ||
388 | - Returns index of palette color closest to c | ||
389 | -*/ | ||
390 | -GIFEncoder.prototype.findClosest = function (c, used) { | ||
391 | - return this.findClosestRGB( | ||
392 | - (c & 0xff0000) >> 16, | ||
393 | - (c & 0x00ff00) >> 8, | ||
394 | - c & 0x0000ff, | ||
395 | - used | ||
396 | - ); | ||
397 | -}; | ||
398 | - | ||
399 | -GIFEncoder.prototype.findClosestRGB = function (r, g, b, used) { | ||
400 | - if (this.colorTab === null) return -1; | ||
401 | - | ||
402 | - if (this.neuQuant && !used) { | ||
403 | - return this.neuQuant.lookupRGB(r, g, b); | ||
404 | - } | ||
405 | - | ||
406 | - var c = b | (g << 8) | (r << 16); | ||
407 | - | ||
408 | - var minpos = 0; | ||
409 | - var dmin = 256 * 256 * 256; | ||
410 | - var len = this.colorTab.length; | ||
411 | - | ||
412 | - for (var i = 0, index = 0; i < len; index++) { | ||
413 | - var dr = r - (this.colorTab[i++] & 0xff); | ||
414 | - var dg = g - (this.colorTab[i++] & 0xff); | ||
415 | - var db = b - (this.colorTab[i++] & 0xff); | ||
416 | - var d = dr * dr + dg * dg + db * db; | ||
417 | - if ((!used || this.usedEntry[index]) && d < dmin) { | ||
418 | - dmin = d; | ||
419 | - minpos = index; | ||
420 | - } | ||
421 | - } | ||
422 | - | ||
423 | - return minpos; | ||
424 | -}; | ||
425 | - | ||
426 | -/* | ||
427 | - Extracts image pixels into byte array pixels | ||
428 | - (removes alphachannel from canvas imagedata) | ||
429 | -*/ | ||
430 | -GIFEncoder.prototype.getImagePixels = function () { | ||
431 | - var w = this.width; | ||
432 | - var h = this.height; | ||
433 | - this.pixels = new Uint8Array(w * h * 3); | ||
434 | - | ||
435 | - var data = this.image; | ||
436 | - var srcPos = 0; | ||
437 | - var count = 0; | ||
438 | - | ||
439 | - for (var i = 0; i < h; i++) { | ||
440 | - for (var j = 0; j < w; j++) { | ||
441 | - this.pixels[count++] = data[srcPos++]; | ||
442 | - this.pixels[count++] = data[srcPos++]; | ||
443 | - this.pixels[count++] = data[srcPos++]; | ||
444 | - srcPos++; | ||
445 | - } | ||
446 | - } | ||
447 | -}; | ||
448 | - | ||
449 | -/* | ||
450 | - Writes Graphic Control Extension | ||
451 | -*/ | ||
452 | -GIFEncoder.prototype.writeGraphicCtrlExt = function () { | ||
453 | - this.out.writeByte(0x21); // extension introducer | ||
454 | - this.out.writeByte(0xf9); // GCE label | ||
455 | - this.out.writeByte(4); // data block size | ||
456 | - | ||
457 | - var transp, disp; | ||
458 | - if (this.transparent === null) { | ||
459 | - transp = 0; | ||
460 | - disp = 0; // dispose = no action | ||
461 | - } else { | ||
462 | - transp = 1; | ||
463 | - disp = 2; // force clear if using transparent color | ||
464 | - } | ||
465 | - | ||
466 | - if (this.dispose >= 0) { | ||
467 | - disp = this.dispose & 7; // user override | ||
468 | - } | ||
469 | - disp <<= 2; | ||
470 | - | ||
471 | - // packed fields | ||
472 | - this.out.writeByte( | ||
473 | - 0 | // 1:3 reserved | ||
474 | - disp | // 4:6 disposal | ||
475 | - 0 | // 7 user input - 0 = none | ||
476 | - transp // 8 transparency flag | ||
477 | - ); | ||
478 | - | ||
479 | - this.writeShort(this.delay); // delay x 1/100 sec | ||
480 | - this.out.writeByte(this.transIndex); // transparent color index | ||
481 | - this.out.writeByte(0); // block terminator | ||
482 | -}; | ||
483 | - | ||
484 | -/* | ||
485 | - Writes Image Descriptor | ||
486 | -*/ | ||
487 | -GIFEncoder.prototype.writeImageDesc = function () { | ||
488 | - this.out.writeByte(0x2c); // image separator | ||
489 | - this.writeShort(0); // image position x,y = 0,0 | ||
490 | - this.writeShort(0); | ||
491 | - this.writeShort(this.width); // image size | ||
492 | - this.writeShort(this.height); | ||
493 | - | ||
494 | - // packed fields | ||
495 | - if (this.firstFrame || this.globalPalette) { | ||
496 | - // no LCT - GCT is used for first (or only) frame | ||
497 | - this.out.writeByte(0); | ||
498 | - } else { | ||
499 | - // specify normal LCT | ||
500 | - this.out.writeByte( | ||
501 | - 0x80 | // 1 local color table 1=yes | ||
502 | - 0 | // 2 interlace - 0=no | ||
503 | - 0 | // 3 sorted - 0=no | ||
504 | - 0 | // 4-5 reserved | ||
505 | - this.palSize // 6-8 size of color table | ||
506 | - ); | ||
507 | - } | ||
508 | -}; | ||
509 | - | ||
510 | -/* | ||
511 | - Writes Logical Screen Descriptor | ||
512 | -*/ | ||
513 | -GIFEncoder.prototype.writeLSD = function () { | ||
514 | - // logical screen size | ||
515 | - this.writeShort(this.width); | ||
516 | - this.writeShort(this.height); | ||
517 | - | ||
518 | - // packed fields | ||
519 | - this.out.writeByte( | ||
520 | - 0x80 | // 1 : global color table flag = 1 (gct used) | ||
521 | - 0x70 | // 2-4 : color resolution = 7 | ||
522 | - 0x00 | // 5 : gct sort flag = 0 | ||
523 | - this.palSize // 6-8 : gct size | ||
524 | - ); | ||
525 | - | ||
526 | - this.out.writeByte(0); // background color index | ||
527 | - this.out.writeByte(0); // pixel aspect ratio - assume 1:1 | ||
528 | -}; | ||
529 | - | ||
530 | -/* | ||
531 | - Writes Netscape application extension to define repeat count. | ||
532 | -*/ | ||
533 | -GIFEncoder.prototype.writeNetscapeExt = function () { | ||
534 | - this.out.writeByte(0x21); // extension introducer | ||
535 | - this.out.writeByte(0xff); // app extension label | ||
536 | - this.out.writeByte(11); // block size | ||
537 | - this.out.writeUTFBytes("NETSCAPE2.0"); // app id + auth code | ||
538 | - this.out.writeByte(3); // sub-block size | ||
539 | - this.out.writeByte(1); // loop sub-block id | ||
540 | - this.writeShort(this.repeat); // loop count (extra iterations, 0=repeat forever) | ||
541 | - this.out.writeByte(0); // block terminator | ||
542 | -}; | ||
543 | - | ||
544 | -/* | ||
545 | - Writes color table | ||
546 | -*/ | ||
547 | -GIFEncoder.prototype.writePalette = function () { | ||
548 | - this.out.writeBytes(this.colorTab); | ||
549 | - var n = 3 * 256 - this.colorTab.length; | ||
550 | - for (var i = 0; i < n; i++) this.out.writeByte(0); | ||
551 | -}; | ||
552 | - | ||
553 | -GIFEncoder.prototype.writeShort = function (pValue) { | ||
554 | - this.out.writeByte(pValue & 0xff); | ||
555 | - this.out.writeByte((pValue >> 8) & 0xff); | ||
556 | -}; | ||
557 | - | ||
558 | -/* | ||
559 | - Encodes and writes pixel data | ||
560 | -*/ | ||
561 | -GIFEncoder.prototype.writePixels = function () { | ||
562 | - var enc = new LZWEncoder( | ||
563 | - this.width, | ||
564 | - this.height, | ||
565 | - this.indexedPixels, | ||
566 | - this.colorDepth | ||
567 | - ); | ||
568 | - enc.encode(this.out); | ||
569 | -}; | ||
570 | - | ||
571 | -/* | ||
572 | - Retrieves the GIF stream | ||
573 | -*/ | ||
574 | -GIFEncoder.prototype.stream = function () { | ||
575 | - return this.out; | ||
576 | -}; | ||
577 | - | ||
578 | -module.exports = GIFEncoder; |
gif-generator/src/lib/LZWEncoder.js
deleted
100644 → 0
1 | -/* | ||
2 | - LZWEncoder.js | ||
3 | - | ||
4 | - Authors | ||
5 | - Kevin Weiner (original Java version - kweiner@fmsware.com) | ||
6 | - Thibault Imbert (AS3 version - bytearray.org) | ||
7 | - Johan Nordberg (JS version - code@johan-nordberg.com) | ||
8 | - | ||
9 | - Acknowledgements | ||
10 | - GIFCOMPR.C - GIF Image compression routines | ||
11 | - Lempel-Ziv compression based on 'compress'. GIF modifications by | ||
12 | - David Rowley (mgardi@watdcsu.waterloo.edu) | ||
13 | - GIF Image compression - modified 'compress' | ||
14 | - Based on: compress.c - File compression ala IEEE Computer, June 1984. | ||
15 | - By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) | ||
16 | - Jim McKie (decvax!mcvax!jim) | ||
17 | - Steve Davies (decvax!vax135!petsd!peora!srd) | ||
18 | - Ken Turkowski (decvax!decwrl!turtlevax!ken) | ||
19 | - James A. Woods (decvax!ihnp4!ames!jaw) | ||
20 | - Joe Orost (decvax!vax135!petsd!joe) | ||
21 | -*/ | ||
22 | - | ||
23 | -var EOF = -1; | ||
24 | -var BITS = 12; | ||
25 | -var HSIZE = 5003; // 80% occupancy | ||
26 | -var masks = [ | ||
27 | - 0x0000, | ||
28 | - 0x0001, | ||
29 | - 0x0003, | ||
30 | - 0x0007, | ||
31 | - 0x000f, | ||
32 | - 0x001f, | ||
33 | - 0x003f, | ||
34 | - 0x007f, | ||
35 | - 0x00ff, | ||
36 | - 0x01ff, | ||
37 | - 0x03ff, | ||
38 | - 0x07ff, | ||
39 | - 0x0fff, | ||
40 | - 0x1fff, | ||
41 | - 0x3fff, | ||
42 | - 0x7fff, | ||
43 | - 0xffff, | ||
44 | -]; | ||
45 | - | ||
46 | -function LZWEncoder(width, height, pixels, colorDepth) { | ||
47 | - var initCodeSize = Math.max(2, colorDepth); | ||
48 | - | ||
49 | - var accum = new Uint8Array(256); | ||
50 | - var htab = new Int32Array(HSIZE); | ||
51 | - var codetab = new Int32Array(HSIZE); | ||
52 | - | ||
53 | - var cur_accum, | ||
54 | - cur_bits = 0; | ||
55 | - var a_count; | ||
56 | - var free_ent = 0; // first unused entry | ||
57 | - var maxcode; | ||
58 | - | ||
59 | - // block compression parameters -- after all codes are used up, | ||
60 | - // and compression rate changes, start over. | ||
61 | - var clear_flg = false; | ||
62 | - | ||
63 | - // Algorithm: use open addressing double hashing (no chaining) on the | ||
64 | - // prefix code / next character combination. We do a variant of Knuth's | ||
65 | - // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime | ||
66 | - // secondary probe. Here, the modular division first probe is gives way | ||
67 | - // to a faster exclusive-or manipulation. Also do block compression with | ||
68 | - // an adaptive reset, whereby the code table is cleared when the compression | ||
69 | - // ratio decreases, but after the table fills. The variable-length output | ||
70 | - // codes are re-sized at this point, and a special CLEAR code is generated | ||
71 | - // for the decompressor. Late addition: construct the table according to | ||
72 | - // file size for noticeable speed improvement on small files. Please direct | ||
73 | - // questions about this implementation to ames!jaw. | ||
74 | - var g_init_bits, ClearCode, EOFCode; | ||
75 | - | ||
76 | - // Add a character to the end of the current packet, and if it is 254 | ||
77 | - // characters, flush the packet to disk. | ||
78 | - function char_out(c, outs) { | ||
79 | - accum[a_count++] = c; | ||
80 | - if (a_count >= 254) flush_char(outs); | ||
81 | - } | ||
82 | - | ||
83 | - // Clear out the hash table | ||
84 | - // table clear for block compress | ||
85 | - function cl_block(outs) { | ||
86 | - cl_hash(HSIZE); | ||
87 | - free_ent = ClearCode + 2; | ||
88 | - clear_flg = true; | ||
89 | - output(ClearCode, outs); | ||
90 | - } | ||
91 | - | ||
92 | - // Reset code table | ||
93 | - function cl_hash(hsize) { | ||
94 | - for (var i = 0; i < hsize; ++i) htab[i] = -1; | ||
95 | - } | ||
96 | - | ||
97 | - function compress(init_bits, outs) { | ||
98 | - var fcode, c, i, ent, disp, hsize_reg, hshift; | ||
99 | - | ||
100 | - // Set up the globals: g_init_bits - initial number of bits | ||
101 | - g_init_bits = init_bits; | ||
102 | - | ||
103 | - // Set up the necessary values | ||
104 | - clear_flg = false; | ||
105 | - n_bits = g_init_bits; | ||
106 | - maxcode = MAXCODE(n_bits); | ||
107 | - | ||
108 | - ClearCode = 1 << (init_bits - 1); | ||
109 | - EOFCode = ClearCode + 1; | ||
110 | - free_ent = ClearCode + 2; | ||
111 | - | ||
112 | - a_count = 0; // clear packet | ||
113 | - | ||
114 | - ent = nextPixel(); | ||
115 | - | ||
116 | - hshift = 0; | ||
117 | - for (fcode = HSIZE; fcode < 65536; fcode *= 2) ++hshift; | ||
118 | - hshift = 8 - hshift; // set hash code range bound | ||
119 | - hsize_reg = HSIZE; | ||
120 | - cl_hash(hsize_reg); // clear hash table | ||
121 | - | ||
122 | - output(ClearCode, outs); | ||
123 | - | ||
124 | - outer_loop: while ((c = nextPixel()) != EOF) { | ||
125 | - fcode = (c << BITS) + ent; | ||
126 | - i = (c << hshift) ^ ent; // xor hashing | ||
127 | - if (htab[i] === fcode) { | ||
128 | - ent = codetab[i]; | ||
129 | - continue; | ||
130 | - } else if (htab[i] >= 0) { | ||
131 | - // non-empty slot | ||
132 | - disp = hsize_reg - i; // secondary hash (after G. Knott) | ||
133 | - if (i === 0) disp = 1; | ||
134 | - do { | ||
135 | - if ((i -= disp) < 0) i += hsize_reg; | ||
136 | - if (htab[i] === fcode) { | ||
137 | - ent = codetab[i]; | ||
138 | - continue outer_loop; | ||
139 | - } | ||
140 | - } while (htab[i] >= 0); | ||
141 | - } | ||
142 | - output(ent, outs); | ||
143 | - ent = c; | ||
144 | - if (free_ent < 1 << BITS) { | ||
145 | - codetab[i] = free_ent++; // code -> hashtable | ||
146 | - htab[i] = fcode; | ||
147 | - } else { | ||
148 | - cl_block(outs); | ||
149 | - } | ||
150 | - } | ||
151 | - | ||
152 | - // Put out the final code. | ||
153 | - output(ent, outs); | ||
154 | - output(EOFCode, outs); | ||
155 | - } | ||
156 | - | ||
157 | - function encode(outs) { | ||
158 | - outs.writeByte(initCodeSize); // write "initial code size" byte | ||
159 | - remaining = width * height; // reset navigation variables | ||
160 | - curPixel = 0; | ||
161 | - compress(initCodeSize + 1, outs); // compress and write the pixel data | ||
162 | - outs.writeByte(0); // write block terminator | ||
163 | - } | ||
164 | - | ||
165 | - // Flush the packet to disk, and reset the accumulator | ||
166 | - function flush_char(outs) { | ||
167 | - if (a_count > 0) { | ||
168 | - outs.writeByte(a_count); | ||
169 | - outs.writeBytes(accum, 0, a_count); | ||
170 | - a_count = 0; | ||
171 | - } | ||
172 | - } | ||
173 | - | ||
174 | - function MAXCODE(n_bits) { | ||
175 | - return (1 << n_bits) - 1; | ||
176 | - } | ||
177 | - | ||
178 | - // Return the next pixel from the image | ||
179 | - function nextPixel() { | ||
180 | - if (remaining === 0) return EOF; | ||
181 | - --remaining; | ||
182 | - var pix = pixels[curPixel++]; | ||
183 | - return pix & 0xff; | ||
184 | - } | ||
185 | - | ||
186 | - function output(code, outs) { | ||
187 | - cur_accum &= masks[cur_bits]; | ||
188 | - | ||
189 | - if (cur_bits > 0) cur_accum |= code << cur_bits; | ||
190 | - else cur_accum = code; | ||
191 | - | ||
192 | - cur_bits += n_bits; | ||
193 | - | ||
194 | - while (cur_bits >= 8) { | ||
195 | - char_out(cur_accum & 0xff, outs); | ||
196 | - cur_accum >>= 8; | ||
197 | - cur_bits -= 8; | ||
198 | - } | ||
199 | - | ||
200 | - // If the next entry is going to be too big for the code size, | ||
201 | - // then increase it, if possible. | ||
202 | - if (free_ent > maxcode || clear_flg) { | ||
203 | - if (clear_flg) { | ||
204 | - maxcode = MAXCODE((n_bits = g_init_bits)); | ||
205 | - clear_flg = false; | ||
206 | - } else { | ||
207 | - ++n_bits; | ||
208 | - if (n_bits == BITS) maxcode = 1 << BITS; | ||
209 | - else maxcode = MAXCODE(n_bits); | ||
210 | - } | ||
211 | - } | ||
212 | - | ||
213 | - if (code == EOFCode) { | ||
214 | - // At EOF, write the rest of the buffer. | ||
215 | - while (cur_bits > 0) { | ||
216 | - char_out(cur_accum & 0xff, outs); | ||
217 | - cur_accum >>= 8; | ||
218 | - cur_bits -= 8; | ||
219 | - } | ||
220 | - flush_char(outs); | ||
221 | - } | ||
222 | - } | ||
223 | - | ||
224 | - this.encode = encode; | ||
225 | -} | ||
226 | - | ||
227 | -module.exports = LZWEncoder; |
gif-generator/src/lib/NeuQuant.js
deleted
100644 → 0
1 | -/* NeuQuant Neural-Net Quantization Algorithm | ||
2 | - * ------------------------------------------ | ||
3 | - * | ||
4 | - * Copyright (c) 1994 Anthony Dekker | ||
5 | - * | ||
6 | - * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. | ||
7 | - * See "Kohonen neural networks for optimal colour quantization" | ||
8 | - * in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367. | ||
9 | - * for a discussion of the algorithm. | ||
10 | - * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML | ||
11 | - * | ||
12 | - * Any party obtaining a copy of these files from the author, directly or | ||
13 | - * indirectly, is granted, free of charge, a full and unrestricted irrevocable, | ||
14 | - * world-wide, paid up, royalty-free, nonexclusive right and license to deal | ||
15 | - * in this software and documentation files (the "Software"), including without | ||
16 | - * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
17 | - * and/or sell copies of the Software, and to permit persons who receive | ||
18 | - * copies from any such party to do so, with the only requirement being | ||
19 | - * that this copyright notice remain intact. | ||
20 | - * | ||
21 | - * (JavaScript port 2012 by Johan Nordberg) | ||
22 | - */ | ||
23 | - | ||
24 | -function toInt(v) { | ||
25 | - return ~~v; | ||
26 | -} | ||
27 | - | ||
28 | -var ncycles = 100; // number of learning cycles | ||
29 | -var netsize = 256; // number of colors used | ||
30 | -var maxnetpos = netsize - 1; | ||
31 | - | ||
32 | -// defs for freq and bias | ||
33 | -var netbiasshift = 4; // bias for colour values | ||
34 | -var intbiasshift = 16; // bias for fractions | ||
35 | -var intbias = 1 << intbiasshift; | ||
36 | -var gammashift = 10; | ||
37 | -var gamma = 1 << gammashift; | ||
38 | -var betashift = 10; | ||
39 | -var beta = intbias >> betashift; /* beta = 1/1024 */ | ||
40 | -var betagamma = intbias << (gammashift - betashift); | ||
41 | - | ||
42 | -// defs for decreasing radius factor | ||
43 | -var initrad = netsize >> 3; // for 256 cols, radius starts | ||
44 | -var radiusbiasshift = 6; // at 32.0 biased by 6 bits | ||
45 | -var radiusbias = 1 << radiusbiasshift; | ||
46 | -var initradius = initrad * radiusbias; //and decreases by a | ||
47 | -var radiusdec = 30; // factor of 1/30 each cycle | ||
48 | - | ||
49 | -// defs for decreasing alpha factor | ||
50 | -var alphabiasshift = 10; // alpha starts at 1.0 | ||
51 | -var initalpha = 1 << alphabiasshift; | ||
52 | -var alphadec; // biased by 10 bits | ||
53 | - | ||
54 | -/* radbias and alpharadbias used for radpower calculation */ | ||
55 | -var radbiasshift = 8; | ||
56 | -var radbias = 1 << radbiasshift; | ||
57 | -var alpharadbshift = alphabiasshift + radbiasshift; | ||
58 | -var alpharadbias = 1 << alpharadbshift; | ||
59 | - | ||
60 | -// four primes near 500 - assume no image has a length so large that it is | ||
61 | -// divisible by all four primes | ||
62 | -var prime1 = 499; | ||
63 | -var prime2 = 491; | ||
64 | -var prime3 = 487; | ||
65 | -var prime4 = 503; | ||
66 | -var minpicturebytes = 3 * prime4; | ||
67 | - | ||
68 | -/* | ||
69 | - Constructor: NeuQuant | ||
70 | - | ||
71 | - Arguments: | ||
72 | - | ||
73 | - pixels - array of pixels in RGB format | ||
74 | - samplefac - sampling factor 1 to 30 where lower is better quality | ||
75 | - | ||
76 | - > | ||
77 | - > pixels = [r, g, b, r, g, b, r, g, b, ..] | ||
78 | - > | ||
79 | -*/ | ||
80 | -function NeuQuant(pixels, samplefac) { | ||
81 | - var network; // int[netsize][4] | ||
82 | - var netindex; // for network lookup - really 256 | ||
83 | - | ||
84 | - // bias and freq arrays for learning | ||
85 | - var bias; | ||
86 | - var freq; | ||
87 | - var radpower; | ||
88 | - | ||
89 | - /* | ||
90 | - Private Method: init | ||
91 | - | ||
92 | - sets up arrays | ||
93 | - */ | ||
94 | - function init() { | ||
95 | - network = []; | ||
96 | - netindex = []; | ||
97 | - bias = []; | ||
98 | - freq = []; | ||
99 | - radpower = []; | ||
100 | - | ||
101 | - var i, v; | ||
102 | - for (i = 0; i < netsize; i++) { | ||
103 | - v = (i << (netbiasshift + 8)) / netsize; | ||
104 | - network[i] = [v, v, v]; | ||
105 | - freq[i] = intbias / netsize; | ||
106 | - bias[i] = 0; | ||
107 | - } | ||
108 | - } | ||
109 | - | ||
110 | - /* | ||
111 | - Private Method: unbiasnet | ||
112 | - | ||
113 | - unbiases network to give byte values 0..255 and record position i to prepare for sort | ||
114 | - */ | ||
115 | - function unbiasnet() { | ||
116 | - for (var i = 0; i < netsize; i++) { | ||
117 | - network[i][0] >>= netbiasshift; | ||
118 | - network[i][1] >>= netbiasshift; | ||
119 | - network[i][2] >>= netbiasshift; | ||
120 | - network[i][3] = i; // record color number | ||
121 | - } | ||
122 | - } | ||
123 | - | ||
124 | - /* | ||
125 | - Private Method: altersingle | ||
126 | - | ||
127 | - moves neuron *i* towards biased (b,g,r) by factor *alpha* | ||
128 | - */ | ||
129 | - function altersingle(alpha, i, b, g, r) { | ||
130 | - network[i][0] -= (alpha * (network[i][0] - b)) / initalpha; | ||
131 | - network[i][1] -= (alpha * (network[i][1] - g)) / initalpha; | ||
132 | - network[i][2] -= (alpha * (network[i][2] - r)) / initalpha; | ||
133 | - } | ||
134 | - | ||
135 | - /* | ||
136 | - Private Method: alterneigh | ||
137 | - | ||
138 | - moves neurons in *radius* around index *i* towards biased (b,g,r) by factor *alpha* | ||
139 | - */ | ||
140 | - function alterneigh(radius, i, b, g, r) { | ||
141 | - var lo = Math.abs(i - radius); | ||
142 | - var hi = Math.min(i + radius, netsize); | ||
143 | - | ||
144 | - var j = i + 1; | ||
145 | - var k = i - 1; | ||
146 | - var m = 1; | ||
147 | - | ||
148 | - var p, a; | ||
149 | - while (j < hi || k > lo) { | ||
150 | - a = radpower[m++]; | ||
151 | - | ||
152 | - if (j < hi) { | ||
153 | - p = network[j++]; | ||
154 | - p[0] -= (a * (p[0] - b)) / alpharadbias; | ||
155 | - p[1] -= (a * (p[1] - g)) / alpharadbias; | ||
156 | - p[2] -= (a * (p[2] - r)) / alpharadbias; | ||
157 | - } | ||
158 | - | ||
159 | - if (k > lo) { | ||
160 | - p = network[k--]; | ||
161 | - p[0] -= (a * (p[0] - b)) / alpharadbias; | ||
162 | - p[1] -= (a * (p[1] - g)) / alpharadbias; | ||
163 | - p[2] -= (a * (p[2] - r)) / alpharadbias; | ||
164 | - } | ||
165 | - } | ||
166 | - } | ||
167 | - | ||
168 | - /* | ||
169 | - Private Method: contest | ||
170 | - | ||
171 | - searches for biased BGR values | ||
172 | - */ | ||
173 | - function contest(b, g, r) { | ||
174 | - /* | ||
175 | - finds closest neuron (min dist) and updates freq | ||
176 | - finds best neuron (min dist-bias) and returns position | ||
177 | - for frequently chosen neurons, freq[i] is high and bias[i] is negative | ||
178 | - bias[i] = gamma * ((1 / netsize) - freq[i]) | ||
179 | - */ | ||
180 | - | ||
181 | - var bestd = ~(1 << 31); | ||
182 | - var bestbiasd = bestd; | ||
183 | - var bestpos = -1; | ||
184 | - var bestbiaspos = bestpos; | ||
185 | - | ||
186 | - var i, n, dist, biasdist, betafreq; | ||
187 | - for (i = 0; i < netsize; i++) { | ||
188 | - n = network[i]; | ||
189 | - | ||
190 | - dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r); | ||
191 | - if (dist < bestd) { | ||
192 | - bestd = dist; | ||
193 | - bestpos = i; | ||
194 | - } | ||
195 | - | ||
196 | - biasdist = dist - (bias[i] >> (intbiasshift - netbiasshift)); | ||
197 | - if (biasdist < bestbiasd) { | ||
198 | - bestbiasd = biasdist; | ||
199 | - bestbiaspos = i; | ||
200 | - } | ||
201 | - | ||
202 | - betafreq = freq[i] >> betashift; | ||
203 | - freq[i] -= betafreq; | ||
204 | - bias[i] += betafreq << gammashift; | ||
205 | - } | ||
206 | - | ||
207 | - freq[bestpos] += beta; | ||
208 | - bias[bestpos] -= betagamma; | ||
209 | - | ||
210 | - return bestbiaspos; | ||
211 | - } | ||
212 | - | ||
213 | - /* | ||
214 | - Private Method: inxbuild | ||
215 | - | ||
216 | - sorts network and builds netindex[0..255] | ||
217 | - */ | ||
218 | - function inxbuild() { | ||
219 | - var i, | ||
220 | - j, | ||
221 | - p, | ||
222 | - q, | ||
223 | - smallpos, | ||
224 | - smallval, | ||
225 | - previouscol = 0, | ||
226 | - startpos = 0; | ||
227 | - for (i = 0; i < netsize; i++) { | ||
228 | - p = network[i]; | ||
229 | - smallpos = i; | ||
230 | - smallval = p[1]; // index on g | ||
231 | - // find smallest in i..netsize-1 | ||
232 | - for (j = i + 1; j < netsize; j++) { | ||
233 | - q = network[j]; | ||
234 | - if (q[1] < smallval) { | ||
235 | - // index on g | ||
236 | - smallpos = j; | ||
237 | - smallval = q[1]; // index on g | ||
238 | - } | ||
239 | - } | ||
240 | - q = network[smallpos]; | ||
241 | - // swap p (i) and q (smallpos) entries | ||
242 | - if (i != smallpos) { | ||
243 | - j = q[0]; | ||
244 | - q[0] = p[0]; | ||
245 | - p[0] = j; | ||
246 | - j = q[1]; | ||
247 | - q[1] = p[1]; | ||
248 | - p[1] = j; | ||
249 | - j = q[2]; | ||
250 | - q[2] = p[2]; | ||
251 | - p[2] = j; | ||
252 | - j = q[3]; | ||
253 | - q[3] = p[3]; | ||
254 | - p[3] = j; | ||
255 | - } | ||
256 | - // smallval entry is now in position i | ||
257 | - | ||
258 | - if (smallval != previouscol) { | ||
259 | - netindex[previouscol] = (startpos + i) >> 1; | ||
260 | - for (j = previouscol + 1; j < smallval; j++) netindex[j] = i; | ||
261 | - previouscol = smallval; | ||
262 | - startpos = i; | ||
263 | - } | ||
264 | - } | ||
265 | - netindex[previouscol] = (startpos + maxnetpos) >> 1; | ||
266 | - for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos; // really 256 | ||
267 | - } | ||
268 | - | ||
269 | - /* | ||
270 | - Private Method: inxsearch | ||
271 | - | ||
272 | - searches for BGR values 0..255 and returns a color index | ||
273 | - */ | ||
274 | - function inxsearch(b, g, r) { | ||
275 | - var a, p, dist; | ||
276 | - | ||
277 | - var bestd = 1000; // biggest possible dist is 256*3 | ||
278 | - var best = -1; | ||
279 | - | ||
280 | - var i = netindex[g]; // index on g | ||
281 | - var j = i - 1; // start at netindex[g] and work outwards | ||
282 | - | ||
283 | - while (i < netsize || j >= 0) { | ||
284 | - if (i < netsize) { | ||
285 | - p = network[i]; | ||
286 | - dist = p[1] - g; // inx key | ||
287 | - if (dist >= bestd) i = netsize; | ||
288 | - // stop iter | ||
289 | - else { | ||
290 | - i++; | ||
291 | - if (dist < 0) dist = -dist; | ||
292 | - a = p[0] - b; | ||
293 | - if (a < 0) a = -a; | ||
294 | - dist += a; | ||
295 | - if (dist < bestd) { | ||
296 | - a = p[2] - r; | ||
297 | - if (a < 0) a = -a; | ||
298 | - dist += a; | ||
299 | - if (dist < bestd) { | ||
300 | - bestd = dist; | ||
301 | - best = p[3]; | ||
302 | - } | ||
303 | - } | ||
304 | - } | ||
305 | - } | ||
306 | - if (j >= 0) { | ||
307 | - p = network[j]; | ||
308 | - dist = g - p[1]; // inx key - reverse dif | ||
309 | - if (dist >= bestd) j = -1; | ||
310 | - // stop iter | ||
311 | - else { | ||
312 | - j--; | ||
313 | - if (dist < 0) dist = -dist; | ||
314 | - a = p[0] - b; | ||
315 | - if (a < 0) a = -a; | ||
316 | - dist += a; | ||
317 | - if (dist < bestd) { | ||
318 | - a = p[2] - r; | ||
319 | - if (a < 0) a = -a; | ||
320 | - dist += a; | ||
321 | - if (dist < bestd) { | ||
322 | - bestd = dist; | ||
323 | - best = p[3]; | ||
324 | - } | ||
325 | - } | ||
326 | - } | ||
327 | - } | ||
328 | - } | ||
329 | - | ||
330 | - return best; | ||
331 | - } | ||
332 | - | ||
333 | - /* | ||
334 | - Private Method: learn | ||
335 | - | ||
336 | - "Main Learning Loop" | ||
337 | - */ | ||
338 | - function learn() { | ||
339 | - var i; | ||
340 | - | ||
341 | - var lengthcount = pixels.length; | ||
342 | - var alphadec = toInt(30 + (samplefac - 1) / 3); | ||
343 | - var samplepixels = toInt(lengthcount / (3 * samplefac)); | ||
344 | - var delta = toInt(samplepixels / ncycles); | ||
345 | - var alpha = initalpha; | ||
346 | - var radius = initradius; | ||
347 | - | ||
348 | - var rad = radius >> radiusbiasshift; | ||
349 | - | ||
350 | - if (rad <= 1) rad = 0; | ||
351 | - for (i = 0; i < rad; i++) | ||
352 | - radpower[i] = toInt( | ||
353 | - alpha * (((rad * rad - i * i) * radbias) / (rad * rad)) | ||
354 | - ); | ||
355 | - | ||
356 | - var step; | ||
357 | - if (lengthcount < minpicturebytes) { | ||
358 | - samplefac = 1; | ||
359 | - step = 3; | ||
360 | - } else if (lengthcount % prime1 !== 0) { | ||
361 | - step = 3 * prime1; | ||
362 | - } else if (lengthcount % prime2 !== 0) { | ||
363 | - step = 3 * prime2; | ||
364 | - } else if (lengthcount % prime3 !== 0) { | ||
365 | - step = 3 * prime3; | ||
366 | - } else { | ||
367 | - step = 3 * prime4; | ||
368 | - } | ||
369 | - | ||
370 | - var b, g, r, j; | ||
371 | - var pix = 0; // current pixel | ||
372 | - | ||
373 | - i = 0; | ||
374 | - while (i < samplepixels) { | ||
375 | - b = (pixels[pix] & 0xff) << netbiasshift; | ||
376 | - g = (pixels[pix + 1] & 0xff) << netbiasshift; | ||
377 | - r = (pixels[pix + 2] & 0xff) << netbiasshift; | ||
378 | - | ||
379 | - j = contest(b, g, r); | ||
380 | - | ||
381 | - altersingle(alpha, j, b, g, r); | ||
382 | - if (rad !== 0) alterneigh(rad, j, b, g, r); // alter neighbours | ||
383 | - | ||
384 | - pix += step; | ||
385 | - if (pix >= lengthcount) pix -= lengthcount; | ||
386 | - | ||
387 | - i++; | ||
388 | - | ||
389 | - if (delta === 0) delta = 1; | ||
390 | - if (i % delta === 0) { | ||
391 | - alpha -= alpha / alphadec; | ||
392 | - radius -= radius / radiusdec; | ||
393 | - rad = radius >> radiusbiasshift; | ||
394 | - | ||
395 | - if (rad <= 1) rad = 0; | ||
396 | - for (j = 0; j < rad; j++) | ||
397 | - radpower[j] = toInt( | ||
398 | - alpha * (((rad * rad - j * j) * radbias) / (rad * rad)) | ||
399 | - ); | ||
400 | - } | ||
401 | - } | ||
402 | - } | ||
403 | - | ||
404 | - /* | ||
405 | - Method: buildColormap | ||
406 | - | ||
407 | - 1. initializes network | ||
408 | - 2. trains it | ||
409 | - 3. removes misconceptions | ||
410 | - 4. builds colorindex | ||
411 | - */ | ||
412 | - function buildColormap() { | ||
413 | - init(); | ||
414 | - learn(); | ||
415 | - unbiasnet(); | ||
416 | - inxbuild(); | ||
417 | - } | ||
418 | - this.buildColormap = buildColormap; | ||
419 | - | ||
420 | - /* | ||
421 | - Method: getColormap | ||
422 | - | ||
423 | - builds colormap from the index | ||
424 | - | ||
425 | - returns array in the format: | ||
426 | - | ||
427 | - > | ||
428 | - > [r, g, b, r, g, b, r, g, b, ..] | ||
429 | - > | ||
430 | - */ | ||
431 | - function getColormap() { | ||
432 | - var map = []; | ||
433 | - var index = []; | ||
434 | - | ||
435 | - for (var i = 0; i < netsize; i++) index[network[i][3]] = i; | ||
436 | - | ||
437 | - var k = 0; | ||
438 | - for (var l = 0; l < netsize; l++) { | ||
439 | - var j = index[l]; | ||
440 | - map[k++] = network[j][0]; | ||
441 | - map[k++] = network[j][1]; | ||
442 | - map[k++] = network[j][2]; | ||
443 | - } | ||
444 | - return map; | ||
445 | - } | ||
446 | - this.getColormap = getColormap; | ||
447 | - | ||
448 | - /* | ||
449 | - Method: lookupRGB | ||
450 | - | ||
451 | - looks for the closest *r*, *g*, *b* color in the map and | ||
452 | - returns its index | ||
453 | - */ | ||
454 | - this.lookupRGB = inxsearch; | ||
455 | -} | ||
456 | - | ||
457 | -module.exports = NeuQuant; |
1 | -/* NeuQuant Neural-Net Quantization Algorithm | ||
2 | - * ------------------------------------------ | ||
3 | - * | ||
4 | - * Copyright (c) 1994 Anthony Dekker | ||
5 | - * | ||
6 | - * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. | ||
7 | - * See "Kohonen neural networks for optimal colour quantization" | ||
8 | - * in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367. | ||
9 | - * for a discussion of the algorithm. | ||
10 | - * See also http://members.ozemail.com.au/~dekker/NEUQUANT.HTML | ||
11 | - * | ||
12 | - * Any party obtaining a copy of these files from the author, directly or | ||
13 | - * indirectly, is granted, free of charge, a full and unrestricted irrevocable, | ||
14 | - * world-wide, paid up, royalty-free, nonexclusive right and license to deal | ||
15 | - * in this software and documentation files (the "Software"), including without | ||
16 | - * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
17 | - * and/or sell copies of the Software, and to permit persons who receive | ||
18 | - * copies from any such party to do so, with the only requirement being | ||
19 | - * that this copyright notice remain intact. | ||
20 | - * | ||
21 | - * (JavaScript port 2012 by Johan Nordberg) | ||
22 | - */ | ||
23 | - | ||
24 | -var ncycles = 100; // number of learning cycles | ||
25 | -var netsize = 256; // number of colors used | ||
26 | -var maxnetpos = netsize - 1; | ||
27 | - | ||
28 | -// defs for freq and bias | ||
29 | -var netbiasshift = 4; // bias for colour values | ||
30 | -var intbiasshift = 16; // bias for fractions | ||
31 | -var intbias = 1 << intbiasshift; | ||
32 | -var gammashift = 10; | ||
33 | -var gamma = 1 << gammashift; | ||
34 | -var betashift = 10; | ||
35 | -var beta = intbias >> betashift; /* beta = 1/1024 */ | ||
36 | -var betagamma = intbias << (gammashift - betashift); | ||
37 | - | ||
38 | -// defs for decreasing radius factor | ||
39 | -var initrad = netsize >> 3; // for 256 cols, radius starts | ||
40 | -var radiusbiasshift = 6; // at 32.0 biased by 6 bits | ||
41 | -var radiusbias = 1 << radiusbiasshift; | ||
42 | -var initradius = initrad * radiusbias; //and decreases by a | ||
43 | -var radiusdec = 30; // factor of 1/30 each cycle | ||
44 | - | ||
45 | -// defs for decreasing alpha factor | ||
46 | -var alphabiasshift = 10; // alpha starts at 1.0 | ||
47 | -var initalpha = 1 << alphabiasshift; | ||
48 | -var alphadec; // biased by 10 bits | ||
49 | - | ||
50 | -/* radbias and alpharadbias used for radpower calculation */ | ||
51 | -var radbiasshift = 8; | ||
52 | -var radbias = 1 << radbiasshift; | ||
53 | -var alpharadbshift = alphabiasshift + radbiasshift; | ||
54 | -var alpharadbias = 1 << alpharadbshift; | ||
55 | - | ||
56 | -// four primes near 500 - assume no image has a length so large that it is | ||
57 | -// divisible by all four primes | ||
58 | -var prime1 = 499; | ||
59 | -var prime2 = 491; | ||
60 | -var prime3 = 487; | ||
61 | -var prime4 = 503; | ||
62 | -var minpicturebytes = 3 * prime4; | ||
63 | - | ||
64 | -/* | ||
65 | - Constructor: NeuQuant | ||
66 | - | ||
67 | - Arguments: | ||
68 | - | ||
69 | - pixels - array of pixels in RGB format | ||
70 | - samplefac - sampling factor 1 to 30 where lower is better quality | ||
71 | - | ||
72 | - > | ||
73 | - > pixels = [r, g, b, r, g, b, r, g, b, ..] | ||
74 | - > | ||
75 | -*/ | ||
76 | -function NeuQuant(pixels, samplefac) { | ||
77 | - var network; // int[netsize][4] | ||
78 | - var netindex; // for network lookup - really 256 | ||
79 | - | ||
80 | - // bias and freq arrays for learning | ||
81 | - var bias; | ||
82 | - var freq; | ||
83 | - var radpower; | ||
84 | - | ||
85 | - /* | ||
86 | - Private Method: init | ||
87 | - | ||
88 | - sets up arrays | ||
89 | - */ | ||
90 | - function init() { | ||
91 | - network = []; | ||
92 | - netindex = new Int32Array(256); | ||
93 | - bias = new Int32Array(netsize); | ||
94 | - freq = new Int32Array(netsize); | ||
95 | - radpower = new Int32Array(netsize >> 3); | ||
96 | - | ||
97 | - var i, v; | ||
98 | - for (i = 0; i < netsize; i++) { | ||
99 | - v = (i << (netbiasshift + 8)) / netsize; | ||
100 | - network[i] = new Float64Array([v, v, v, 0]); | ||
101 | - //network[i] = [v, v, v, 0] | ||
102 | - freq[i] = intbias / netsize; | ||
103 | - bias[i] = 0; | ||
104 | - } | ||
105 | - } | ||
106 | - | ||
107 | - /* | ||
108 | - Private Method: unbiasnet | ||
109 | - | ||
110 | - unbiases network to give byte values 0..255 and record position i to prepare for sort | ||
111 | - */ | ||
112 | - function unbiasnet() { | ||
113 | - for (var i = 0; i < netsize; i++) { | ||
114 | - network[i][0] >>= netbiasshift; | ||
115 | - network[i][1] >>= netbiasshift; | ||
116 | - network[i][2] >>= netbiasshift; | ||
117 | - network[i][3] = i; // record color number | ||
118 | - } | ||
119 | - } | ||
120 | - | ||
121 | - /* | ||
122 | - Private Method: altersingle | ||
123 | - | ||
124 | - moves neuron *i* towards biased (b,g,r) by factor *alpha* | ||
125 | - */ | ||
126 | - function altersingle(alpha, i, b, g, r) { | ||
127 | - network[i][0] -= (alpha * (network[i][0] - b)) / initalpha; | ||
128 | - network[i][1] -= (alpha * (network[i][1] - g)) / initalpha; | ||
129 | - network[i][2] -= (alpha * (network[i][2] - r)) / initalpha; | ||
130 | - } | ||
131 | - | ||
132 | - /* | ||
133 | - Private Method: alterneigh | ||
134 | - | ||
135 | - moves neurons in *radius* around index *i* towards biased (b,g,r) by factor *alpha* | ||
136 | - */ | ||
137 | - function alterneigh(radius, i, b, g, r) { | ||
138 | - var lo = Math.abs(i - radius); | ||
139 | - var hi = Math.min(i + radius, netsize); | ||
140 | - | ||
141 | - var j = i + 1; | ||
142 | - var k = i - 1; | ||
143 | - var m = 1; | ||
144 | - | ||
145 | - var p, a; | ||
146 | - while (j < hi || k > lo) { | ||
147 | - a = radpower[m++]; | ||
148 | - | ||
149 | - if (j < hi) { | ||
150 | - p = network[j++]; | ||
151 | - p[0] -= (a * (p[0] - b)) / alpharadbias; | ||
152 | - p[1] -= (a * (p[1] - g)) / alpharadbias; | ||
153 | - p[2] -= (a * (p[2] - r)) / alpharadbias; | ||
154 | - } | ||
155 | - | ||
156 | - if (k > lo) { | ||
157 | - p = network[k--]; | ||
158 | - p[0] -= (a * (p[0] - b)) / alpharadbias; | ||
159 | - p[1] -= (a * (p[1] - g)) / alpharadbias; | ||
160 | - p[2] -= (a * (p[2] - r)) / alpharadbias; | ||
161 | - } | ||
162 | - } | ||
163 | - } | ||
164 | - | ||
165 | - /* | ||
166 | - Private Method: contest | ||
167 | - | ||
168 | - searches for biased BGR values | ||
169 | - */ | ||
170 | - function contest(b, g, r) { | ||
171 | - /* | ||
172 | - finds closest neuron (min dist) and updates freq | ||
173 | - finds best neuron (min dist-bias) and returns position | ||
174 | - for frequently chosen neurons, freq[i] is high and bias[i] is negative | ||
175 | - bias[i] = gamma * ((1 / netsize) - freq[i]) | ||
176 | - */ | ||
177 | - | ||
178 | - var bestd = ~(1 << 31); | ||
179 | - var bestbiasd = bestd; | ||
180 | - var bestpos = -1; | ||
181 | - var bestbiaspos = bestpos; | ||
182 | - | ||
183 | - var i, n, dist, biasdist, betafreq; | ||
184 | - for (i = 0; i < netsize; i++) { | ||
185 | - n = network[i]; | ||
186 | - | ||
187 | - dist = Math.abs(n[0] - b) + Math.abs(n[1] - g) + Math.abs(n[2] - r); | ||
188 | - if (dist < bestd) { | ||
189 | - bestd = dist; | ||
190 | - bestpos = i; | ||
191 | - } | ||
192 | - | ||
193 | - biasdist = dist - (bias[i] >> (intbiasshift - netbiasshift)); | ||
194 | - if (biasdist < bestbiasd) { | ||
195 | - bestbiasd = biasdist; | ||
196 | - bestbiaspos = i; | ||
197 | - } | ||
198 | - | ||
199 | - betafreq = freq[i] >> betashift; | ||
200 | - freq[i] -= betafreq; | ||
201 | - bias[i] += betafreq << gammashift; | ||
202 | - } | ||
203 | - | ||
204 | - freq[bestpos] += beta; | ||
205 | - bias[bestpos] -= betagamma; | ||
206 | - | ||
207 | - return bestbiaspos; | ||
208 | - } | ||
209 | - | ||
210 | - /* | ||
211 | - Private Method: inxbuild | ||
212 | - | ||
213 | - sorts network and builds netindex[0..255] | ||
214 | - */ | ||
215 | - function inxbuild() { | ||
216 | - var i, | ||
217 | - j, | ||
218 | - p, | ||
219 | - q, | ||
220 | - smallpos, | ||
221 | - smallval, | ||
222 | - previouscol = 0, | ||
223 | - startpos = 0; | ||
224 | - for (i = 0; i < netsize; i++) { | ||
225 | - p = network[i]; | ||
226 | - smallpos = i; | ||
227 | - smallval = p[1]; // index on g | ||
228 | - // find smallest in i..netsize-1 | ||
229 | - for (j = i + 1; j < netsize; j++) { | ||
230 | - q = network[j]; | ||
231 | - if (q[1] < smallval) { | ||
232 | - // index on g | ||
233 | - smallpos = j; | ||
234 | - smallval = q[1]; // index on g | ||
235 | - } | ||
236 | - } | ||
237 | - q = network[smallpos]; | ||
238 | - // swap p (i) and q (smallpos) entries | ||
239 | - if (i != smallpos) { | ||
240 | - j = q[0]; | ||
241 | - q[0] = p[0]; | ||
242 | - p[0] = j; | ||
243 | - j = q[1]; | ||
244 | - q[1] = p[1]; | ||
245 | - p[1] = j; | ||
246 | - j = q[2]; | ||
247 | - q[2] = p[2]; | ||
248 | - p[2] = j; | ||
249 | - j = q[3]; | ||
250 | - q[3] = p[3]; | ||
251 | - p[3] = j; | ||
252 | - } | ||
253 | - // smallval entry is now in position i | ||
254 | - | ||
255 | - if (smallval != previouscol) { | ||
256 | - netindex[previouscol] = (startpos + i) >> 1; | ||
257 | - for (j = previouscol + 1; j < smallval; j++) netindex[j] = i; | ||
258 | - previouscol = smallval; | ||
259 | - startpos = i; | ||
260 | - } | ||
261 | - } | ||
262 | - netindex[previouscol] = (startpos + maxnetpos) >> 1; | ||
263 | - for (j = previouscol + 1; j < 256; j++) netindex[j] = maxnetpos; // really 256 | ||
264 | - } | ||
265 | - | ||
266 | - /* | ||
267 | - Private Method: inxsearch | ||
268 | - | ||
269 | - searches for BGR values 0..255 and returns a color index | ||
270 | - */ | ||
271 | - function inxsearch(b, g, r) { | ||
272 | - var a, p, dist; | ||
273 | - | ||
274 | - var bestd = 1000; // biggest possible dist is 256*3 | ||
275 | - var best = -1; | ||
276 | - | ||
277 | - var i = netindex[g]; // index on g | ||
278 | - var j = i - 1; // start at netindex[g] and work outwards | ||
279 | - | ||
280 | - while (i < netsize || j >= 0) { | ||
281 | - if (i < netsize) { | ||
282 | - p = network[i]; | ||
283 | - dist = p[1] - g; // inx key | ||
284 | - if (dist >= bestd) i = netsize; | ||
285 | - // stop iter | ||
286 | - else { | ||
287 | - i++; | ||
288 | - if (dist < 0) dist = -dist; | ||
289 | - a = p[0] - b; | ||
290 | - if (a < 0) a = -a; | ||
291 | - dist += a; | ||
292 | - if (dist < bestd) { | ||
293 | - a = p[2] - r; | ||
294 | - if (a < 0) a = -a; | ||
295 | - dist += a; | ||
296 | - if (dist < bestd) { | ||
297 | - bestd = dist; | ||
298 | - best = p[3]; | ||
299 | - } | ||
300 | - } | ||
301 | - } | ||
302 | - } | ||
303 | - if (j >= 0) { | ||
304 | - p = network[j]; | ||
305 | - dist = g - p[1]; // inx key - reverse dif | ||
306 | - if (dist >= bestd) j = -1; | ||
307 | - // stop iter | ||
308 | - else { | ||
309 | - j--; | ||
310 | - if (dist < 0) dist = -dist; | ||
311 | - a = p[0] - b; | ||
312 | - if (a < 0) a = -a; | ||
313 | - dist += a; | ||
314 | - if (dist < bestd) { | ||
315 | - a = p[2] - r; | ||
316 | - if (a < 0) a = -a; | ||
317 | - dist += a; | ||
318 | - if (dist < bestd) { | ||
319 | - bestd = dist; | ||
320 | - best = p[3]; | ||
321 | - } | ||
322 | - } | ||
323 | - } | ||
324 | - } | ||
325 | - } | ||
326 | - | ||
327 | - return best; | ||
328 | - } | ||
329 | - | ||
330 | - /* | ||
331 | - Private Method: learn | ||
332 | - | ||
333 | - "Main Learning Loop" | ||
334 | - */ | ||
335 | - function learn() { | ||
336 | - var i; | ||
337 | - | ||
338 | - var lengthcount = pixels.length; | ||
339 | - var alphadec = 30 + (samplefac - 1) / 3; | ||
340 | - var samplepixels = lengthcount / (3 * samplefac); | ||
341 | - var delta = ~~(samplepixels / ncycles); | ||
342 | - var alpha = initalpha; | ||
343 | - var radius = initradius; | ||
344 | - | ||
345 | - var rad = radius >> radiusbiasshift; | ||
346 | - | ||
347 | - if (rad <= 1) rad = 0; | ||
348 | - for (i = 0; i < rad; i++) | ||
349 | - radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad)); | ||
350 | - | ||
351 | - var step; | ||
352 | - if (lengthcount < minpicturebytes) { | ||
353 | - samplefac = 1; | ||
354 | - step = 3; | ||
355 | - } else if (lengthcount % prime1 !== 0) { | ||
356 | - step = 3 * prime1; | ||
357 | - } else if (lengthcount % prime2 !== 0) { | ||
358 | - step = 3 * prime2; | ||
359 | - } else if (lengthcount % prime3 !== 0) { | ||
360 | - step = 3 * prime3; | ||
361 | - } else { | ||
362 | - step = 3 * prime4; | ||
363 | - } | ||
364 | - | ||
365 | - var b, g, r, j; | ||
366 | - var pix = 0; // current pixel | ||
367 | - | ||
368 | - i = 0; | ||
369 | - while (i < samplepixels) { | ||
370 | - b = (pixels[pix] & 0xff) << netbiasshift; | ||
371 | - g = (pixels[pix + 1] & 0xff) << netbiasshift; | ||
372 | - r = (pixels[pix + 2] & 0xff) << netbiasshift; | ||
373 | - | ||
374 | - j = contest(b, g, r); | ||
375 | - | ||
376 | - altersingle(alpha, j, b, g, r); | ||
377 | - if (rad !== 0) alterneigh(rad, j, b, g, r); // alter neighbours | ||
378 | - | ||
379 | - pix += step; | ||
380 | - if (pix >= lengthcount) pix -= lengthcount; | ||
381 | - | ||
382 | - i++; | ||
383 | - | ||
384 | - if (delta === 0) delta = 1; | ||
385 | - if (i % delta === 0) { | ||
386 | - alpha -= alpha / alphadec; | ||
387 | - radius -= radius / radiusdec; | ||
388 | - rad = radius >> radiusbiasshift; | ||
389 | - | ||
390 | - if (rad <= 1) rad = 0; | ||
391 | - for (j = 0; j < rad; j++) | ||
392 | - radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad)); | ||
393 | - } | ||
394 | - } | ||
395 | - } | ||
396 | - | ||
397 | - /* | ||
398 | - Method: buildColormap | ||
399 | - | ||
400 | - 1. initializes network | ||
401 | - 2. trains it | ||
402 | - 3. removes misconceptions | ||
403 | - 4. builds colorindex | ||
404 | - */ | ||
405 | - function buildColormap() { | ||
406 | - init(); | ||
407 | - learn(); | ||
408 | - unbiasnet(); | ||
409 | - inxbuild(); | ||
410 | - } | ||
411 | - this.buildColormap = buildColormap; | ||
412 | - | ||
413 | - /* | ||
414 | - Method: getColormap | ||
415 | - | ||
416 | - builds colormap from the index | ||
417 | - | ||
418 | - returns array in the format: | ||
419 | - | ||
420 | - > | ||
421 | - > [r, g, b, r, g, b, r, g, b, ..] | ||
422 | - > | ||
423 | - */ | ||
424 | - function getColormap() { | ||
425 | - var map = []; | ||
426 | - var index = []; | ||
427 | - | ||
428 | - for (var i = 0; i < netsize; i++) index[network[i][3]] = i; | ||
429 | - | ||
430 | - var k = 0; | ||
431 | - for (var l = 0; l < netsize; l++) { | ||
432 | - var j = index[l]; | ||
433 | - map[k++] = network[j][0]; | ||
434 | - map[k++] = network[j][1]; | ||
435 | - map[k++] = network[j][2]; | ||
436 | - } | ||
437 | - return map; | ||
438 | - } | ||
439 | - this.getColormap = getColormap; | ||
440 | - | ||
441 | - /* | ||
442 | - Method: lookupRGB | ||
443 | - | ||
444 | - looks for the closest *r*, *g*, *b* color in the map and | ||
445 | - returns its index | ||
446 | - */ | ||
447 | - this.lookupRGB = inxsearch; | ||
448 | -} | ||
449 | - | ||
450 | -module.exports = NeuQuant; |
-
Please register or login to post a comment