@loaders.gl/compression 3.3.0-alpha.5 → 3.3.0-alpha.6
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/dist/es5/brotli/decode.js +3 -423
- package/dist/es5/brotli/decode.js.map +1 -1
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/compression-worker.js +3 -6
- package/dist/es5/compression-worker.js.map +1 -1
- package/dist/es5/index.js +16 -26
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/brotli-compression.js +2 -56
- package/dist/es5/lib/brotli-compression.js.map +1 -1
- package/dist/es5/lib/compression.js +15 -34
- package/dist/es5/lib/compression.js.map +1 -1
- package/dist/es5/lib/deflate-compression.js +40 -129
- package/dist/es5/lib/deflate-compression.js.map +1 -1
- package/dist/es5/lib/gzip-compression.js +4 -21
- package/dist/es5/lib/gzip-compression.js.map +1 -1
- package/dist/es5/lib/lz4-compression.js +10 -33
- package/dist/es5/lib/lz4-compression.js.map +1 -1
- package/dist/es5/lib/lzo-compression.js +0 -32
- package/dist/es5/lib/lzo-compression.js.map +1 -1
- package/dist/es5/lib/no-compression.js +4 -29
- package/dist/es5/lib/no-compression.js.map +1 -1
- package/dist/es5/lib/snappy-compression.js +0 -18
- package/dist/es5/lib/snappy-compression.js.map +1 -1
- package/dist/es5/lib/zstd-compression.js +0 -26
- package/dist/es5/lib/zstd-compression.js.map +1 -1
- package/dist/es5/types.js.map +1 -1
- package/dist/es5/workers/worker.js +6 -28
- package/dist/es5/workers/worker.js.map +1 -1
- package/dist/esm/brotli/decode.js +4 -422
- package/dist/esm/brotli/decode.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/compression-worker.js +3 -1
- package/dist/esm/compression-worker.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/brotli-compression.js +6 -26
- package/dist/esm/lib/brotli-compression.js.map +1 -1
- package/dist/esm/lib/compression.js +1 -7
- package/dist/esm/lib/compression.js.map +1 -1
- package/dist/esm/lib/deflate-compression.js +7 -42
- package/dist/esm/lib/deflate-compression.js.map +1 -1
- package/dist/esm/lib/gzip-compression.js +5 -7
- package/dist/esm/lib/gzip-compression.js.map +1 -1
- package/dist/esm/lib/lz4-compression.js +3 -19
- package/dist/esm/lib/lz4-compression.js.map +1 -1
- package/dist/esm/lib/lzo-compression.js +5 -13
- package/dist/esm/lib/lzo-compression.js.map +1 -1
- package/dist/esm/lib/no-compression.js +2 -11
- package/dist/esm/lib/no-compression.js.map +1 -1
- package/dist/esm/lib/snappy-compression.js +2 -9
- package/dist/esm/lib/snappy-compression.js.map +1 -1
- package/dist/esm/lib/zstd-compression.js +3 -12
- package/dist/esm/lib/zstd-compression.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/workers/worker.js +8 -10
- package/dist/esm/workers/worker.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
let Options;
|
|
2
4
|
|
|
3
5
|
let makeBrotliDecode = () => {
|
|
@@ -19,57 +21,45 @@ let makeBrotliDecode = () => {
|
|
|
19
21
|
{
|
|
20
22
|
unpackCommandLookupTable(CMD_LOOKUP);
|
|
21
23
|
}
|
|
22
|
-
|
|
23
24
|
function log2floor(i) {
|
|
24
25
|
let result = -1;
|
|
25
26
|
let step = 16;
|
|
26
|
-
|
|
27
27
|
while (step > 0) {
|
|
28
28
|
if (i >>> step != 0) {
|
|
29
29
|
result += step;
|
|
30
30
|
i = i >>> step;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
32
|
step = step >> 1;
|
|
34
33
|
}
|
|
35
|
-
|
|
36
34
|
return result + i;
|
|
37
35
|
}
|
|
38
|
-
|
|
39
36
|
function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) {
|
|
40
37
|
return 16 + ndirect + 2 * (maxndistbits << npostfix);
|
|
41
38
|
}
|
|
42
|
-
|
|
43
39
|
function calculateDistanceAlphabetLimit(maxDistance, npostfix, ndirect) {
|
|
44
40
|
if (maxDistance < ndirect + (2 << npostfix)) {
|
|
45
41
|
throw 'maxDistance is too small';
|
|
46
42
|
}
|
|
47
|
-
|
|
48
43
|
let offset = (maxDistance - ndirect >> npostfix) + 4;
|
|
49
44
|
let ndistbits = log2floor(offset) - 1;
|
|
50
45
|
let group = ndistbits - 1 << 1 | offset >> ndistbits & 1;
|
|
51
46
|
return (group - 1 << npostfix) + (1 << npostfix) + ndirect + 16;
|
|
52
47
|
}
|
|
53
|
-
|
|
54
48
|
function unpackCommandLookupTable(cmdLookup) {
|
|
55
49
|
let insertLengthOffsets = new Int16Array(24);
|
|
56
50
|
let copyLengthOffsets = new Int16Array(24);
|
|
57
51
|
copyLengthOffsets[0] = 2;
|
|
58
|
-
|
|
59
52
|
for (let i = 0; i < 23; ++i) {
|
|
60
53
|
insertLengthOffsets[i + 1] = insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]);
|
|
61
54
|
copyLengthOffsets[i + 1] = copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]);
|
|
62
55
|
}
|
|
63
|
-
|
|
64
56
|
for (let cmdCode = 0; cmdCode < 704; ++cmdCode) {
|
|
65
57
|
let rangeIdx = cmdCode >>> 6;
|
|
66
58
|
let distanceContextOffset = -4;
|
|
67
|
-
|
|
68
59
|
if (rangeIdx >= 2) {
|
|
69
60
|
rangeIdx -= 2;
|
|
70
61
|
distanceContextOffset = 0;
|
|
71
62
|
}
|
|
72
|
-
|
|
73
63
|
let insertCode = (0x29850 >>> rangeIdx * 2 & 0x3) << 3 | cmdCode >>> 3 & 7;
|
|
74
64
|
let copyCode = (0x26244 >>> rangeIdx * 2 & 0x3) << 3 | cmdCode & 7;
|
|
75
65
|
let copyLengthOffset = copyLengthOffsets[copyCode];
|
|
@@ -81,97 +71,74 @@ let makeBrotliDecode = () => {
|
|
|
81
71
|
cmdLookup[index + 3] = distanceContext;
|
|
82
72
|
}
|
|
83
73
|
}
|
|
84
|
-
|
|
85
74
|
function decodeWindowBits(s) {
|
|
86
75
|
let largeWindowEnabled = s.isLargeWindow;
|
|
87
76
|
s.isLargeWindow = 0;
|
|
88
|
-
|
|
89
77
|
if (s.bitOffset >= 16) {
|
|
90
78
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
91
79
|
s.bitOffset -= 16;
|
|
92
80
|
}
|
|
93
|
-
|
|
94
81
|
if (readFewBits(s, 1) == 0) {
|
|
95
82
|
return 16;
|
|
96
83
|
}
|
|
97
|
-
|
|
98
84
|
let n = readFewBits(s, 3);
|
|
99
|
-
|
|
100
85
|
if (n != 0) {
|
|
101
86
|
return 17 + n;
|
|
102
87
|
}
|
|
103
|
-
|
|
104
88
|
n = readFewBits(s, 3);
|
|
105
|
-
|
|
106
89
|
if (n != 0) {
|
|
107
90
|
if (n == 1) {
|
|
108
91
|
if (largeWindowEnabled == 0) {
|
|
109
92
|
return -1;
|
|
110
93
|
}
|
|
111
|
-
|
|
112
94
|
s.isLargeWindow = 1;
|
|
113
|
-
|
|
114
95
|
if (readFewBits(s, 1) == 1) {
|
|
115
96
|
return -1;
|
|
116
97
|
}
|
|
117
|
-
|
|
118
98
|
n = readFewBits(s, 6);
|
|
119
|
-
|
|
120
99
|
if (n < 10 || n > 30) {
|
|
121
100
|
return -1;
|
|
122
101
|
}
|
|
123
|
-
|
|
124
102
|
return n;
|
|
125
103
|
} else {
|
|
126
104
|
return 8 + n;
|
|
127
105
|
}
|
|
128
106
|
}
|
|
129
|
-
|
|
130
107
|
return 17;
|
|
131
108
|
}
|
|
132
|
-
|
|
133
109
|
function enableEagerOutput(s) {
|
|
134
110
|
if (s.runningState != 1) {
|
|
135
111
|
throw 'State MUST be freshly initialized';
|
|
136
112
|
}
|
|
137
|
-
|
|
138
113
|
s.isEager = 1;
|
|
139
114
|
}
|
|
140
|
-
|
|
141
115
|
function enableLargeWindow(s) {
|
|
142
116
|
if (s.runningState != 1) {
|
|
143
117
|
throw 'State MUST be freshly initialized';
|
|
144
118
|
}
|
|
145
|
-
|
|
146
119
|
s.isLargeWindow = 1;
|
|
147
120
|
}
|
|
148
|
-
|
|
149
121
|
function attachDictionaryChunk(s, data) {
|
|
150
122
|
if (s.runningState != 1) {
|
|
151
123
|
throw 'State MUST be freshly initialized';
|
|
152
124
|
}
|
|
153
|
-
|
|
154
125
|
if (s.cdNumChunks == 0) {
|
|
155
126
|
s.cdChunks = new Array(16);
|
|
156
127
|
s.cdChunkOffsets = new Int32Array(16);
|
|
157
128
|
s.cdBlockBits = -1;
|
|
158
129
|
}
|
|
159
|
-
|
|
160
130
|
if (s.cdNumChunks == 15) {
|
|
161
131
|
throw 'Too many dictionary chunks';
|
|
162
132
|
}
|
|
163
|
-
|
|
164
133
|
s.cdChunks[s.cdNumChunks] = data;
|
|
165
134
|
s.cdNumChunks++;
|
|
166
135
|
s.cdTotalSize += data.length;
|
|
167
136
|
s.cdChunkOffsets[s.cdNumChunks] = s.cdTotalSize;
|
|
168
137
|
}
|
|
169
|
-
|
|
170
138
|
function initState(s, input) {
|
|
171
139
|
if (s.runningState != 0) {
|
|
172
140
|
throw 'State MUST be uninitialized';
|
|
173
141
|
}
|
|
174
|
-
|
|
175
142
|
s.blockTrees = new Int32Array(3091);
|
|
176
143
|
s.blockTrees[0] = 7;
|
|
177
144
|
s.distRbIdx = 3;
|
|
@@ -182,85 +149,65 @@ let makeBrotliDecode = () => {
|
|
|
182
149
|
initBitReader(s);
|
|
183
150
|
s.runningState = 1;
|
|
184
151
|
}
|
|
185
|
-
|
|
186
152
|
function close(s) {
|
|
187
153
|
if (s.runningState == 0) {
|
|
188
154
|
throw 'State MUST be initialized';
|
|
189
155
|
}
|
|
190
|
-
|
|
191
156
|
if (s.runningState == 11) {
|
|
192
157
|
return;
|
|
193
158
|
}
|
|
194
|
-
|
|
195
159
|
s.runningState = 11;
|
|
196
|
-
|
|
197
160
|
if (s.input != null) {
|
|
198
161
|
closeInput(s.input);
|
|
199
162
|
s.input = null;
|
|
200
163
|
}
|
|
201
164
|
}
|
|
202
|
-
|
|
203
165
|
function decodeVarLenUnsignedByte(s) {
|
|
204
166
|
if (s.bitOffset >= 16) {
|
|
205
167
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
206
168
|
s.bitOffset -= 16;
|
|
207
169
|
}
|
|
208
|
-
|
|
209
170
|
if (readFewBits(s, 1) != 0) {
|
|
210
171
|
let n = readFewBits(s, 3);
|
|
211
|
-
|
|
212
172
|
if (n == 0) {
|
|
213
173
|
return 1;
|
|
214
174
|
} else {
|
|
215
175
|
return readFewBits(s, n) + (1 << n);
|
|
216
176
|
}
|
|
217
177
|
}
|
|
218
|
-
|
|
219
178
|
return 0;
|
|
220
179
|
}
|
|
221
|
-
|
|
222
180
|
function decodeMetaBlockLength(s) {
|
|
223
181
|
if (s.bitOffset >= 16) {
|
|
224
182
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
225
183
|
s.bitOffset -= 16;
|
|
226
184
|
}
|
|
227
|
-
|
|
228
185
|
s.inputEnd = readFewBits(s, 1);
|
|
229
186
|
s.metaBlockLength = 0;
|
|
230
187
|
s.isUncompressed = 0;
|
|
231
188
|
s.isMetadata = 0;
|
|
232
|
-
|
|
233
189
|
if (s.inputEnd != 0 && readFewBits(s, 1) != 0) {
|
|
234
190
|
return;
|
|
235
191
|
}
|
|
236
|
-
|
|
237
192
|
let sizeNibbles = readFewBits(s, 2) + 4;
|
|
238
|
-
|
|
239
193
|
if (sizeNibbles == 7) {
|
|
240
194
|
s.isMetadata = 1;
|
|
241
|
-
|
|
242
195
|
if (readFewBits(s, 1) != 0) {
|
|
243
196
|
throw 'Corrupted reserved bit';
|
|
244
197
|
}
|
|
245
|
-
|
|
246
198
|
let sizeBytes = readFewBits(s, 2);
|
|
247
|
-
|
|
248
199
|
if (sizeBytes == 0) {
|
|
249
200
|
return;
|
|
250
201
|
}
|
|
251
|
-
|
|
252
202
|
for (let i = 0; i < sizeBytes; i++) {
|
|
253
203
|
if (s.bitOffset >= 16) {
|
|
254
204
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
255
205
|
s.bitOffset -= 16;
|
|
256
206
|
}
|
|
257
|
-
|
|
258
207
|
let bits = readFewBits(s, 8);
|
|
259
|
-
|
|
260
208
|
if (bits == 0 && i + 1 == sizeBytes && sizeBytes > 1) {
|
|
261
209
|
throw 'Exuberant nibble';
|
|
262
210
|
}
|
|
263
|
-
|
|
264
211
|
s.metaBlockLength |= bits << i * 8;
|
|
265
212
|
}
|
|
266
213
|
} else {
|
|
@@ -269,87 +216,67 @@ let makeBrotliDecode = () => {
|
|
|
269
216
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
270
217
|
s.bitOffset -= 16;
|
|
271
218
|
}
|
|
272
|
-
|
|
273
219
|
let bits = readFewBits(s, 4);
|
|
274
|
-
|
|
275
220
|
if (bits == 0 && i + 1 == sizeNibbles && sizeNibbles > 4) {
|
|
276
221
|
throw 'Exuberant nibble';
|
|
277
222
|
}
|
|
278
|
-
|
|
279
223
|
s.metaBlockLength |= bits << i * 4;
|
|
280
224
|
}
|
|
281
225
|
}
|
|
282
|
-
|
|
283
226
|
s.metaBlockLength++;
|
|
284
|
-
|
|
285
227
|
if (s.inputEnd == 0) {
|
|
286
228
|
s.isUncompressed = readFewBits(s, 1);
|
|
287
229
|
}
|
|
288
230
|
}
|
|
289
|
-
|
|
290
231
|
function readSymbol(tableGroup, tableIdx, s) {
|
|
291
232
|
let offset = tableGroup[tableIdx];
|
|
292
233
|
let val = s.accumulator32 >>> s.bitOffset;
|
|
293
234
|
offset += val & 0xff;
|
|
294
235
|
let bits = tableGroup[offset] >> 16;
|
|
295
236
|
let sym = tableGroup[offset] & 0xffff;
|
|
296
|
-
|
|
297
237
|
if (bits <= 8) {
|
|
298
238
|
s.bitOffset += bits;
|
|
299
239
|
return sym;
|
|
300
240
|
}
|
|
301
|
-
|
|
302
241
|
offset += sym;
|
|
303
242
|
let mask = (1 << bits) - 1;
|
|
304
243
|
offset += (val & mask) >>> 8;
|
|
305
244
|
s.bitOffset += (tableGroup[offset] >> 16) + 8;
|
|
306
245
|
return tableGroup[offset] & 0xffff;
|
|
307
246
|
}
|
|
308
|
-
|
|
309
247
|
function readBlockLength(tableGroup, tableIdx, s) {
|
|
310
248
|
if (s.bitOffset >= 16) {
|
|
311
249
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
312
250
|
s.bitOffset -= 16;
|
|
313
251
|
}
|
|
314
|
-
|
|
315
252
|
let code = readSymbol(tableGroup, tableIdx, s);
|
|
316
253
|
let n = BLOCK_LENGTH_N_BITS[code];
|
|
317
|
-
|
|
318
254
|
if (s.bitOffset >= 16) {
|
|
319
255
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
320
256
|
s.bitOffset -= 16;
|
|
321
257
|
}
|
|
322
|
-
|
|
323
258
|
return BLOCK_LENGTH_OFFSET[code] + (n <= 16 ? readFewBits(s, n) : readManyBits(s, n));
|
|
324
259
|
}
|
|
325
|
-
|
|
326
260
|
function moveToFront(v, index) {
|
|
327
261
|
let value = v[index];
|
|
328
|
-
|
|
329
262
|
for (; index > 0; index--) {
|
|
330
263
|
v[index] = v[index - 1];
|
|
331
264
|
}
|
|
332
|
-
|
|
333
265
|
v[0] = value;
|
|
334
266
|
}
|
|
335
|
-
|
|
336
267
|
function inverseMoveToFrontTransform(v, vLen) {
|
|
337
268
|
let mtf = new Int32Array(256);
|
|
338
|
-
|
|
339
269
|
for (let i = 0; i < 256; i++) {
|
|
340
270
|
mtf[i] = i;
|
|
341
271
|
}
|
|
342
|
-
|
|
343
272
|
for (let i = 0; i < vLen; i++) {
|
|
344
273
|
let index = v[i] & 0xff;
|
|
345
274
|
v[i] = mtf[index];
|
|
346
|
-
|
|
347
275
|
if (index != 0) {
|
|
348
276
|
moveToFront(mtf, index);
|
|
349
277
|
}
|
|
350
278
|
}
|
|
351
279
|
}
|
|
352
|
-
|
|
353
280
|
function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) {
|
|
354
281
|
let symbol = 0;
|
|
355
282
|
let prevCodeLen = 8;
|
|
@@ -359,25 +286,20 @@ let makeBrotliDecode = () => {
|
|
|
359
286
|
let table = new Int32Array(32 + 1);
|
|
360
287
|
let tableIdx = table.length - 1;
|
|
361
288
|
buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18);
|
|
362
|
-
|
|
363
289
|
while (symbol < numSymbols && space > 0) {
|
|
364
290
|
if (s.halfOffset > 2030) {
|
|
365
291
|
doReadMoreInput(s);
|
|
366
292
|
}
|
|
367
|
-
|
|
368
293
|
if (s.bitOffset >= 16) {
|
|
369
294
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
370
295
|
s.bitOffset -= 16;
|
|
371
296
|
}
|
|
372
|
-
|
|
373
297
|
let p = s.accumulator32 >>> s.bitOffset & 31;
|
|
374
298
|
s.bitOffset += table[p] >> 16;
|
|
375
299
|
let codeLen = table[p] & 0xffff;
|
|
376
|
-
|
|
377
300
|
if (codeLen < 16) {
|
|
378
301
|
repeat = 0;
|
|
379
302
|
codeLengths[symbol++] = codeLen;
|
|
380
|
-
|
|
381
303
|
if (codeLen != 0) {
|
|
382
304
|
prevCodeLen = codeLen;
|
|
383
305
|
space -= 32768 >> codeLen;
|
|
@@ -385,52 +307,40 @@ let makeBrotliDecode = () => {
|
|
|
385
307
|
} else {
|
|
386
308
|
let extraBits = codeLen - 14;
|
|
387
309
|
let newLen = 0;
|
|
388
|
-
|
|
389
310
|
if (codeLen == 16) {
|
|
390
311
|
newLen = prevCodeLen;
|
|
391
312
|
}
|
|
392
|
-
|
|
393
313
|
if (repeatCodeLen != newLen) {
|
|
394
314
|
repeat = 0;
|
|
395
315
|
repeatCodeLen = newLen;
|
|
396
316
|
}
|
|
397
|
-
|
|
398
317
|
let oldRepeat = repeat;
|
|
399
|
-
|
|
400
318
|
if (repeat > 0) {
|
|
401
319
|
repeat -= 2;
|
|
402
320
|
repeat <<= extraBits;
|
|
403
321
|
}
|
|
404
|
-
|
|
405
322
|
if (s.bitOffset >= 16) {
|
|
406
323
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
407
324
|
s.bitOffset -= 16;
|
|
408
325
|
}
|
|
409
|
-
|
|
410
326
|
repeat += readFewBits(s, extraBits) + 3;
|
|
411
327
|
let repeatDelta = repeat - oldRepeat;
|
|
412
|
-
|
|
413
328
|
if (symbol + repeatDelta > numSymbols) {
|
|
414
329
|
throw 'symbol + repeatDelta > numSymbols';
|
|
415
330
|
}
|
|
416
|
-
|
|
417
331
|
for (let i = 0; i < repeatDelta; i++) {
|
|
418
332
|
codeLengths[symbol++] = repeatCodeLen;
|
|
419
333
|
}
|
|
420
|
-
|
|
421
334
|
if (repeatCodeLen != 0) {
|
|
422
335
|
space -= repeatDelta << 15 - repeatCodeLen;
|
|
423
336
|
}
|
|
424
337
|
}
|
|
425
338
|
}
|
|
426
|
-
|
|
427
339
|
if (space != 0) {
|
|
428
340
|
throw 'Unused space';
|
|
429
341
|
}
|
|
430
|
-
|
|
431
342
|
codeLengths.fill(0, symbol, numSymbols);
|
|
432
343
|
}
|
|
433
|
-
|
|
434
344
|
function checkDupes(symbols, length) {
|
|
435
345
|
for (let i = 0; i < length - 1; ++i) {
|
|
436
346
|
for (let j = i + 1; j < length; ++j) {
|
|
@@ -440,166 +350,130 @@ let makeBrotliDecode = () => {
|
|
|
440
350
|
}
|
|
441
351
|
}
|
|
442
352
|
}
|
|
443
|
-
|
|
444
353
|
function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {
|
|
445
354
|
let codeLengths = new Int32Array(alphabetSizeLimit);
|
|
446
355
|
let symbols = new Int32Array(4);
|
|
447
356
|
let maxBits = 1 + log2floor(alphabetSizeMax - 1);
|
|
448
357
|
let numSymbols = readFewBits(s, 2) + 1;
|
|
449
|
-
|
|
450
358
|
for (let i = 0; i < numSymbols; i++) {
|
|
451
359
|
if (s.bitOffset >= 16) {
|
|
452
360
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
453
361
|
s.bitOffset -= 16;
|
|
454
362
|
}
|
|
455
|
-
|
|
456
363
|
let symbol = readFewBits(s, maxBits);
|
|
457
|
-
|
|
458
364
|
if (symbol >= alphabetSizeLimit) {
|
|
459
365
|
throw "Can't readHuffmanCode";
|
|
460
366
|
}
|
|
461
|
-
|
|
462
367
|
symbols[i] = symbol;
|
|
463
368
|
}
|
|
464
|
-
|
|
465
369
|
checkDupes(symbols, numSymbols);
|
|
466
370
|
let histogramId = numSymbols;
|
|
467
|
-
|
|
468
371
|
if (numSymbols == 4) {
|
|
469
372
|
histogramId += readFewBits(s, 1);
|
|
470
373
|
}
|
|
471
|
-
|
|
472
374
|
switch (histogramId) {
|
|
473
375
|
case 1:
|
|
474
376
|
codeLengths[symbols[0]] = 1;
|
|
475
377
|
break;
|
|
476
|
-
|
|
477
378
|
case 2:
|
|
478
379
|
codeLengths[symbols[0]] = 1;
|
|
479
380
|
codeLengths[symbols[1]] = 1;
|
|
480
381
|
break;
|
|
481
|
-
|
|
482
382
|
case 3:
|
|
483
383
|
codeLengths[symbols[0]] = 1;
|
|
484
384
|
codeLengths[symbols[1]] = 2;
|
|
485
385
|
codeLengths[symbols[2]] = 2;
|
|
486
386
|
break;
|
|
487
|
-
|
|
488
387
|
case 4:
|
|
489
388
|
codeLengths[symbols[0]] = 2;
|
|
490
389
|
codeLengths[symbols[1]] = 2;
|
|
491
390
|
codeLengths[symbols[2]] = 2;
|
|
492
391
|
codeLengths[symbols[3]] = 2;
|
|
493
392
|
break;
|
|
494
|
-
|
|
495
393
|
case 5:
|
|
496
394
|
codeLengths[symbols[0]] = 1;
|
|
497
395
|
codeLengths[symbols[1]] = 2;
|
|
498
396
|
codeLengths[symbols[2]] = 3;
|
|
499
397
|
codeLengths[symbols[3]] = 3;
|
|
500
398
|
break;
|
|
501
|
-
|
|
502
399
|
default:
|
|
503
400
|
break;
|
|
504
401
|
}
|
|
505
|
-
|
|
506
402
|
return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);
|
|
507
403
|
}
|
|
508
|
-
|
|
509
404
|
function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) {
|
|
510
405
|
let codeLengths = new Int32Array(alphabetSizeLimit);
|
|
511
406
|
let codeLengthCodeLengths = new Int32Array(18);
|
|
512
407
|
let space = 32;
|
|
513
408
|
let numCodes = 0;
|
|
514
|
-
|
|
515
409
|
for (let i = skip; i < 18 && space > 0; i++) {
|
|
516
410
|
let codeLenIdx = CODE_LENGTH_CODE_ORDER[i];
|
|
517
|
-
|
|
518
411
|
if (s.bitOffset >= 16) {
|
|
519
412
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
520
413
|
s.bitOffset -= 16;
|
|
521
414
|
}
|
|
522
|
-
|
|
523
415
|
let p = s.accumulator32 >>> s.bitOffset & 15;
|
|
524
416
|
s.bitOffset += FIXED_TABLE[p] >> 16;
|
|
525
417
|
let v = FIXED_TABLE[p] & 0xffff;
|
|
526
418
|
codeLengthCodeLengths[codeLenIdx] = v;
|
|
527
|
-
|
|
528
419
|
if (v != 0) {
|
|
529
420
|
space -= 32 >> v;
|
|
530
421
|
numCodes++;
|
|
531
422
|
}
|
|
532
423
|
}
|
|
533
|
-
|
|
534
424
|
if (space != 0 && numCodes != 1) {
|
|
535
425
|
throw 'Corrupted Huffman code histogram';
|
|
536
426
|
}
|
|
537
|
-
|
|
538
427
|
readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s);
|
|
539
428
|
return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);
|
|
540
429
|
}
|
|
541
|
-
|
|
542
430
|
function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {
|
|
543
431
|
if (s.halfOffset > 2030) {
|
|
544
432
|
doReadMoreInput(s);
|
|
545
433
|
}
|
|
546
|
-
|
|
547
434
|
if (s.bitOffset >= 16) {
|
|
548
435
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
549
436
|
s.bitOffset -= 16;
|
|
550
437
|
}
|
|
551
|
-
|
|
552
438
|
let simpleCodeOrSkip = readFewBits(s, 2);
|
|
553
|
-
|
|
554
439
|
if (simpleCodeOrSkip == 1) {
|
|
555
440
|
return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s);
|
|
556
441
|
} else {
|
|
557
442
|
return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s);
|
|
558
443
|
}
|
|
559
444
|
}
|
|
560
|
-
|
|
561
445
|
function decodeContextMap(contextMapSize, contextMap, s) {
|
|
562
446
|
if (s.halfOffset > 2030) {
|
|
563
447
|
doReadMoreInput(s);
|
|
564
448
|
}
|
|
565
|
-
|
|
566
449
|
let numTrees = decodeVarLenUnsignedByte(s) + 1;
|
|
567
|
-
|
|
568
450
|
if (numTrees == 1) {
|
|
569
451
|
contextMap.fill(0, 0, contextMapSize);
|
|
570
452
|
return numTrees;
|
|
571
453
|
}
|
|
572
|
-
|
|
573
454
|
if (s.bitOffset >= 16) {
|
|
574
455
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
575
456
|
s.bitOffset -= 16;
|
|
576
457
|
}
|
|
577
|
-
|
|
578
458
|
let useRleForZeros = readFewBits(s, 1);
|
|
579
459
|
let maxRunLengthPrefix = 0;
|
|
580
|
-
|
|
581
460
|
if (useRleForZeros != 0) {
|
|
582
461
|
maxRunLengthPrefix = readFewBits(s, 4) + 1;
|
|
583
462
|
}
|
|
584
|
-
|
|
585
463
|
let alphabetSize = numTrees + maxRunLengthPrefix;
|
|
586
464
|
let tableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSize + 31 >> 5];
|
|
587
465
|
let table = new Int32Array(tableSize + 1);
|
|
588
466
|
let tableIdx = table.length - 1;
|
|
589
467
|
readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s);
|
|
590
|
-
|
|
591
468
|
for (let i = 0; i < contextMapSize;) {
|
|
592
469
|
if (s.halfOffset > 2030) {
|
|
593
470
|
doReadMoreInput(s);
|
|
594
471
|
}
|
|
595
|
-
|
|
596
472
|
if (s.bitOffset >= 16) {
|
|
597
473
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
598
474
|
s.bitOffset -= 16;
|
|
599
475
|
}
|
|
600
|
-
|
|
601
476
|
let code = readSymbol(table, tableIdx, s);
|
|
602
|
-
|
|
603
477
|
if (code == 0) {
|
|
604
478
|
contextMap[i] = 0;
|
|
605
479
|
i++;
|
|
@@ -608,14 +482,11 @@ let makeBrotliDecode = () => {
|
|
|
608
482
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
609
483
|
s.bitOffset -= 16;
|
|
610
484
|
}
|
|
611
|
-
|
|
612
485
|
let reps = (1 << code) + readFewBits(s, code);
|
|
613
|
-
|
|
614
486
|
while (reps != 0) {
|
|
615
487
|
if (i >= contextMapSize) {
|
|
616
488
|
throw 'Corrupted context map';
|
|
617
489
|
}
|
|
618
|
-
|
|
619
490
|
contextMap[i] = 0;
|
|
620
491
|
i++;
|
|
621
492
|
reps--;
|
|
@@ -625,31 +496,24 @@ let makeBrotliDecode = () => {
|
|
|
625
496
|
i++;
|
|
626
497
|
}
|
|
627
498
|
}
|
|
628
|
-
|
|
629
499
|
if (s.bitOffset >= 16) {
|
|
630
500
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
631
501
|
s.bitOffset -= 16;
|
|
632
502
|
}
|
|
633
|
-
|
|
634
503
|
if (readFewBits(s, 1) == 1) {
|
|
635
504
|
inverseMoveToFrontTransform(contextMap, contextMapSize);
|
|
636
505
|
}
|
|
637
|
-
|
|
638
506
|
return numTrees;
|
|
639
507
|
}
|
|
640
|
-
|
|
641
508
|
function decodeBlockTypeAndLength(s, treeType, numBlockTypes) {
|
|
642
509
|
let ringBuffers = s.rings;
|
|
643
510
|
let offset = 4 + treeType * 2;
|
|
644
|
-
|
|
645
511
|
if (s.bitOffset >= 16) {
|
|
646
512
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
647
513
|
s.bitOffset -= 16;
|
|
648
514
|
}
|
|
649
|
-
|
|
650
515
|
let blockType = readSymbol(s.blockTrees, 2 * treeType, s);
|
|
651
516
|
let result = readBlockLength(s.blockTrees, 2 * treeType + 1, s);
|
|
652
|
-
|
|
653
517
|
if (blockType == 1) {
|
|
654
518
|
blockType = ringBuffers[offset + 1] + 1;
|
|
655
519
|
} else if (blockType == 0) {
|
|
@@ -657,16 +521,13 @@ let makeBrotliDecode = () => {
|
|
|
657
521
|
} else {
|
|
658
522
|
blockType -= 2;
|
|
659
523
|
}
|
|
660
|
-
|
|
661
524
|
if (blockType >= numBlockTypes) {
|
|
662
525
|
blockType -= numBlockTypes;
|
|
663
526
|
}
|
|
664
|
-
|
|
665
527
|
ringBuffers[offset] = ringBuffers[offset + 1];
|
|
666
528
|
ringBuffers[offset + 1] = blockType;
|
|
667
529
|
return result;
|
|
668
530
|
}
|
|
669
|
-
|
|
670
531
|
function decodeLiteralBlockSwitch(s) {
|
|
671
532
|
s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes);
|
|
672
533
|
let literalBlockType = s.rings[5];
|
|
@@ -676,99 +537,76 @@ let makeBrotliDecode = () => {
|
|
|
676
537
|
s.contextLookupOffset1 = contextMode << 9;
|
|
677
538
|
s.contextLookupOffset2 = s.contextLookupOffset1 + 256;
|
|
678
539
|
}
|
|
679
|
-
|
|
680
540
|
function decodeCommandBlockSwitch(s) {
|
|
681
541
|
s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes);
|
|
682
542
|
s.commandTreeIdx = s.rings[7];
|
|
683
543
|
}
|
|
684
|
-
|
|
685
544
|
function decodeDistanceBlockSwitch(s) {
|
|
686
545
|
s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes);
|
|
687
546
|
s.distContextMapSlice = s.rings[9] << 2;
|
|
688
547
|
}
|
|
689
|
-
|
|
690
548
|
function maybeReallocateRingBuffer(s) {
|
|
691
549
|
let newSize = s.maxRingBufferSize;
|
|
692
|
-
|
|
693
550
|
if (newSize > s.expectedTotalSize) {
|
|
694
551
|
let minimalNewSize = s.expectedTotalSize;
|
|
695
|
-
|
|
696
552
|
while (newSize >> 1 > minimalNewSize) {
|
|
697
553
|
newSize >>= 1;
|
|
698
554
|
}
|
|
699
|
-
|
|
700
555
|
if (s.inputEnd == 0 && newSize < 16384 && s.maxRingBufferSize >= 16384) {
|
|
701
556
|
newSize = 16384;
|
|
702
557
|
}
|
|
703
558
|
}
|
|
704
|
-
|
|
705
559
|
if (newSize <= s.ringBufferSize) {
|
|
706
560
|
return;
|
|
707
561
|
}
|
|
708
|
-
|
|
709
562
|
let ringBufferSizeWithSlack = newSize + 37;
|
|
710
563
|
let newBuffer = new Int8Array(ringBufferSizeWithSlack);
|
|
711
|
-
|
|
712
564
|
if (s.ringBuffer.length != 0) {
|
|
713
565
|
newBuffer.set(s.ringBuffer.subarray(0, 0 + s.ringBufferSize), 0);
|
|
714
566
|
}
|
|
715
|
-
|
|
716
567
|
s.ringBuffer = newBuffer;
|
|
717
568
|
s.ringBufferSize = newSize;
|
|
718
569
|
}
|
|
719
|
-
|
|
720
570
|
function readNextMetablockHeader(s) {
|
|
721
571
|
if (s.inputEnd != 0) {
|
|
722
572
|
s.nextRunningState = 10;
|
|
723
573
|
s.runningState = 12;
|
|
724
574
|
return;
|
|
725
575
|
}
|
|
726
|
-
|
|
727
576
|
s.literalTreeGroup = new Int32Array(0);
|
|
728
577
|
s.commandTreeGroup = new Int32Array(0);
|
|
729
578
|
s.distanceTreeGroup = new Int32Array(0);
|
|
730
|
-
|
|
731
579
|
if (s.halfOffset > 2030) {
|
|
732
580
|
doReadMoreInput(s);
|
|
733
581
|
}
|
|
734
|
-
|
|
735
582
|
decodeMetaBlockLength(s);
|
|
736
|
-
|
|
737
583
|
if (s.metaBlockLength == 0 && s.isMetadata == 0) {
|
|
738
584
|
return;
|
|
739
585
|
}
|
|
740
|
-
|
|
741
586
|
if (s.isUncompressed != 0 || s.isMetadata != 0) {
|
|
742
587
|
jumpToByteBoundary(s);
|
|
743
588
|
s.runningState = s.isMetadata != 0 ? 5 : 6;
|
|
744
589
|
} else {
|
|
745
590
|
s.runningState = 3;
|
|
746
591
|
}
|
|
747
|
-
|
|
748
592
|
if (s.isMetadata != 0) {
|
|
749
593
|
return;
|
|
750
594
|
}
|
|
751
|
-
|
|
752
595
|
s.expectedTotalSize += s.metaBlockLength;
|
|
753
|
-
|
|
754
596
|
if (s.expectedTotalSize > 1 << 30) {
|
|
755
597
|
s.expectedTotalSize = 1 << 30;
|
|
756
598
|
}
|
|
757
|
-
|
|
758
599
|
if (s.ringBufferSize < s.maxRingBufferSize) {
|
|
759
600
|
maybeReallocateRingBuffer(s);
|
|
760
601
|
}
|
|
761
602
|
}
|
|
762
|
-
|
|
763
603
|
function readMetablockPartition(s, treeType, numBlockTypes) {
|
|
764
604
|
let offset = s.blockTrees[2 * treeType];
|
|
765
|
-
|
|
766
605
|
if (numBlockTypes <= 1) {
|
|
767
606
|
s.blockTrees[2 * treeType + 1] = offset;
|
|
768
607
|
s.blockTrees[2 * treeType + 2] = offset;
|
|
769
608
|
return 1 << 28;
|
|
770
609
|
}
|
|
771
|
-
|
|
772
610
|
let blockTypeAlphabetSize = numBlockTypes + 2;
|
|
773
611
|
offset += readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s);
|
|
774
612
|
s.blockTrees[2 * treeType + 1] = offset;
|
|
@@ -777,7 +615,6 @@ let makeBrotliDecode = () => {
|
|
|
777
615
|
s.blockTrees[2 * treeType + 2] = offset;
|
|
778
616
|
return readBlockLength(s.blockTrees, 2 * treeType + 1, s);
|
|
779
617
|
}
|
|
780
|
-
|
|
781
618
|
function calculateDistanceLut(s, alphabetSizeLimit) {
|
|
782
619
|
let distExtraBits = s.distExtraBits;
|
|
783
620
|
let distOffset = s.distOffset;
|
|
@@ -787,27 +624,22 @@ let makeBrotliDecode = () => {
|
|
|
787
624
|
let bits = 1;
|
|
788
625
|
let half = 0;
|
|
789
626
|
let i = 16;
|
|
790
|
-
|
|
791
627
|
for (let j = 0; j < ndirect; ++j) {
|
|
792
628
|
distExtraBits[i] = 0;
|
|
793
629
|
distOffset[i] = j + 1;
|
|
794
630
|
++i;
|
|
795
631
|
}
|
|
796
|
-
|
|
797
632
|
while (i < alphabetSizeLimit) {
|
|
798
633
|
let base = ndirect + ((2 + half << bits) - 4 << npostfix) + 1;
|
|
799
|
-
|
|
800
634
|
for (let j = 0; j < postfix; ++j) {
|
|
801
635
|
distExtraBits[i] = bits;
|
|
802
636
|
distOffset[i] = base + j;
|
|
803
637
|
++i;
|
|
804
638
|
}
|
|
805
|
-
|
|
806
639
|
bits = bits + half;
|
|
807
640
|
half = half ^ 1;
|
|
808
641
|
}
|
|
809
642
|
}
|
|
810
|
-
|
|
811
643
|
function readMetablockHuffmanCodesAndContextMaps(s) {
|
|
812
644
|
s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1;
|
|
813
645
|
s.literalBlockLength = readMetablockPartition(s, 0, s.numLiteralBlockTypes);
|
|
@@ -815,60 +647,48 @@ let makeBrotliDecode = () => {
|
|
|
815
647
|
s.commandBlockLength = readMetablockPartition(s, 1, s.numCommandBlockTypes);
|
|
816
648
|
s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1;
|
|
817
649
|
s.distanceBlockLength = readMetablockPartition(s, 2, s.numDistanceBlockTypes);
|
|
818
|
-
|
|
819
650
|
if (s.halfOffset > 2030) {
|
|
820
651
|
doReadMoreInput(s);
|
|
821
652
|
}
|
|
822
|
-
|
|
823
653
|
if (s.bitOffset >= 16) {
|
|
824
654
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
825
655
|
s.bitOffset -= 16;
|
|
826
656
|
}
|
|
827
|
-
|
|
828
657
|
s.distancePostfixBits = readFewBits(s, 2);
|
|
829
658
|
s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits;
|
|
830
659
|
s.contextModes = new Int8Array(s.numLiteralBlockTypes);
|
|
831
|
-
|
|
832
660
|
for (let i = 0; i < s.numLiteralBlockTypes;) {
|
|
833
661
|
let limit = min(i + 96, s.numLiteralBlockTypes);
|
|
834
|
-
|
|
835
662
|
for (; i < limit; ++i) {
|
|
836
663
|
if (s.bitOffset >= 16) {
|
|
837
664
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
838
665
|
s.bitOffset -= 16;
|
|
839
666
|
}
|
|
840
|
-
|
|
841
667
|
s.contextModes[i] = readFewBits(s, 2);
|
|
842
668
|
}
|
|
843
|
-
|
|
844
669
|
if (s.halfOffset > 2030) {
|
|
845
670
|
doReadMoreInput(s);
|
|
846
671
|
}
|
|
847
672
|
}
|
|
848
|
-
|
|
849
673
|
s.contextMap = new Int8Array(s.numLiteralBlockTypes << 6);
|
|
850
674
|
let numLiteralTrees = decodeContextMap(s.numLiteralBlockTypes << 6, s.contextMap, s);
|
|
851
675
|
s.trivialLiteralContext = 1;
|
|
852
|
-
|
|
853
676
|
for (let j = 0; j < s.numLiteralBlockTypes << 6; j++) {
|
|
854
677
|
if (s.contextMap[j] != j >> 6) {
|
|
855
678
|
s.trivialLiteralContext = 0;
|
|
856
679
|
break;
|
|
857
680
|
}
|
|
858
681
|
}
|
|
859
|
-
|
|
860
682
|
s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2);
|
|
861
683
|
let numDistTrees = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s);
|
|
862
684
|
s.literalTreeGroup = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s);
|
|
863
685
|
s.commandTreeGroup = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s);
|
|
864
686
|
let distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24);
|
|
865
687
|
let distanceAlphabetSizeLimit = distanceAlphabetSizeMax;
|
|
866
|
-
|
|
867
688
|
if (s.isLargeWindow == 1) {
|
|
868
689
|
distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62);
|
|
869
690
|
distanceAlphabetSizeLimit = calculateDistanceAlphabetLimit(0x7ffffffc, s.distancePostfixBits, s.numDirectDistanceCodes);
|
|
870
691
|
}
|
|
871
|
-
|
|
872
692
|
s.distanceTreeGroup = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s);
|
|
873
693
|
calculateDistanceLut(s, distanceAlphabetSizeLimit);
|
|
874
694
|
s.contextMapSlice = 0;
|
|
@@ -884,157 +704,122 @@ let makeBrotliDecode = () => {
|
|
|
884
704
|
s.rings[8] = 1;
|
|
885
705
|
s.rings[9] = 0;
|
|
886
706
|
}
|
|
887
|
-
|
|
888
707
|
function copyUncompressedData(s) {
|
|
889
708
|
let ringBuffer = s.ringBuffer;
|
|
890
|
-
|
|
891
709
|
if (s.metaBlockLength <= 0) {
|
|
892
710
|
reload(s);
|
|
893
711
|
s.runningState = 2;
|
|
894
712
|
return;
|
|
895
713
|
}
|
|
896
|
-
|
|
897
714
|
let chunkLength = min(s.ringBufferSize - s.pos, s.metaBlockLength);
|
|
898
715
|
copyRawBytes(s, ringBuffer, s.pos, chunkLength);
|
|
899
716
|
s.metaBlockLength -= chunkLength;
|
|
900
717
|
s.pos += chunkLength;
|
|
901
|
-
|
|
902
718
|
if (s.pos == s.ringBufferSize) {
|
|
903
719
|
s.nextRunningState = 6;
|
|
904
720
|
s.runningState = 12;
|
|
905
721
|
return;
|
|
906
722
|
}
|
|
907
|
-
|
|
908
723
|
reload(s);
|
|
909
724
|
s.runningState = 2;
|
|
910
725
|
}
|
|
911
|
-
|
|
912
726
|
function writeRingBuffer(s) {
|
|
913
727
|
let toWrite = min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten);
|
|
914
|
-
|
|
915
728
|
if (toWrite != 0) {
|
|
916
729
|
s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed);
|
|
917
730
|
s.outputUsed += toWrite;
|
|
918
731
|
s.ringBufferBytesWritten += toWrite;
|
|
919
732
|
}
|
|
920
|
-
|
|
921
733
|
if (s.outputUsed < s.outputLength) {
|
|
922
734
|
return 1;
|
|
923
735
|
} else {
|
|
924
736
|
return 0;
|
|
925
737
|
}
|
|
926
738
|
}
|
|
927
|
-
|
|
928
739
|
function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s) {
|
|
929
740
|
let maxTableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSizeLimit + 31 >> 5];
|
|
930
741
|
let group = new Int32Array(n + n * maxTableSize);
|
|
931
742
|
let next = n;
|
|
932
|
-
|
|
933
743
|
for (let i = 0; i < n; ++i) {
|
|
934
744
|
group[i] = next;
|
|
935
745
|
next += readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s);
|
|
936
746
|
}
|
|
937
|
-
|
|
938
747
|
return group;
|
|
939
748
|
}
|
|
940
|
-
|
|
941
749
|
function calculateFence(s) {
|
|
942
750
|
let result = s.ringBufferSize;
|
|
943
|
-
|
|
944
751
|
if (s.isEager != 0) {
|
|
945
752
|
result = min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed);
|
|
946
753
|
}
|
|
947
|
-
|
|
948
754
|
return result;
|
|
949
755
|
}
|
|
950
|
-
|
|
951
756
|
function doUseDictionary(s, fence) {
|
|
952
757
|
if (s.distance > 0x7ffffffc) {
|
|
953
758
|
throw 'Invalid backward reference';
|
|
954
759
|
}
|
|
955
|
-
|
|
956
760
|
let address = s.distance - s.maxDistance - 1 - s.cdTotalSize;
|
|
957
|
-
|
|
958
761
|
if (address < 0) {
|
|
959
762
|
initializeCompoundDictionaryCopy(s, -address - 1, s.copyLength);
|
|
960
763
|
s.runningState = 14;
|
|
961
764
|
} else {
|
|
962
765
|
let dictionaryData = data;
|
|
963
766
|
let wordLength = s.copyLength;
|
|
964
|
-
|
|
965
767
|
if (wordLength > 31) {
|
|
966
768
|
throw 'Invalid backward reference';
|
|
967
769
|
}
|
|
968
|
-
|
|
969
770
|
let shift = sizeBits[wordLength];
|
|
970
|
-
|
|
971
771
|
if (shift == 0) {
|
|
972
772
|
throw 'Invalid backward reference';
|
|
973
773
|
}
|
|
974
|
-
|
|
975
774
|
let offset = offsets[wordLength];
|
|
976
775
|
let mask = (1 << shift) - 1;
|
|
977
776
|
let wordIdx = address & mask;
|
|
978
777
|
let transformIdx = address >>> shift;
|
|
979
778
|
offset += wordIdx * wordLength;
|
|
980
779
|
let transforms = RFC_TRANSFORMS;
|
|
981
|
-
|
|
982
780
|
if (transformIdx >= transforms.numTransforms) {
|
|
983
781
|
throw 'Invalid backward reference';
|
|
984
782
|
}
|
|
985
|
-
|
|
986
783
|
let len = transformDictionaryWord(s.ringBuffer, s.pos, dictionaryData, offset, wordLength, transforms, transformIdx);
|
|
987
784
|
s.pos += len;
|
|
988
785
|
s.metaBlockLength -= len;
|
|
989
|
-
|
|
990
786
|
if (s.pos >= fence) {
|
|
991
787
|
s.nextRunningState = 4;
|
|
992
788
|
s.runningState = 12;
|
|
993
789
|
return;
|
|
994
790
|
}
|
|
995
|
-
|
|
996
791
|
s.runningState = 4;
|
|
997
792
|
}
|
|
998
793
|
}
|
|
999
|
-
|
|
1000
794
|
function initializeCompoundDictionary(s) {
|
|
1001
795
|
s.cdBlockMap = new Int8Array(256);
|
|
1002
796
|
let blockBits = 8;
|
|
1003
|
-
|
|
1004
797
|
while (s.cdTotalSize - 1 >>> blockBits != 0) {
|
|
1005
798
|
blockBits++;
|
|
1006
799
|
}
|
|
1007
|
-
|
|
1008
800
|
blockBits -= 8;
|
|
1009
801
|
s.cdBlockBits = blockBits;
|
|
1010
802
|
let cursor = 0;
|
|
1011
803
|
let index = 0;
|
|
1012
|
-
|
|
1013
804
|
while (cursor < s.cdTotalSize) {
|
|
1014
805
|
while (s.cdChunkOffsets[index + 1] < cursor) {
|
|
1015
806
|
index++;
|
|
1016
807
|
}
|
|
1017
|
-
|
|
1018
808
|
s.cdBlockMap[cursor >>> blockBits] = index;
|
|
1019
809
|
cursor += 1 << blockBits;
|
|
1020
810
|
}
|
|
1021
811
|
}
|
|
1022
|
-
|
|
1023
812
|
function initializeCompoundDictionaryCopy(s, address, length) {
|
|
1024
813
|
if (s.cdBlockBits == -1) {
|
|
1025
814
|
initializeCompoundDictionary(s);
|
|
1026
815
|
}
|
|
1027
|
-
|
|
1028
816
|
let index = s.cdBlockMap[address >>> s.cdBlockBits];
|
|
1029
|
-
|
|
1030
817
|
while (address >= s.cdChunkOffsets[index + 1]) {
|
|
1031
818
|
index++;
|
|
1032
819
|
}
|
|
1033
|
-
|
|
1034
820
|
if (s.cdTotalSize > address + length) {
|
|
1035
821
|
throw 'Invalid backward reference';
|
|
1036
822
|
}
|
|
1037
|
-
|
|
1038
823
|
s.distRbIdx = s.distRbIdx + 1 & 0x3;
|
|
1039
824
|
s.rings[s.distRbIdx] = s.distance;
|
|
1040
825
|
s.metaBlockLength -= length;
|
|
@@ -1043,152 +828,119 @@ let makeBrotliDecode = () => {
|
|
|
1043
828
|
s.cdBrLength = length;
|
|
1044
829
|
s.cdBrCopied = 0;
|
|
1045
830
|
}
|
|
1046
|
-
|
|
1047
831
|
function copyFromCompoundDictionary(s, fence) {
|
|
1048
832
|
let pos = s.pos;
|
|
1049
833
|
let origPos = pos;
|
|
1050
|
-
|
|
1051
834
|
while (s.cdBrLength != s.cdBrCopied) {
|
|
1052
835
|
let space = fence - pos;
|
|
1053
836
|
let chunkLength = s.cdChunkOffsets[s.cdBrIndex + 1] - s.cdChunkOffsets[s.cdBrIndex];
|
|
1054
837
|
let remChunkLength = chunkLength - s.cdBrOffset;
|
|
1055
838
|
let length = s.cdBrLength - s.cdBrCopied;
|
|
1056
|
-
|
|
1057
839
|
if (length > remChunkLength) {
|
|
1058
840
|
length = remChunkLength;
|
|
1059
841
|
}
|
|
1060
|
-
|
|
1061
842
|
if (length > space) {
|
|
1062
843
|
length = space;
|
|
1063
844
|
}
|
|
1064
|
-
|
|
1065
845
|
copyBytes(s.ringBuffer, pos, s.cdChunks[s.cdBrIndex], s.cdBrOffset, s.cdBrOffset + length);
|
|
1066
846
|
pos += length;
|
|
1067
847
|
s.cdBrOffset += length;
|
|
1068
848
|
s.cdBrCopied += length;
|
|
1069
|
-
|
|
1070
849
|
if (length == remChunkLength) {
|
|
1071
850
|
s.cdBrIndex++;
|
|
1072
851
|
s.cdBrOffset = 0;
|
|
1073
852
|
}
|
|
1074
|
-
|
|
1075
853
|
if (pos >= fence) {
|
|
1076
854
|
break;
|
|
1077
855
|
}
|
|
1078
856
|
}
|
|
1079
|
-
|
|
1080
857
|
return pos - origPos;
|
|
1081
858
|
}
|
|
1082
|
-
|
|
1083
859
|
function decompress(s) {
|
|
1084
860
|
if (s.runningState == 0) {
|
|
1085
861
|
throw "Can't decompress until initialized";
|
|
1086
862
|
}
|
|
1087
|
-
|
|
1088
863
|
if (s.runningState == 11) {
|
|
1089
864
|
throw "Can't decompress after close";
|
|
1090
865
|
}
|
|
1091
|
-
|
|
1092
866
|
if (s.runningState == 1) {
|
|
1093
867
|
let windowBits = decodeWindowBits(s);
|
|
1094
|
-
|
|
1095
868
|
if (windowBits == -1) {
|
|
1096
869
|
throw "Invalid 'windowBits' code";
|
|
1097
870
|
}
|
|
1098
|
-
|
|
1099
871
|
s.maxRingBufferSize = 1 << windowBits;
|
|
1100
872
|
s.maxBackwardDistance = s.maxRingBufferSize - 16;
|
|
1101
873
|
s.runningState = 2;
|
|
1102
874
|
}
|
|
1103
|
-
|
|
1104
875
|
let fence = calculateFence(s);
|
|
1105
876
|
let ringBufferMask = s.ringBufferSize - 1;
|
|
1106
877
|
let ringBuffer = s.ringBuffer;
|
|
1107
|
-
|
|
1108
878
|
while (s.runningState != 10) {
|
|
1109
879
|
switch (s.runningState) {
|
|
1110
880
|
case 2:
|
|
1111
881
|
if (s.metaBlockLength < 0) {
|
|
1112
882
|
throw 'Invalid metablock length';
|
|
1113
883
|
}
|
|
1114
|
-
|
|
1115
884
|
readNextMetablockHeader(s);
|
|
1116
885
|
fence = calculateFence(s);
|
|
1117
886
|
ringBufferMask = s.ringBufferSize - 1;
|
|
1118
887
|
ringBuffer = s.ringBuffer;
|
|
1119
888
|
continue;
|
|
1120
|
-
|
|
1121
889
|
case 3:
|
|
1122
890
|
readMetablockHuffmanCodesAndContextMaps(s);
|
|
1123
891
|
s.runningState = 4;
|
|
1124
|
-
|
|
1125
892
|
case 4:
|
|
1126
893
|
if (s.metaBlockLength <= 0) {
|
|
1127
894
|
s.runningState = 2;
|
|
1128
895
|
continue;
|
|
1129
896
|
}
|
|
1130
|
-
|
|
1131
897
|
if (s.halfOffset > 2030) {
|
|
1132
898
|
doReadMoreInput(s);
|
|
1133
899
|
}
|
|
1134
|
-
|
|
1135
900
|
if (s.commandBlockLength == 0) {
|
|
1136
901
|
decodeCommandBlockSwitch(s);
|
|
1137
902
|
}
|
|
1138
|
-
|
|
1139
903
|
s.commandBlockLength--;
|
|
1140
|
-
|
|
1141
904
|
if (s.bitOffset >= 16) {
|
|
1142
905
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1143
906
|
s.bitOffset -= 16;
|
|
1144
907
|
}
|
|
1145
|
-
|
|
1146
908
|
let cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2;
|
|
1147
909
|
let insertAndCopyExtraBits = CMD_LOOKUP[cmdCode];
|
|
1148
910
|
let insertLengthOffset = CMD_LOOKUP[cmdCode + 1];
|
|
1149
911
|
let copyLengthOffset = CMD_LOOKUP[cmdCode + 2];
|
|
1150
912
|
s.distanceCode = CMD_LOOKUP[cmdCode + 3];
|
|
1151
|
-
|
|
1152
913
|
if (s.bitOffset >= 16) {
|
|
1153
914
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1154
915
|
s.bitOffset -= 16;
|
|
1155
916
|
}
|
|
1156
|
-
|
|
1157
917
|
let insertLengthExtraBits = insertAndCopyExtraBits & 0xff;
|
|
1158
918
|
s.insertLength = insertLengthOffset + (insertLengthExtraBits <= 16 ? readFewBits(s, insertLengthExtraBits) : readManyBits(s, insertLengthExtraBits));
|
|
1159
|
-
|
|
1160
919
|
if (s.bitOffset >= 16) {
|
|
1161
920
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1162
921
|
s.bitOffset -= 16;
|
|
1163
922
|
}
|
|
1164
|
-
|
|
1165
923
|
let copyLengthExtraBits = insertAndCopyExtraBits >> 8;
|
|
1166
924
|
s.copyLength = copyLengthOffset + (copyLengthExtraBits <= 16 ? readFewBits(s, copyLengthExtraBits) : readManyBits(s, copyLengthExtraBits));
|
|
1167
925
|
s.j = 0;
|
|
1168
926
|
s.runningState = 7;
|
|
1169
|
-
|
|
1170
927
|
case 7:
|
|
1171
928
|
if (s.trivialLiteralContext != 0) {
|
|
1172
929
|
while (s.j < s.insertLength) {
|
|
1173
930
|
if (s.halfOffset > 2030) {
|
|
1174
931
|
doReadMoreInput(s);
|
|
1175
932
|
}
|
|
1176
|
-
|
|
1177
933
|
if (s.literalBlockLength == 0) {
|
|
1178
934
|
decodeLiteralBlockSwitch(s);
|
|
1179
935
|
}
|
|
1180
|
-
|
|
1181
936
|
s.literalBlockLength--;
|
|
1182
|
-
|
|
1183
937
|
if (s.bitOffset >= 16) {
|
|
1184
938
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1185
939
|
s.bitOffset -= 16;
|
|
1186
940
|
}
|
|
1187
|
-
|
|
1188
941
|
ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s);
|
|
1189
942
|
s.pos++;
|
|
1190
943
|
s.j++;
|
|
1191
|
-
|
|
1192
944
|
if (s.pos >= fence) {
|
|
1193
945
|
s.nextRunningState = 7;
|
|
1194
946
|
s.runningState = 12;
|
|
@@ -1198,31 +950,25 @@ let makeBrotliDecode = () => {
|
|
|
1198
950
|
} else {
|
|
1199
951
|
let prevByte1 = ringBuffer[s.pos - 1 & ringBufferMask] & 0xff;
|
|
1200
952
|
let prevByte2 = ringBuffer[s.pos - 2 & ringBufferMask] & 0xff;
|
|
1201
|
-
|
|
1202
953
|
while (s.j < s.insertLength) {
|
|
1203
954
|
if (s.halfOffset > 2030) {
|
|
1204
955
|
doReadMoreInput(s);
|
|
1205
956
|
}
|
|
1206
|
-
|
|
1207
957
|
if (s.literalBlockLength == 0) {
|
|
1208
958
|
decodeLiteralBlockSwitch(s);
|
|
1209
959
|
}
|
|
1210
|
-
|
|
1211
960
|
let literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2];
|
|
1212
961
|
let literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xff;
|
|
1213
962
|
s.literalBlockLength--;
|
|
1214
963
|
prevByte2 = prevByte1;
|
|
1215
|
-
|
|
1216
964
|
if (s.bitOffset >= 16) {
|
|
1217
965
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1218
966
|
s.bitOffset -= 16;
|
|
1219
967
|
}
|
|
1220
|
-
|
|
1221
968
|
prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s);
|
|
1222
969
|
ringBuffer[s.pos] = prevByte1;
|
|
1223
970
|
s.pos++;
|
|
1224
971
|
s.j++;
|
|
1225
|
-
|
|
1226
972
|
if (s.pos >= fence) {
|
|
1227
973
|
s.nextRunningState = 7;
|
|
1228
974
|
s.runningState = 12;
|
|
@@ -1230,52 +976,40 @@ let makeBrotliDecode = () => {
|
|
|
1230
976
|
}
|
|
1231
977
|
}
|
|
1232
978
|
}
|
|
1233
|
-
|
|
1234
979
|
if (s.runningState != 7) {
|
|
1235
980
|
continue;
|
|
1236
981
|
}
|
|
1237
|
-
|
|
1238
982
|
s.metaBlockLength -= s.insertLength;
|
|
1239
|
-
|
|
1240
983
|
if (s.metaBlockLength <= 0) {
|
|
1241
984
|
s.runningState = 4;
|
|
1242
985
|
continue;
|
|
1243
986
|
}
|
|
1244
|
-
|
|
1245
987
|
let distanceCode = s.distanceCode;
|
|
1246
|
-
|
|
1247
988
|
if (distanceCode < 0) {
|
|
1248
989
|
s.distance = s.rings[s.distRbIdx];
|
|
1249
990
|
} else {
|
|
1250
991
|
if (s.halfOffset > 2030) {
|
|
1251
992
|
doReadMoreInput(s);
|
|
1252
993
|
}
|
|
1253
|
-
|
|
1254
994
|
if (s.distanceBlockLength == 0) {
|
|
1255
995
|
decodeDistanceBlockSwitch(s);
|
|
1256
996
|
}
|
|
1257
|
-
|
|
1258
997
|
s.distanceBlockLength--;
|
|
1259
|
-
|
|
1260
998
|
if (s.bitOffset >= 16) {
|
|
1261
999
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1262
1000
|
s.bitOffset -= 16;
|
|
1263
1001
|
}
|
|
1264
|
-
|
|
1265
1002
|
let distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xff;
|
|
1266
1003
|
distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s);
|
|
1267
|
-
|
|
1268
1004
|
if (distanceCode < 16) {
|
|
1269
1005
|
let index = s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode] & 0x3;
|
|
1270
1006
|
s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode];
|
|
1271
|
-
|
|
1272
1007
|
if (s.distance < 0) {
|
|
1273
1008
|
throw 'Negative distance';
|
|
1274
1009
|
}
|
|
1275
1010
|
} else {
|
|
1276
1011
|
let extraBits = s.distExtraBits[distanceCode];
|
|
1277
1012
|
let bits;
|
|
1278
|
-
|
|
1279
1013
|
if (s.bitOffset + extraBits <= 32) {
|
|
1280
1014
|
bits = readFewBits(s, extraBits);
|
|
1281
1015
|
} else {
|
|
@@ -1283,44 +1017,35 @@ let makeBrotliDecode = () => {
|
|
|
1283
1017
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1284
1018
|
s.bitOffset -= 16;
|
|
1285
1019
|
}
|
|
1286
|
-
|
|
1287
1020
|
bits = extraBits <= 16 ? readFewBits(s, extraBits) : readManyBits(s, extraBits);
|
|
1288
1021
|
}
|
|
1289
|
-
|
|
1290
1022
|
s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits);
|
|
1291
1023
|
}
|
|
1292
1024
|
}
|
|
1293
|
-
|
|
1294
1025
|
if (s.maxDistance != s.maxBackwardDistance && s.pos < s.maxBackwardDistance) {
|
|
1295
1026
|
s.maxDistance = s.pos;
|
|
1296
1027
|
} else {
|
|
1297
1028
|
s.maxDistance = s.maxBackwardDistance;
|
|
1298
1029
|
}
|
|
1299
|
-
|
|
1300
1030
|
if (s.distance > s.maxDistance) {
|
|
1301
1031
|
s.runningState = 9;
|
|
1302
1032
|
continue;
|
|
1303
1033
|
}
|
|
1304
|
-
|
|
1305
1034
|
if (distanceCode > 0) {
|
|
1306
1035
|
s.distRbIdx = s.distRbIdx + 1 & 0x3;
|
|
1307
1036
|
s.rings[s.distRbIdx] = s.distance;
|
|
1308
1037
|
}
|
|
1309
|
-
|
|
1310
1038
|
if (s.copyLength > s.metaBlockLength) {
|
|
1311
1039
|
throw 'Invalid backward reference';
|
|
1312
1040
|
}
|
|
1313
|
-
|
|
1314
1041
|
s.j = 0;
|
|
1315
1042
|
s.runningState = 8;
|
|
1316
|
-
|
|
1317
1043
|
case 8:
|
|
1318
1044
|
let src = s.pos - s.distance & ringBufferMask;
|
|
1319
1045
|
let dst = s.pos;
|
|
1320
1046
|
let copyLength = s.copyLength - s.j;
|
|
1321
1047
|
let srcEnd = src + copyLength;
|
|
1322
1048
|
let dstEnd = dst + copyLength;
|
|
1323
|
-
|
|
1324
1049
|
if (srcEnd < ringBufferMask && dstEnd < ringBufferMask) {
|
|
1325
1050
|
if (copyLength < 12 || srcEnd > dst && dstEnd > src) {
|
|
1326
1051
|
for (let k = 0; k < copyLength; k += 4) {
|
|
@@ -1332,7 +1057,6 @@ let makeBrotliDecode = () => {
|
|
|
1332
1057
|
} else {
|
|
1333
1058
|
ringBuffer.copyWithin(dst, src, srcEnd);
|
|
1334
1059
|
}
|
|
1335
|
-
|
|
1336
1060
|
s.j += copyLength;
|
|
1337
1061
|
s.metaBlockLength -= copyLength;
|
|
1338
1062
|
s.pos += copyLength;
|
|
@@ -1342,7 +1066,6 @@ let makeBrotliDecode = () => {
|
|
|
1342
1066
|
s.metaBlockLength--;
|
|
1343
1067
|
s.pos++;
|
|
1344
1068
|
s.j++;
|
|
1345
|
-
|
|
1346
1069
|
if (s.pos >= fence) {
|
|
1347
1070
|
s.nextRunningState = 8;
|
|
1348
1071
|
s.runningState = 12;
|
|
@@ -1350,86 +1073,66 @@ let makeBrotliDecode = () => {
|
|
|
1350
1073
|
}
|
|
1351
1074
|
}
|
|
1352
1075
|
}
|
|
1353
|
-
|
|
1354
1076
|
if (s.runningState == 8) {
|
|
1355
1077
|
s.runningState = 4;
|
|
1356
1078
|
}
|
|
1357
|
-
|
|
1358
1079
|
continue;
|
|
1359
|
-
|
|
1360
1080
|
case 9:
|
|
1361
1081
|
doUseDictionary(s, fence);
|
|
1362
1082
|
continue;
|
|
1363
|
-
|
|
1364
1083
|
case 14:
|
|
1365
1084
|
s.pos += copyFromCompoundDictionary(s, fence);
|
|
1366
|
-
|
|
1367
1085
|
if (s.pos >= fence) {
|
|
1368
1086
|
s.nextRunningState = 14;
|
|
1369
1087
|
s.runningState = 12;
|
|
1370
1088
|
return;
|
|
1371
1089
|
}
|
|
1372
|
-
|
|
1373
1090
|
s.runningState = 4;
|
|
1374
1091
|
continue;
|
|
1375
|
-
|
|
1376
1092
|
case 5:
|
|
1377
1093
|
while (s.metaBlockLength > 0) {
|
|
1378
1094
|
if (s.halfOffset > 2030) {
|
|
1379
1095
|
doReadMoreInput(s);
|
|
1380
1096
|
}
|
|
1381
|
-
|
|
1382
1097
|
if (s.bitOffset >= 16) {
|
|
1383
1098
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1384
1099
|
s.bitOffset -= 16;
|
|
1385
1100
|
}
|
|
1386
|
-
|
|
1387
1101
|
readFewBits(s, 8);
|
|
1388
1102
|
s.metaBlockLength--;
|
|
1389
1103
|
}
|
|
1390
|
-
|
|
1391
1104
|
s.runningState = 2;
|
|
1392
1105
|
continue;
|
|
1393
|
-
|
|
1394
1106
|
case 6:
|
|
1395
1107
|
copyUncompressedData(s);
|
|
1396
1108
|
continue;
|
|
1397
|
-
|
|
1398
1109
|
case 12:
|
|
1399
1110
|
s.ringBufferBytesReady = min(s.pos, s.ringBufferSize);
|
|
1400
1111
|
s.runningState = 13;
|
|
1401
|
-
|
|
1402
1112
|
case 13:
|
|
1403
1113
|
if (writeRingBuffer(s) == 0) {
|
|
1404
1114
|
return;
|
|
1405
1115
|
}
|
|
1406
|
-
|
|
1407
1116
|
if (s.pos >= s.maxBackwardDistance) {
|
|
1408
1117
|
s.maxDistance = s.maxBackwardDistance;
|
|
1409
1118
|
}
|
|
1410
|
-
|
|
1411
1119
|
if (s.pos >= s.ringBufferSize) {
|
|
1412
1120
|
if (s.pos > s.ringBufferSize) {
|
|
1413
1121
|
ringBuffer.copyWithin(0, s.ringBufferSize, s.pos);
|
|
1414
1122
|
}
|
|
1415
|
-
|
|
1416
1123
|
s.pos &= ringBufferMask;
|
|
1417
1124
|
s.ringBufferBytesWritten = 0;
|
|
1418
1125
|
}
|
|
1419
|
-
|
|
1420
1126
|
s.runningState = s.nextRunningState;
|
|
1421
1127
|
continue;
|
|
1422
|
-
|
|
1423
1128
|
default:
|
|
1424
1129
|
throw 'Unexpected state ' + s.runningState;
|
|
1425
1130
|
}
|
|
1426
1131
|
}
|
|
1427
|
-
|
|
1428
1132
|
if (s.runningState == 10) {
|
|
1429
1133
|
if (s.metaBlockLength < 0) {
|
|
1430
1134
|
throw 'Invalid metablock length';
|
|
1431
1135
|
}
|
|
1432
|
-
|
|
1433
1136
|
jumpToByteBoundary(s);
|
|
1434
1137
|
checkHealth(s, 1);
|
|
1435
1138
|
}
|
|
@@ -1449,31 +1152,25 @@ let makeBrotliDecode = () => {
|
|
|
1449
1152
|
}
|
|
1450
1153
|
|
|
1451
1154
|
let RFC_TRANSFORMS = new Transforms(121, 167, 50);
|
|
1452
|
-
|
|
1453
1155
|
function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) {
|
|
1454
1156
|
let n = prefixSuffixSrc.length;
|
|
1455
1157
|
let index = 1;
|
|
1456
1158
|
let j = 0;
|
|
1457
|
-
|
|
1458
1159
|
for (let i = 0; i < n; ++i) {
|
|
1459
1160
|
let c = prefixSuffixSrc.charCodeAt(i);
|
|
1460
|
-
|
|
1461
1161
|
if (c == 35) {
|
|
1462
1162
|
prefixSuffixHeads[index++] = j;
|
|
1463
1163
|
} else {
|
|
1464
1164
|
prefixSuffix[j++] = c;
|
|
1465
1165
|
}
|
|
1466
1166
|
}
|
|
1467
|
-
|
|
1468
1167
|
for (let i = 0; i < 363; ++i) {
|
|
1469
1168
|
transforms[i] = transformsSrc.charCodeAt(i) - 32;
|
|
1470
1169
|
}
|
|
1471
1170
|
}
|
|
1472
|
-
|
|
1473
1171
|
{
|
|
1474
1172
|
unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, '# #s #, #e #.# the #.com/#\xC2\xA0# of # and # in # to #"#">#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #', ' !! ! , *! &! " ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . " 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < \' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %\' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K');
|
|
1475
1173
|
}
|
|
1476
|
-
|
|
1477
1174
|
function transformDictionaryWord(dst, dstOffset, src, srcOffset, len, transforms, transformIndex) {
|
|
1478
1175
|
let offset = dstOffset;
|
|
1479
1176
|
let triplets = transforms.triplets;
|
|
@@ -1489,48 +1186,37 @@ let makeBrotliDecode = () => {
|
|
|
1489
1186
|
let suffixEnd = prefixSuffixHeads[suffixIdx + 1];
|
|
1490
1187
|
let omitFirst = transformType - 11;
|
|
1491
1188
|
let omitLast = transformType - 0;
|
|
1492
|
-
|
|
1493
1189
|
if (omitFirst < 1 || omitFirst > 9) {
|
|
1494
1190
|
omitFirst = 0;
|
|
1495
1191
|
}
|
|
1496
|
-
|
|
1497
1192
|
if (omitLast < 1 || omitLast > 9) {
|
|
1498
1193
|
omitLast = 0;
|
|
1499
1194
|
}
|
|
1500
|
-
|
|
1501
1195
|
while (prefix != prefixEnd) {
|
|
1502
1196
|
dst[offset++] = prefixSuffixStorage[prefix++];
|
|
1503
1197
|
}
|
|
1504
|
-
|
|
1505
1198
|
if (omitFirst > len) {
|
|
1506
1199
|
omitFirst = len;
|
|
1507
1200
|
}
|
|
1508
|
-
|
|
1509
1201
|
srcOffset += omitFirst;
|
|
1510
1202
|
len -= omitFirst;
|
|
1511
1203
|
len -= omitLast;
|
|
1512
1204
|
let i = len;
|
|
1513
|
-
|
|
1514
1205
|
while (i > 0) {
|
|
1515
1206
|
dst[offset++] = src[srcOffset++];
|
|
1516
1207
|
i--;
|
|
1517
1208
|
}
|
|
1518
|
-
|
|
1519
1209
|
if (transformType == 10 || transformType == 11) {
|
|
1520
1210
|
let uppercaseOffset = offset - len;
|
|
1521
|
-
|
|
1522
1211
|
if (transformType == 10) {
|
|
1523
1212
|
len = 1;
|
|
1524
1213
|
}
|
|
1525
|
-
|
|
1526
1214
|
while (len > 0) {
|
|
1527
1215
|
let c0 = dst[uppercaseOffset] & 0xff;
|
|
1528
|
-
|
|
1529
1216
|
if (c0 < 0xc0) {
|
|
1530
1217
|
if (c0 >= 97 && c0 <= 122) {
|
|
1531
1218
|
dst[uppercaseOffset] ^= 32;
|
|
1532
1219
|
}
|
|
1533
|
-
|
|
1534
1220
|
uppercaseOffset += 1;
|
|
1535
1221
|
len -= 1;
|
|
1536
1222
|
} else if (c0 < 0xe0) {
|
|
@@ -1547,11 +1233,9 @@ let makeBrotliDecode = () => {
|
|
|
1547
1233
|
let shiftOffset = offset - len;
|
|
1548
1234
|
let param = transforms.params[transformIndex];
|
|
1549
1235
|
let scalar = (param & 0x7fff) + (0x1000000 - (param & 0x8000));
|
|
1550
|
-
|
|
1551
1236
|
while (len > 0) {
|
|
1552
1237
|
let step = 1;
|
|
1553
1238
|
let c0 = dst[shiftOffset] & 0xff;
|
|
1554
|
-
|
|
1555
1239
|
if (c0 < 0x80) {
|
|
1556
1240
|
scalar += c0;
|
|
1557
1241
|
dst[shiftOffset] = scalar & 0x7f;
|
|
@@ -1592,57 +1276,44 @@ let makeBrotliDecode = () => {
|
|
|
1592
1276
|
step = len;
|
|
1593
1277
|
}
|
|
1594
1278
|
}
|
|
1595
|
-
|
|
1596
1279
|
shiftOffset += step;
|
|
1597
1280
|
len -= step;
|
|
1598
|
-
|
|
1599
1281
|
if (transformType == 21) {
|
|
1600
1282
|
len = 0;
|
|
1601
1283
|
}
|
|
1602
1284
|
}
|
|
1603
1285
|
}
|
|
1604
|
-
|
|
1605
1286
|
while (suffix != suffixEnd) {
|
|
1606
1287
|
dst[offset++] = prefixSuffixStorage[suffix++];
|
|
1607
1288
|
}
|
|
1608
|
-
|
|
1609
1289
|
return offset - dstOffset;
|
|
1610
1290
|
}
|
|
1611
1291
|
|
|
1612
1292
|
function getNextKey(key, len) {
|
|
1613
1293
|
let step = 1 << len - 1;
|
|
1614
|
-
|
|
1615
1294
|
while ((key & step) != 0) {
|
|
1616
1295
|
step >>= 1;
|
|
1617
1296
|
}
|
|
1618
|
-
|
|
1619
1297
|
return (key & step - 1) + step;
|
|
1620
1298
|
}
|
|
1621
|
-
|
|
1622
1299
|
function replicateValue(table, offset, step, end, item) {
|
|
1623
1300
|
do {
|
|
1624
1301
|
end -= step;
|
|
1625
1302
|
table[offset + end] = item;
|
|
1626
1303
|
} while (end > 0);
|
|
1627
1304
|
}
|
|
1628
|
-
|
|
1629
1305
|
function nextTableBitSize(count, len, rootBits) {
|
|
1630
1306
|
let left = 1 << len - rootBits;
|
|
1631
|
-
|
|
1632
1307
|
while (len < 15) {
|
|
1633
1308
|
left -= count[len];
|
|
1634
|
-
|
|
1635
1309
|
if (left <= 0) {
|
|
1636
1310
|
break;
|
|
1637
1311
|
}
|
|
1638
|
-
|
|
1639
1312
|
len++;
|
|
1640
1313
|
left <<= 1;
|
|
1641
1314
|
}
|
|
1642
|
-
|
|
1643
1315
|
return len - rootBits;
|
|
1644
1316
|
}
|
|
1645
|
-
|
|
1646
1317
|
function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) {
|
|
1647
1318
|
let tableOffset = tableGroup[tableIdx];
|
|
1648
1319
|
let key;
|
|
@@ -1650,49 +1321,38 @@ let makeBrotliDecode = () => {
|
|
|
1650
1321
|
let count = new Int32Array(16);
|
|
1651
1322
|
let offset = new Int32Array(16);
|
|
1652
1323
|
let symbol;
|
|
1653
|
-
|
|
1654
1324
|
for (symbol = 0; symbol < codeLengthsSize; symbol++) {
|
|
1655
1325
|
count[codeLengths[symbol]]++;
|
|
1656
1326
|
}
|
|
1657
|
-
|
|
1658
1327
|
offset[1] = 0;
|
|
1659
|
-
|
|
1660
1328
|
for (let len = 1; len < 15; len++) {
|
|
1661
1329
|
offset[len + 1] = offset[len] + count[len];
|
|
1662
1330
|
}
|
|
1663
|
-
|
|
1664
1331
|
for (symbol = 0; symbol < codeLengthsSize; symbol++) {
|
|
1665
1332
|
if (codeLengths[symbol] != 0) {
|
|
1666
1333
|
sorted[offset[codeLengths[symbol]]++] = symbol;
|
|
1667
1334
|
}
|
|
1668
1335
|
}
|
|
1669
|
-
|
|
1670
1336
|
let tableBits = rootBits;
|
|
1671
1337
|
let tableSize = 1 << tableBits;
|
|
1672
1338
|
let totalSize = tableSize;
|
|
1673
|
-
|
|
1674
1339
|
if (offset[15] == 1) {
|
|
1675
1340
|
for (key = 0; key < totalSize; key++) {
|
|
1676
1341
|
tableGroup[tableOffset + key] = sorted[0];
|
|
1677
1342
|
}
|
|
1678
|
-
|
|
1679
1343
|
return totalSize;
|
|
1680
1344
|
}
|
|
1681
|
-
|
|
1682
1345
|
key = 0;
|
|
1683
1346
|
symbol = 0;
|
|
1684
|
-
|
|
1685
1347
|
for (let len = 1, step = 2; len <= rootBits; len++, step <<= 1) {
|
|
1686
1348
|
for (; count[len] > 0; count[len]--) {
|
|
1687
1349
|
replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]);
|
|
1688
1350
|
key = getNextKey(key, len);
|
|
1689
1351
|
}
|
|
1690
1352
|
}
|
|
1691
|
-
|
|
1692
1353
|
let mask = totalSize - 1;
|
|
1693
1354
|
let low = -1;
|
|
1694
1355
|
let currentOffset = tableOffset;
|
|
1695
|
-
|
|
1696
1356
|
for (let len = rootBits + 1, step = 2; len <= 15; len++, step <<= 1) {
|
|
1697
1357
|
for (; count[len] > 0; count[len]--) {
|
|
1698
1358
|
if ((key & mask) != low) {
|
|
@@ -1703,12 +1363,10 @@ let makeBrotliDecode = () => {
|
|
|
1703
1363
|
low = key & mask;
|
|
1704
1364
|
tableGroup[tableOffset + low] = tableBits + rootBits << 16 | currentOffset - tableOffset - low;
|
|
1705
1365
|
}
|
|
1706
|
-
|
|
1707
1366
|
replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, len - rootBits << 16 | sorted[symbol++]);
|
|
1708
1367
|
key = getNextKey(key, len);
|
|
1709
1368
|
}
|
|
1710
1369
|
}
|
|
1711
|
-
|
|
1712
1370
|
return totalSize;
|
|
1713
1371
|
}
|
|
1714
1372
|
|
|
@@ -1717,67 +1375,53 @@ let makeBrotliDecode = () => {
|
|
|
1717
1375
|
if (halfAvailable(s) >= -2) {
|
|
1718
1376
|
return;
|
|
1719
1377
|
}
|
|
1720
|
-
|
|
1721
1378
|
throw 'No more input';
|
|
1722
1379
|
}
|
|
1723
|
-
|
|
1724
1380
|
let readOffset = s.halfOffset << 1;
|
|
1725
1381
|
let bytesInBuffer = 4096 - readOffset;
|
|
1726
1382
|
s.byteBuffer.copyWithin(0, readOffset, 4096);
|
|
1727
1383
|
s.halfOffset = 0;
|
|
1728
|
-
|
|
1729
1384
|
while (bytesInBuffer < 4096) {
|
|
1730
1385
|
let spaceLeft = 4096 - bytesInBuffer;
|
|
1731
1386
|
let len = readInput(s.input, s.byteBuffer, bytesInBuffer, spaceLeft);
|
|
1732
|
-
|
|
1733
1387
|
if (len <= 0) {
|
|
1734
1388
|
s.endOfStreamReached = 1;
|
|
1735
1389
|
s.tailBytes = bytesInBuffer;
|
|
1736
1390
|
bytesInBuffer += 1;
|
|
1737
1391
|
break;
|
|
1738
1392
|
}
|
|
1739
|
-
|
|
1740
1393
|
bytesInBuffer += len;
|
|
1741
1394
|
}
|
|
1742
|
-
|
|
1743
1395
|
bytesToNibbles(s, bytesInBuffer);
|
|
1744
1396
|
}
|
|
1745
|
-
|
|
1746
1397
|
function checkHealth(s, endOfStream) {
|
|
1747
1398
|
if (s.endOfStreamReached == 0) {
|
|
1748
1399
|
return;
|
|
1749
1400
|
}
|
|
1750
|
-
|
|
1751
1401
|
let byteOffset = (s.halfOffset << 1) + (s.bitOffset + 7 >> 3) - 4;
|
|
1752
|
-
|
|
1753
1402
|
if (byteOffset > s.tailBytes) {
|
|
1754
1403
|
throw 'Read after end';
|
|
1755
1404
|
}
|
|
1756
|
-
|
|
1757
1405
|
if (endOfStream != 0 && byteOffset != s.tailBytes) {
|
|
1758
1406
|
throw 'Unused bytes after end';
|
|
1759
1407
|
}
|
|
1760
1408
|
}
|
|
1761
|
-
|
|
1762
1409
|
function assertAccumulatorHealthy(s) {
|
|
1763
1410
|
if (s.bitOffset > 32) {
|
|
1764
1411
|
throw 'Accumulator underloaded: ' + s.bitOffset;
|
|
1765
1412
|
}
|
|
1766
1413
|
}
|
|
1767
|
-
|
|
1768
1414
|
function readFewBits(s, n) {
|
|
1769
1415
|
let val = s.accumulator32 >>> s.bitOffset & (1 << n) - 1;
|
|
1770
1416
|
s.bitOffset += n;
|
|
1771
1417
|
return val;
|
|
1772
1418
|
}
|
|
1773
|
-
|
|
1774
1419
|
function readManyBits(s, n) {
|
|
1775
1420
|
let low = readFewBits(s, 16);
|
|
1776
1421
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1777
1422
|
s.bitOffset -= 16;
|
|
1778
1423
|
return low | readFewBits(s, n - 16) << 16;
|
|
1779
1424
|
}
|
|
1780
|
-
|
|
1781
1425
|
function initBitReader(s) {
|
|
1782
1426
|
s.byteBuffer = new Int8Array(4160);
|
|
1783
1427
|
s.accumulator32 = 0;
|
|
@@ -1787,64 +1431,50 @@ let makeBrotliDecode = () => {
|
|
|
1787
1431
|
s.endOfStreamReached = 0;
|
|
1788
1432
|
prepare(s);
|
|
1789
1433
|
}
|
|
1790
|
-
|
|
1791
1434
|
function prepare(s) {
|
|
1792
1435
|
if (s.halfOffset > 2030) {
|
|
1793
1436
|
doReadMoreInput(s);
|
|
1794
1437
|
}
|
|
1795
|
-
|
|
1796
1438
|
checkHealth(s, 0);
|
|
1797
1439
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1798
1440
|
s.bitOffset -= 16;
|
|
1799
1441
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1800
1442
|
s.bitOffset -= 16;
|
|
1801
1443
|
}
|
|
1802
|
-
|
|
1803
1444
|
function reload(s) {
|
|
1804
1445
|
if (s.bitOffset == 32) {
|
|
1805
1446
|
prepare(s);
|
|
1806
1447
|
}
|
|
1807
1448
|
}
|
|
1808
|
-
|
|
1809
1449
|
function jumpToByteBoundary(s) {
|
|
1810
1450
|
let padding = 32 - s.bitOffset & 7;
|
|
1811
|
-
|
|
1812
1451
|
if (padding != 0) {
|
|
1813
1452
|
let paddingBits = readFewBits(s, padding);
|
|
1814
|
-
|
|
1815
1453
|
if (paddingBits != 0) {
|
|
1816
1454
|
throw 'Corrupted padding bits';
|
|
1817
1455
|
}
|
|
1818
1456
|
}
|
|
1819
1457
|
}
|
|
1820
|
-
|
|
1821
1458
|
function halfAvailable(s) {
|
|
1822
1459
|
let limit = 2048;
|
|
1823
|
-
|
|
1824
1460
|
if (s.endOfStreamReached != 0) {
|
|
1825
1461
|
limit = s.tailBytes + 1 >> 1;
|
|
1826
1462
|
}
|
|
1827
|
-
|
|
1828
1463
|
return limit - s.halfOffset;
|
|
1829
1464
|
}
|
|
1830
|
-
|
|
1831
1465
|
function copyRawBytes(s, data, offset, length) {
|
|
1832
1466
|
if ((s.bitOffset & 7) != 0) {
|
|
1833
1467
|
throw 'Unaligned copyBytes';
|
|
1834
1468
|
}
|
|
1835
|
-
|
|
1836
1469
|
while (s.bitOffset != 32 && length != 0) {
|
|
1837
1470
|
data[offset++] = s.accumulator32 >>> s.bitOffset;
|
|
1838
1471
|
s.bitOffset += 8;
|
|
1839
1472
|
length--;
|
|
1840
1473
|
}
|
|
1841
|
-
|
|
1842
1474
|
if (length == 0) {
|
|
1843
1475
|
return;
|
|
1844
1476
|
}
|
|
1845
|
-
|
|
1846
1477
|
let copyNibbles = min(halfAvailable(s), length >> 1);
|
|
1847
|
-
|
|
1848
1478
|
if (copyNibbles > 0) {
|
|
1849
1479
|
let readOffset = s.halfOffset << 1;
|
|
1850
1480
|
let delta = copyNibbles << 1;
|
|
@@ -1853,91 +1483,72 @@ let makeBrotliDecode = () => {
|
|
|
1853
1483
|
length -= delta;
|
|
1854
1484
|
s.halfOffset += copyNibbles;
|
|
1855
1485
|
}
|
|
1856
|
-
|
|
1857
1486
|
if (length == 0) {
|
|
1858
1487
|
return;
|
|
1859
1488
|
}
|
|
1860
|
-
|
|
1861
1489
|
if (halfAvailable(s) > 0) {
|
|
1862
1490
|
if (s.bitOffset >= 16) {
|
|
1863
1491
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1864
1492
|
s.bitOffset -= 16;
|
|
1865
1493
|
}
|
|
1866
|
-
|
|
1867
1494
|
while (length != 0) {
|
|
1868
1495
|
data[offset++] = s.accumulator32 >>> s.bitOffset;
|
|
1869
1496
|
s.bitOffset += 8;
|
|
1870
1497
|
length--;
|
|
1871
1498
|
}
|
|
1872
|
-
|
|
1873
1499
|
checkHealth(s, 0);
|
|
1874
1500
|
return;
|
|
1875
1501
|
}
|
|
1876
|
-
|
|
1877
1502
|
while (length > 0) {
|
|
1878
1503
|
let len = readInput(s.input, data, offset, length);
|
|
1879
|
-
|
|
1880
1504
|
if (len == -1) {
|
|
1881
1505
|
throw 'Unexpected end of input';
|
|
1882
1506
|
}
|
|
1883
|
-
|
|
1884
1507
|
offset += len;
|
|
1885
1508
|
length -= len;
|
|
1886
1509
|
}
|
|
1887
1510
|
}
|
|
1888
|
-
|
|
1889
1511
|
function bytesToNibbles(s, byteLen) {
|
|
1890
1512
|
let byteBuffer = s.byteBuffer;
|
|
1891
1513
|
let halfLen = byteLen >> 1;
|
|
1892
1514
|
let shortBuffer = s.shortBuffer;
|
|
1893
|
-
|
|
1894
1515
|
for (let i = 0; i < halfLen; ++i) {
|
|
1895
1516
|
shortBuffer[i] = byteBuffer[i * 2] & 0xff | (byteBuffer[i * 2 + 1] & 0xff) << 8;
|
|
1896
1517
|
}
|
|
1897
1518
|
}
|
|
1898
1519
|
|
|
1899
1520
|
let LOOKUP = new Int32Array(2048);
|
|
1900
|
-
|
|
1901
1521
|
function unpackLookupTable(lookup, map, rle) {
|
|
1902
1522
|
for (let i = 0; i < 256; ++i) {
|
|
1903
1523
|
lookup[i] = i & 0x3f;
|
|
1904
1524
|
lookup[512 + i] = i >> 2;
|
|
1905
1525
|
lookup[1792 + i] = 2 + (i >> 6);
|
|
1906
1526
|
}
|
|
1907
|
-
|
|
1908
1527
|
for (let i = 0; i < 128; ++i) {
|
|
1909
1528
|
lookup[1024 + i] = 4 * (map.charCodeAt(i) - 32);
|
|
1910
1529
|
}
|
|
1911
|
-
|
|
1912
1530
|
for (let i = 0; i < 64; ++i) {
|
|
1913
1531
|
lookup[1152 + i] = i & 1;
|
|
1914
1532
|
lookup[1216 + i] = 2 + (i & 1);
|
|
1915
1533
|
}
|
|
1916
|
-
|
|
1917
1534
|
let offset = 1280;
|
|
1918
|
-
|
|
1919
1535
|
for (let k = 0; k < 19; ++k) {
|
|
1920
1536
|
let value = k & 3;
|
|
1921
1537
|
let rep = rle.charCodeAt(k) - 32;
|
|
1922
|
-
|
|
1923
1538
|
for (let i = 0; i < rep; ++i) {
|
|
1924
1539
|
lookup[offset++] = value;
|
|
1925
1540
|
}
|
|
1926
1541
|
}
|
|
1927
|
-
|
|
1928
1542
|
for (let i = 0; i < 16; ++i) {
|
|
1929
1543
|
lookup[1792 + i] = 1;
|
|
1930
1544
|
lookup[2032 + i] = 6;
|
|
1931
1545
|
}
|
|
1932
|
-
|
|
1933
1546
|
lookup[1792] = 0;
|
|
1934
1547
|
lookup[2047] = 7;
|
|
1935
|
-
|
|
1936
1548
|
for (let i = 0; i < 256; ++i) {
|
|
1937
1549
|
lookup[1536 + i] = lookup[1792 + i] << 3;
|
|
1938
1550
|
}
|
|
1939
1551
|
}
|
|
1940
|
-
|
|
1941
1552
|
{
|
|
1942
1553
|
unpackLookupTable(LOOKUP, " !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/* ': & : $ \x81 @");
|
|
1943
1554
|
}
|
|
@@ -2025,88 +1636,69 @@ let makeBrotliDecode = () => {
|
|
|
2025
1636
|
let data = null;
|
|
2026
1637
|
let offsets = new Int32Array(32);
|
|
2027
1638
|
let sizeBits = new Int32Array(32);
|
|
2028
|
-
|
|
2029
1639
|
function setData(newData, newSizeBits) {
|
|
2030
1640
|
if (isDirect(newData) == 0 || isReadOnly(newData) == 0) {
|
|
2031
1641
|
throw 'newData must be a direct read-only byte buffer';
|
|
2032
1642
|
}
|
|
2033
|
-
|
|
2034
1643
|
if (newSizeBits.length > 31) {
|
|
2035
1644
|
throw 'sizeBits length must be at most ' + 31;
|
|
2036
1645
|
}
|
|
2037
|
-
|
|
2038
1646
|
for (let i = 0; i < 4; ++i) {
|
|
2039
1647
|
if (newSizeBits[i] != 0) {
|
|
2040
1648
|
throw 'first ' + 4 + ' must be 0';
|
|
2041
1649
|
}
|
|
2042
1650
|
}
|
|
2043
|
-
|
|
2044
1651
|
let dictionaryOffsets = offsets;
|
|
2045
1652
|
let dictionarySizeBits = sizeBits;
|
|
2046
1653
|
dictionarySizeBits.set(newSizeBits.subarray(0, 0 + newSizeBits.length), 0);
|
|
2047
1654
|
let pos = 0;
|
|
2048
1655
|
let limit = newData.length;
|
|
2049
|
-
|
|
2050
1656
|
for (let i = 0; i < newSizeBits.length; ++i) {
|
|
2051
1657
|
dictionaryOffsets[i] = pos;
|
|
2052
1658
|
let bits = dictionarySizeBits[i];
|
|
2053
|
-
|
|
2054
1659
|
if (bits != 0) {
|
|
2055
1660
|
if (bits >= 31) {
|
|
2056
1661
|
throw 'newSizeBits values must be less than 31';
|
|
2057
1662
|
}
|
|
2058
|
-
|
|
2059
1663
|
pos += i << bits;
|
|
2060
|
-
|
|
2061
1664
|
if (pos <= 0 || pos > limit) {
|
|
2062
1665
|
throw 'newSizeBits is inconsistent: overflow';
|
|
2063
1666
|
}
|
|
2064
1667
|
}
|
|
2065
1668
|
}
|
|
2066
|
-
|
|
2067
1669
|
for (let i = newSizeBits.length; i < 32; ++i) {
|
|
2068
1670
|
dictionaryOffsets[i] = pos;
|
|
2069
1671
|
}
|
|
2070
|
-
|
|
2071
1672
|
if (pos != limit) {
|
|
2072
1673
|
throw 'newSizeBits is inconsistent: underflow';
|
|
2073
1674
|
}
|
|
2074
|
-
|
|
2075
1675
|
data = newData;
|
|
2076
1676
|
}
|
|
2077
1677
|
|
|
2078
1678
|
function unpackDictionaryData(dictionary, data0, data1, skipFlip, sizeBits, sizeBitsData) {
|
|
2079
1679
|
let dict = toUsAsciiBytes(data0 + data1);
|
|
2080
|
-
|
|
2081
1680
|
if (dict.length != dictionary.length) {
|
|
2082
1681
|
throw 'Corrupted brotli dictionary';
|
|
2083
1682
|
}
|
|
2084
|
-
|
|
2085
1683
|
let offset = 0;
|
|
2086
1684
|
let n = skipFlip.length;
|
|
2087
|
-
|
|
2088
1685
|
for (let i = 0; i < n; i += 2) {
|
|
2089
1686
|
let skip = skipFlip.charCodeAt(i) - 36;
|
|
2090
1687
|
let flip = skipFlip.charCodeAt(i + 1) - 36;
|
|
2091
|
-
|
|
2092
1688
|
for (let j = 0; j < skip; ++j) {
|
|
2093
1689
|
dict[offset] ^= 3;
|
|
2094
1690
|
offset++;
|
|
2095
1691
|
}
|
|
2096
|
-
|
|
2097
1692
|
for (let j = 0; j < flip; ++j) {
|
|
2098
1693
|
dict[offset] ^= 236;
|
|
2099
1694
|
offset++;
|
|
2100
1695
|
}
|
|
2101
1696
|
}
|
|
2102
|
-
|
|
2103
1697
|
for (let i = 0; i < sizeBitsData.length; ++i) {
|
|
2104
1698
|
sizeBits[i] = sizeBitsData.charCodeAt(i) - 65;
|
|
2105
1699
|
}
|
|
2106
|
-
|
|
2107
1700
|
dictionary.set(dict);
|
|
2108
1701
|
}
|
|
2109
|
-
|
|
2110
1702
|
{
|
|
2111
1703
|
let dictionaryData = new Int8Array(122784);
|
|
2112
1704
|
let dictionarySizeBits = new Int32Array(25);
|
|
@@ -2148,31 +1740,27 @@ let makeBrotliDecode = () => {
|
|
|
2148
1740
|
return 1;
|
|
2149
1741
|
}
|
|
2150
1742
|
|
|
2151
|
-
function flipBuffer(buffer) {
|
|
1743
|
+
function flipBuffer(buffer) {
|
|
1744
|
+
}
|
|
2152
1745
|
|
|
2153
1746
|
function toUsAsciiBytes(src) {
|
|
2154
1747
|
let n = src.length;
|
|
2155
1748
|
let result = new Int8Array(n);
|
|
2156
|
-
|
|
2157
1749
|
for (let i = 0; i < n; ++i) {
|
|
2158
1750
|
result[i] = src.charCodeAt(i);
|
|
2159
1751
|
}
|
|
2160
|
-
|
|
2161
1752
|
return result;
|
|
2162
1753
|
}
|
|
2163
1754
|
|
|
2164
1755
|
function decode(bytes, options) {
|
|
2165
1756
|
let s = new State();
|
|
2166
1757
|
initState(s, new InputStream(bytes));
|
|
2167
|
-
|
|
2168
1758
|
if (options) {
|
|
2169
1759
|
let customDictionary = options['customDictionary'];
|
|
2170
1760
|
if (customDictionary) attachDictionaryChunk(s, customDictionary);
|
|
2171
1761
|
}
|
|
2172
|
-
|
|
2173
1762
|
let totalOutput = 0;
|
|
2174
1763
|
let chunks = [];
|
|
2175
|
-
|
|
2176
1764
|
while (true) {
|
|
2177
1765
|
let chunk = new Int8Array(16384);
|
|
2178
1766
|
chunks.push(chunk);
|
|
@@ -2184,28 +1772,22 @@ let makeBrotliDecode = () => {
|
|
|
2184
1772
|
totalOutput += s.outputUsed;
|
|
2185
1773
|
if (s.outputUsed < 16384) break;
|
|
2186
1774
|
}
|
|
2187
|
-
|
|
2188
1775
|
close(s);
|
|
2189
1776
|
let result = new Int8Array(totalOutput);
|
|
2190
1777
|
let offset = 0;
|
|
2191
|
-
|
|
2192
1778
|
for (let i = 0; i < chunks.length; ++i) {
|
|
2193
1779
|
let chunk = chunks[i];
|
|
2194
1780
|
let end = min(totalOutput, offset + 16384);
|
|
2195
1781
|
let len = end - offset;
|
|
2196
|
-
|
|
2197
1782
|
if (len < 16384) {
|
|
2198
1783
|
result.set(chunk.subarray(0, len), offset);
|
|
2199
1784
|
} else {
|
|
2200
1785
|
result.set(chunk, offset);
|
|
2201
1786
|
}
|
|
2202
|
-
|
|
2203
1787
|
offset += len;
|
|
2204
1788
|
}
|
|
2205
|
-
|
|
2206
1789
|
return result;
|
|
2207
1790
|
}
|
|
2208
|
-
|
|
2209
1791
|
return decode;
|
|
2210
1792
|
};
|
|
2211
1793
|
|