piclaw 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/defult-D5RLDUrI.js +1 -0
- package/.output/public/assets/{dist-CMBqBOCp.js → dist-BH_oa-kv.js} +1 -1
- package/.output/public/assets/index-7JvURuHy.js +204 -0
- package/.output/public/assets/index-K43slwjJ.css +1 -0
- package/.output/public/index.html +11 -2
- package/.output/server/_...path_.get.mjs +16 -0
- package/.output/server/_chunks/app.mjs +261 -181
- package/.output/server/_chunks/browser.mjs +4 -1
- package/.output/server/_chunks/config.mjs +4 -0
- package/.output/server/_chunks/db.mjs +32 -28
- package/.output/server/_chunks/device-bus.mjs +123 -0
- package/.output/server/_chunks/dummy.mjs +1 -1
- package/.output/server/_chunks/logger.mjs +23 -0
- package/.output/server/_chunks/login.mjs +1 -1
- package/.output/server/_chunks/notes.mjs +1 -3
- package/.output/server/_chunks/renderer-template.mjs +1 -1
- package/.output/server/_chunks/sandbox.mjs +217 -0
- package/.output/server/_chunks/server.mjs +2302 -122
- package/.output/server/_chunks/terminal.mjs +63 -8
- package/.output/server/_chunks/uploads.mjs +60 -0
- package/.output/server/_chunks/virtual.mjs +192 -54
- package/.output/server/_id_.delete.mjs +5 -2
- package/.output/server/_id_.patch.mjs +2 -0
- package/.output/server/_id_2.delete.mjs +8 -0
- package/.output/server/_jid_.delete.mjs +5 -2
- package/.output/server/_jid_.patch.mjs +37 -4
- package/.output/server/_jid_2.delete.mjs +5 -2
- package/.output/server/_libs/@acemir/cssom+[...].mjs +2269 -1137
- package/.output/server/_libs/@google/genai.mjs +337 -273
- package/.output/server/_libs/@mariozechner/pi-agent-core+[...].mjs +381 -2073
- package/.output/server/_libs/@mariozechner/pi-coding-agent+[...].mjs +231 -131
- package/.output/server/_libs/_.mjs +3 -2
- package/.output/server/_libs/_10.mjs +2 -4
- package/.output/server/_libs/_11.mjs +2 -4
- package/.output/server/_libs/_12.mjs +2 -3
- package/.output/server/_libs/_13.mjs +2 -3
- package/.output/server/_libs/_14.mjs +2 -4
- package/.output/server/_libs/_15.mjs +2 -4
- package/.output/server/_libs/_16.mjs +2 -3
- package/.output/server/_libs/_17.mjs +2 -4
- package/.output/server/_libs/_18.mjs +2 -2
- package/.output/server/_libs/_19.mjs +2 -2
- package/.output/server/_libs/_2.mjs +3 -3
- package/.output/server/_libs/_20.mjs +2 -2
- package/.output/server/_libs/_21.mjs +2 -2
- package/.output/server/_libs/_22.mjs +2 -2
- package/.output/server/_libs/_23.mjs +2 -2
- package/.output/server/_libs/_24.mjs +2 -2
- package/.output/server/_libs/_25.mjs +2 -2
- package/.output/server/_libs/_26.mjs +2 -2
- package/.output/server/_libs/_27.mjs +2 -2
- package/.output/server/_libs/_28.mjs +2 -2
- package/.output/server/_libs/_29.mjs +2 -2
- package/.output/server/_libs/_3.mjs +3 -3
- package/.output/server/_libs/_30.mjs +2 -2
- package/.output/server/_libs/_31.mjs +2 -2
- package/.output/server/_libs/_32.mjs +2 -2
- package/.output/server/_libs/_33.mjs +2 -2
- package/.output/server/_libs/_34.mjs +2 -2
- package/.output/server/_libs/_35.mjs +2 -2
- package/.output/server/_libs/_36.mjs +2 -2
- package/.output/server/_libs/_37.mjs +2 -2
- package/.output/server/_libs/_38.mjs +2 -2
- package/.output/server/_libs/_39.mjs +2 -2
- package/.output/server/_libs/_4.mjs +4 -3
- package/.output/server/_libs/_40.mjs +2 -2
- package/.output/server/_libs/_41.mjs +2 -2
- package/.output/server/_libs/_42.mjs +2 -2
- package/.output/server/_libs/_43.mjs +2 -2
- package/.output/server/_libs/_44.mjs +2 -2
- package/.output/server/_libs/_45.mjs +2 -2
- package/.output/server/_libs/_46.mjs +2 -2
- package/.output/server/_libs/_47.mjs +2 -2
- package/.output/server/_libs/_48.mjs +2 -2
- package/.output/server/_libs/_49.mjs +2 -2
- package/.output/server/_libs/_5.mjs +2 -3
- package/.output/server/_libs/_50.mjs +2 -2
- package/.output/server/_libs/_51.mjs +2 -2
- package/.output/server/_libs/_52.mjs +2 -2
- package/.output/server/_libs/_53.mjs +2 -2
- package/.output/server/_libs/_54.mjs +2 -2
- package/.output/server/_libs/_55.mjs +2 -2
- package/.output/server/_libs/_56.mjs +2 -2
- package/.output/server/_libs/_57.mjs +2 -2
- package/.output/server/_libs/_58.mjs +2 -2
- package/.output/server/_libs/_59.mjs +2 -2
- package/.output/server/_libs/_6.mjs +2 -3
- package/.output/server/_libs/_60.mjs +2 -2
- package/.output/server/_libs/_61.mjs +2 -2
- package/.output/server/_libs/_62.mjs +2 -2
- package/.output/server/_libs/_63.mjs +2 -2
- package/.output/server/_libs/_64.mjs +2 -2
- package/.output/server/_libs/_65.mjs +2 -2
- package/.output/server/_libs/_66.mjs +2 -2
- package/.output/server/_libs/_67.mjs +2 -2
- package/.output/server/_libs/_68.mjs +2 -2
- package/.output/server/_libs/_69.mjs +2 -2
- package/.output/server/_libs/_7.mjs +2 -5
- package/.output/server/_libs/_70.mjs +2 -2
- package/.output/server/_libs/_71.mjs +2 -2
- package/.output/server/_libs/_72.mjs +2 -2
- package/.output/server/_libs/_73.mjs +2 -2
- package/.output/server/_libs/_74.mjs +2 -2
- package/.output/server/_libs/_75.mjs +2 -2
- package/.output/server/_libs/_76.mjs +2 -2
- package/.output/server/_libs/_77.mjs +2 -2
- package/.output/server/_libs/_78.mjs +2 -2
- package/.output/server/_libs/_79.mjs +2 -2
- package/.output/server/_libs/_8.mjs +2 -3
- package/.output/server/_libs/_80.mjs +2 -2
- package/.output/server/_libs/_81.mjs +2 -2
- package/.output/server/_libs/_82.mjs +2 -2
- package/.output/server/_libs/_83.mjs +2 -2
- package/.output/server/_libs/_84.mjs +2 -2
- package/.output/server/_libs/_85.mjs +2 -2
- package/.output/server/_libs/_86.mjs +2 -2
- package/.output/server/_libs/_87.mjs +2 -2
- package/.output/server/_libs/_88.mjs +2 -2
- package/.output/server/_libs/_89.mjs +2 -2
- package/.output/server/_libs/_9.mjs +2 -4
- package/.output/server/_libs/_90.mjs +5 -2
- package/.output/server/_libs/_91.mjs +3 -2
- package/.output/server/_libs/_92.mjs +2 -2
- package/.output/server/_libs/_93.mjs +2 -2
- package/.output/server/_libs/_94.mjs +2 -2
- package/.output/server/_libs/agent-base.mjs +1 -1
- package/.output/server/_libs/cheerio+[...].mjs +1 -1
- package/.output/server/_libs/data-uri-to-buffer.mjs +2 -67
- package/.output/server/_libs/data-urls+[...].mjs +1 -1
- package/.output/server/_libs/diff.mjs +1 -1
- package/.output/server/_libs/exodus__bytes.mjs +99 -81
- package/.output/server/_libs/fetch-blob+node-domexception.mjs +1 -1
- package/.output/server/_libs/h3+rou3+srvx.mjs +34 -4
- package/.output/server/_libs/html-encoding-sniffer.mjs +1 -1
- package/.output/server/_libs/https-proxy-agent.mjs +2 -2
- package/.output/server/_libs/jsdom.mjs +1 -1
- package/.output/server/_libs/just-bash+[...].mjs +4676 -3916
- package/.output/server/_libs/mariozechner__jiti.mjs +1 -1
- package/.output/server/_libs/mariozechner__pi-ai.mjs +1472 -0
- package/.output/server/_libs/md4x.mjs +1 -1
- package/.output/server/_libs/mime.mjs +838 -1
- package/.output/server/_libs/node-fetch.mjs +4 -4
- package/.output/server/_libs/node-liblzma.mjs +1 -1
- package/.output/server/_libs/silvia-odwyer__photon-node.mjs +1 -1
- package/.output/server/_routes/api/auth/approve.mjs +2 -0
- package/.output/server/_routes/api/auth/revoke.mjs +2 -0
- package/.output/server/_routes/api/auth/status.mjs +25 -6
- package/.output/server/_routes/api/browser2.mjs +1 -1
- package/.output/server/_routes/api/config2.mjs +2 -0
- package/.output/server/_routes/api/device_events.mjs +36 -0
- package/.output/server/_routes/api/files/groups.mjs +1 -2
- package/.output/server/_routes/api/files/raw.mjs +1 -1
- package/.output/server/_routes/api/groups.mjs +5 -3
- package/.output/server/_routes/api/groups2.mjs +18 -6
- package/.output/server/_routes/api/health.mjs +1 -2
- package/.output/server/_routes/api/messages.mjs +7 -1
- package/.output/server/_routes/api/notes/delete.mjs +4 -1
- package/.output/server/_routes/api/notes/write.mjs +2 -0
- package/.output/server/_routes/api/ntfy/setup.mjs +8 -0
- package/.output/server/_routes/api/pi/apikey.mjs +3 -2
- package/.output/server/_routes/api/pi/apikey_providers.mjs +1 -2
- package/.output/server/_routes/api/pi/commands.mjs +13 -3
- package/.output/server/_routes/api/pi/login/events.mjs +0 -1
- package/.output/server/_routes/api/pi/login/respond.mjs +2 -1
- package/.output/server/_routes/api/pi/login.mjs +1 -2
- package/.output/server/_routes/api/pi/logout.mjs +2 -1
- package/.output/server/_routes/api/pi/models.mjs +1 -2
- package/.output/server/_routes/api/pi/models_config2.mjs +2 -0
- package/.output/server/_routes/api/pi/settings2.mjs +2 -0
- package/.output/server/_routes/api/pi/status.mjs +1 -2
- package/.output/server/_routes/api/proxy.mjs +19 -1
- package/.output/server/_routes/api/sandbox.mjs +26 -0
- package/.output/server/_routes/api/sandbox2.mjs +17 -0
- package/.output/server/_routes/api/send.mjs +26 -18
- package/.output/server/_routes/api/status.mjs +1 -3
- package/.output/server/_routes/api/stop.mjs +11 -0
- package/.output/server/_routes/api/store/plugins.mjs +75 -0
- package/.output/server/_routes/api/store/skills.mjs +11 -0
- package/.output/server/_routes/api/tasks2.mjs +3 -2
- package/.output/server/_routes/api/telegram/setup.mjs +5 -2
- package/.output/server/_routes/api/telegram/status.mjs +1 -2
- package/.output/server/_routes/api/terminal2.mjs +2 -1
- package/.output/server/_routes/api/tunnel/setup.mjs +4 -2
- package/.output/server/_runtime.mjs +1 -2
- package/.output/server/_utils.mjs +10 -2
- package/.output/server/index.mjs +1 -1
- package/.output/server/node_modules/amdefine/amdefine.js +301 -0
- package/.output/server/node_modules/amdefine/package.json +16 -0
- package/.output/server/node_modules/compressjs/lib/BWT.js +420 -0
- package/.output/server/node_modules/compressjs/lib/BWTC.js +234 -0
- package/.output/server/node_modules/compressjs/lib/BitStream.js +108 -0
- package/.output/server/node_modules/compressjs/lib/Bzip2.js +936 -0
- package/.output/server/node_modules/compressjs/lib/CRC32.js +105 -0
- package/.output/server/node_modules/compressjs/lib/Context1Model.js +56 -0
- package/.output/server/node_modules/compressjs/lib/DefSumModel.js +152 -0
- package/.output/server/node_modules/compressjs/lib/DeflateDistanceModel.js +55 -0
- package/.output/server/node_modules/compressjs/lib/Dmc.js +197 -0
- package/.output/server/node_modules/compressjs/lib/DummyRangeCoder.js +81 -0
- package/.output/server/node_modules/compressjs/lib/FenwickModel.js +194 -0
- package/.output/server/node_modules/compressjs/lib/Huffman.js +514 -0
- package/.output/server/node_modules/compressjs/lib/HuffmanAllocator.js +227 -0
- package/.output/server/node_modules/compressjs/lib/LogDistanceModel.js +46 -0
- package/.output/server/node_modules/compressjs/lib/Lzjb.js +300 -0
- package/.output/server/node_modules/compressjs/lib/LzjbR.js +241 -0
- package/.output/server/node_modules/compressjs/lib/Lzp3.js +273 -0
- package/.output/server/node_modules/compressjs/lib/MTFModel.js +208 -0
- package/.output/server/node_modules/compressjs/lib/NoModel.js +46 -0
- package/.output/server/node_modules/compressjs/lib/PPM.js +343 -0
- package/.output/server/node_modules/compressjs/lib/RangeCoder.js +238 -0
- package/.output/server/node_modules/compressjs/lib/Simple.js +111 -0
- package/.output/server/node_modules/compressjs/lib/Stream.js +53 -0
- package/.output/server/node_modules/compressjs/lib/Util.js +324 -0
- package/.output/server/node_modules/compressjs/lib/freeze.js +14 -0
- package/.output/server/node_modules/compressjs/main.js +29 -0
- package/.output/server/node_modules/compressjs/package.json +35 -0
- package/.output/server/package.json +2 -1
- package/README.md +10 -1
- package/lib/index.d.mts +1 -0
- package/lib/index.mjs +1 -0
- package/lib/piclaw.mjs +100 -0
- package/lib/utils.mjs +96 -0
- package/package.json +16 -11
- package/.output/public/assets/defult-CMO6TZ5a.js +0 -1
- package/.output/public/assets/index-jdnbJw-M.js +0 -204
- package/.output/public/assets/index-ooXrRwgl.css +0 -1
- package/.output/server/_chunks/commands.mjs +0 -282
- package/.output/server/_chunks/pi.mjs +0 -202
- package/.output/server/_chunks/session.mjs +0 -1114
- package/.output/server/_libs/@aws-crypto/crc32+[...].mjs +0 -299
- package/.output/server/_libs/@aws-sdk/client-bedrock-runtime+[...].mjs +0 -17828
- package/.output/server/_libs/@aws-sdk/credential-provider-http+[...].mjs +0 -122
- package/.output/server/_libs/@aws-sdk/credential-provider-ini+[...].mjs +0 -417
- package/.output/server/_libs/@aws-sdk/credential-provider-process+[...].mjs +0 -54
- package/.output/server/_libs/@aws-sdk/credential-provider-sso+[...].mjs +0 -1151
- package/.output/server/_libs/@aws-sdk/credential-provider-web-identity+[...].mjs +0 -50
- package/.output/server/_libs/@smithy/credential-provider-imds+[...].mjs +0 -369
- package/.output/server/_libs/@tootallnate/quickjs-emscripten+[...].mjs +0 -3011
- package/.output/server/_libs/_100.mjs +0 -2
- package/.output/server/_libs/_101.mjs +0 -2
- package/.output/server/_libs/_102.mjs +0 -5
- package/.output/server/_libs/_103.mjs +0 -3
- package/.output/server/_libs/_104.mjs +0 -2
- package/.output/server/_libs/_105.mjs +0 -3
- package/.output/server/_libs/_106.mjs +0 -2
- package/.output/server/_libs/_107.mjs +0 -2
- package/.output/server/_libs/_95.mjs +0 -2
- package/.output/server/_libs/_96.mjs +0 -2
- package/.output/server/_libs/_97.mjs +0 -2
- package/.output/server/_libs/_98.mjs +0 -2
- package/.output/server/_libs/_99.mjs +0 -2
- package/.output/server/_libs/amdefine.mjs +0 -188
- package/.output/server/_libs/ast-types.mjs +0 -2270
- package/.output/server/_libs/aws-sdk__nested-clients.mjs +0 -3141
- package/.output/server/_libs/basic-ftp.mjs +0 -1906
- package/.output/server/_libs/compressjs.mjs +0 -50
- package/.output/server/_libs/degenerator+[...].mjs +0 -9964
- package/.output/server/_libs/get-uri.mjs +0 -413
- package/.output/server/_libs/http-proxy-agent.mjs +0 -123
- package/.output/server/_libs/ip-address.mjs +0 -1423
- package/.output/server/_libs/lru-cache.mjs +0 -732
- package/.output/server/_libs/netmask.mjs +0 -139
- package/.output/server/_libs/pac-proxy-agent+[...].mjs +0 -3104
- package/.output/server/_libs/proxy-agent+proxy-from-env.mjs +0 -204
- package/.output/server/_libs/smithy__core.mjs +0 -192
- package/.output/server/node_modules/tslib/modules/index.js +0 -70
- package/.output/server/node_modules/tslib/modules/package.json +0 -3
- package/.output/server/node_modules/tslib/package.json +0 -47
- package/.output/server/node_modules/tslib/tslib.js +0 -484
- package/bin/piclaw.mjs +0 -195
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/** Burrows-Wheeler transform, computed with the Induced Sorting Suffix Array
|
|
2
|
+
* construction mechanism (sais). Code is a port of:
|
|
3
|
+
* https://sites.google.com/site/yuta256/sais
|
|
4
|
+
* which is:
|
|
5
|
+
* Copyright (c) 2008-2010 Yuta Mori All Rights Reserved.
|
|
6
|
+
* and licensed under an MIT/X11 license. I generally looked at both
|
|
7
|
+
* the C and the Java implementations to guide my work.
|
|
8
|
+
*
|
|
9
|
+
* This JavaScript port is:
|
|
10
|
+
* Copyright (c) 2013 C. Scott Ananian
|
|
11
|
+
* and licensed under GPLv2; see the README at the top level of this package.
|
|
12
|
+
*/
|
|
13
|
+
if (typeof define !== 'function') { var define = require('amdefine')(module); }
|
|
14
|
+
define(['./freeze', './Util'], function(freeze, Util) {
|
|
15
|
+
var ASSERT = console.assert.bind(console);
|
|
16
|
+
|
|
17
|
+
// we're dispensing with the "arbitrary alphabet" stuff of the source
|
|
18
|
+
// and just using Uint8Arrays.
|
|
19
|
+
|
|
20
|
+
/** Find the start or end of each bucket. */
|
|
21
|
+
var getCounts = function(T, C, n, k) {
|
|
22
|
+
var i;
|
|
23
|
+
for (i = 0; i < k; i++) { C[i] = 0; }
|
|
24
|
+
for (i = 0; i < n; i++) { C[T[i]]++; }
|
|
25
|
+
};
|
|
26
|
+
var getBuckets = function(C, B, k, end) {
|
|
27
|
+
var i, sum = 0;
|
|
28
|
+
if (end) {
|
|
29
|
+
for (i = 0; i < k; i++) { sum += C[i]; B[i] = sum; }
|
|
30
|
+
} else {
|
|
31
|
+
for (i = 0; i < k; i++) { sum += C[i]; B[i] = sum - C[i]; }
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Sort all type LMS suffixes */
|
|
36
|
+
var LMSsort = function(T, SA, C, B, n, k) {
|
|
37
|
+
var b, i, j;
|
|
38
|
+
var c0, c1;
|
|
39
|
+
/* compute SAl */
|
|
40
|
+
if (C === B) { getCounts(T, C, n, k); }
|
|
41
|
+
getBuckets(C, B, k, false); /* find starts of buckets */
|
|
42
|
+
j = n - 1;
|
|
43
|
+
b = B[c1 = T[j]];
|
|
44
|
+
j--;
|
|
45
|
+
SA[b++] = (T[j] < c1) ? ~j : j;
|
|
46
|
+
for (i = 0; i < n; i++) {
|
|
47
|
+
if ((j = SA[i]) > 0) {
|
|
48
|
+
ASSERT(T[j] >= T[j+1]);
|
|
49
|
+
if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1 = c0]; }
|
|
50
|
+
ASSERT(i < b);
|
|
51
|
+
j--;
|
|
52
|
+
SA[b++] = (T[j] < c1) ? ~j : j;
|
|
53
|
+
SA[i] = 0;
|
|
54
|
+
} else if (j < 0) {
|
|
55
|
+
SA[i] = ~j;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/* compute SAs */
|
|
59
|
+
if (C === B) { getCounts(T, C, n, k); }
|
|
60
|
+
getBuckets(C, B, k, 1); /* find ends of buckets */
|
|
61
|
+
for (i = n-1, b = B[c1 = 0]; i >= 0; i--) {
|
|
62
|
+
if ((j = SA[i]) > 0) {
|
|
63
|
+
ASSERT(T[j] <= T[j+1]);
|
|
64
|
+
if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1 = c0]; }
|
|
65
|
+
ASSERT(b <= i);
|
|
66
|
+
j--;
|
|
67
|
+
SA[--b] = (T[j] > c1) ? ~(j+1) : j;
|
|
68
|
+
SA[i] = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
var LMSpostproc = function(T, SA, n, m) {
|
|
74
|
+
var i, j, p, q, plen, qlen, name;
|
|
75
|
+
var c0, c1;
|
|
76
|
+
var diff;
|
|
77
|
+
|
|
78
|
+
/* compact all the sorted substrings into the first m items of SA
|
|
79
|
+
* 2*m must not be larger than n (provable) */
|
|
80
|
+
ASSERT(n > 0);
|
|
81
|
+
for (i = 0; (p = SA[i]) < 0; i++) { SA[i] = ~p; ASSERT((i+1) < n); }
|
|
82
|
+
if (i < m) {
|
|
83
|
+
for (j = i, i++; ; i++) {
|
|
84
|
+
ASSERT(i < n);
|
|
85
|
+
if ((p = SA[i]) < 0) {
|
|
86
|
+
SA[j++] = ~p; SA[i] = 0;
|
|
87
|
+
if (j === m) { break; }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* store the length of all substrings */
|
|
93
|
+
c0 = T[i = j = n - 1];
|
|
94
|
+
do { c1 = c0; } while ( ((--i) >= 0 ) && ((c0=T[i]) >= c1) );
|
|
95
|
+
for (; i >= 0; ) {
|
|
96
|
+
do { c1 = c0; } while ( ((--i) >= 0 ) && ((c0=T[i]) <= c1) );
|
|
97
|
+
if (i >= 0) {
|
|
98
|
+
SA[m + ((i + 1) >>> 1)] = j - i; j = i + 1;
|
|
99
|
+
do { c1 = c0; } while ( ((--i) >= 0 ) && ((c0=T[i]) >= c1) );
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* find the lexicographic names of all substrings */
|
|
104
|
+
for (i = 0, name = 0, q = n, qlen = 0; i < m; i++) {
|
|
105
|
+
p = SA[i]; plen = SA[m + (p >>> 1)]; diff = true;
|
|
106
|
+
if ((plen === qlen) && ((q + plen) < n)) {
|
|
107
|
+
for (j = 0; (j < plen) && (T[p + j] === T[q + j]); ) { j++; }
|
|
108
|
+
if (j === plen) { diff = false; }
|
|
109
|
+
}
|
|
110
|
+
if (diff) { name++; q = p; qlen = plen; }
|
|
111
|
+
SA[m + (p >>> 1)] = name;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return name;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/* compute SA and BWT */
|
|
118
|
+
var induceSA = function(T, SA, C, B, n, k) {
|
|
119
|
+
var b, i, j;
|
|
120
|
+
var c0, c1;
|
|
121
|
+
/* compute SAl */
|
|
122
|
+
if (C === B) { getCounts(T, C, n, k); }
|
|
123
|
+
getBuckets(C, B, k, false); /* find starts of buckets */
|
|
124
|
+
j = n - 1;
|
|
125
|
+
b = B[c1 = T[j]];
|
|
126
|
+
SA[b++] = ((j > 0) && (T[j-1] < c1)) ? ~j : j;
|
|
127
|
+
for (i = 0; i < n; i++) {
|
|
128
|
+
j = SA[i]; SA[i] = ~j;
|
|
129
|
+
if (j > 0) {
|
|
130
|
+
j--;
|
|
131
|
+
ASSERT( T[j] >= T[j + 1] );
|
|
132
|
+
if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1=c0]; }
|
|
133
|
+
ASSERT( i < b );
|
|
134
|
+
SA[b++] = ((j > 0) && (T[j-1] < c1)) ? ~j : j;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/* compute SAs */
|
|
138
|
+
if (C === B) { getCounts(T, C, n, k); }
|
|
139
|
+
getBuckets(C, B, k, true); /* find ends of buckets */
|
|
140
|
+
for (i = n-1, b = B[c1 = 0]; i >= 0; i--) {
|
|
141
|
+
if ((j = SA[i]) > 0) {
|
|
142
|
+
j--;
|
|
143
|
+
ASSERT( T[j] <= T[j + 1] );
|
|
144
|
+
if ((c0 = T[j]) !== c1) { B[c1] = b; b = B[c1 = c0]; }
|
|
145
|
+
ASSERT( b <= i );
|
|
146
|
+
SA[--b] = ((j === 0) || (T[j - 1] > c1)) ? ~j : j;
|
|
147
|
+
} else {
|
|
148
|
+
SA[i] = ~j;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
var computeBWT = function(T, SA, C, B, n, k) {
|
|
154
|
+
var b, i, j, pidx = -1;
|
|
155
|
+
var c0, c1;
|
|
156
|
+
/* compute SAl */
|
|
157
|
+
if (C === B) { getCounts(T, C, n, k); }
|
|
158
|
+
getBuckets(C, B, k, false); /* find starts of buckets */
|
|
159
|
+
j = n - 1;
|
|
160
|
+
b = B[c1 = T[j]];
|
|
161
|
+
SA[b++] = ((j > 0) && (T[j - 1] < c1)) ? ~j : j;
|
|
162
|
+
for (i = 0; i < n; i++) {
|
|
163
|
+
if ((j=SA[i]) > 0) {
|
|
164
|
+
j--;
|
|
165
|
+
ASSERT( T[j] >= T[j+1] );
|
|
166
|
+
SA[i] = ~(c0 = T[j]);
|
|
167
|
+
if (c0 !== c1) { B[c1] = b; b = B[c1 = c0]; }
|
|
168
|
+
ASSERT( i < b );
|
|
169
|
+
SA[b++] = ((j > 0) && (T[j - 1] < c1)) ? ~j : j;
|
|
170
|
+
} else if (j !== 0) {
|
|
171
|
+
SA[i] = ~j;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/* compute SAs */
|
|
175
|
+
if (C === B) { getCounts(T, C, n, k); }
|
|
176
|
+
getBuckets(C, B, k, true); /* find ends of buckets */
|
|
177
|
+
for (i = n-1, b = B[c1 = 0]; i >= 0; i--) {
|
|
178
|
+
if ((j = SA[i]) > 0) {
|
|
179
|
+
j--;
|
|
180
|
+
ASSERT( T[j] <= T[j+1] );
|
|
181
|
+
SA[i] = c0 = T[j];
|
|
182
|
+
if (c0 !== c1) { B[c1] = b; b = B[c1 = c0]; }
|
|
183
|
+
ASSERT( b <= i );
|
|
184
|
+
SA[--b] = ((j > 0) && (T[j-1] > c1)) ? (~T[j-1]) : j;
|
|
185
|
+
} else if (j !== 0) {
|
|
186
|
+
SA[i] = ~j;
|
|
187
|
+
} else {
|
|
188
|
+
pidx = i;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return pidx;
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
/* find the suffix array SA of T[0..n-1] in {0..k-1}^n
|
|
195
|
+
use a working space (excluding T and SA) of at most 2n+O(1) for a
|
|
196
|
+
constant alphabet */
|
|
197
|
+
var SA_IS = function(T, SA, fs, n, k, isbwt) {
|
|
198
|
+
var C, B, RA;
|
|
199
|
+
var i, j, b, c, m, p, q, name, pidx = 0, newfs;
|
|
200
|
+
var c0, c1;
|
|
201
|
+
var flags = 0;
|
|
202
|
+
|
|
203
|
+
// allocate temporary storage [CSA]
|
|
204
|
+
if (k <= 256) {
|
|
205
|
+
C = Util.makeS32Buffer(k);
|
|
206
|
+
if (k <= fs) { B = SA.subarray(n + fs - k); flags = 1; }
|
|
207
|
+
else { B = Util.makeS32Buffer(k); flags = 3; }
|
|
208
|
+
} else if (k <= fs) {
|
|
209
|
+
C = SA.subarray(n + fs - k);
|
|
210
|
+
if (k <= (fs - k)) { B = SA.subarray(n + fs - k * 2); flags = 0; }
|
|
211
|
+
else if (k <= 1024) { B = Util.makeS32Buffer(k); flags = 2; }
|
|
212
|
+
else { B = C; flags = 8; }
|
|
213
|
+
} else {
|
|
214
|
+
C = B = Util.makeS32Buffer(k);
|
|
215
|
+
flags = 4 | 8;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* stage 1: reduce the problem by at least 1/2
|
|
219
|
+
sort all the LMS-substrings */
|
|
220
|
+
getCounts(T, C, n, k);
|
|
221
|
+
getBuckets(C, B, k, true); /* find ends of buckets */
|
|
222
|
+
for (i = 0; i < n; i++) { SA[i] = 0; }
|
|
223
|
+
b = -1; i = n - 1; j = n; m = 0; c0 = T[n - 1];
|
|
224
|
+
do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
|
|
225
|
+
for (; i >= 0 ;) {
|
|
226
|
+
do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) <= c1));
|
|
227
|
+
if ( i >= 0 ) {
|
|
228
|
+
if ( b >= 0 ) { SA[b] = j; }
|
|
229
|
+
b = --B[c1];
|
|
230
|
+
j = i;
|
|
231
|
+
++m;
|
|
232
|
+
do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (m > 1) {
|
|
237
|
+
LMSsort(T, SA, C, B, n, k);
|
|
238
|
+
name = LMSpostproc(T, SA, n, m);
|
|
239
|
+
} else if (m === 1) {
|
|
240
|
+
SA[b] = j + 1;
|
|
241
|
+
name = 1;
|
|
242
|
+
} else {
|
|
243
|
+
name = 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/* stage 2: solve the reduced problem
|
|
247
|
+
recurse if names are not yet unique */
|
|
248
|
+
if(name < m) {
|
|
249
|
+
if((flags & 4) !== 0) { C = null; B = null; }
|
|
250
|
+
if((flags & 2) !== 0) { B = null; }
|
|
251
|
+
newfs = (n + fs) - (m * 2);
|
|
252
|
+
if((flags & (1 | 4 | 8)) === 0) {
|
|
253
|
+
if((k + name) <= newfs) { newfs -= k; }
|
|
254
|
+
else { flags |= 8; }
|
|
255
|
+
}
|
|
256
|
+
ASSERT( (n >>> 1) <= (newfs + m) );
|
|
257
|
+
for (i = m + (n >>> 1) - 1, j = m * 2 + newfs - 1; m <= i; i--) {
|
|
258
|
+
if(SA[i] !== 0) { SA[j--] = SA[i] - 1; }
|
|
259
|
+
}
|
|
260
|
+
RA = SA.subarray(m + newfs);
|
|
261
|
+
SA_IS(RA, SA, newfs, m, name, false);
|
|
262
|
+
RA = null;
|
|
263
|
+
|
|
264
|
+
i = n - 1; j = m * 2 - 1; c0 = T[n - 1];
|
|
265
|
+
do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
|
|
266
|
+
for (; i >= 0 ;) {
|
|
267
|
+
do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) <= c1));
|
|
268
|
+
if ( i >= 0 ) {
|
|
269
|
+
SA[j--] = i + 1;
|
|
270
|
+
do { c1 = c0; } while ((--i >= 0) && ((c0 = T[i]) >= c1));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
for (i = 0; i < m; i++) { SA[i] = SA[m + SA[i]]; }
|
|
275
|
+
if((flags & 4) !== 0) { C = B = Util.makeS32Buffer(k); }
|
|
276
|
+
if((flags & 2) !== 0) { B = Util.makeS32Buffer(k); }
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* stage 3: induce the result for the original problem */
|
|
280
|
+
if((flags & 8) !== 0) { getCounts(T, C, n, k); }
|
|
281
|
+
/* put all left-most S characters into their buckets */
|
|
282
|
+
if (m > 1) {
|
|
283
|
+
getBuckets(C, B, k, true); /* find ends of buckets */
|
|
284
|
+
i = m - 1; j = n; p = SA[m - 1]; c1 = T[p];
|
|
285
|
+
do {
|
|
286
|
+
q = B[c0 = c1];
|
|
287
|
+
while (q < j) { SA[--j] = 0; }
|
|
288
|
+
do {
|
|
289
|
+
SA[--j] = p;
|
|
290
|
+
if(--i < 0) { break; }
|
|
291
|
+
p = SA[i];
|
|
292
|
+
} while((c1 = T[p]) === c0);
|
|
293
|
+
} while (i >= 0 );
|
|
294
|
+
while ( j > 0 ) { SA[--j] = 0; }
|
|
295
|
+
}
|
|
296
|
+
if (!isbwt) { induceSA(T, SA, C, B, n, k); }
|
|
297
|
+
else { pidx = computeBWT(T, SA, C, B, n, k); }
|
|
298
|
+
C = null; B = null;
|
|
299
|
+
return pidx;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
var BWT = Object.create(null);
|
|
303
|
+
/** SA should be a Int32Array (signed!); T can be any typed array.
|
|
304
|
+
* alphabetSize is optional if T is an Uint8Array or Uint16Array. */
|
|
305
|
+
BWT.suffixsort = function(T, SA, n, alphabetSize) {
|
|
306
|
+
ASSERT( T && SA && T.length >= n && SA.length >= n );
|
|
307
|
+
if (n <= 1) {
|
|
308
|
+
if (n === 1) { SA[0] = 0; }
|
|
309
|
+
return 0;
|
|
310
|
+
}
|
|
311
|
+
if (!alphabetSize) {
|
|
312
|
+
if (T.BYTES_PER_ELEMENT === 1) { alphabetSize = 256; }
|
|
313
|
+
else if (T.BYTES_PER_ELEMENT === 2) { alphabetSize = 65536; }
|
|
314
|
+
else throw new Error('Need to specify alphabetSize');
|
|
315
|
+
}
|
|
316
|
+
ASSERT( alphabetSize > 0 );
|
|
317
|
+
if (T.BYTES_PER_ELEMENT) {
|
|
318
|
+
ASSERT( alphabetSize <= (1 << (T.BYTES_PER_ELEMENT*8) ) );
|
|
319
|
+
}
|
|
320
|
+
return SA_IS(T, SA, 0, n, alphabetSize, false);
|
|
321
|
+
};
|
|
322
|
+
/** Burrows-Wheeler Transform.
|
|
323
|
+
A should be Int32Array (signed!); T can be any typed array.
|
|
324
|
+
U is the same type as T (it is used for output).
|
|
325
|
+
alphabetSize is optional if T is an Uint8Array or Uint16Array.
|
|
326
|
+
ASSUMES STRING IS TERMINATED WITH AN EOF CHARACTER.
|
|
327
|
+
*/
|
|
328
|
+
BWT.bwtransform = function(T, U, A, n, alphabetSize) {
|
|
329
|
+
var i, pidx;
|
|
330
|
+
ASSERT( T && U && A );
|
|
331
|
+
ASSERT( T.length >= n && U.length >= n && A.length >= n );
|
|
332
|
+
if (n <= 1) {
|
|
333
|
+
if (n === 1) { U[0] = T[0]; }
|
|
334
|
+
return n;
|
|
335
|
+
}
|
|
336
|
+
if (!alphabetSize) {
|
|
337
|
+
if (T.BYTES_PER_ELEMENT === 1) { alphabetSize = 256; }
|
|
338
|
+
else if (T.BYTES_PER_ELEMENT === 2) { alphabetSize = 65536; }
|
|
339
|
+
else throw new Error('Need to specify alphabetSize');
|
|
340
|
+
}
|
|
341
|
+
ASSERT( alphabetSize > 0 );
|
|
342
|
+
if (T.BYTES_PER_ELEMENT) {
|
|
343
|
+
ASSERT( alphabetSize <= (1 << (T.BYTES_PER_ELEMENT*8) ) );
|
|
344
|
+
}
|
|
345
|
+
pidx = SA_IS(T, A, 0, n, alphabetSize, true);
|
|
346
|
+
U[0] = T[n - 1];
|
|
347
|
+
for (i = 0; i < pidx ; i++) { U[i + 1] = A[i]; }
|
|
348
|
+
for (i += 1; i < n; i++) { U[i] = A[i]; }
|
|
349
|
+
return pidx + 1;
|
|
350
|
+
};
|
|
351
|
+
/** Reverses transform above. (ASSUMED STRING IS TERMINATED WITH EOF.) */
|
|
352
|
+
BWT.unbwtransform = function(T, U, LF, n, pidx) {
|
|
353
|
+
var C = Util.makeU32Buffer(256);
|
|
354
|
+
var i, t;
|
|
355
|
+
for (i=0; i<256; i++) { C[i] = 0; }
|
|
356
|
+
for (i=0; i<n; i++) { LF[i] = C[T[i]]++; }
|
|
357
|
+
for (i=0, t=0; i<256; i++) { t += C[i]; C[i] = t - C[i]; }
|
|
358
|
+
for (i=n-1, t=0; i>=0; i--) {
|
|
359
|
+
t = LF[t] + C[U[i]=T[t]];
|
|
360
|
+
t += (t<pidx) ? 1 : 0;
|
|
361
|
+
}
|
|
362
|
+
C = null;
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
/** Burrows-Wheeler Transform.
|
|
366
|
+
A should be Int32Array (signed!); T can be any typed array.
|
|
367
|
+
U is the same type as T (it is used for output).
|
|
368
|
+
alphabetSize is optional if T is an Uint8Array or Uint16Array.
|
|
369
|
+
ASSUMES STRING IS CYCLIC.
|
|
370
|
+
(XXX: this is twice as inefficient as I'd like! [CSA])
|
|
371
|
+
*/
|
|
372
|
+
BWT.bwtransform2 = function(T, U, n, alphabetSize) {
|
|
373
|
+
var i, j, pidx = 0;
|
|
374
|
+
ASSERT( T && U );
|
|
375
|
+
ASSERT( T.length >= n && U.length >= n );
|
|
376
|
+
if (n <= 1) {
|
|
377
|
+
if (n === 1) { U[0] = T[0]; }
|
|
378
|
+
return 0;
|
|
379
|
+
}
|
|
380
|
+
if (!alphabetSize) {
|
|
381
|
+
if (T.BYTES_PER_ELEMENT === 1) { alphabetSize = 256; }
|
|
382
|
+
else if (T.BYTES_PER_ELEMENT === 2) { alphabetSize = 65536; }
|
|
383
|
+
else throw new Error('Need to specify alphabetSize');
|
|
384
|
+
}
|
|
385
|
+
ASSERT( alphabetSize > 0 );
|
|
386
|
+
if (T.BYTES_PER_ELEMENT) {
|
|
387
|
+
ASSERT( alphabetSize <= (1 << (T.BYTES_PER_ELEMENT*8) ) );
|
|
388
|
+
}
|
|
389
|
+
// double length of T
|
|
390
|
+
var TT;
|
|
391
|
+
if (T.length >= n*2) {
|
|
392
|
+
TT = T; // do it in place if possible
|
|
393
|
+
} else if (alphabetSize <= 256) {
|
|
394
|
+
TT = Util.makeU8Buffer(n*2);
|
|
395
|
+
} else if (alphabetSize <= 65536) {
|
|
396
|
+
TT = Util.makeU16Buffer(n*2);
|
|
397
|
+
} else {
|
|
398
|
+
TT = Util.makeU32Buffer(n*2);
|
|
399
|
+
}
|
|
400
|
+
if (TT!==T) {
|
|
401
|
+
for (i=0; i<n; i++) { TT[i] = T[i]; }
|
|
402
|
+
}
|
|
403
|
+
for (i=0; i<n; i++) { TT[n+i] = TT[i]; }
|
|
404
|
+
// sort doubled string
|
|
405
|
+
var A = Util.makeS32Buffer(n*2);
|
|
406
|
+
SA_IS(TT, A, 0, n*2, alphabetSize, false);
|
|
407
|
+
for (i=0, j=0; i<2*n; i++) {
|
|
408
|
+
var s = A[i];
|
|
409
|
+
if (s < n) {
|
|
410
|
+
if (s === 0) { pidx = j; }
|
|
411
|
+
if (--s < 0) { s = n-1; }
|
|
412
|
+
U[j++] = T[s];
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
ASSERT(j===n);
|
|
416
|
+
return pidx;
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
return freeze(BWT);
|
|
420
|
+
});
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/* A simple bzip-like BWT compressor with a range encoder; written as a
|
|
2
|
+
* self-test of the BWT package. */
|
|
3
|
+
if (typeof define !== 'function') { var define = require('amdefine')(module); }
|
|
4
|
+
define(['./freeze','./BWT','./DefSumModel','./FenwickModel','./LogDistanceModel','./NoModel','./RangeCoder','./Stream','./Util'], function(freeze, BWT, DefSumModel, FenwickModel, LogDistanceModel, NoModel, RangeCoder, Stream, Util) {
|
|
5
|
+
var EOF = Stream.EOF;
|
|
6
|
+
|
|
7
|
+
var F_PROB_MAX = 0xFF00;
|
|
8
|
+
var F_PROB_INCR = 0x0100;
|
|
9
|
+
|
|
10
|
+
BWTC = Object.create(null);
|
|
11
|
+
BWTC.MAGIC = "bwtc";
|
|
12
|
+
BWTC.compressFile = Util.compressFileHelper(BWTC.MAGIC, function(input, output, size, props, finalByte) {
|
|
13
|
+
var encoder = new RangeCoder(output);
|
|
14
|
+
encoder.encodeStart(finalByte, 1);
|
|
15
|
+
|
|
16
|
+
var blockSize = 9;
|
|
17
|
+
if (typeof(props)==='number' && props >= 1 && props <= 9) {
|
|
18
|
+
blockSize = props;
|
|
19
|
+
}
|
|
20
|
+
encoder.encodeByte(blockSize);
|
|
21
|
+
var fast = (blockSize <= 5);
|
|
22
|
+
blockSize *= 100000;
|
|
23
|
+
|
|
24
|
+
var block = Util.makeU8Buffer(blockSize);
|
|
25
|
+
var readBlock = function() {
|
|
26
|
+
var pos;
|
|
27
|
+
for (pos=0; pos < blockSize; ) {
|
|
28
|
+
var ch = input.readByte();
|
|
29
|
+
if (ch < 0) { break; }
|
|
30
|
+
block[pos++] = ch;
|
|
31
|
+
}
|
|
32
|
+
return pos;
|
|
33
|
+
};
|
|
34
|
+
var U = Util.makeU8Buffer(blockSize);
|
|
35
|
+
var A = Util.makeS32Buffer(blockSize);
|
|
36
|
+
var M = Util.makeU8Buffer(256); // move to front array
|
|
37
|
+
var bitModelFactory = NoModel.factory(encoder);
|
|
38
|
+
var lenModel = new LogDistanceModel(blockSize, 0,
|
|
39
|
+
bitModelFactory,
|
|
40
|
+
bitModelFactory);
|
|
41
|
+
var length, b, c, pidx, i, j;
|
|
42
|
+
do {
|
|
43
|
+
length = readBlock();
|
|
44
|
+
if (length === 0) { break; }
|
|
45
|
+
// indicate that there's another block comin'
|
|
46
|
+
// and encode the length of the block if necessary
|
|
47
|
+
if (length === block.length) {
|
|
48
|
+
encoder.encodeFreq(1, 0, 3); // "full size block"
|
|
49
|
+
b = block;
|
|
50
|
+
} else {
|
|
51
|
+
encoder.encodeFreq(1, 1, 3); // "short block"
|
|
52
|
+
lenModel.encode(length);
|
|
53
|
+
b = block.subarray(0, length);
|
|
54
|
+
}
|
|
55
|
+
pidx = BWT.bwtransform(b, U, A, length, 256);
|
|
56
|
+
lenModel.encode(pidx); // starting index
|
|
57
|
+
// encode the alphabet subset used
|
|
58
|
+
var useTree = Util.makeU16Buffer(512);
|
|
59
|
+
for (i=0; i<length; i++) {
|
|
60
|
+
c = U[i];
|
|
61
|
+
useTree[256+c] = 1;
|
|
62
|
+
}
|
|
63
|
+
for (i=255; i>0; i--) { // sum all the way up the tree
|
|
64
|
+
useTree[i] = useTree[2*i] + useTree[2*i + 1];
|
|
65
|
+
}
|
|
66
|
+
useTree[0] = 1; // sentinel
|
|
67
|
+
for (i=1; i<512; i++) {
|
|
68
|
+
var parent = i>>>1;
|
|
69
|
+
var full = 1 << (9-Util.fls(i));
|
|
70
|
+
if (useTree[parent] === 0 || useTree[parent] === (full*2)) {
|
|
71
|
+
/* already known full/empty */
|
|
72
|
+
} else if (i >= 256) {
|
|
73
|
+
encoder.encodeBit(useTree[i]); // leaf node
|
|
74
|
+
} else {
|
|
75
|
+
var v = useTree[i];
|
|
76
|
+
v = (v===0) ? 0 : (v===full) ? 2 : 1;
|
|
77
|
+
encoder.encodeFreq(1, v, 3);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// remap symbols to this subset
|
|
81
|
+
var alphabetSize = 0;
|
|
82
|
+
for (i=0; i<256; i++) {
|
|
83
|
+
if (useTree[256+i]) { // symbol in use
|
|
84
|
+
M[alphabetSize++] = i;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
useTree = null;
|
|
88
|
+
// MTF encoding of U
|
|
89
|
+
for (i=0; i<length; i++) {
|
|
90
|
+
c = U[i];
|
|
91
|
+
for (j=0; j<alphabetSize; j++) {
|
|
92
|
+
if (M[j] === c) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.assert(j<alphabetSize);
|
|
97
|
+
U[i] = j;
|
|
98
|
+
// move to front
|
|
99
|
+
for (; j>0; j--) {
|
|
100
|
+
M[j] = M[j-1];
|
|
101
|
+
}
|
|
102
|
+
M[0] = c;
|
|
103
|
+
}
|
|
104
|
+
// RLE/range encoding
|
|
105
|
+
var model = new FenwickModel(encoder, alphabetSize+1,
|
|
106
|
+
F_PROB_MAX, F_PROB_INCR);
|
|
107
|
+
if (fast) { model = new DefSumModel(encoder, alphabetSize+1); }
|
|
108
|
+
var runLength = 0;
|
|
109
|
+
var emitLastRun = function() {
|
|
110
|
+
// binary encode runs of zeros
|
|
111
|
+
while (runLength !== 0) {
|
|
112
|
+
if (runLength&1) {
|
|
113
|
+
model.encode(0); // RUNA
|
|
114
|
+
runLength-=1;
|
|
115
|
+
} else {
|
|
116
|
+
model.encode(1); // RUNB
|
|
117
|
+
runLength-=2;
|
|
118
|
+
}
|
|
119
|
+
runLength >>>= 1;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
for (i=0; i<length; i++) {
|
|
123
|
+
c = U[i];
|
|
124
|
+
if (c === 0) {
|
|
125
|
+
runLength++;
|
|
126
|
+
} else {
|
|
127
|
+
emitLastRun();
|
|
128
|
+
model.encode(c+1);
|
|
129
|
+
// reset for next
|
|
130
|
+
runLength = 0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
emitLastRun();
|
|
134
|
+
// done with this block!
|
|
135
|
+
} while (length === block.length);
|
|
136
|
+
|
|
137
|
+
encoder.encodeFreq(1, 2, 3); // "no more blocks"
|
|
138
|
+
encoder.encodeFinish();
|
|
139
|
+
}, true);
|
|
140
|
+
|
|
141
|
+
BWTC.decompressFile = Util.decompressFileHelper(BWTC.MAGIC, function(input, output, size) {
|
|
142
|
+
var decoder = new RangeCoder(input);
|
|
143
|
+
decoder.decodeStart(true/* already read the extra byte */);
|
|
144
|
+
var blockSize = decoder.decodeByte();
|
|
145
|
+
console.assert(blockSize >= 1 && blockSize <= 9);
|
|
146
|
+
var fast = (blockSize <= 5);
|
|
147
|
+
blockSize *= 100000;
|
|
148
|
+
|
|
149
|
+
var block = Util.makeU8Buffer(blockSize);
|
|
150
|
+
var U = Util.makeU8Buffer(blockSize);
|
|
151
|
+
var A = Util.makeS32Buffer(blockSize);
|
|
152
|
+
var M = Util.makeU8Buffer(256); // move to front array
|
|
153
|
+
var bitModelFactory = NoModel.factory(decoder);
|
|
154
|
+
var lenModel = new LogDistanceModel(blockSize, 0,
|
|
155
|
+
bitModelFactory,
|
|
156
|
+
bitModelFactory);
|
|
157
|
+
var b, length, i, j, c;
|
|
158
|
+
while (true) {
|
|
159
|
+
var blockIndicator = decoder.decodeCulFreq(3);
|
|
160
|
+
decoder.decodeUpdate(1, blockIndicator, 3);
|
|
161
|
+
if (blockIndicator === 0) { // full-length block
|
|
162
|
+
length = blockSize;
|
|
163
|
+
b = block;
|
|
164
|
+
} else if (blockIndicator === 1) { // short block
|
|
165
|
+
length = lenModel.decode();
|
|
166
|
+
b = block.subarray(0, length);
|
|
167
|
+
} else if (blockIndicator === 2) { // all done, no more blocks
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
// read starting index for unBWT
|
|
171
|
+
var pidx = lenModel.decode();
|
|
172
|
+
// decode the alphabet subset used
|
|
173
|
+
var useTree = Util.makeU16Buffer(512);
|
|
174
|
+
useTree[0] = 1; // sentinel
|
|
175
|
+
for (i=1; i<512; i++) {
|
|
176
|
+
var parent = i>>>1;
|
|
177
|
+
var full = 1 << (9-Util.fls(i));
|
|
178
|
+
if (useTree[parent] === 0 || useTree[parent] === (full*2)) {
|
|
179
|
+
/* already known full/empty */
|
|
180
|
+
useTree[i] = useTree[parent] >>> 1;
|
|
181
|
+
} else if (i >= 256) {
|
|
182
|
+
useTree[i] = decoder.decodeBit(); // leaf node
|
|
183
|
+
} else {
|
|
184
|
+
var v = decoder.decodeCulFreq(3);
|
|
185
|
+
decoder.decodeUpdate(1, v, 3);
|
|
186
|
+
useTree[i] = (v===2) ? full : v;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// remap symbols to this subset
|
|
190
|
+
var alphabetSize = 0;
|
|
191
|
+
for (i=0; i<256; i++) {
|
|
192
|
+
if (useTree[256+i]) { // symbol in use
|
|
193
|
+
M[alphabetSize++] = i;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
useTree = null;
|
|
197
|
+
// RLE/range decoding
|
|
198
|
+
var model = new FenwickModel(decoder, alphabetSize+1,
|
|
199
|
+
F_PROB_MAX, F_PROB_INCR);
|
|
200
|
+
if (fast) { model = new DefSumModel(decoder, alphabetSize+1, true);}
|
|
201
|
+
var val = 1; // repeat count
|
|
202
|
+
for (i=0; i<length; ) {
|
|
203
|
+
c = model.decode();
|
|
204
|
+
if (c===0) {
|
|
205
|
+
for (j=0; j<val; j++) { b[i++] = 0; }
|
|
206
|
+
val *= 2;
|
|
207
|
+
} else if (c===1) {
|
|
208
|
+
for (j=0; j<val; j++) { b[i++] = 0; b[i++] = 0; }
|
|
209
|
+
val *= 2;
|
|
210
|
+
} else {
|
|
211
|
+
val = 1;
|
|
212
|
+
b[i++] = c-1;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// MTF decode
|
|
216
|
+
for (i=0; i<length; i++) {
|
|
217
|
+
j = b[i];
|
|
218
|
+
b[i] = c = M[j];
|
|
219
|
+
// move to front
|
|
220
|
+
for (; j>0; j--) {
|
|
221
|
+
M[j] = M[j-1];
|
|
222
|
+
}
|
|
223
|
+
M[0] = c;
|
|
224
|
+
}
|
|
225
|
+
// unBWT
|
|
226
|
+
BWT.unbwtransform(block, U, A, length, pidx);
|
|
227
|
+
// emit!
|
|
228
|
+
output.write(U, 0, length);
|
|
229
|
+
}
|
|
230
|
+
decoder.decodeFinish();
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
return BWTC;
|
|
234
|
+
});
|