Last active
April 9, 2023 10:37
-
-
Save umbertocerrato/7c7e37c92c62436e75ae16fc4b1526d3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var DjVu = (function () { | |
'use strict'; | |
function DjVuScript() { | |
'use strict'; | |
var DjVu = { | |
VERSION: '0.5.4', | |
IS_DEBUG: false, | |
setDebugMode: (flag) => DjVu.IS_DEBUG = flag | |
}; | |
function pLimit(limit = 4) { | |
const queue = []; | |
let running = 0; | |
const runNext = async () => { | |
if (!queue.length || running >= limit) return; | |
const func = queue.shift(); | |
try { | |
running++; | |
await func(); | |
} finally { | |
running--; | |
runNext(); | |
} | |
}; | |
return func => new Promise((resolve, reject) => { | |
queue.push(() => func().then(resolve, reject)); | |
runNext(); | |
}); | |
} | |
function loadFileViaXHR(url, responseType = 'arraybuffer') { | |
return new Promise((resolve, reject) => { | |
var xhr = new XMLHttpRequest(); | |
xhr.open("GET", url); | |
xhr.responseType = responseType; | |
xhr.onload = (e) => resolve(xhr); | |
xhr.onerror = (e) => reject(xhr); | |
xhr.send(); | |
}); | |
} | |
const utf8Decoder = self.TextDecoder ? new self.TextDecoder() : { | |
decode(utf8array) { | |
const codePoints = utf8ToCodePoints(utf8array); | |
return String.fromCodePoint(...codePoints); | |
} | |
}; | |
function createStringFromUtf8Array(utf8array) { | |
return utf8Decoder.decode(utf8array); | |
} | |
function utf8ToCodePoints(utf8array) { | |
var i, c; | |
var codePoints = []; | |
i = 0; | |
while (i < utf8array.length) { | |
c = utf8array[i++]; | |
switch (c >> 4) { | |
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: | |
codePoints.push(c); | |
break; | |
case 12: case 13: | |
codePoints.push(((c & 0x1F) << 6) | (utf8array[i++] & 0x3F)); | |
break; | |
case 14: | |
codePoints.push( | |
((c & 0x0F) << 12) | | |
((utf8array[i++] & 0x3F) << 6) | | |
(utf8array[i++] & 0x3F) | |
); | |
break; | |
case 15: | |
codePoints.push( | |
((c & 0x07) << 18) | | |
((utf8array[i++] & 0x3F) << 12) | | |
((utf8array[i++] & 0x3F) << 6) | | |
(utf8array[i++] & 0x3F) | |
); | |
break; | |
} | |
} | |
return codePoints.map(codePoint => { | |
return codePoint > 0x10FFFF ? 120 : codePoint; | |
}); | |
} | |
function codePointsToUtf8(codePoints) { | |
var utf8array = []; | |
codePoints.forEach(codePoint => { | |
if (codePoint < 0x80) { | |
utf8array.push(codePoint); | |
} else if (codePoint < 0x800) { | |
utf8array.push(0xC0 | (codePoint >> 6)); | |
utf8array.push(0x80 | (codePoint & 0x3F)); | |
} else if (codePoint < 0x10000) { | |
utf8array.push(0xE0 | (codePoint >> 12)); | |
utf8array.push(0x80 | ((codePoint >> 6) & 0x3F)); | |
utf8array.push(0x80 | (codePoint & 0x3F)); | |
} else { | |
utf8array.push(0xF0 | (codePoint >> 18)); | |
utf8array.push(0x80 | ((codePoint >> 12) & 0x3F)); | |
utf8array.push(0x80 | ((codePoint >> 6) & 0x3F)); | |
utf8array.push(0x80 | (codePoint & 0x3F)); | |
} | |
}); | |
return new Uint8Array(utf8array); | |
} | |
function stringToCodePoints(str) { | |
var codePoints = []; | |
for (var i = 0; i < str.length; i++) { | |
var code = str.codePointAt(i); | |
codePoints.push(code); | |
if (code > 65535) { | |
i++; | |
} | |
} | |
return codePoints; | |
} | |
const pageSize = 64 * 1024; | |
const growthLimit = 20 * 1024 * 1024 / pageSize; | |
class ByteStreamWriter { | |
constructor(length = 0) { | |
this.memory = new WebAssembly.Memory({ initial: Math.ceil(length / pageSize), maximum: 65536 }); | |
this.assignBufferFromMemory(); | |
this.offset = 0; | |
this.offsetMarks = {}; | |
} | |
assignBufferFromMemory() { | |
this.buffer = this.memory.buffer; | |
this.viewer = new DataView(this.buffer); | |
} | |
reset() { | |
this.offset = 0; | |
this.offsetMarks = {}; | |
} | |
saveOffsetMark(mark) { | |
this.offsetMarks[mark] = this.offset; | |
return this; | |
} | |
writeByte(byte) { | |
this.checkOffset(1); | |
this.viewer.setUint8(this.offset++, byte); | |
return this; | |
} | |
writeStr(str) { | |
this.writeArray(codePointsToUtf8(stringToCodePoints(str))); | |
return this; | |
} | |
writeInt32(val) { | |
this.checkOffset(4); | |
this.viewer.setInt32(this.offset, val); | |
this.offset += 4; | |
return this; | |
} | |
rewriteInt32(off, val) { | |
var xoff = off; | |
if (typeof (xoff) === 'string') { | |
xoff = this.offsetMarks[off]; | |
this.offsetMarks[off] += 4; | |
} | |
this.viewer.setInt32(xoff, val); | |
} | |
rewriteSize(offmark) { | |
if (!this.offsetMarks[offmark]) throw new Error('Unexisting offset mark'); | |
var xoff = this.offsetMarks[offmark]; | |
this.viewer.setInt32(xoff, this.offset - xoff - 4); | |
} | |
getBuffer() { | |
if (this.offset === this.buffer.byteLength) { | |
return this.buffer; | |
} | |
return this.buffer.slice(0, this.offset); | |
} | |
checkOffset(requiredBytesNumber = 0) { | |
const bool = this.offset + requiredBytesNumber > this.buffer.byteLength; | |
if (bool) { | |
this._expand(requiredBytesNumber); | |
} | |
return bool; | |
} | |
_expand(requiredBytesNumber) { | |
this.memory.grow(Math.max( | |
Math.ceil(requiredBytesNumber / pageSize), | |
Math.min(this.memory.buffer.byteLength / pageSize, growthLimit) | |
)); | |
this.assignBufferFromMemory(); | |
} | |
jump(length) { | |
length = +length; | |
if (length > 0) { | |
this.checkOffset(length); | |
} | |
this.offset += length; | |
return this; | |
} | |
writeByteStream(bs) { | |
this.writeArray(bs.toUint8Array()); | |
} | |
writeArray(arr) { | |
while (this.checkOffset(arr.length)) { } | |
new Uint8Array(this.buffer).set(arr, this.offset); | |
this.offset += arr.length; | |
} | |
writeBuffer(buffer) { | |
this.writeArray(new Uint8Array(buffer)); | |
} | |
writeStrNT(str) { | |
this.writeStr(str); | |
this.writeByte(0); | |
} | |
writeInt16(val) { | |
this.checkOffset(2); | |
this.viewer.setInt16(this.offset, val); | |
this.offset += 2; | |
return this; | |
} | |
writeUint16(val) { | |
this.checkOffset(2); | |
this.viewer.setUint16(this.offset, val); | |
this.offset += 2; | |
return this; | |
} | |
writeInt24(val) { | |
this.writeByte((val >> 16) & 0xff) | |
.writeByte((val >> 8) & 0xff) | |
.writeByte(val & 0xff); | |
return this; | |
} | |
} | |
class ZPEncoder { | |
constructor(bsw) { | |
this.bsw = bsw || new ByteStreamWriter(); | |
this.a = 0; | |
this.scount = 0; | |
this.byte = 0; | |
this.delay = 25; | |
this.subend = 0; | |
this.buffer = 0xffffff; | |
this.nrun = 0; | |
} | |
outbit(bit) { | |
if (this.delay > 0) { | |
if (this.delay < 0xff) | |
this.delay -= 1; | |
} | |
else { | |
this.byte = (this.byte << 1) | bit; | |
if (++this.scount == 8) { | |
this.bsw.writeByte(this.byte); | |
this.scount = 0; | |
this.byte = 0; | |
} | |
} | |
} | |
zemit(b) { | |
this.buffer = (this.buffer << 1) + b; | |
b = (this.buffer >> 24); | |
this.buffer = (this.buffer & 0xffffff); | |
switch (b) { | |
case 1: | |
this.outbit(1); | |
while (this.nrun-- > 0) | |
this.outbit(0); | |
this.nrun = 0; | |
break; | |
case 0xff: | |
this.outbit(0); | |
while (this.nrun-- > 0) | |
this.outbit(1); | |
this.nrun = 0; | |
break; | |
case 0: | |
this.nrun += 1; | |
break; | |
default: | |
throw new Exception('ZPEncoder::zemit() error!'); | |
} | |
} | |
encode(bit, ctx, n) { | |
bit = +bit; | |
if (!ctx) { | |
return this._ptencode(bit, 0x8000 + (this.a >> 1)); | |
} | |
var z = this.a + this.p[ctx[n]]; | |
if (bit != (ctx[n] & 1)) { | |
var d = 0x6000 + ((z + this.a) >> 2); | |
if (z > d) { | |
z = d; | |
} | |
ctx[n] = this.dn[ctx[n]]; | |
z = 0x10000 - z; | |
this.subend += z; | |
this.a += z; | |
} else if (z >= 0x8000) { | |
var d = 0x6000 + ((z + this.a) >> 2); | |
if (z > d) { | |
z = d; | |
} | |
if (this.a >= this.m[ctx[n]]) | |
ctx[n] = this.up[ctx[n]]; | |
this.a = z; | |
} else { | |
this.a = z; | |
return; | |
} | |
while (this.a >= 0x8000) { | |
this.zemit(1 - (this.subend >> 15)); | |
this.subend = 0xffff & (this.subend << 1); | |
this.a = 0xffff & (this.a << 1); | |
} | |
} | |
IWencode(bit) { | |
this._ptencode(bit, 0x8000 + ((this.a + this.a + this.a) >> 3)); | |
} | |
_ptencode(bit, z) { | |
if (bit) { | |
z = 0x10000 - z; | |
this.subend += z; | |
this.a += z; | |
} else { | |
this.a = z; | |
} | |
while (this.a >= 0x8000) { | |
this.zemit(1 - (this.subend >> 15)); | |
this.subend = 0xffff & (this.subend << 1); | |
this.a = 0xffff & (this.a << 1); | |
} | |
} | |
eflush() { | |
if (this.subend > 0x8000) | |
this.subend = 0x10000; | |
else if (this.subend > 0) | |
this.subend = 0x8000; | |
while (this.buffer != 0xffffff || this.subend) { | |
this.zemit(1 - (this.subend >> 15)); | |
this.subend = 0xffff & (this.subend << 1); | |
} | |
this.outbit(1); | |
while (this.nrun-- > 0) | |
this.outbit(0); | |
this.nrun = 0; | |
while (this.scount > 0) | |
this.outbit(1); | |
this.delay = 0xff; | |
} | |
} | |
class ZPDecoder { | |
constructor(bs) { | |
this.bs = bs; | |
this.a = 0x0000; | |
this.c = this.bs.byte(); | |
this.c <<= 8; | |
var tmp = this.bs.byte(); | |
this.c |= tmp; | |
this.z = 0; | |
this.d = 0; | |
this.f = Math.min(this.c, 0x7fff); | |
this.ffzt = new Int8Array(256); | |
for (var i = 0; i < 256; i++) { | |
this.ffzt[i] = 0; | |
for (var j = i; j & 0x80; j <<= 1) | |
this.ffzt[i] += 1; | |
} | |
this.delay = 25; | |
this.scount = 0; | |
this.buffer = 0; | |
this.preload(); | |
} | |
preload() { | |
while (this.scount <= 24) { | |
var byte = this.bs.byte(); | |
this.buffer = (this.buffer << 8) | byte; | |
this.scount += 8; | |
} | |
} | |
ffz(x) { | |
return (x >= 0xff00) ? (this.ffzt[x & 0xff] + 8) : (this.ffzt[(x >> 8) & 0xff]); | |
} | |
decode(ctx, n) { | |
if (!ctx) { | |
return this._ptdecode(0x8000 + (this.a >> 1)); | |
} | |
this.b = ctx[n] & 1; | |
this.z = this.a + this.p[ctx[n]]; | |
if (this.z <= this.f) { | |
this.a = this.z; | |
return this.b; | |
} | |
this.d = 0x6000 + ((this.a + this.z) >> 2); | |
if (this.z > this.d) { | |
this.z = this.d; | |
} | |
if (this.z > this.c) { | |
this.b = 1 - this.b; | |
this.z = 0x10000 - this.z; | |
this.a += this.z; | |
this.c += this.z; | |
ctx[n] = this.dn[ctx[n]]; | |
var shift = this.ffz(this.a); | |
this.scount -= shift; | |
this.a = 0xffff & (this.a << shift); | |
this.c = 0xffff & ( | |
(this.c << shift) | (this.buffer >> this.scount) & ((1 << shift) - 1) | |
); | |
} | |
else { | |
if (this.a >= this.m[ctx[n]]) { | |
ctx[n] = this.up[ctx[n]]; | |
} | |
this.scount--; | |
this.a = 0xffff & (this.z << 1); | |
this.c = 0xffff & ( | |
(this.c << 1) | ((this.buffer >> this.scount) & 1) | |
); | |
} | |
if (this.scount < 16) | |
this.preload(); | |
this.f = Math.min(this.c, 0x7fff); | |
return this.b; | |
} | |
IWdecode() { | |
return this._ptdecode(0x8000 + ((this.a + this.a + this.a) >> 3)); | |
} | |
_ptdecode(z) { | |
this.b = 0; | |
if (z > this.c) { | |
this.b = 1; | |
z = 0x10000 - z; | |
this.a += z; | |
this.c += z; | |
var shift = this.ffz(this.a); | |
this.scount -= shift; | |
this.a = 0xffff & (this.a << shift); | |
this.c = 0xffff & ( | |
(this.c << shift) | (this.buffer >> this.scount) & ((1 << shift) - 1) | |
); | |
} | |
else { | |
this.b = 0; | |
this.scount--; | |
this.a = 0xffff & (z << 1); | |
this.c = 0xffff & ( | |
(this.c << 1) | ((this.buffer >> this.scount) & 1) | |
); | |
} | |
if (this.scount < 16) | |
this.preload(); | |
this.f = Math.min(this.c, 0x7fff); | |
return this.b; | |
} | |
} | |
ZPEncoder.prototype.p = ZPDecoder.prototype.p = Uint16Array.of( | |
0x8000, 0x8000, 0x8000, 0x6bbd, 0x6bbd, 0x5d45, 0x5d45, 0x51b9, 0x51b9, 0x4813, | |
0x4813, 0x3fd5, 0x3fd5, 0x38b1, 0x38b1, 0x3275, 0x3275, 0x2cfd, 0x2cfd, 0x2825, | |
0x2825, 0x23ab, 0x23ab, 0x1f87, 0x1f87, 0x1bbb, 0x1bbb, 0x1845, 0x1845, 0x1523, | |
0x1523, 0x1253, 0x1253, 0xfcf, 0xfcf, 0xd95, 0xd95, 0xb9d, 0xb9d, 0x9e3, | |
0x9e3, 0x861, 0x861, 0x711, 0x711, 0x5f1, 0x5f1, 0x4f9, 0x4f9, 0x425, | |
0x425, 0x371, 0x371, 0x2d9, 0x2d9, 0x259, 0x259, 0x1ed, 0x1ed, 0x193, | |
0x193, 0x149, 0x149, 0x10b, 0x10b, 0xd5, 0xd5, 0xa5, 0xa5, 0x7b, | |
0x7b, 0x57, 0x57, 0x3b, 0x3b, 0x23, 0x23, 0x13, 0x13, 0x7, | |
0x7, 0x1, 0x1, 0x5695, 0x24ee, 0x8000, 0xd30, 0x481a, 0x481, 0x3579, | |
0x17a, 0x24ef, 0x7b, 0x1978, 0x28, 0x10ca, 0xd, 0xb5d, 0x34, 0x78a, | |
0xa0, 0x50f, 0x117, 0x358, 0x1ea, 0x234, 0x144, 0x173, 0x234, 0xf5, | |
0x353, 0xa1, 0x5c5, 0x11a, 0x3cf, 0x1aa, 0x285, 0x286, 0x1ab, 0x3d3, | |
0x11a, 0x5c5, 0xba, 0x8ad, 0x7a, 0xccc, 0x1eb, 0x1302, 0x2e6, 0x1b81, | |
0x45e, 0x24ef, 0x690, 0x2865, 0x9de, 0x3987, 0xdc8, 0x2c99, 0x10ca, 0x3b5f, | |
0xb5d, 0x5695, 0x78a, 0x8000, 0x50f, 0x24ee, 0x358, 0xd30, 0x234, 0x481, | |
0x173, 0x17a, 0xf5, 0x7b, 0xa1, 0x28, 0x11a, 0xd, 0x1aa, 0x34, | |
0x286, 0xa0, 0x3d3, 0x117, 0x5c5, 0x1ea, 0x8ad, 0x144, 0xccc, 0x234, | |
0x1302, 0x353, 0x1b81, 0x5c5, 0x24ef, 0x3cf, 0x2b74, 0x285, 0x201d, 0x1ab, | |
0x1715, 0x11a, 0xfb7, 0xba, 0xa67, 0x1eb, 0x6e7, 0x2e6, 0x496, 0x45e, | |
0x30d, 0x690, 0x206, 0x9de, 0x155, 0xdc8, 0xe1, 0x2b74, 0x94, 0x201d, | |
0x188, 0x1715, 0x252, 0xfb7, 0x383, 0xa67, 0x547, 0x6e7, 0x7e2, 0x496, | |
0xbc0, 0x30d, 0x1178, 0x206, 0x19da, 0x155, 0x24ef, 0xe1, 0x320e, 0x94, | |
0x432a, 0x188, 0x447d, 0x252, 0x5ece, 0x383, 0x8000, 0x547, 0x481a, 0x7e2, | |
0x3579, 0xbc0, 0x24ef, 0x1178, 0x1978, 0x19da, 0x2865, 0x24ef, 0x3987, 0x320e, | |
0x2c99, 0x432a, 0x3b5f, 0x447d, 0x5695, 0x5ece, 0x8000, 0x8000, 0x5695, 0x481a, 0x481a | |
); | |
ZPEncoder.prototype.m = ZPDecoder.prototype.m = Uint16Array.of( | |
0x0, 0x0, 0x0, 0x10a5, 0x10a5, 0x1f28, 0x1f28, 0x2bd3, 0x2bd3, 0x36e3, | |
0x36e3, 0x408c, 0x408c, 0x48fd, 0x48fd, 0x505d, 0x505d, 0x56d0, 0x56d0, 0x5c71, | |
0x5c71, 0x615b, 0x615b, 0x65a5, 0x65a5, 0x6962, 0x6962, 0x6ca2, 0x6ca2, 0x6f74, | |
0x6f74, 0x71e6, 0x71e6, 0x7404, 0x7404, 0x75d6, 0x75d6, 0x7768, 0x7768, 0x78c2, | |
0x78c2, 0x79ea, 0x79ea, 0x7ae7, 0x7ae7, 0x7bbe, 0x7bbe, 0x7c75, 0x7c75, 0x7d0f, | |
0x7d0f, 0x7d91, 0x7d91, 0x7dfe, 0x7dfe, 0x7e5a, 0x7e5a, 0x7ea6, 0x7ea6, 0x7ee6, | |
0x7ee6, 0x7f1a, 0x7f1a, 0x7f45, 0x7f45, 0x7f6b, 0x7f6b, 0x7f8d, 0x7f8d, 0x7faa, | |
0x7faa, 0x7fc3, 0x7fc3, 0x7fd7, 0x7fd7, 0x7fe7, 0x7fe7, 0x7ff2, 0x7ff2, 0x7ffa, | |
0x7ffa, 0x7fff, 0x7fff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, | |
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 | |
); | |
ZPEncoder.prototype.up = ZPDecoder.prototype.up = Uint8Array.of( | |
84, 3, 4, 5, 6, 7, 8, 9, 10, 11, | |
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, | |
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, | |
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, | |
62, 63, 64, 65, 66, 67, 68, 69, 70, 71, | |
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, | |
82, 81, 82, 9, 86, 5, 88, 89, 90, 91, | |
92, 93, 94, 95, 96, 97, 82, 99, 76, 101, | |
70, 103, 66, 105, 106, 107, 66, 109, 60, 111, | |
56, 69, 114, 65, 116, 61, 118, 57, 120, 53, | |
122, 49, 124, 43, 72, 39, 60, 33, 56, 29, | |
52, 23, 48, 23, 42, 137, 38, 21, 140, 15, | |
142, 9, 144, 141, 146, 147, 148, 149, 150, 151, | |
152, 153, 154, 155, 70, 157, 66, 81, 62, 75, | |
58, 69, 54, 65, 50, 167, 44, 65, 40, 59, | |
34, 55, 30, 175, 24, 177, 178, 179, 180, 181, | |
182, 183, 184, 69, 186, 59, 188, 55, 190, 51, | |
192, 47, 194, 41, 196, 37, 198, 199, 72, 201, | |
62, 203, 58, 205, 54, 207, 50, 209, 46, 211, | |
40, 213, 36, 215, 30, 217, 26, 219, 20, 71, | |
14, 61, 14, 57, 8, 53, 228, 49, 230, 45, | |
232, 39, 234, 35, 138, 29, 24, 25, 240, 19, | |
22, 13, 16, 13, 10, 7, 244, 249, 10, 89, 230 | |
); | |
ZPEncoder.prototype.dn = ZPDecoder.prototype.dn = Uint8Array.of( | |
145, 4, 3, 1, 2, 3, 4, 5, 6, 7, | |
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, | |
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, | |
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, | |
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, | |
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, | |
58, 59, 60, 61, 62, 63, 64, 65, 66, 67, | |
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, | |
78, 79, 80, 85, 226, 6, 176, 143, 138, 141, | |
112, 135, 104, 133, 100, 129, 98, 127, 72, 125, | |
102, 123, 60, 121, 110, 119, 108, 117, 54, 115, | |
48, 113, 134, 59, 132, 55, 130, 51, 128, 47, | |
126, 41, 62, 37, 66, 31, 54, 25, 50, 131, | |
46, 17, 40, 15, 136, 7, 32, 139, 172, 9, | |
170, 85, 168, 248, 166, 247, 164, 197, 162, 95, | |
160, 173, 158, 165, 156, 161, 60, 159, 56, 71, | |
52, 163, 48, 59, 42, 171, 38, 169, 32, 53, | |
26, 47, 174, 193, 18, 191, 222, 189, 218, 187, | |
216, 185, 214, 61, 212, 53, 210, 49, 208, 45, | |
206, 39, 204, 195, 202, 31, 200, 243, 64, 239, | |
56, 237, 52, 235, 48, 233, 44, 231, 38, 229, | |
34, 227, 28, 225, 22, 223, 16, 221, 220, 63, | |
8, 55, 224, 51, 2, 47, 87, 43, 246, 37, | |
244, 33, 238, 27, 236, 21, 16, 15, 8, 241, | |
242, 7, 10, 245, 2, 1, 83, 250, 2, 143, 246 | |
); | |
class Bitmap { | |
constructor(width, height) { | |
var length = Math.ceil(width * height / 8); | |
this.height = height; | |
this.width = width; | |
this.innerArray = new Uint8Array(length); | |
} | |
getBits(i, j, bitNumber) { | |
if (!this.hasRow(i) || j >= this.width) { | |
return 0; | |
} | |
if (j < 0) { | |
bitNumber += j; | |
j = 0; | |
} | |
var tmp = i * this.width + j; | |
var index = tmp >> 3; | |
var bitIndex = tmp & 7; | |
var mask = 32768 >>> bitIndex; | |
var twoBytes = ((this.innerArray[index] << 8) | (this.innerArray[index + 1] || 0)); | |
var existingBits = this.width - j; | |
var border = bitNumber < existingBits ? bitNumber : existingBits; | |
for (var k = 1; k < border; k++) { | |
mask |= 32768 >>> (bitIndex + k); | |
} | |
return (twoBytes & mask) >>> (16 - bitIndex - bitNumber); | |
} | |
get(i, j) { | |
if (!this.hasRow(i) || j < 0 || j >= this.width) { | |
return 0; | |
} | |
var tmp = i * this.width + j; | |
var index = tmp >> 3; | |
var bitIndex = tmp & 7; | |
var mask = 128 >> bitIndex; | |
return (this.innerArray[index] & mask) ? 1 : 0; | |
} | |
set(i, j) { | |
var tmp = i * this.width + j; | |
var index = tmp >> 3; | |
var bitIndex = tmp & 7; | |
var mask = 128 >> bitIndex; | |
this.innerArray[index] |= mask; | |
return; | |
} | |
hasRow(r) { | |
return r >= 0 && r < this.height; | |
} | |
removeEmptyEdges() { | |
var bottomShift = 0; | |
var topShift = 0; | |
var leftShift = 0; | |
var rightShift = 0; | |
main_cycle: for (var i = 0; i < this.height; i++) { | |
for (var j = 0; j < this.width; j++) { | |
if (this.get(i, j)) { | |
break main_cycle; | |
} | |
} | |
bottomShift++; | |
} | |
main_cycle: for (var i = this.height - 1; i >= 0; i--) { | |
for (var j = 0; j < this.width; j++) { | |
if (this.get(i, j)) { | |
break main_cycle; | |
} | |
} | |
topShift++; | |
} | |
main_cycle: for (var j = 0; j < this.width; j++) { | |
for (var i = 0; i < this.height; i++) { | |
if (this.get(i, j)) { | |
break main_cycle; | |
} | |
} | |
leftShift++; | |
} | |
main_cycle: for (var j = this.width - 1; j >= 0; j--) { | |
for (var i = 0; i < this.height; i++) { | |
if (this.get(i, j)) { | |
break main_cycle; | |
} | |
} | |
rightShift++; | |
} | |
if (topShift || bottomShift || leftShift || rightShift) { | |
var newWidth = this.width - leftShift - rightShift; | |
var newHeight = this.height - topShift - bottomShift; | |
var newBitMap = new Bitmap(newWidth, newHeight); | |
for (var i = bottomShift, p = 0; p < newHeight; p++ , i++) { | |
for (var j = leftShift, q = 0; q < newWidth; q++ , j++) { | |
if (this.get(i, j)) { | |
newBitMap.set(p, q); | |
} | |
} | |
} | |
return newBitMap; | |
} | |
return this; | |
} | |
} | |
class NumContext { | |
constructor() { | |
this.ctx = [0]; | |
this._left = null; | |
this._right = null; | |
} | |
get left() { | |
if (!this._left) { | |
this._left = new NumContext(); | |
} | |
return this._left; | |
} | |
get right() { | |
if (!this._right) { | |
this._right = new NumContext(); | |
} | |
return this._right; | |
} | |
} | |
class Baseline { | |
constructor() { | |
this.arr = new Array(3); | |
this.fill(0); | |
this.index = -1; | |
} | |
add(val) { | |
if (++this.index === 3) { | |
this.index = 0; | |
} | |
this.arr[this.index] = val; | |
} | |
getVal() { | |
if (this.arr[0] >= this.arr[1] && this.arr[0] <= this.arr[2] | |
|| this.arr[0] <= this.arr[1] && this.arr[0] >= this.arr[2]) { | |
return this.arr[0]; | |
} | |
else if (this.arr[1] >= this.arr[0] && this.arr[1] <= this.arr[2] | |
|| this.arr[1] <= this.arr[0] && this.arr[1] >= this.arr[2]) { | |
return this.arr[1]; | |
} else { | |
return this.arr[2]; | |
} | |
} | |
fill(val) { | |
this.arr[0] = this.arr[1] = this.arr[2] = val; | |
} | |
} | |
class DjVuError { | |
constructor(code, message, additionalData = null) { | |
this.code = code; | |
this.message = message; | |
if (additionalData) this.additionalData = additionalData; | |
} | |
} | |
class IncorrectFileFormatDjVuError extends DjVuError { | |
constructor() { | |
super(DjVuErrorCodes.INCORRECT_FILE_FORMAT, "The provided file is not a .djvu file!"); | |
} | |
} | |
class NoSuchPageDjVuError extends DjVuError { | |
constructor(pageNumber) { | |
super(DjVuErrorCodes.NO_SUCH_PAGE, "There is no page with the number " + pageNumber + " !"); | |
this.pageNumber = pageNumber; | |
} | |
} | |
class CorruptedFileDjVuError extends DjVuError { | |
constructor(message = "", data = null) { | |
super(DjVuErrorCodes.FILE_IS_CORRUPTED, "The file is corrupted! " + message, data); | |
} | |
} | |
class UnableToTransferDataDjVuError extends DjVuError { | |
constructor(tasks) { | |
super(DjVuErrorCodes.DATA_CANNOT_BE_TRANSFERRED, | |
"The data cannot be transferred from the worker to the main page! " + | |
"Perhaps, you requested a complex object like DjVuPage, but only simple objects can be transferred between workers." | |
); | |
this.tasks = tasks; | |
} | |
} | |
class IncorrectTaskDjVuError extends DjVuError { | |
constructor(task) { | |
super(DjVuErrorCodes.INCORRECT_TASK, "The task contains an incorrect sequence of functions!"); | |
this.task = task; | |
} | |
} | |
class NoBaseUrlDjVuError extends DjVuError { | |
constructor() { | |
super(DjVuErrorCodes.NO_BASE_URL, | |
"The base URL is required for the indirect djvu to load components," + | |
" but no base URL was provided to the document constructor!" | |
); | |
} | |
} | |
function getErrorMessageByData(data) { | |
var message = ''; | |
if (data.pageNumber) { | |
if (data.dependencyId) { | |
message = `A dependency ${data.dependencyId} for the page number ${data.pageNumber} can't be loaded!\n`; | |
} else { | |
message = `The page number ${data.pageNumber} can't be loaded!`; | |
} | |
} else if (data.dependencyId) { | |
message = `A dependency ${data.dependencyId} can't be loaded!\n`; | |
} | |
return message; | |
} | |
class UnsuccessfulRequestDjVuError extends DjVuError { | |
constructor(xhr, data = { pageNumber: null, dependencyId: null }) { | |
var message = getErrorMessageByData(data); | |
super(DjVuErrorCodes.UNSUCCESSFUL_REQUEST, | |
message + '\n' + | |
`The request to ${xhr.responseURL} wasn't successful.\n` + | |
`The response status is ${xhr.status}.\n` + | |
`The response status text is: "${xhr.statusText}".` | |
); | |
this.status = xhr.status; | |
this.statusText = xhr.statusText; | |
this.url = xhr.responseURL; | |
if (data.pageNumber) { | |
this.pageNumber = data.pageNumber; | |
} | |
if (data.dependencyId) { | |
this.dependencyId = data.dependencyId; | |
} | |
} | |
} | |
class NetworkDjVuError extends DjVuError { | |
constructor(data = { pageNumber: null, dependencyId: null, url: null }) { | |
super(DjVuErrorCodes.NETWORK_ERROR, | |
getErrorMessageByData(data) + '\n' + | |
"A network error occurred! Check your network connection!" | |
); | |
if (data.pageNumber) { | |
this.pageNumber = data.pageNumber; | |
} | |
if (data.dependencyId) { | |
this.dependencyId = data.dependencyId; | |
} | |
if (data.url) { | |
this.url = data.url; | |
} | |
} | |
} | |
const DjVuErrorCodes = Object.freeze({ | |
FILE_IS_CORRUPTED: 'FILE_IS_CORRUPTED', | |
INCORRECT_FILE_FORMAT: 'INCORRECT_FILE_FORMAT', | |
NO_SUCH_PAGE: 'NO_SUCH_PAGE', | |
UNEXPECTED_ERROR: 'UNEXPECTED_ERROR', | |
DATA_CANNOT_BE_TRANSFERRED: 'DATA_CANNOT_BE_TRANSFERRED', | |
INCORRECT_TASK: 'INCORRECT_TASK', | |
NO_BASE_URL: 'NO_BASE_URL', | |
NETWORK_ERROR: 'NETWORK_ERROR', | |
UNSUCCESSFUL_REQUEST: 'UNSUCCESSFUL_REQUEST', | |
}); | |
class IFFChunk { | |
constructor(bs) { | |
this.id = bs.readStr4(); | |
this.length = bs.getInt32(); | |
this.bs = bs; | |
} | |
toString() { | |
return this.id + " " + this.length + '\n'; | |
} | |
} | |
class CompositeChunk extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.id += ':' + bs.readStr4(); | |
} | |
toString(innerString = '') { | |
return super.toString() + ' ' + innerString.replace(/\n/g, '\n ') + '\n'; | |
} | |
} | |
class ColorChunk extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.header = new ColorChunkDataHeader(bs); | |
} | |
toString() { | |
return this.id + " " + this.length + this.header.toString(); | |
} | |
} | |
class INFOChunk extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
if (this.length < 5) { | |
throw new CorruptedFileDjVuError("The INFO chunk is shorter than 5 bytes!") | |
} | |
this.width = bs.getInt16(); | |
this.height = bs.getInt16(); | |
this.minver = bs.getInt8(); | |
this.majver = this.length > 5 ? bs.getInt8() : 0; | |
if (this.length > 7) { | |
this.dpi = bs.getUint8(); | |
this.dpi |= bs.getUint8() << 8; | |
} else { | |
this.dpi = 300; | |
} | |
this.gamma = this.length > 8 ? bs.getInt8() : 22; | |
this.flags = this.length > 9 ? bs.getInt8() : 0; | |
if (this.dpi < 25 || this.dpi > 6000) { | |
this.dpi = 300; | |
} | |
if (this.gamma < 3) { | |
this.gamma = 3; | |
} | |
if (this.gamma > 50) { | |
this.gamma = 50; | |
} | |
} | |
toString() { | |
var str = super.toString(); | |
str += "{" + 'width:' + this.width + ', ' | |
+ 'height:' + this.height + ', ' | |
+ 'minver:' + this.minver + ', ' | |
+ 'majver:' + this.majver + ', ' | |
+ 'dpi:' + this.dpi + ', ' | |
+ 'gamma:' + this.gamma + ', ' | |
+ 'flags:' + this.flags + '}\n'; | |
return str; | |
} | |
} | |
class ColorChunkDataHeader { | |
constructor(bs) { | |
this.serial = bs.getUint8(); | |
this.slices = bs.getUint8(); | |
if (!this.serial) { | |
this.majver = bs.getUint8(); | |
this.grayscale = this.majver >> 7; | |
this.minver = bs.getUint8(); | |
this.width = bs.getUint16(); | |
this.height = bs.getUint16(); | |
var byte = bs.getUint8(); | |
this.delayInit = byte & 127; | |
if (!byte & 128) { | |
console.warn('Old image reconstruction should be applied!'); | |
} | |
} | |
} | |
toString() { | |
return '\n' + JSON.stringify(this) + "\n"; | |
} | |
} | |
class INCLChunk extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.ref = this.bs.readStrUTF(); | |
} | |
toString() { | |
var str = super.toString(); | |
str += "{Reference: " + this.ref + '}\n'; | |
return str; | |
} | |
} | |
class CIDaChunk extends INCLChunk { } | |
class ErrorChunk { | |
constructor(id, e) { | |
this.id = id; | |
this.e = e; | |
} | |
toString() { | |
return `Error creating ${this.id}: ${this.e.toString()}\n`; | |
} | |
} | |
class JB2Codec extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.zp = new ZPDecoder(this.bs); | |
this.directBitmapCtx = new Uint8Array(1024); | |
this.refinementBitmapCtx = new Uint8Array(2048); | |
this.offsetTypeCtx = [0]; | |
this.resetNumContexts(); | |
} | |
resetNumContexts() { | |
this.recordTypeCtx = new NumContext(); | |
this.imageSizeCtx = new NumContext(); | |
this.symbolWidthCtx = new NumContext(); | |
this.symbolHeightCtx = new NumContext(); | |
this.inheritDictSizeCtx = new NumContext(); | |
this.hoffCtx = new NumContext(); | |
this.voffCtx = new NumContext(); | |
this.shoffCtx = new NumContext(); | |
this.svoffCtx = new NumContext(); | |
this.symbolIndexCtx = new NumContext(); | |
this.symbolHeightDiffCtx = new NumContext(); | |
this.symbolWidthDiffCtx = new NumContext(); | |
this.commentLengthCtx = new NumContext(); | |
this.commentOctetCtx = new NumContext(); | |
this.horizontalAbsLocationCtx = new NumContext(); | |
this.verticalAbsLocationCtx = new NumContext(); | |
} | |
decodeNum(low, high, numctx) { | |
var negative = false; | |
var cutoff; | |
cutoff = 0; | |
for (var phase = 1, range = 0xffffffff; range != 1;) { | |
var decision = (low >= cutoff) || ((high >= cutoff) && this.zp.decode(numctx.ctx, 0)); | |
numctx = decision ? numctx.right : numctx.left; | |
switch (phase) { | |
case 1: | |
negative = !decision; | |
if (negative) { | |
var temp = - low - 1; | |
low = - high - 1; | |
high = temp; | |
} | |
phase = 2; cutoff = 1; | |
break; | |
case 2: | |
if (!decision) { | |
phase = 3; | |
range = (cutoff + 1) / 2; | |
if (range == 1) | |
cutoff = 0; | |
else | |
cutoff -= range / 2; | |
} | |
else { | |
cutoff += cutoff + 1; | |
} | |
break; | |
case 3: | |
range /= 2; | |
if (range != 1) { | |
if (!decision) | |
cutoff -= range / 2; | |
else | |
cutoff += range / 2; | |
} | |
else if (!decision) { | |
cutoff--; | |
} | |
break; | |
} | |
} | |
return (negative) ? (- cutoff - 1) : cutoff; | |
} | |
decodeBitmap(width, height) { | |
var bitmap = new Bitmap(width, height); | |
for (var i = height - 1; i >= 0; i--) { | |
for (var j = 0; j < width; j++) { | |
var ind = this.getCtxIndex(bitmap, i, j); | |
if (this.zp.decode(this.directBitmapCtx, ind)) { bitmap.set(i, j); } } | |
} | |
return bitmap; | |
} | |
getCtxIndex(bm, i, j) { | |
var index = 0; | |
var r = i + 2; | |
if (bm.hasRow(r)) { | |
index = (bm.getBits(r, j - 1, 3)) << 7; | |
} | |
r--; | |
if (bm.hasRow(r)) { | |
index |= bm.getBits(r, j - 2, 5) << 2; | |
} | |
index |= bm.getBits(i, j - 2, 2); | |
return index; | |
} | |
decodeBitmapRef(width, height, mbm) { | |
var cbm = new Bitmap(width, height); | |
var alignInfo = this.alignBitmaps(cbm, mbm); | |
for (var i = height - 1; i >= 0; i--) { | |
for (var j = 0; j < width; j++) { | |
this.zp.decode(this.refinementBitmapCtx, | |
this.getCtxIndexRef(cbm, mbm, alignInfo, i, j)) ? cbm.set(i, j) : 0; | |
} | |
} | |
return cbm; | |
} | |
getCtxIndexRef(cbm, mbm, alignInfo, i, j) { | |
var index = 0; | |
var r = i + 1; | |
if (cbm.hasRow(r)) { | |
index = cbm.getBits(r, j - 1, 3) << 8; | |
} | |
index |= cbm.get(i, j - 1) << 7; | |
r = i + alignInfo.rowshift + 1; | |
var c = j + alignInfo.colshift; | |
index |= mbm.hasRow(r) ? mbm.get(r, c) << 6 : 0; | |
r--; | |
if (mbm.hasRow(r)) { | |
index |= mbm.getBits(r, c - 1, 3) << 3; | |
} | |
r--; | |
if (mbm.hasRow(r)) { | |
index |= mbm.getBits(r, c - 1, 3); | |
} | |
return index; | |
} | |
alignBitmaps(cbm, mbm) { | |
var cwidth = cbm.width - 1; | |
var cheight = cbm.height - 1; | |
var crow, ccol, mrow, mcol; | |
crow = cheight >> 1; | |
ccol = cwidth >> 1; | |
mrow = (mbm.height - 1) >> 1; | |
mcol = (mbm.width - 1) >> 1; | |
return { | |
'rowshift': mrow - crow, | |
'colshift': mcol - ccol | |
}; | |
} | |
decodeComment() { | |
var length = this.decodeNum(0, 262142, this.commentLengthCtx); | |
var comment = new Uint8Array(length); | |
for (var i = 0; i < length; comment[i++] = this.decodeNum(0, 255, this.commentOctetCtx)) { } | |
return comment; | |
} | |
drawBitmap(bm) { | |
var image = document.createElement('canvas') | |
.getContext('2d') | |
.createImageData(bm.width, bm.height); | |
for (var i = 0; i < bm.height; i++) { | |
for (var j = 0; j < bm.width; j++) { | |
var v = bm.get(i, j) ? 0 : 255; | |
var index = ((bm.height - i - 1) * bm.width + j) * 4; | |
image.data[index] = v; | |
image.data[index + 1] = v; | |
image.data[index + 2] = v; | |
image.data[index + 3] = 255; | |
} | |
} | |
Globals.drawImage(image); | |
} | |
} | |
class JB2Dict extends JB2Codec { | |
constructor(bs) { | |
super(bs); | |
this.dict = []; | |
this.isDecoded = false; | |
} | |
decode(djbz) { | |
if (this.isDecoded) { | |
return; | |
} | |
var type = this.decodeNum(0, 11, this.recordTypeCtx); | |
if (type == 9) { | |
var size = this.decodeNum(0, 262142, this.inheritDictSizeCtx); | |
djbz.decode(); | |
this.dict = djbz.dict.slice(0, size); | |
type = this.decodeNum(0, 11, this.recordTypeCtx); | |
} | |
this.decodeNum(0, 262142, this.imageSizeCtx); | |
this.decodeNum(0, 262142, this.imageSizeCtx); | |
var flag = this.zp.decode([0], 0); | |
if (flag) { | |
throw new Error("Bad flag!!!"); | |
} | |
type = this.decodeNum(0, 11, this.recordTypeCtx); | |
var width, widthdiff, heightdiff, symbolIndex; | |
var height; | |
var bm; | |
while (type !== 11) { | |
switch (type) { | |
case 2: | |
width = this.decodeNum(0, 262142, this.symbolWidthCtx); | |
height = this.decodeNum(0, 262142, this.symbolHeightCtx); | |
bm = this.decodeBitmap(width, height); | |
this.dict.push(bm); | |
break; | |
case 5: | |
symbolIndex = this.decodeNum(0, this.dict.length - 1, this.symbolIndexCtx); | |
widthdiff = this.decodeNum(-262143, 262142, this.symbolWidthDiffCtx); | |
heightdiff = this.decodeNum(-262143, 262142, this.symbolHeightDiffCtx); | |
var mbm = this.dict[symbolIndex]; | |
var cbm = this.decodeBitmapRef(mbm.width + widthdiff, heightdiff + mbm.height, mbm); | |
this.dict.push(cbm.removeEmptyEdges()); | |
break; | |
case 9: | |
console.log("RESET DICT"); | |
this.resetNumContexts(); | |
break; | |
case 10: | |
this.decodeComment(); | |
break; | |
default: | |
throw new Error("Unsupported type in JB2Dict: " + type); | |
} | |
type = this.decodeNum(0, 11, this.recordTypeCtx); | |
if (type > 11) { | |
console.error("TYPE ERROR " + type); | |
break; | |
} | |
} | |
this.isDecoded = true; | |
} | |
} | |
class DjVuAnno extends IFFChunk { } | |
class DjViChunk extends CompositeChunk { | |
constructor(bs) { | |
super(bs); | |
this.innerChunk = null; | |
this.init(); | |
} | |
init() { | |
while (!this.bs.isEmpty()) { | |
var id = this.bs.readStr4(); | |
var length = this.bs.getInt32(); | |
this.bs.jump(-8); | |
var chunkBs = this.bs.fork(length + 8); | |
this.bs.jump(8 + length + (length & 1 ? 1 : 0)); | |
switch (id) { | |
case 'Djbz': | |
this.innerChunk = new JB2Dict(chunkBs); | |
break; | |
case 'ANTa': | |
case 'ANTz': | |
this.innerChunk = new DjVuAnno(chunkBs); | |
break; | |
default: | |
this.innerChunk = new IFFChunk(chunkBs); | |
console.error("Unsupported chunk inside the DJVI chunk: ", id); | |
break; | |
} | |
} | |
} | |
toString() { | |
return super.toString(this.innerChunk.toString()); | |
} | |
} | |
class JB2Image extends JB2Codec { | |
constructor(bs) { | |
super(bs); | |
this.dict = []; | |
this.initialDictLength = 0; | |
this.blitList = []; | |
this.init(); | |
} | |
addBlit(bitmap, x, y) { | |
this.blitList.push({ bitmap, x, y }); | |
} | |
init() { | |
var type = this.decodeNum(0, 11, this.recordTypeCtx); | |
if (type == 9) { | |
this.initialDictLength = this.decodeNum(0, 262142, this.inheritDictSizeCtx); | |
type = this.decodeNum(0, 11, this.recordTypeCtx); | |
} | |
this.width = this.decodeNum(0, 262142, this.imageSizeCtx) || 200; | |
this.height = this.decodeNum(0, 262142, this.imageSizeCtx) || 200; | |
this.bitmap = false; | |
this.lastLeft = 0; | |
this.lastBottom = this.height - 1; | |
this.firstLeft = -1; | |
this.firstBottom = this.height - 1; | |
var flag = this.zp.decode([0], 0); | |
if (flag) { | |
throw new Error("Bad flag!!!"); | |
} | |
this.baseline = new Baseline(); | |
} | |
toString() { | |
var str = super.toString(); | |
str += "{width: " + this.width + ", height: " + this.height + '}\n'; | |
return str; | |
} | |
decode(djbz) { | |
if (this.initialDictLength) { | |
djbz.decode(); | |
this.dict = djbz.dict.slice(0, this.initialDictLength); | |
} | |
var type = this.decodeNum(0, 11, this.recordTypeCtx); | |
var width; | |
var height, index; | |
var bm; | |
while (type !== 11 ) { | |
switch (type) { | |
case 1: | |
width = this.decodeNum(0, 262142, this.symbolWidthCtx); | |
height = this.decodeNum(0, 262142, this.symbolHeightCtx); | |
bm = this.decodeBitmap(width, height); | |
var coords = this.decodeSymbolCoords(bm.width, bm.height); | |
this.addBlit(bm, coords.x, coords.y); | |
this.dict.push(bm.removeEmptyEdges()); | |
break; | |
case 2: | |
width = this.decodeNum(0, 262142, this.symbolWidthCtx); | |
height = this.decodeNum(0, 262142, this.symbolHeightCtx); | |
bm = this.decodeBitmap(width, height); | |
this.dict.push(bm.removeEmptyEdges()); | |
break; | |
case 3: | |
width = this.decodeNum(0, 262142, this.symbolWidthCtx); | |
height = this.decodeNum(0, 262142, this.symbolHeightCtx); | |
bm = this.decodeBitmap(width, height); | |
var coords = this.decodeSymbolCoords(bm.width, bm.height); | |
this.addBlit(bm, coords.x, coords.y); | |
break; | |
case 4: | |
index = this.decodeNum(0, this.dict.length - 1, this.symbolIndexCtx); | |
var widthdiff = this.decodeNum(-262143, 262142, this.symbolWidthDiffCtx); | |
var heightdiff = this.decodeNum(-262143, 262142, this.symbolHeightDiffCtx); | |
var mbm = this.dict[index]; | |
var cbm = this.decodeBitmapRef(mbm.width + widthdiff, heightdiff + mbm.height, mbm); | |
var coords = this.decodeSymbolCoords(cbm.width, cbm.height); | |
this.addBlit(cbm, coords.x, coords.y); | |
this.dict.push(cbm.removeEmptyEdges()); | |
break; | |
case 5: | |
index = this.decodeNum(0, this.dict.length - 1, this.symbolIndexCtx); | |
widthdiff = this.decodeNum(-262143, 262142, this.symbolWidthDiffCtx); | |
heightdiff = this.decodeNum(-262143, 262142, this.symbolHeightDiffCtx); | |
var mbm = this.dict[index]; | |
var cbm = this.decodeBitmapRef(mbm.width + widthdiff, heightdiff + mbm.height, mbm); | |
this.dict.push(cbm.removeEmptyEdges()); | |
break; | |
case 6: | |
index = this.decodeNum(0, this.dict.length - 1, this.symbolIndexCtx); | |
var widthdiff = this.decodeNum(-262143, 262142, this.symbolWidthDiffCtx); | |
var heightdiff = this.decodeNum(-262143, 262142, this.symbolHeightDiffCtx); | |
var mbm = this.dict[index]; | |
var cbm = this.decodeBitmapRef(mbm.width + widthdiff, heightdiff + mbm.height, mbm); | |
var coords = this.decodeSymbolCoords(cbm.width, cbm.height); | |
this.addBlit(cbm, coords.x, coords.y); | |
break; | |
case 7: | |
index = this.decodeNum(0, this.dict.length - 1, this.symbolIndexCtx); | |
bm = this.dict[index]; | |
var coords = this.decodeSymbolCoords(bm.width, bm.height); | |
this.addBlit(bm, coords.x, coords.y); | |
break; | |
case 8: | |
width = this.decodeNum(0, 262142, this.symbolWidthCtx); | |
height = this.decodeNum(0, 262142, this.symbolHeightCtx); | |
bm = this.decodeBitmap(width, height); | |
var coords = this.decodeAbsoluteLocationCoords(bm.width, bm.height); | |
this.addBlit(bm, coords.x, coords.y); | |
break; | |
case 9: | |
console.log("RESET NUM CONTEXTS"); | |
this.resetNumContexts(); | |
break; | |
case 10: | |
this.decodeComment(); | |
break; | |
default: | |
throw new Error("Unsupported type in JB2Image: " + type); | |
} | |
type = this.decodeNum(0, 11, this.recordTypeCtx); | |
if (type > 11) { | |
console.error("TYPE ERROR " + type); | |
break; | |
} | |
} | |
} | |
decodeAbsoluteLocationCoords(width, height) { | |
var left = this.decodeNum(1, this.width, this.horizontalAbsLocationCtx); | |
var top = this.decodeNum(1, this.height, this.verticalAbsLocationCtx); | |
return { | |
x: left, | |
y: top - height | |
} | |
} | |
decodeSymbolCoords(width, height) { | |
var flag = this.zp.decode(this.offsetTypeCtx, 0); | |
var horizontalOffsetCtx = flag ? this.hoffCtx : this.shoffCtx; | |
var verticalOffsetCtx = flag ? this.voffCtx : this.svoffCtx; | |
var horizontalOffset = this.decodeNum(-262143, 262142, horizontalOffsetCtx); | |
var verticalOffset = this.decodeNum(-262143, 262142, verticalOffsetCtx); | |
var x, y; | |
if (flag) { | |
x = this.firstLeft + horizontalOffset; | |
y = this.firstBottom + verticalOffset - height + 1; | |
this.firstLeft = x; | |
this.firstBottom = y; | |
this.baseline.fill(y); | |
} | |
else { | |
x = this.lastRight + horizontalOffset; | |
y = this.baseline.getVal() + verticalOffset; | |
} | |
this.baseline.add(y); | |
this.lastRight = x + width - 1; | |
return { | |
'x': x, | |
'y': y | |
}; | |
} | |
copyToBitmap(bm, x, y) { | |
if (!this.bitmap) { | |
this.bitmap = new Bitmap(this.width, this.height); | |
} | |
for (var i = y, k = 0; k < bm.height; k++ , i++) { | |
for (var j = x, t = 0; t < bm.width; t++ , j++) { | |
if (bm.get(k, t)) { | |
this.bitmap.set(i, j); | |
} | |
} | |
} | |
} | |
getBitmap() { | |
if (!this.bitmap) { | |
this.blitList.forEach(blit => this.copyToBitmap(blit.bitmap, blit.x, blit.y)); | |
} | |
return this.bitmap; | |
} | |
getMaskImage() { | |
var imageData = new ImageData(this.width, this.height); | |
var pixelArray = imageData.data; | |
var time = performance.now(); | |
pixelArray.fill(255); | |
for (var blitIndex = 0; blitIndex < this.blitList.length; blitIndex++) { | |
var blit = this.blitList[blitIndex]; | |
var bm = blit.bitmap; | |
for (var i = blit.y, k = 0; k < bm.height; k++ , i++) { | |
for (var j = blit.x, t = 0; t < bm.width; t++ , j++) { | |
if (bm.get(k, t)) { | |
var pixelIndex = ((this.height - i - 1) * this.width + j) * 4; | |
pixelArray[pixelIndex] = 0; | |
} | |
} | |
} | |
} | |
DjVu.IS_DEBUG && console.log("JB2Image mask image creating time = ", performance.now() - time); | |
return imageData; | |
} | |
getImage(palette = null, isMarkMaskPixels = false) { | |
if (palette && palette.getDataSize() !== this.blitList.length) { | |
palette = null; | |
} | |
var pixelArray = new Uint8ClampedArray(this.width * this.height * 4); | |
var time = performance.now(); | |
pixelArray.fill(255); | |
var blackPixel = { r: 0, g: 0, b: 0 }; | |
var alpha = isMarkMaskPixels ? 0 : 255; | |
for (var blitIndex = 0; blitIndex < this.blitList.length; blitIndex++) { | |
var blit = this.blitList[blitIndex]; | |
var pixel = palette ? palette.getPixelByBlitIndex(blitIndex) : blackPixel; | |
var bm = blit.bitmap; | |
for (var i = blit.y, k = 0; k < bm.height; k++ , i++) { | |
for (var j = blit.x, t = 0; t < bm.width; t++ , j++) { | |
if (bm.get(k, t)) { | |
var pixelIndex = ((this.height - i - 1) * this.width + j) << 2; | |
pixelArray[pixelIndex] = pixel.r; | |
pixelArray[pixelIndex | 1] = pixel.g; | |
pixelArray[pixelIndex | 2] = pixel.b; | |
pixelArray[pixelIndex | 3] = alpha; | |
} | |
} | |
} | |
} | |
DjVu.IS_DEBUG && console.log("JB2Image creating time = ", performance.now() - time); | |
return new ImageData(pixelArray, this.width, this.height); | |
} | |
getImageFromBitmap() { | |
this.getBitmap(); | |
var time = performance.now(); | |
var image = new ImageData(this.width, this.height); | |
for (var i = 0; i < this.height; i++) { | |
for (var j = 0; j < this.width; j++) { | |
var v = this.bitmap.get(i, j) ? 0 : 255; | |
var index = ((this.height - i - 1) * this.width + j) * 4; | |
image.data[index] = v; | |
image.data[index + 1] = v; | |
image.data[index + 2] = v; | |
image.data[index + 3] = 255; | |
} | |
} | |
DjVu.IS_DEBUG && console.log("JB2Image creating time = ", performance.now() - time); | |
return image; | |
} | |
} | |
class ByteStream { | |
constructor(buffer, offsetx, length) { | |
this._buffer = buffer; | |
this.offsetx = offsetx || 0; | |
this.offset = 0; | |
this._length = length || buffer.byteLength; | |
if (this._length + offsetx > buffer.byteLength) { | |
this._length = buffer.byteLength - offsetx; | |
console.error("Incorrect length in ByteStream!"); | |
} | |
this.viewer = new DataView(this._buffer, this.offsetx, this._length); | |
} | |
get length() { return this._length; } | |
get buffer() { return this._buffer; } | |
getUint8Array(length = this.remainingLength()) { | |
var off = this.offset; | |
this.offset += length; | |
return new Uint8Array(this._buffer, this.offsetx + off, length); | |
} | |
toUint8Array() { | |
return new Uint8Array(this._buffer, this.offsetx, this._length); | |
} | |
remainingLength() { | |
return this._length - this.offset; | |
} | |
reset() { | |
this.offset = 0; | |
} | |
byte() { | |
if (this.offset >= this._length) { | |
this.offset++; | |
return 0xff; | |
} | |
return this.viewer.getUint8(this.offset++); | |
} | |
getInt8() { | |
return this.viewer.getInt8(this.offset++); | |
} | |
getInt16() { | |
var tmp = this.viewer.getInt16(this.offset); | |
this.offset += 2; | |
return tmp; | |
} | |
getUint16() { | |
var tmp = this.viewer.getUint16(this.offset); | |
this.offset += 2; | |
return tmp; | |
} | |
getInt32() { | |
var tmp = this.viewer.getInt32(this.offset); | |
this.offset += 4; | |
return tmp; | |
} | |
getUint8() { | |
return this.viewer.getUint8(this.offset++); | |
} | |
getInt24() { | |
var uint = this.getUint24(); | |
return (uint & 0x800000) ? (0xffffff - val + 1) * -1 : uint | |
} | |
getUint24() { | |
return (this.byte() << 16) | (this.byte() << 8) | this.byte(); | |
} | |
jump(length) { | |
this.offset += length; | |
return this; | |
} | |
setOffset(offset) { | |
this.offset = offset; | |
} | |
readStr4() { | |
return String.fromCharCode(...this.getUint8Array(4)); | |
} | |
readStrNT() { | |
var array = []; | |
var byte = this.getUint8(); | |
while (byte) { | |
array.push(byte); | |
byte = this.getUint8(); | |
} | |
return createStringFromUtf8Array(new Uint8Array(array)); | |
} | |
readStrUTF(byteLength) { | |
return createStringFromUtf8Array(this.getUint8Array(byteLength)); | |
} | |
fork(length = this.remainingLength()) { | |
return new ByteStream(this._buffer, this.offsetx + this.offset, length); | |
} | |
clone() { | |
return new ByteStream(this._buffer, this.offsetx, this._length); | |
} | |
isEmpty() { | |
return this.offset >= this._length; | |
} | |
} | |
class BZZDecoder { | |
constructor(zp) { | |
this.zp = zp; | |
this.maxblock = 4096; | |
this.FREQMAX = 4; | |
this.CTXIDS = 3; | |
this.ctx = new Uint8Array(300); | |
this.size = 0; | |
this.blocksize = 0; | |
this.data = null; | |
} | |
decode_raw(bits) { | |
var n = 1; | |
var m = (1 << bits); | |
while (n < m) { | |
var b = this.zp.decode(); | |
n = (n << 1) | b; | |
} | |
return n - m; | |
} | |
decode_binary(ctxoff, bits) { | |
var n = 1; | |
var m = (1 << bits); | |
ctxoff--; | |
while (n < m) { | |
var b = this.zp.decode(this.ctx, ctxoff + n); | |
n = (n << 1) | b; | |
} | |
return n - m; | |
} | |
_decode() { | |
this.size = this.decode_raw(24); | |
if (!this.size) { | |
return 0; | |
} | |
if (this.size > this.maxblock * 1024) { | |
throw new Error("Too big block. Error"); | |
} | |
if (this.blocksize < this.size) { | |
this.blocksize = this.size; | |
this.data = new Uint8Array(this.blocksize); | |
} else if (this.data == null) { | |
this.data = new Uint8Array(this.blocksize); | |
} | |
var fshift = 0; | |
if (this.zp.decode()) { | |
fshift++; | |
if (this.zp.decode()) { | |
fshift++; | |
} | |
} | |
var mtf = new Uint8Array(256); | |
for (var i = 0; i < 256; i++) { | |
mtf[i] = i; | |
} | |
var freq = new Array(this.FREQMAX); | |
for (var i = 0; i < this.FREQMAX; freq[i++] = 0); | |
var fadd = 4; | |
var mtfno = 3; | |
var markerpos = -1; | |
for (var i = 0; i < this.size; i++) { | |
var ctxid = this.CTXIDS - 1; | |
if (ctxid > mtfno) { | |
ctxid = mtfno; | |
} | |
var ctxoff = 0; | |
switch (0) | |
{ | |
default: | |
if (this.zp.decode(this.ctx, ctxoff + ctxid) != 0) { | |
mtfno = 0; | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += this.CTXIDS; | |
if (this.zp.decode(this.ctx, ctxoff + ctxid) != 0) { | |
mtfno = 1; | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += this.CTXIDS; | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 2 + this.decode_binary(ctxoff + 1, 1); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += (1 + 1); | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 4 + this.decode_binary(ctxoff + 1, 2); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += (1 + 3); | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 8 + this.decode_binary(ctxoff + 1, 3); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += (1 + 7); | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 16 + this.decode_binary(ctxoff + 1, 4); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += (1 + 15); | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 32 + this.decode_binary(ctxoff + 1, 5); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += (1 + 31); | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 64 + this.decode_binary(ctxoff + 1, 6); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
ctxoff += (1 + 63); | |
if (this.zp.decode(this.ctx, ctxoff + 0) != 0) { | |
mtfno = 128 + this.decode_binary(ctxoff + 1, 7); | |
this.data[i] = mtf[mtfno]; | |
break; | |
} | |
mtfno = 256; | |
this.data[i] = 0; | |
markerpos = i; | |
continue; | |
} | |
var k; | |
fadd = fadd + (fadd >> fshift); | |
if (fadd > 0x10000000) { | |
fadd >>= 24; | |
freq[0] >>= 24; | |
freq[1] >>= 24; | |
freq[2] >>= 24; | |
freq[3] >>= 24; | |
for (k = 4; k < this.FREQMAX; k++) { | |
freq[k] >>= 24; | |
} | |
} | |
var fc = fadd; | |
if (mtfno < this.FREQMAX) { | |
fc += freq[mtfno]; | |
} | |
for (k = mtfno; k >= this.FREQMAX; k--) { | |
mtf[k] = mtf[k - 1]; | |
} | |
for (; (k > 0) && ((0xffffffff & fc) >= (0xffffffff & freq[k - 1])); k--) { | |
mtf[k] = mtf[k - 1]; | |
freq[k] = freq[k - 1]; | |
} | |
mtf[k] = this.data[i]; | |
freq[k] = fc; | |
} | |
if ((markerpos < 1) || (markerpos >= this.size)) { | |
throw new Error("BZZ byte stream is corrupted"); | |
} | |
var pos = new Uint32Array(this.size); | |
for (var j = 0; j < this.size; pos[j++] = 0); | |
var count = new Array(256); | |
for (var i = 0; i < 256; count[i++] = 0); | |
for (var i = 0; i < markerpos; i++) { | |
var c = this.data[i]; | |
pos[i] = (c << 24) | (count[0xff & c] & 0xffffff); | |
count[0xff & c]++; | |
} | |
for (var i = markerpos + 1; i < this.size; i++) { | |
var c = this.data[i]; | |
pos[i] = (c << 24) | (count[0xff & c] & 0xffffff); | |
count[0xff & c]++; | |
} | |
var last = 1; | |
for (var i = 0; i < 256; i++) { | |
var tmp = count[i]; | |
count[i] = last; | |
last += tmp; | |
} | |
var j = 0; | |
last = this.size - 1; | |
while (last > 0) { | |
var n = pos[j]; | |
var c = pos[j] >> 24; | |
this.data[--last] = 0xff & c; | |
j = count[0xff & c] + (n & 0xffffff); | |
} | |
if (j != markerpos) { | |
throw new Error("BZZ byte stream is corrupted"); | |
} | |
return this.size; | |
} | |
getByteStream() { | |
var bsw, size; | |
while (size = this._decode()) { | |
if (!bsw) { | |
bsw = new ByteStreamWriter(size - 1); | |
} | |
var arr = new Uint8Array(this.data.buffer, 0, size - 1); | |
bsw.writeArray(arr); | |
} | |
this.data = null; | |
return new ByteStream(bsw.getBuffer()); | |
} | |
static decodeByteStream(bs) { | |
return new BZZDecoder(new ZPDecoder(bs)).getByteStream(); | |
} | |
} | |
class DjVuPalette extends IFFChunk { | |
constructor(bs) { | |
var time = performance.now(); | |
super(bs); | |
this.pixel = { r: 0, g: 0, b: 0 }; | |
this.version = bs.getUint8(); | |
if (this.version & 0x7f) { | |
throw "Bad Djvu Pallete version!"; | |
} | |
this.palleteSize = bs.getInt16(); | |
if (this.palleteSize < 0 || this.palleteSize > 65535) { | |
throw "Bad Djvu Pallete size!"; | |
} | |
this.colorArray = bs.getUint8Array(this.palleteSize * 3); | |
if (this.version & 0x80) { | |
this.dataSize = bs.getInt24(); | |
if (this.dataSize < 0) { | |
throw "Bad Djvu Pallete data size!"; | |
} | |
var bsz = BZZDecoder.decodeByteStream(bs.fork()); | |
this.colorIndices = new Int16Array(this.dataSize); | |
for (var i = 0; i < this.dataSize; i++) { | |
var index = bsz.getInt16(); | |
if (index < 0 || index >= this.palleteSize) { | |
throw "Bad Djvu Pallete index! " + index; | |
} | |
this.colorIndices[i] = index; | |
} | |
} | |
DjVu.IS_DEBUG && console.log('DjvuPalette time ', performance.now() - time); | |
} | |
getDataSize() { | |
return this.dataSize; | |
} | |
getPixelByBlitIndex(index) { | |
var colorIndex = this.colorIndices[index] * 3; | |
this.pixel.r = this.colorArray[colorIndex + 2]; | |
this.pixel.g = this.colorArray[colorIndex + 1]; | |
this.pixel.b = this.colorArray[colorIndex]; | |
return this.pixel; | |
} | |
toString() { | |
var str = super.toString(); | |
str += "Pallete size: " + this.palleteSize + "\n"; | |
str += "Data size: " + this.dataSize + "\n"; | |
return str; | |
} | |
} | |
class IWCodecBaseClass { | |
constructor() { | |
this.quant_lo = Uint32Array.of( | |
0x004000, 0x008000, 0x008000, 0x010000, 0x010000, | |
0x010000, 0x010000, 0x010000, 0x010000, 0x010000, | |
0x010000, 0x010000, 0x020000, 0x020000, 0x020000, 0x020000 | |
); | |
this.quant_hi = Uint32Array.of( | |
0, 0x020000, 0x020000, 0x040000, 0x040000, | |
0x040000, 0x080000, 0x040000, 0x040000, 0x080000 | |
); | |
this.bucketstate = new Uint8Array(16); | |
this.coeffstate = new Array(16); | |
var buffer = new ArrayBuffer(256); | |
for (var i = 0; i < 16; i++) { | |
this.coeffstate[i] = new Uint8Array(buffer, i << 4, 16); | |
} | |
this.bbstate = 0; | |
this.decodeBucketCtx = new Uint8Array(1); | |
this.decodeCoefCtx = new Uint8Array(80); | |
this.activateCoefCtx = new Uint8Array(16); | |
this.inreaseCoefCtx = new Uint8Array(1); | |
this.curband = 0; | |
} | |
getBandBuckets(band) { | |
return this.bandBuckets[band]; | |
} | |
is_null_slice() { | |
if (this.curband == 0) | |
{ | |
var is_null = 1; | |
for (var i = 0; i < 16; i++) { | |
var threshold = this.quant_lo[i]; | |
this.coeffstate[0][i] = 1; | |
if (threshold > 0 && threshold < 0x8000) { | |
this.coeffstate[0][i] = 8; | |
is_null = 0; | |
} | |
} | |
return is_null; | |
} else | |
{ | |
var threshold = this.quant_hi[this.curband]; | |
return (!(threshold > 0 && threshold < 0x8000)); | |
} | |
} | |
finish_code_slice() { | |
this.quant_hi[this.curband] = this.quant_hi[this.curband] >> 1; | |
if (this.curband === 0) { | |
for (var i = 0; i < 16; i++) | |
this.quant_lo[i] = this.quant_lo[i] >> 1; | |
} | |
this.curband++; | |
if (this.curband === 10) { | |
this.curband = 0; | |
} | |
} | |
} | |
IWCodecBaseClass.prototype.ZERO = 1; | |
IWCodecBaseClass.prototype.ACTIVE = 2; | |
IWCodecBaseClass.prototype.NEW = 4; | |
IWCodecBaseClass.prototype.UNK = 8; | |
IWCodecBaseClass.prototype.zigzagRow = Uint8Array.of(0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 0, 0, 16, 16, 0, 0, 16, 16, 8, 8, 24, 24, 8, 8, 24, 24, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 4, 4, 20, 20, 4, 4, 20, 20, 12, 12, 28, 28, 12, 12, 28, 28, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 2, 2, 18, 18, 2, 2, 18, 18, 10, 10, 26, 26, 10, 10, 26, 26, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 6, 6, 22, 22, 6, 6, 22, 22, 14, 14, 30, 30, 14, 14, 30, 30, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 1, 1, 17, 17, 1, 1, 17, 17, 9, 9, 25, 25, 9, 9, 25, 25, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 5, 5, 21, 21, 5, 5, 21, 21, 13, 13, 29, 29, 13, 13, 29, 29, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 3, 3, 19, 19, 3, 3, 19, 19, 11, 11, 27, 27, 11, 11, 27, 27, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31, 7, 7, 23, 23, 7, 7, 23, 23, 15, 15, 31, 31, 15, 15, 31, 31); | |
IWCodecBaseClass.prototype.zigzagCol = Uint8Array.of(0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 0, 16, 0, 16, 8, 24, 8, 24, 0, 16, 0, 16, 8, 24, 8, 24, 4, 20, 4, 20, 12, 28, 12, 28, 4, 20, 4, 20, 12, 28, 12, 28, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 2, 18, 2, 18, 10, 26, 10, 26, 2, 18, 2, 18, 10, 26, 10, 26, 6, 22, 6, 22, 14, 30, 14, 30, 6, 22, 6, 22, 14, 30, 14, 30, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 1, 17, 1, 17, 9, 25, 9, 25, 1, 17, 1, 17, 9, 25, 9, 25, 5, 21, 5, 21, 13, 29, 13, 29, 5, 21, 5, 21, 13, 29, 13, 29, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31, 3, 19, 3, 19, 11, 27, 11, 27, 3, 19, 3, 19, 11, 27, 11, 27, 7, 23, 7, 23, 15, 31, 15, 31, 7, 23, 7, 23, 15, 31, 15, 31); | |
IWCodecBaseClass.prototype.bandBuckets = [ | |
{ from: 0, to: 0 }, | |
{ from: 1, to: 1 }, | |
{ from: 2, to: 2 }, | |
{ from: 3, to: 3 }, | |
{ from: 4, to: 7 }, | |
{ from: 8, to: 11 }, | |
{ from: 12, to: 15 }, | |
{ from: 16, to: 31 }, | |
{ from: 32, to: 47 }, | |
{ from: 48, to: 63 } | |
]; | |
function _normalize(val) { | |
val = (val + 32) >> 6; | |
if (val < -128) { | |
return -128; | |
} else if (val >= 128) { | |
return 127; | |
} | |
return val; | |
} | |
class LazyPixelmap { | |
constructor(ybytemap, cbbytemap, crbytemap) { | |
this.width = ybytemap.width; | |
this.yArray = ybytemap.array; | |
this.cbArray = cbbytemap ? cbbytemap.array : null; | |
this.crArray = crbytemap ? crbytemap.array : null; | |
this.writePixel = cbbytemap ? this.writeColoredPixel : this.writeGrayScalePixel; | |
} | |
writeGrayScalePixel(index, pixelArray, pixelIndex) { | |
const value = 127 - _normalize(this.yArray[index]); | |
pixelArray[pixelIndex] = value; | |
pixelArray[pixelIndex | 1] = value; | |
pixelArray[pixelIndex | 2] = value; | |
} | |
writeColoredPixel(index, pixelArray, pixelIndex) { | |
const y = _normalize(this.yArray[index]); | |
const b = _normalize(this.cbArray[index]); | |
const r = _normalize(this.crArray[index]); | |
const t2 = r + (r >> 1); | |
const t3 = y + 128 - (b >> 2); | |
pixelArray[pixelIndex] = y + 128 + t2; | |
pixelArray[pixelIndex | 1] = t3 - (t2 >> 1); | |
pixelArray[pixelIndex | 2] = t3 + (b << 1); | |
} | |
} | |
class LinearBytemap { | |
constructor(width, height) { | |
this.width = width; | |
this.array = new Int16Array(width * height); | |
} | |
get(i, j) { | |
return this.array[i * this.width + j]; | |
} | |
set(i, j, val) { | |
this.array[i * this.width + j] = val; | |
} | |
sub(i, j, val) { | |
this.array[i * this.width + j] -= val; | |
} | |
add(i, j, val) { | |
this.array[i * this.width + j] += val; | |
} | |
} | |
class Bytemap extends Array { | |
constructor(width, height) { | |
super(height); | |
this.height = height; | |
this.width = width; | |
for (var i = 0; i < height; i++) { | |
this[i] = new Int16Array(width); | |
} | |
} | |
} | |
class Block { | |
constructor(buffer, offset, withBuckets = false) { | |
this.array = new Int16Array(buffer, offset, 1024); | |
if (withBuckets) { | |
this.buckets = new Array(64); | |
for (var i = 0; i < 64; i++) { | |
this.buckets[i] = new Int16Array(buffer, offset, 16); | |
offset += 32; | |
} | |
} | |
} | |
setBucketCoef(bucketNumber, index, value) { | |
this.array[(bucketNumber << 4) | index] = value; | |
} | |
getBucketCoef(bucketNumber, index) { | |
return this.array[(bucketNumber << 4) | index]; | |
} | |
getCoef(n) { | |
return this.array[n]; | |
} | |
setCoef(n, val) { | |
this.array[n] = val; | |
} | |
static createBlockArray(length) { | |
var blocks = new Array(length); | |
var buffer = new ArrayBuffer(length << 11); | |
for (var i = 0; i < length; i++) { | |
blocks[i] = new Block(buffer, i << 11); | |
} | |
return blocks; | |
} | |
} | |
class BlockMemoryManager { | |
constructor() { | |
this.buffer = null; | |
this.offset = 0; | |
this.retainedMemory = 0; | |
this.usedMemory = 0; | |
} | |
ensureBuffer() { | |
if (!this.buffer || this.offset >= this.buffer.byteLength) { | |
this.buffer = new ArrayBuffer(10 << 20); | |
this.offset = 0; | |
this.retainedMemory += this.buffer.byteLength; | |
} | |
return this.buffer; | |
} | |
allocateBucket() { | |
this.ensureBuffer(); | |
const array = new Int16Array(this.buffer, this.offset, 16); | |
this.offset += 32; | |
this.usedMemory += 32; | |
return array; | |
} | |
} | |
class LazyBlock { | |
constructor(memoryManager) { | |
this.buckets = new Array(64); | |
this.mm = memoryManager; | |
} | |
setBucketCoef(bucketNumber, index, value) { | |
if (!this.buckets[bucketNumber]) { | |
this.buckets[bucketNumber] = this.mm.allocateBucket(); | |
} | |
this.buckets[bucketNumber][index] = value; | |
} | |
getBucketCoef(bucketNumber, index) { | |
return this.buckets[bucketNumber] ? this.buckets[bucketNumber][index] : 0; | |
} | |
getCoef(n) { | |
return this.getBucketCoef(n >> 4, n & 15); | |
} | |
setCoef(n, val) { | |
return this.setBucketCoef(n >> 4, n & 15, val); | |
} | |
static createBlockArray(length) { | |
const mm = new BlockMemoryManager(); | |
const blocks = new Array(length); | |
for (var i = 0; i < length; i++) { | |
blocks[i] = new LazyBlock(mm); | |
} | |
return blocks; | |
} | |
} | |
class IWDecoder extends IWCodecBaseClass { | |
constructor() { | |
super(); | |
} | |
init(imageinfo) { | |
this.info = imageinfo; | |
var blockCount = Math.ceil(this.info.width / 32) * Math.ceil(this.info.height / 32); | |
this.blocks = LazyBlock.createBlockArray(blockCount); | |
} | |
decodeSlice(zp, imageinfo) { | |
if (!this.info) { | |
this.init(imageinfo); | |
} | |
this.zp = zp; | |
if (!this.is_null_slice()) { | |
this.blocks.forEach(block => { | |
this.preliminaryFlagComputation(block); | |
if (this.blockBandDecodingPass()) { | |
this.bucketDecodingPass(block, this.curband); | |
this.newlyActiveCoefficientDecodingPass(block, this.curband); | |
} | |
this.previouslyActiveCoefficientDecodingPass(block); | |
}); | |
} | |
this.finish_code_slice(); | |
} | |
previouslyActiveCoefficientDecodingPass(block) { | |
var boff = 0; | |
var step = this.quant_hi[this.curband]; | |
var indices = this.getBandBuckets(this.curband); | |
for (var i = indices.from; i <= indices.to; i++, boff++) { | |
for (var j = 0; j < 16; j++) { | |
if (this.coeffstate[boff][j] & 2 ) { | |
if (!this.curband) { | |
step = this.quant_lo[j]; | |
} | |
var des = 0; | |
var coef = block.getBucketCoef(i, j); | |
var absCoef = Math.abs(coef); | |
if (absCoef <= 3 * step) { | |
des = this.zp.decode(this.inreaseCoefCtx, 0); | |
absCoef += step >> 2; | |
} else { | |
des = this.zp.IWdecode(); | |
} | |
if (des) { | |
absCoef += step >> 1; | |
} else { | |
absCoef += -step + (step >> 1); | |
} | |
block.setBucketCoef(i, j, coef < 0 ? -absCoef : absCoef); | |
} | |
} | |
} | |
} | |
newlyActiveCoefficientDecodingPass(block, band) { | |
var boff = 0; | |
var indices = this.getBandBuckets(band); | |
var step = this.quant_hi[this.curband]; | |
for (var i = indices.from; i <= indices.to; i++, boff++) { | |
if (this.bucketstate[boff] & 4) { | |
var shift = 0; | |
if (this.bucketstate[boff] & 2) { | |
shift = 8; | |
} | |
var np = 0; | |
for (var j = 0; j < 16; j++) { | |
if (this.coeffstate[boff][j] & 8) { | |
np++; | |
} | |
} | |
for (var j = 0; j < 16; j++) { | |
if (this.coeffstate[boff][j] & 8) { | |
var ip = Math.min(7, np); | |
var des = this.zp.decode(this.activateCoefCtx, shift + ip); | |
if (des) { | |
var sign = this.zp.IWdecode() ? -1 : 1; | |
np = 0; | |
if (!this.curband) { | |
step = this.quant_lo[j]; | |
} | |
block.setBucketCoef(i, j, sign * (step + (step >> 1) - (step >> 3))); | |
} | |
if (np) { | |
np--; | |
} | |
} | |
} | |
} | |
} | |
} | |
bucketDecodingPass(block, band) { | |
var indices = this.getBandBuckets(band); | |
var boff = 0; | |
for (var i = indices.from; i <= indices.to; i++, boff++) { | |
if (!(this.bucketstate[boff] & 8)) { | |
continue; | |
} | |
var n = 0; | |
if (band) { | |
var t = 4 * i; | |
for (var j = t; j < t + 4; j++) { | |
if (block.getCoef(j)) { | |
n++; | |
} | |
} | |
if (n === 4) { | |
n--; | |
} | |
} | |
if (this.bbstate & 2) { | |
n |= 4; | |
} | |
if (this.zp.decode(this.decodeCoefCtx, n + band * 8)) { | |
this.bucketstate[boff] |= 4; | |
} | |
} | |
} | |
blockBandDecodingPass() { | |
var indices = this.getBandBuckets(this.curband); | |
var bcount = indices.to - indices.from + 1; | |
if (bcount < 16 || (this.bbstate & 2)) { | |
this.bbstate |= 4 ; | |
} else if (this.bbstate & 8) { | |
if (this.zp.decode(this.decodeBucketCtx, 0)) { | |
this.bbstate |= 4; | |
} | |
} | |
return this.bbstate & 4; | |
} | |
preliminaryFlagComputation(block) { | |
this.bbstate = 0; | |
var bstatetmp = 0; | |
var indices = this.getBandBuckets(this.curband); | |
if (this.curband) { | |
var boff = 0; | |
for (var j = indices.from; j <= indices.to; j++, boff++) { | |
bstatetmp = 0; | |
for (var k = 0; k < 16; k++) { | |
if (block.getBucketCoef(j, k) === 0) { | |
this.coeffstate[boff][k] = 8; | |
} else { | |
this.coeffstate[boff][k] = 2; | |
} | |
bstatetmp |= this.coeffstate[boff][k]; | |
} | |
this.bucketstate[boff] = bstatetmp; | |
this.bbstate |= bstatetmp; | |
} | |
} else { | |
for (var k = 0; k < 16; k++) { | |
if (this.coeffstate[0][k] !== 1) { | |
if (block.getBucketCoef(0, k) === 0) { | |
this.coeffstate[0][k] = 8; | |
} else { | |
this.coeffstate[0][k] = 2; | |
} | |
} | |
bstatetmp |= this.coeffstate[0][k]; | |
} | |
this.bucketstate[0] = bstatetmp; | |
this.bbstate |= bstatetmp; | |
} | |
} | |
getBytemap() { | |
var time = performance.now(); | |
var fullWidth = Math.ceil(this.info.width / 32) * 32; | |
var fullHeight = Math.ceil(this.info.height / 32) * 32; | |
var blockRows = Math.ceil(this.info.height / 32); | |
var blockCols = Math.ceil(this.info.width / 32); | |
var bm = new LinearBytemap(fullWidth, fullHeight); | |
for (var r = 0; r < blockRows; r++) { | |
for (var c = 0; c < blockCols; c++) { | |
var block = this.blocks[r * blockCols + c]; | |
for (var i = 0; i < 1024; i++) { | |
bm.set(this.zigzagRow[i] + (r << 5), this.zigzagCol[i] + (c << 5), block.getCoef(i)); | |
} | |
} | |
} | |
DjVu.IS_DEBUG && console.time("inverseTime"); | |
this.inverseWaveletTransform(bm); | |
DjVu.IS_DEBUG && console.timeEnd("inverseTime"); | |
DjVu.IS_DEBUG && console.log("getBytemap time = ", performance.now() - time); | |
return bm; | |
} | |
inverseWaveletTransform(bitmap) { | |
var height = this.info.height; | |
var width = this.info.width; | |
var a, c, kmax, k, i, border; | |
var prev3, prev1, next1, next3; | |
for (var s = 16, sDegree = 4; s !== 0; s >>= 1, sDegree--) { | |
kmax = (height - 1) >> sDegree; | |
border = kmax - 3; | |
for (i = 0; i < width; i += s) { | |
k = 0; | |
prev1 = 0; next1 = 0; | |
next3 = 1 > kmax ? 0 : bitmap.get(1 << sDegree, i); | |
for (k = 0; k <= kmax; k += 2) { | |
prev3 = prev1; prev1 = next1; next1 = next3; | |
next3 = (k + 3) > kmax ? 0 : bitmap.get((k + 3) << sDegree, i); | |
a = prev1 + next1; | |
c = prev3 + next3; | |
bitmap.sub(k << sDegree, i, ((a << 3) + a - c + 16) >> 5); | |
} | |
k = 1; | |
prev1 = bitmap.get((k - 1) << sDegree, i); | |
if (k + 1 <= kmax) { | |
next1 = bitmap.get((k + 1) << sDegree, i); | |
bitmap.add(k << sDegree, i, (prev1 + next1 + 1) >> 1); | |
} else { | |
bitmap.add(k << sDegree, i, prev1); | |
} | |
if (border >= 3) { | |
next3 = bitmap.get((k + 3) << sDegree, i); | |
} | |
for (k = 3; k <= border; k += 2) { | |
prev3 = prev1; prev1 = next1; next1 = next3; | |
next3 = bitmap.get((k + 3) << sDegree, i); | |
a = prev1 + next1; | |
bitmap.add(k << sDegree, i, | |
((a << 3) + a - (prev3 + next3) + 8) >> 4 | |
); | |
} | |
for (; k <= kmax; k += 2) { | |
prev1 = next1; next1 = next3; next3 = 0; | |
if (k + 1 <= kmax) { | |
bitmap.add(k << sDegree, i, (prev1 + next1 + 1) >> 1); | |
} else { | |
bitmap.add(k << sDegree, i, prev1); | |
} | |
} | |
} | |
kmax = (width - 1) >> sDegree; | |
border = kmax - 3; | |
for (i = 0; i < height; i += s) { | |
k = 0; | |
prev1 = 0; | |
next1 = 0; | |
next3 = 1 > kmax ? 0 : bitmap.get(i, 1 << sDegree); | |
for (k = 0; k <= kmax; k += 2) { | |
prev3 = prev1; prev1 = next1; next1 = next3; | |
next3 = k + 3 > kmax ? 0 : bitmap.get(i, (k + 3) << sDegree); | |
a = prev1 + next1; | |
c = prev3 + next3; | |
bitmap.sub(i, k << sDegree, ((a << 3) + a - c + 16) >> 5); | |
} | |
k = 1; | |
prev1 = bitmap.get(i, (k - 1) << sDegree); | |
if (k + 1 <= kmax) { | |
next1 = bitmap.get(i, (k + 1) << sDegree); | |
bitmap.add(i, k << sDegree, (prev1 + next1 + 1) >> 1); | |
} else { | |
bitmap.add(i, k << sDegree, prev1); | |
} | |
if (border >= 3) { | |
next3 = bitmap.get(i, (k + 3) << sDegree); | |
} | |
for (k = 3; k <= border; k += 2) { | |
prev3 = prev1; prev1 = next1; next1 = next3; | |
next3 = bitmap.get(i, (k + 3) << sDegree); | |
a = prev1 + next1; | |
bitmap.add(i, k << sDegree, | |
((a << 3) + a - (prev3 + next3) + 8) >> 4 | |
); | |
} | |
for (; k <= kmax; k += 2) { | |
prev1 = next1; next1 = next3; next3 = 0; | |
if (k + 1 <= kmax) { | |
bitmap.add(i, k << sDegree, (prev1 + next1 + 1) >> 1); | |
} else { | |
bitmap.add(i, k << sDegree, prev1); | |
} | |
} | |
} | |
} | |
} | |
} | |
class IWImage { | |
constructor() { | |
this.info = null; | |
this.pixelmap = null; | |
this.resetCodecs(); | |
} | |
resetCodecs() { | |
this.ycodec = new IWDecoder(); | |
this.crcodec = this.crcodec ? new IWDecoder() : null; | |
this.cbcodec = this.cbcodec ? new IWDecoder() : null; | |
this.cslice = 0; | |
} | |
decodeChunk(zp, header) { | |
if (!this.info) { | |
this.info = header; | |
if (!header.grayscale) { | |
this.crcodec = new IWDecoder(); | |
this.cbcodec = new IWDecoder(); | |
} | |
} else { | |
this.info.slices = header.slices; | |
} | |
for (var i = 0; i < this.info.slices; i++) { | |
this.cslice++; | |
this.ycodec.decodeSlice(zp, header); | |
if (this.crcodec && this.cbcodec && this.cslice > this.info.delayInit) { | |
this.cbcodec.decodeSlice(zp, header); | |
this.crcodec.decodeSlice(zp, header); | |
} | |
} | |
} | |
createPixelmap() { | |
var time = performance.now(); | |
var ybitmap = this.ycodec.getBytemap(); | |
var cbbitmap = this.cbcodec ? this.cbcodec.getBytemap() : null; | |
var crbitmap = this.crcodec ? this.crcodec.getBytemap() : null; | |
var pixelMapTime = performance.now(); | |
this.pixelmap = new LazyPixelmap(ybitmap, cbbitmap, crbitmap); | |
DjVu.IS_DEBUG && console.log('Pixelmap constructor time = ', performance.now() - pixelMapTime); | |
DjVu.IS_DEBUG && console.log('IWImage.createPixelmap time = ', performance.now() - time); | |
this.resetCodecs(); | |
} | |
getImage() { | |
const time = performance.now(); | |
if (!this.pixelmap) this.createPixelmap(); | |
const width = this.info.width; | |
const height = this.info.height; | |
const image = new ImageData(width, height); | |
const processRow = (i) => { | |
const rowOffset = i * this.pixelmap.width; | |
let pixelIndex = ((height - i - 1) * width) << 2; | |
for (let j = 0; j < width; j++) { | |
this.pixelmap.writePixel(rowOffset + j, image.data, pixelIndex); | |
image.data[pixelIndex | 3] = 255; | |
pixelIndex += 4; | |
} | |
}; | |
for (let i = 0; i < height; i++) { | |
processRow(i); | |
} | |
DjVu.IS_DEBUG && console.log('IWImage.getImage time = ', performance.now() - time); | |
return image; | |
} | |
} | |
class DjVuText extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.isDecoded = false; | |
this.dbs = this.id === 'TXTz' ? null : this.bs; | |
} | |
decode() { | |
if (this.isDecoded) { | |
return; | |
} | |
if (!this.dbs) { | |
this.dbs = BZZDecoder.decodeByteStream(this.bs); | |
} | |
this.textLength = this.dbs.getInt24(); | |
this.utf8array = this.dbs.getUint8Array(this.textLength); | |
this.version = this.dbs.getUint8(); | |
if (this.version !== 1) { | |
console.warn("The version in " + this.id + " isn't equal to 1!"); | |
} | |
this.pageZone = this.dbs.isEmpty() ? null : this.decodeZone(); | |
this.isDecoded = true; | |
} | |
decodeZone(parent = null, prev = null) { | |
var type = this.dbs.getUint8(); | |
var x = this.dbs.getUint16() - 0x8000; | |
var y = this.dbs.getUint16() - 0x8000; | |
var width = this.dbs.getUint16() - 0x8000; | |
var height = this.dbs.getUint16() - 0x8000; | |
var textStart = this.dbs.getUint16() - 0x8000; | |
var textLength = this.dbs.getInt24(); | |
if (prev) { | |
if (type === 1 || type === 4 || type === 5 ) { | |
x = x + prev.x; | |
y = prev.y - (y + height); | |
} else | |
{ | |
x = x + prev.x + prev.width; | |
y = y + prev.y; | |
} | |
textStart += prev.textStart + prev.textLength; | |
} else if (parent) { | |
x = x + parent.x; | |
y = parent.y + parent.height - (y + height); | |
textStart += parent.textStart; | |
} | |
var zone = { type, x, y, width, height, textStart, textLength }; | |
var childrenCount = this.dbs.getInt24(); | |
if (childrenCount) { | |
var children = new Array(childrenCount); | |
var childZone = null; | |
for (var i = 0; i < childrenCount; i++) { | |
childZone = this.decodeZone(zone, childZone); | |
children[i] = childZone; | |
} | |
zone.children = children; | |
} | |
return zone; | |
} | |
getText() { | |
this.decode(); | |
this.text = this.text || createStringFromUtf8Array(this.utf8array); | |
return this.text; | |
} | |
getPageZone() { | |
this.decode(); | |
return this.pageZone; | |
} | |
getNormalizedZones() { | |
this.decode(); | |
if (!this.pageZone) { | |
return null; | |
} | |
if (this.normalizedZones) { | |
return this.normalizedZones; | |
} | |
this.normalizedZones = []; | |
var registry = {}; | |
const process = (zone) => { | |
if (zone.children) { | |
zone.children.forEach(zone => process(zone)); | |
} else { | |
var key = zone.x.toString() + zone.y + zone.width + zone.height; | |
var zoneText = createStringFromUtf8Array(this.utf8array.slice(zone.textStart, zone.textStart + zone.textLength)); | |
if (registry[key]) { | |
registry[key].text += zoneText; | |
} else { | |
registry[key] = { | |
x: zone.x, | |
y: zone.y, | |
width: zone.width, | |
height: zone.height, | |
text: zoneText | |
}; | |
this.normalizedZones.push(registry[key]); | |
} | |
} | |
}; | |
process(this.pageZone); | |
return this.normalizedZones; | |
} | |
toString() { | |
this.decode(); | |
var st = "Text length = " + this.textLength + "\n"; | |
return super.toString() + st; | |
} | |
} | |
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; | |
function commonjsRequire () { | |
throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); | |
} | |
function createCommonjsModule(fn, module) { | |
return module = { exports: {} }, fn(module, module.exports), module.exports; | |
} | |
var browser = createCommonjsModule(function (module, exports) { | |
(function(f){{module.exports=f();}})(function(){return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof commonjsRequire=="function"&&commonjsRequire;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof commonjsRequire=="function"&&commonjsRequire;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
(function (Buffer){ | |
let interlaceUtils = require("./interlace"); | |
let pixelBppMapper = [ | |
function () {}, | |
function (pxData, data, pxPos, rawPos) { | |
if (rawPos === data.length) { | |
throw new Error("Ran out of data"); | |
} | |
let pixel = data[rawPos]; | |
pxData[pxPos] = pixel; | |
pxData[pxPos + 1] = pixel; | |
pxData[pxPos + 2] = pixel; | |
pxData[pxPos + 3] = 0xff; | |
}, | |
function (pxData, data, pxPos, rawPos) { | |
if (rawPos + 1 >= data.length) { | |
throw new Error("Ran out of data"); | |
} | |
let pixel = data[rawPos]; | |
pxData[pxPos] = pixel; | |
pxData[pxPos + 1] = pixel; | |
pxData[pxPos + 2] = pixel; | |
pxData[pxPos + 3] = data[rawPos + 1]; | |
}, | |
function (pxData, data, pxPos, rawPos) { | |
if (rawPos + 2 >= data.length) { | |
throw new Error("Ran out of data"); | |
} | |
pxData[pxPos] = data[rawPos]; | |
pxData[pxPos + 1] = data[rawPos + 1]; | |
pxData[pxPos + 2] = data[rawPos + 2]; | |
pxData[pxPos + 3] = 0xff; | |
}, | |
function (pxData, data, pxPos, rawPos) { | |
if (rawPos + 3 >= data.length) { | |
throw new Error("Ran out of data"); | |
} | |
pxData[pxPos] = data[rawPos]; | |
pxData[pxPos + 1] = data[rawPos + 1]; | |
pxData[pxPos + 2] = data[rawPos + 2]; | |
pxData[pxPos + 3] = data[rawPos + 3]; | |
}, | |
]; | |
let pixelBppCustomMapper = [ | |
function () {}, | |
function (pxData, pixelData, pxPos, maxBit) { | |
let pixel = pixelData[0]; | |
pxData[pxPos] = pixel; | |
pxData[pxPos + 1] = pixel; | |
pxData[pxPos + 2] = pixel; | |
pxData[pxPos + 3] = maxBit; | |
}, | |
function (pxData, pixelData, pxPos) { | |
let pixel = pixelData[0]; | |
pxData[pxPos] = pixel; | |
pxData[pxPos + 1] = pixel; | |
pxData[pxPos + 2] = pixel; | |
pxData[pxPos + 3] = pixelData[1]; | |
}, | |
function (pxData, pixelData, pxPos, maxBit) { | |
pxData[pxPos] = pixelData[0]; | |
pxData[pxPos + 1] = pixelData[1]; | |
pxData[pxPos + 2] = pixelData[2]; | |
pxData[pxPos + 3] = maxBit; | |
}, | |
function (pxData, pixelData, pxPos) { | |
pxData[pxPos] = pixelData[0]; | |
pxData[pxPos + 1] = pixelData[1]; | |
pxData[pxPos + 2] = pixelData[2]; | |
pxData[pxPos + 3] = pixelData[3]; | |
}, | |
]; | |
function bitRetriever(data, depth) { | |
let leftOver = []; | |
let i = 0; | |
function split() { | |
if (i === data.length) { | |
throw new Error("Ran out of data"); | |
} | |
let byte = data[i]; | |
i++; | |
let byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1; | |
switch (depth) { | |
default: | |
throw new Error("unrecognised depth"); | |
case 16: | |
byte2 = data[i]; | |
i++; | |
leftOver.push((byte << 8) + byte2); | |
break; | |
case 4: | |
byte2 = byte & 0x0f; | |
byte1 = byte >> 4; | |
leftOver.push(byte1, byte2); | |
break; | |
case 2: | |
byte4 = byte & 3; | |
byte3 = (byte >> 2) & 3; | |
byte2 = (byte >> 4) & 3; | |
byte1 = (byte >> 6) & 3; | |
leftOver.push(byte1, byte2, byte3, byte4); | |
break; | |
case 1: | |
byte8 = byte & 1; | |
byte7 = (byte >> 1) & 1; | |
byte6 = (byte >> 2) & 1; | |
byte5 = (byte >> 3) & 1; | |
byte4 = (byte >> 4) & 1; | |
byte3 = (byte >> 5) & 1; | |
byte2 = (byte >> 6) & 1; | |
byte1 = (byte >> 7) & 1; | |
leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8); | |
break; | |
} | |
} | |
return { | |
get: function (count) { | |
while (leftOver.length < count) { | |
split(); | |
} | |
let returner = leftOver.slice(0, count); | |
leftOver = leftOver.slice(count); | |
return returner; | |
}, | |
resetAfterLine: function () { | |
leftOver.length = 0; | |
}, | |
end: function () { | |
if (i !== data.length) { | |
throw new Error("extra data found"); | |
} | |
}, | |
}; | |
} | |
function mapImage8Bit(image, pxData, getPxPos, bpp, data, rawPos) { | |
let imageWidth = image.width; | |
let imageHeight = image.height; | |
let imagePass = image.index; | |
for (let y = 0; y < imageHeight; y++) { | |
for (let x = 0; x < imageWidth; x++) { | |
let pxPos = getPxPos(x, y, imagePass); | |
pixelBppMapper[bpp](pxData, data, pxPos, rawPos); | |
rawPos += bpp; | |
} | |
} | |
return rawPos; | |
} | |
function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) { | |
let imageWidth = image.width; | |
let imageHeight = image.height; | |
let imagePass = image.index; | |
for (let y = 0; y < imageHeight; y++) { | |
for (let x = 0; x < imageWidth; x++) { | |
let pixelData = bits.get(bpp); | |
let pxPos = getPxPos(x, y, imagePass); | |
pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit); | |
} | |
bits.resetAfterLine(); | |
} | |
} | |
exports.dataToBitMap = function (data, bitmapInfo) { | |
let width = bitmapInfo.width; | |
let height = bitmapInfo.height; | |
let depth = bitmapInfo.depth; | |
let bpp = bitmapInfo.bpp; | |
let interlace = bitmapInfo.interlace; | |
let bits; | |
if (depth !== 8) { | |
bits = bitRetriever(data, depth); | |
} | |
let pxData; | |
if (depth <= 8) { | |
pxData = Buffer.alloc(width * height * 4); | |
} else { | |
pxData = new Uint16Array(width * height * 4); | |
} | |
let maxBit = Math.pow(2, depth) - 1; | |
let rawPos = 0; | |
let images; | |
let getPxPos; | |
if (interlace) { | |
images = interlaceUtils.getImagePasses(width, height); | |
getPxPos = interlaceUtils.getInterlaceIterator(width, height); | |
} else { | |
let nonInterlacedPxPos = 0; | |
getPxPos = function () { | |
let returner = nonInterlacedPxPos; | |
nonInterlacedPxPos += 4; | |
return returner; | |
}; | |
images = [{ width: width, height: height }]; | |
} | |
for (let imageIndex = 0; imageIndex < images.length; imageIndex++) { | |
if (depth === 8) { | |
rawPos = mapImage8Bit( | |
images[imageIndex], | |
pxData, | |
getPxPos, | |
bpp, | |
data, | |
rawPos | |
); | |
} else { | |
mapImageCustomBit( | |
images[imageIndex], | |
pxData, | |
getPxPos, | |
bpp, | |
bits, | |
maxBit | |
); | |
} | |
} | |
if (depth === 8) { | |
if (rawPos !== data.length) { | |
throw new Error("extra data found"); | |
} | |
} else { | |
bits.end(); | |
} | |
return pxData; | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./interlace":11,"buffer":28}],2:[function(require,module,exports){ | |
(function (Buffer){ | |
let constants = require("./constants"); | |
module.exports = function (dataIn, width, height, options) { | |
let outHasAlpha = | |
[constants.COLORTYPE_COLOR_ALPHA, constants.COLORTYPE_ALPHA].indexOf( | |
options.colorType | |
) !== -1; | |
if (options.colorType === options.inputColorType) { | |
let bigEndian = (function () { | |
let buffer = new ArrayBuffer(2); | |
new DataView(buffer).setInt16(0, 256, true ); | |
return new Int16Array(buffer)[0] !== 256; | |
})(); | |
if (options.bitDepth === 8 || (options.bitDepth === 16 && bigEndian)) { | |
return dataIn; | |
} | |
} | |
let data = options.bitDepth !== 16 ? dataIn : new Uint16Array(dataIn.buffer); | |
let maxValue = 255; | |
let inBpp = constants.COLORTYPE_TO_BPP_MAP[options.inputColorType]; | |
if (inBpp === 4 && !options.inputHasAlpha) { | |
inBpp = 3; | |
} | |
let outBpp = constants.COLORTYPE_TO_BPP_MAP[options.colorType]; | |
if (options.bitDepth === 16) { | |
maxValue = 65535; | |
outBpp *= 2; | |
} | |
let outData = Buffer.alloc(width * height * outBpp); | |
let inIndex = 0; | |
let outIndex = 0; | |
let bgColor = options.bgColor || {}; | |
if (bgColor.red === undefined) { | |
bgColor.red = maxValue; | |
} | |
if (bgColor.green === undefined) { | |
bgColor.green = maxValue; | |
} | |
if (bgColor.blue === undefined) { | |
bgColor.blue = maxValue; | |
} | |
function getRGBA() { | |
let red; | |
let green; | |
let blue; | |
let alpha = maxValue; | |
switch (options.inputColorType) { | |
case constants.COLORTYPE_COLOR_ALPHA: | |
alpha = data[inIndex + 3]; | |
red = data[inIndex]; | |
green = data[inIndex + 1]; | |
blue = data[inIndex + 2]; | |
break; | |
case constants.COLORTYPE_COLOR: | |
red = data[inIndex]; | |
green = data[inIndex + 1]; | |
blue = data[inIndex + 2]; | |
break; | |
case constants.COLORTYPE_ALPHA: | |
alpha = data[inIndex + 1]; | |
red = data[inIndex]; | |
green = red; | |
blue = red; | |
break; | |
case constants.COLORTYPE_GRAYSCALE: | |
red = data[inIndex]; | |
green = red; | |
blue = red; | |
break; | |
default: | |
throw new Error( | |
"input color type:" + | |
options.inputColorType + | |
" is not supported at present" | |
); | |
} | |
if (options.inputHasAlpha) { | |
if (!outHasAlpha) { | |
alpha /= maxValue; | |
red = Math.min( | |
Math.max(Math.round((1 - alpha) * bgColor.red + alpha * red), 0), | |
maxValue | |
); | |
green = Math.min( | |
Math.max(Math.round((1 - alpha) * bgColor.green + alpha * green), 0), | |
maxValue | |
); | |
blue = Math.min( | |
Math.max(Math.round((1 - alpha) * bgColor.blue + alpha * blue), 0), | |
maxValue | |
); | |
} | |
} | |
return { red: red, green: green, blue: blue, alpha: alpha }; | |
} | |
for (let y = 0; y < height; y++) { | |
for (let x = 0; x < width; x++) { | |
let rgba = getRGBA(); | |
switch (options.colorType) { | |
case constants.COLORTYPE_COLOR_ALPHA: | |
case constants.COLORTYPE_COLOR: | |
if (options.bitDepth === 8) { | |
outData[outIndex] = rgba.red; | |
outData[outIndex + 1] = rgba.green; | |
outData[outIndex + 2] = rgba.blue; | |
if (outHasAlpha) { | |
outData[outIndex + 3] = rgba.alpha; | |
} | |
} else { | |
outData.writeUInt16BE(rgba.red, outIndex); | |
outData.writeUInt16BE(rgba.green, outIndex + 2); | |
outData.writeUInt16BE(rgba.blue, outIndex + 4); | |
if (outHasAlpha) { | |
outData.writeUInt16BE(rgba.alpha, outIndex + 6); | |
} | |
} | |
break; | |
case constants.COLORTYPE_ALPHA: | |
case constants.COLORTYPE_GRAYSCALE: { | |
let grayscale = (rgba.red + rgba.green + rgba.blue) / 3; | |
if (options.bitDepth === 8) { | |
outData[outIndex] = grayscale; | |
if (outHasAlpha) { | |
outData[outIndex + 1] = rgba.alpha; | |
} | |
} else { | |
outData.writeUInt16BE(grayscale, outIndex); | |
if (outHasAlpha) { | |
outData.writeUInt16BE(rgba.alpha, outIndex + 2); | |
} | |
} | |
break; | |
} | |
default: | |
throw new Error("unrecognised color Type " + options.colorType); | |
} | |
inIndex += inBpp; | |
outIndex += outBpp; | |
} | |
} | |
return outData; | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./constants":4,"buffer":28}],3:[function(require,module,exports){ | |
(function (process,Buffer){ | |
let util = require("util"); | |
let Stream = require("stream"); | |
let ChunkStream = (module.exports = function () { | |
Stream.call(this); | |
this._buffers = []; | |
this._buffered = 0; | |
this._reads = []; | |
this._paused = false; | |
this._encoding = "utf8"; | |
this.writable = true; | |
}); | |
util.inherits(ChunkStream, Stream); | |
ChunkStream.prototype.read = function (length, callback) { | |
this._reads.push({ | |
length: Math.abs(length), | |
allowLess: length < 0, | |
func: callback, | |
}); | |
process.nextTick( | |
function () { | |
this._process(); | |
if (this._paused && this._reads && this._reads.length > 0) { | |
this._paused = false; | |
this.emit("drain"); | |
} | |
}.bind(this) | |
); | |
}; | |
ChunkStream.prototype.write = function (data, encoding) { | |
if (!this.writable) { | |
this.emit("error", new Error("Stream not writable")); | |
return false; | |
} | |
let dataBuffer; | |
if (Buffer.isBuffer(data)) { | |
dataBuffer = data; | |
} else { | |
dataBuffer = Buffer.from(data, encoding || this._encoding); | |
} | |
this._buffers.push(dataBuffer); | |
this._buffered += dataBuffer.length; | |
this._process(); | |
if (this._reads && this._reads.length === 0) { | |
this._paused = true; | |
} | |
return this.writable && !this._paused; | |
}; | |
ChunkStream.prototype.end = function (data, encoding) { | |
if (data) { | |
this.write(data, encoding); | |
} | |
this.writable = false; | |
if (!this._buffers) { | |
return; | |
} | |
if (this._buffers.length === 0) { | |
this._end(); | |
} else { | |
this._buffers.push(null); | |
this._process(); | |
} | |
}; | |
ChunkStream.prototype.destroySoon = ChunkStream.prototype.end; | |
ChunkStream.prototype._end = function () { | |
if (this._reads.length > 0) { | |
this.emit("error", new Error("Unexpected end of input")); | |
} | |
this.destroy(); | |
}; | |
ChunkStream.prototype.destroy = function () { | |
if (!this._buffers) { | |
return; | |
} | |
this.writable = false; | |
this._reads = null; | |
this._buffers = null; | |
this.emit("close"); | |
}; | |
ChunkStream.prototype._processReadAllowingLess = function (read) { | |
this._reads.shift(); | |
let smallerBuf = this._buffers[0]; | |
if (smallerBuf.length > read.length) { | |
this._buffered -= read.length; | |
this._buffers[0] = smallerBuf.slice(read.length); | |
read.func.call(this, smallerBuf.slice(0, read.length)); | |
} else { | |
this._buffered -= smallerBuf.length; | |
this._buffers.shift(); | |
read.func.call(this, smallerBuf); | |
} | |
}; | |
ChunkStream.prototype._processRead = function (read) { | |
this._reads.shift(); | |
let pos = 0; | |
let count = 0; | |
let data = Buffer.alloc(read.length); | |
while (pos < read.length) { | |
let buf = this._buffers[count++]; | |
let len = Math.min(buf.length, read.length - pos); | |
buf.copy(data, pos, 0, len); | |
pos += len; | |
if (len !== buf.length) { | |
this._buffers[--count] = buf.slice(len); | |
} | |
} | |
if (count > 0) { | |
this._buffers.splice(0, count); | |
} | |
this._buffered -= read.length; | |
read.func.call(this, data); | |
}; | |
ChunkStream.prototype._process = function () { | |
try { | |
while (this._buffered > 0 && this._reads && this._reads.length > 0) { | |
let read = this._reads[0]; | |
if (read.allowLess) { | |
this._processReadAllowingLess(read); | |
} else if (this._buffered >= read.length) { | |
this._processRead(read); | |
} else { | |
break; | |
} | |
} | |
if (this._buffers && !this.writable) { | |
this._end(); | |
} | |
} catch (ex) { | |
this.emit("error", ex); | |
} | |
}; | |
}).call(this,require('_process'),require("buffer").Buffer); | |
},{"_process":47,"buffer":28,"stream":63,"util":67}],4:[function(require,module,exports){ | |
module.exports = { | |
PNG_SIGNATURE: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], | |
TYPE_IHDR: 0x49484452, | |
TYPE_IEND: 0x49454e44, | |
TYPE_IDAT: 0x49444154, | |
TYPE_PLTE: 0x504c5445, | |
TYPE_tRNS: 0x74524e53, | |
TYPE_gAMA: 0x67414d41, | |
COLORTYPE_GRAYSCALE: 0, | |
COLORTYPE_PALETTE: 1, | |
COLORTYPE_COLOR: 2, | |
COLORTYPE_ALPHA: 4, | |
COLORTYPE_PALETTE_COLOR: 3, | |
COLORTYPE_COLOR_ALPHA: 6, | |
COLORTYPE_TO_BPP_MAP: { | |
0: 1, | |
2: 3, | |
3: 1, | |
4: 2, | |
6: 4, | |
}, | |
GAMMA_DIVISION: 100000, | |
}; | |
},{}],5:[function(require,module,exports){ | |
let crcTable = []; | |
(function () { | |
for (let i = 0; i < 256; i++) { | |
let currentCrc = i; | |
for (let j = 0; j < 8; j++) { | |
if (currentCrc & 1) { | |
currentCrc = 0xedb88320 ^ (currentCrc >>> 1); | |
} else { | |
currentCrc = currentCrc >>> 1; | |
} | |
} | |
crcTable[i] = currentCrc; | |
} | |
})(); | |
let CrcCalculator = (module.exports = function () { | |
this._crc = -1; | |
}); | |
CrcCalculator.prototype.write = function (data) { | |
for (let i = 0; i < data.length; i++) { | |
this._crc = crcTable[(this._crc ^ data[i]) & 0xff] ^ (this._crc >>> 8); | |
} | |
return true; | |
}; | |
CrcCalculator.prototype.crc32 = function () { | |
return this._crc ^ -1; | |
}; | |
CrcCalculator.crc32 = function (buf) { | |
let crc = -1; | |
for (let i = 0; i < buf.length; i++) { | |
crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8); | |
} | |
return crc ^ -1; | |
}; | |
},{}],6:[function(require,module,exports){ | |
(function (Buffer){ | |
let paethPredictor = require("./paeth-predictor"); | |
function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) { | |
for (let x = 0; x < byteWidth; x++) { | |
rawData[rawPos + x] = pxData[pxPos + x]; | |
} | |
} | |
function filterSumNone(pxData, pxPos, byteWidth) { | |
let sum = 0; | |
let length = pxPos + byteWidth; | |
for (let i = pxPos; i < length; i++) { | |
sum += Math.abs(pxData[i]); | |
} | |
return sum; | |
} | |
function filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { | |
for (let x = 0; x < byteWidth; x++) { | |
let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; | |
let val = pxData[pxPos + x] - left; | |
rawData[rawPos + x] = val; | |
} | |
} | |
function filterSumSub(pxData, pxPos, byteWidth, bpp) { | |
let sum = 0; | |
for (let x = 0; x < byteWidth; x++) { | |
let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; | |
let val = pxData[pxPos + x] - left; | |
sum += Math.abs(val); | |
} | |
return sum; | |
} | |
function filterUp(pxData, pxPos, byteWidth, rawData, rawPos) { | |
for (let x = 0; x < byteWidth; x++) { | |
let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; | |
let val = pxData[pxPos + x] - up; | |
rawData[rawPos + x] = val; | |
} | |
} | |
function filterSumUp(pxData, pxPos, byteWidth) { | |
let sum = 0; | |
let length = pxPos + byteWidth; | |
for (let x = pxPos; x < length; x++) { | |
let up = pxPos > 0 ? pxData[x - byteWidth] : 0; | |
let val = pxData[x] - up; | |
sum += Math.abs(val); | |
} | |
return sum; | |
} | |
function filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { | |
for (let x = 0; x < byteWidth; x++) { | |
let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; | |
let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; | |
let val = pxData[pxPos + x] - ((left + up) >> 1); | |
rawData[rawPos + x] = val; | |
} | |
} | |
function filterSumAvg(pxData, pxPos, byteWidth, bpp) { | |
let sum = 0; | |
for (let x = 0; x < byteWidth; x++) { | |
let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; | |
let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; | |
let val = pxData[pxPos + x] - ((left + up) >> 1); | |
sum += Math.abs(val); | |
} | |
return sum; | |
} | |
function filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { | |
for (let x = 0; x < byteWidth; x++) { | |
let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; | |
let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; | |
let upleft = | |
pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; | |
let val = pxData[pxPos + x] - paethPredictor(left, up, upleft); | |
rawData[rawPos + x] = val; | |
} | |
} | |
function filterSumPaeth(pxData, pxPos, byteWidth, bpp) { | |
let sum = 0; | |
for (let x = 0; x < byteWidth; x++) { | |
let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; | |
let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; | |
let upleft = | |
pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; | |
let val = pxData[pxPos + x] - paethPredictor(left, up, upleft); | |
sum += Math.abs(val); | |
} | |
return sum; | |
} | |
let filters = { | |
0: filterNone, | |
1: filterSub, | |
2: filterUp, | |
3: filterAvg, | |
4: filterPaeth, | |
}; | |
let filterSums = { | |
0: filterSumNone, | |
1: filterSumSub, | |
2: filterSumUp, | |
3: filterSumAvg, | |
4: filterSumPaeth, | |
}; | |
module.exports = function (pxData, width, height, options, bpp) { | |
let filterTypes; | |
if (!("filterType" in options) || options.filterType === -1) { | |
filterTypes = [0, 1, 2, 3, 4]; | |
} else if (typeof options.filterType === "number") { | |
filterTypes = [options.filterType]; | |
} else { | |
throw new Error("unrecognised filter types"); | |
} | |
if (options.bitDepth === 16) { | |
bpp *= 2; | |
} | |
let byteWidth = width * bpp; | |
let rawPos = 0; | |
let pxPos = 0; | |
let rawData = Buffer.alloc((byteWidth + 1) * height); | |
let sel = filterTypes[0]; | |
for (let y = 0; y < height; y++) { | |
if (filterTypes.length > 1) { | |
let min = Infinity; | |
for (let i = 0; i < filterTypes.length; i++) { | |
let sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp); | |
if (sum < min) { | |
sel = filterTypes[i]; | |
min = sum; | |
} | |
} | |
} | |
rawData[rawPos] = sel; | |
rawPos++; | |
filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp); | |
rawPos += byteWidth; | |
pxPos += byteWidth; | |
} | |
return rawData; | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./paeth-predictor":15,"buffer":28}],7:[function(require,module,exports){ | |
(function (Buffer){ | |
let util = require("util"); | |
let ChunkStream = require("./chunkstream"); | |
let Filter = require("./filter-parse"); | |
let FilterAsync = (module.exports = function (bitmapInfo) { | |
ChunkStream.call(this); | |
let buffers = []; | |
let that = this; | |
this._filter = new Filter(bitmapInfo, { | |
read: this.read.bind(this), | |
write: function (buffer) { | |
buffers.push(buffer); | |
}, | |
complete: function () { | |
that.emit("complete", Buffer.concat(buffers)); | |
}, | |
}); | |
this._filter.start(); | |
}); | |
util.inherits(FilterAsync, ChunkStream); | |
}).call(this,require("buffer").Buffer); | |
},{"./chunkstream":3,"./filter-parse":9,"buffer":28,"util":67}],8:[function(require,module,exports){ | |
(function (Buffer){ | |
let SyncReader = require("./sync-reader"); | |
let Filter = require("./filter-parse"); | |
exports.process = function (inBuffer, bitmapInfo) { | |
let outBuffers = []; | |
let reader = new SyncReader(inBuffer); | |
let filter = new Filter(bitmapInfo, { | |
read: reader.read.bind(reader), | |
write: function (bufferPart) { | |
outBuffers.push(bufferPart); | |
}, | |
complete: function () {}, | |
}); | |
filter.start(); | |
reader.process(); | |
return Buffer.concat(outBuffers); | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./filter-parse":9,"./sync-reader":22,"buffer":28}],9:[function(require,module,exports){ | |
(function (Buffer){ | |
let interlaceUtils = require("./interlace"); | |
let paethPredictor = require("./paeth-predictor"); | |
function getByteWidth(width, bpp, depth) { | |
let byteWidth = width * bpp; | |
if (depth !== 8) { | |
byteWidth = Math.ceil(byteWidth / (8 / depth)); | |
} | |
return byteWidth; | |
} | |
let Filter = (module.exports = function (bitmapInfo, dependencies) { | |
let width = bitmapInfo.width; | |
let height = bitmapInfo.height; | |
let interlace = bitmapInfo.interlace; | |
let bpp = bitmapInfo.bpp; | |
let depth = bitmapInfo.depth; | |
this.read = dependencies.read; | |
this.write = dependencies.write; | |
this.complete = dependencies.complete; | |
this._imageIndex = 0; | |
this._images = []; | |
if (interlace) { | |
let passes = interlaceUtils.getImagePasses(width, height); | |
for (let i = 0; i < passes.length; i++) { | |
this._images.push({ | |
byteWidth: getByteWidth(passes[i].width, bpp, depth), | |
height: passes[i].height, | |
lineIndex: 0, | |
}); | |
} | |
} else { | |
this._images.push({ | |
byteWidth: getByteWidth(width, bpp, depth), | |
height: height, | |
lineIndex: 0, | |
}); | |
} | |
if (depth === 8) { | |
this._xComparison = bpp; | |
} else if (depth === 16) { | |
this._xComparison = bpp * 2; | |
} else { | |
this._xComparison = 1; | |
} | |
}); | |
Filter.prototype.start = function () { | |
this.read( | |
this._images[this._imageIndex].byteWidth + 1, | |
this._reverseFilterLine.bind(this) | |
); | |
}; | |
Filter.prototype._unFilterType1 = function ( | |
rawData, | |
unfilteredLine, | |
byteWidth | |
) { | |
let xComparison = this._xComparison; | |
let xBiggerThan = xComparison - 1; | |
for (let x = 0; x < byteWidth; x++) { | |
let rawByte = rawData[1 + x]; | |
let f1Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; | |
unfilteredLine[x] = rawByte + f1Left; | |
} | |
}; | |
Filter.prototype._unFilterType2 = function ( | |
rawData, | |
unfilteredLine, | |
byteWidth | |
) { | |
let lastLine = this._lastLine; | |
for (let x = 0; x < byteWidth; x++) { | |
let rawByte = rawData[1 + x]; | |
let f2Up = lastLine ? lastLine[x] : 0; | |
unfilteredLine[x] = rawByte + f2Up; | |
} | |
}; | |
Filter.prototype._unFilterType3 = function ( | |
rawData, | |
unfilteredLine, | |
byteWidth | |
) { | |
let xComparison = this._xComparison; | |
let xBiggerThan = xComparison - 1; | |
let lastLine = this._lastLine; | |
for (let x = 0; x < byteWidth; x++) { | |
let rawByte = rawData[1 + x]; | |
let f3Up = lastLine ? lastLine[x] : 0; | |
let f3Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; | |
let f3Add = Math.floor((f3Left + f3Up) / 2); | |
unfilteredLine[x] = rawByte + f3Add; | |
} | |
}; | |
Filter.prototype._unFilterType4 = function ( | |
rawData, | |
unfilteredLine, | |
byteWidth | |
) { | |
let xComparison = this._xComparison; | |
let xBiggerThan = xComparison - 1; | |
let lastLine = this._lastLine; | |
for (let x = 0; x < byteWidth; x++) { | |
let rawByte = rawData[1 + x]; | |
let f4Up = lastLine ? lastLine[x] : 0; | |
let f4Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; | |
let f4UpLeft = x > xBiggerThan && lastLine ? lastLine[x - xComparison] : 0; | |
let f4Add = paethPredictor(f4Left, f4Up, f4UpLeft); | |
unfilteredLine[x] = rawByte + f4Add; | |
} | |
}; | |
Filter.prototype._reverseFilterLine = function (rawData) { | |
let filter = rawData[0]; | |
let unfilteredLine; | |
let currentImage = this._images[this._imageIndex]; | |
let byteWidth = currentImage.byteWidth; | |
if (filter === 0) { | |
unfilteredLine = rawData.slice(1, byteWidth + 1); | |
} else { | |
unfilteredLine = Buffer.alloc(byteWidth); | |
switch (filter) { | |
case 1: | |
this._unFilterType1(rawData, unfilteredLine, byteWidth); | |
break; | |
case 2: | |
this._unFilterType2(rawData, unfilteredLine, byteWidth); | |
break; | |
case 3: | |
this._unFilterType3(rawData, unfilteredLine, byteWidth); | |
break; | |
case 4: | |
this._unFilterType4(rawData, unfilteredLine, byteWidth); | |
break; | |
default: | |
throw new Error("Unrecognised filter type - " + filter); | |
} | |
} | |
this.write(unfilteredLine); | |
currentImage.lineIndex++; | |
if (currentImage.lineIndex >= currentImage.height) { | |
this._lastLine = null; | |
this._imageIndex++; | |
currentImage = this._images[this._imageIndex]; | |
} else { | |
this._lastLine = unfilteredLine; | |
} | |
if (currentImage) { | |
this.read(currentImage.byteWidth + 1, this._reverseFilterLine.bind(this)); | |
} else { | |
this._lastLine = null; | |
this.complete(); | |
} | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./interlace":11,"./paeth-predictor":15,"buffer":28}],10:[function(require,module,exports){ | |
(function (Buffer){ | |
function dePalette(indata, outdata, width, height, palette) { | |
let pxPos = 0; | |
for (let y = 0; y < height; y++) { | |
for (let x = 0; x < width; x++) { | |
let color = palette[indata[pxPos]]; | |
if (!color) { | |
throw new Error("index " + indata[pxPos] + " not in palette"); | |
} | |
for (let i = 0; i < 4; i++) { | |
outdata[pxPos + i] = color[i]; | |
} | |
pxPos += 4; | |
} | |
} | |
} | |
function replaceTransparentColor(indata, outdata, width, height, transColor) { | |
let pxPos = 0; | |
for (let y = 0; y < height; y++) { | |
for (let x = 0; x < width; x++) { | |
let makeTrans = false; | |
if (transColor.length === 1) { | |
if (transColor[0] === indata[pxPos]) { | |
makeTrans = true; | |
} | |
} else if ( | |
transColor[0] === indata[pxPos] && | |
transColor[1] === indata[pxPos + 1] && | |
transColor[2] === indata[pxPos + 2] | |
) { | |
makeTrans = true; | |
} | |
if (makeTrans) { | |
for (let i = 0; i < 4; i++) { | |
outdata[pxPos + i] = 0; | |
} | |
} | |
pxPos += 4; | |
} | |
} | |
} | |
function scaleDepth(indata, outdata, width, height, depth) { | |
let maxOutSample = 255; | |
let maxInSample = Math.pow(2, depth) - 1; | |
let pxPos = 0; | |
for (let y = 0; y < height; y++) { | |
for (let x = 0; x < width; x++) { | |
for (let i = 0; i < 4; i++) { | |
outdata[pxPos + i] = Math.floor( | |
(indata[pxPos + i] * maxOutSample) / maxInSample + 0.5 | |
); | |
} | |
pxPos += 4; | |
} | |
} | |
} | |
module.exports = function (indata, imageData) { | |
let depth = imageData.depth; | |
let width = imageData.width; | |
let height = imageData.height; | |
let colorType = imageData.colorType; | |
let transColor = imageData.transColor; | |
let palette = imageData.palette; | |
let outdata = indata; | |
if (colorType === 3) { | |
dePalette(indata, outdata, width, height, palette); | |
} else { | |
if (transColor) { | |
replaceTransparentColor(indata, outdata, width, height, transColor); | |
} | |
if (depth !== 8) { | |
if (depth === 16) { | |
outdata = Buffer.alloc(width * height * 4); | |
} | |
scaleDepth(indata, outdata, width, height, depth); | |
} | |
} | |
return outdata; | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"buffer":28}],11:[function(require,module,exports){ | |
let imagePasses = [ | |
{ | |
x: [0], | |
y: [0], | |
}, | |
{ | |
x: [4], | |
y: [0], | |
}, | |
{ | |
x: [0, 4], | |
y: [4], | |
}, | |
{ | |
x: [2, 6], | |
y: [0, 4], | |
}, | |
{ | |
x: [0, 2, 4, 6], | |
y: [2, 6], | |
}, | |
{ | |
x: [1, 3, 5, 7], | |
y: [0, 2, 4, 6], | |
}, | |
{ | |
x: [0, 1, 2, 3, 4, 5, 6, 7], | |
y: [1, 3, 5, 7], | |
}, | |
]; | |
exports.getImagePasses = function (width, height) { | |
let images = []; | |
let xLeftOver = width % 8; | |
let yLeftOver = height % 8; | |
let xRepeats = (width - xLeftOver) / 8; | |
let yRepeats = (height - yLeftOver) / 8; | |
for (let i = 0; i < imagePasses.length; i++) { | |
let pass = imagePasses[i]; | |
let passWidth = xRepeats * pass.x.length; | |
let passHeight = yRepeats * pass.y.length; | |
for (let j = 0; j < pass.x.length; j++) { | |
if (pass.x[j] < xLeftOver) { | |
passWidth++; | |
} else { | |
break; | |
} | |
} | |
for (let j = 0; j < pass.y.length; j++) { | |
if (pass.y[j] < yLeftOver) { | |
passHeight++; | |
} else { | |
break; | |
} | |
} | |
if (passWidth > 0 && passHeight > 0) { | |
images.push({ width: passWidth, height: passHeight, index: i }); | |
} | |
} | |
return images; | |
}; | |
exports.getInterlaceIterator = function (width) { | |
return function (x, y, pass) { | |
let outerXLeftOver = x % imagePasses[pass].x.length; | |
let outerX = | |
((x - outerXLeftOver) / imagePasses[pass].x.length) * 8 + | |
imagePasses[pass].x[outerXLeftOver]; | |
let outerYLeftOver = y % imagePasses[pass].y.length; | |
let outerY = | |
((y - outerYLeftOver) / imagePasses[pass].y.length) * 8 + | |
imagePasses[pass].y[outerYLeftOver]; | |
return outerX * 4 + outerY * width * 4; | |
}; | |
}; | |
},{}],12:[function(require,module,exports){ | |
(function (Buffer){ | |
let util = require("util"); | |
let Stream = require("stream"); | |
let constants = require("./constants"); | |
let Packer = require("./packer"); | |
let PackerAsync = (module.exports = function (opt) { | |
Stream.call(this); | |
let options = opt || {}; | |
this._packer = new Packer(options); | |
this._deflate = this._packer.createDeflate(); | |
this.readable = true; | |
}); | |
util.inherits(PackerAsync, Stream); | |
PackerAsync.prototype.pack = function (data, width, height, gamma) { | |
this.emit("data", Buffer.from(constants.PNG_SIGNATURE)); | |
this.emit("data", this._packer.packIHDR(width, height)); | |
if (gamma) { | |
this.emit("data", this._packer.packGAMA(gamma)); | |
} | |
let filteredData = this._packer.filterData(data, width, height); | |
this._deflate.on("error", this.emit.bind(this, "error")); | |
this._deflate.on( | |
"data", | |
function (compressedData) { | |
this.emit("data", this._packer.packIDAT(compressedData)); | |
}.bind(this) | |
); | |
this._deflate.on( | |
"end", | |
function () { | |
this.emit("data", this._packer.packIEND()); | |
this.emit("end"); | |
}.bind(this) | |
); | |
this._deflate.end(filteredData); | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./constants":4,"./packer":14,"buffer":28,"stream":63,"util":67}],13:[function(require,module,exports){ | |
(function (Buffer){ | |
let hasSyncZlib = true; | |
let zlib = require("zlib"); | |
if (!zlib.deflateSync) { | |
hasSyncZlib = false; | |
} | |
let constants = require("./constants"); | |
let Packer = require("./packer"); | |
module.exports = function (metaData, opt) { | |
if (!hasSyncZlib) { | |
throw new Error( | |
"To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" | |
); | |
} | |
let options = opt || {}; | |
let packer = new Packer(options); | |
let chunks = []; | |
chunks.push(Buffer.from(constants.PNG_SIGNATURE)); | |
chunks.push(packer.packIHDR(metaData.width, metaData.height)); | |
if (metaData.gamma) { | |
chunks.push(packer.packGAMA(metaData.gamma)); | |
} | |
let filteredData = packer.filterData( | |
metaData.data, | |
metaData.width, | |
metaData.height | |
); | |
let compressedData = zlib.deflateSync( | |
filteredData, | |
packer.getDeflateOptions() | |
); | |
filteredData = null; | |
if (!compressedData || !compressedData.length) { | |
throw new Error("bad png - invalid compressed data response"); | |
} | |
chunks.push(packer.packIDAT(compressedData)); | |
chunks.push(packer.packIEND()); | |
return Buffer.concat(chunks); | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./constants":4,"./packer":14,"buffer":28,"zlib":27}],14:[function(require,module,exports){ | |
(function (Buffer){ | |
let constants = require("./constants"); | |
let CrcStream = require("./crc"); | |
let bitPacker = require("./bitpacker"); | |
let filter = require("./filter-pack"); | |
let zlib = require("zlib"); | |
let Packer = (module.exports = function (options) { | |
this._options = options; | |
options.deflateChunkSize = options.deflateChunkSize || 32 * 1024; | |
options.deflateLevel = | |
options.deflateLevel != null ? options.deflateLevel : 9; | |
options.deflateStrategy = | |
options.deflateStrategy != null ? options.deflateStrategy : 3; | |
options.inputHasAlpha = | |
options.inputHasAlpha != null ? options.inputHasAlpha : true; | |
options.deflateFactory = options.deflateFactory || zlib.createDeflate; | |
options.bitDepth = options.bitDepth || 8; | |
options.colorType = | |
typeof options.colorType === "number" | |
? options.colorType | |
: constants.COLORTYPE_COLOR_ALPHA; | |
options.inputColorType = | |
typeof options.inputColorType === "number" | |
? options.inputColorType | |
: constants.COLORTYPE_COLOR_ALPHA; | |
if ( | |
[ | |
constants.COLORTYPE_GRAYSCALE, | |
constants.COLORTYPE_COLOR, | |
constants.COLORTYPE_COLOR_ALPHA, | |
constants.COLORTYPE_ALPHA, | |
].indexOf(options.colorType) === -1 | |
) { | |
throw new Error( | |
"option color type:" + options.colorType + " is not supported at present" | |
); | |
} | |
if ( | |
[ | |
constants.COLORTYPE_GRAYSCALE, | |
constants.COLORTYPE_COLOR, | |
constants.COLORTYPE_COLOR_ALPHA, | |
constants.COLORTYPE_ALPHA, | |
].indexOf(options.inputColorType) === -1 | |
) { | |
throw new Error( | |
"option input color type:" + | |
options.inputColorType + | |
" is not supported at present" | |
); | |
} | |
if (options.bitDepth !== 8 && options.bitDepth !== 16) { | |
throw new Error( | |
"option bit depth:" + options.bitDepth + " is not supported at present" | |
); | |
} | |
}); | |
Packer.prototype.getDeflateOptions = function () { | |
return { | |
chunkSize: this._options.deflateChunkSize, | |
level: this._options.deflateLevel, | |
strategy: this._options.deflateStrategy, | |
}; | |
}; | |
Packer.prototype.createDeflate = function () { | |
return this._options.deflateFactory(this.getDeflateOptions()); | |
}; | |
Packer.prototype.filterData = function (data, width, height) { | |
let packedData = bitPacker(data, width, height, this._options); | |
let bpp = constants.COLORTYPE_TO_BPP_MAP[this._options.colorType]; | |
let filteredData = filter(packedData, width, height, this._options, bpp); | |
return filteredData; | |
}; | |
Packer.prototype._packChunk = function (type, data) { | |
let len = data ? data.length : 0; | |
let buf = Buffer.alloc(len + 12); | |
buf.writeUInt32BE(len, 0); | |
buf.writeUInt32BE(type, 4); | |
if (data) { | |
data.copy(buf, 8); | |
} | |
buf.writeInt32BE( | |
CrcStream.crc32(buf.slice(4, buf.length - 4)), | |
buf.length - 4 | |
); | |
return buf; | |
}; | |
Packer.prototype.packGAMA = function (gamma) { | |
let buf = Buffer.alloc(4); | |
buf.writeUInt32BE(Math.floor(gamma * constants.GAMMA_DIVISION), 0); | |
return this._packChunk(constants.TYPE_gAMA, buf); | |
}; | |
Packer.prototype.packIHDR = function (width, height) { | |
let buf = Buffer.alloc(13); | |
buf.writeUInt32BE(width, 0); | |
buf.writeUInt32BE(height, 4); | |
buf[8] = this._options.bitDepth; | |
buf[9] = this._options.colorType; | |
buf[10] = 0; | |
buf[11] = 0; | |
buf[12] = 0; | |
return this._packChunk(constants.TYPE_IHDR, buf); | |
}; | |
Packer.prototype.packIDAT = function (data) { | |
return this._packChunk(constants.TYPE_IDAT, data); | |
}; | |
Packer.prototype.packIEND = function () { | |
return this._packChunk(constants.TYPE_IEND, null); | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./bitpacker":2,"./constants":4,"./crc":5,"./filter-pack":6,"buffer":28,"zlib":27}],15:[function(require,module,exports){ | |
module.exports = function paethPredictor(left, above, upLeft) { | |
let paeth = left + above - upLeft; | |
let pLeft = Math.abs(paeth - left); | |
let pAbove = Math.abs(paeth - above); | |
let pUpLeft = Math.abs(paeth - upLeft); | |
if (pLeft <= pAbove && pLeft <= pUpLeft) { | |
return left; | |
} | |
if (pAbove <= pUpLeft) { | |
return above; | |
} | |
return upLeft; | |
}; | |
},{}],16:[function(require,module,exports){ | |
let util = require("util"); | |
let zlib = require("zlib"); | |
let ChunkStream = require("./chunkstream"); | |
let FilterAsync = require("./filter-parse-async"); | |
let Parser = require("./parser"); | |
let bitmapper = require("./bitmapper"); | |
let formatNormaliser = require("./format-normaliser"); | |
let ParserAsync = (module.exports = function (options) { | |
ChunkStream.call(this); | |
this._parser = new Parser(options, { | |
read: this.read.bind(this), | |
error: this._handleError.bind(this), | |
metadata: this._handleMetaData.bind(this), | |
gamma: this.emit.bind(this, "gamma"), | |
palette: this._handlePalette.bind(this), | |
transColor: this._handleTransColor.bind(this), | |
finished: this._finished.bind(this), | |
inflateData: this._inflateData.bind(this), | |
simpleTransparency: this._simpleTransparency.bind(this), | |
headersFinished: this._headersFinished.bind(this), | |
}); | |
this._options = options; | |
this.writable = true; | |
this._parser.start(); | |
}); | |
util.inherits(ParserAsync, ChunkStream); | |
ParserAsync.prototype._handleError = function (err) { | |
this.emit("error", err); | |
this.writable = false; | |
this.destroy(); | |
if (this._inflate && this._inflate.destroy) { | |
this._inflate.destroy(); | |
} | |
if (this._filter) { | |
this._filter.destroy(); | |
this._filter.on("error", function () {}); | |
} | |
this.errord = true; | |
}; | |
ParserAsync.prototype._inflateData = function (data) { | |
if (!this._inflate) { | |
if (this._bitmapInfo.interlace) { | |
this._inflate = zlib.createInflate(); | |
this._inflate.on("error", this.emit.bind(this, "error")); | |
this._filter.on("complete", this._complete.bind(this)); | |
this._inflate.pipe(this._filter); | |
} else { | |
let rowSize = | |
((this._bitmapInfo.width * | |
this._bitmapInfo.bpp * | |
this._bitmapInfo.depth + | |
7) >> | |
3) + | |
1; | |
let imageSize = rowSize * this._bitmapInfo.height; | |
let chunkSize = Math.max(imageSize, zlib.Z_MIN_CHUNK); | |
this._inflate = zlib.createInflate({ chunkSize: chunkSize }); | |
let leftToInflate = imageSize; | |
let emitError = this.emit.bind(this, "error"); | |
this._inflate.on("error", function (err) { | |
if (!leftToInflate) { | |
return; | |
} | |
emitError(err); | |
}); | |
this._filter.on("complete", this._complete.bind(this)); | |
let filterWrite = this._filter.write.bind(this._filter); | |
this._inflate.on("data", function (chunk) { | |
if (!leftToInflate) { | |
return; | |
} | |
if (chunk.length > leftToInflate) { | |
chunk = chunk.slice(0, leftToInflate); | |
} | |
leftToInflate -= chunk.length; | |
filterWrite(chunk); | |
}); | |
this._inflate.on("end", this._filter.end.bind(this._filter)); | |
} | |
} | |
this._inflate.write(data); | |
}; | |
ParserAsync.prototype._handleMetaData = function (metaData) { | |
this._metaData = metaData; | |
this._bitmapInfo = Object.create(metaData); | |
this._filter = new FilterAsync(this._bitmapInfo); | |
}; | |
ParserAsync.prototype._handleTransColor = function (transColor) { | |
this._bitmapInfo.transColor = transColor; | |
}; | |
ParserAsync.prototype._handlePalette = function (palette) { | |
this._bitmapInfo.palette = palette; | |
}; | |
ParserAsync.prototype._simpleTransparency = function () { | |
this._metaData.alpha = true; | |
}; | |
ParserAsync.prototype._headersFinished = function () { | |
this.emit("metadata", this._metaData); | |
}; | |
ParserAsync.prototype._finished = function () { | |
if (this.errord) { | |
return; | |
} | |
if (!this._inflate) { | |
this.emit("error", "No Inflate block"); | |
} else { | |
this._inflate.end(); | |
} | |
}; | |
ParserAsync.prototype._complete = function (filteredData) { | |
if (this.errord) { | |
return; | |
} | |
let normalisedBitmapData; | |
try { | |
let bitmapData = bitmapper.dataToBitMap(filteredData, this._bitmapInfo); | |
normalisedBitmapData = formatNormaliser(bitmapData, this._bitmapInfo); | |
bitmapData = null; | |
} catch (ex) { | |
this._handleError(ex); | |
return; | |
} | |
this.emit("parsed", normalisedBitmapData); | |
}; | |
},{"./bitmapper":1,"./chunkstream":3,"./filter-parse-async":7,"./format-normaliser":10,"./parser":18,"util":67,"zlib":27}],17:[function(require,module,exports){ | |
(function (Buffer){ | |
let hasSyncZlib = true; | |
let zlib = require("zlib"); | |
let inflateSync = require("./sync-inflate"); | |
if (!zlib.deflateSync) { | |
hasSyncZlib = false; | |
} | |
let SyncReader = require("./sync-reader"); | |
let FilterSync = require("./filter-parse-sync"); | |
let Parser = require("./parser"); | |
let bitmapper = require("./bitmapper"); | |
let formatNormaliser = require("./format-normaliser"); | |
module.exports = function (buffer, options) { | |
if (!hasSyncZlib) { | |
throw new Error( | |
"To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" | |
); | |
} | |
let err; | |
function handleError(_err_) { | |
err = _err_; | |
} | |
let metaData; | |
function handleMetaData(_metaData_) { | |
metaData = _metaData_; | |
} | |
function handleTransColor(transColor) { | |
metaData.transColor = transColor; | |
} | |
function handlePalette(palette) { | |
metaData.palette = palette; | |
} | |
function handleSimpleTransparency() { | |
metaData.alpha = true; | |
} | |
let gamma; | |
function handleGamma(_gamma_) { | |
gamma = _gamma_; | |
} | |
let inflateDataList = []; | |
function handleInflateData(inflatedData) { | |
inflateDataList.push(inflatedData); | |
} | |
let reader = new SyncReader(buffer); | |
let parser = new Parser(options, { | |
read: reader.read.bind(reader), | |
error: handleError, | |
metadata: handleMetaData, | |
gamma: handleGamma, | |
palette: handlePalette, | |
transColor: handleTransColor, | |
inflateData: handleInflateData, | |
simpleTransparency: handleSimpleTransparency, | |
}); | |
parser.start(); | |
reader.process(); | |
if (err) { | |
throw err; | |
} | |
let inflateData = Buffer.concat(inflateDataList); | |
inflateDataList.length = 0; | |
let inflatedData; | |
if (metaData.interlace) { | |
inflatedData = zlib.inflateSync(inflateData); | |
} else { | |
let rowSize = | |
((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1; | |
let imageSize = rowSize * metaData.height; | |
inflatedData = inflateSync(inflateData, { | |
chunkSize: imageSize, | |
maxLength: imageSize, | |
}); | |
} | |
inflateData = null; | |
if (!inflatedData || !inflatedData.length) { | |
throw new Error("bad png - invalid inflate data response"); | |
} | |
let unfilteredData = FilterSync.process(inflatedData, metaData); | |
inflateData = null; | |
let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData); | |
unfilteredData = null; | |
let normalisedBitmapData = formatNormaliser(bitmapData, metaData); | |
metaData.data = normalisedBitmapData; | |
metaData.gamma = gamma || 0; | |
return metaData; | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./bitmapper":1,"./filter-parse-sync":8,"./format-normaliser":10,"./parser":18,"./sync-inflate":21,"./sync-reader":22,"buffer":28,"zlib":27}],18:[function(require,module,exports){ | |
(function (Buffer){ | |
let constants = require("./constants"); | |
let CrcCalculator = require("./crc"); | |
let Parser = (module.exports = function (options, dependencies) { | |
this._options = options; | |
options.checkCRC = options.checkCRC !== false; | |
this._hasIHDR = false; | |
this._hasIEND = false; | |
this._emittedHeadersFinished = false; | |
this._palette = []; | |
this._colorType = 0; | |
this._chunks = {}; | |
this._chunks[constants.TYPE_IHDR] = this._handleIHDR.bind(this); | |
this._chunks[constants.TYPE_IEND] = this._handleIEND.bind(this); | |
this._chunks[constants.TYPE_IDAT] = this._handleIDAT.bind(this); | |
this._chunks[constants.TYPE_PLTE] = this._handlePLTE.bind(this); | |
this._chunks[constants.TYPE_tRNS] = this._handleTRNS.bind(this); | |
this._chunks[constants.TYPE_gAMA] = this._handleGAMA.bind(this); | |
this.read = dependencies.read; | |
this.error = dependencies.error; | |
this.metadata = dependencies.metadata; | |
this.gamma = dependencies.gamma; | |
this.transColor = dependencies.transColor; | |
this.palette = dependencies.palette; | |
this.parsed = dependencies.parsed; | |
this.inflateData = dependencies.inflateData; | |
this.finished = dependencies.finished; | |
this.simpleTransparency = dependencies.simpleTransparency; | |
this.headersFinished = dependencies.headersFinished || function () {}; | |
}); | |
Parser.prototype.start = function () { | |
this.read(constants.PNG_SIGNATURE.length, this._parseSignature.bind(this)); | |
}; | |
Parser.prototype._parseSignature = function (data) { | |
let signature = constants.PNG_SIGNATURE; | |
for (let i = 0; i < signature.length; i++) { | |
if (data[i] !== signature[i]) { | |
this.error(new Error("Invalid file signature")); | |
return; | |
} | |
} | |
this.read(8, this._parseChunkBegin.bind(this)); | |
}; | |
Parser.prototype._parseChunkBegin = function (data) { | |
let length = data.readUInt32BE(0); | |
let type = data.readUInt32BE(4); | |
let name = ""; | |
for (let i = 4; i < 8; i++) { | |
name += String.fromCharCode(data[i]); | |
} | |
let ancillary = Boolean(data[4] & 0x20); | |
if (!this._hasIHDR && type !== constants.TYPE_IHDR) { | |
this.error(new Error("Expected IHDR on beggining")); | |
return; | |
} | |
this._crc = new CrcCalculator(); | |
this._crc.write(Buffer.from(name)); | |
if (this._chunks[type]) { | |
return this._chunks[type](length); | |
} | |
if (!ancillary) { | |
this.error(new Error("Unsupported critical chunk type " + name)); | |
return; | |
} | |
this.read(length + 4, this._skipChunk.bind(this)); | |
}; | |
Parser.prototype._skipChunk = function () { | |
this.read(8, this._parseChunkBegin.bind(this)); | |
}; | |
Parser.prototype._handleChunkEnd = function () { | |
this.read(4, this._parseChunkEnd.bind(this)); | |
}; | |
Parser.prototype._parseChunkEnd = function (data) { | |
let fileCrc = data.readInt32BE(0); | |
let calcCrc = this._crc.crc32(); | |
if (this._options.checkCRC && calcCrc !== fileCrc) { | |
this.error(new Error("Crc error - " + fileCrc + " - " + calcCrc)); | |
return; | |
} | |
if (!this._hasIEND) { | |
this.read(8, this._parseChunkBegin.bind(this)); | |
} | |
}; | |
Parser.prototype._handleIHDR = function (length) { | |
this.read(length, this._parseIHDR.bind(this)); | |
}; | |
Parser.prototype._parseIHDR = function (data) { | |
this._crc.write(data); | |
let width = data.readUInt32BE(0); | |
let height = data.readUInt32BE(4); | |
let depth = data[8]; | |
let colorType = data[9]; | |
let compr = data[10]; | |
let filter = data[11]; | |
let interlace = data[12]; | |
if ( | |
depth !== 8 && | |
depth !== 4 && | |
depth !== 2 && | |
depth !== 1 && | |
depth !== 16 | |
) { | |
this.error(new Error("Unsupported bit depth " + depth)); | |
return; | |
} | |
if (!(colorType in constants.COLORTYPE_TO_BPP_MAP)) { | |
this.error(new Error("Unsupported color type")); | |
return; | |
} | |
if (compr !== 0) { | |
this.error(new Error("Unsupported compression method")); | |
return; | |
} | |
if (filter !== 0) { | |
this.error(new Error("Unsupported filter method")); | |
return; | |
} | |
if (interlace !== 0 && interlace !== 1) { | |
this.error(new Error("Unsupported interlace method")); | |
return; | |
} | |
this._colorType = colorType; | |
let bpp = constants.COLORTYPE_TO_BPP_MAP[this._colorType]; | |
this._hasIHDR = true; | |
this.metadata({ | |
width: width, | |
height: height, | |
depth: depth, | |
interlace: Boolean(interlace), | |
palette: Boolean(colorType & constants.COLORTYPE_PALETTE), | |
color: Boolean(colorType & constants.COLORTYPE_COLOR), | |
alpha: Boolean(colorType & constants.COLORTYPE_ALPHA), | |
bpp: bpp, | |
colorType: colorType, | |
}); | |
this._handleChunkEnd(); | |
}; | |
Parser.prototype._handlePLTE = function (length) { | |
this.read(length, this._parsePLTE.bind(this)); | |
}; | |
Parser.prototype._parsePLTE = function (data) { | |
this._crc.write(data); | |
let entries = Math.floor(data.length / 3); | |
for (let i = 0; i < entries; i++) { | |
this._palette.push([data[i * 3], data[i * 3 + 1], data[i * 3 + 2], 0xff]); | |
} | |
this.palette(this._palette); | |
this._handleChunkEnd(); | |
}; | |
Parser.prototype._handleTRNS = function (length) { | |
this.simpleTransparency(); | |
this.read(length, this._parseTRNS.bind(this)); | |
}; | |
Parser.prototype._parseTRNS = function (data) { | |
this._crc.write(data); | |
if (this._colorType === constants.COLORTYPE_PALETTE_COLOR) { | |
if (this._palette.length === 0) { | |
this.error(new Error("Transparency chunk must be after palette")); | |
return; | |
} | |
if (data.length > this._palette.length) { | |
this.error(new Error("More transparent colors than palette size")); | |
return; | |
} | |
for (let i = 0; i < data.length; i++) { | |
this._palette[i][3] = data[i]; | |
} | |
this.palette(this._palette); | |
} | |
if (this._colorType === constants.COLORTYPE_GRAYSCALE) { | |
this.transColor([data.readUInt16BE(0)]); | |
} | |
if (this._colorType === constants.COLORTYPE_COLOR) { | |
this.transColor([ | |
data.readUInt16BE(0), | |
data.readUInt16BE(2), | |
data.readUInt16BE(4), | |
]); | |
} | |
this._handleChunkEnd(); | |
}; | |
Parser.prototype._handleGAMA = function (length) { | |
this.read(length, this._parseGAMA.bind(this)); | |
}; | |
Parser.prototype._parseGAMA = function (data) { | |
this._crc.write(data); | |
this.gamma(data.readUInt32BE(0) / constants.GAMMA_DIVISION); | |
this._handleChunkEnd(); | |
}; | |
Parser.prototype._handleIDAT = function (length) { | |
if (!this._emittedHeadersFinished) { | |
this._emittedHeadersFinished = true; | |
this.headersFinished(); | |
} | |
this.read(-length, this._parseIDAT.bind(this, length)); | |
}; | |
Parser.prototype._parseIDAT = function (length, data) { | |
this._crc.write(data); | |
if ( | |
this._colorType === constants.COLORTYPE_PALETTE_COLOR && | |
this._palette.length === 0 | |
) { | |
throw new Error("Expected palette not found"); | |
} | |
this.inflateData(data); | |
let leftOverLength = length - data.length; | |
if (leftOverLength > 0) { | |
this._handleIDAT(leftOverLength); | |
} else { | |
this._handleChunkEnd(); | |
} | |
}; | |
Parser.prototype._handleIEND = function (length) { | |
this.read(length, this._parseIEND.bind(this)); | |
}; | |
Parser.prototype._parseIEND = function (data) { | |
this._crc.write(data); | |
this._hasIEND = true; | |
this._handleChunkEnd(); | |
if (this.finished) { | |
this.finished(); | |
} | |
}; | |
}).call(this,require("buffer").Buffer); | |
},{"./constants":4,"./crc":5,"buffer":28}],19:[function(require,module,exports){ | |
let parse = require("./parser-sync"); | |
let pack = require("./packer-sync"); | |
exports.read = function (buffer, options) { | |
return parse(buffer, options || {}); | |
}; | |
exports.write = function (png, options) { | |
return pack(png, options); | |
}; | |
},{"./packer-sync":13,"./parser-sync":17}],20:[function(require,module,exports){ | |
(function (process,Buffer){ | |
let util = require("util"); | |
let Stream = require("stream"); | |
let Parser = require("./parser-async"); | |
let Packer = require("./packer-async"); | |
let PNGSync = require("./png-sync"); | |
let PNG = (exports.PNG = function (options) { | |
Stream.call(this); | |
options = options || {}; | |
this.width = options.width | 0; | |
this.height = options.height | 0; | |
this.data = | |
this.width > 0 && this.height > 0 | |
? Buffer.alloc(4 * this.width * this.height) | |
: null; | |
if (options.fill && this.data) { | |
this.data.fill(0); | |
} | |
this.gamma = 0; | |
this.readable = this.writable = true; | |
this._parser = new Parser(options); | |
this._parser.on("error", this.emit.bind(this, "error")); | |
this._parser.on("close", this._handleClose.bind(this)); | |
this._parser.on("metadata", this._metadata.bind(this)); | |
this._parser.on("gamma", this._gamma.bind(this)); | |
this._parser.on( | |
"parsed", | |
function (data) { | |
this.data = data; | |
this.emit("parsed", data); | |
}.bind(this) | |
); | |
this._packer = new Packer(options); | |
this._packer.on("data", this.emit.bind(this, "data")); | |
this._packer.on("end", this.emit.bind(this, "end")); | |
this._parser.on("close", this._handleClose.bind(this)); | |
this._packer.on("error", this.emit.bind(this, "error")); | |
}); | |
util.inherits(PNG, Stream); | |
PNG.sync = PNGSync; | |
PNG.prototype.pack = function () { | |
if (!this.data || !this.data.length) { | |
this.emit("error", "No data provided"); | |
return this; | |
} | |
process.nextTick( | |
function () { | |
this._packer.pack(this.data, this.width, this.height, this.gamma); | |
}.bind(this) | |
); | |
return this; | |
}; | |
PNG.prototype.parse = function (data, callback) { | |
if (callback) { | |
let onParsed, onError; | |
onParsed = function (parsedData) { | |
this.removeListener("error", onError); | |
this.data = parsedData; | |
callback(null, this); | |
}.bind(this); | |
onError = function (err) { | |
this.removeListener("parsed", onParsed); | |
callback(err, null); | |
}.bind(this); | |
this.once("parsed", onParsed); | |
this.once("error", onError); | |
} | |
this.end(data); | |
return this; | |
}; | |
PNG.prototype.write = function (data) { | |
this._parser.write(data); | |
return true; | |
}; | |
PNG.prototype.end = function (data) { | |
this._parser.end(data); | |
}; | |
PNG.prototype._metadata = function (metadata) { | |
this.width = metadata.width; | |
this.height = metadata.height; | |
this.emit("metadata", metadata); | |
}; | |
PNG.prototype._gamma = function (gamma) { | |
this.gamma = gamma; | |
}; | |
PNG.prototype._handleClose = function () { | |
if (!this._parser.writable && !this._packer.readable) { | |
this.emit("close"); | |
} | |
}; | |
PNG.bitblt = function (src, dst, srcX, srcY, width, height, deltaX, deltaY) { | |
srcX |= 0; | |
srcY |= 0; | |
width |= 0; | |
height |= 0; | |
deltaX |= 0; | |
deltaY |= 0; | |
if ( | |
srcX > src.width || | |
srcY > src.height || | |
srcX + width > src.width || | |
srcY + height > src.height | |
) { | |
throw new Error("bitblt reading outside image"); | |
} | |
if ( | |
deltaX > dst.width || | |
deltaY > dst.height || | |
deltaX + width > dst.width || | |
deltaY + height > dst.height | |
) { | |
throw new Error("bitblt writing outside image"); | |
} | |
for (let y = 0; y < height; y++) { | |
src.data.copy( | |
dst.data, | |
((deltaY + y) * dst.width + deltaX) << 2, | |
((srcY + y) * src.width + srcX) << 2, | |
((srcY + y) * src.width + srcX + width) << 2 | |
); | |
} | |
}; | |
PNG.prototype.bitblt = function ( | |
dst, | |
srcX, | |
srcY, | |
width, | |
height, | |
deltaX, | |
deltaY | |
) { | |
PNG.bitblt(this, dst, srcX, srcY, width, height, deltaX, deltaY); | |
return this; | |
}; | |
PNG.adjustGamma = function (src) { | |
if (src.gamma) { | |
for (let y = 0; y < src.height; y++) { | |
for (let x = 0; x < src.width; x++) { | |
let idx = (src.width * y + x) << 2; | |
for (let i = 0; i < 3; i++) { | |
let sample = src.data[idx + i] / 255; | |
sample = Math.pow(sample, 1 / 2.2 / src.gamma); | |
src.data[idx + i] = Math.round(sample * 255); | |
} | |
} | |
} | |
src.gamma = 0; | |
} | |
}; | |
PNG.prototype.adjustGamma = function () { | |
PNG.adjustGamma(this); | |
}; | |
}).call(this,require('_process'),require("buffer").Buffer); | |
},{"./packer-async":12,"./parser-async":16,"./png-sync":19,"_process":47,"buffer":28,"stream":63,"util":67}],21:[function(require,module,exports){ | |
(function (process,Buffer){ | |
let assert = require("assert").ok; | |
let zlib = require("zlib"); | |
let util = require("util"); | |
let kMaxLength = require("buffer").kMaxLength; | |
function Inflate(opts) { | |
if (!(this instanceof Inflate)) { | |
return new Inflate(opts); | |
} | |
if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) { | |
opts.chunkSize = zlib.Z_MIN_CHUNK; | |
} | |
zlib.Inflate.call(this, opts); | |
this._offset = this._offset === undefined ? this._outOffset : this._offset; | |
this._buffer = this._buffer || this._outBuffer; | |
if (opts && opts.maxLength != null) { | |
this._maxLength = opts.maxLength; | |
} | |
} | |
function createInflate(opts) { | |
return new Inflate(opts); | |
} | |
function _close(engine, callback) { | |
if (callback) { | |
process.nextTick(callback); | |
} | |
if (!engine._handle) { | |
return; | |
} | |
engine._handle.close(); | |
engine._handle = null; | |
} | |
Inflate.prototype._processChunk = function (chunk, flushFlag, asyncCb) { | |
if (typeof asyncCb === "function") { | |
return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb); | |
} | |
let self = this; | |
let availInBefore = chunk && chunk.length; | |
let availOutBefore = this._chunkSize - this._offset; | |
let leftToInflate = this._maxLength; | |
let inOff = 0; | |
let buffers = []; | |
let nread = 0; | |
let error; | |
this.on("error", function (err) { | |
error = err; | |
}); | |
function handleChunk(availInAfter, availOutAfter) { | |
if (self._hadError) { | |
return; | |
} | |
let have = availOutBefore - availOutAfter; | |
assert(have >= 0, "have should not go down"); | |
if (have > 0) { | |
let out = self._buffer.slice(self._offset, self._offset + have); | |
self._offset += have; | |
if (out.length > leftToInflate) { | |
out = out.slice(0, leftToInflate); | |
} | |
buffers.push(out); | |
nread += out.length; | |
leftToInflate -= out.length; | |
if (leftToInflate === 0) { | |
return false; | |
} | |
} | |
if (availOutAfter === 0 || self._offset >= self._chunkSize) { | |
availOutBefore = self._chunkSize; | |
self._offset = 0; | |
self._buffer = Buffer.allocUnsafe(self._chunkSize); | |
} | |
if (availOutAfter === 0) { | |
inOff += availInBefore - availInAfter; | |
availInBefore = availInAfter; | |
return true; | |
} | |
return false; | |
} | |
assert(this._handle, "zlib binding closed"); | |
let res; | |
do { | |
res = this._handle.writeSync( | |
flushFlag, | |
chunk, | |
inOff, | |
availInBefore, | |
this._buffer, | |
this._offset, | |
availOutBefore | |
); | |
res = res || this._writeState; | |
} while (!this._hadError && handleChunk(res[0], res[1])); | |
if (this._hadError) { | |
throw error; | |
} | |
if (nread >= kMaxLength) { | |
_close(this); | |
throw new RangeError( | |
"Cannot create final Buffer. It would be larger than 0x" + | |
kMaxLength.toString(16) + | |
" bytes" | |
); | |
} | |
let buf = Buffer.concat(buffers, nread); | |
_close(this); | |
return buf; | |
}; | |
util.inherits(Inflate, zlib.Inflate); | |
function zlibBufferSync(engine, buffer) { | |
if (typeof buffer === "string") { | |
buffer = Buffer.from(buffer); | |
} | |
if (!(buffer instanceof Buffer)) { | |
throw new TypeError("Not a string or buffer"); | |
} | |
let flushFlag = engine._finishFlushFlag; | |
if (flushFlag == null) { | |
flushFlag = zlib.Z_FINISH; | |
} | |
return engine._processChunk(buffer, flushFlag); | |
} | |
function inflateSync(buffer, opts) { | |
return zlibBufferSync(new Inflate(opts), buffer); | |
} | |
module.exports = exports = inflateSync; | |
exports.Inflate = Inflate; | |
exports.createInflate = createInflate; | |
exports.inflateSync = inflateSync; | |
}).call(this,require('_process'),require("buffer").Buffer); | |
},{"_process":47,"assert":23,"buffer":28,"util":67,"zlib":27}],22:[function(require,module,exports){ | |
let SyncReader = (module.exports = function (buffer) { | |
this._buffer = buffer; | |
this._reads = []; | |
}); | |
SyncReader.prototype.read = function (length, callback) { | |
this._reads.push({ | |
length: Math.abs(length), | |
allowLess: length < 0, | |
func: callback, | |
}); | |
}; | |
SyncReader.prototype.process = function () { | |
while (this._reads.length > 0 && this._buffer.length) { | |
let read = this._reads[0]; | |
if ( | |
this._buffer.length && | |
(this._buffer.length >= read.length || read.allowLess) | |
) { | |
this._reads.shift(); | |
let buf = this._buffer; | |
this._buffer = buf.slice(read.length); | |
read.func.call(this, buf.slice(0, read.length)); | |
} else { | |
break; | |
} | |
} | |
if (this._reads.length > 0) { | |
return new Error("There are some read requests waitng on finished stream"); | |
} | |
if (this._buffer.length > 0) { | |
return new Error("unrecognised content at end of stream"); | |
} | |
}; | |
},{}],23:[function(require,module,exports){ | |
(function (global){ | |
/*! | |
* The buffer module from node.js, for the browser. | |
* | |
* @author Feross Aboukhadijeh <[email protected]> <http://feross.org> | |
* @license MIT | |
*/ | |
function compare(a, b) { | |
if (a === b) { | |
return 0; | |
} | |
var x = a.length; | |
var y = b.length; | |
for (var i = 0, len = Math.min(x, y); i < len; ++i) { | |
if (a[i] !== b[i]) { | |
x = a[i]; | |
y = b[i]; | |
break; | |
} | |
} | |
if (x < y) { | |
return -1; | |
} | |
if (y < x) { | |
return 1; | |
} | |
return 0; | |
} | |
function isBuffer(b) { | |
if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { | |
return global.Buffer.isBuffer(b); | |
} | |
return !!(b != null && b._isBuffer); | |
} | |
var util = require('util/'); | |
var hasOwn = Object.prototype.hasOwnProperty; | |
var pSlice = Array.prototype.slice; | |
var functionsHaveNames = (function () { | |
return function foo() {}.name === 'foo'; | |
}()); | |
function pToString (obj) { | |
return Object.prototype.toString.call(obj); | |
} | |
function isView(arrbuf) { | |
if (isBuffer(arrbuf)) { | |
return false; | |
} | |
if (typeof global.ArrayBuffer !== 'function') { | |
return false; | |
} | |
if (typeof ArrayBuffer.isView === 'function') { | |
return ArrayBuffer.isView(arrbuf); | |
} | |
if (!arrbuf) { | |
return false; | |
} | |
if (arrbuf instanceof DataView) { | |
return true; | |
} | |
if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { | |
return true; | |
} | |
return false; | |
} | |
var assert = module.exports = ok; | |
var regex = /\s*function\s+([^\(\s]*)\s*/; | |
function getName(func) { | |
if (!util.isFunction(func)) { | |
return; | |
} | |
if (functionsHaveNames) { | |
return func.name; | |
} | |
var str = func.toString(); | |
var match = str.match(regex); | |
return match && match[1]; | |
} | |
assert.AssertionError = function AssertionError(options) { | |
this.name = 'AssertionError'; | |
this.actual = options.actual; | |
this.expected = options.expected; | |
this.operator = options.operator; | |
if (options.message) { | |
this.message = options.message; | |
this.generatedMessage = false; | |
} else { | |
this.message = getMessage(this); | |
this.generatedMessage = true; | |
} | |
var stackStartFunction = options.stackStartFunction || fail; | |
if (Error.captureStackTrace) { | |
Error.captureStackTrace(this, stackStartFunction); | |
} else { | |
var err = new Error(); | |
if (err.stack) { | |
var out = err.stack; | |
var fn_name = getName(stackStartFunction); | |
var idx = out.indexOf('\n' + fn_name); | |
if (idx >= 0) { | |
var next_line = out.indexOf('\n', idx + 1); | |
out = out.substring(next_line + 1); | |
} | |
this.stack = out; | |
} | |
} | |
}; | |
util.inherits(assert.AssertionError, Error); | |
function truncate(s, n) { | |
if (typeof s === 'string') { | |
return s.length < n ? s : s.slice(0, n); | |
} else { | |
return s; | |
} | |
} | |
function inspect(something) { | |
if (functionsHaveNames || !util.isFunction(something)) { | |
return util.inspect(something); | |
} | |
var rawname = getName(something); | |
var name = rawname ? ': ' + rawname : ''; | |
return '[Function' + name + ']'; | |
} | |
function getMessage(self) { | |
return truncate(inspect(self.actual), 128) + ' ' + | |
self.operator + ' ' + | |
truncate(inspect(self.expected), 128); | |
} | |
function fail(actual, expected, message, operator, stackStartFunction) { | |
throw new assert.AssertionError({ | |
message: message, | |
actual: actual, | |
expected: expected, | |
operator: operator, | |
stackStartFunction: stackStartFunction | |
}); | |
} | |
assert.fail = fail; | |
function ok(value, message) { | |
if (!value) fail(value, true, message, '==', assert.ok); | |
} | |
assert.ok = ok; | |
assert.equal = function equal(actual, expected, message) { | |
if (actual != expected) fail(actual, expected, message, '==', assert.equal); | |
}; | |
assert.notEqual = function notEqual(actual, expected, message) { | |
if (actual == expected) { | |
fail(actual, expected, message, '!=', assert.notEqual); | |
} | |
}; | |
assert.deepEqual = function deepEqual(actual, expected, message) { | |
if (!_deepEqual(actual, expected, false)) { | |
fail(actual, expected, message, 'deepEqual', assert.deepEqual); | |
} | |
}; | |
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { | |
if (!_deepEqual(actual, expected, true)) { | |
fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); | |
} | |
}; | |
function _deepEqual(actual, expected, strict, memos) { | |
if (actual === expected) { | |
return true; | |
} else if (isBuffer(actual) && isBuffer(expected)) { | |
return compare(actual, expected) === 0; | |
} else if (util.isDate(actual) && util.isDate(expected)) { | |
return actual.getTime() === expected.getTime(); | |
} else if (util.isRegExp(actual) && util.isRegExp(expected)) { | |
return actual.source === expected.source && | |
actual.global === expected.global && | |
actual.multiline === expected.multiline && | |
actual.lastIndex === expected.lastIndex && | |
actual.ignoreCase === expected.ignoreCase; | |
} else if ((actual === null || typeof actual !== 'object') && | |
(expected === null || typeof expected !== 'object')) { | |
return strict ? actual === expected : actual == expected; | |
} else if (isView(actual) && isView(expected) && | |
pToString(actual) === pToString(expected) && | |
!(actual instanceof Float32Array || | |
actual instanceof Float64Array)) { | |
return compare(new Uint8Array(actual.buffer), | |
new Uint8Array(expected.buffer)) === 0; | |
} else if (isBuffer(actual) !== isBuffer(expected)) { | |
return false; | |
} else { | |
memos = memos || {actual: [], expected: []}; | |
var actualIndex = memos.actual.indexOf(actual); | |
if (actualIndex !== -1) { | |
if (actualIndex === memos.expected.indexOf(expected)) { | |
return true; | |
} | |
} | |
memos.actual.push(actual); | |
memos.expected.push(expected); | |
return objEquiv(actual, expected, strict, memos); | |
} | |
} | |
function isArguments(object) { | |
return Object.prototype.toString.call(object) == '[object Arguments]'; | |
} | |
function objEquiv(a, b, strict, actualVisitedObjects) { | |
if (a === null || a === undefined || b === null || b === undefined) | |
return false; | |
if (util.isPrimitive(a) || util.isPrimitive(b)) | |
return a === b; | |
if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) | |
return false; | |
var aIsArgs = isArguments(a); | |
var bIsArgs = isArguments(b); | |
if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) | |
return false; | |
if (aIsArgs) { | |
a = pSlice.call(a); | |
b = pSlice.call(b); | |
return _deepEqual(a, b, strict); | |
} | |
var ka = objectKeys(a); | |
var kb = objectKeys(b); | |
var key, i; | |
if (ka.length !== kb.length) | |
return false; | |
ka.sort(); | |
kb.sort(); | |
for (i = ka.length - 1; i >= 0; i--) { | |
if (ka[i] !== kb[i]) | |
return false; | |
} | |
for (i = ka.length - 1; i >= 0; i--) { | |
key = ka[i]; | |
if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) | |
return false; | |
} | |
return true; | |
} | |
assert.notDeepEqual = function notDeepEqual(actual, expected, message) { | |
if (_deepEqual(actual, expected, false)) { | |
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); | |
} | |
}; | |
assert.notDeepStrictEqual = notDeepStrictEqual; | |
function notDeepStrictEqual(actual, expected, message) { | |
if (_deepEqual(actual, expected, true)) { | |
fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); | |
} | |
} | |
assert.strictEqual = function strictEqual(actual, expected, message) { | |
if (actual !== expected) { | |
fail(actual, expected, message, '===', assert.strictEqual); | |
} | |
}; | |
assert.notStrictEqual = function notStrictEqual(actual, expected, message) { | |
if (actual === expected) { | |
fail(actual, expected, message, '!==', assert.notStrictEqual); | |
} | |
}; | |
function expectedException(actual, expected) { | |
if (!actual || !expected) { | |
return false; | |
} | |
if (Object.prototype.toString.call(expected) == '[object RegExp]') { | |
return expected.test(actual); | |
} | |
try { | |
if (actual instanceof expected) { | |
return true; | |
} | |
} catch (e) { | |
} | |
if (Error.isPrototypeOf(expected)) { | |
return false; | |
} | |
return expected.call({}, actual) === true; | |
} | |
function _tryBlock(block) { | |
var error; | |
try { | |
block(); | |
} catch (e) { | |
error = e; | |
} | |
return error; | |
} | |
function _throws(shouldThrow, block, expected, message) { | |
var actual; | |
if (typeof block !== 'function') { | |
throw new TypeError('"block" argument must be a function'); | |
} | |
if (typeof expected === 'string') { | |
message = expected; | |
expected = null; | |
} | |
actual = _tryBlock(block); | |
message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + | |
(message ? ' ' + message : '.'); | |
if (shouldThrow && !actual) { | |
fail(actual, expected, 'Missing expected exception' + message); | |
} | |
var userProvidedMessage = typeof message === 'string'; | |
var isUnwantedException = !shouldThrow && util.isError(actual); | |
var isUnexpectedException = !shouldThrow && actual && !expected; | |
if ((isUnwantedException && | |
userProvidedMessage && | |
expectedException(actual, expected)) || | |
isUnexpectedException) { | |
fail(actual, expected, 'Got unwanted exception' + message); | |
} | |
if ((shouldThrow && actual && expected && | |
!expectedException(actual, expected)) || (!shouldThrow && actual)) { | |
throw actual; | |
} | |
} | |
assert.throws = function(block, error, message) { | |
_throws(true, block, error, message); | |
}; | |
assert.doesNotThrow = function(block, error, message) { | |
_throws(false, block, error, message); | |
}; | |
assert.ifError = function(err) { if (err) throw err; }; | |
var objectKeys = Object.keys || function (obj) { | |
var keys = []; | |
for (var key in obj) { | |
if (hasOwn.call(obj, key)) keys.push(key); | |
} | |
return keys; | |
}; | |
}).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); | |
},{"util/":67}],24:[function(require,module,exports){ | |
exports.byteLength = byteLength; | |
exports.toByteArray = toByteArray; | |
exports.fromByteArray = fromByteArray; | |
var lookup = []; | |
var revLookup = []; | |
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; | |
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | |
for (var i = 0, len = code.length; i < len; ++i) { | |
lookup[i] = code[i]; | |
revLookup[code.charCodeAt(i)] = i; | |
} | |
revLookup['-'.charCodeAt(0)] = 62; | |
revLookup['_'.charCodeAt(0)] = 63; | |
function placeHoldersCount (b64) { | |
var len = b64.length; | |
if (len % 4 > 0) { | |
throw new Error('Invalid string. Length must be a multiple of 4') | |
} | |
return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 | |
} | |
function byteLength (b64) { | |
return (b64.length * 3 / 4) - placeHoldersCount(b64) | |
} | |
function toByteArray (b64) { | |
var i, l, tmp, placeHolders, arr; | |
var len = b64.length; | |
placeHolders = placeHoldersCount(b64); | |
arr = new Arr((len * 3 / 4) - placeHolders); | |
l = placeHolders > 0 ? len - 4 : len; | |
var L = 0; | |
for (i = 0; i < l; i += 4) { | |
tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; | |
arr[L++] = (tmp >> 16) & 0xFF; | |
arr[L++] = (tmp >> 8) & 0xFF; | |
arr[L++] = tmp & 0xFF; | |
} | |
if (placeHolders === 2) { | |
tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); | |
arr[L++] = tmp & 0xFF; | |
} else if (placeHolders === 1) { | |
tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); | |
arr[L++] = (tmp >> 8) & 0xFF; | |
arr[L++] = tmp & 0xFF; | |
} | |
return arr | |
} | |
function tripletToBase64 (num) { | |
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] | |
} | |
function encodeChunk (uint8, start, end) { | |
var tmp; | |
var output = []; | |
for (var i = start; i < end; i += 3) { | |
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); | |
output.push(tripletToBase64(tmp)); | |
} | |
return output.join('') | |
} | |
function fromByteArray (uint8) { | |
var tmp; | |
var len = uint8.length; | |
var extraBytes = len % 3; | |
var output = ''; | |
var parts = []; | |
var maxChunkLength = 16383; | |
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { | |
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); | |
} | |
if (extraBytes === 1) { | |
tmp = uint8[len - 1]; | |
output += lookup[tmp >> 2]; | |
output += lookup[(tmp << 4) & 0x3F]; | |
output += '=='; | |
} else if (extraBytes === 2) { | |
tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); | |
output += lookup[tmp >> 10]; | |
output += lookup[(tmp >> 4) & 0x3F]; | |
output += lookup[(tmp << 2) & 0x3F]; | |
output += '='; | |
} | |
parts.push(output); | |
return parts.join('') | |
} | |
},{}],25:[function(require,module,exports){ | |
},{}],26:[function(require,module,exports){ | |
(function (process,Buffer){ | |
var assert = require('assert'); | |
var Zstream = require('pako/lib/zlib/zstream'); | |
var zlib_deflate = require('pako/lib/zlib/deflate.js'); | |
var zlib_inflate = require('pako/lib/zlib/inflate.js'); | |
var constants = require('pako/lib/zlib/constants'); | |
for (var key in constants) { | |
exports[key] = constants[key]; | |
} | |
exports.NONE = 0; | |
exports.DEFLATE = 1; | |
exports.INFLATE = 2; | |
exports.GZIP = 3; | |
exports.GUNZIP = 4; | |
exports.DEFLATERAW = 5; | |
exports.INFLATERAW = 6; | |
exports.UNZIP = 7; | |
var GZIP_HEADER_ID1 = 0x1f; | |
var GZIP_HEADER_ID2 = 0x8b; | |
function Zlib(mode) { | |
if (typeof mode !== 'number' || mode < exports.DEFLATE || mode > exports.UNZIP) { | |
throw new TypeError('Bad argument'); | |
} | |
this.dictionary = null; | |
this.err = 0; | |
this.flush = 0; | |
this.init_done = false; | |
this.level = 0; | |
this.memLevel = 0; | |
this.mode = mode; | |
this.strategy = 0; | |
this.windowBits = 0; | |
this.write_in_progress = false; | |
this.pending_close = false; | |
this.gzip_id_bytes_read = 0; | |
} | |
Zlib.prototype.close = function () { | |
if (this.write_in_progress) { | |
this.pending_close = true; | |
return; | |
} | |
this.pending_close = false; | |
assert(this.init_done, 'close before init'); | |
assert(this.mode <= exports.UNZIP); | |
if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) { | |
zlib_deflate.deflateEnd(this.strm); | |
} else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) { | |
zlib_inflate.inflateEnd(this.strm); | |
} | |
this.mode = exports.NONE; | |
this.dictionary = null; | |
}; | |
Zlib.prototype.write = function (flush, input, in_off, in_len, out, out_off, out_len) { | |
return this._write(true, flush, input, in_off, in_len, out, out_off, out_len); | |
}; | |
Zlib.prototype.writeSync = function (flush, input, in_off, in_len, out, out_off, out_len) { | |
return this._write(false, flush, input, in_off, in_len, out, out_off, out_len); | |
}; | |
Zlib.prototype._write = function (async, flush, input, in_off, in_len, out, out_off, out_len) { | |
assert.equal(arguments.length, 8); | |
assert(this.init_done, 'write before init'); | |
assert(this.mode !== exports.NONE, 'already finalized'); | |
assert.equal(false, this.write_in_progress, 'write already in progress'); | |
assert.equal(false, this.pending_close, 'close is pending'); | |
this.write_in_progress = true; | |
assert.equal(false, flush === undefined, 'must provide flush value'); | |
this.write_in_progress = true; | |
if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) { | |
throw new Error('Invalid flush value'); | |
} | |
if (input == null) { | |
input = Buffer.alloc(0); | |
in_len = 0; | |
in_off = 0; | |
} | |
this.strm.avail_in = in_len; | |
this.strm.input = input; | |
this.strm.next_in = in_off; | |
this.strm.avail_out = out_len; | |
this.strm.output = out; | |
this.strm.next_out = out_off; | |
this.flush = flush; | |
if (!async) { | |
this._process(); | |
if (this._checkError()) { | |
return this._afterSync(); | |
} | |
return; | |
} | |
var self = this; | |
process.nextTick(function () { | |
self._process(); | |
self._after(); | |
}); | |
return this; | |
}; | |
Zlib.prototype._afterSync = function () { | |
var avail_out = this.strm.avail_out; | |
var avail_in = this.strm.avail_in; | |
this.write_in_progress = false; | |
return [avail_in, avail_out]; | |
}; | |
Zlib.prototype._process = function () { | |
var next_expected_header_byte = null; | |
switch (this.mode) { | |
case exports.DEFLATE: | |
case exports.GZIP: | |
case exports.DEFLATERAW: | |
this.err = zlib_deflate.deflate(this.strm, this.flush); | |
break; | |
case exports.UNZIP: | |
if (this.strm.avail_in > 0) { | |
next_expected_header_byte = this.strm.next_in; | |
} | |
switch (this.gzip_id_bytes_read) { | |
case 0: | |
if (next_expected_header_byte === null) { | |
break; | |
} | |
if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) { | |
this.gzip_id_bytes_read = 1; | |
next_expected_header_byte++; | |
if (this.strm.avail_in === 1) { | |
break; | |
} | |
} else { | |
this.mode = exports.INFLATE; | |
break; | |
} | |
case 1: | |
if (next_expected_header_byte === null) { | |
break; | |
} | |
if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) { | |
this.gzip_id_bytes_read = 2; | |
this.mode = exports.GUNZIP; | |
} else { | |
this.mode = exports.INFLATE; | |
} | |
break; | |
default: | |
throw new Error('invalid number of gzip magic number bytes read'); | |
} | |
case exports.INFLATE: | |
case exports.GUNZIP: | |
case exports.INFLATERAW: | |
this.err = zlib_inflate.inflate(this.strm, this.flush | |
);if (this.err === exports.Z_NEED_DICT && this.dictionary) { | |
this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary); | |
if (this.err === exports.Z_OK) { | |
this.err = zlib_inflate.inflate(this.strm, this.flush); | |
} else if (this.err === exports.Z_DATA_ERROR) { | |
this.err = exports.Z_NEED_DICT; | |
} | |
} | |
while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0x00) { | |
this.reset(); | |
this.err = zlib_inflate.inflate(this.strm, this.flush); | |
} | |
break; | |
default: | |
throw new Error('Unknown mode ' + this.mode); | |
} | |
}; | |
Zlib.prototype._checkError = function () { | |
switch (this.err) { | |
case exports.Z_OK: | |
case exports.Z_BUF_ERROR: | |
if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) { | |
this._error('unexpected end of file'); | |
return false; | |
} | |
break; | |
case exports.Z_STREAM_END: | |
break; | |
case exports.Z_NEED_DICT: | |
if (this.dictionary == null) { | |
this._error('Missing dictionary'); | |
} else { | |
this._error('Bad dictionary'); | |
} | |
return false; | |
default: | |
this._error('Zlib error'); | |
return false; | |
} | |
return true; | |
}; | |
Zlib.prototype._after = function () { | |
if (!this._checkError()) { | |
return; | |
} | |
var avail_out = this.strm.avail_out; | |
var avail_in = this.strm.avail_in; | |
this.write_in_progress = false; | |
this.callback(avail_in, avail_out); | |
if (this.pending_close) { | |
this.close(); | |
} | |
}; | |
Zlib.prototype._error = function (message) { | |
if (this.strm.msg) { | |
message = this.strm.msg; | |
} | |
this.onerror(message, this.err | |
);this.write_in_progress = false; | |
if (this.pending_close) { | |
this.close(); | |
} | |
}; | |
Zlib.prototype.init = function (windowBits, level, memLevel, strategy, dictionary) { | |
assert(arguments.length === 4 || arguments.length === 5, 'init(windowBits, level, memLevel, strategy, [dictionary])'); | |
assert(windowBits >= 8 && windowBits <= 15, 'invalid windowBits'); | |
assert(level >= -1 && level <= 9, 'invalid compression level'); | |
assert(memLevel >= 1 && memLevel <= 9, 'invalid memlevel'); | |
assert(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, 'invalid strategy'); | |
this._init(level, windowBits, memLevel, strategy, dictionary); | |
this._setDictionary(); | |
}; | |
Zlib.prototype.params = function () { | |
throw new Error('deflateParams Not supported'); | |
}; | |
Zlib.prototype.reset = function () { | |
this._reset(); | |
this._setDictionary(); | |
}; | |
Zlib.prototype._init = function (level, windowBits, memLevel, strategy, dictionary) { | |
this.level = level; | |
this.windowBits = windowBits; | |
this.memLevel = memLevel; | |
this.strategy = strategy; | |
this.flush = exports.Z_NO_FLUSH; | |
this.err = exports.Z_OK; | |
if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) { | |
this.windowBits += 16; | |
} | |
if (this.mode === exports.UNZIP) { | |
this.windowBits += 32; | |
} | |
if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) { | |
this.windowBits = -1 * this.windowBits; | |
} | |
this.strm = new Zstream(); | |
switch (this.mode) { | |
case exports.DEFLATE: | |
case exports.GZIP: | |
case exports.DEFLATERAW: | |
this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy); | |
break; | |
case exports.INFLATE: | |
case exports.GUNZIP: | |
case exports.INFLATERAW: | |
case exports.UNZIP: | |
this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits); | |
break; | |
default: | |
throw new Error('Unknown mode ' + this.mode); | |
} | |
if (this.err !== exports.Z_OK) { | |
this._error('Init error'); | |
} | |
this.dictionary = dictionary; | |
this.write_in_progress = false; | |
this.init_done = true; | |
}; | |
Zlib.prototype._setDictionary = function () { | |
if (this.dictionary == null) { | |
return; | |
} | |
this.err = exports.Z_OK; | |
switch (this.mode) { | |
case exports.DEFLATE: | |
case exports.DEFLATERAW: | |
this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary); | |
break; | |
} | |
if (this.err !== exports.Z_OK) { | |
this._error('Failed to set dictionary'); | |
} | |
}; | |
Zlib.prototype._reset = function () { | |
this.err = exports.Z_OK; | |
switch (this.mode) { | |
case exports.DEFLATE: | |
case exports.DEFLATERAW: | |
case exports.GZIP: | |
this.err = zlib_deflate.deflateReset(this.strm); | |
break; | |
case exports.INFLATE: | |
case exports.INFLATERAW: | |
case exports.GUNZIP: | |
this.err = zlib_inflate.inflateReset(this.strm); | |
break; | |
} | |
if (this.err !== exports.Z_OK) { | |
this._error('Failed to reset stream'); | |
} | |
}; | |
exports.Zlib = Zlib; | |
}).call(this,require('_process'),require("buffer").Buffer); | |
},{"_process":47,"assert":23,"buffer":28,"pako/lib/zlib/constants":37,"pako/lib/zlib/deflate.js":39,"pako/lib/zlib/inflate.js":41,"pako/lib/zlib/zstream":45}],27:[function(require,module,exports){ | |
(function (process){ | |
var Buffer = require('buffer').Buffer; | |
var Transform = require('stream').Transform; | |
var binding = require('./binding'); | |
var util = require('util'); | |
var assert = require('assert').ok; | |
var kMaxLength = require('buffer').kMaxLength; | |
var kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + 'than 0x' + kMaxLength.toString(16) + ' bytes'; | |
binding.Z_MIN_WINDOWBITS = 8; | |
binding.Z_MAX_WINDOWBITS = 15; | |
binding.Z_DEFAULT_WINDOWBITS = 15; | |
binding.Z_MIN_CHUNK = 64; | |
binding.Z_MAX_CHUNK = Infinity; | |
binding.Z_DEFAULT_CHUNK = 16 * 1024; | |
binding.Z_MIN_MEMLEVEL = 1; | |
binding.Z_MAX_MEMLEVEL = 9; | |
binding.Z_DEFAULT_MEMLEVEL = 8; | |
binding.Z_MIN_LEVEL = -1; | |
binding.Z_MAX_LEVEL = 9; | |
binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION; | |
var bkeys = Object.keys(binding); | |
for (var bk = 0; bk < bkeys.length; bk++) { | |
var bkey = bkeys[bk]; | |
if (bkey.match(/^Z/)) { | |
Object.defineProperty(exports, bkey, { | |
enumerable: true, value: binding[bkey], writable: false | |
}); | |
} | |
} | |
var codes = { | |
Z_OK: binding.Z_OK, | |
Z_STREAM_END: binding.Z_STREAM_END, | |
Z_NEED_DICT: binding.Z_NEED_DICT, | |
Z_ERRNO: binding.Z_ERRNO, | |
Z_STREAM_ERROR: binding.Z_STREAM_ERROR, | |
Z_DATA_ERROR: binding.Z_DATA_ERROR, | |
Z_MEM_ERROR: binding.Z_MEM_ERROR, | |
Z_BUF_ERROR: binding.Z_BUF_ERROR, | |
Z_VERSION_ERROR: binding.Z_VERSION_ERROR | |
}; | |
var ckeys = Object.keys(codes); | |
for (var ck = 0; ck < ckeys.length; ck++) { | |
var ckey = ckeys[ck]; | |
codes[codes[ckey]] = ckey; | |
} | |
Object.defineProperty(exports, 'codes', { | |
enumerable: true, value: Object.freeze(codes), writable: false | |
}); | |
exports.Deflate = Deflate; | |
exports.Inflate = Inflate; | |
exports.Gzip = Gzip; | |
exports.Gunzip = Gunzip; | |
exports.DeflateRaw = DeflateRaw; | |
exports.InflateRaw = InflateRaw; | |
exports.Unzip = Unzip; | |
exports.createDeflate = function (o) { | |
return new Deflate(o); | |
}; | |
exports.createInflate = function (o) { | |
return new Inflate(o); | |
}; | |
exports.createDeflateRaw = function (o) { | |
return new DeflateRaw(o); | |
}; | |
exports.createInflateRaw = function (o) { | |
return new InflateRaw(o); | |
}; | |
exports.createGzip = function (o) { | |
return new Gzip(o); | |
}; | |
exports.createGunzip = function (o) { | |
return new Gunzip(o); | |
}; | |
exports.createUnzip = function (o) { | |
return new Unzip(o); | |
}; | |
exports.deflate = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new Deflate(opts), buffer, callback); | |
}; | |
exports.deflateSync = function (buffer, opts) { | |
return zlibBufferSync(new Deflate(opts), buffer); | |
}; | |
exports.gzip = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new Gzip(opts), buffer, callback); | |
}; | |
exports.gzipSync = function (buffer, opts) { | |
return zlibBufferSync(new Gzip(opts), buffer); | |
}; | |
exports.deflateRaw = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new DeflateRaw(opts), buffer, callback); | |
}; | |
exports.deflateRawSync = function (buffer, opts) { | |
return zlibBufferSync(new DeflateRaw(opts), buffer); | |
}; | |
exports.unzip = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new Unzip(opts), buffer, callback); | |
}; | |
exports.unzipSync = function (buffer, opts) { | |
return zlibBufferSync(new Unzip(opts), buffer); | |
}; | |
exports.inflate = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new Inflate(opts), buffer, callback); | |
}; | |
exports.inflateSync = function (buffer, opts) { | |
return zlibBufferSync(new Inflate(opts), buffer); | |
}; | |
exports.gunzip = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new Gunzip(opts), buffer, callback); | |
}; | |
exports.gunzipSync = function (buffer, opts) { | |
return zlibBufferSync(new Gunzip(opts), buffer); | |
}; | |
exports.inflateRaw = function (buffer, opts, callback) { | |
if (typeof opts === 'function') { | |
callback = opts; | |
opts = {}; | |
} | |
return zlibBuffer(new InflateRaw(opts), buffer, callback); | |
}; | |
exports.inflateRawSync = function (buffer, opts) { | |
return zlibBufferSync(new InflateRaw(opts), buffer); | |
}; | |
function zlibBuffer(engine, buffer, callback) { | |
var buffers = []; | |
var nread = 0; | |
engine.on('error', onError); | |
engine.on('end', onEnd); | |
engine.end(buffer); | |
flow(); | |
function flow() { | |
var chunk; | |
while (null !== (chunk = engine.read())) { | |
buffers.push(chunk); | |
nread += chunk.length; | |
} | |
engine.once('readable', flow); | |
} | |
function onError(err) { | |
engine.removeListener('end', onEnd); | |
engine.removeListener('readable', flow); | |
callback(err); | |
} | |
function onEnd() { | |
var buf; | |
var err = null; | |
if (nread >= kMaxLength) { | |
err = new RangeError(kRangeErrorMessage); | |
} else { | |
buf = Buffer.concat(buffers, nread); | |
} | |
buffers = []; | |
engine.close(); | |
callback(err, buf); | |
} | |
} | |
function zlibBufferSync(engine, buffer) { | |
if (typeof buffer === 'string') buffer = Buffer.from(buffer); | |
if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer'); | |
var flushFlag = engine._finishFlushFlag; | |
return engine._processChunk(buffer, flushFlag); | |
} | |
function Deflate(opts) { | |
if (!(this instanceof Deflate)) return new Deflate(opts); | |
Zlib.call(this, opts, binding.DEFLATE); | |
} | |
function Inflate(opts) { | |
if (!(this instanceof Inflate)) return new Inflate(opts); | |
Zlib.call(this, opts, binding.INFLATE); | |
} | |
function Gzip(opts) { | |
if (!(this instanceof Gzip)) return new Gzip(opts); | |
Zlib.call(this, opts, binding.GZIP); | |
} | |
function Gunzip(opts) { | |
if (!(this instanceof Gunzip)) return new Gunzip(opts); | |
Zlib.call(this, opts, binding.GUNZIP); | |
} | |
function DeflateRaw(opts) { | |
if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts); | |
Zlib.call(this, opts, binding.DEFLATERAW); | |
} | |
function InflateRaw(opts) { | |
if (!(this instanceof InflateRaw)) return new InflateRaw(opts); | |
Zlib.call(this, opts, binding.INFLATERAW); | |
} | |
function Unzip(opts) { | |
if (!(this instanceof Unzip)) return new Unzip(opts); | |
Zlib.call(this, opts, binding.UNZIP); | |
} | |
function isValidFlushFlag(flag) { | |
return flag === binding.Z_NO_FLUSH || flag === binding.Z_PARTIAL_FLUSH || flag === binding.Z_SYNC_FLUSH || flag === binding.Z_FULL_FLUSH || flag === binding.Z_FINISH || flag === binding.Z_BLOCK; | |
} | |
function Zlib(opts, mode) { | |
var _this = this; | |
this._opts = opts = opts || {}; | |
this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK; | |
Transform.call(this, opts); | |
if (opts.flush && !isValidFlushFlag(opts.flush)) { | |
throw new Error('Invalid flush flag: ' + opts.flush); | |
} | |
if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) { | |
throw new Error('Invalid flush flag: ' + opts.finishFlush); | |
} | |
this._flushFlag = opts.flush || binding.Z_NO_FLUSH; | |
this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? opts.finishFlush : binding.Z_FINISH; | |
if (opts.chunkSize) { | |
if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) { | |
throw new Error('Invalid chunk size: ' + opts.chunkSize); | |
} | |
} | |
if (opts.windowBits) { | |
if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) { | |
throw new Error('Invalid windowBits: ' + opts.windowBits); | |
} | |
} | |
if (opts.level) { | |
if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) { | |
throw new Error('Invalid compression level: ' + opts.level); | |
} | |
} | |
if (opts.memLevel) { | |
if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) { | |
throw new Error('Invalid memLevel: ' + opts.memLevel); | |
} | |
} | |
if (opts.strategy) { | |
if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) { | |
throw new Error('Invalid strategy: ' + opts.strategy); | |
} | |
} | |
if (opts.dictionary) { | |
if (!Buffer.isBuffer(opts.dictionary)) { | |
throw new Error('Invalid dictionary: it should be a Buffer instance'); | |
} | |
} | |
this._handle = new binding.Zlib(mode); | |
var self = this; | |
this._hadError = false; | |
this._handle.onerror = function (message, errno) { | |
_close(self); | |
self._hadError = true; | |
var error = new Error(message); | |
error.errno = errno; | |
error.code = exports.codes[errno]; | |
self.emit('error', error); | |
}; | |
var level = exports.Z_DEFAULT_COMPRESSION; | |
if (typeof opts.level === 'number') level = opts.level; | |
var strategy = exports.Z_DEFAULT_STRATEGY; | |
if (typeof opts.strategy === 'number') strategy = opts.strategy; | |
this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary); | |
this._buffer = Buffer.allocUnsafe(this._chunkSize); | |
this._offset = 0; | |
this._level = level; | |
this._strategy = strategy; | |
this.once('end', this.close); | |
Object.defineProperty(this, '_closed', { | |
get: function () { | |
return !_this._handle; | |
}, | |
configurable: true, | |
enumerable: true | |
}); | |
} | |
util.inherits(Zlib, Transform); | |
Zlib.prototype.params = function (level, strategy, callback) { | |
if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) { | |
throw new RangeError('Invalid compression level: ' + level); | |
} | |
if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) { | |
throw new TypeError('Invalid strategy: ' + strategy); | |
} | |
if (this._level !== level || this._strategy !== strategy) { | |
var self = this; | |
this.flush(binding.Z_SYNC_FLUSH, function () { | |
assert(self._handle, 'zlib binding closed'); | |
self._handle.params(level, strategy); | |
if (!self._hadError) { | |
self._level = level; | |
self._strategy = strategy; | |
if (callback) callback(); | |
} | |
}); | |
} else { | |
process.nextTick(callback); | |
} | |
}; | |
Zlib.prototype.reset = function () { | |
assert(this._handle, 'zlib binding closed'); | |
return this._handle.reset(); | |
}; | |
Zlib.prototype._flush = function (callback) { | |
this._transform(Buffer.alloc(0), '', callback); | |
}; | |
Zlib.prototype.flush = function (kind, callback) { | |
var _this2 = this; | |
var ws = this._writableState; | |
if (typeof kind === 'function' || kind === undefined && !callback) { | |
callback = kind; | |
kind = binding.Z_FULL_FLUSH; | |
} | |
if (ws.ended) { | |
if (callback) process.nextTick(callback); | |
} else if (ws.ending) { | |
if (callback) this.once('end', callback); | |
} else if (ws.needDrain) { | |
if (callback) { | |
this.once('drain', function () { | |
return _this2.flush(kind, callback); | |
}); | |
} | |
} else { | |
this._flushFlag = kind; | |
this.write(Buffer.alloc(0), '', callback); | |
} | |
}; | |
Zlib.prototype.close = function (callback) { | |
_close(this, callback); | |
process.nextTick(emitCloseNT, this); | |
}; | |
function _close(engine, callback) { | |
if (callback) process.nextTick(callback); | |
if (!engine._handle) return; | |
engine._handle.close(); | |
engine._handle = null; | |
} | |
function emitCloseNT(self) { | |
self.emit('close'); | |
} | |
Zlib.prototype._transform = function (chunk, encoding, cb) { | |
var flushFlag; | |
var ws = this._writableState; | |
var ending = ws.ending || ws.ended; | |
var last = ending && (!chunk || ws.length === chunk.length); | |
if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input')); | |
if (!this._handle) return cb(new Error('zlib binding closed')); | |
if (last) flushFlag = this._finishFlushFlag;else { | |
flushFlag = this._flushFlag; | |
if (chunk.length >= ws.length) { | |
this._flushFlag = this._opts.flush || binding.Z_NO_FLUSH; | |
} | |
} | |
this._processChunk(chunk, flushFlag, cb); | |
}; | |
Zlib.prototype._processChunk = function (chunk, flushFlag, cb) { | |
var availInBefore = chunk && chunk.length; | |
var availOutBefore = this._chunkSize - this._offset; | |
var inOff = 0; | |
var self = this; | |
var async = typeof cb === 'function'; | |
if (!async) { | |
var buffers = []; | |
var nread = 0; | |
var error; | |
this.on('error', function (er) { | |
error = er; | |
}); | |
assert(this._handle, 'zlib binding closed'); | |
do { | |
var res = this._handle.writeSync(flushFlag, chunk, | |
inOff, | |
availInBefore, | |
this._buffer, | |
this._offset, | |
availOutBefore); | |
} while (!this._hadError && callback(res[0], res[1])); | |
if (this._hadError) { | |
throw error; | |
} | |
if (nread >= kMaxLength) { | |
_close(this); | |
throw new RangeError(kRangeErrorMessage); | |
} | |
var buf = Buffer.concat(buffers, nread); | |
_close(this); | |
return buf; | |
} | |
assert(this._handle, 'zlib binding closed'); | |
var req = this._handle.write(flushFlag, chunk, | |
inOff, | |
availInBefore, | |
this._buffer, | |
this._offset, | |
availOutBefore); | |
req.buffer = chunk; | |
req.callback = callback; | |
function callback(availInAfter, availOutAfter) { | |
if (this) { | |
this.buffer = null; | |
this.callback = null; | |
} | |
if (self._hadError) return; | |
var have = availOutBefore - availOutAfter; | |
assert(have >= 0, 'have should not go down'); | |
if (have > 0) { | |
var out = self._buffer.slice(self._offset, self._offset + have); | |
self._offset += have; | |
if (async) { | |
self.push(out); | |
} else { | |
buffers.push(out); | |
nread += out.length; | |
} | |
} | |
if (availOutAfter === 0 || self._offset >= self._chunkSize) { | |
availOutBefore = self._chunkSize; | |
self._offset = 0; | |
self._buffer = Buffer.allocUnsafe(self._chunkSize); | |
} | |
if (availOutAfter === 0) { | |
inOff += availInBefore - availInAfter; | |
availInBefore = availInAfter; | |
if (!async) return true; | |
var newReq = self._handle.write(flushFlag, chunk, inOff, availInBefore, self._buffer, self._offset, self._chunkSize); | |
newReq.callback = callback; | |
newReq.buffer = chunk; | |
return; | |
} | |
if (!async) return false; | |
cb(); | |
} | |
}; | |
util.inherits(Deflate, Zlib); | |
util.inherits(Inflate, Zlib); | |
util.inherits(Gzip, Zlib); | |
util.inherits(Gunzip, Zlib); | |
util.inherits(DeflateRaw, Zlib); | |
util.inherits(InflateRaw, Zlib); | |
util.inherits(Unzip, Zlib); | |
}).call(this,require('_process')); | |
},{"./binding":26,"_process":47,"assert":23,"buffer":28,"stream":63,"util":67}],28:[function(require,module,exports){ | |
var base64 = require('base64-js'); | |
var ieee754 = require('ieee754'); | |
exports.Buffer = Buffer; | |
exports.SlowBuffer = SlowBuffer; | |
exports.INSPECT_MAX_BYTES = 50; | |
var K_MAX_LENGTH = 0x7fffffff; | |
exports.kMaxLength = K_MAX_LENGTH; | |
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport(); | |
if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && | |
typeof console.error === 'function') { | |
console.error( | |
'This browser lacks typed array (Uint8Array) support which is required by ' + | |
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' | |
); | |
} | |
function typedArraySupport () { | |
try { | |
var arr = new Uint8Array(1); | |
arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }; | |
return arr.foo() === 42 | |
} catch (e) { | |
return false | |
} | |
} | |
Object.defineProperty(Buffer.prototype, 'parent', { | |
enumerable: true, | |
get: function () { | |
if (!Buffer.isBuffer(this)) return undefined | |
return this.buffer | |
} | |
}); | |
Object.defineProperty(Buffer.prototype, 'offset', { | |
enumerable: true, | |
get: function () { | |
if (!Buffer.isBuffer(this)) return undefined | |
return this.byteOffset | |
} | |
}); | |
function createBuffer (length) { | |
if (length > K_MAX_LENGTH) { | |
throw new RangeError('The value "' + length + '" is invalid for option "size"') | |
} | |
var buf = new Uint8Array(length); | |
buf.__proto__ = Buffer.prototype; | |
return buf | |
} | |
function Buffer (arg, encodingOrOffset, length) { | |
if (typeof arg === 'number') { | |
if (typeof encodingOrOffset === 'string') { | |
throw new TypeError( | |
'The "string" argument must be of type string. Received type number' | |
) | |
} | |
return allocUnsafe(arg) | |
} | |
return from(arg, encodingOrOffset, length) | |
} | |
if (typeof Symbol !== 'undefined' && Symbol.species != null && | |
Buffer[Symbol.species] === Buffer) { | |
Object.defineProperty(Buffer, Symbol.species, { | |
value: null, | |
configurable: true, | |
enumerable: false, | |
writable: false | |
}); | |
} | |
Buffer.poolSize = 8192; | |
function from (value, encodingOrOffset, length) { | |
if (typeof value === 'string') { | |
return fromString(value, encodingOrOffset) | |
} | |
if (ArrayBuffer.isView(value)) { | |
return fromArrayLike(value) | |
} | |
if (value == null) { | |
throw TypeError( | |
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + | |
'or Array-like Object. Received type ' + (typeof value) | |
) | |
} | |
if (isInstance(value, ArrayBuffer) || | |
(value && isInstance(value.buffer, ArrayBuffer))) { | |
return fromArrayBuffer(value, encodingOrOffset, length) | |
} | |
if (typeof value === 'number') { | |
throw new TypeError( | |
'The "value" argument must not be of type number. Received type number' | |
) | |
} | |
var valueOf = value.valueOf && value.valueOf(); | |
if (valueOf != null && valueOf !== value) { | |
return Buffer.from(valueOf, encodingOrOffset, length) | |
} | |
var b = fromObject(value); | |
if (b) return b | |
if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && | |
typeof value[Symbol.toPrimitive] === 'function') { | |
return Buffer.from( | |
value[Symbol.toPrimitive]('string'), encodingOrOffset, length | |
) | |
} | |
throw new TypeError( | |
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + | |
'or Array-like Object. Received type ' + (typeof value) | |
) | |
} | |
Buffer.from = function (value, encodingOrOffset, length) { | |
return from(value, encodingOrOffset, length) | |
}; | |
Buffer.prototype.__proto__ = Uint8Array.prototype; | |
Buffer.__proto__ = Uint8Array; | |
function assertSize (size) { | |
if (typeof size !== 'number') { | |
throw new TypeError('"size" argument must be of type number') | |
} else if (size < 0) { | |
throw new RangeError('The value "' + size + '" is invalid for option "size"') | |
} | |
} | |
function alloc (size, fill, encoding) { | |
assertSize(size); | |
if (size <= 0) { | |
return createBuffer(size) | |
} | |
if (fill !== undefined) { | |
return typeof encoding === 'string' | |
? createBuffer(size).fill(fill, encoding) | |
: createBuffer(size).fill(fill) | |
} | |
return createBuffer(size) | |
} | |
Buffer.alloc = function (size, fill, encoding) { | |
return alloc(size, fill, encoding) | |
}; | |
function allocUnsafe (size) { | |
assertSize(size); | |
return createBuffer(size < 0 ? 0 : checked(size) | 0) | |
} | |
Buffer.allocUnsafe = function (size) { | |
return allocUnsafe(size) | |
}; | |
Buffer.allocUnsafeSlow = function (size) { | |
return allocUnsafe(size) | |
}; | |
function fromString (string, encoding) { | |
if (typeof encoding !== 'string' || encoding === '') { | |
encoding = 'utf8'; | |
} | |
if (!Buffer.isEncoding(encoding)) { | |
throw new TypeError('Unknown encoding: ' + encoding) | |
} | |
var length = byteLength(string, encoding) | 0; | |
var buf = createBuffer(length); | |
var actual = buf.write(string, encoding); | |
if (actual !== length) { | |
buf = buf.slice(0, actual); | |
} | |
return buf | |
} | |
function fromArrayLike (array) { | |
var length = array.length < 0 ? 0 : checked(array.length) | 0; | |
var buf = createBuffer(length); | |
for (var i = 0; i < length; i += 1) { | |
buf[i] = array[i] & 255; | |
} | |
return buf | |
} | |
function fromArrayBuffer (array, byteOffset, length) { | |
if (byteOffset < 0 || array.byteLength < byteOffset) { | |
throw new RangeError('"offset" is outside of buffer bounds') | |
} | |
if (array.byteLength < byteOffset + (length || 0)) { | |
throw new RangeError('"length" is outside of buffer bounds') | |
} | |
var buf; | |
if (byteOffset === undefined && length === undefined) { | |
buf = new Uint8Array(array); | |
} else if (length === undefined) { | |
buf = new Uint8Array(array, byteOffset); | |
} else { | |
buf = new Uint8Array(array, byteOffset, length); | |
} | |
buf.__proto__ = Buffer.prototype; | |
return buf | |
} | |
function fromObject (obj) { | |
if (Buffer.isBuffer(obj)) { | |
var len = checked(obj.length) | 0; | |
var buf = createBuffer(len); | |
if (buf.length === 0) { | |
return buf | |
} | |
obj.copy(buf, 0, 0, len); | |
return buf | |
} | |
if (obj.length !== undefined) { | |
if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { | |
return createBuffer(0) | |
} | |
return fromArrayLike(obj) | |
} | |
if (obj.type === 'Buffer' && Array.isArray(obj.data)) { | |
return fromArrayLike(obj.data) | |
} | |
} | |
function checked (length) { | |
if (length >= K_MAX_LENGTH) { | |
throw new RangeError('Attempt to allocate Buffer larger than maximum ' + | |
'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') | |
} | |
return length | 0 | |
} | |
function SlowBuffer (length) { | |
if (+length != length) { | |
length = 0; | |
} | |
return Buffer.alloc(+length) | |
} | |
Buffer.isBuffer = function isBuffer (b) { | |
return b != null && b._isBuffer === true && | |
b !== Buffer.prototype | |
}; | |
Buffer.compare = function compare (a, b) { | |
if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength); | |
if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength); | |
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { | |
throw new TypeError( | |
'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' | |
) | |
} | |
if (a === b) return 0 | |
var x = a.length; | |
var y = b.length; | |
for (var i = 0, len = Math.min(x, y); i < len; ++i) { | |
if (a[i] !== b[i]) { | |
x = a[i]; | |
y = b[i]; | |
break | |
} | |
} | |
if (x < y) return -1 | |
if (y < x) return 1 | |
return 0 | |
}; | |
Buffer.isEncoding = function isEncoding (encoding) { | |
switch (String(encoding).toLowerCase()) { | |
case 'hex': | |
case 'utf8': | |
case 'utf-8': | |
case 'ascii': | |
case 'latin1': | |
case 'binary': | |
case 'base64': | |
case 'ucs2': | |
case 'ucs-2': | |
case 'utf16le': | |
case 'utf-16le': | |
return true | |
default: | |
return false | |
} | |
}; | |
Buffer.concat = function concat (list, length) { | |
if (!Array.isArray(list)) { | |
throw new TypeError('"list" argument must be an Array of Buffers') | |
} | |
if (list.length === 0) { | |
return Buffer.alloc(0) | |
} | |
var i; | |
if (length === undefined) { | |
length = 0; | |
for (i = 0; i < list.length; ++i) { | |
length += list[i].length; | |
} | |
} | |
var buffer = Buffer.allocUnsafe(length); | |
var pos = 0; | |
for (i = 0; i < list.length; ++i) { | |
var buf = list[i]; | |
if (isInstance(buf, Uint8Array)) { | |
buf = Buffer.from(buf); | |
} | |
if (!Buffer.isBuffer(buf)) { | |
throw new TypeError('"list" argument must be an Array of Buffers') | |
} | |
buf.copy(buffer, pos); | |
pos += buf.length; | |
} | |
return buffer | |
}; | |
function byteLength (string, encoding) { | |
if (Buffer.isBuffer(string)) { | |
return string.length | |
} | |
if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { | |
return string.byteLength | |
} | |
if (typeof string !== 'string') { | |
throw new TypeError( | |
'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + | |
'Received type ' + typeof string | |
) | |
} | |
var len = string.length; | |
var mustMatch = (arguments.length > 2 && arguments[2] === true); | |
if (!mustMatch && len === 0) return 0 | |
var loweredCase = false; | |
for (;;) { | |
switch (encoding) { | |
case 'ascii': | |
case 'latin1': | |
case 'binary': | |
return len | |
case 'utf8': | |
case 'utf-8': | |
return utf8ToBytes(string).length | |
case 'ucs2': | |
case 'ucs-2': | |
case 'utf16le': | |
case 'utf-16le': | |
return len * 2 | |
case 'hex': | |
return len >>> 1 | |
case 'base64': | |
return base64ToBytes(string).length | |
default: | |
if (loweredCase) { | |
return mustMatch ? -1 : utf8ToBytes(string).length | |
} | |
encoding = ('' + encoding).toLowerCase(); | |
loweredCase = true; | |
} | |
} | |
} | |
Buffer.byteLength = byteLength; | |
function slowToString (encoding, start, end) { | |
var loweredCase = false; | |
if (start === undefined || start < 0) { | |
start = 0; | |
} | |
if (start > this.length) { | |
return '' | |
} | |
if (end === undefined || end > this.length) { | |
end = this.length; | |
} | |
if (end <= 0) { | |
return '' | |
} | |
end >>>= 0; | |
start >>>= 0; | |
if (end <= start) { | |
return '' | |
} | |
if (!encoding) encoding = 'utf8'; | |
while (true) { | |
switch (encoding) { | |
case 'hex': | |
return hexSlice(this, start, end) | |
case 'utf8': | |
case 'utf-8': | |
return utf8Slice(this, start, end) | |
case 'ascii': | |
return asciiSlice(this, start, end) | |
case 'latin1': | |
case 'binary': | |
return latin1Slice(this, start, end) | |
case 'base64': | |
return base64Slice(this, start, end) | |
case 'ucs2': | |
case 'ucs-2': | |
case 'utf16le': | |
case 'utf-16le': | |
return utf16leSlice(this, start, end) | |
default: | |
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) | |
encoding = (encoding + '').toLowerCase(); | |
loweredCase = true; | |
} | |
} | |
} | |
Buffer.prototype._isBuffer = true; | |
function swap (b, n, m) { | |
var i = b[n]; | |
b[n] = b[m]; | |
b[m] = i; | |
} | |
Buffer.prototype.swap16 = function swap16 () { | |
var len = this.length; | |
if (len % 2 !== 0) { | |
throw new RangeError('Buffer size must be a multiple of 16-bits') | |
} | |
for (var i = 0; i < len; i += 2) { | |
swap(this, i, i + 1); | |
} | |
return this | |
}; | |
Buffer.prototype.swap32 = function swap32 () { | |
var len = this.length; | |
if (len % 4 !== 0) { | |
throw new RangeError('Buffer size must be a multiple of 32-bits') | |
} | |
for (var i = 0; i < len; i += 4) { | |
swap(this, i, i + 3); | |
swap(this, i + 1, i + 2); | |
} | |
return this | |
}; | |
Buffer.prototype.swap64 = function swap64 () { | |
var len = this.length; | |
if (len % 8 !== 0) { | |
throw new RangeError('Buffer size must be a multiple of 64-bits') | |
} | |
for (var i = 0; i < len; i += 8) { | |
swap(this, i, i + 7); | |
swap(this, i + 1, i + 6); | |
swap(this, i + 2, i + 5); | |
swap(this, i + 3, i + 4); | |
} | |
return this | |
}; | |
Buffer.prototype.toString = function toString () { | |
var length = this.length; | |
if (length === 0) return '' | |
if (arguments.length === 0) return utf8Slice(this, 0, length) | |
return slowToString.apply(this, arguments) | |
}; | |
Buffer.prototype.toLocaleString = Buffer.prototype.toString; | |
Buffer.prototype.equals = function equals (b) { | |
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') | |
if (this === b) return true | |
return Buffer.compare(this, b) === 0 | |
}; | |
Buffer.prototype.inspect = function inspect () { | |
var str = ''; | |
var max = exports.INSPECT_MAX_BYTES; | |
str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim(); | |
if (this.length > max) str += ' ... '; | |
return '<Buffer ' + str + '>' | |
}; | |
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { | |
if (isInstance(target, Uint8Array)) { | |
target = Buffer.from(target, target.offset, target.byteLength); | |
} | |
if (!Buffer.isBuffer(target)) { | |
throw new TypeError( | |
'The "target" argument must be one of type Buffer or Uint8Array. ' + | |
'Received type ' + (typeof target) | |
) | |
} | |
if (start === undefined) { | |
start = 0; | |
} | |
if (end === undefined) { | |
end = target ? target.length : 0; | |
} | |
if (thisStart === undefined) { | |
thisStart = 0; | |
} | |
if (thisEnd === undefined) { | |
thisEnd = this.length; | |
} | |
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { | |
throw new RangeError('out of range index') | |
} | |
if (thisStart >= thisEnd && start >= end) { | |
return 0 | |
} | |
if (thisStart >= thisEnd) { | |
return -1 | |
} | |
if (start >= end) { | |
return 1 | |
} | |
start >>>= 0; | |
end >>>= 0; | |
thisStart >>>= 0; | |
thisEnd >>>= 0; | |
if (this === target) return 0 | |
var x = thisEnd - thisStart; | |
var y = end - start; | |
var len = Math.min(x, y); | |
var thisCopy = this.slice(thisStart, thisEnd); | |
var targetCopy = target.slice(start, end); | |
for (var i = 0; i < len; ++i) { | |
if (thisCopy[i] !== targetCopy[i]) { | |
x = thisCopy[i]; | |
y = targetCopy[i]; | |
break | |
} | |
} | |
if (x < y) return -1 | |
if (y < x) return 1 | |
return 0 | |
}; | |
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { | |
if (buffer.length === 0) return -1 | |
if (typeof byteOffset === 'string') { | |
encoding = byteOffset; | |
byteOffset = 0; | |
} else if (byteOffset > 0x7fffffff) { | |
byteOffset = 0x7fffffff; | |
} else if (byteOffset < -0x80000000) { | |
byteOffset = -0x80000000; | |
} | |
byteOffset = +byteOffset; | |
if (numberIsNaN(byteOffset)) { | |
byteOffset = dir ? 0 : (buffer.length - 1); | |
} | |
if (byteOffset < 0) byteOffset = buffer.length + byteOffset; | |
if (byteOffset >= buffer.length) { | |
if (dir) return -1 | |
else byteOffset = buffer.length - 1; | |
} else if (byteOffset < 0) { | |
if (dir) byteOffset = 0; | |
else return -1 | |
} | |
if (typeof val === 'string') { | |
val = Buffer.from(val, encoding); | |
} | |
if (Buffer.isBuffer(val)) { | |
if (val.length === 0) { | |
return -1 | |
} | |
return arrayIndexOf(buffer, val, byteOffset, encoding, dir) | |
} else if (typeof val === 'number') { | |
val = val & 0xFF; | |
if (typeof Uint8Array.prototype.indexOf === 'function') { | |
if (dir) { | |
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) | |
} else { | |
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) | |
} | |
} | |
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) | |
} | |
throw new TypeError('val must be string, number or Buffer') | |
} | |
function arrayIndexOf (arr, val, byteOffset, encoding, dir) { | |
var indexSize = 1; | |
var arrLength = arr.length; | |
var valLength = val.length; | |
if (encoding !== undefined) { | |
encoding = String(encoding).toLowerCase(); | |
if (encoding === 'ucs2' || encoding === 'ucs-2' || | |
encoding === 'utf16le' || encoding === 'utf-16le') { | |
if (arr.length < 2 || val.length < 2) { | |
return -1 | |
} | |
indexSize = 2; | |
arrLength /= 2; | |
valLength /= 2; | |
byteOffset /= 2; | |
} | |
} | |
function read (buf, i) { | |
if (indexSize === 1) { | |
return buf[i] | |
} else { | |
return buf.readUInt16BE(i * indexSize) | |
} | |
} | |
var i; | |
if (dir) { | |
var foundIndex = -1; | |
for (i = byteOffset; i < arrLength; i++) { | |
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { | |
if (foundIndex === -1) foundIndex = i; | |
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize | |
} else { | |
if (foundIndex !== -1) i -= i - foundIndex; | |
foundIndex = -1; | |
} | |
} | |
} else { | |
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; | |
for (i = byteOffset; i >= 0; i--) { | |
var found = true; | |
for (var j = 0; j < valLength; j++) { | |
if (read(arr, i + j) !== read(val, j)) { | |
found = false; | |
break | |
} | |
} | |
if (found) return i | |
} | |
} | |
return -1 | |
} | |
Buffer.prototype.includes = function includes (val, byteOffset, encoding) { | |
return this.indexOf(val, byteOffset, encoding) !== -1 | |
}; | |
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { | |
return bidirectionalIndexOf(this, val, byteOffset, encoding, true) | |
}; | |
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { | |
return bidirectionalIndexOf(this, val, byteOffset, encoding, false) | |
}; | |
function hexWrite (buf, string, offset, length) { | |
offset = Number(offset) || 0; | |
var remaining = buf.length - offset; | |
if (!length) { | |
length = remaining; | |
} else { | |
length = Number(length); | |
if (length > remaining) { | |
length = remaining; | |
} | |
} | |
var strLen = string.length; | |
if (length > strLen / 2) { | |
length = strLen / 2; | |
} | |
for (var i = 0; i < length; ++i) { | |
var parsed = parseInt(string.substr(i * 2, 2), 16); | |
if (numberIsNaN(parsed)) return i | |
buf[offset + i] = parsed; | |
} | |
return i | |
} | |
function utf8Write (buf, string, offset, length) { | |
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) | |
} | |
function asciiWrite (buf, string, offset, length) { | |
return blitBuffer(asciiToBytes(string), buf, offset, length) | |
} | |
function latin1Write (buf, string, offset, length) { | |
return asciiWrite(buf, string, offset, length) | |
} | |
function base64Write (buf, string, offset, length) { | |
return blitBuffer(base64ToBytes(string), buf, offset, length) | |
} | |
function ucs2Write (buf, string, offset, length) { | |
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) | |
} | |
Buffer.prototype.write = function write (string, offset, length, encoding) { | |
if (offset === undefined) { | |
encoding = 'utf8'; | |
length = this.length; | |
offset = 0; | |
} else if (length === undefined && typeof offset === 'string') { | |
encoding = offset; | |
length = this.length; | |
offset = 0; | |
} else if (isFinite(offset)) { | |
offset = offset >>> 0; | |
if (isFinite(length)) { | |
length = length >>> 0; | |
if (encoding === undefined) encoding = 'utf8'; | |
} else { | |
encoding = length; | |
length = undefined; | |
} | |
} else { | |
throw new Error( | |
'Buffer.write(string, encoding, offset[, length]) is no longer supported' | |
) | |
} | |
var remaining = this.length - offset; | |
if (length === undefined || length > remaining) length = remaining; | |
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { | |
throw new RangeError('Attempt to write outside buffer bounds') | |
} | |
if (!encoding) encoding = 'utf8'; | |
var loweredCase = false; | |
for (;;) { | |
switch (encoding) { | |
case 'hex': | |
return hexWrite(this, string, offset, length) | |
case 'utf8': | |
case 'utf-8': | |
return utf8Write(this, string, offset, length) | |
case 'ascii': | |
return asciiWrite(this, string, offset, length) | |
case 'latin1': | |
case 'binary': | |
return latin1Write(this, string, offset, length) | |
case 'base64': | |
return base64Write(this, string, offset, length) | |
case 'ucs2': | |
case 'ucs-2': | |
case 'utf16le': | |
case 'utf-16le': | |
return ucs2Write(this, string, offset, length) | |
default: | |
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) | |
encoding = ('' + encoding).toLowerCase(); | |
loweredCase = true; | |
} | |
} | |
}; | |
Buffer.prototype.toJSON = function toJSON () { | |
return { | |
type: 'Buffer', | |
data: Array.prototype.slice.call(this._arr || this, 0) | |
} | |
}; | |
function base64Slice (buf, start, end) { | |
if (start === 0 && end === buf.length) { | |
return base64.fromByteArray(buf) | |
} else { | |
return base64.fromByteArray(buf.slice(start, end)) | |
} | |
} | |
function utf8Slice (buf, start, end) { | |
end = Math.min(buf.length, end); | |
var res = []; | |
var i = start; | |
while (i < end) { | |
var firstByte = buf[i]; | |
var codePoint = null; | |
var bytesPerSequence = (firstByte > 0xEF) ? 4 | |
: (firstByte > 0xDF) ? 3 | |
: (firstByte > 0xBF) ? 2 | |
: 1; | |
if (i + bytesPerSequence <= end) { | |
var secondByte, thirdByte, fourthByte, tempCodePoint; | |
switch (bytesPerSequence) { | |
case 1: | |
if (firstByte < 0x80) { | |
codePoint = firstByte; | |
} | |
break | |
case 2: | |
secondByte = buf[i + 1]; | |
if ((secondByte & 0xC0) === 0x80) { | |
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); | |
if (tempCodePoint > 0x7F) { | |
codePoint = tempCodePoint; | |
} | |
} | |
break | |
case 3: | |
secondByte = buf[i + 1]; | |
thirdByte = buf[i + 2]; | |
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { | |
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); | |
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { | |
codePoint = tempCodePoint; | |
} | |
} | |
break | |
case 4: | |
secondByte = buf[i + 1]; | |
thirdByte = buf[i + 2]; | |
fourthByte = buf[i + 3]; | |
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { | |
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); | |
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { | |
codePoint = tempCodePoint; | |
} | |
} | |
} | |
} | |
if (codePoint === null) { | |
codePoint = 0xFFFD; | |
bytesPerSequence = 1; | |
} else if (codePoint > 0xFFFF) { | |
codePoint -= 0x10000; | |
res.push(codePoint >>> 10 & 0x3FF | 0xD800); | |
codePoint = 0xDC00 | codePoint & 0x3FF; | |
} | |
res.push(codePoint); | |
i += bytesPerSequence; | |
} | |
return decodeCodePointsArray(res) | |
} | |
var MAX_ARGUMENTS_LENGTH = 0x1000; | |
function decodeCodePointsArray (codePoints) { | |
var len = codePoints.length; | |
if (len <= MAX_ARGUMENTS_LENGTH) { | |
return String.fromCharCode.apply(String, codePoints) | |
} | |
var res = ''; | |
var i = 0; | |
while (i < len) { | |
res += String.fromCharCode.apply( | |
String, | |
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) | |
); | |
} | |
return res | |
} | |
function asciiSlice (buf, start, end) { | |
var ret = ''; | |
end = Math.min(buf.length, end); | |
for (var i = start; i < end; ++i) { | |
ret += String.fromCharCode(buf[i] & 0x7F); | |
} | |
return ret | |
} | |
function latin1Slice (buf, start, end) { | |
var ret = ''; | |
end = Math.min(buf.length, end); | |
for (var i = start; i < end; ++i) { | |
ret += String.fromCharCode(buf[i]); | |
} | |
return ret | |
} | |
function hexSlice (buf, start, end) { | |
var len = buf.length; | |
if (!start || start < 0) start = 0; | |
if (!end || end < 0 || end > len) end = len; | |
var out = ''; | |
for (var i = start; i < end; ++i) { | |
out += toHex(buf[i]); | |
} | |
return out | |
} | |
function utf16leSlice (buf, start, end) { | |
var bytes = buf.slice(start, end); | |
var res = ''; | |
for (var i = 0; i < bytes.length; i += 2) { | |
res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)); | |
} | |
return res | |
} | |
Buffer.prototype.slice = function slice (start, end) { | |
var len = this.length; | |
start = ~~start; | |
end = end === undefined ? len : ~~end; | |
if (start < 0) { | |
start += len; | |
if (start < 0) start = 0; | |
} else if (start > len) { | |
start = len; | |
} | |
if (end < 0) { | |
end += len; | |
if (end < 0) end = 0; | |
} else if (end > len) { | |
end = len; | |
} | |
if (end < start) end = start; | |
var newBuf = this.subarray(start, end); | |
newBuf.__proto__ = Buffer.prototype; | |
return newBuf | |
}; | |
function checkOffset (offset, ext, length) { | |
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') | |
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') | |
} | |
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { | |
offset = offset >>> 0; | |
byteLength = byteLength >>> 0; | |
if (!noAssert) checkOffset(offset, byteLength, this.length); | |
var val = this[offset]; | |
var mul = 1; | |
var i = 0; | |
while (++i < byteLength && (mul *= 0x100)) { | |
val += this[offset + i] * mul; | |
} | |
return val | |
}; | |
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { | |
offset = offset >>> 0; | |
byteLength = byteLength >>> 0; | |
if (!noAssert) { | |
checkOffset(offset, byteLength, this.length); | |
} | |
var val = this[offset + --byteLength]; | |
var mul = 1; | |
while (byteLength > 0 && (mul *= 0x100)) { | |
val += this[offset + --byteLength] * mul; | |
} | |
return val | |
}; | |
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 1, this.length); | |
return this[offset] | |
}; | |
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 2, this.length); | |
return this[offset] | (this[offset + 1] << 8) | |
}; | |
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 2, this.length); | |
return (this[offset] << 8) | this[offset + 1] | |
}; | |
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 4, this.length); | |
return ((this[offset]) | | |
(this[offset + 1] << 8) | | |
(this[offset + 2] << 16)) + | |
(this[offset + 3] * 0x1000000) | |
}; | |
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 4, this.length); | |
return (this[offset] * 0x1000000) + | |
((this[offset + 1] << 16) | | |
(this[offset + 2] << 8) | | |
this[offset + 3]) | |
}; | |
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { | |
offset = offset >>> 0; | |
byteLength = byteLength >>> 0; | |
if (!noAssert) checkOffset(offset, byteLength, this.length); | |
var val = this[offset]; | |
var mul = 1; | |
var i = 0; | |
while (++i < byteLength && (mul *= 0x100)) { | |
val += this[offset + i] * mul; | |
} | |
mul *= 0x80; | |
if (val >= mul) val -= Math.pow(2, 8 * byteLength); | |
return val | |
}; | |
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { | |
offset = offset >>> 0; | |
byteLength = byteLength >>> 0; | |
if (!noAssert) checkOffset(offset, byteLength, this.length); | |
var i = byteLength; | |
var mul = 1; | |
var val = this[offset + --i]; | |
while (i > 0 && (mul *= 0x100)) { | |
val += this[offset + --i] * mul; | |
} | |
mul *= 0x80; | |
if (val >= mul) val -= Math.pow(2, 8 * byteLength); | |
return val | |
}; | |
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 1, this.length); | |
if (!(this[offset] & 0x80)) return (this[offset]) | |
return ((0xff - this[offset] + 1) * -1) | |
}; | |
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 2, this.length); | |
var val = this[offset] | (this[offset + 1] << 8); | |
return (val & 0x8000) ? val | 0xFFFF0000 : val | |
}; | |
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 2, this.length); | |
var val = this[offset + 1] | (this[offset] << 8); | |
return (val & 0x8000) ? val | 0xFFFF0000 : val | |
}; | |
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 4, this.length); | |
return (this[offset]) | | |
(this[offset + 1] << 8) | | |
(this[offset + 2] << 16) | | |
(this[offset + 3] << 24) | |
}; | |
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 4, this.length); | |
return (this[offset] << 24) | | |
(this[offset + 1] << 16) | | |
(this[offset + 2] << 8) | | |
(this[offset + 3]) | |
}; | |
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 4, this.length); | |
return ieee754.read(this, offset, true, 23, 4) | |
}; | |
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 4, this.length); | |
return ieee754.read(this, offset, false, 23, 4) | |
}; | |
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 8, this.length); | |
return ieee754.read(this, offset, true, 52, 8) | |
}; | |
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { | |
offset = offset >>> 0; | |
if (!noAssert) checkOffset(offset, 8, this.length); | |
return ieee754.read(this, offset, false, 52, 8) | |
}; | |
function checkInt (buf, value, offset, ext, max, min) { | |
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') | |
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') | |
if (offset + ext > buf.length) throw new RangeError('Index out of range') | |
} | |
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
byteLength = byteLength >>> 0; | |
if (!noAssert) { | |
var maxBytes = Math.pow(2, 8 * byteLength) - 1; | |
checkInt(this, value, offset, byteLength, maxBytes, 0); | |
} | |
var mul = 1; | |
var i = 0; | |
this[offset] = value & 0xFF; | |
while (++i < byteLength && (mul *= 0x100)) { | |
this[offset + i] = (value / mul) & 0xFF; | |
} | |
return offset + byteLength | |
}; | |
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
byteLength = byteLength >>> 0; | |
if (!noAssert) { | |
var maxBytes = Math.pow(2, 8 * byteLength) - 1; | |
checkInt(this, value, offset, byteLength, maxBytes, 0); | |
} | |
var i = byteLength - 1; | |
var mul = 1; | |
this[offset + i] = value & 0xFF; | |
while (--i >= 0 && (mul *= 0x100)) { | |
this[offset + i] = (value / mul) & 0xFF; | |
} | |
return offset + byteLength | |
}; | |
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); | |
this[offset] = (value & 0xff); | |
return offset + 1 | |
}; | |
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); | |
this[offset] = (value & 0xff); | |
this[offset + 1] = (value >>> 8); | |
return offset + 2 | |
}; | |
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); | |
this[offset] = (value >>> 8); | |
this[offset + 1] = (value & 0xff); | |
return offset + 2 | |
}; | |
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); | |
this[offset + 3] = (value >>> 24); | |
this[offset + 2] = (value >>> 16); | |
this[offset + 1] = (value >>> 8); | |
this[offset] = (value & 0xff); | |
return offset + 4 | |
}; | |
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); | |
this[offset] = (value >>> 24); | |
this[offset + 1] = (value >>> 16); | |
this[offset + 2] = (value >>> 8); | |
this[offset + 3] = (value & 0xff); | |
return offset + 4 | |
}; | |
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) { | |
var limit = Math.pow(2, (8 * byteLength) - 1); | |
checkInt(this, value, offset, byteLength, limit - 1, -limit); | |
} | |
var i = 0; | |
var mul = 1; | |
var sub = 0; | |
this[offset] = value & 0xFF; | |
while (++i < byteLength && (mul *= 0x100)) { | |
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { | |
sub = 1; | |
} | |
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; | |
} | |
return offset + byteLength | |
}; | |
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) { | |
var limit = Math.pow(2, (8 * byteLength) - 1); | |
checkInt(this, value, offset, byteLength, limit - 1, -limit); | |
} | |
var i = byteLength - 1; | |
var mul = 1; | |
var sub = 0; | |
this[offset + i] = value & 0xFF; | |
while (--i >= 0 && (mul *= 0x100)) { | |
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { | |
sub = 1; | |
} | |
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; | |
} | |
return offset + byteLength | |
}; | |
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); | |
if (value < 0) value = 0xff + value + 1; | |
this[offset] = (value & 0xff); | |
return offset + 1 | |
}; | |
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); | |
this[offset] = (value & 0xff); | |
this[offset + 1] = (value >>> 8); | |
return offset + 2 | |
}; | |
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); | |
this[offset] = (value >>> 8); | |
this[offset + 1] = (value & 0xff); | |
return offset + 2 | |
}; | |
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); | |
this[offset] = (value & 0xff); | |
this[offset + 1] = (value >>> 8); | |
this[offset + 2] = (value >>> 16); | |
this[offset + 3] = (value >>> 24); | |
return offset + 4 | |
}; | |
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); | |
if (value < 0) value = 0xffffffff + value + 1; | |
this[offset] = (value >>> 24); | |
this[offset + 1] = (value >>> 16); | |
this[offset + 2] = (value >>> 8); | |
this[offset + 3] = (value & 0xff); | |
return offset + 4 | |
}; | |
function checkIEEE754 (buf, value, offset, ext, max, min) { | |
if (offset + ext > buf.length) throw new RangeError('Index out of range') | |
if (offset < 0) throw new RangeError('Index out of range') | |
} | |
function writeFloat (buf, value, offset, littleEndian, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) { | |
checkIEEE754(buf, value, offset, 4); | |
} | |
ieee754.write(buf, value, offset, littleEndian, 23, 4); | |
return offset + 4 | |
} | |
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { | |
return writeFloat(this, value, offset, true, noAssert) | |
}; | |
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { | |
return writeFloat(this, value, offset, false, noAssert) | |
}; | |
function writeDouble (buf, value, offset, littleEndian, noAssert) { | |
value = +value; | |
offset = offset >>> 0; | |
if (!noAssert) { | |
checkIEEE754(buf, value, offset, 8); | |
} | |
ieee754.write(buf, value, offset, littleEndian, 52, 8); | |
return offset + 8 | |
} | |
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { | |
return writeDouble(this, value, offset, true, noAssert) | |
}; | |
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { | |
return writeDouble(this, value, offset, false, noAssert) | |
}; | |
Buffer.prototype.copy = function copy (target, targetStart, start, end) { | |
if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') | |
if (!start) start = 0; | |
if (!end && end !== 0) end = this.length; | |
if (targetStart >= target.length) targetStart = target.length; | |
if (!targetStart) targetStart = 0; | |
if (end > 0 && end < start) end = start; | |
if (end === start) return 0 | |
if (target.length === 0 || this.length === 0) return 0 | |
if (targetStart < 0) { | |
throw new RangeError('targetStart out of bounds') | |
} | |
if (start < 0 || start >= this.length) throw new RangeError('Index out of range') | |
if (end < 0) throw new RangeError('sourceEnd out of bounds') | |
if (end > this.length) end = this.length; | |
if (target.length - targetStart < end - start) { | |
end = target.length - targetStart + start; | |
} | |
var len = end - start; | |
if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { | |
this.copyWithin(targetStart, start, end); | |
} else if (this === target && start < targetStart && targetStart < end) { | |
for (var i = len - 1; i >= 0; --i) { | |
target[i + targetStart] = this[i + start]; | |
} | |
} else { | |
Uint8Array.prototype.set.call( | |
target, | |
this.subarray(start, end), | |
targetStart | |
); | |
} | |
return len | |
}; | |
Buffer.prototype.fill = function fill (val, start, end, encoding) { | |
if (typeof val === 'string') { | |
if (typeof start === 'string') { | |
encoding = start; | |
start = 0; | |
end = this.length; | |
} else if (typeof end === 'string') { | |
encoding = end; | |
end = this.length; | |
} | |
if (encoding !== undefined && typeof encoding !== 'string') { | |
throw new TypeError('encoding must be a string') | |
} | |
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { | |
throw new TypeError('Unknown encoding: ' + encoding) | |
} | |
if (val.length === 1) { | |
var code = val.charCodeAt(0); | |
if ((encoding === 'utf8' && code < 128) || | |
encoding === 'latin1') { | |
val = code; | |
} | |
} | |
} else if (typeof val === 'number') { | |
val = val & 255; | |
} | |
if (start < 0 || this.length < start || this.length < end) { | |
throw new RangeError('Out of range index') | |
} | |
if (end <= start) { | |
return this | |
} | |
start = start >>> 0; | |
end = end === undefined ? this.length : end >>> 0; | |
if (!val) val = 0; | |
var i; | |
if (typeof val === 'number') { | |
for (i = start; i < end; ++i) { | |
this[i] = val; | |
} | |
} else { | |
var bytes = Buffer.isBuffer(val) | |
? val | |
: Buffer.from(val, encoding); | |
var len = bytes.length; | |
if (len === 0) { | |
throw new TypeError('The value "' + val + | |
'" is invalid for argument "value"') | |
} | |
for (i = 0; i < end - start; ++i) { | |
this[i + start] = bytes[i % len]; | |
} | |
} | |
return this | |
}; | |
var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; | |
function base64clean (str) { | |
str = str.split('=')[0]; | |
str = str.trim().replace(INVALID_BASE64_RE, ''); | |
if (str.length < 2) return '' | |
while (str.length % 4 !== 0) { | |
str = str + '='; | |
} | |
return str | |
} | |
function toHex (n) { | |
if (n < 16) return '0' + n.toString(16) | |
return n.toString(16) | |
} | |
function utf8ToBytes (string, units) { | |
units = units || Infinity; | |
var codePoint; | |
var length = string.length; | |
var leadSurrogate = null; | |
var bytes = []; | |
for (var i = 0; i < length; ++i) { | |
codePoint = string.charCodeAt(i); | |
if (codePoint > 0xD7FF && codePoint < 0xE000) { | |
if (!leadSurrogate) { | |
if (codePoint > 0xDBFF) { | |
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); | |
continue | |
} else if (i + 1 === length) { | |
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); | |
continue | |
} | |
leadSurrogate = codePoint; | |
continue | |
} | |
if (codePoint < 0xDC00) { | |
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); | |
leadSurrogate = codePoint; | |
continue | |
} | |
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; | |
} else if (leadSurrogate) { | |
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); | |
} | |
leadSurrogate = null; | |
if (codePoint < 0x80) { | |
if ((units -= 1) < 0) break | |
bytes.push(codePoint); | |
} else if (codePoint < 0x800) { | |
if ((units -= 2) < 0) break | |
bytes.push( | |
codePoint >> 0x6 | 0xC0, | |
codePoint & 0x3F | 0x80 | |
); | |
} else if (codePoint < 0x10000) { | |
if ((units -= 3) < 0) break | |
bytes.push( | |
codePoint >> 0xC | 0xE0, | |
codePoint >> 0x6 & 0x3F | 0x80, | |
codePoint & 0x3F | 0x80 | |
); | |
} else if (codePoint < 0x110000) { | |
if ((units -= 4) < 0) break | |
bytes.push( | |
codePoint >> 0x12 | 0xF0, | |
codePoint >> 0xC & 0x3F | 0x80, | |
codePoint >> 0x6 & 0x3F | 0x80, | |
codePoint & 0x3F | 0x80 | |
); | |
} else { | |
throw new Error('Invalid code point') | |
} | |
} | |
return bytes | |
} | |
function asciiToBytes (str) { | |
var byteArray = []; | |
for (var i = 0; i < str.length; ++i) { | |
byteArray.push(str.charCodeAt(i) & 0xFF); | |
} | |
return byteArray | |
} | |
function utf16leToBytes (str, units) { | |
var c, hi, lo; | |
var byteArray = []; | |
for (var i = 0; i < str.length; ++i) { | |
if ((units -= 2) < 0) break | |
c = str.charCodeAt(i); | |
hi = c >> 8; | |
lo = c % 256; | |
byteArray.push(lo); | |
byteArray.push(hi); | |
} | |
return byteArray | |
} | |
function base64ToBytes (str) { | |
return base64.toByteArray(base64clean(str)) | |
} | |
function blitBuffer (src, dst, offset, length) { | |
for (var i = 0; i < length; ++i) { | |
if ((i + offset >= dst.length) || (i >= src.length)) break | |
dst[i + offset] = src[i]; | |
} | |
return i | |
} | |
function isInstance (obj, type) { | |
return obj instanceof type || | |
(obj != null && obj.constructor != null && obj.constructor.name != null && | |
obj.constructor.name === type.name) | |
} | |
function numberIsNaN (obj) { | |
return obj !== obj | |
} | |
},{"base64-js":24,"ieee754":31}],29:[function(require,module,exports){ | |
(function (Buffer){ | |
function isArray(arg) { | |
if (Array.isArray) { | |
return Array.isArray(arg); | |
} | |
return objectToString(arg) === '[object Array]'; | |
} | |
exports.isArray = isArray; | |
function isBoolean(arg) { | |
return typeof arg === 'boolean'; | |
} | |
exports.isBoolean = isBoolean; | |
function isNull(arg) { | |
return arg === null; | |
} | |
exports.isNull = isNull; | |
function isNullOrUndefined(arg) { | |
return arg == null; | |
} | |
exports.isNullOrUndefined = isNullOrUndefined; | |
function isNumber(arg) { | |
return typeof arg === 'number'; | |
} | |
exports.isNumber = isNumber; | |
function isString(arg) { | |
return typeof arg === 'string'; | |
} | |
exports.isString = isString; | |
function isSymbol(arg) { | |
return typeof arg === 'symbol'; | |
} | |
exports.isSymbol = isSymbol; | |
function isUndefined(arg) { | |
return arg === void 0; | |
} | |
exports.isUndefined = isUndefined; | |
function isRegExp(re) { | |
return objectToString(re) === '[object RegExp]'; | |
} | |
exports.isRegExp = isRegExp; | |
function isObject(arg) { | |
return typeof arg === 'object' && arg !== null; | |
} | |
exports.isObject = isObject; | |
function isDate(d) { | |
return objectToString(d) === '[object Date]'; | |
} | |
exports.isDate = isDate; | |
function isError(e) { | |
return (objectToString(e) === '[object Error]' || e instanceof Error); | |
} | |
exports.isError = isError; | |
function isFunction(arg) { | |
return typeof arg === 'function'; | |
} | |
exports.isFunction = isFunction; | |
function isPrimitive(arg) { | |
return arg === null || | |
typeof arg === 'boolean' || | |
typeof arg === 'number' || | |
typeof arg === 'string' || | |
typeof arg === 'symbol' || | |
typeof arg === 'undefined'; | |
} | |
exports.isPrimitive = isPrimitive; | |
exports.isBuffer = Buffer.isBuffer; | |
function objectToString(o) { | |
return Object.prototype.toString.call(o); | |
} | |
}).call(this,{"isBuffer":require("../../is-buffer/index.js")}); | |
},{"../../is-buffer/index.js":33}],30:[function(require,module,exports){ | |
var objectCreate = Object.create || objectCreatePolyfill; | |
var objectKeys = Object.keys || objectKeysPolyfill; | |
var bind = Function.prototype.bind || functionBindPolyfill; | |
function EventEmitter() { | |
if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { | |
this._events = objectCreate(null); | |
this._eventsCount = 0; | |
} | |
this._maxListeners = this._maxListeners || undefined; | |
} | |
module.exports = EventEmitter; | |
EventEmitter.EventEmitter = EventEmitter; | |
EventEmitter.prototype._events = undefined; | |
EventEmitter.prototype._maxListeners = undefined; | |
var defaultMaxListeners = 10; | |
var hasDefineProperty; | |
try { | |
var o = {}; | |
if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); | |
hasDefineProperty = o.x === 0; | |
} catch (err) { hasDefineProperty = false; } | |
if (hasDefineProperty) { | |
Object.defineProperty(EventEmitter, 'defaultMaxListeners', { | |
enumerable: true, | |
get: function() { | |
return defaultMaxListeners; | |
}, | |
set: function(arg) { | |
if (typeof arg !== 'number' || arg < 0 || arg !== arg) | |
throw new TypeError('"defaultMaxListeners" must be a positive number'); | |
defaultMaxListeners = arg; | |
} | |
}); | |
} else { | |
EventEmitter.defaultMaxListeners = defaultMaxListeners; | |
} | |
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { | |
if (typeof n !== 'number' || n < 0 || isNaN(n)) | |
throw new TypeError('"n" argument must be a positive number'); | |
this._maxListeners = n; | |
return this; | |
}; | |
function $getMaxListeners(that) { | |
if (that._maxListeners === undefined) | |
return EventEmitter.defaultMaxListeners; | |
return that._maxListeners; | |
} | |
EventEmitter.prototype.getMaxListeners = function getMaxListeners() { | |
return $getMaxListeners(this); | |
}; | |
function emitNone(handler, isFn, self) { | |
if (isFn) | |
handler.call(self); | |
else { | |
var len = handler.length; | |
var listeners = arrayClone(handler, len); | |
for (var i = 0; i < len; ++i) | |
listeners[i].call(self); | |
} | |
} | |
function emitOne(handler, isFn, self, arg1) { | |
if (isFn) | |
handler.call(self, arg1); | |
else { | |
var len = handler.length; | |
var listeners = arrayClone(handler, len); | |
for (var i = 0; i < len; ++i) | |
listeners[i].call(self, arg1); | |
} | |
} | |
function emitTwo(handler, isFn, self, arg1, arg2) { | |
if (isFn) | |
handler.call(self, arg1, arg2); | |
else { | |
var len = handler.length; | |
var listeners = arrayClone(handler, len); | |
for (var i = 0; i < len; ++i) | |
listeners[i].call(self, arg1, arg2); | |
} | |
} | |
function emitThree(handler, isFn, self, arg1, arg2, arg3) { | |
if (isFn) | |
handler.call(self, arg1, arg2, arg3); | |
else { | |
var len = handler.length; | |
var listeners = arrayClone(handler, len); | |
for (var i = 0; i < len; ++i) | |
listeners[i].call(self, arg1, arg2, arg3); | |
} | |
} | |
function emitMany(handler, isFn, self, args) { | |
if (isFn) | |
handler.apply(self, args); | |
else { | |
var len = handler.length; | |
var listeners = arrayClone(handler, len); | |
for (var i = 0; i < len; ++i) | |
listeners[i].apply(self, args); | |
} | |
} | |
EventEmitter.prototype.emit = function emit(type) { | |
var er, handler, len, args, i, events; | |
var doError = (type === 'error'); | |
events = this._events; | |
if (events) | |
doError = (doError && events.error == null); | |
else if (!doError) | |
return false; | |
if (doError) { | |
if (arguments.length > 1) | |
er = arguments[1]; | |
if (er instanceof Error) { | |
throw er; | |
} else { | |
var err = new Error('Unhandled "error" event. (' + er + ')'); | |
err.context = er; | |
throw err; | |
} | |
} | |
handler = events[type]; | |
if (!handler) | |
return false; | |
var isFn = typeof handler === 'function'; | |
len = arguments.length; | |
switch (len) { | |
case 1: | |
emitNone(handler, isFn, this); | |
break; | |
case 2: | |
emitOne(handler, isFn, this, arguments[1]); | |
break; | |
case 3: | |
emitTwo(handler, isFn, this, arguments[1], arguments[2]); | |
break; | |
case 4: | |
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); | |
break; | |
default: | |
args = new Array(len - 1); | |
for (i = 1; i < len; i++) | |
args[i - 1] = arguments[i]; | |
emitMany(handler, isFn, this, args); | |
} | |
return true; | |
}; | |
function _addListener(target, type, listener, prepend) { | |
var m; | |
var events; | |
var existing; | |
if (typeof listener !== 'function') | |
throw new TypeError('"listener" argument must be a function'); | |
events = target._events; | |
if (!events) { | |
events = target._events = objectCreate(null); | |
target._eventsCount = 0; | |
} else { | |
if (events.newListener) { | |
target.emit('newListener', type, | |
listener.listener ? listener.listener : listener); | |
events = target._events; | |
} | |
existing = events[type]; | |
} | |
if (!existing) { | |
existing = events[type] = listener; | |
++target._eventsCount; | |
} else { | |
if (typeof existing === 'function') { | |
existing = events[type] = | |
prepend ? [listener, existing] : [existing, listener]; | |
} else { | |
if (prepend) { | |
existing.unshift(listener); | |
} else { | |
existing.push(listener); | |
} | |
} | |
if (!existing.warned) { | |
m = $getMaxListeners(target); | |
if (m && m > 0 && existing.length > m) { | |
existing.warned = true; | |
var w = new Error('Possible EventEmitter memory leak detected. ' + | |
existing.length + ' "' + String(type) + '" listeners ' + | |
'added. Use emitter.setMaxListeners() to ' + | |
'increase limit.'); | |
w.name = 'MaxListenersExceededWarning'; | |
w.emitter = target; | |
w.type = type; | |
w.count = existing.length; | |
if (typeof console === 'object' && console.warn) { | |
console.warn('%s: %s', w.name, w.message); | |
} | |
} | |
} | |
} | |
return target; | |
} | |
EventEmitter.prototype.addListener = function addListener(type, listener) { | |
return _addListener(this, type, listener, false); | |
}; | |
EventEmitter.prototype.on = EventEmitter.prototype.addListener; | |
EventEmitter.prototype.prependListener = | |
function prependListener(type, listener) { | |
return _addListener(this, type, listener, true); | |
}; | |
function onceWrapper() { | |
if (!this.fired) { | |
this.target.removeListener(this.type, this.wrapFn); | |
this.fired = true; | |
switch (arguments.length) { | |
case 0: | |
return this.listener.call(this.target); | |
case 1: | |
return this.listener.call(this.target, arguments[0]); | |
case 2: | |
return this.listener.call(this.target, arguments[0], arguments[1]); | |
case 3: | |
return this.listener.call(this.target, arguments[0], arguments[1], | |
arguments[2]); | |
default: | |
var args = new Array(arguments.length); | |
for (var i = 0; i < args.length; ++i) | |
args[i] = arguments[i]; | |
this.listener.apply(this.target, args); | |
} | |
} | |
} | |
function _onceWrap(target, type, listener) { | |
var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; | |
var wrapped = bind.call(onceWrapper, state); | |
wrapped.listener = listener; | |
state.wrapFn = wrapped; | |
return wrapped; | |
} | |
EventEmitter.prototype.once = function once(type, listener) { | |
if (typeof listener !== 'function') | |
throw new TypeError('"listener" argument must be a function'); | |
this.on(type, _onceWrap(this, type, listener)); | |
return this; | |
}; | |
EventEmitter.prototype.prependOnceListener = | |
function prependOnceListener(type, listener) { | |
if (typeof listener !== 'function') | |
throw new TypeError('"listener" argument must be a function'); | |
this.prependListener(type, _onceWrap(this, type, listener)); | |
return this; | |
}; | |
EventEmitter.prototype.removeListener = | |
function removeListener(type, listener) { | |
var list, events, position, i, originalListener; | |
if (typeof listener !== 'function') | |
throw new TypeError('"listener" argument must be a function'); | |
events = this._events; | |
if (!events) | |
return this; | |
list = events[type]; | |
if (!list) | |
return this; | |
if (list === listener || list.listener === listener) { | |
if (--this._eventsCount === 0) | |
this._events = objectCreate(null); | |
else { | |
delete events[type]; | |
if (events.removeListener) | |
this.emit('removeListener', type, list.listener || listener); | |
} | |
} else if (typeof list !== 'function') { | |
position = -1; | |
for (i = list.length - 1; i >= 0; i--) { | |
if (list[i] === listener || list[i].listener === listener) { | |
originalListener = list[i].listener; | |
position = i; | |
break; | |
} | |
} | |
if (position < 0) | |
return this; | |
if (position === 0) | |
list.shift(); | |
else | |
spliceOne(list, position); | |
if (list.length === 1) | |
events[type] = list[0]; | |
if (events.removeListener) | |
this.emit('removeListener', type, originalListener || listener); | |
} | |
return this; | |
}; | |
EventEmitter.prototype.removeAllListeners = | |
function removeAllListeners(type) { | |
var listeners, events, i; | |
events = this._events; | |
if (!events) | |
return this; | |
if (!events.removeListener) { | |
if (arguments.length === 0) { | |
this._events = objectCreate(null); | |
this._eventsCount = 0; | |
} else if (events[type]) { | |
if (--this._eventsCount === 0) | |
this._events = objectCreate(null); | |
else | |
delete events[type]; | |
} | |
return this; | |
} | |
if (arguments.length === 0) { | |
var keys = objectKeys(events); | |
var key; | |
for (i = 0; i < keys.length; ++i) { | |
key = keys[i]; | |
if (key === 'removeListener') continue; | |
this.removeAllListeners(key); | |
} | |
this.removeAllListeners('removeListener'); | |
this._events = objectCreate(null); | |
this._eventsCount = 0; | |
return this; | |
} | |
listeners = events[type]; | |
if (typeof listeners === 'function') { | |
this.removeListener(type, listeners); | |
} else if (listeners) { | |
for (i = listeners.length - 1; i >= 0; i--) { | |
this.removeListener(type, listeners[i]); | |
} | |
} | |
return this; | |
}; | |
function _listeners(target, type, unwrap) { | |
var events = target._events; | |
if (!events) | |
return []; | |
var evlistener = events[type]; | |
if (!evlistener) | |
return []; | |
if (typeof evlistener === 'function') | |
return unwrap ? [evlistener.listener || evlistener] : [evlistener]; | |
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); | |
} | |
EventEmitter.prototype.listeners = function listeners(type) { | |
return _listeners(this, type, true); | |
}; | |
EventEmitter.prototype.rawListeners = function rawListeners(type) { | |
return _listeners(this, type, false); | |
}; | |
EventEmitter.listenerCount = function(emitter, type) { | |
if (typeof emitter.listenerCount === 'function') { | |
return emitter.listenerCount(type); | |
} else { | |
return listenerCount.call(emitter, type); | |
} | |
}; | |
EventEmitter.prototype.listenerCount = listenerCount; | |
function listenerCount(type) { | |
var events = this._events; | |
if (events) { | |
var evlistener = events[type]; | |
if (typeof evlistener === 'function') { | |
return 1; | |
} else if (evlistener) { | |
return evlistener.length; | |
} | |
} | |
return 0; | |
} | |
EventEmitter.prototype.eventNames = function eventNames() { | |
return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; | |
}; | |
function spliceOne(list, index) { | |
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) | |
list[i] = list[k]; | |
list.pop(); | |
} | |
function arrayClone(arr, n) { | |
var copy = new Array(n); | |
for (var i = 0; i < n; ++i) | |
copy[i] = arr[i]; | |
return copy; | |
} | |
function unwrapListeners(arr) { | |
var ret = new Array(arr.length); | |
for (var i = 0; i < ret.length; ++i) { | |
ret[i] = arr[i].listener || arr[i]; | |
} | |
return ret; | |
} | |
function objectCreatePolyfill(proto) { | |
var F = function() {}; | |
F.prototype = proto; | |
return new F; | |
} | |
function objectKeysPolyfill(obj) { | |
for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) ; | |
return k; | |
} | |
function functionBindPolyfill(context) { | |
var fn = this; | |
return function () { | |
return fn.apply(context, arguments); | |
}; | |
} | |
},{}],31:[function(require,module,exports){ | |
exports.read = function (buffer, offset, isLE, mLen, nBytes) { | |
var e, m; | |
var eLen = nBytes * 8 - mLen - 1; | |
var eMax = (1 << eLen) - 1; | |
var eBias = eMax >> 1; | |
var nBits = -7; | |
var i = isLE ? (nBytes - 1) : 0; | |
var d = isLE ? -1 : 1; | |
var s = buffer[offset + i]; | |
i += d; | |
e = s & ((1 << (-nBits)) - 1); | |
s >>= (-nBits); | |
nBits += eLen; | |
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} | |
m = e & ((1 << (-nBits)) - 1); | |
e >>= (-nBits); | |
nBits += mLen; | |
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} | |
if (e === 0) { | |
e = 1 - eBias; | |
} else if (e === eMax) { | |
return m ? NaN : ((s ? -1 : 1) * Infinity) | |
} else { | |
m = m + Math.pow(2, mLen); | |
e = e - eBias; | |
} | |
return (s ? -1 : 1) * m * Math.pow(2, e - mLen) | |
}; | |
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { | |
var e, m, c; | |
var eLen = nBytes * 8 - mLen - 1; | |
var eMax = (1 << eLen) - 1; | |
var eBias = eMax >> 1; | |
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); | |
var i = isLE ? 0 : (nBytes - 1); | |
var d = isLE ? 1 : -1; | |
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; | |
value = Math.abs(value); | |
if (isNaN(value) || value === Infinity) { | |
m = isNaN(value) ? 1 : 0; | |
e = eMax; | |
} else { | |
e = Math.floor(Math.log(value) / Math.LN2); | |
if (value * (c = Math.pow(2, -e)) < 1) { | |
e--; | |
c *= 2; | |
} | |
if (e + eBias >= 1) { | |
value += rt / c; | |
} else { | |
value += rt * Math.pow(2, 1 - eBias); | |
} | |
if (value * c >= 2) { | |
e++; | |
c /= 2; | |
} | |
if (e + eBias >= eMax) { | |
m = 0; | |
e = eMax; | |
} else if (e + eBias >= 1) { | |
m = (value * c - 1) * Math.pow(2, mLen); | |
e = e + eBias; | |
} else { | |
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); | |
e = 0; | |
} | |
} | |
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} | |
e = (e << mLen) | m; | |
eLen += mLen; | |
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} | |
buffer[offset + i - d] |= s * 128; | |
}; | |
},{}],32:[function(require,module,exports){ | |
if (typeof Object.create === 'function') { | |
module.exports = function inherits(ctor, superCtor) { | |
ctor.super_ = superCtor; | |
ctor.prototype = Object.create(superCtor.prototype, { | |
constructor: { | |
value: ctor, | |
enumerable: false, | |
writable: true, | |
configurable: true | |
} | |
}); | |
}; | |
} else { | |
module.exports = function inherits(ctor, superCtor) { | |
ctor.super_ = superCtor; | |
var TempCtor = function () {}; | |
TempCtor.prototype = superCtor.prototype; | |
ctor.prototype = new TempCtor(); | |
ctor.prototype.constructor = ctor; | |
}; | |
} | |
},{}],33:[function(require,module,exports){ | |
/*! | |
* Determine if an object is a Buffer | |
* | |
* @author Feross Aboukhadijeh <https://feross.org> | |
* @license MIT | |
*/ | |
module.exports = function (obj) { | |
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) | |
}; | |
function isBuffer (obj) { | |
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) | |
} | |
function isSlowBuffer (obj) { | |
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) | |
} | |
},{}],34:[function(require,module,exports){ | |
var toString = {}.toString; | |
module.exports = Array.isArray || function (arr) { | |
return toString.call(arr) == '[object Array]'; | |
}; | |
},{}],35:[function(require,module,exports){ | |
var TYPED_OK = (typeof Uint8Array !== 'undefined') && | |
(typeof Uint16Array !== 'undefined') && | |
(typeof Int32Array !== 'undefined'); | |
function _has(obj, key) { | |
return Object.prototype.hasOwnProperty.call(obj, key); | |
} | |
exports.assign = function (obj ) { | |
var sources = Array.prototype.slice.call(arguments, 1); | |
while (sources.length) { | |
var source = sources.shift(); | |
if (!source) { continue; } | |
if (typeof source !== 'object') { | |
throw new TypeError(source + 'must be non-object'); | |
} | |
for (var p in source) { | |
if (_has(source, p)) { | |
obj[p] = source[p]; | |
} | |
} | |
} | |
return obj; | |
}; | |
exports.shrinkBuf = function (buf, size) { | |
if (buf.length === size) { return buf; } | |
if (buf.subarray) { return buf.subarray(0, size); } | |
buf.length = size; | |
return buf; | |
}; | |
var fnTyped = { | |
arraySet: function (dest, src, src_offs, len, dest_offs) { | |
if (src.subarray && dest.subarray) { | |
dest.set(src.subarray(src_offs, src_offs + len), dest_offs); | |
return; | |
} | |
for (var i = 0; i < len; i++) { | |
dest[dest_offs + i] = src[src_offs + i]; | |
} | |
}, | |
flattenChunks: function (chunks) { | |
var i, l, len, pos, chunk, result; | |
len = 0; | |
for (i = 0, l = chunks.length; i < l; i++) { | |
len += chunks[i].length; | |
} | |
result = new Uint8Array(len); | |
pos = 0; | |
for (i = 0, l = chunks.length; i < l; i++) { | |
chunk = chunks[i]; | |
result.set(chunk, pos); | |
pos += chunk.length; | |
} | |
return result; | |
} | |
}; | |
var fnUntyped = { | |
arraySet: function (dest, src, src_offs, len, dest_offs) { | |
for (var i = 0; i < len; i++) { | |
dest[dest_offs + i] = src[src_offs + i]; | |
} | |
}, | |
flattenChunks: function (chunks) { | |
return [].concat.apply([], chunks); | |
} | |
}; | |
exports.setTyped = function (on) { | |
if (on) { | |
exports.Buf8 = Uint8Array; | |
exports.Buf16 = Uint16Array; | |
exports.Buf32 = Int32Array; | |
exports.assign(exports, fnTyped); | |
} else { | |
exports.Buf8 = Array; | |
exports.Buf16 = Array; | |
exports.Buf32 = Array; | |
exports.assign(exports, fnUntyped); | |
} | |
}; | |
exports.setTyped(TYPED_OK); | |
},{}],36:[function(require,module,exports){ | |
function adler32(adler, buf, len, pos) { | |
var s1 = (adler & 0xffff) |0, | |
s2 = ((adler >>> 16) & 0xffff) |0, | |
n = 0; | |
while (len !== 0) { | |
n = len > 2000 ? 2000 : len; | |
len -= n; | |
do { | |
s1 = (s1 + buf[pos++]) |0; | |
s2 = (s2 + s1) |0; | |
} while (--n); | |
s1 %= 65521; | |
s2 %= 65521; | |
} | |
return (s1 | (s2 << 16)) |0; | |
} | |
module.exports = adler32; | |
},{}],37:[function(require,module,exports){ | |
module.exports = { | |
Z_NO_FLUSH: 0, | |
Z_PARTIAL_FLUSH: 1, | |
Z_SYNC_FLUSH: 2, | |
Z_FULL_FLUSH: 3, | |
Z_FINISH: 4, | |
Z_BLOCK: 5, | |
Z_TREES: 6, | |
Z_OK: 0, | |
Z_STREAM_END: 1, | |
Z_NEED_DICT: 2, | |
Z_ERRNO: -1, | |
Z_STREAM_ERROR: -2, | |
Z_DATA_ERROR: -3, | |
Z_BUF_ERROR: -5, | |
Z_NO_COMPRESSION: 0, | |
Z_BEST_SPEED: 1, | |
Z_BEST_COMPRESSION: 9, | |
Z_DEFAULT_COMPRESSION: -1, | |
Z_FILTERED: 1, | |
Z_HUFFMAN_ONLY: 2, | |
Z_RLE: 3, | |
Z_FIXED: 4, | |
Z_DEFAULT_STRATEGY: 0, | |
Z_BINARY: 0, | |
Z_TEXT: 1, | |
Z_UNKNOWN: 2, | |
Z_DEFLATED: 8 | |
}; | |
},{}],38:[function(require,module,exports){ | |
function makeTable() { | |
var c, table = []; | |
for (var n = 0; n < 256; n++) { | |
c = n; | |
for (var k = 0; k < 8; k++) { | |
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); | |
} | |
table[n] = c; | |
} | |
return table; | |
} | |
var crcTable = makeTable(); | |
function crc32(crc, buf, len, pos) { | |
var t = crcTable, | |
end = pos + len; | |
crc ^= -1; | |
for (var i = pos; i < end; i++) { | |
crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; | |
} | |
return (crc ^ (-1)); | |
} | |
module.exports = crc32; | |
},{}],39:[function(require,module,exports){ | |
var utils = require('../utils/common'); | |
var trees = require('./trees'); | |
var adler32 = require('./adler32'); | |
var crc32 = require('./crc32'); | |
var msg = require('./messages'); | |
var Z_NO_FLUSH = 0; | |
var Z_PARTIAL_FLUSH = 1; | |
var Z_FULL_FLUSH = 3; | |
var Z_FINISH = 4; | |
var Z_BLOCK = 5; | |
var Z_OK = 0; | |
var Z_STREAM_END = 1; | |
var Z_STREAM_ERROR = -2; | |
var Z_DATA_ERROR = -3; | |
var Z_BUF_ERROR = -5; | |
var Z_DEFAULT_COMPRESSION = -1; | |
var Z_FILTERED = 1; | |
var Z_HUFFMAN_ONLY = 2; | |
var Z_RLE = 3; | |
var Z_FIXED = 4; | |
var Z_DEFAULT_STRATEGY = 0; | |
var Z_UNKNOWN = 2; | |
var Z_DEFLATED = 8; | |
var MAX_MEM_LEVEL = 9; | |
var MAX_WBITS = 15; | |
var DEF_MEM_LEVEL = 8; | |
var LENGTH_CODES = 29; | |
var LITERALS = 256; | |
var L_CODES = LITERALS + 1 + LENGTH_CODES; | |
var D_CODES = 30; | |
var BL_CODES = 19; | |
var HEAP_SIZE = 2 * L_CODES + 1; | |
var MAX_BITS = 15; | |
var MIN_MATCH = 3; | |
var MAX_MATCH = 258; | |
var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); | |
var PRESET_DICT = 0x20; | |
var INIT_STATE = 42; | |
var EXTRA_STATE = 69; | |
var NAME_STATE = 73; | |
var COMMENT_STATE = 91; | |
var HCRC_STATE = 103; | |
var BUSY_STATE = 113; | |
var FINISH_STATE = 666; | |
var BS_NEED_MORE = 1; | |
var BS_BLOCK_DONE = 2; | |
var BS_FINISH_STARTED = 3; | |
var BS_FINISH_DONE = 4; | |
var OS_CODE = 0x03; | |
function err(strm, errorCode) { | |
strm.msg = msg[errorCode]; | |
return errorCode; | |
} | |
function rank(f) { | |
return ((f) << 1) - ((f) > 4 ? 9 : 0); | |
} | |
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } | |
function flush_pending(strm) { | |
var s = strm.state; | |
var len = s.pending; | |
if (len > strm.avail_out) { | |
len = strm.avail_out; | |
} | |
if (len === 0) { return; } | |
utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); | |
strm.next_out += len; | |
s.pending_out += len; | |
strm.total_out += len; | |
strm.avail_out -= len; | |
s.pending -= len; | |
if (s.pending === 0) { | |
s.pending_out = 0; | |
} | |
} | |
function flush_block_only(s, last) { | |
trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); | |
s.block_start = s.strstart; | |
flush_pending(s.strm); | |
} | |
function put_byte(s, b) { | |
s.pending_buf[s.pending++] = b; | |
} | |
function putShortMSB(s, b) { | |
s.pending_buf[s.pending++] = (b >>> 8) & 0xff; | |
s.pending_buf[s.pending++] = b & 0xff; | |
} | |
function read_buf(strm, buf, start, size) { | |
var len = strm.avail_in; | |
if (len > size) { len = size; } | |
if (len === 0) { return 0; } | |
strm.avail_in -= len; | |
utils.arraySet(buf, strm.input, strm.next_in, len, start); | |
if (strm.state.wrap === 1) { | |
strm.adler = adler32(strm.adler, buf, len, start); | |
} | |
else if (strm.state.wrap === 2) { | |
strm.adler = crc32(strm.adler, buf, len, start); | |
} | |
strm.next_in += len; | |
strm.total_in += len; | |
return len; | |
} | |
function longest_match(s, cur_match) { | |
var chain_length = s.max_chain_length; | |
var scan = s.strstart; | |
var match; | |
var len; | |
var best_len = s.prev_length; | |
var nice_match = s.nice_match; | |
var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? | |
s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0; | |
var _win = s.window; | |
var wmask = s.w_mask; | |
var prev = s.prev; | |
var strend = s.strstart + MAX_MATCH; | |
var scan_end1 = _win[scan + best_len - 1]; | |
var scan_end = _win[scan + best_len]; | |
if (s.prev_length >= s.good_match) { | |
chain_length >>= 2; | |
} | |
if (nice_match > s.lookahead) { nice_match = s.lookahead; } | |
do { | |
match = cur_match; | |
if (_win[match + best_len] !== scan_end || | |
_win[match + best_len - 1] !== scan_end1 || | |
_win[match] !== _win[scan] || | |
_win[++match] !== _win[scan + 1]) { | |
continue; | |
} | |
scan += 2; | |
match++; | |
do { | |
} while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && | |
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && | |
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && | |
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && | |
scan < strend); | |
len = MAX_MATCH - (strend - scan); | |
scan = strend - MAX_MATCH; | |
if (len > best_len) { | |
s.match_start = cur_match; | |
best_len = len; | |
if (len >= nice_match) { | |
break; | |
} | |
scan_end1 = _win[scan + best_len - 1]; | |
scan_end = _win[scan + best_len]; | |
} | |
} while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); | |
if (best_len <= s.lookahead) { | |
return best_len; | |
} | |
return s.lookahead; | |
} | |
function fill_window(s) { | |
var _w_size = s.w_size; | |
var p, n, m, more, str; | |
do { | |
more = s.window_size - s.lookahead - s.strstart; | |
if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { | |
utils.arraySet(s.window, s.window, _w_size, _w_size, 0); | |
s.match_start -= _w_size; | |
s.strstart -= _w_size; | |
s.block_start -= _w_size; | |
n = s.hash_size; | |
p = n; | |
do { | |
m = s.head[--p]; | |
s.head[p] = (m >= _w_size ? m - _w_size : 0); | |
} while (--n); | |
n = _w_size; | |
p = n; | |
do { | |
m = s.prev[--p]; | |
s.prev[p] = (m >= _w_size ? m - _w_size : 0); | |
} while (--n); | |
more += _w_size; | |
} | |
if (s.strm.avail_in === 0) { | |
break; | |
} | |
n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); | |
s.lookahead += n; | |
if (s.lookahead + s.insert >= MIN_MATCH) { | |
str = s.strstart - s.insert; | |
s.ins_h = s.window[str]; | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; | |
while (s.insert) { | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; | |
s.prev[str & s.w_mask] = s.head[s.ins_h]; | |
s.head[s.ins_h] = str; | |
str++; | |
s.insert--; | |
if (s.lookahead + s.insert < MIN_MATCH) { | |
break; | |
} | |
} | |
} | |
} while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); | |
} | |
function deflate_stored(s, flush) { | |
var max_block_size = 0xffff; | |
if (max_block_size > s.pending_buf_size - 5) { | |
max_block_size = s.pending_buf_size - 5; | |
} | |
for (;;) { | |
if (s.lookahead <= 1) { | |
fill_window(s); | |
if (s.lookahead === 0 && flush === Z_NO_FLUSH) { | |
return BS_NEED_MORE; | |
} | |
if (s.lookahead === 0) { | |
break; | |
} | |
} | |
s.strstart += s.lookahead; | |
s.lookahead = 0; | |
var max_start = s.block_start + max_block_size; | |
if (s.strstart === 0 || s.strstart >= max_start) { | |
s.lookahead = s.strstart - max_start; | |
s.strstart = max_start; | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
} | |
s.insert = 0; | |
if (flush === Z_FINISH) { | |
flush_block_only(s, true); | |
if (s.strm.avail_out === 0) { | |
return BS_FINISH_STARTED; | |
} | |
return BS_FINISH_DONE; | |
} | |
if (s.strstart > s.block_start) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
return BS_NEED_MORE; | |
} | |
function deflate_fast(s, flush) { | |
var hash_head; | |
var bflush; | |
for (;;) { | |
if (s.lookahead < MIN_LOOKAHEAD) { | |
fill_window(s); | |
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { | |
return BS_NEED_MORE; | |
} | |
if (s.lookahead === 0) { | |
break; | |
} | |
} | |
hash_head = 0; | |
if (s.lookahead >= MIN_MATCH) { | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; | |
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; | |
s.head[s.ins_h] = s.strstart; | |
} | |
if (hash_head !== 0 && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { | |
s.match_length = longest_match(s, hash_head); | |
} | |
if (s.match_length >= MIN_MATCH) { | |
bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); | |
s.lookahead -= s.match_length; | |
if (s.match_length <= s.max_lazy_match && s.lookahead >= MIN_MATCH) { | |
s.match_length--; | |
do { | |
s.strstart++; | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; | |
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; | |
s.head[s.ins_h] = s.strstart; | |
} while (--s.match_length !== 0); | |
s.strstart++; | |
} else | |
{ | |
s.strstart += s.match_length; | |
s.match_length = 0; | |
s.ins_h = s.window[s.strstart]; | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; | |
} | |
} else { | |
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); | |
s.lookahead--; | |
s.strstart++; | |
} | |
if (bflush) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
} | |
s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); | |
if (flush === Z_FINISH) { | |
flush_block_only(s, true); | |
if (s.strm.avail_out === 0) { | |
return BS_FINISH_STARTED; | |
} | |
return BS_FINISH_DONE; | |
} | |
if (s.last_lit) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
return BS_BLOCK_DONE; | |
} | |
function deflate_slow(s, flush) { | |
var hash_head; | |
var bflush; | |
var max_insert; | |
for (;;) { | |
if (s.lookahead < MIN_LOOKAHEAD) { | |
fill_window(s); | |
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { | |
return BS_NEED_MORE; | |
} | |
if (s.lookahead === 0) { break; } | |
} | |
hash_head = 0; | |
if (s.lookahead >= MIN_MATCH) { | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; | |
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; | |
s.head[s.ins_h] = s.strstart; | |
} | |
s.prev_length = s.match_length; | |
s.prev_match = s.match_start; | |
s.match_length = MIN_MATCH - 1; | |
if (hash_head !== 0 && s.prev_length < s.max_lazy_match && | |
s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)) { | |
s.match_length = longest_match(s, hash_head); | |
if (s.match_length <= 5 && | |
(s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096))) { | |
s.match_length = MIN_MATCH - 1; | |
} | |
} | |
if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { | |
max_insert = s.strstart + s.lookahead - MIN_MATCH; | |
bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); | |
s.lookahead -= s.prev_length - 1; | |
s.prev_length -= 2; | |
do { | |
if (++s.strstart <= max_insert) { | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; | |
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; | |
s.head[s.ins_h] = s.strstart; | |
} | |
} while (--s.prev_length !== 0); | |
s.match_available = 0; | |
s.match_length = MIN_MATCH - 1; | |
s.strstart++; | |
if (bflush) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
} else if (s.match_available) { | |
bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); | |
if (bflush) { | |
flush_block_only(s, false); | |
} | |
s.strstart++; | |
s.lookahead--; | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} else { | |
s.match_available = 1; | |
s.strstart++; | |
s.lookahead--; | |
} | |
} | |
if (s.match_available) { | |
bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); | |
s.match_available = 0; | |
} | |
s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; | |
if (flush === Z_FINISH) { | |
flush_block_only(s, true); | |
if (s.strm.avail_out === 0) { | |
return BS_FINISH_STARTED; | |
} | |
return BS_FINISH_DONE; | |
} | |
if (s.last_lit) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
return BS_BLOCK_DONE; | |
} | |
function deflate_rle(s, flush) { | |
var bflush; | |
var prev; | |
var scan, strend; | |
var _win = s.window; | |
for (;;) { | |
if (s.lookahead <= MAX_MATCH) { | |
fill_window(s); | |
if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { | |
return BS_NEED_MORE; | |
} | |
if (s.lookahead === 0) { break; } | |
} | |
s.match_length = 0; | |
if (s.lookahead >= MIN_MATCH && s.strstart > 0) { | |
scan = s.strstart - 1; | |
prev = _win[scan]; | |
if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { | |
strend = s.strstart + MAX_MATCH; | |
do { | |
} while (prev === _win[++scan] && prev === _win[++scan] && | |
prev === _win[++scan] && prev === _win[++scan] && | |
prev === _win[++scan] && prev === _win[++scan] && | |
prev === _win[++scan] && prev === _win[++scan] && | |
scan < strend); | |
s.match_length = MAX_MATCH - (strend - scan); | |
if (s.match_length > s.lookahead) { | |
s.match_length = s.lookahead; | |
} | |
} | |
} | |
if (s.match_length >= MIN_MATCH) { | |
bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); | |
s.lookahead -= s.match_length; | |
s.strstart += s.match_length; | |
s.match_length = 0; | |
} else { | |
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); | |
s.lookahead--; | |
s.strstart++; | |
} | |
if (bflush) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
} | |
s.insert = 0; | |
if (flush === Z_FINISH) { | |
flush_block_only(s, true); | |
if (s.strm.avail_out === 0) { | |
return BS_FINISH_STARTED; | |
} | |
return BS_FINISH_DONE; | |
} | |
if (s.last_lit) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
return BS_BLOCK_DONE; | |
} | |
function deflate_huff(s, flush) { | |
var bflush; | |
for (;;) { | |
if (s.lookahead === 0) { | |
fill_window(s); | |
if (s.lookahead === 0) { | |
if (flush === Z_NO_FLUSH) { | |
return BS_NEED_MORE; | |
} | |
break; | |
} | |
} | |
s.match_length = 0; | |
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); | |
s.lookahead--; | |
s.strstart++; | |
if (bflush) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
} | |
s.insert = 0; | |
if (flush === Z_FINISH) { | |
flush_block_only(s, true); | |
if (s.strm.avail_out === 0) { | |
return BS_FINISH_STARTED; | |
} | |
return BS_FINISH_DONE; | |
} | |
if (s.last_lit) { | |
flush_block_only(s, false); | |
if (s.strm.avail_out === 0) { | |
return BS_NEED_MORE; | |
} | |
} | |
return BS_BLOCK_DONE; | |
} | |
function Config(good_length, max_lazy, nice_length, max_chain, func) { | |
this.good_length = good_length; | |
this.max_lazy = max_lazy; | |
this.nice_length = nice_length; | |
this.max_chain = max_chain; | |
this.func = func; | |
} | |
var configuration_table; | |
configuration_table = [ | |
new Config(0, 0, 0, 0, deflate_stored), | |
new Config(4, 4, 8, 4, deflate_fast), | |
new Config(4, 5, 16, 8, deflate_fast), | |
new Config(4, 6, 32, 32, deflate_fast), | |
new Config(4, 4, 16, 16, deflate_slow), | |
new Config(8, 16, 32, 32, deflate_slow), | |
new Config(8, 16, 128, 128, deflate_slow), | |
new Config(8, 32, 128, 256, deflate_slow), | |
new Config(32, 128, 258, 1024, deflate_slow), | |
new Config(32, 258, 258, 4096, deflate_slow) | |
]; | |
function lm_init(s) { | |
s.window_size = 2 * s.w_size; | |
zero(s.head); | |
s.max_lazy_match = configuration_table[s.level].max_lazy; | |
s.good_match = configuration_table[s.level].good_length; | |
s.nice_match = configuration_table[s.level].nice_length; | |
s.max_chain_length = configuration_table[s.level].max_chain; | |
s.strstart = 0; | |
s.block_start = 0; | |
s.lookahead = 0; | |
s.insert = 0; | |
s.match_length = s.prev_length = MIN_MATCH - 1; | |
s.match_available = 0; | |
s.ins_h = 0; | |
} | |
function DeflateState() { | |
this.strm = null; | |
this.status = 0; | |
this.pending_buf = null; | |
this.pending_buf_size = 0; | |
this.pending_out = 0; | |
this.pending = 0; | |
this.wrap = 0; | |
this.gzhead = null; | |
this.gzindex = 0; | |
this.method = Z_DEFLATED; | |
this.last_flush = -1; | |
this.w_size = 0; | |
this.w_bits = 0; | |
this.w_mask = 0; | |
this.window = null; | |
this.window_size = 0; | |
this.prev = null; | |
this.head = null; | |
this.ins_h = 0; | |
this.hash_size = 0; | |
this.hash_bits = 0; | |
this.hash_mask = 0; | |
this.hash_shift = 0; | |
this.block_start = 0; | |
this.match_length = 0; | |
this.prev_match = 0; | |
this.match_available = 0; | |
this.strstart = 0; | |
this.match_start = 0; | |
this.lookahead = 0; | |
this.prev_length = 0; | |
this.max_chain_length = 0; | |
this.max_lazy_match = 0; | |
this.level = 0; | |
this.strategy = 0; | |
this.good_match = 0; | |
this.nice_match = 0; | |
this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); | |
this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); | |
this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); | |
zero(this.dyn_ltree); | |
zero(this.dyn_dtree); | |
zero(this.bl_tree); | |
this.l_desc = null; | |
this.d_desc = null; | |
this.bl_desc = null; | |
this.bl_count = new utils.Buf16(MAX_BITS + 1); | |
this.heap = new utils.Buf16(2 * L_CODES + 1); | |
zero(this.heap); | |
this.heap_len = 0; | |
this.heap_max = 0; | |
this.depth = new utils.Buf16(2 * L_CODES + 1); | |
zero(this.depth); | |
this.l_buf = 0; | |
this.lit_bufsize = 0; | |
this.last_lit = 0; | |
this.d_buf = 0; | |
this.opt_len = 0; | |
this.static_len = 0; | |
this.matches = 0; | |
this.insert = 0; | |
this.bi_buf = 0; | |
this.bi_valid = 0; | |
} | |
function deflateResetKeep(strm) { | |
var s; | |
if (!strm || !strm.state) { | |
return err(strm, Z_STREAM_ERROR); | |
} | |
strm.total_in = strm.total_out = 0; | |
strm.data_type = Z_UNKNOWN; | |
s = strm.state; | |
s.pending = 0; | |
s.pending_out = 0; | |
if (s.wrap < 0) { | |
s.wrap = -s.wrap; | |
} | |
s.status = (s.wrap ? INIT_STATE : BUSY_STATE); | |
strm.adler = (s.wrap === 2) ? | |
0 | |
: | |
1; | |
s.last_flush = Z_NO_FLUSH; | |
trees._tr_init(s); | |
return Z_OK; | |
} | |
function deflateReset(strm) { | |
var ret = deflateResetKeep(strm); | |
if (ret === Z_OK) { | |
lm_init(strm.state); | |
} | |
return ret; | |
} | |
function deflateSetHeader(strm, head) { | |
if (!strm || !strm.state) { return Z_STREAM_ERROR; } | |
if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } | |
strm.state.gzhead = head; | |
return Z_OK; | |
} | |
function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { | |
if (!strm) { | |
return Z_STREAM_ERROR; | |
} | |
var wrap = 1; | |
if (level === Z_DEFAULT_COMPRESSION) { | |
level = 6; | |
} | |
if (windowBits < 0) { | |
wrap = 0; | |
windowBits = -windowBits; | |
} | |
else if (windowBits > 15) { | |
wrap = 2; | |
windowBits -= 16; | |
} | |
if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || | |
windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || | |
strategy < 0 || strategy > Z_FIXED) { | |
return err(strm, Z_STREAM_ERROR); | |
} | |
if (windowBits === 8) { | |
windowBits = 9; | |
} | |
var s = new DeflateState(); | |
strm.state = s; | |
s.strm = strm; | |
s.wrap = wrap; | |
s.gzhead = null; | |
s.w_bits = windowBits; | |
s.w_size = 1 << s.w_bits; | |
s.w_mask = s.w_size - 1; | |
s.hash_bits = memLevel + 7; | |
s.hash_size = 1 << s.hash_bits; | |
s.hash_mask = s.hash_size - 1; | |
s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); | |
s.window = new utils.Buf8(s.w_size * 2); | |
s.head = new utils.Buf16(s.hash_size); | |
s.prev = new utils.Buf16(s.w_size); | |
s.lit_bufsize = 1 << (memLevel + 6); | |
s.pending_buf_size = s.lit_bufsize * 4; | |
s.pending_buf = new utils.Buf8(s.pending_buf_size); | |
s.d_buf = 1 * s.lit_bufsize; | |
s.l_buf = (1 + 2) * s.lit_bufsize; | |
s.level = level; | |
s.strategy = strategy; | |
s.method = method; | |
return deflateReset(strm); | |
} | |
function deflateInit(strm, level) { | |
return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); | |
} | |
function deflate(strm, flush) { | |
var old_flush, s; | |
var beg, val; | |
if (!strm || !strm.state || | |
flush > Z_BLOCK || flush < 0) { | |
return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; | |
} | |
s = strm.state; | |
if (!strm.output || | |
(!strm.input && strm.avail_in !== 0) || | |
(s.status === FINISH_STATE && flush !== Z_FINISH)) { | |
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); | |
} | |
s.strm = strm; | |
old_flush = s.last_flush; | |
s.last_flush = flush; | |
if (s.status === INIT_STATE) { | |
if (s.wrap === 2) { | |
strm.adler = 0; | |
put_byte(s, 31); | |
put_byte(s, 139); | |
put_byte(s, 8); | |
if (!s.gzhead) { | |
put_byte(s, 0); | |
put_byte(s, 0); | |
put_byte(s, 0); | |
put_byte(s, 0); | |
put_byte(s, 0); | |
put_byte(s, s.level === 9 ? 2 : | |
(s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? | |
4 : 0)); | |
put_byte(s, OS_CODE); | |
s.status = BUSY_STATE; | |
} | |
else { | |
put_byte(s, (s.gzhead.text ? 1 : 0) + | |
(s.gzhead.hcrc ? 2 : 0) + | |
(!s.gzhead.extra ? 0 : 4) + | |
(!s.gzhead.name ? 0 : 8) + | |
(!s.gzhead.comment ? 0 : 16) | |
); | |
put_byte(s, s.gzhead.time & 0xff); | |
put_byte(s, (s.gzhead.time >> 8) & 0xff); | |
put_byte(s, (s.gzhead.time >> 16) & 0xff); | |
put_byte(s, (s.gzhead.time >> 24) & 0xff); | |
put_byte(s, s.level === 9 ? 2 : | |
(s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? | |
4 : 0)); | |
put_byte(s, s.gzhead.os & 0xff); | |
if (s.gzhead.extra && s.gzhead.extra.length) { | |
put_byte(s, s.gzhead.extra.length & 0xff); | |
put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); | |
} | |
if (s.gzhead.hcrc) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); | |
} | |
s.gzindex = 0; | |
s.status = EXTRA_STATE; | |
} | |
} | |
else | |
{ | |
var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; | |
var level_flags = -1; | |
if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { | |
level_flags = 0; | |
} else if (s.level < 6) { | |
level_flags = 1; | |
} else if (s.level === 6) { | |
level_flags = 2; | |
} else { | |
level_flags = 3; | |
} | |
header |= (level_flags << 6); | |
if (s.strstart !== 0) { header |= PRESET_DICT; } | |
header += 31 - (header % 31); | |
s.status = BUSY_STATE; | |
putShortMSB(s, header); | |
if (s.strstart !== 0) { | |
putShortMSB(s, strm.adler >>> 16); | |
putShortMSB(s, strm.adler & 0xffff); | |
} | |
strm.adler = 1; | |
} | |
} | |
if (s.status === EXTRA_STATE) { | |
if (s.gzhead.extra) { | |
beg = s.pending; | |
while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { | |
if (s.pending === s.pending_buf_size) { | |
if (s.gzhead.hcrc && s.pending > beg) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); | |
} | |
flush_pending(strm); | |
beg = s.pending; | |
if (s.pending === s.pending_buf_size) { | |
break; | |
} | |
} | |
put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); | |
s.gzindex++; | |
} | |
if (s.gzhead.hcrc && s.pending > beg) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); | |
} | |
if (s.gzindex === s.gzhead.extra.length) { | |
s.gzindex = 0; | |
s.status = NAME_STATE; | |
} | |
} | |
else { | |
s.status = NAME_STATE; | |
} | |
} | |
if (s.status === NAME_STATE) { | |
if (s.gzhead.name) { | |
beg = s.pending; | |
do { | |
if (s.pending === s.pending_buf_size) { | |
if (s.gzhead.hcrc && s.pending > beg) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); | |
} | |
flush_pending(strm); | |
beg = s.pending; | |
if (s.pending === s.pending_buf_size) { | |
val = 1; | |
break; | |
} | |
} | |
if (s.gzindex < s.gzhead.name.length) { | |
val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; | |
} else { | |
val = 0; | |
} | |
put_byte(s, val); | |
} while (val !== 0); | |
if (s.gzhead.hcrc && s.pending > beg) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); | |
} | |
if (val === 0) { | |
s.gzindex = 0; | |
s.status = COMMENT_STATE; | |
} | |
} | |
else { | |
s.status = COMMENT_STATE; | |
} | |
} | |
if (s.status === COMMENT_STATE) { | |
if (s.gzhead.comment) { | |
beg = s.pending; | |
do { | |
if (s.pending === s.pending_buf_size) { | |
if (s.gzhead.hcrc && s.pending > beg) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); | |
} | |
flush_pending(strm); | |
beg = s.pending; | |
if (s.pending === s.pending_buf_size) { | |
val = 1; | |
break; | |
} | |
} | |
if (s.gzindex < s.gzhead.comment.length) { | |
val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; | |
} else { | |
val = 0; | |
} | |
put_byte(s, val); | |
} while (val !== 0); | |
if (s.gzhead.hcrc && s.pending > beg) { | |
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); | |
} | |
if (val === 0) { | |
s.status = HCRC_STATE; | |
} | |
} | |
else { | |
s.status = HCRC_STATE; | |
} | |
} | |
if (s.status === HCRC_STATE) { | |
if (s.gzhead.hcrc) { | |
if (s.pending + 2 > s.pending_buf_size) { | |
flush_pending(strm); | |
} | |
if (s.pending + 2 <= s.pending_buf_size) { | |
put_byte(s, strm.adler & 0xff); | |
put_byte(s, (strm.adler >> 8) & 0xff); | |
strm.adler = 0; | |
s.status = BUSY_STATE; | |
} | |
} | |
else { | |
s.status = BUSY_STATE; | |
} | |
} | |
if (s.pending !== 0) { | |
flush_pending(strm); | |
if (strm.avail_out === 0) { | |
s.last_flush = -1; | |
return Z_OK; | |
} | |
} else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && | |
flush !== Z_FINISH) { | |
return err(strm, Z_BUF_ERROR); | |
} | |
if (s.status === FINISH_STATE && strm.avail_in !== 0) { | |
return err(strm, Z_BUF_ERROR); | |
} | |
if (strm.avail_in !== 0 || s.lookahead !== 0 || | |
(flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { | |
var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : | |
(s.strategy === Z_RLE ? deflate_rle(s, flush) : | |
configuration_table[s.level].func(s, flush)); | |
if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { | |
s.status = FINISH_STATE; | |
} | |
if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { | |
if (strm.avail_out === 0) { | |
s.last_flush = -1; | |
} | |
return Z_OK; | |
} | |
if (bstate === BS_BLOCK_DONE) { | |
if (flush === Z_PARTIAL_FLUSH) { | |
trees._tr_align(s); | |
} | |
else if (flush !== Z_BLOCK) { | |
trees._tr_stored_block(s, 0, 0, false); | |
if (flush === Z_FULL_FLUSH) { | |
zero(s.head); | |
if (s.lookahead === 0) { | |
s.strstart = 0; | |
s.block_start = 0; | |
s.insert = 0; | |
} | |
} | |
} | |
flush_pending(strm); | |
if (strm.avail_out === 0) { | |
s.last_flush = -1; | |
return Z_OK; | |
} | |
} | |
} | |
if (flush !== Z_FINISH) { return Z_OK; } | |
if (s.wrap <= 0) { return Z_STREAM_END; } | |
if (s.wrap === 2) { | |
put_byte(s, strm.adler & 0xff); | |
put_byte(s, (strm.adler >> 8) & 0xff); | |
put_byte(s, (strm.adler >> 16) & 0xff); | |
put_byte(s, (strm.adler >> 24) & 0xff); | |
put_byte(s, strm.total_in & 0xff); | |
put_byte(s, (strm.total_in >> 8) & 0xff); | |
put_byte(s, (strm.total_in >> 16) & 0xff); | |
put_byte(s, (strm.total_in >> 24) & 0xff); | |
} | |
else | |
{ | |
putShortMSB(s, strm.adler >>> 16); | |
putShortMSB(s, strm.adler & 0xffff); | |
} | |
flush_pending(strm); | |
if (s.wrap > 0) { s.wrap = -s.wrap; } | |
return s.pending !== 0 ? Z_OK : Z_STREAM_END; | |
} | |
function deflateEnd(strm) { | |
var status; | |
if (!strm || !strm.state) { | |
return Z_STREAM_ERROR; | |
} | |
status = strm.state.status; | |
if (status !== INIT_STATE && | |
status !== EXTRA_STATE && | |
status !== NAME_STATE && | |
status !== COMMENT_STATE && | |
status !== HCRC_STATE && | |
status !== BUSY_STATE && | |
status !== FINISH_STATE | |
) { | |
return err(strm, Z_STREAM_ERROR); | |
} | |
strm.state = null; | |
return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; | |
} | |
function deflateSetDictionary(strm, dictionary) { | |
var dictLength = dictionary.length; | |
var s; | |
var str, n; | |
var wrap; | |
var avail; | |
var next; | |
var input; | |
var tmpDict; | |
if (!strm || !strm.state) { | |
return Z_STREAM_ERROR; | |
} | |
s = strm.state; | |
wrap = s.wrap; | |
if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { | |
return Z_STREAM_ERROR; | |
} | |
if (wrap === 1) { | |
strm.adler = adler32(strm.adler, dictionary, dictLength, 0); | |
} | |
s.wrap = 0; | |
if (dictLength >= s.w_size) { | |
if (wrap === 0) { | |
zero(s.head); | |
s.strstart = 0; | |
s.block_start = 0; | |
s.insert = 0; | |
} | |
tmpDict = new utils.Buf8(s.w_size); | |
utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); | |
dictionary = tmpDict; | |
dictLength = s.w_size; | |
} | |
avail = strm.avail_in; | |
next = strm.next_in; | |
input = strm.input; | |
strm.avail_in = dictLength; | |
strm.next_in = 0; | |
strm.input = dictionary; | |
fill_window(s); | |
while (s.lookahead >= MIN_MATCH) { | |
str = s.strstart; | |
n = s.lookahead - (MIN_MATCH - 1); | |
do { | |
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; | |
s.prev[str & s.w_mask] = s.head[s.ins_h]; | |
s.head[s.ins_h] = str; | |
str++; | |
} while (--n); | |
s.strstart = str; | |
s.lookahead = MIN_MATCH - 1; | |
fill_window(s); | |
} | |
s.strstart += s.lookahead; | |
s.block_start = s.strstart; | |
s.insert = s.lookahead; | |
s.lookahead = 0; | |
s.match_length = s.prev_length = MIN_MATCH - 1; | |
s.match_available = 0; | |
strm.next_in = next; | |
strm.input = input; | |
strm.avail_in = avail; | |
s.wrap = wrap; | |
return Z_OK; | |
} | |
exports.deflateInit = deflateInit; | |
exports.deflateInit2 = deflateInit2; | |
exports.deflateReset = deflateReset; | |
exports.deflateResetKeep = deflateResetKeep; | |
exports.deflateSetHeader = deflateSetHeader; | |
exports.deflate = deflate; | |
exports.deflateEnd = deflateEnd; | |
exports.deflateSetDictionary = deflateSetDictionary; | |
exports.deflateInfo = 'pako deflate (from Nodeca project)'; | |
},{"../utils/common":35,"./adler32":36,"./crc32":38,"./messages":43,"./trees":44}],40:[function(require,module,exports){ | |
var BAD = 30; | |
var TYPE = 12; | |
module.exports = function inflate_fast(strm, start) { | |
var state; | |
var _in; | |
var last; | |
var _out; | |
var beg; | |
var end; | |
var dmax; | |
var wsize; | |
var whave; | |
var wnext; | |
var s_window; | |
var hold; | |
var bits; | |
var lcode; | |
var dcode; | |
var lmask; | |
var dmask; | |
var here; | |
var op; | |
var len; | |
var dist; | |
var from; | |
var from_source; | |
var input, output; | |
state = strm.state; | |
_in = strm.next_in; | |
input = strm.input; | |
last = _in + (strm.avail_in - 5); | |
_out = strm.next_out; | |
output = strm.output; | |
beg = _out - (start - strm.avail_out); | |
end = _out + (strm.avail_out - 257); | |
dmax = state.dmax; | |
wsize = state.wsize; | |
whave = state.whave; | |
wnext = state.wnext; | |
s_window = state.window; | |
hold = state.hold; | |
bits = state.bits; | |
lcode = state.lencode; | |
dcode = state.distcode; | |
lmask = (1 << state.lenbits) - 1; | |
dmask = (1 << state.distbits) - 1; | |
top: | |
do { | |
if (bits < 15) { | |
hold += input[_in++] << bits; | |
bits += 8; | |
hold += input[_in++] << bits; | |
bits += 8; | |
} | |
here = lcode[hold & lmask]; | |
dolen: | |
for (;;) { | |
op = here >>> 24; | |
hold >>>= op; | |
bits -= op; | |
op = (here >>> 16) & 0xff; | |
if (op === 0) { | |
output[_out++] = here & 0xffff; | |
} | |
else if (op & 16) { | |
len = here & 0xffff; | |
op &= 15; | |
if (op) { | |
if (bits < op) { | |
hold += input[_in++] << bits; | |
bits += 8; | |
} | |
len += hold & ((1 << op) - 1); | |
hold >>>= op; | |
bits -= op; | |
} | |
if (bits < 15) { | |
hold += input[_in++] << bits; | |
bits += 8; | |
hold += input[_in++] << bits; | |
bits += 8; | |
} | |
here = dcode[hold & dmask]; | |
dodist: | |
for (;;) { | |
op = here >>> 24; | |
hold >>>= op; | |
bits -= op; | |
op = (here >>> 16) & 0xff; | |
if (op & 16) { | |
dist = here & 0xffff; | |
op &= 15; | |
if (bits < op) { | |
hold += input[_in++] << bits; | |
bits += 8; | |
if (bits < op) { | |
hold += input[_in++] << bits; | |
bits += 8; | |
} | |
} | |
dist += hold & ((1 << op) - 1); | |
if (dist > dmax) { | |
strm.msg = 'invalid distance too far back'; | |
state.mode = BAD; | |
break top; | |
} | |
hold >>>= op; | |
bits -= op; | |
op = _out - beg; | |
if (dist > op) { | |
op = dist - op; | |
if (op > whave) { | |
if (state.sane) { | |
strm.msg = 'invalid distance too far back'; | |
state.mode = BAD; | |
break top; | |
} | |
} | |
from = 0; | |
from_source = s_window; | |
if (wnext === 0) { | |
from += wsize - op; | |
if (op < len) { | |
len -= op; | |
do { | |
output[_out++] = s_window[from++]; | |
} while (--op); | |
from = _out - dist; | |
from_source = output; | |
} | |
} | |
else if (wnext < op) { | |
from += wsize + wnext - op; | |
op -= wnext; | |
if (op < len) { | |
len -= op; | |
do { | |
output[_out++] = s_window[from++]; | |
} while (--op); | |
from = 0; | |
if (wnext < len) { | |
op = wnext; | |
len -= op; | |
do { | |
output[_out++] = s_window[from++]; | |
} while (--op); | |
from = _out - dist; | |
from_source = output; | |
} | |
} | |
} | |
else { | |
from += wnext - op; | |
if (op < len) { | |
len -= op; | |
do { | |
output[_out++] = s_window[from++]; | |
} while (--op); | |
from = _out - dist; | |
from_source = output; | |
} | |
} | |
while (len > 2) { | |
output[_out++] = from_source[from++]; | |
output[_out++] = from_source[from++]; | |
output[_out++] = from_source[from++]; | |
len -= 3; | |
} | |
if (len) { | |
output[_out++] = from_source[from++]; | |
if (len > 1) { | |
output[_out++] = from_source[from++]; | |
} | |
} | |
} | |
else { | |
from = _out - dist; | |
do { | |
output[_out++] = output[from++]; | |
output[_out++] = output[from++]; | |
output[_out++] = output[from++]; | |
len -= 3; | |
} while (len > 2); | |
if (len) { | |
output[_out++] = output[from++]; | |
if (len > 1) { | |
output[_out++] = output[from++]; | |
} | |
} | |
} | |
} | |
else if ((op & 64) === 0) { | |
here = dcode[(here & 0xffff) + (hold & ((1 << op) - 1))]; | |
continue dodist; | |
} | |
else { | |
strm.msg = 'invalid distance code'; | |
state.mode = BAD; | |
break top; | |
} | |
break; | |
} | |
} | |
else if ((op & 64) === 0) { | |
here = lcode[(here & 0xffff) + (hold & ((1 << op) - 1))]; | |
continue dolen; | |
} | |
else if (op & 32) { | |
state.mode = TYPE; | |
break top; | |
} | |
else { | |
strm.msg = 'invalid literal/length code'; | |
state.mode = BAD; | |
break top; | |
} | |
break; | |
} | |
} while (_in < last && _out < end); | |
len = bits >> 3; | |
_in -= len; | |
bits -= len << 3; | |
hold &= (1 << bits) - 1; | |
strm.next_in = _in; | |
strm.next_out = _out; | |
strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); | |
strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); | |
state.hold = hold; | |
state.bits = bits; | |
return; | |
}; | |
},{}],41:[function(require,module,exports){ | |
var utils = require('../utils/common'); | |
var adler32 = require('./adler32'); | |
var crc32 = require('./crc32'); | |
var inflate_fast = require('./inffast'); | |
var inflate_table = require('./inftrees'); | |
var CODES = 0; | |
var LENS = 1; | |
var DISTS = 2; | |
var Z_FINISH = 4; | |
var Z_BLOCK = 5; | |
var Z_TREES = 6; | |
var Z_OK = 0; | |
var Z_STREAM_END = 1; | |
var Z_NEED_DICT = 2; | |
var Z_STREAM_ERROR = -2; | |
var Z_DATA_ERROR = -3; | |
var Z_MEM_ERROR = -4; | |
var Z_BUF_ERROR = -5; | |
var Z_DEFLATED = 8; | |
var HEAD = 1; | |
var FLAGS = 2; | |
var TIME = 3; | |
var OS = 4; | |
var EXLEN = 5; | |
var EXTRA = 6; | |
var NAME = 7; | |
var COMMENT = 8; | |
var HCRC = 9; | |
var DICTID = 10; | |
var DICT = 11; | |
var TYPE = 12; | |
var TYPEDO = 13; | |
var STORED = 14; | |
var COPY_ = 15; | |
var COPY = 16; | |
var TABLE = 17; | |
var LENLENS = 18; | |
var CODELENS = 19; | |
var LEN_ = 20; | |
var LEN = 21; | |
var LENEXT = 22; | |
var DIST = 23; | |
var DISTEXT = 24; | |
var MATCH = 25; | |
var LIT = 26; | |
var CHECK = 27; | |
var LENGTH = 28; | |
var DONE = 29; | |
var BAD = 30; | |
var MEM = 31; | |
var SYNC = 32; | |
var ENOUGH_LENS = 852; | |
var ENOUGH_DISTS = 592; | |
var MAX_WBITS = 15; | |
var DEF_WBITS = MAX_WBITS; | |
function zswap32(q) { | |
return (((q >>> 24) & 0xff) + | |
((q >>> 8) & 0xff00) + | |
((q & 0xff00) << 8) + | |
((q & 0xff) << 24)); | |
} | |
function InflateState() { | |
this.mode = 0; | |
this.last = false; | |
this.wrap = 0; | |
this.havedict = false; | |
this.flags = 0; | |
this.dmax = 0; | |
this.check = 0; | |
this.total = 0; | |
this.head = null; | |
this.wbits = 0; | |
this.wsize = 0; | |
this.whave = 0; | |
this.wnext = 0; | |
this.window = null; | |
this.hold = 0; | |
this.bits = 0; | |
this.length = 0; | |
this.offset = 0; | |
this.extra = 0; | |
this.lencode = null; | |
this.distcode = null; | |
this.lenbits = 0; | |
this.distbits = 0; | |
this.ncode = 0; | |
this.nlen = 0; | |
this.ndist = 0; | |
this.have = 0; | |
this.next = null; | |
this.lens = new utils.Buf16(320); | |
this.work = new utils.Buf16(288); | |
this.lendyn = null; | |
this.distdyn = null; | |
this.sane = 0; | |
this.back = 0; | |
this.was = 0; | |
} | |
function inflateResetKeep(strm) { | |
var state; | |
if (!strm || !strm.state) { return Z_STREAM_ERROR; } | |
state = strm.state; | |
strm.total_in = strm.total_out = state.total = 0; | |
strm.msg = ''; | |
if (state.wrap) { | |
strm.adler = state.wrap & 1; | |
} | |
state.mode = HEAD; | |
state.last = 0; | |
state.havedict = 0; | |
state.dmax = 32768; | |
state.head = null; | |
state.hold = 0; | |
state.bits = 0; | |
state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); | |
state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); | |
state.sane = 1; | |
state.back = -1; | |
return Z_OK; | |
} | |
function inflateReset(strm) { | |
var state; | |
if (!strm || !strm.state) { return Z_STREAM_ERROR; } | |
state = strm.state; | |
state.wsize = 0; | |
state.whave = 0; | |
state.wnext = 0; | |
return inflateResetKeep(strm); | |
} | |
function inflateReset2(strm, windowBits) { | |
var wrap; | |
var state; | |
if (!strm || !strm.state) { return Z_STREAM_ERROR; } | |
state = strm.state; | |
if (windowBits < 0) { | |
wrap = 0; | |
windowBits = -windowBits; | |
} | |
else { | |
wrap = (windowBits >> 4) + 1; | |
if (windowBits < 48) { | |
windowBits &= 15; | |
} | |
} | |
if (windowBits && (windowBits < 8 || windowBits > 15)) { | |
return Z_STREAM_ERROR; | |
} | |
if (state.window !== null && state.wbits !== windowBits) { | |
state.window = null; | |
} | |
state.wrap = wrap; | |
state.wbits = windowBits; | |
return inflateReset(strm); | |
} | |
function inflateInit2(strm, windowBits) { | |
var ret; | |
var state; | |
if (!strm) { return Z_STREAM_ERROR; } | |
state = new InflateState(); | |
strm.state = state; | |
state.window = null; | |
ret = inflateReset2(strm, windowBits); | |
if (ret !== Z_OK) { | |
strm.state = null; | |
} | |
return ret; | |
} | |
function inflateInit(strm) { | |
return inflateInit2(strm, DEF_WBITS); | |
} | |
var virgin = true; | |
var lenfix, distfix; | |
function fixedtables(state) { | |
if (virgin) { | |
var sym; | |
lenfix = new utils.Buf32(512); | |
distfix = new utils.Buf32(32); | |
sym = 0; | |
while (sym < 144) { state.lens[sym++] = 8; } | |
while (sym < 256) { state.lens[sym++] = 9; } | |
while (sym < 280) { state.lens[sym++] = 7; } | |
while (sym < 288) { state.lens[sym++] = 8; } | |
inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); | |
sym = 0; | |
while (sym < 32) { state.lens[sym++] = 5; } | |
inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); | |
virgin = false; | |
} | |
state.lencode = lenfix; | |
state.lenbits = 9; | |
state.distcode = distfix; | |
state.distbits = 5; | |
} | |
function updatewindow(strm, src, end, copy) { | |
var dist; | |
var state = strm.state; | |
if (state.window === null) { | |
state.wsize = 1 << state.wbits; | |
state.wnext = 0; | |
state.whave = 0; | |
state.window = new utils.Buf8(state.wsize); | |
} | |
if (copy >= state.wsize) { | |
utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); | |
state.wnext = 0; | |
state.whave = state.wsize; | |
} | |
else { | |
dist = state.wsize - state.wnext; | |
if (dist > copy) { | |
dist = copy; | |
} | |
utils.arraySet(state.window, src, end - copy, dist, state.wnext); | |
copy -= dist; | |
if (copy) { | |
utils.arraySet(state.window, src, end - copy, copy, 0); | |
state.wnext = copy; | |
state.whave = state.wsize; | |
} | |
else { | |
state.wnext += dist; | |
if (state.wnext === state.wsize) { state.wnext = 0; } | |
if (state.whave < state.wsize) { state.whave += dist; } | |
} | |
} | |
return 0; | |
} | |
function inflate(strm, flush) { | |
var state; | |
var input, output; | |
var next; | |
var put; | |
var have, left; | |
var hold; | |
var bits; | |
var _in, _out; | |
var copy; | |
var from; | |
var from_source; | |
var here = 0; | |
var here_bits, here_op, here_val; | |
var last_bits, last_op, last_val; | |
var len; | |
var ret; | |
var hbuf = new utils.Buf8(4); | |
var opts; | |
var n; | |
var order = | |
[ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; | |
if (!strm || !strm.state || !strm.output || | |
(!strm.input && strm.avail_in !== 0)) { | |
return Z_STREAM_ERROR; | |
} | |
state = strm.state; | |
if (state.mode === TYPE) { state.mode = TYPEDO; } | |
put = strm.next_out; | |
output = strm.output; | |
left = strm.avail_out; | |
next = strm.next_in; | |
input = strm.input; | |
have = strm.avail_in; | |
hold = state.hold; | |
bits = state.bits; | |
_in = have; | |
_out = left; | |
ret = Z_OK; | |
inf_leave: | |
for (;;) { | |
switch (state.mode) { | |
case HEAD: | |
if (state.wrap === 0) { | |
state.mode = TYPEDO; | |
break; | |
} | |
while (bits < 16) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if ((state.wrap & 2) && hold === 0x8b1f) { | |
state.check = 0; | |
hbuf[0] = hold & 0xff; | |
hbuf[1] = (hold >>> 8) & 0xff; | |
state.check = crc32(state.check, hbuf, 2, 0); | |
hold = 0; | |
bits = 0; | |
state.mode = FLAGS; | |
break; | |
} | |
state.flags = 0; | |
if (state.head) { | |
state.head.done = false; | |
} | |
if (!(state.wrap & 1) || | |
(((hold & 0xff) << 8) + (hold >> 8)) % 31) { | |
strm.msg = 'incorrect header check'; | |
state.mode = BAD; | |
break; | |
} | |
if ((hold & 0x0f) !== Z_DEFLATED) { | |
strm.msg = 'unknown compression method'; | |
state.mode = BAD; | |
break; | |
} | |
hold >>>= 4; | |
bits -= 4; | |
len = (hold & 0x0f) + 8; | |
if (state.wbits === 0) { | |
state.wbits = len; | |
} | |
else if (len > state.wbits) { | |
strm.msg = 'invalid window size'; | |
state.mode = BAD; | |
break; | |
} | |
state.dmax = 1 << len; | |
strm.adler = state.check = 1; | |
state.mode = hold & 0x200 ? DICTID : TYPE; | |
hold = 0; | |
bits = 0; | |
break; | |
case FLAGS: | |
while (bits < 16) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.flags = hold; | |
if ((state.flags & 0xff) !== Z_DEFLATED) { | |
strm.msg = 'unknown compression method'; | |
state.mode = BAD; | |
break; | |
} | |
if (state.flags & 0xe000) { | |
strm.msg = 'unknown header flags set'; | |
state.mode = BAD; | |
break; | |
} | |
if (state.head) { | |
state.head.text = ((hold >> 8) & 1); | |
} | |
if (state.flags & 0x0200) { | |
hbuf[0] = hold & 0xff; | |
hbuf[1] = (hold >>> 8) & 0xff; | |
state.check = crc32(state.check, hbuf, 2, 0); | |
} | |
hold = 0; | |
bits = 0; | |
state.mode = TIME; | |
case TIME: | |
while (bits < 32) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if (state.head) { | |
state.head.time = hold; | |
} | |
if (state.flags & 0x0200) { | |
hbuf[0] = hold & 0xff; | |
hbuf[1] = (hold >>> 8) & 0xff; | |
hbuf[2] = (hold >>> 16) & 0xff; | |
hbuf[3] = (hold >>> 24) & 0xff; | |
state.check = crc32(state.check, hbuf, 4, 0); | |
} | |
hold = 0; | |
bits = 0; | |
state.mode = OS; | |
case OS: | |
while (bits < 16) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if (state.head) { | |
state.head.xflags = (hold & 0xff); | |
state.head.os = (hold >> 8); | |
} | |
if (state.flags & 0x0200) { | |
hbuf[0] = hold & 0xff; | |
hbuf[1] = (hold >>> 8) & 0xff; | |
state.check = crc32(state.check, hbuf, 2, 0); | |
} | |
hold = 0; | |
bits = 0; | |
state.mode = EXLEN; | |
case EXLEN: | |
if (state.flags & 0x0400) { | |
while (bits < 16) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.length = hold; | |
if (state.head) { | |
state.head.extra_len = hold; | |
} | |
if (state.flags & 0x0200) { | |
hbuf[0] = hold & 0xff; | |
hbuf[1] = (hold >>> 8) & 0xff; | |
state.check = crc32(state.check, hbuf, 2, 0); | |
} | |
hold = 0; | |
bits = 0; | |
} | |
else if (state.head) { | |
state.head.extra = null; | |
} | |
state.mode = EXTRA; | |
case EXTRA: | |
if (state.flags & 0x0400) { | |
copy = state.length; | |
if (copy > have) { copy = have; } | |
if (copy) { | |
if (state.head) { | |
len = state.head.extra_len - state.length; | |
if (!state.head.extra) { | |
state.head.extra = new Array(state.head.extra_len); | |
} | |
utils.arraySet( | |
state.head.extra, | |
input, | |
next, | |
copy, | |
len | |
); | |
} | |
if (state.flags & 0x0200) { | |
state.check = crc32(state.check, input, copy, next); | |
} | |
have -= copy; | |
next += copy; | |
state.length -= copy; | |
} | |
if (state.length) { break inf_leave; } | |
} | |
state.length = 0; | |
state.mode = NAME; | |
case NAME: | |
if (state.flags & 0x0800) { | |
if (have === 0) { break inf_leave; } | |
copy = 0; | |
do { | |
len = input[next + copy++]; | |
if (state.head && len && | |
(state.length < 65536 )) { | |
state.head.name += String.fromCharCode(len); | |
} | |
} while (len && copy < have); | |
if (state.flags & 0x0200) { | |
state.check = crc32(state.check, input, copy, next); | |
} | |
have -= copy; | |
next += copy; | |
if (len) { break inf_leave; } | |
} | |
else if (state.head) { | |
state.head.name = null; | |
} | |
state.length = 0; | |
state.mode = COMMENT; | |
case COMMENT: | |
if (state.flags & 0x1000) { | |
if (have === 0) { break inf_leave; } | |
copy = 0; | |
do { | |
len = input[next + copy++]; | |
if (state.head && len && | |
(state.length < 65536 )) { | |
state.head.comment += String.fromCharCode(len); | |
} | |
} while (len && copy < have); | |
if (state.flags & 0x0200) { | |
state.check = crc32(state.check, input, copy, next); | |
} | |
have -= copy; | |
next += copy; | |
if (len) { break inf_leave; } | |
} | |
else if (state.head) { | |
state.head.comment = null; | |
} | |
state.mode = HCRC; | |
case HCRC: | |
if (state.flags & 0x0200) { | |
while (bits < 16) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if (hold !== (state.check & 0xffff)) { | |
strm.msg = 'header crc mismatch'; | |
state.mode = BAD; | |
break; | |
} | |
hold = 0; | |
bits = 0; | |
} | |
if (state.head) { | |
state.head.hcrc = ((state.flags >> 9) & 1); | |
state.head.done = true; | |
} | |
strm.adler = state.check = 0; | |
state.mode = TYPE; | |
break; | |
case DICTID: | |
while (bits < 32) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
strm.adler = state.check = zswap32(hold); | |
hold = 0; | |
bits = 0; | |
state.mode = DICT; | |
case DICT: | |
if (state.havedict === 0) { | |
strm.next_out = put; | |
strm.avail_out = left; | |
strm.next_in = next; | |
strm.avail_in = have; | |
state.hold = hold; | |
state.bits = bits; | |
return Z_NEED_DICT; | |
} | |
strm.adler = state.check = 1; | |
state.mode = TYPE; | |
case TYPE: | |
if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } | |
case TYPEDO: | |
if (state.last) { | |
hold >>>= bits & 7; | |
bits -= bits & 7; | |
state.mode = CHECK; | |
break; | |
} | |
while (bits < 3) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.last = (hold & 0x01); | |
hold >>>= 1; | |
bits -= 1; | |
switch ((hold & 0x03)) { | |
case 0: | |
state.mode = STORED; | |
break; | |
case 1: | |
fixedtables(state); | |
state.mode = LEN_; | |
if (flush === Z_TREES) { | |
hold >>>= 2; | |
bits -= 2; | |
break inf_leave; | |
} | |
break; | |
case 2: | |
state.mode = TABLE; | |
break; | |
case 3: | |
strm.msg = 'invalid block type'; | |
state.mode = BAD; | |
} | |
hold >>>= 2; | |
bits -= 2; | |
break; | |
case STORED: | |
hold >>>= bits & 7; | |
bits -= bits & 7; | |
while (bits < 32) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { | |
strm.msg = 'invalid stored block lengths'; | |
state.mode = BAD; | |
break; | |
} | |
state.length = hold & 0xffff; | |
hold = 0; | |
bits = 0; | |
state.mode = COPY_; | |
if (flush === Z_TREES) { break inf_leave; } | |
case COPY_: | |
state.mode = COPY; | |
case COPY: | |
copy = state.length; | |
if (copy) { | |
if (copy > have) { copy = have; } | |
if (copy > left) { copy = left; } | |
if (copy === 0) { break inf_leave; } | |
utils.arraySet(output, input, next, copy, put); | |
have -= copy; | |
next += copy; | |
left -= copy; | |
put += copy; | |
state.length -= copy; | |
break; | |
} | |
state.mode = TYPE; | |
break; | |
case TABLE: | |
while (bits < 14) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.nlen = (hold & 0x1f) + 257; | |
hold >>>= 5; | |
bits -= 5; | |
state.ndist = (hold & 0x1f) + 1; | |
hold >>>= 5; | |
bits -= 5; | |
state.ncode = (hold & 0x0f) + 4; | |
hold >>>= 4; | |
bits -= 4; | |
if (state.nlen > 286 || state.ndist > 30) { | |
strm.msg = 'too many length or distance symbols'; | |
state.mode = BAD; | |
break; | |
} | |
state.have = 0; | |
state.mode = LENLENS; | |
case LENLENS: | |
while (state.have < state.ncode) { | |
while (bits < 3) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.lens[order[state.have++]] = (hold & 0x07); | |
hold >>>= 3; | |
bits -= 3; | |
} | |
while (state.have < 19) { | |
state.lens[order[state.have++]] = 0; | |
} | |
state.lencode = state.lendyn; | |
state.lenbits = 7; | |
opts = { bits: state.lenbits }; | |
ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); | |
state.lenbits = opts.bits; | |
if (ret) { | |
strm.msg = 'invalid code lengths set'; | |
state.mode = BAD; | |
break; | |
} | |
state.have = 0; | |
state.mode = CODELENS; | |
case CODELENS: | |
while (state.have < state.nlen + state.ndist) { | |
for (;;) { | |
here = state.lencode[hold & ((1 << state.lenbits) - 1)]; | |
here_bits = here >>> 24; | |
here_op = (here >>> 16) & 0xff; | |
here_val = here & 0xffff; | |
if ((here_bits) <= bits) { break; } | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if (here_val < 16) { | |
hold >>>= here_bits; | |
bits -= here_bits; | |
state.lens[state.have++] = here_val; | |
} | |
else { | |
if (here_val === 16) { | |
n = here_bits + 2; | |
while (bits < n) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
hold >>>= here_bits; | |
bits -= here_bits; | |
if (state.have === 0) { | |
strm.msg = 'invalid bit length repeat'; | |
state.mode = BAD; | |
break; | |
} | |
len = state.lens[state.have - 1]; | |
copy = 3 + (hold & 0x03); | |
hold >>>= 2; | |
bits -= 2; | |
} | |
else if (here_val === 17) { | |
n = here_bits + 3; | |
while (bits < n) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
hold >>>= here_bits; | |
bits -= here_bits; | |
len = 0; | |
copy = 3 + (hold & 0x07); | |
hold >>>= 3; | |
bits -= 3; | |
} | |
else { | |
n = here_bits + 7; | |
while (bits < n) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
hold >>>= here_bits; | |
bits -= here_bits; | |
len = 0; | |
copy = 11 + (hold & 0x7f); | |
hold >>>= 7; | |
bits -= 7; | |
} | |
if (state.have + copy > state.nlen + state.ndist) { | |
strm.msg = 'invalid bit length repeat'; | |
state.mode = BAD; | |
break; | |
} | |
while (copy--) { | |
state.lens[state.have++] = len; | |
} | |
} | |
} | |
if (state.mode === BAD) { break; } | |
if (state.lens[256] === 0) { | |
strm.msg = 'invalid code -- missing end-of-block'; | |
state.mode = BAD; | |
break; | |
} | |
state.lenbits = 9; | |
opts = { bits: state.lenbits }; | |
ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); | |
state.lenbits = opts.bits; | |
if (ret) { | |
strm.msg = 'invalid literal/lengths set'; | |
state.mode = BAD; | |
break; | |
} | |
state.distbits = 6; | |
state.distcode = state.distdyn; | |
opts = { bits: state.distbits }; | |
ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); | |
state.distbits = opts.bits; | |
if (ret) { | |
strm.msg = 'invalid distances set'; | |
state.mode = BAD; | |
break; | |
} | |
state.mode = LEN_; | |
if (flush === Z_TREES) { break inf_leave; } | |
case LEN_: | |
state.mode = LEN; | |
case LEN: | |
if (have >= 6 && left >= 258) { | |
strm.next_out = put; | |
strm.avail_out = left; | |
strm.next_in = next; | |
strm.avail_in = have; | |
state.hold = hold; | |
state.bits = bits; | |
inflate_fast(strm, _out); | |
put = strm.next_out; | |
output = strm.output; | |
left = strm.avail_out; | |
next = strm.next_in; | |
input = strm.input; | |
have = strm.avail_in; | |
hold = state.hold; | |
bits = state.bits; | |
if (state.mode === TYPE) { | |
state.back = -1; | |
} | |
break; | |
} | |
state.back = 0; | |
for (;;) { | |
here = state.lencode[hold & ((1 << state.lenbits) - 1)]; | |
here_bits = here >>> 24; | |
here_op = (here >>> 16) & 0xff; | |
here_val = here & 0xffff; | |
if (here_bits <= bits) { break; } | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if (here_op && (here_op & 0xf0) === 0) { | |
last_bits = here_bits; | |
last_op = here_op; | |
last_val = here_val; | |
for (;;) { | |
here = state.lencode[last_val + | |
((hold & ((1 << (last_bits + last_op)) - 1)) >> last_bits)]; | |
here_bits = here >>> 24; | |
here_op = (here >>> 16) & 0xff; | |
here_val = here & 0xffff; | |
if ((last_bits + here_bits) <= bits) { break; } | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
hold >>>= last_bits; | |
bits -= last_bits; | |
state.back += last_bits; | |
} | |
hold >>>= here_bits; | |
bits -= here_bits; | |
state.back += here_bits; | |
state.length = here_val; | |
if (here_op === 0) { | |
state.mode = LIT; | |
break; | |
} | |
if (here_op & 32) { | |
state.back = -1; | |
state.mode = TYPE; | |
break; | |
} | |
if (here_op & 64) { | |
strm.msg = 'invalid literal/length code'; | |
state.mode = BAD; | |
break; | |
} | |
state.extra = here_op & 15; | |
state.mode = LENEXT; | |
case LENEXT: | |
if (state.extra) { | |
n = state.extra; | |
while (bits < n) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.length += hold & ((1 << state.extra) - 1); | |
hold >>>= state.extra; | |
bits -= state.extra; | |
state.back += state.extra; | |
} | |
state.was = state.length; | |
state.mode = DIST; | |
case DIST: | |
for (;;) { | |
here = state.distcode[hold & ((1 << state.distbits) - 1)]; | |
here_bits = here >>> 24; | |
here_op = (here >>> 16) & 0xff; | |
here_val = here & 0xffff; | |
if ((here_bits) <= bits) { break; } | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if ((here_op & 0xf0) === 0) { | |
last_bits = here_bits; | |
last_op = here_op; | |
last_val = here_val; | |
for (;;) { | |
here = state.distcode[last_val + | |
((hold & ((1 << (last_bits + last_op)) - 1)) >> last_bits)]; | |
here_bits = here >>> 24; | |
here_op = (here >>> 16) & 0xff; | |
here_val = here & 0xffff; | |
if ((last_bits + here_bits) <= bits) { break; } | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
hold >>>= last_bits; | |
bits -= last_bits; | |
state.back += last_bits; | |
} | |
hold >>>= here_bits; | |
bits -= here_bits; | |
state.back += here_bits; | |
if (here_op & 64) { | |
strm.msg = 'invalid distance code'; | |
state.mode = BAD; | |
break; | |
} | |
state.offset = here_val; | |
state.extra = (here_op) & 15; | |
state.mode = DISTEXT; | |
case DISTEXT: | |
if (state.extra) { | |
n = state.extra; | |
while (bits < n) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
state.offset += hold & ((1 << state.extra) - 1); | |
hold >>>= state.extra; | |
bits -= state.extra; | |
state.back += state.extra; | |
} | |
if (state.offset > state.dmax) { | |
strm.msg = 'invalid distance too far back'; | |
state.mode = BAD; | |
break; | |
} | |
state.mode = MATCH; | |
case MATCH: | |
if (left === 0) { break inf_leave; } | |
copy = _out - left; | |
if (state.offset > copy) { | |
copy = state.offset - copy; | |
if (copy > state.whave) { | |
if (state.sane) { | |
strm.msg = 'invalid distance too far back'; | |
state.mode = BAD; | |
break; | |
} | |
} | |
if (copy > state.wnext) { | |
copy -= state.wnext; | |
from = state.wsize - copy; | |
} | |
else { | |
from = state.wnext - copy; | |
} | |
if (copy > state.length) { copy = state.length; } | |
from_source = state.window; | |
} | |
else { | |
from_source = output; | |
from = put - state.offset; | |
copy = state.length; | |
} | |
if (copy > left) { copy = left; } | |
left -= copy; | |
state.length -= copy; | |
do { | |
output[put++] = from_source[from++]; | |
} while (--copy); | |
if (state.length === 0) { state.mode = LEN; } | |
break; | |
case LIT: | |
if (left === 0) { break inf_leave; } | |
output[put++] = state.length; | |
left--; | |
state.mode = LEN; | |
break; | |
case CHECK: | |
if (state.wrap) { | |
while (bits < 32) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold |= input[next++] << bits; | |
bits += 8; | |
} | |
_out -= left; | |
strm.total_out += _out; | |
state.total += _out; | |
if (_out) { | |
strm.adler = state.check = | |
(state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); | |
} | |
_out = left; | |
if ((state.flags ? hold : zswap32(hold)) !== state.check) { | |
strm.msg = 'incorrect data check'; | |
state.mode = BAD; | |
break; | |
} | |
hold = 0; | |
bits = 0; | |
} | |
state.mode = LENGTH; | |
case LENGTH: | |
if (state.wrap && state.flags) { | |
while (bits < 32) { | |
if (have === 0) { break inf_leave; } | |
have--; | |
hold += input[next++] << bits; | |
bits += 8; | |
} | |
if (hold !== (state.total & 0xffffffff)) { | |
strm.msg = 'incorrect length check'; | |
state.mode = BAD; | |
break; | |
} | |
hold = 0; | |
bits = 0; | |
} | |
state.mode = DONE; | |
case DONE: | |
ret = Z_STREAM_END; | |
break inf_leave; | |
case BAD: | |
ret = Z_DATA_ERROR; | |
break inf_leave; | |
case MEM: | |
return Z_MEM_ERROR; | |
case SYNC: | |
default: | |
return Z_STREAM_ERROR; | |
} | |
} | |
strm.next_out = put; | |
strm.avail_out = left; | |
strm.next_in = next; | |
strm.avail_in = have; | |
state.hold = hold; | |
state.bits = bits; | |
if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && | |
(state.mode < CHECK || flush !== Z_FINISH))) { | |
if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; | |
} | |
_in -= strm.avail_in; | |
_out -= strm.avail_out; | |
strm.total_in += _in; | |
strm.total_out += _out; | |
state.total += _out; | |
if (state.wrap && _out) { | |
strm.adler = state.check = | |
(state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); | |
} | |
strm.data_type = state.bits + (state.last ? 64 : 0) + | |
(state.mode === TYPE ? 128 : 0) + | |
(state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); | |
if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { | |
ret = Z_BUF_ERROR; | |
} | |
return ret; | |
} | |
function inflateEnd(strm) { | |
if (!strm || !strm.state ) { | |
return Z_STREAM_ERROR; | |
} | |
var state = strm.state; | |
if (state.window) { | |
state.window = null; | |
} | |
strm.state = null; | |
return Z_OK; | |
} | |
function inflateGetHeader(strm, head) { | |
var state; | |
if (!strm || !strm.state) { return Z_STREAM_ERROR; } | |
state = strm.state; | |
if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } | |
state.head = head; | |
head.done = false; | |
return Z_OK; | |
} | |
function inflateSetDictionary(strm, dictionary) { | |
var dictLength = dictionary.length; | |
var state; | |
var dictid; | |
var ret; | |
if (!strm || !strm.state ) { return Z_STREAM_ERROR; } | |
state = strm.state; | |
if (state.wrap !== 0 && state.mode !== DICT) { | |
return Z_STREAM_ERROR; | |
} | |
if (state.mode === DICT) { | |
dictid = 1; | |
dictid = adler32(dictid, dictionary, dictLength, 0); | |
if (dictid !== state.check) { | |
return Z_DATA_ERROR; | |
} | |
} | |
ret = updatewindow(strm, dictionary, dictLength, dictLength); | |
if (ret) { | |
state.mode = MEM; | |
return Z_MEM_ERROR; | |
} | |
state.havedict = 1; | |
return Z_OK; | |
} | |
exports.inflateReset = inflateReset; | |
exports.inflateReset2 = inflateReset2; | |
exports.inflateResetKeep = inflateResetKeep; | |
exports.inflateInit = inflateInit; | |
exports.inflateInit2 = inflateInit2; | |
exports.inflate = inflate; | |
exports.inflateEnd = inflateEnd; | |
exports.inflateGetHeader = inflateGetHeader; | |
exports.inflateSetDictionary = inflateSetDictionary; | |
exports.inflateInfo = 'pako inflate (from Nodeca project)'; | |
},{"../utils/common":35,"./adler32":36,"./crc32":38,"./inffast":40,"./inftrees":42}],42:[function(require,module,exports){ | |
var utils = require('../utils/common'); | |
var MAXBITS = 15; | |
var ENOUGH_LENS = 852; | |
var ENOUGH_DISTS = 592; | |
var CODES = 0; | |
var LENS = 1; | |
var DISTS = 2; | |
var lbase = [ | |
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | |
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 | |
]; | |
var lext = [ | |
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, | |
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 | |
]; | |
var dbase = [ | |
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | |
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | |
8193, 12289, 16385, 24577, 0, 0 | |
]; | |
var dext = [ | |
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, | |
23, 23, 24, 24, 25, 25, 26, 26, 27, 27, | |
28, 28, 29, 29, 64, 64 | |
]; | |
module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) | |
{ | |
var bits = opts.bits; | |
var len = 0; | |
var sym = 0; | |
var min = 0, max = 0; | |
var root = 0; | |
var curr = 0; | |
var drop = 0; | |
var left = 0; | |
var used = 0; | |
var huff = 0; | |
var incr; | |
var fill; | |
var low; | |
var mask; | |
var next; | |
var base = null; | |
var base_index = 0; | |
var end; | |
var count = new utils.Buf16(MAXBITS + 1); | |
var offs = new utils.Buf16(MAXBITS + 1); | |
var extra = null; | |
var extra_index = 0; | |
var here_bits, here_op, here_val; | |
for (len = 0; len <= MAXBITS; len++) { | |
count[len] = 0; | |
} | |
for (sym = 0; sym < codes; sym++) { | |
count[lens[lens_index + sym]]++; | |
} | |
root = bits; | |
for (max = MAXBITS; max >= 1; max--) { | |
if (count[max] !== 0) { break; } | |
} | |
if (root > max) { | |
root = max; | |
} | |
if (max === 0) { | |
table[table_index++] = (1 << 24) | (64 << 16) | 0; | |
table[table_index++] = (1 << 24) | (64 << 16) | 0; | |
opts.bits = 1; | |
return 0; | |
} | |
for (min = 1; min < max; min++) { | |
if (count[min] !== 0) { break; } | |
} | |
if (root < min) { | |
root = min; | |
} | |
left = 1; | |
for (len = 1; len <= MAXBITS; len++) { | |
left <<= 1; | |
left -= count[len]; | |
if (left < 0) { | |
return -1; | |
} | |
} | |
if (left > 0 && (type === CODES || max !== 1)) { | |
return -1; | |
} | |
offs[1] = 0; | |
for (len = 1; len < MAXBITS; len++) { | |
offs[len + 1] = offs[len] + count[len]; | |
} | |
for (sym = 0; sym < codes; sym++) { | |
if (lens[lens_index + sym] !== 0) { | |
work[offs[lens[lens_index + sym]]++] = sym; | |
} | |
} | |
if (type === CODES) { | |
base = extra = work; | |
end = 19; | |
} else if (type === LENS) { | |
base = lbase; | |
base_index -= 257; | |
extra = lext; | |
extra_index -= 257; | |
end = 256; | |
} else { | |
base = dbase; | |
extra = dext; | |
end = -1; | |
} | |
huff = 0; | |
sym = 0; | |
len = min; | |
next = table_index; | |
curr = root; | |
drop = 0; | |
low = -1; | |
used = 1 << root; | |
mask = used - 1; | |
if ((type === LENS && used > ENOUGH_LENS) || | |
(type === DISTS && used > ENOUGH_DISTS)) { | |
return 1; | |
} | |
for (;;) { | |
here_bits = len - drop; | |
if (work[sym] < end) { | |
here_op = 0; | |
here_val = work[sym]; | |
} | |
else if (work[sym] > end) { | |
here_op = extra[extra_index + work[sym]]; | |
here_val = base[base_index + work[sym]]; | |
} | |
else { | |
here_op = 32 + 64; | |
here_val = 0; | |
} | |
incr = 1 << (len - drop); | |
fill = 1 << curr; | |
min = fill; | |
do { | |
fill -= incr; | |
table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; | |
} while (fill !== 0); | |
incr = 1 << (len - 1); | |
while (huff & incr) { | |
incr >>= 1; | |
} | |
if (incr !== 0) { | |
huff &= incr - 1; | |
huff += incr; | |
} else { | |
huff = 0; | |
} | |
sym++; | |
if (--count[len] === 0) { | |
if (len === max) { break; } | |
len = lens[lens_index + work[sym]]; | |
} | |
if (len > root && (huff & mask) !== low) { | |
if (drop === 0) { | |
drop = root; | |
} | |
next += min; | |
curr = len - drop; | |
left = 1 << curr; | |
while (curr + drop < max) { | |
left -= count[curr + drop]; | |
if (left <= 0) { break; } | |
curr++; | |
left <<= 1; | |
} | |
used += 1 << curr; | |
if ((type === LENS && used > ENOUGH_LENS) || | |
(type === DISTS && used > ENOUGH_DISTS)) { | |
return 1; | |
} | |
low = huff & mask; | |
table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; | |
} | |
} | |
if (huff !== 0) { | |
table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; | |
} | |
opts.bits = root; | |
return 0; | |
}; | |
},{"../utils/common":35}],43:[function(require,module,exports){ | |
module.exports = { | |
2: 'need dictionary', | |
1: 'stream end', | |
0: '', | |
'-1': 'file error', | |
'-2': 'stream error', | |
'-3': 'data error', | |
'-4': 'insufficient memory', | |
'-5': 'buffer error', | |
'-6': 'incompatible version' | |
}; | |
},{}],44:[function(require,module,exports){ | |
var utils = require('../utils/common'); | |
var Z_FIXED = 4; | |
var Z_BINARY = 0; | |
var Z_TEXT = 1; | |
var Z_UNKNOWN = 2; | |
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } | |
var STORED_BLOCK = 0; | |
var STATIC_TREES = 1; | |
var DYN_TREES = 2; | |
var MIN_MATCH = 3; | |
var MAX_MATCH = 258; | |
var LENGTH_CODES = 29; | |
var LITERALS = 256; | |
var L_CODES = LITERALS + 1 + LENGTH_CODES; | |
var D_CODES = 30; | |
var BL_CODES = 19; | |
var HEAP_SIZE = 2 * L_CODES + 1; | |
var MAX_BITS = 15; | |
var Buf_size = 16; | |
var MAX_BL_BITS = 7; | |
var END_BLOCK = 256; | |
var REP_3_6 = 16; | |
var REPZ_3_10 = 17; | |
var REPZ_11_138 = 18; | |
var extra_lbits = | |
[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; | |
var extra_dbits = | |
[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; | |
var extra_blbits = | |
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; | |
var bl_order = | |
[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; | |
var DIST_CODE_LEN = 512; | |
var static_ltree = new Array((L_CODES + 2) * 2); | |
zero(static_ltree); | |
var static_dtree = new Array(D_CODES * 2); | |
zero(static_dtree); | |
var _dist_code = new Array(DIST_CODE_LEN); | |
zero(_dist_code); | |
var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); | |
zero(_length_code); | |
var base_length = new Array(LENGTH_CODES); | |
zero(base_length); | |
var base_dist = new Array(D_CODES); | |
zero(base_dist); | |
function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { | |
this.static_tree = static_tree; | |
this.extra_bits = extra_bits; | |
this.extra_base = extra_base; | |
this.elems = elems; | |
this.max_length = max_length; | |
this.has_stree = static_tree && static_tree.length; | |
} | |
var static_l_desc; | |
var static_d_desc; | |
var static_bl_desc; | |
function TreeDesc(dyn_tree, stat_desc) { | |
this.dyn_tree = dyn_tree; | |
this.max_code = 0; | |
this.stat_desc = stat_desc; | |
} | |
function d_code(dist) { | |
return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; | |
} | |
function put_short(s, w) { | |
s.pending_buf[s.pending++] = (w) & 0xff; | |
s.pending_buf[s.pending++] = (w >>> 8) & 0xff; | |
} | |
function send_bits(s, value, length) { | |
if (s.bi_valid > (Buf_size - length)) { | |
s.bi_buf |= (value << s.bi_valid) & 0xffff; | |
put_short(s, s.bi_buf); | |
s.bi_buf = value >> (Buf_size - s.bi_valid); | |
s.bi_valid += length - Buf_size; | |
} else { | |
s.bi_buf |= (value << s.bi_valid) & 0xffff; | |
s.bi_valid += length; | |
} | |
} | |
function send_code(s, c, tree) { | |
send_bits(s, tree[c * 2], tree[c * 2 + 1]); | |
} | |
function bi_reverse(code, len) { | |
var res = 0; | |
do { | |
res |= code & 1; | |
code >>>= 1; | |
res <<= 1; | |
} while (--len > 0); | |
return res >>> 1; | |
} | |
function bi_flush(s) { | |
if (s.bi_valid === 16) { | |
put_short(s, s.bi_buf); | |
s.bi_buf = 0; | |
s.bi_valid = 0; | |
} else if (s.bi_valid >= 8) { | |
s.pending_buf[s.pending++] = s.bi_buf & 0xff; | |
s.bi_buf >>= 8; | |
s.bi_valid -= 8; | |
} | |
} | |
function gen_bitlen(s, desc) | |
{ | |
var tree = desc.dyn_tree; | |
var max_code = desc.max_code; | |
var stree = desc.stat_desc.static_tree; | |
var has_stree = desc.stat_desc.has_stree; | |
var extra = desc.stat_desc.extra_bits; | |
var base = desc.stat_desc.extra_base; | |
var max_length = desc.stat_desc.max_length; | |
var h; | |
var n, m; | |
var bits; | |
var xbits; | |
var f; | |
var overflow = 0; | |
for (bits = 0; bits <= MAX_BITS; bits++) { | |
s.bl_count[bits] = 0; | |
} | |
tree[s.heap[s.heap_max] * 2 + 1] = 0; | |
for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { | |
n = s.heap[h]; | |
bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; | |
if (bits > max_length) { | |
bits = max_length; | |
overflow++; | |
} | |
tree[n * 2 + 1] = bits; | |
if (n > max_code) { continue; } | |
s.bl_count[bits]++; | |
xbits = 0; | |
if (n >= base) { | |
xbits = extra[n - base]; | |
} | |
f = tree[n * 2]; | |
s.opt_len += f * (bits + xbits); | |
if (has_stree) { | |
s.static_len += f * (stree[n * 2 + 1] + xbits); | |
} | |
} | |
if (overflow === 0) { return; } | |
do { | |
bits = max_length - 1; | |
while (s.bl_count[bits] === 0) { bits--; } | |
s.bl_count[bits]--; | |
s.bl_count[bits + 1] += 2; | |
s.bl_count[max_length]--; | |
overflow -= 2; | |
} while (overflow > 0); | |
for (bits = max_length; bits !== 0; bits--) { | |
n = s.bl_count[bits]; | |
while (n !== 0) { | |
m = s.heap[--h]; | |
if (m > max_code) { continue; } | |
if (tree[m * 2 + 1] !== bits) { | |
s.opt_len += (bits - tree[m * 2 + 1]) * tree[m * 2]; | |
tree[m * 2 + 1] = bits; | |
} | |
n--; | |
} | |
} | |
} | |
function gen_codes(tree, max_code, bl_count) | |
{ | |
var next_code = new Array(MAX_BITS + 1); | |
var code = 0; | |
var bits; | |
var n; | |
for (bits = 1; bits <= MAX_BITS; bits++) { | |
next_code[bits] = code = (code + bl_count[bits - 1]) << 1; | |
} | |
for (n = 0; n <= max_code; n++) { | |
var len = tree[n * 2 + 1]; | |
if (len === 0) { continue; } | |
tree[n * 2] = bi_reverse(next_code[len]++, len); | |
} | |
} | |
function tr_static_init() { | |
var n; | |
var bits; | |
var length; | |
var code; | |
var dist; | |
var bl_count = new Array(MAX_BITS + 1); | |
length = 0; | |
for (code = 0; code < LENGTH_CODES - 1; code++) { | |
base_length[code] = length; | |
for (n = 0; n < (1 << extra_lbits[code]); n++) { | |
_length_code[length++] = code; | |
} | |
} | |
_length_code[length - 1] = code; | |
dist = 0; | |
for (code = 0; code < 16; code++) { | |
base_dist[code] = dist; | |
for (n = 0; n < (1 << extra_dbits[code]); n++) { | |
_dist_code[dist++] = code; | |
} | |
} | |
dist >>= 7; | |
for (; code < D_CODES; code++) { | |
base_dist[code] = dist << 7; | |
for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { | |
_dist_code[256 + dist++] = code; | |
} | |
} | |
for (bits = 0; bits <= MAX_BITS; bits++) { | |
bl_count[bits] = 0; | |
} | |
n = 0; | |
while (n <= 143) { | |
static_ltree[n * 2 + 1] = 8; | |
n++; | |
bl_count[8]++; | |
} | |
while (n <= 255) { | |
static_ltree[n * 2 + 1] = 9; | |
n++; | |
bl_count[9]++; | |
} | |
while (n <= 279) { | |
static_ltree[n * 2 + 1] = 7; | |
n++; | |
bl_count[7]++; | |
} | |
while (n <= 287) { | |
static_ltree[n * 2 + 1] = 8; | |
n++; | |
bl_count[8]++; | |
} | |
gen_codes(static_ltree, L_CODES + 1, bl_count); | |
for (n = 0; n < D_CODES; n++) { | |
static_dtree[n * 2 + 1] = 5; | |
static_dtree[n * 2] = bi_reverse(n, 5); | |
} | |
static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); | |
static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); | |
static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); | |
} | |
function init_block(s) { | |
var n; | |
for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2] = 0; } | |
for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2] = 0; } | |
for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2] = 0; } | |
s.dyn_ltree[END_BLOCK * 2] = 1; | |
s.opt_len = s.static_len = 0; | |
s.last_lit = s.matches = 0; | |
} | |
function bi_windup(s) | |
{ | |
if (s.bi_valid > 8) { | |
put_short(s, s.bi_buf); | |
} else if (s.bi_valid > 0) { | |
s.pending_buf[s.pending++] = s.bi_buf; | |
} | |
s.bi_buf = 0; | |
s.bi_valid = 0; | |
} | |
function copy_block(s, buf, len, header) | |
{ | |
bi_windup(s); | |
if (header) { | |
put_short(s, len); | |
put_short(s, ~len); | |
} | |
utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); | |
s.pending += len; | |
} | |
function smaller(tree, n, m, depth) { | |
var _n2 = n * 2; | |
var _m2 = m * 2; | |
return (tree[_n2] < tree[_m2] || | |
(tree[_n2] === tree[_m2] && depth[n] <= depth[m])); | |
} | |
function pqdownheap(s, tree, k) | |
{ | |
var v = s.heap[k]; | |
var j = k << 1; | |
while (j <= s.heap_len) { | |
if (j < s.heap_len && | |
smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { | |
j++; | |
} | |
if (smaller(tree, v, s.heap[j], s.depth)) { break; } | |
s.heap[k] = s.heap[j]; | |
k = j; | |
j <<= 1; | |
} | |
s.heap[k] = v; | |
} | |
function compress_block(s, ltree, dtree) | |
{ | |
var dist; | |
var lc; | |
var lx = 0; | |
var code; | |
var extra; | |
if (s.last_lit !== 0) { | |
do { | |
dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); | |
lc = s.pending_buf[s.l_buf + lx]; | |
lx++; | |
if (dist === 0) { | |
send_code(s, lc, ltree); | |
} else { | |
code = _length_code[lc]; | |
send_code(s, code + LITERALS + 1, ltree); | |
extra = extra_lbits[code]; | |
if (extra !== 0) { | |
lc -= base_length[code]; | |
send_bits(s, lc, extra); | |
} | |
dist--; | |
code = d_code(dist); | |
send_code(s, code, dtree); | |
extra = extra_dbits[code]; | |
if (extra !== 0) { | |
dist -= base_dist[code]; | |
send_bits(s, dist, extra); | |
} | |
} | |
} while (lx < s.last_lit); | |
} | |
send_code(s, END_BLOCK, ltree); | |
} | |
function build_tree(s, desc) | |
{ | |
var tree = desc.dyn_tree; | |
var stree = desc.stat_desc.static_tree; | |
var has_stree = desc.stat_desc.has_stree; | |
var elems = desc.stat_desc.elems; | |
var n, m; | |
var max_code = -1; | |
var node; | |
s.heap_len = 0; | |
s.heap_max = HEAP_SIZE; | |
for (n = 0; n < elems; n++) { | |
if (tree[n * 2] !== 0) { | |
s.heap[++s.heap_len] = max_code = n; | |
s.depth[n] = 0; | |
} else { | |
tree[n * 2 + 1] = 0; | |
} | |
} | |
while (s.heap_len < 2) { | |
node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); | |
tree[node * 2] = 1; | |
s.depth[node] = 0; | |
s.opt_len--; | |
if (has_stree) { | |
s.static_len -= stree[node * 2 + 1]; | |
} | |
} | |
desc.max_code = max_code; | |
for (n = (s.heap_len >> 1); n >= 1; n--) { pqdownheap(s, tree, n); } | |
node = elems; | |
do { | |
n = s.heap[1]; | |
s.heap[1] = s.heap[s.heap_len--]; | |
pqdownheap(s, tree, 1); | |
m = s.heap[1]; | |
s.heap[--s.heap_max] = n; | |
s.heap[--s.heap_max] = m; | |
tree[node * 2] = tree[n * 2] + tree[m * 2]; | |
s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; | |
tree[n * 2 + 1] = tree[m * 2 + 1] = node; | |
s.heap[1] = node++; | |
pqdownheap(s, tree, 1); | |
} while (s.heap_len >= 2); | |
s.heap[--s.heap_max] = s.heap[1]; | |
gen_bitlen(s, desc); | |
gen_codes(tree, max_code, s.bl_count); | |
} | |
function scan_tree(s, tree, max_code) | |
{ | |
var n; | |
var prevlen = -1; | |
var curlen; | |
var nextlen = tree[0 * 2 + 1]; | |
var count = 0; | |
var max_count = 7; | |
var min_count = 4; | |
if (nextlen === 0) { | |
max_count = 138; | |
min_count = 3; | |
} | |
tree[(max_code + 1) * 2 + 1] = 0xffff; | |
for (n = 0; n <= max_code; n++) { | |
curlen = nextlen; | |
nextlen = tree[(n + 1) * 2 + 1]; | |
if (++count < max_count && curlen === nextlen) { | |
continue; | |
} else if (count < min_count) { | |
s.bl_tree[curlen * 2] += count; | |
} else if (curlen !== 0) { | |
if (curlen !== prevlen) { s.bl_tree[curlen * 2]++; } | |
s.bl_tree[REP_3_6 * 2]++; | |
} else if (count <= 10) { | |
s.bl_tree[REPZ_3_10 * 2]++; | |
} else { | |
s.bl_tree[REPZ_11_138 * 2]++; | |
} | |
count = 0; | |
prevlen = curlen; | |
if (nextlen === 0) { | |
max_count = 138; | |
min_count = 3; | |
} else if (curlen === nextlen) { | |
max_count = 6; | |
min_count = 3; | |
} else { | |
max_count = 7; | |
min_count = 4; | |
} | |
} | |
} | |
function send_tree(s, tree, max_code) | |
{ | |
var n; | |
var prevlen = -1; | |
var curlen; | |
var nextlen = tree[0 * 2 + 1]; | |
var count = 0; | |
var max_count = 7; | |
var min_count = 4; | |
if (nextlen === 0) { | |
max_count = 138; | |
min_count = 3; | |
} | |
for (n = 0; n <= max_code; n++) { | |
curlen = nextlen; | |
nextlen = tree[(n + 1) * 2 + 1]; | |
if (++count < max_count && curlen === nextlen) { | |
continue; | |
} else if (count < min_count) { | |
do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); | |
} else if (curlen !== 0) { | |
if (curlen !== prevlen) { | |
send_code(s, curlen, s.bl_tree); | |
count--; | |
} | |
send_code(s, REP_3_6, s.bl_tree); | |
send_bits(s, count - 3, 2); | |
} else if (count <= 10) { | |
send_code(s, REPZ_3_10, s.bl_tree); | |
send_bits(s, count - 3, 3); | |
} else { | |
send_code(s, REPZ_11_138, s.bl_tree); | |
send_bits(s, count - 11, 7); | |
} | |
count = 0; | |
prevlen = curlen; | |
if (nextlen === 0) { | |
max_count = 138; | |
min_count = 3; | |
} else if (curlen === nextlen) { | |
max_count = 6; | |
min_count = 3; | |
} else { | |
max_count = 7; | |
min_count = 4; | |
} | |
} | |
} | |
function build_bl_tree(s) { | |
var max_blindex; | |
scan_tree(s, s.dyn_ltree, s.l_desc.max_code); | |
scan_tree(s, s.dyn_dtree, s.d_desc.max_code); | |
build_tree(s, s.bl_desc); | |
for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { | |
if (s.bl_tree[bl_order[max_blindex] * 2 + 1] !== 0) { | |
break; | |
} | |
} | |
s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; | |
return max_blindex; | |
} | |
function send_all_trees(s, lcodes, dcodes, blcodes) | |
{ | |
var rank; | |
send_bits(s, lcodes - 257, 5); | |
send_bits(s, dcodes - 1, 5); | |
send_bits(s, blcodes - 4, 4); | |
for (rank = 0; rank < blcodes; rank++) { | |
send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1], 3); | |
} | |
send_tree(s, s.dyn_ltree, lcodes - 1); | |
send_tree(s, s.dyn_dtree, dcodes - 1); | |
} | |
function detect_data_type(s) { | |
var black_mask = 0xf3ffc07f; | |
var n; | |
for (n = 0; n <= 31; n++, black_mask >>>= 1) { | |
if ((black_mask & 1) && (s.dyn_ltree[n * 2] !== 0)) { | |
return Z_BINARY; | |
} | |
} | |
if (s.dyn_ltree[9 * 2] !== 0 || s.dyn_ltree[10 * 2] !== 0 || | |
s.dyn_ltree[13 * 2] !== 0) { | |
return Z_TEXT; | |
} | |
for (n = 32; n < LITERALS; n++) { | |
if (s.dyn_ltree[n * 2] !== 0) { | |
return Z_TEXT; | |
} | |
} | |
return Z_BINARY; | |
} | |
var static_init_done = false; | |
function _tr_init(s) | |
{ | |
if (!static_init_done) { | |
tr_static_init(); | |
static_init_done = true; | |
} | |
s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); | |
s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); | |
s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); | |
s.bi_buf = 0; | |
s.bi_valid = 0; | |
init_block(s); | |
} | |
function _tr_stored_block(s, buf, stored_len, last) | |
{ | |
send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); | |
copy_block(s, buf, stored_len, true); | |
} | |
function _tr_align(s) { | |
send_bits(s, STATIC_TREES << 1, 3); | |
send_code(s, END_BLOCK, static_ltree); | |
bi_flush(s); | |
} | |
function _tr_flush_block(s, buf, stored_len, last) | |
{ | |
var opt_lenb, static_lenb; | |
var max_blindex = 0; | |
if (s.level > 0) { | |
if (s.strm.data_type === Z_UNKNOWN) { | |
s.strm.data_type = detect_data_type(s); | |
} | |
build_tree(s, s.l_desc); | |
build_tree(s, s.d_desc); | |
max_blindex = build_bl_tree(s); | |
opt_lenb = (s.opt_len + 3 + 7) >>> 3; | |
static_lenb = (s.static_len + 3 + 7) >>> 3; | |
if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } | |
} else { | |
opt_lenb = static_lenb = stored_len + 5; | |
} | |
if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { | |
_tr_stored_block(s, buf, stored_len, last); | |
} else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { | |
send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); | |
compress_block(s, static_ltree, static_dtree); | |
} else { | |
send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); | |
send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); | |
compress_block(s, s.dyn_ltree, s.dyn_dtree); | |
} | |
init_block(s); | |
if (last) { | |
bi_windup(s); | |
} | |
} | |
function _tr_tally(s, dist, lc) | |
{ | |
s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; | |
s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; | |
s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; | |
s.last_lit++; | |
if (dist === 0) { | |
s.dyn_ltree[lc * 2]++; | |
} else { | |
s.matches++; | |
dist--; | |
s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]++; | |
s.dyn_dtree[d_code(dist) * 2]++; | |
} | |
return (s.last_lit === s.lit_bufsize - 1); | |
} | |
exports._tr_init = _tr_init; | |
exports._tr_stored_block = _tr_stored_block; | |
exports._tr_flush_block = _tr_flush_block; | |
exports._tr_tally = _tr_tally; | |
exports._tr_align = _tr_align; | |
},{"../utils/common":35}],45:[function(require,module,exports){ | |
function ZStream() { | |
this.input = null; | |
this.next_in = 0; | |
this.avail_in = 0; | |
this.total_in = 0; | |
this.output = null; | |
this.next_out = 0; | |
this.avail_out = 0; | |
this.total_out = 0; | |
this.msg = ''; | |
this.state = null; | |
this.data_type = 2; | |
this.adler = 0; | |
} | |
module.exports = ZStream; | |
},{}],46:[function(require,module,exports){ | |
(function (process){ | |
if (!process.version || | |
process.version.indexOf('v0.') === 0 || | |
process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { | |
module.exports = nextTick; | |
} else { | |
module.exports = process.nextTick; | |
} | |
function nextTick(fn, arg1, arg2, arg3) { | |
if (typeof fn !== 'function') { | |
throw new TypeError('"callback" argument must be a function'); | |
} | |
var len = arguments.length; | |
var args, i; | |
switch (len) { | |
case 0: | |
case 1: | |
return process.nextTick(fn); | |
case 2: | |
return process.nextTick(function afterTickOne() { | |
fn.call(null, arg1); | |
}); | |
case 3: | |
return process.nextTick(function afterTickTwo() { | |
fn.call(null, arg1, arg2); | |
}); | |
case 4: | |
return process.nextTick(function afterTickThree() { | |
fn.call(null, arg1, arg2, arg3); | |
}); | |
default: | |
args = new Array(len - 1); | |
i = 0; | |
while (i < args.length) { | |
args[i++] = arguments[i]; | |
} | |
return process.nextTick(function afterTick() { | |
fn.apply(null, args); | |
}); | |
} | |
} | |
}).call(this,require('_process')); | |
},{"_process":47}],47:[function(require,module,exports){ | |
var process = module.exports = {}; | |
var cachedSetTimeout; | |
var cachedClearTimeout; | |
function defaultSetTimout() { | |
throw new Error('setTimeout has not been defined'); | |
} | |
function defaultClearTimeout () { | |
throw new Error('clearTimeout has not been defined'); | |
} | |
(function () { | |
try { | |
if (typeof setTimeout === 'function') { | |
cachedSetTimeout = setTimeout; | |
} else { | |
cachedSetTimeout = defaultSetTimout; | |
} | |
} catch (e) { | |
cachedSetTimeout = defaultSetTimout; | |
} | |
try { | |
if (typeof clearTimeout === 'function') { | |
cachedClearTimeout = clearTimeout; | |
} else { | |
cachedClearTimeout = defaultClearTimeout; | |
} | |
} catch (e) { | |
cachedClearTimeout = defaultClearTimeout; | |
} | |
} ()); | |
function runTimeout(fun) { | |
if (cachedSetTimeout === setTimeout) { | |
return setTimeout(fun, 0); | |
} | |
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { | |
cachedSetTimeout = setTimeout; | |
return setTimeout(fun, 0); | |
} | |
try { | |
return cachedSetTimeout(fun, 0); | |
} catch(e){ | |
try { | |
return cachedSetTimeout.call(null, fun, 0); | |
} catch(e){ | |
return cachedSetTimeout.call(this, fun, 0); | |
} | |
} | |
} | |
function runClearTimeout(marker) { | |
if (cachedClearTimeout === clearTimeout) { | |
return clearTimeout(marker); | |
} | |
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { | |
cachedClearTimeout = clearTimeout; | |
return clearTimeout(marker); | |
} | |
try { | |
return cachedClearTimeout(marker); | |
} catch (e){ | |
try { | |
return cachedClearTimeout.call(null, marker); | |
} catch (e){ | |
return cachedClearTimeout.call(this, marker); | |
} | |
} | |
} | |
var queue = []; | |
var draining = false; | |
var currentQueue; | |
var queueIndex = -1; | |
function cleanUpNextTick() { | |
if (!draining || !currentQueue) { | |
return; | |
} | |
draining = false; | |
if (currentQueue.length) { | |
queue = currentQueue.concat(queue); | |
} else { | |
queueIndex = -1; | |
} | |
if (queue.length) { | |
drainQueue(); | |
} | |
} | |
function drainQueue() { | |
if (draining) { | |
return; | |
} | |
var timeout = runTimeout(cleanUpNextTick); | |
draining = true; | |
var len = queue.length; | |
while(len) { | |
currentQueue = queue; | |
queue = []; | |
while (++queueIndex < len) { | |
if (currentQueue) { | |
currentQueue[queueIndex].run(); | |
} | |
} | |
queueIndex = -1; | |
len = queue.length; | |
} | |
currentQueue = null; | |
draining = false; | |
runClearTimeout(timeout); | |
} | |
process.nextTick = function (fun) { | |
var args = new Array(arguments.length - 1); | |
if (arguments.length > 1) { | |
for (var i = 1; i < arguments.length; i++) { | |
args[i - 1] = arguments[i]; | |
} | |
} | |
queue.push(new Item(fun, args)); | |
if (queue.length === 1 && !draining) { | |
runTimeout(drainQueue); | |
} | |
}; | |
function Item(fun, array) { | |
this.fun = fun; | |
this.array = array; | |
} | |
Item.prototype.run = function () { | |
this.fun.apply(null, this.array); | |
}; | |
process.title = 'browser'; | |
process.browser = true; | |
process.env = {}; | |
process.argv = []; | |
process.version = ''; | |
process.versions = {}; | |
function noop() {} | |
process.on = noop; | |
process.addListener = noop; | |
process.once = noop; | |
process.off = noop; | |
process.removeListener = noop; | |
process.removeAllListeners = noop; | |
process.emit = noop; | |
process.prependListener = noop; | |
process.prependOnceListener = noop; | |
process.listeners = function (name) { return [] }; | |
process.binding = function (name) { | |
throw new Error('process.binding is not supported'); | |
}; | |
process.cwd = function () { return '/' }; | |
process.chdir = function (dir) { | |
throw new Error('process.chdir is not supported'); | |
}; | |
process.umask = function() { return 0; }; | |
},{}],48:[function(require,module,exports){ | |
module.exports = require('./lib/_stream_duplex.js'); | |
},{"./lib/_stream_duplex.js":49}],49:[function(require,module,exports){ | |
var processNextTick = require('process-nextick-args'); | |
var objectKeys = Object.keys || function (obj) { | |
var keys = []; | |
for (var key in obj) { | |
keys.push(key); | |
}return keys; | |
}; | |
module.exports = Duplex; | |
var util = require('core-util-is'); | |
util.inherits = require('inherits'); | |
var Readable = require('./_stream_readable'); | |
var Writable = require('./_stream_writable'); | |
util.inherits(Duplex, Readable); | |
var keys = objectKeys(Writable.prototype); | |
for (var v = 0; v < keys.length; v++) { | |
var method = keys[v]; | |
if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; | |
} | |
function Duplex(options) { | |
if (!(this instanceof Duplex)) return new Duplex(options); | |
Readable.call(this, options); | |
Writable.call(this, options); | |
if (options && options.readable === false) this.readable = false; | |
if (options && options.writable === false) this.writable = false; | |
this.allowHalfOpen = true; | |
if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; | |
this.once('end', onend); | |
} | |
function onend() { | |
if (this.allowHalfOpen || this._writableState.ended) return; | |
processNextTick(onEndNT, this); | |
} | |
function onEndNT(self) { | |
self.end(); | |
} | |
Object.defineProperty(Duplex.prototype, 'destroyed', { | |
get: function () { | |
if (this._readableState === undefined || this._writableState === undefined) { | |
return false; | |
} | |
return this._readableState.destroyed && this._writableState.destroyed; | |
}, | |
set: function (value) { | |
if (this._readableState === undefined || this._writableState === undefined) { | |
return; | |
} | |
this._readableState.destroyed = value; | |
this._writableState.destroyed = value; | |
} | |
}); | |
Duplex.prototype._destroy = function (err, cb) { | |
this.push(null); | |
this.end(); | |
processNextTick(cb, err); | |
}; | |
},{"./_stream_readable":51,"./_stream_writable":53,"core-util-is":29,"inherits":32,"process-nextick-args":46}],50:[function(require,module,exports){ | |
module.exports = PassThrough; | |
var Transform = require('./_stream_transform'); | |
var util = require('core-util-is'); | |
util.inherits = require('inherits'); | |
util.inherits(PassThrough, Transform); | |
function PassThrough(options) { | |
if (!(this instanceof PassThrough)) return new PassThrough(options); | |
Transform.call(this, options); | |
} | |
PassThrough.prototype._transform = function (chunk, encoding, cb) { | |
cb(null, chunk); | |
}; | |
},{"./_stream_transform":52,"core-util-is":29,"inherits":32}],51:[function(require,module,exports){ | |
(function (process,global){ | |
var processNextTick = require('process-nextick-args'); | |
module.exports = Readable; | |
var isArray = require('isarray'); | |
var Duplex; | |
Readable.ReadableState = ReadableState; | |
require('events').EventEmitter; | |
var EElistenerCount = function (emitter, type) { | |
return emitter.listeners(type).length; | |
}; | |
var Stream = require('./internal/streams/stream'); | |
var Buffer = require('safe-buffer').Buffer; | |
var OurUint8Array = global.Uint8Array || function () {}; | |
function _uint8ArrayToBuffer(chunk) { | |
return Buffer.from(chunk); | |
} | |
function _isUint8Array(obj) { | |
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; | |
} | |
var util = require('core-util-is'); | |
util.inherits = require('inherits'); | |
var debugUtil = require('util'); | |
var debug = void 0; | |
if (debugUtil && debugUtil.debuglog) { | |
debug = debugUtil.debuglog('stream'); | |
} else { | |
debug = function () {}; | |
} | |
var BufferList = require('./internal/streams/BufferList'); | |
var destroyImpl = require('./internal/streams/destroy'); | |
var StringDecoder; | |
util.inherits(Readable, Stream); | |
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; | |
function prependListener(emitter, event, fn) { | |
if (typeof emitter.prependListener === 'function') { | |
return emitter.prependListener(event, fn); | |
} else { | |
if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; | |
} | |
} | |
function ReadableState(options, stream) { | |
Duplex = Duplex || require('./_stream_duplex'); | |
options = options || {}; | |
this.objectMode = !!options.objectMode; | |
if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; | |
var hwm = options.highWaterMark; | |
var defaultHwm = this.objectMode ? 16 : 16 * 1024; | |
this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; | |
this.highWaterMark = Math.floor(this.highWaterMark); | |
this.buffer = new BufferList(); | |
this.length = 0; | |
this.pipes = null; | |
this.pipesCount = 0; | |
this.flowing = null; | |
this.ended = false; | |
this.endEmitted = false; | |
this.reading = false; | |
this.sync = true; | |
this.needReadable = false; | |
this.emittedReadable = false; | |
this.readableListening = false; | |
this.resumeScheduled = false; | |
this.destroyed = false; | |
this.defaultEncoding = options.defaultEncoding || 'utf8'; | |
this.awaitDrain = 0; | |
this.readingMore = false; | |
this.decoder = null; | |
this.encoding = null; | |
if (options.encoding) { | |
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; | |
this.decoder = new StringDecoder(options.encoding); | |
this.encoding = options.encoding; | |
} | |
} | |
function Readable(options) { | |
Duplex = Duplex || require('./_stream_duplex'); | |
if (!(this instanceof Readable)) return new Readable(options); | |
this._readableState = new ReadableState(options, this); | |
this.readable = true; | |
if (options) { | |
if (typeof options.read === 'function') this._read = options.read; | |
if (typeof options.destroy === 'function') this._destroy = options.destroy; | |
} | |
Stream.call(this); | |
} | |
Object.defineProperty(Readable.prototype, 'destroyed', { | |
get: function () { | |
if (this._readableState === undefined) { | |
return false; | |
} | |
return this._readableState.destroyed; | |
}, | |
set: function (value) { | |
if (!this._readableState) { | |
return; | |
} | |
this._readableState.destroyed = value; | |
} | |
}); | |
Readable.prototype.destroy = destroyImpl.destroy; | |
Readable.prototype._undestroy = destroyImpl.undestroy; | |
Readable.prototype._destroy = function (err, cb) { | |
this.push(null); | |
cb(err); | |
}; | |
Readable.prototype.push = function (chunk, encoding) { | |
var state = this._readableState; | |
var skipChunkCheck; | |
if (!state.objectMode) { | |
if (typeof chunk === 'string') { | |
encoding = encoding || state.defaultEncoding; | |
if (encoding !== state.encoding) { | |
chunk = Buffer.from(chunk, encoding); | |
encoding = ''; | |
} | |
skipChunkCheck = true; | |
} | |
} else { | |
skipChunkCheck = true; | |
} | |
return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); | |
}; | |
Readable.prototype.unshift = function (chunk) { | |
return readableAddChunk(this, chunk, null, true, false); | |
}; | |
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { | |
var state = stream._readableState; | |
if (chunk === null) { | |
state.reading = false; | |
onEofChunk(stream, state); | |
} else { | |
var er; | |
if (!skipChunkCheck) er = chunkInvalid(state, chunk); | |
if (er) { | |
stream.emit('error', er); | |
} else if (state.objectMode || chunk && chunk.length > 0) { | |
if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { | |
chunk = _uint8ArrayToBuffer(chunk); | |
} | |
if (addToFront) { | |
if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); | |
} else if (state.ended) { | |
stream.emit('error', new Error('stream.push() after EOF')); | |
} else { | |
state.reading = false; | |
if (state.decoder && !encoding) { | |
chunk = state.decoder.write(chunk); | |
if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); | |
} else { | |
addChunk(stream, state, chunk, false); | |
} | |
} | |
} else if (!addToFront) { | |
state.reading = false; | |
} | |
} | |
return needMoreData(state); | |
} | |
function addChunk(stream, state, chunk, addToFront) { | |
if (state.flowing && state.length === 0 && !state.sync) { | |
stream.emit('data', chunk); | |
stream.read(0); | |
} else { | |
state.length += state.objectMode ? 1 : chunk.length; | |
if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); | |
if (state.needReadable) emitReadable(stream); | |
} | |
maybeReadMore(stream, state); | |
} | |
function chunkInvalid(state, chunk) { | |
var er; | |
if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { | |
er = new TypeError('Invalid non-string/buffer chunk'); | |
} | |
return er; | |
} | |
function needMoreData(state) { | |
return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); | |
} | |
Readable.prototype.isPaused = function () { | |
return this._readableState.flowing === false; | |
}; | |
Readable.prototype.setEncoding = function (enc) { | |
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; | |
this._readableState.decoder = new StringDecoder(enc); | |
this._readableState.encoding = enc; | |
return this; | |
}; | |
var MAX_HWM = 0x800000; | |
function computeNewHighWaterMark(n) { | |
if (n >= MAX_HWM) { | |
n = MAX_HWM; | |
} else { | |
n--; | |
n |= n >>> 1; | |
n |= n >>> 2; | |
n |= n >>> 4; | |
n |= n >>> 8; | |
n |= n >>> 16; | |
n++; | |
} | |
return n; | |
} | |
function howMuchToRead(n, state) { | |
if (n <= 0 || state.length === 0 && state.ended) return 0; | |
if (state.objectMode) return 1; | |
if (n !== n) { | |
if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; | |
} | |
if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); | |
if (n <= state.length) return n; | |
if (!state.ended) { | |
state.needReadable = true; | |
return 0; | |
} | |
return state.length; | |
} | |
Readable.prototype.read = function (n) { | |
debug('read', n); | |
n = parseInt(n, 10); | |
var state = this._readableState; | |
var nOrig = n; | |
if (n !== 0) state.emittedReadable = false; | |
if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { | |
debug('read: emitReadable', state.length, state.ended); | |
if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); | |
return null; | |
} | |
n = howMuchToRead(n, state); | |
if (n === 0 && state.ended) { | |
if (state.length === 0) endReadable(this); | |
return null; | |
} | |
var doRead = state.needReadable; | |
debug('need readable', doRead); | |
if (state.length === 0 || state.length - n < state.highWaterMark) { | |
doRead = true; | |
debug('length less than watermark', doRead); | |
} | |
if (state.ended || state.reading) { | |
doRead = false; | |
debug('reading or ended', doRead); | |
} else if (doRead) { | |
debug('do read'); | |
state.reading = true; | |
state.sync = true; | |
if (state.length === 0) state.needReadable = true; | |
this._read(state.highWaterMark); | |
state.sync = false; | |
if (!state.reading) n = howMuchToRead(nOrig, state); | |
} | |
var ret; | |
if (n > 0) ret = fromList(n, state);else ret = null; | |
if (ret === null) { | |
state.needReadable = true; | |
n = 0; | |
} else { | |
state.length -= n; | |
} | |
if (state.length === 0) { | |
if (!state.ended) state.needReadable = true; | |
if (nOrig !== n && state.ended) endReadable(this); | |
} | |
if (ret !== null) this.emit('data', ret); | |
return ret; | |
}; | |
function onEofChunk(stream, state) { | |
if (state.ended) return; | |
if (state.decoder) { | |
var chunk = state.decoder.end(); | |
if (chunk && chunk.length) { | |
state.buffer.push(chunk); | |
state.length += state.objectMode ? 1 : chunk.length; | |
} | |
} | |
state.ended = true; | |
emitReadable(stream); | |
} | |
function emitReadable(stream) { | |
var state = stream._readableState; | |
state.needReadable = false; | |
if (!state.emittedReadable) { | |
debug('emitReadable', state.flowing); | |
state.emittedReadable = true; | |
if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); | |
} | |
} | |
function emitReadable_(stream) { | |
debug('emit readable'); | |
stream.emit('readable'); | |
flow(stream); | |
} | |
function maybeReadMore(stream, state) { | |
if (!state.readingMore) { | |
state.readingMore = true; | |
processNextTick(maybeReadMore_, stream, state); | |
} | |
} | |
function maybeReadMore_(stream, state) { | |
var len = state.length; | |
while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { | |
debug('maybeReadMore read 0'); | |
stream.read(0); | |
if (len === state.length) | |
break;else len = state.length; | |
} | |
state.readingMore = false; | |
} | |
Readable.prototype._read = function (n) { | |
this.emit('error', new Error('_read() is not implemented')); | |
}; | |
Readable.prototype.pipe = function (dest, pipeOpts) { | |
var src = this; | |
var state = this._readableState; | |
switch (state.pipesCount) { | |
case 0: | |
state.pipes = dest; | |
break; | |
case 1: | |
state.pipes = [state.pipes, dest]; | |
break; | |
default: | |
state.pipes.push(dest); | |
break; | |
} | |
state.pipesCount += 1; | |
debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); | |
var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; | |
var endFn = doEnd ? onend : unpipe; | |
if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); | |
dest.on('unpipe', onunpipe); | |
function onunpipe(readable, unpipeInfo) { | |
debug('onunpipe'); | |
if (readable === src) { | |
if (unpipeInfo && unpipeInfo.hasUnpiped === false) { | |
unpipeInfo.hasUnpiped = true; | |
cleanup(); | |
} | |
} | |
} | |
function onend() { | |
debug('onend'); | |
dest.end(); | |
} | |
var ondrain = pipeOnDrain(src); | |
dest.on('drain', ondrain); | |
var cleanedUp = false; | |
function cleanup() { | |
debug('cleanup'); | |
dest.removeListener('close', onclose); | |
dest.removeListener('finish', onfinish); | |
dest.removeListener('drain', ondrain); | |
dest.removeListener('error', onerror); | |
dest.removeListener('unpipe', onunpipe); | |
src.removeListener('end', onend); | |
src.removeListener('end', unpipe); | |
src.removeListener('data', ondata); | |
cleanedUp = true; | |
if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); | |
} | |
var increasedAwaitDrain = false; | |
src.on('data', ondata); | |
function ondata(chunk) { | |
debug('ondata'); | |
increasedAwaitDrain = false; | |
var ret = dest.write(chunk); | |
if (false === ret && !increasedAwaitDrain) { | |
if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { | |
debug('false write response, pause', src._readableState.awaitDrain); | |
src._readableState.awaitDrain++; | |
increasedAwaitDrain = true; | |
} | |
src.pause(); | |
} | |
} | |
function onerror(er) { | |
debug('onerror', er); | |
unpipe(); | |
dest.removeListener('error', onerror); | |
if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); | |
} | |
prependListener(dest, 'error', onerror); | |
function onclose() { | |
dest.removeListener('finish', onfinish); | |
unpipe(); | |
} | |
dest.once('close', onclose); | |
function onfinish() { | |
debug('onfinish'); | |
dest.removeListener('close', onclose); | |
unpipe(); | |
} | |
dest.once('finish', onfinish); | |
function unpipe() { | |
debug('unpipe'); | |
src.unpipe(dest); | |
} | |
dest.emit('pipe', src); | |
if (!state.flowing) { | |
debug('pipe resume'); | |
src.resume(); | |
} | |
return dest; | |
}; | |
function pipeOnDrain(src) { | |
return function () { | |
var state = src._readableState; | |
debug('pipeOnDrain', state.awaitDrain); | |
if (state.awaitDrain) state.awaitDrain--; | |
if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { | |
state.flowing = true; | |
flow(src); | |
} | |
}; | |
} | |
Readable.prototype.unpipe = function (dest) { | |
var state = this._readableState; | |
var unpipeInfo = { hasUnpiped: false }; | |
if (state.pipesCount === 0) return this; | |
if (state.pipesCount === 1) { | |
if (dest && dest !== state.pipes) return this; | |
if (!dest) dest = state.pipes; | |
state.pipes = null; | |
state.pipesCount = 0; | |
state.flowing = false; | |
if (dest) dest.emit('unpipe', this, unpipeInfo); | |
return this; | |
} | |
if (!dest) { | |
var dests = state.pipes; | |
var len = state.pipesCount; | |
state.pipes = null; | |
state.pipesCount = 0; | |
state.flowing = false; | |
for (var i = 0; i < len; i++) { | |
dests[i].emit('unpipe', this, unpipeInfo); | |
}return this; | |
} | |
var index = indexOf(state.pipes, dest); | |
if (index === -1) return this; | |
state.pipes.splice(index, 1); | |
state.pipesCount -= 1; | |
if (state.pipesCount === 1) state.pipes = state.pipes[0]; | |
dest.emit('unpipe', this, unpipeInfo); | |
return this; | |
}; | |
Readable.prototype.on = function (ev, fn) { | |
var res = Stream.prototype.on.call(this, ev, fn); | |
if (ev === 'data') { | |
if (this._readableState.flowing !== false) this.resume(); | |
} else if (ev === 'readable') { | |
var state = this._readableState; | |
if (!state.endEmitted && !state.readableListening) { | |
state.readableListening = state.needReadable = true; | |
state.emittedReadable = false; | |
if (!state.reading) { | |
processNextTick(nReadingNextTick, this); | |
} else if (state.length) { | |
emitReadable(this); | |
} | |
} | |
} | |
return res; | |
}; | |
Readable.prototype.addListener = Readable.prototype.on; | |
function nReadingNextTick(self) { | |
debug('readable nexttick read 0'); | |
self.read(0); | |
} | |
Readable.prototype.resume = function () { | |
var state = this._readableState; | |
if (!state.flowing) { | |
debug('resume'); | |
state.flowing = true; | |
resume(this, state); | |
} | |
return this; | |
}; | |
function resume(stream, state) { | |
if (!state.resumeScheduled) { | |
state.resumeScheduled = true; | |
processNextTick(resume_, stream, state); | |
} | |
} | |
function resume_(stream, state) { | |
if (!state.reading) { | |
debug('resume read 0'); | |
stream.read(0); | |
} | |
state.resumeScheduled = false; | |
state.awaitDrain = 0; | |
stream.emit('resume'); | |
flow(stream); | |
if (state.flowing && !state.reading) stream.read(0); | |
} | |
Readable.prototype.pause = function () { | |
debug('call pause flowing=%j', this._readableState.flowing); | |
if (false !== this._readableState.flowing) { | |
debug('pause'); | |
this._readableState.flowing = false; | |
this.emit('pause'); | |
} | |
return this; | |
}; | |
function flow(stream) { | |
var state = stream._readableState; | |
debug('flow', state.flowing); | |
while (state.flowing && stream.read() !== null) {} | |
} | |
Readable.prototype.wrap = function (stream) { | |
var state = this._readableState; | |
var paused = false; | |
var self = this; | |
stream.on('end', function () { | |
debug('wrapped end'); | |
if (state.decoder && !state.ended) { | |
var chunk = state.decoder.end(); | |
if (chunk && chunk.length) self.push(chunk); | |
} | |
self.push(null); | |
}); | |
stream.on('data', function (chunk) { | |
debug('wrapped data'); | |
if (state.decoder) chunk = state.decoder.write(chunk); | |
if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; | |
var ret = self.push(chunk); | |
if (!ret) { | |
paused = true; | |
stream.pause(); | |
} | |
}); | |
for (var i in stream) { | |
if (this[i] === undefined && typeof stream[i] === 'function') { | |
this[i] = function (method) { | |
return function () { | |
return stream[method].apply(stream, arguments); | |
}; | |
}(i); | |
} | |
} | |
for (var n = 0; n < kProxyEvents.length; n++) { | |
stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n])); | |
} | |
self._read = function (n) { | |
debug('wrapped _read', n); | |
if (paused) { | |
paused = false; | |
stream.resume(); | |
} | |
}; | |
return self; | |
}; | |
Readable._fromList = fromList; | |
function fromList(n, state) { | |
if (state.length === 0) return null; | |
var ret; | |
if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { | |
if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); | |
state.buffer.clear(); | |
} else { | |
ret = fromListPartial(n, state.buffer, state.decoder); | |
} | |
return ret; | |
} | |
function fromListPartial(n, list, hasStrings) { | |
var ret; | |
if (n < list.head.data.length) { | |
ret = list.head.data.slice(0, n); | |
list.head.data = list.head.data.slice(n); | |
} else if (n === list.head.data.length) { | |
ret = list.shift(); | |
} else { | |
ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); | |
} | |
return ret; | |
} | |
function copyFromBufferString(n, list) { | |
var p = list.head; | |
var c = 1; | |
var ret = p.data; | |
n -= ret.length; | |
while (p = p.next) { | |
var str = p.data; | |
var nb = n > str.length ? str.length : n; | |
if (nb === str.length) ret += str;else ret += str.slice(0, n); | |
n -= nb; | |
if (n === 0) { | |
if (nb === str.length) { | |
++c; | |
if (p.next) list.head = p.next;else list.head = list.tail = null; | |
} else { | |
list.head = p; | |
p.data = str.slice(nb); | |
} | |
break; | |
} | |
++c; | |
} | |
list.length -= c; | |
return ret; | |
} | |
function copyFromBuffer(n, list) { | |
var ret = Buffer.allocUnsafe(n); | |
var p = list.head; | |
var c = 1; | |
p.data.copy(ret); | |
n -= p.data.length; | |
while (p = p.next) { | |
var buf = p.data; | |
var nb = n > buf.length ? buf.length : n; | |
buf.copy(ret, ret.length - n, 0, nb); | |
n -= nb; | |
if (n === 0) { | |
if (nb === buf.length) { | |
++c; | |
if (p.next) list.head = p.next;else list.head = list.tail = null; | |
} else { | |
list.head = p; | |
p.data = buf.slice(nb); | |
} | |
break; | |
} | |
++c; | |
} | |
list.length -= c; | |
return ret; | |
} | |
function endReadable(stream) { | |
var state = stream._readableState; | |
if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); | |
if (!state.endEmitted) { | |
state.ended = true; | |
processNextTick(endReadableNT, state, stream); | |
} | |
} | |
function endReadableNT(state, stream) { | |
if (!state.endEmitted && state.length === 0) { | |
state.endEmitted = true; | |
stream.readable = false; | |
stream.emit('end'); | |
} | |
} | |
function indexOf(xs, x) { | |
for (var i = 0, l = xs.length; i < l; i++) { | |
if (xs[i] === x) return i; | |
} | |
return -1; | |
} | |
}).call(this,require('_process'),typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); | |
},{"./_stream_duplex":49,"./internal/streams/BufferList":54,"./internal/streams/destroy":55,"./internal/streams/stream":56,"_process":47,"core-util-is":29,"events":30,"inherits":32,"isarray":34,"process-nextick-args":46,"safe-buffer":62,"string_decoder/":57,"util":25}],52:[function(require,module,exports){ | |
module.exports = Transform; | |
var Duplex = require('./_stream_duplex'); | |
var util = require('core-util-is'); | |
util.inherits = require('inherits'); | |
util.inherits(Transform, Duplex); | |
function TransformState(stream) { | |
this.afterTransform = function (er, data) { | |
return afterTransform(stream, er, data); | |
}; | |
this.needTransform = false; | |
this.transforming = false; | |
this.writecb = null; | |
this.writechunk = null; | |
this.writeencoding = null; | |
} | |
function afterTransform(stream, er, data) { | |
var ts = stream._transformState; | |
ts.transforming = false; | |
var cb = ts.writecb; | |
if (!cb) { | |
return stream.emit('error', new Error('write callback called multiple times')); | |
} | |
ts.writechunk = null; | |
ts.writecb = null; | |
if (data !== null && data !== undefined) stream.push(data); | |
cb(er); | |
var rs = stream._readableState; | |
rs.reading = false; | |
if (rs.needReadable || rs.length < rs.highWaterMark) { | |
stream._read(rs.highWaterMark); | |
} | |
} | |
function Transform(options) { | |
if (!(this instanceof Transform)) return new Transform(options); | |
Duplex.call(this, options); | |
this._transformState = new TransformState(this); | |
var stream = this; | |
this._readableState.needReadable = true; | |
this._readableState.sync = false; | |
if (options) { | |
if (typeof options.transform === 'function') this._transform = options.transform; | |
if (typeof options.flush === 'function') this._flush = options.flush; | |
} | |
this.once('prefinish', function () { | |
if (typeof this._flush === 'function') this._flush(function (er, data) { | |
done(stream, er, data); | |
});else done(stream); | |
}); | |
} | |
Transform.prototype.push = function (chunk, encoding) { | |
this._transformState.needTransform = false; | |
return Duplex.prototype.push.call(this, chunk, encoding); | |
}; | |
Transform.prototype._transform = function (chunk, encoding, cb) { | |
throw new Error('_transform() is not implemented'); | |
}; | |
Transform.prototype._write = function (chunk, encoding, cb) { | |
var ts = this._transformState; | |
ts.writecb = cb; | |
ts.writechunk = chunk; | |
ts.writeencoding = encoding; | |
if (!ts.transforming) { | |
var rs = this._readableState; | |
if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); | |
} | |
}; | |
Transform.prototype._read = function (n) { | |
var ts = this._transformState; | |
if (ts.writechunk !== null && ts.writecb && !ts.transforming) { | |
ts.transforming = true; | |
this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); | |
} else { | |
ts.needTransform = true; | |
} | |
}; | |
Transform.prototype._destroy = function (err, cb) { | |
var _this = this; | |
Duplex.prototype._destroy.call(this, err, function (err2) { | |
cb(err2); | |
_this.emit('close'); | |
}); | |
}; | |
function done(stream, er, data) { | |
if (er) return stream.emit('error', er); | |
if (data !== null && data !== undefined) stream.push(data); | |
var ws = stream._writableState; | |
var ts = stream._transformState; | |
if (ws.length) throw new Error('Calling transform done when ws.length != 0'); | |
if (ts.transforming) throw new Error('Calling transform done when still transforming'); | |
return stream.push(null); | |
} | |
},{"./_stream_duplex":49,"core-util-is":29,"inherits":32}],53:[function(require,module,exports){ | |
(function (process,global){ | |
var processNextTick = require('process-nextick-args'); | |
module.exports = Writable; | |
function CorkedRequest(state) { | |
var _this = this; | |
this.next = null; | |
this.entry = null; | |
this.finish = function () { | |
onCorkedFinish(_this, state); | |
}; | |
} | |
var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; | |
var Duplex; | |
Writable.WritableState = WritableState; | |
var util = require('core-util-is'); | |
util.inherits = require('inherits'); | |
var internalUtil = { | |
deprecate: require('util-deprecate') | |
}; | |
var Stream = require('./internal/streams/stream'); | |
var Buffer = require('safe-buffer').Buffer; | |
var OurUint8Array = global.Uint8Array || function () {}; | |
function _uint8ArrayToBuffer(chunk) { | |
return Buffer.from(chunk); | |
} | |
function _isUint8Array(obj) { | |
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; | |
} | |
var destroyImpl = require('./internal/streams/destroy'); | |
util.inherits(Writable, Stream); | |
function nop() {} | |
function WritableState(options, stream) { | |
Duplex = Duplex || require('./_stream_duplex'); | |
options = options || {}; | |
this.objectMode = !!options.objectMode; | |
if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; | |
var hwm = options.highWaterMark; | |
var defaultHwm = this.objectMode ? 16 : 16 * 1024; | |
this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; | |
this.highWaterMark = Math.floor(this.highWaterMark); | |
this.finalCalled = false; | |
this.needDrain = false; | |
this.ending = false; | |
this.ended = false; | |
this.finished = false; | |
this.destroyed = false; | |
var noDecode = options.decodeStrings === false; | |
this.decodeStrings = !noDecode; | |
this.defaultEncoding = options.defaultEncoding || 'utf8'; | |
this.length = 0; | |
this.writing = false; | |
this.corked = 0; | |
this.sync = true; | |
this.bufferProcessing = false; | |
this.onwrite = function (er) { | |
onwrite(stream, er); | |
}; | |
this.writecb = null; | |
this.writelen = 0; | |
this.bufferedRequest = null; | |
this.lastBufferedRequest = null; | |
this.pendingcb = 0; | |
this.prefinished = false; | |
this.errorEmitted = false; | |
this.bufferedRequestCount = 0; | |
this.corkedRequestsFree = new CorkedRequest(this); | |
} | |
WritableState.prototype.getBuffer = function getBuffer() { | |
var current = this.bufferedRequest; | |
var out = []; | |
while (current) { | |
out.push(current); | |
current = current.next; | |
} | |
return out; | |
}; | |
(function () { | |
try { | |
Object.defineProperty(WritableState.prototype, 'buffer', { | |
get: internalUtil.deprecate(function () { | |
return this.getBuffer(); | |
}, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') | |
}); | |
} catch (_) {} | |
})(); | |
var realHasInstance; | |
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { | |
realHasInstance = Function.prototype[Symbol.hasInstance]; | |
Object.defineProperty(Writable, Symbol.hasInstance, { | |
value: function (object) { | |
if (realHasInstance.call(this, object)) return true; | |
return object && object._writableState instanceof WritableState; | |
} | |
}); | |
} else { | |
realHasInstance = function (object) { | |
return object instanceof this; | |
}; | |
} | |
function Writable(options) { | |
Duplex = Duplex || require('./_stream_duplex'); | |
if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { | |
return new Writable(options); | |
} | |
this._writableState = new WritableState(options, this); | |
this.writable = true; | |
if (options) { | |
if (typeof options.write === 'function') this._write = options.write; | |
if (typeof options.writev === 'function') this._writev = options.writev; | |
if (typeof options.destroy === 'function') this._destroy = options.destroy; | |
if (typeof options.final === 'function') this._final = options.final; | |
} | |
Stream.call(this); | |
} | |
Writable.prototype.pipe = function () { | |
this.emit('error', new Error('Cannot pipe, not readable')); | |
}; | |
function writeAfterEnd(stream, cb) { | |
var er = new Error('write after end'); | |
stream.emit('error', er); | |
processNextTick(cb, er); | |
} | |
function validChunk(stream, state, chunk, cb) { | |
var valid = true; | |
var er = false; | |
if (chunk === null) { | |
er = new TypeError('May not write null values to stream'); | |
} else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { | |
er = new TypeError('Invalid non-string/buffer chunk'); | |
} | |
if (er) { | |
stream.emit('error', er); | |
processNextTick(cb, er); | |
valid = false; | |
} | |
return valid; | |
} | |
Writable.prototype.write = function (chunk, encoding, cb) { | |
var state = this._writableState; | |
var ret = false; | |
var isBuf = _isUint8Array(chunk) && !state.objectMode; | |
if (isBuf && !Buffer.isBuffer(chunk)) { | |
chunk = _uint8ArrayToBuffer(chunk); | |
} | |
if (typeof encoding === 'function') { | |
cb = encoding; | |
encoding = null; | |
} | |
if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; | |
if (typeof cb !== 'function') cb = nop; | |
if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { | |
state.pendingcb++; | |
ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); | |
} | |
return ret; | |
}; | |
Writable.prototype.cork = function () { | |
var state = this._writableState; | |
state.corked++; | |
}; | |
Writable.prototype.uncork = function () { | |
var state = this._writableState; | |
if (state.corked) { | |
state.corked--; | |
if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); | |
} | |
}; | |
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { | |
if (typeof encoding === 'string') encoding = encoding.toLowerCase(); | |
if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); | |
this._writableState.defaultEncoding = encoding; | |
return this; | |
}; | |
function decodeChunk(state, chunk, encoding) { | |
if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { | |
chunk = Buffer.from(chunk, encoding); | |
} | |
return chunk; | |
} | |
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { | |
if (!isBuf) { | |
var newChunk = decodeChunk(state, chunk, encoding); | |
if (chunk !== newChunk) { | |
isBuf = true; | |
encoding = 'buffer'; | |
chunk = newChunk; | |
} | |
} | |
var len = state.objectMode ? 1 : chunk.length; | |
state.length += len; | |
var ret = state.length < state.highWaterMark; | |
if (!ret) state.needDrain = true; | |
if (state.writing || state.corked) { | |
var last = state.lastBufferedRequest; | |
state.lastBufferedRequest = { | |
chunk: chunk, | |
encoding: encoding, | |
isBuf: isBuf, | |
callback: cb, | |
next: null | |
}; | |
if (last) { | |
last.next = state.lastBufferedRequest; | |
} else { | |
state.bufferedRequest = state.lastBufferedRequest; | |
} | |
state.bufferedRequestCount += 1; | |
} else { | |
doWrite(stream, state, false, len, chunk, encoding, cb); | |
} | |
return ret; | |
} | |
function doWrite(stream, state, writev, len, chunk, encoding, cb) { | |
state.writelen = len; | |
state.writecb = cb; | |
state.writing = true; | |
state.sync = true; | |
if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); | |
state.sync = false; | |
} | |
function onwriteError(stream, state, sync, er, cb) { | |
--state.pendingcb; | |
if (sync) { | |
processNextTick(cb, er); | |
processNextTick(finishMaybe, stream, state); | |
stream._writableState.errorEmitted = true; | |
stream.emit('error', er); | |
} else { | |
cb(er); | |
stream._writableState.errorEmitted = true; | |
stream.emit('error', er); | |
finishMaybe(stream, state); | |
} | |
} | |
function onwriteStateUpdate(state) { | |
state.writing = false; | |
state.writecb = null; | |
state.length -= state.writelen; | |
state.writelen = 0; | |
} | |
function onwrite(stream, er) { | |
var state = stream._writableState; | |
var sync = state.sync; | |
var cb = state.writecb; | |
onwriteStateUpdate(state); | |
if (er) onwriteError(stream, state, sync, er, cb);else { | |
var finished = needFinish(state); | |
if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { | |
clearBuffer(stream, state); | |
} | |
if (sync) { | |
asyncWrite(afterWrite, stream, state, finished, cb); | |
} else { | |
afterWrite(stream, state, finished, cb); | |
} | |
} | |
} | |
function afterWrite(stream, state, finished, cb) { | |
if (!finished) onwriteDrain(stream, state); | |
state.pendingcb--; | |
cb(); | |
finishMaybe(stream, state); | |
} | |
function onwriteDrain(stream, state) { | |
if (state.length === 0 && state.needDrain) { | |
state.needDrain = false; | |
stream.emit('drain'); | |
} | |
} | |
function clearBuffer(stream, state) { | |
state.bufferProcessing = true; | |
var entry = state.bufferedRequest; | |
if (stream._writev && entry && entry.next) { | |
var l = state.bufferedRequestCount; | |
var buffer = new Array(l); | |
var holder = state.corkedRequestsFree; | |
holder.entry = entry; | |
var count = 0; | |
var allBuffers = true; | |
while (entry) { | |
buffer[count] = entry; | |
if (!entry.isBuf) allBuffers = false; | |
entry = entry.next; | |
count += 1; | |
} | |
buffer.allBuffers = allBuffers; | |
doWrite(stream, state, true, state.length, buffer, '', holder.finish); | |
state.pendingcb++; | |
state.lastBufferedRequest = null; | |
if (holder.next) { | |
state.corkedRequestsFree = holder.next; | |
holder.next = null; | |
} else { | |
state.corkedRequestsFree = new CorkedRequest(state); | |
} | |
} else { | |
while (entry) { | |
var chunk = entry.chunk; | |
var encoding = entry.encoding; | |
var cb = entry.callback; | |
var len = state.objectMode ? 1 : chunk.length; | |
doWrite(stream, state, false, len, chunk, encoding, cb); | |
entry = entry.next; | |
if (state.writing) { | |
break; | |
} | |
} | |
if (entry === null) state.lastBufferedRequest = null; | |
} | |
state.bufferedRequestCount = 0; | |
state.bufferedRequest = entry; | |
state.bufferProcessing = false; | |
} | |
Writable.prototype._write = function (chunk, encoding, cb) { | |
cb(new Error('_write() is not implemented')); | |
}; | |
Writable.prototype._writev = null; | |
Writable.prototype.end = function (chunk, encoding, cb) { | |
var state = this._writableState; | |
if (typeof chunk === 'function') { | |
cb = chunk; | |
chunk = null; | |
encoding = null; | |
} else if (typeof encoding === 'function') { | |
cb = encoding; | |
encoding = null; | |
} | |
if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); | |
if (state.corked) { | |
state.corked = 1; | |
this.uncork(); | |
} | |
if (!state.ending && !state.finished) endWritable(this, state, cb); | |
}; | |
function needFinish(state) { | |
return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; | |
} | |
function callFinal(stream, state) { | |
stream._final(function (err) { | |
state.pendingcb--; | |
if (err) { | |
stream.emit('error', err); | |
} | |
state.prefinished = true; | |
stream.emit('prefinish'); | |
finishMaybe(stream, state); | |
}); | |
} | |
function prefinish(stream, state) { | |
if (!state.prefinished && !state.finalCalled) { | |
if (typeof stream._final === 'function') { | |
state.pendingcb++; | |
state.finalCalled = true; | |
processNextTick(callFinal, stream, state); | |
} else { | |
state.prefinished = true; | |
stream.emit('prefinish'); | |
} | |
} | |
} | |
function finishMaybe(stream, state) { | |
var need = needFinish(state); | |
if (need) { | |
prefinish(stream, state); | |
if (state.pendingcb === 0) { | |
state.finished = true; | |
stream.emit('finish'); | |
} | |
} | |
return need; | |
} | |
function endWritable(stream, state, cb) { | |
state.ending = true; | |
finishMaybe(stream, state); | |
if (cb) { | |
if (state.finished) processNextTick(cb);else stream.once('finish', cb); | |
} | |
state.ended = true; | |
stream.writable = false; | |
} | |
function onCorkedFinish(corkReq, state, err) { | |
var entry = corkReq.entry; | |
corkReq.entry = null; | |
while (entry) { | |
var cb = entry.callback; | |
state.pendingcb--; | |
cb(err); | |
entry = entry.next; | |
} | |
if (state.corkedRequestsFree) { | |
state.corkedRequestsFree.next = corkReq; | |
} else { | |
state.corkedRequestsFree = corkReq; | |
} | |
} | |
Object.defineProperty(Writable.prototype, 'destroyed', { | |
get: function () { | |
if (this._writableState === undefined) { | |
return false; | |
} | |
return this._writableState.destroyed; | |
}, | |
set: function (value) { | |
if (!this._writableState) { | |
return; | |
} | |
this._writableState.destroyed = value; | |
} | |
}); | |
Writable.prototype.destroy = destroyImpl.destroy; | |
Writable.prototype._undestroy = destroyImpl.undestroy; | |
Writable.prototype._destroy = function (err, cb) { | |
this.end(); | |
cb(err); | |
}; | |
}).call(this,require('_process'),typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); | |
},{"./_stream_duplex":49,"./internal/streams/destroy":55,"./internal/streams/stream":56,"_process":47,"core-util-is":29,"inherits":32,"process-nextick-args":46,"safe-buffer":62,"util-deprecate":64}],54:[function(require,module,exports){ | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | |
var Buffer = require('safe-buffer').Buffer; | |
function copyBuffer(src, target, offset) { | |
src.copy(target, offset); | |
} | |
module.exports = function () { | |
function BufferList() { | |
_classCallCheck(this, BufferList); | |
this.head = null; | |
this.tail = null; | |
this.length = 0; | |
} | |
BufferList.prototype.push = function push(v) { | |
var entry = { data: v, next: null }; | |
if (this.length > 0) this.tail.next = entry;else this.head = entry; | |
this.tail = entry; | |
++this.length; | |
}; | |
BufferList.prototype.unshift = function unshift(v) { | |
var entry = { data: v, next: this.head }; | |
if (this.length === 0) this.tail = entry; | |
this.head = entry; | |
++this.length; | |
}; | |
BufferList.prototype.shift = function shift() { | |
if (this.length === 0) return; | |
var ret = this.head.data; | |
if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; | |
--this.length; | |
return ret; | |
}; | |
BufferList.prototype.clear = function clear() { | |
this.head = this.tail = null; | |
this.length = 0; | |
}; | |
BufferList.prototype.join = function join(s) { | |
if (this.length === 0) return ''; | |
var p = this.head; | |
var ret = '' + p.data; | |
while (p = p.next) { | |
ret += s + p.data; | |
}return ret; | |
}; | |
BufferList.prototype.concat = function concat(n) { | |
if (this.length === 0) return Buffer.alloc(0); | |
if (this.length === 1) return this.head.data; | |
var ret = Buffer.allocUnsafe(n >>> 0); | |
var p = this.head; | |
var i = 0; | |
while (p) { | |
copyBuffer(p.data, ret, i); | |
i += p.data.length; | |
p = p.next; | |
} | |
return ret; | |
}; | |
return BufferList; | |
}(); | |
},{"safe-buffer":62}],55:[function(require,module,exports){ | |
var processNextTick = require('process-nextick-args'); | |
function destroy(err, cb) { | |
var _this = this; | |
var readableDestroyed = this._readableState && this._readableState.destroyed; | |
var writableDestroyed = this._writableState && this._writableState.destroyed; | |
if (readableDestroyed || writableDestroyed) { | |
if (cb) { | |
cb(err); | |
} else if (err && (!this._writableState || !this._writableState.errorEmitted)) { | |
processNextTick(emitErrorNT, this, err); | |
} | |
return; | |
} | |
if (this._readableState) { | |
this._readableState.destroyed = true; | |
} | |
if (this._writableState) { | |
this._writableState.destroyed = true; | |
} | |
this._destroy(err || null, function (err) { | |
if (!cb && err) { | |
processNextTick(emitErrorNT, _this, err); | |
if (_this._writableState) { | |
_this._writableState.errorEmitted = true; | |
} | |
} else if (cb) { | |
cb(err); | |
} | |
}); | |
} | |
function undestroy() { | |
if (this._readableState) { | |
this._readableState.destroyed = false; | |
this._readableState.reading = false; | |
this._readableState.ended = false; | |
this._readableState.endEmitted = false; | |
} | |
if (this._writableState) { | |
this._writableState.destroyed = false; | |
this._writableState.ended = false; | |
this._writableState.ending = false; | |
this._writableState.finished = false; | |
this._writableState.errorEmitted = false; | |
} | |
} | |
function emitErrorNT(self, err) { | |
self.emit('error', err); | |
} | |
module.exports = { | |
destroy: destroy, | |
undestroy: undestroy | |
}; | |
},{"process-nextick-args":46}],56:[function(require,module,exports){ | |
module.exports = require('events').EventEmitter; | |
},{"events":30}],57:[function(require,module,exports){ | |
var Buffer = require('safe-buffer').Buffer; | |
var isEncoding = Buffer.isEncoding || function (encoding) { | |
encoding = '' + encoding; | |
switch (encoding && encoding.toLowerCase()) { | |
case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': | |
return true; | |
default: | |
return false; | |
} | |
}; | |
function _normalizeEncoding(enc) { | |
if (!enc) return 'utf8'; | |
var retried; | |
while (true) { | |
switch (enc) { | |
case 'utf8': | |
case 'utf-8': | |
return 'utf8'; | |
case 'ucs2': | |
case 'ucs-2': | |
case 'utf16le': | |
case 'utf-16le': | |
return 'utf16le'; | |
case 'latin1': | |
case 'binary': | |
return 'latin1'; | |
case 'base64': | |
case 'ascii': | |
case 'hex': | |
return enc; | |
default: | |
if (retried) return; | |
enc = ('' + enc).toLowerCase(); | |
retried = true; | |
} | |
} | |
}function normalizeEncoding(enc) { | |
var nenc = _normalizeEncoding(enc); | |
if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); | |
return nenc || enc; | |
} | |
exports.StringDecoder = StringDecoder; | |
function StringDecoder(encoding) { | |
this.encoding = normalizeEncoding(encoding); | |
var nb; | |
switch (this.encoding) { | |
case 'utf16le': | |
this.text = utf16Text; | |
this.end = utf16End; | |
nb = 4; | |
break; | |
case 'utf8': | |
this.fillLast = utf8FillLast; | |
nb = 4; | |
break; | |
case 'base64': | |
this.text = base64Text; | |
this.end = base64End; | |
nb = 3; | |
break; | |
default: | |
this.write = simpleWrite; | |
this.end = simpleEnd; | |
return; | |
} | |
this.lastNeed = 0; | |
this.lastTotal = 0; | |
this.lastChar = Buffer.allocUnsafe(nb); | |
} | |
StringDecoder.prototype.write = function (buf) { | |
if (buf.length === 0) return ''; | |
var r; | |
var i; | |
if (this.lastNeed) { | |
r = this.fillLast(buf); | |
if (r === undefined) return ''; | |
i = this.lastNeed; | |
this.lastNeed = 0; | |
} else { | |
i = 0; | |
} | |
if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); | |
return r || ''; | |
}; | |
StringDecoder.prototype.end = utf8End; | |
StringDecoder.prototype.text = utf8Text; | |
StringDecoder.prototype.fillLast = function (buf) { | |
if (this.lastNeed <= buf.length) { | |
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); | |
return this.lastChar.toString(this.encoding, 0, this.lastTotal); | |
} | |
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); | |
this.lastNeed -= buf.length; | |
}; | |
function utf8CheckByte(byte) { | |
if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; | |
return -1; | |
} | |
function utf8CheckIncomplete(self, buf, i) { | |
var j = buf.length - 1; | |
if (j < i) return 0; | |
var nb = utf8CheckByte(buf[j]); | |
if (nb >= 0) { | |
if (nb > 0) self.lastNeed = nb - 1; | |
return nb; | |
} | |
if (--j < i) return 0; | |
nb = utf8CheckByte(buf[j]); | |
if (nb >= 0) { | |
if (nb > 0) self.lastNeed = nb - 2; | |
return nb; | |
} | |
if (--j < i) return 0; | |
nb = utf8CheckByte(buf[j]); | |
if (nb >= 0) { | |
if (nb > 0) { | |
if (nb === 2) nb = 0;else self.lastNeed = nb - 3; | |
} | |
return nb; | |
} | |
return 0; | |
} | |
function utf8CheckExtraBytes(self, buf, p) { | |
if ((buf[0] & 0xC0) !== 0x80) { | |
self.lastNeed = 0; | |
return '\ufffd'.repeat(p); | |
} | |
if (self.lastNeed > 1 && buf.length > 1) { | |
if ((buf[1] & 0xC0) !== 0x80) { | |
self.lastNeed = 1; | |
return '\ufffd'.repeat(p + 1); | |
} | |
if (self.lastNeed > 2 && buf.length > 2) { | |
if ((buf[2] & 0xC0) !== 0x80) { | |
self.lastNeed = 2; | |
return '\ufffd'.repeat(p + 2); | |
} | |
} | |
} | |
} | |
function utf8FillLast(buf) { | |
var p = this.lastTotal - this.lastNeed; | |
var r = utf8CheckExtraBytes(this, buf, p); | |
if (r !== undefined) return r; | |
if (this.lastNeed <= buf.length) { | |
buf.copy(this.lastChar, p, 0, this.lastNeed); | |
return this.lastChar.toString(this.encoding, 0, this.lastTotal); | |
} | |
buf.copy(this.lastChar, p, 0, buf.length); | |
this.lastNeed -= buf.length; | |
} | |
function utf8Text(buf, i) { | |
var total = utf8CheckIncomplete(this, buf, i); | |
if (!this.lastNeed) return buf.toString('utf8', i); | |
this.lastTotal = total; | |
var end = buf.length - (total - this.lastNeed); | |
buf.copy(this.lastChar, 0, end); | |
return buf.toString('utf8', i, end); | |
} | |
function utf8End(buf) { | |
var r = buf && buf.length ? this.write(buf) : ''; | |
if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed); | |
return r; | |
} | |
function utf16Text(buf, i) { | |
if ((buf.length - i) % 2 === 0) { | |
var r = buf.toString('utf16le', i); | |
if (r) { | |
var c = r.charCodeAt(r.length - 1); | |
if (c >= 0xD800 && c <= 0xDBFF) { | |
this.lastNeed = 2; | |
this.lastTotal = 4; | |
this.lastChar[0] = buf[buf.length - 2]; | |
this.lastChar[1] = buf[buf.length - 1]; | |
return r.slice(0, -1); | |
} | |
} | |
return r; | |
} | |
this.lastNeed = 1; | |
this.lastTotal = 2; | |
this.lastChar[0] = buf[buf.length - 1]; | |
return buf.toString('utf16le', i, buf.length - 1); | |
} | |
function utf16End(buf) { | |
var r = buf && buf.length ? this.write(buf) : ''; | |
if (this.lastNeed) { | |
var end = this.lastTotal - this.lastNeed; | |
return r + this.lastChar.toString('utf16le', 0, end); | |
} | |
return r; | |
} | |
function base64Text(buf, i) { | |
var n = (buf.length - i) % 3; | |
if (n === 0) return buf.toString('base64', i); | |
this.lastNeed = 3 - n; | |
this.lastTotal = 3; | |
if (n === 1) { | |
this.lastChar[0] = buf[buf.length - 1]; | |
} else { | |
this.lastChar[0] = buf[buf.length - 2]; | |
this.lastChar[1] = buf[buf.length - 1]; | |
} | |
return buf.toString('base64', i, buf.length - n); | |
} | |
function base64End(buf) { | |
var r = buf && buf.length ? this.write(buf) : ''; | |
if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); | |
return r; | |
} | |
function simpleWrite(buf) { | |
return buf.toString(this.encoding); | |
} | |
function simpleEnd(buf) { | |
return buf && buf.length ? this.write(buf) : ''; | |
} | |
},{"safe-buffer":62}],58:[function(require,module,exports){ | |
module.exports = require('./readable').PassThrough; | |
},{"./readable":59}],59:[function(require,module,exports){ | |
exports = module.exports = require('./lib/_stream_readable.js'); | |
exports.Stream = exports; | |
exports.Readable = exports; | |
exports.Writable = require('./lib/_stream_writable.js'); | |
exports.Duplex = require('./lib/_stream_duplex.js'); | |
exports.Transform = require('./lib/_stream_transform.js'); | |
exports.PassThrough = require('./lib/_stream_passthrough.js'); | |
},{"./lib/_stream_duplex.js":49,"./lib/_stream_passthrough.js":50,"./lib/_stream_readable.js":51,"./lib/_stream_transform.js":52,"./lib/_stream_writable.js":53}],60:[function(require,module,exports){ | |
module.exports = require('./readable').Transform; | |
},{"./readable":59}],61:[function(require,module,exports){ | |
module.exports = require('./lib/_stream_writable.js'); | |
},{"./lib/_stream_writable.js":53}],62:[function(require,module,exports){ | |
var buffer = require('buffer'); | |
var Buffer = buffer.Buffer; | |
function copyProps (src, dst) { | |
for (var key in src) { | |
dst[key] = src[key]; | |
} | |
} | |
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { | |
module.exports = buffer; | |
} else { | |
copyProps(buffer, exports); | |
exports.Buffer = SafeBuffer; | |
} | |
function SafeBuffer (arg, encodingOrOffset, length) { | |
return Buffer(arg, encodingOrOffset, length) | |
} | |
copyProps(Buffer, SafeBuffer); | |
SafeBuffer.from = function (arg, encodingOrOffset, length) { | |
if (typeof arg === 'number') { | |
throw new TypeError('Argument must not be a number') | |
} | |
return Buffer(arg, encodingOrOffset, length) | |
}; | |
SafeBuffer.alloc = function (size, fill, encoding) { | |
if (typeof size !== 'number') { | |
throw new TypeError('Argument must be a number') | |
} | |
var buf = Buffer(size); | |
if (fill !== undefined) { | |
if (typeof encoding === 'string') { | |
buf.fill(fill, encoding); | |
} else { | |
buf.fill(fill); | |
} | |
} else { | |
buf.fill(0); | |
} | |
return buf | |
}; | |
SafeBuffer.allocUnsafe = function (size) { | |
if (typeof size !== 'number') { | |
throw new TypeError('Argument must be a number') | |
} | |
return Buffer(size) | |
}; | |
SafeBuffer.allocUnsafeSlow = function (size) { | |
if (typeof size !== 'number') { | |
throw new TypeError('Argument must be a number') | |
} | |
return buffer.SlowBuffer(size) | |
}; | |
},{"buffer":28}],63:[function(require,module,exports){ | |
module.exports = Stream; | |
var EE = require('events').EventEmitter; | |
var inherits = require('inherits'); | |
inherits(Stream, EE); | |
Stream.Readable = require('readable-stream/readable.js'); | |
Stream.Writable = require('readable-stream/writable.js'); | |
Stream.Duplex = require('readable-stream/duplex.js'); | |
Stream.Transform = require('readable-stream/transform.js'); | |
Stream.PassThrough = require('readable-stream/passthrough.js'); | |
Stream.Stream = Stream; | |
function Stream() { | |
EE.call(this); | |
} | |
Stream.prototype.pipe = function(dest, options) { | |
var source = this; | |
function ondata(chunk) { | |
if (dest.writable) { | |
if (false === dest.write(chunk) && source.pause) { | |
source.pause(); | |
} | |
} | |
} | |
source.on('data', ondata); | |
function ondrain() { | |
if (source.readable && source.resume) { | |
source.resume(); | |
} | |
} | |
dest.on('drain', ondrain); | |
if (!dest._isStdio && (!options || options.end !== false)) { | |
source.on('end', onend); | |
source.on('close', onclose); | |
} | |
var didOnEnd = false; | |
function onend() { | |
if (didOnEnd) return; | |
didOnEnd = true; | |
dest.end(); | |
} | |
function onclose() { | |
if (didOnEnd) return; | |
didOnEnd = true; | |
if (typeof dest.destroy === 'function') dest.destroy(); | |
} | |
function onerror(er) { | |
cleanup(); | |
if (EE.listenerCount(this, 'error') === 0) { | |
throw er; | |
} | |
} | |
source.on('error', onerror); | |
dest.on('error', onerror); | |
function cleanup() { | |
source.removeListener('data', ondata); | |
dest.removeListener('drain', ondrain); | |
source.removeListener('end', onend); | |
source.removeListener('close', onclose); | |
source.removeListener('error', onerror); | |
dest.removeListener('error', onerror); | |
source.removeListener('end', cleanup); | |
source.removeListener('close', cleanup); | |
dest.removeListener('close', cleanup); | |
} | |
source.on('end', cleanup); | |
source.on('close', cleanup); | |
dest.on('close', cleanup); | |
dest.emit('pipe', source); | |
return dest; | |
}; | |
},{"events":30,"inherits":32,"readable-stream/duplex.js":48,"readable-stream/passthrough.js":58,"readable-stream/readable.js":59,"readable-stream/transform.js":60,"readable-stream/writable.js":61}],64:[function(require,module,exports){ | |
(function (global){ | |
module.exports = deprecate; | |
function deprecate (fn, msg) { | |
if (config('noDeprecation')) { | |
return fn; | |
} | |
var warned = false; | |
function deprecated() { | |
if (!warned) { | |
if (config('throwDeprecation')) { | |
throw new Error(msg); | |
} else if (config('traceDeprecation')) { | |
console.trace(msg); | |
} else { | |
console.warn(msg); | |
} | |
warned = true; | |
} | |
return fn.apply(this, arguments); | |
} | |
return deprecated; | |
} | |
function config (name) { | |
try { | |
if (!global.localStorage) return false; | |
} catch (_) { | |
return false; | |
} | |
var val = global.localStorage[name]; | |
if (null == val) return false; | |
return String(val).toLowerCase() === 'true'; | |
} | |
}).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); | |
},{}],65:[function(require,module,exports){ | |
arguments[4][32][0].apply(exports,arguments); | |
},{"dup":32}],66:[function(require,module,exports){ | |
module.exports = function isBuffer(arg) { | |
return arg && typeof arg === 'object' | |
&& typeof arg.copy === 'function' | |
&& typeof arg.fill === 'function' | |
&& typeof arg.readUInt8 === 'function'; | |
}; | |
},{}],67:[function(require,module,exports){ | |
(function (process,global){ | |
var formatRegExp = /%[sdj%]/g; | |
exports.format = function(f) { | |
if (!isString(f)) { | |
var objects = []; | |
for (var i = 0; i < arguments.length; i++) { | |
objects.push(inspect(arguments[i])); | |
} | |
return objects.join(' '); | |
} | |
var i = 1; | |
var args = arguments; | |
var len = args.length; | |
var str = String(f).replace(formatRegExp, function(x) { | |
if (x === '%%') return '%'; | |
if (i >= len) return x; | |
switch (x) { | |
case '%s': return String(args[i++]); | |
case '%d': return Number(args[i++]); | |
case '%j': | |
try { | |
return JSON.stringify(args[i++]); | |
} catch (_) { | |
return '[Circular]'; | |
} | |
default: | |
return x; | |
} | |
}); | |
for (var x = args[i]; i < len; x = args[++i]) { | |
if (isNull(x) || !isObject(x)) { | |
str += ' ' + x; | |
} else { | |
str += ' ' + inspect(x); | |
} | |
} | |
return str; | |
}; | |
exports.deprecate = function(fn, msg) { | |
if (isUndefined(global.process)) { | |
return function() { | |
return exports.deprecate(fn, msg).apply(this, arguments); | |
}; | |
} | |
if (process.noDeprecation === true) { | |
return fn; | |
} | |
var warned = false; | |
function deprecated() { | |
if (!warned) { | |
if (process.throwDeprecation) { | |
throw new Error(msg); | |
} else if (process.traceDeprecation) { | |
console.trace(msg); | |
} else { | |
console.error(msg); | |
} | |
warned = true; | |
} | |
return fn.apply(this, arguments); | |
} | |
return deprecated; | |
}; | |
var debugs = {}; | |
var debugEnviron; | |
exports.debuglog = function(set) { | |
if (isUndefined(debugEnviron)) | |
debugEnviron = process.env.NODE_DEBUG || ''; | |
set = set.toUpperCase(); | |
if (!debugs[set]) { | |
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { | |
var pid = process.pid; | |
debugs[set] = function() { | |
var msg = exports.format.apply(exports, arguments); | |
console.error('%s %d: %s', set, pid, msg); | |
}; | |
} else { | |
debugs[set] = function() {}; | |
} | |
} | |
return debugs[set]; | |
}; | |
function inspect(obj, opts) { | |
var ctx = { | |
seen: [], | |
stylize: stylizeNoColor | |
}; | |
if (arguments.length >= 3) ctx.depth = arguments[2]; | |
if (arguments.length >= 4) ctx.colors = arguments[3]; | |
if (isBoolean(opts)) { | |
ctx.showHidden = opts; | |
} else if (opts) { | |
exports._extend(ctx, opts); | |
} | |
if (isUndefined(ctx.showHidden)) ctx.showHidden = false; | |
if (isUndefined(ctx.depth)) ctx.depth = 2; | |
if (isUndefined(ctx.colors)) ctx.colors = false; | |
if (isUndefined(ctx.customInspect)) ctx.customInspect = true; | |
if (ctx.colors) ctx.stylize = stylizeWithColor; | |
return formatValue(ctx, obj, ctx.depth); | |
} | |
exports.inspect = inspect; | |
inspect.colors = { | |
'bold' : [1, 22], | |
'italic' : [3, 23], | |
'underline' : [4, 24], | |
'inverse' : [7, 27], | |
'white' : [37, 39], | |
'grey' : [90, 39], | |
'black' : [30, 39], | |
'blue' : [34, 39], | |
'cyan' : [36, 39], | |
'green' : [32, 39], | |
'magenta' : [35, 39], | |
'red' : [31, 39], | |
'yellow' : [33, 39] | |
}; | |
inspect.styles = { | |
'special': 'cyan', | |
'number': 'yellow', | |
'boolean': 'yellow', | |
'undefined': 'grey', | |
'null': 'bold', | |
'string': 'green', | |
'date': 'magenta', | |
'regexp': 'red' | |
}; | |
function stylizeWithColor(str, styleType) { | |
var style = inspect.styles[styleType]; | |
if (style) { | |
return '\u001b[' + inspect.colors[style][0] + 'm' + str + | |
'\u001b[' + inspect.colors[style][1] + 'm'; | |
} else { | |
return str; | |
} | |
} | |
function stylizeNoColor(str, styleType) { | |
return str; | |
} | |
function arrayToHash(array) { | |
var hash = {}; | |
array.forEach(function(val, idx) { | |
hash[val] = true; | |
}); | |
return hash; | |
} | |
function formatValue(ctx, value, recurseTimes) { | |
if (ctx.customInspect && | |
value && | |
isFunction(value.inspect) && | |
value.inspect !== exports.inspect && | |
!(value.constructor && value.constructor.prototype === value)) { | |
var ret = value.inspect(recurseTimes, ctx); | |
if (!isString(ret)) { | |
ret = formatValue(ctx, ret, recurseTimes); | |
} | |
return ret; | |
} | |
var primitive = formatPrimitive(ctx, value); | |
if (primitive) { | |
return primitive; | |
} | |
var keys = Object.keys(value); | |
var visibleKeys = arrayToHash(keys); | |
if (ctx.showHidden) { | |
keys = Object.getOwnPropertyNames(value); | |
} | |
if (isError(value) | |
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { | |
return formatError(value); | |
} | |
if (keys.length === 0) { | |
if (isFunction(value)) { | |
var name = value.name ? ': ' + value.name : ''; | |
return ctx.stylize('[Function' + name + ']', 'special'); | |
} | |
if (isRegExp(value)) { | |
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); | |
} | |
if (isDate(value)) { | |
return ctx.stylize(Date.prototype.toString.call(value), 'date'); | |
} | |
if (isError(value)) { | |
return formatError(value); | |
} | |
} | |
var base = '', array = false, braces = ['{', '}']; | |
if (isArray(value)) { | |
array = true; | |
braces = ['[', ']']; | |
} | |
if (isFunction(value)) { | |
var n = value.name ? ': ' + value.name : ''; | |
base = ' [Function' + n + ']'; | |
} | |
if (isRegExp(value)) { | |
base = ' ' + RegExp.prototype.toString.call(value); | |
} | |
if (isDate(value)) { | |
base = ' ' + Date.prototype.toUTCString.call(value); | |
} | |
if (isError(value)) { | |
base = ' ' + formatError(value); | |
} | |
if (keys.length === 0 && (!array || value.length == 0)) { | |
return braces[0] + base + braces[1]; | |
} | |
if (recurseTimes < 0) { | |
if (isRegExp(value)) { | |
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); | |
} else { | |
return ctx.stylize('[Object]', 'special'); | |
} | |
} | |
ctx.seen.push(value); | |
var output; | |
if (array) { | |
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); | |
} else { | |
output = keys.map(function(key) { | |
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); | |
}); | |
} | |
ctx.seen.pop(); | |
return reduceToSingleString(output, base, braces); | |
} | |
function formatPrimitive(ctx, value) { | |
if (isUndefined(value)) | |
return ctx.stylize('undefined', 'undefined'); | |
if (isString(value)) { | |
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') | |
.replace(/'/g, "\\'") | |
.replace(/\\"/g, '"') + '\''; | |
return ctx.stylize(simple, 'string'); | |
} | |
if (isNumber(value)) | |
return ctx.stylize('' + value, 'number'); | |
if (isBoolean(value)) | |
return ctx.stylize('' + value, 'boolean'); | |
if (isNull(value)) | |
return ctx.stylize('null', 'null'); | |
} | |
function formatError(value) { | |
return '[' + Error.prototype.toString.call(value) + ']'; | |
} | |
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { | |
var output = []; | |
for (var i = 0, l = value.length; i < l; ++i) { | |
if (hasOwnProperty(value, String(i))) { | |
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, | |
String(i), true)); | |
} else { | |
output.push(''); | |
} | |
} | |
keys.forEach(function(key) { | |
if (!key.match(/^\d+$/)) { | |
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, | |
key, true)); | |
} | |
}); | |
return output; | |
} | |
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { | |
var name, str, desc; | |
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; | |
if (desc.get) { | |
if (desc.set) { | |
str = ctx.stylize('[Getter/Setter]', 'special'); | |
} else { | |
str = ctx.stylize('[Getter]', 'special'); | |
} | |
} else { | |
if (desc.set) { | |
str = ctx.stylize('[Setter]', 'special'); | |
} | |
} | |
if (!hasOwnProperty(visibleKeys, key)) { | |
name = '[' + key + ']'; | |
} | |
if (!str) { | |
if (ctx.seen.indexOf(desc.value) < 0) { | |
if (isNull(recurseTimes)) { | |
str = formatValue(ctx, desc.value, null); | |
} else { | |
str = formatValue(ctx, desc.value, recurseTimes - 1); | |
} | |
if (str.indexOf('\n') > -1) { | |
if (array) { | |
str = str.split('\n').map(function(line) { | |
return ' ' + line; | |
}).join('\n').substr(2); | |
} else { | |
str = '\n' + str.split('\n').map(function(line) { | |
return ' ' + line; | |
}).join('\n'); | |
} | |
} | |
} else { | |
str = ctx.stylize('[Circular]', 'special'); | |
} | |
} | |
if (isUndefined(name)) { | |
if (array && key.match(/^\d+$/)) { | |
return str; | |
} | |
name = JSON.stringify('' + key); | |
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { | |
name = name.substr(1, name.length - 2); | |
name = ctx.stylize(name, 'name'); | |
} else { | |
name = name.replace(/'/g, "\\'") | |
.replace(/\\"/g, '"') | |
.replace(/(^"|"$)/g, "'"); | |
name = ctx.stylize(name, 'string'); | |
} | |
} | |
return name + ': ' + str; | |
} | |
function reduceToSingleString(output, base, braces) { | |
var length = output.reduce(function(prev, cur) { | |
if (cur.indexOf('\n') >= 0) ; | |
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; | |
}, 0); | |
if (length > 60) { | |
return braces[0] + | |
(base === '' ? '' : base + '\n ') + | |
' ' + | |
output.join(',\n ') + | |
' ' + | |
braces[1]; | |
} | |
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; | |
} | |
function isArray(ar) { | |
return Array.isArray(ar); | |
} | |
exports.isArray = isArray; | |
function isBoolean(arg) { | |
return typeof arg === 'boolean'; | |
} | |
exports.isBoolean = isBoolean; | |
function isNull(arg) { | |
return arg === null; | |
} | |
exports.isNull = isNull; | |
function isNullOrUndefined(arg) { | |
return arg == null; | |
} | |
exports.isNullOrUndefined = isNullOrUndefined; | |
function isNumber(arg) { | |
return typeof arg === 'number'; | |
} | |
exports.isNumber = isNumber; | |
function isString(arg) { | |
return typeof arg === 'string'; | |
} | |
exports.isString = isString; | |
function isSymbol(arg) { | |
return typeof arg === 'symbol'; | |
} | |
exports.isSymbol = isSymbol; | |
function isUndefined(arg) { | |
return arg === void 0; | |
} | |
exports.isUndefined = isUndefined; | |
function isRegExp(re) { | |
return isObject(re) && objectToString(re) === '[object RegExp]'; | |
} | |
exports.isRegExp = isRegExp; | |
function isObject(arg) { | |
return typeof arg === 'object' && arg !== null; | |
} | |
exports.isObject = isObject; | |
function isDate(d) { | |
return isObject(d) && objectToString(d) === '[object Date]'; | |
} | |
exports.isDate = isDate; | |
function isError(e) { | |
return isObject(e) && | |
(objectToString(e) === '[object Error]' || e instanceof Error); | |
} | |
exports.isError = isError; | |
function isFunction(arg) { | |
return typeof arg === 'function'; | |
} | |
exports.isFunction = isFunction; | |
function isPrimitive(arg) { | |
return arg === null || | |
typeof arg === 'boolean' || | |
typeof arg === 'number' || | |
typeof arg === 'string' || | |
typeof arg === 'symbol' || | |
typeof arg === 'undefined'; | |
} | |
exports.isPrimitive = isPrimitive; | |
exports.isBuffer = require('./support/isBuffer'); | |
function objectToString(o) { | |
return Object.prototype.toString.call(o); | |
} | |
function pad(n) { | |
return n < 10 ? '0' + n.toString(10) : n.toString(10); | |
} | |
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', | |
'Oct', 'Nov', 'Dec']; | |
function timestamp() { | |
var d = new Date(); | |
var time = [pad(d.getHours()), | |
pad(d.getMinutes()), | |
pad(d.getSeconds())].join(':'); | |
return [d.getDate(), months[d.getMonth()], time].join(' '); | |
} | |
exports.log = function() { | |
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); | |
}; | |
exports.inherits = require('inherits'); | |
exports._extend = function(origin, add) { | |
if (!add || !isObject(add)) return origin; | |
var keys = Object.keys(add); | |
var i = keys.length; | |
while (i--) { | |
origin[keys[i]] = add[keys[i]]; | |
} | |
return origin; | |
}; | |
function hasOwnProperty(obj, prop) { | |
return Object.prototype.hasOwnProperty.call(obj, prop); | |
} | |
}).call(this,require('_process'),typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); | |
},{"./support/isBuffer":66,"_process":47,"inherits":65}]},{},[20])(20) | |
}); | |
}); | |
const offscreenCanvas = self.OffscreenCanvas ? new OffscreenCanvas(0, 0) : null; | |
const ctx = offscreenCanvas ? offscreenCanvas.getContext('2d') : null; | |
async function createBlobFromImageData(imageData) { | |
if (!offscreenCanvas) { | |
return null; | |
} | |
offscreenCanvas.width = imageData.width; | |
offscreenCanvas.height = imageData.height; | |
ctx.putImageData(imageData, 0, 0); | |
const blob = await offscreenCanvas.convertToBlob(); | |
offscreenCanvas.width = 0; | |
offscreenCanvas.height = 0; | |
return blob; | |
} | |
class DjVuPage extends CompositeChunk { | |
constructor(bs, getINCLChunkCallback) { | |
super(bs); | |
this.getINCLChunkCallback = getINCLChunkCallback; | |
this.reset(); | |
} | |
reset() { | |
this.bs.setOffset(12); | |
this.djbz = null; | |
this.bg44arr = new Array(); | |
this.fg44 = null; | |
this.bgimage = null; | |
this.fgimage = null; | |
this.sjbz = null; | |
this.fgbz = null; | |
this.text = null; | |
this.decoded = false; | |
this.isBackgroundCompletelyDecoded = false; | |
this.isFirstBgChunkDecoded = false; | |
this.info = null; | |
this.iffchunks = []; | |
this.dependencies = null; | |
} | |
getDpi() { | |
if (this.info) { | |
return this.info.dpi; | |
} else { | |
return this.init().info.dpi; | |
} | |
} | |
getHeight() { | |
return this.info ? this.info.height : this.init().info.height; | |
} | |
getWidth() { | |
return this.info ? this.info.width : this.init().info.width; | |
} | |
async createPngObjectUrl() { | |
var time = performance.now(); | |
var imageData = this.getImageData(); | |
var imageBlob = await createBlobFromImageData(imageData); | |
if (!imageBlob) { | |
const pngImage = browser.PNG.sync.write(this.getImageData()); | |
imageBlob = new Blob([pngImage.buffer]); | |
} | |
DjVu.IS_DEBUG && console.log("Png creation time = ", performance.now() - time); | |
var url = URL.createObjectURL(imageBlob); | |
return { | |
url: url, | |
byteLength: imageBlob.size, | |
width: this.getWidth(), | |
height: this.getHeight(), | |
dpi: this.getDpi(), | |
}; | |
} | |
getDependencies() { | |
if (this.info || this.dependencies) { | |
return this.dependencies; | |
} | |
this.dependencies = []; | |
var bs = this.bs.fork(); | |
while (!bs.isEmpty()) { | |
var chunk; | |
var id = bs.readStr4(); | |
var length = bs.getInt32(); | |
bs.jump(-8); | |
var chunkBs = bs.fork(length + 8); | |
bs.jump(8 + length + (length & 1 ? 1 : 0)); | |
if (id === "INCL") { | |
chunk = new INCLChunk(chunkBs); | |
this.dependencies.push(chunk.ref); | |
} | |
} | |
return this.dependencies; | |
} | |
init() { | |
if (this.info) { | |
return this; | |
} | |
this.dependencies = []; | |
var id = this.bs.readStr4(); | |
if (id !== 'INFO') { | |
throw new CorruptedFileDjVuError("The very first chunk must be INFO chunk, but we got " + id + '!') | |
} | |
var length = this.bs.getInt32(); | |
this.bs.jump(-8); | |
this.info = new INFOChunk(this.bs.fork(length + 8)); | |
this.bs.jump(8 + length + (this.info.length & 1)); | |
this.iffchunks.push(this.info); | |
while (!this.bs.isEmpty()) { | |
var chunk; | |
var id = this.bs.readStr4(); | |
var length = this.bs.getInt32(); | |
this.bs.jump(-8); | |
var chunkBs = this.bs.fork(length + 8); | |
this.bs.jump(8 + length + (length & 1)); | |
if (!length) { | |
chunk = new IFFChunk(chunkBs); | |
} else if (id == "FG44") { | |
chunk = this.fg44 = new ColorChunk(chunkBs); | |
} else if (id == "BG44") { | |
this.bg44arr.push(chunk = new ColorChunk(chunkBs)); | |
} else if (id == 'Sjbz') { | |
chunk = this.sjbz = new JB2Image(chunkBs); | |
} else if (id === "INCL") { | |
chunk = this.incl = new INCLChunk(chunkBs); | |
var inclChunk = this.getINCLChunkCallback(this.incl.ref); | |
if (inclChunk) { | |
inclChunk.id === "Djbz" ? this.djbz = inclChunk : this.iffchunks.push(inclChunk); | |
} | |
this.dependencies.push(chunk.ref); | |
} else if (id === "CIDa") { | |
try { | |
chunk = new CIDaChunk(chunkBs); | |
} catch (e) { | |
chunk = new ErrorChunk('CIDa', e); | |
} | |
} else if (id === 'Djbz') { | |
chunk = this.djbz = new JB2Dict(chunkBs); | |
} else if (id === 'FGbz') { | |
chunk = this.fgbz = new DjVuPalette(chunkBs); | |
} else if (id === 'TXTa' || id === 'TXTz') { | |
chunk = this.text = new DjVuText(chunkBs); | |
} else { | |
chunk = new IFFChunk(chunkBs); | |
} | |
this.iffchunks.push(chunk); | |
} | |
return this; | |
} | |
getRotation() { | |
switch (this.info.flags) { | |
case 5: return 90; | |
case 2: return 180; | |
case 6: return 270; | |
default: return 0; | |
} | |
} | |
rotateIfRequired(imageData) { | |
if (this.info.flags === 5 || this.info.flags === 6) { | |
var newImageData = new ImageData(this.info.height, this.info.width); | |
var newPixelArray = new Uint32Array(newImageData.data.buffer); | |
var oldPixelArray = new Uint32Array(imageData.data.buffer); | |
var height = this.info.height; | |
var width = this.info.width; | |
if (this.info.flags === 6) { | |
for (var i = 0; i < width; i++) { | |
var rowOffset = (width - i - 1) * height; | |
var to = height + rowOffset; | |
for (var newIndex = rowOffset, oldIndex = i; newIndex < to; newIndex++, oldIndex += width) { | |
newPixelArray[newIndex] = oldPixelArray[oldIndex]; | |
} | |
} | |
} else { | |
for (var i = 0; i < width; i++) { | |
var rowOffset = i * height; | |
var from = height + rowOffset - 1; | |
for (var newIndex = from, oldIndex = i; newIndex >= rowOffset; newIndex--, oldIndex += width) { | |
newPixelArray[newIndex] = oldPixelArray[oldIndex]; | |
} | |
} | |
} | |
return newImageData; | |
} | |
if (this.info.flags === 2) { | |
new Uint32Array(imageData.data.buffer).reverse(); | |
return imageData; | |
} | |
return imageData; | |
} | |
getImageData(rotate = true) { | |
const image = this._getImageData(); | |
const rotatedImage = rotate ? this.rotateIfRequired(image) : image; | |
if (image.width * image.height > 10000000) { | |
this.reset(); | |
} | |
return rotatedImage; | |
} | |
_getImageData() { | |
this.decode(); | |
var time = performance.now(); | |
if (!this.sjbz) { | |
if (this.bgimage) { | |
return this.bgimage.getImage(); | |
} | |
else if (this.fgimage) { | |
return this.fgimage.getImage(); | |
} else { | |
var emptyImage = new ImageData(this.info.width, this.info.height); | |
emptyImage.data.fill(255); | |
return emptyImage; | |
} | |
} | |
if (!this.bgimage && !this.fgimage) { | |
return this.sjbz.getImage(this.fgbz); | |
} | |
var fgscale, bgscale, fgpixelmap, bgpixelmap; | |
function fakePixelMap(r, g, b) { | |
return { | |
writePixel(index, pixelArray, pixelIndex) { | |
pixelArray[pixelIndex] = r; | |
pixelArray[pixelIndex | 1] = g; | |
pixelArray[pixelIndex | 2] = b; | |
} | |
} | |
} | |
if (this.bgimage) { | |
bgscale = Math.round(this.info.width / this.bgimage.info.width); | |
bgpixelmap = this.bgimage.pixelmap; | |
} else { | |
bgscale = 1; | |
bgpixelmap = fakePixelMap(255, 255, 255); | |
} | |
if (this.fgimage) { | |
fgscale = Math.round(this.info.width / this.fgimage.info.width); | |
fgpixelmap = this.fgimage.pixelmap; | |
} else { | |
fgscale = 1; | |
fgpixelmap = fakePixelMap(0, 0, 0); | |
} | |
var image; | |
if (!this.fgbz) { | |
image = this.createImageFromMaskImageAndPixelMaps( | |
this.sjbz.getMaskImage(), | |
fgpixelmap, | |
bgpixelmap, | |
fgscale, | |
bgscale | |
); | |
} else { | |
image = this.createImageFromMaskImageAndBackgroundPixelMap( | |
this.sjbz.getImage(this.fgbz, true), | |
bgpixelmap, | |
bgscale | |
); | |
} | |
DjVu.IS_DEBUG && console.log("DataImage creating time = ", performance.now() - time); | |
return image; | |
} | |
createImageFromMaskImageAndPixelMaps(maskImage, fgpixelmap, bgpixelmap, fgscale, bgscale) { | |
var image = maskImage; | |
var pixelArray = image.data; | |
var rowIndexOffset = ((this.info.height - 1) * this.info.width) << 2; | |
var width4 = this.info.width << 2; | |
for (var i = 0; i < this.info.height; i++) { | |
var bis = i / bgscale >> 0; | |
var fis = i / fgscale >> 0; | |
var bgIndexOffset = bgpixelmap.width * bis; | |
var fgIndexOffset = fgpixelmap.width * fis; | |
var index = rowIndexOffset; | |
for (var j = 0; j < this.info.width; j++) { | |
if (pixelArray[index]) { | |
bgpixelmap.writePixel(bgIndexOffset + (j / bgscale >> 0), pixelArray, index); | |
} else { | |
fgpixelmap.writePixel(fgIndexOffset + (j / fgscale >> 0), pixelArray, index); | |
} | |
index += 4; | |
} | |
rowIndexOffset -= width4; | |
} | |
return image; | |
} | |
createImageFromMaskImageAndBackgroundPixelMap(coloredMaskImage, bgpixelmap, bgscale) { | |
var pixelArray = coloredMaskImage.data; | |
var rowOffset = (this.info.height - 1) * this.info.width << 2; | |
var width4 = this.info.width << 2; | |
for (var i = 0; i < this.info.height; i++) { | |
var bgRowOffset = (i / bgscale >> 0) * bgpixelmap.width; | |
var index = rowOffset; | |
for (var j = 0; j < this.info.width; j++) { | |
if (pixelArray[index | 3]) { | |
bgpixelmap.writePixel(bgRowOffset + (j / bgscale >> 0), pixelArray, index); | |
} else { | |
pixelArray[index | 3] = 255; | |
} | |
index += 4; | |
} | |
rowOffset -= width4; | |
} | |
return coloredMaskImage; | |
} | |
decodeForeground() { | |
if (this.fg44) { | |
this.fgimage = new IWImage(); | |
var zp = new ZPDecoder(this.fg44.bs); | |
this.fgimage.decodeChunk(zp, this.fg44.header); | |
var pixelMapTime = performance.now(); | |
this.fgimage.createPixelmap(); | |
DjVu.IS_DEBUG && console.log("Foreground pixelmap creating time = ", performance.now() - pixelMapTime); | |
} | |
} | |
decodeBackground(isOnlyFirstChunk = false) { | |
if (this.isBackgroundCompletelyDecoded || this.isFirstBgChunkDecoded && isOnlyFirstChunk) { | |
return; | |
} | |
if (this.bg44arr.length) { | |
this.bgimage = this.bgimage || new IWImage(); | |
var to = isOnlyFirstChunk ? 1 : this.bg44arr.length; | |
var from = this.isFirstBgChunkDecoded ? 1 : 0; | |
for (var i = from; i < to; i++) { | |
var chunk = this.bg44arr[i]; | |
var zp = new ZPDecoder(chunk.bs); | |
var time = performance.now(); | |
this.bgimage.decodeChunk(zp, chunk.header); | |
DjVu.IS_DEBUG && console.log("Background chunk decoding time = ", performance.now() - time); | |
} | |
var pixelMapTime = performance.now(); | |
this.bgimage.createPixelmap(); | |
DjVu.IS_DEBUG && console.log("Background pixelmap creating time = ", performance.now() - pixelMapTime); | |
if (isOnlyFirstChunk) { | |
this.isFirstBgChunkDecoded = true; | |
} else { | |
this.isBackgroundCompletelyDecoded = true; | |
} | |
} | |
} | |
decode() { | |
if (this.decoded) { | |
this.decodeBackground(); | |
return this; | |
} | |
this.init(); | |
var time = performance.now(); | |
this.sjbz ? this.sjbz.decode(this.djbz) : 0; | |
DjVu.IS_DEBUG && console.log("Mask decoding time = ", performance.now() - time); | |
time = performance.now(); | |
this.decodeForeground(); | |
DjVu.IS_DEBUG && console.log("Foreground decoding time = ", performance.now() - time); | |
time = performance.now(); | |
this.decodeBackground(); | |
DjVu.IS_DEBUG && console.log("Background decoding time = ", performance.now() - time); | |
this.decoded = true; | |
return this; | |
} | |
getBackgroundImageData() { | |
this.decode(); | |
if (this.bg44arr.length) { | |
this.bg44arr.forEach((chunk) => { | |
var zp = new ZPDecoder(chunk.bs); | |
this.bgimage.decodeChunk(zp, chunk.header); | |
} | |
); | |
return this.bgimage.getImage(); | |
} else { | |
return null; | |
} | |
} | |
getForegroundImageData() { | |
this.decode(); | |
if (this.fg44) { | |
this.fgimage = new IWImage(); | |
var zp = new ZPDecoder(this.fg44.bs); | |
this.fgimage.decodeChunk(zp, this.fg44.header); | |
return this.fgimage.getImage(); | |
} else { | |
return null; | |
} | |
} | |
getMaskImageData() { | |
this.decode(); | |
return this.sjbz && this.sjbz.getImage(this.fgbz); | |
} | |
getText() { | |
this.init(); | |
return this.text ? this.text.getText() : ""; | |
} | |
getPageTextZone() { | |
this.init(); | |
return this.text ? this.text.getPageZone() : null; | |
} | |
getNormalizedTextZones() { | |
this.init(); | |
return this.text ? this.text.getNormalizedZones() : null; | |
} | |
toString() { | |
this.init(); | |
var str = this.iffchunks.reduce((str, chunk) => str + chunk.toString(), ''); | |
return super.toString(str); | |
} | |
} | |
class DIRMChunk extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.dflags = bs.byte(); | |
this.isBundled = this.dflags >> 7; | |
this.nfiles = bs.getInt16(); | |
if (this.isBundled) { | |
this.offsets = new Int32Array(this.nfiles); | |
for (var i = 0; i < this.nfiles; i++) { | |
this.offsets[i] = bs.getInt32(); | |
} | |
} | |
this.sizes = new Uint32Array(this.nfiles); | |
this.flags = new Uint8Array(this.nfiles); | |
this.ids = new Array(this.nfiles); | |
this.names = new Array(this.nfiles); | |
this.titles = new Array(this.nfiles); | |
var bsz = BZZDecoder.decodeByteStream(bs.fork()); | |
for (var i = 0; i < this.nfiles; i++) { | |
this.sizes[i] = bsz.getUint24(); | |
} | |
for (var i = 0; i < this.nfiles; i++) { | |
this.flags[i] = bsz.byte(); | |
} | |
this.pagesIds = []; | |
this.idToNameRegistry = {}; | |
for (var i = 0; i < this.nfiles && !bsz.isEmpty(); i++) { | |
this.ids[i] = bsz.readStrNT(); | |
this.names[i] = this.flags[i] & 128 ? bsz.readStrNT() : this.ids[i]; | |
this.titles[i] = this.flags[i] & 64 ? bsz.readStrNT() : this.ids[i]; | |
if (this.isPageIndex(i)) { | |
this.pagesIds.push(this.ids[i]); | |
} | |
this.idToNameRegistry[this.ids[i]] = this.names[i]; | |
} | |
} | |
isPageIndex(i) { | |
return (this.flags[i] & 63) === 1; | |
} | |
isThumbnailIndex(i) { | |
return (this.flags[i] & 63) === 2; | |
} | |
getPageNameByItsNumber(number) { | |
return this.getComponentNameByItsId(this.pagesIds[number - 1]); | |
} | |
getPageNumberByItsId(id) { | |
const index = this.pagesIds.indexOf(id); | |
return index === -1 ? null : (index + 1); | |
} | |
getComponentNameByItsId(id) { | |
return this.idToNameRegistry[id]; | |
} | |
getPagesQuantity() { | |
return this.pagesIds.length; | |
} | |
getFilesQuantity() { | |
return this.nfiles; | |
} | |
getMetadataStringByIndex(i) { | |
return ( | |
`[id: "${this.ids[i]}", flag: ${this.flags[i]}, ` + | |
`offset: ${this.offsets ? this.offsets[i] : 'indirect'}, size: ${this.sizes[i]}]\n` | |
); | |
} | |
toString() { | |
var str = super.toString(); | |
str += (this.isBundled ? 'Bundled' : 'Indirect') + '\n'; | |
str += "FilesCount: " + this.nfiles + '\n'; | |
return str + '\n'; | |
} | |
} | |
class NAVMChunk extends IFFChunk { | |
constructor(bs) { | |
super(bs); | |
this.isDecoded = false; | |
this.contents = []; | |
this.decodedBookmarkCounter = 0; | |
} | |
getContents() { | |
this.decode(); | |
return this.contents; | |
} | |
decode() { | |
if (this.isDecoded) { | |
return; | |
} | |
var dbs = BZZDecoder.decodeByteStream(this.bs); | |
var bookmarksCount = dbs.getUint16(); | |
while (this.decodedBookmarkCounter < bookmarksCount) { | |
this.contents.push(this.decodeBookmark(dbs)); | |
} | |
this.isDecoded = true; | |
} | |
decodeBookmark(bs) { | |
var childrenCount = bs.getUint8(); | |
var descriptionLength = bs.getInt24(); | |
var description = descriptionLength ? bs.readStrUTF(descriptionLength) : ''; | |
var urlLength = bs.getInt24(); | |
var url = urlLength ? bs.readStrUTF(urlLength) : ''; | |
this.decodedBookmarkCounter++; | |
var bookmark = { description, url }; | |
if (childrenCount) { | |
var children = new Array(childrenCount); | |
for (var i = 0; i < childrenCount; i++) { | |
children[i] = this.decodeBookmark(bs); | |
} | |
bookmark.children = children; | |
} | |
return bookmark; | |
} | |
toString() { | |
this.decode(); | |
var indent = ' '; | |
function stringifyBookmark(bookmark, indentSize = 0) { | |
var str = indent.repeat(indentSize) + `${bookmark.description} (${bookmark.url})\n`; | |
if (bookmark.children) { | |
str = bookmark.children.reduce((str, bookmark) => str + stringifyBookmark(bookmark, indentSize + 1), str); | |
} | |
return str; | |
} | |
var str = this.contents.reduce((str, bookmark) => str + stringifyBookmark(bookmark), super.toString()); | |
return str + '\n'; | |
} | |
} | |
class BZZEncoder { | |
constructor(zp) { | |
this.zp = zp || new ZPEncoder(); | |
this.FREQMAX = 4; | |
this.CTXIDS = 3; | |
this.ctx = new Uint8Array(300); | |
this.size = 0; | |
this.blocksize = 0; | |
this.FREQS0 = 100000; | |
this.FREQS1 = 1000000; | |
} | |
blocksort(arr) { | |
var length = arr.length; | |
var offs = new Array(arr.length); | |
for (var i = 0; i < length; offs[i] = i++) { } | |
offs.sort((a, b) => { | |
for (var i = 0; i < length; i++) { | |
if (a === this.markerpos) { | |
return -1; | |
} | |
else if (b === this.markerpos) { | |
return 1; | |
} | |
var res = arr[a % length] - arr[b % length]; | |
if (res) { | |
return res; | |
} | |
a++; | |
b++; | |
} | |
return 0; | |
}); | |
var narr = new Uint8Array(length); | |
for (var i = 0; i < length; i++) { | |
var pos = offs[i] - 1; | |
if (pos >= 0) { | |
narr[i] = arr[pos]; | |
} | |
else { | |
narr[i] = 0; | |
this.markerpos = i; | |
} | |
} | |
return narr; | |
} | |
encode_raw(bits, x) { | |
var n = 1; | |
var m = (1 << bits); | |
while (n < m) { | |
x = (x & (m - 1)) << 1; | |
var b = (x >> bits); | |
this.zp.encode(b); | |
n = (n << 1) | b; | |
} | |
} | |
encode_binary(cxtoff, bits, x) { | |
var n = 1; | |
var m = (1 << bits); | |
cxtoff--; | |
while (n < m) { | |
x = (x & (m - 1)) << 1; | |
var b = (x >> bits); | |
this.zp.encode(b, this.ctx, cxtoff + n); | |
n = (n << 1) | b; | |
} | |
} | |
encode(buffer) { | |
var data = new Uint8Array(buffer); | |
var size = data.length; | |
var markerpos = size - 1; | |
this.markerpos = markerpos; | |
data = this.blocksort(data); | |
markerpos = this.markerpos; | |
this.encode_raw(24, size); | |
var fshift = 0; | |
if (size < this.FREQS0) { | |
fshift = 0; | |
this.zp.encode(0); | |
} | |
else if (size < this.FREQS1) { | |
fshift = 1; | |
this.zp.encode(1); | |
this.zp.encode(0); | |
} | |
else { | |
fshift = 2; | |
this.zp.encode(1); | |
this.zp.encode(1); | |
} | |
var mtf = new Uint8Array(256); | |
var rmtf = new Uint8Array(256); | |
var freq = new Uint32Array(this.FREQMAX); | |
var m = 0; | |
for (m = 0; m < 256; m++) | |
mtf[m] = m; | |
for (m = 0; m < 256; m++) | |
rmtf[mtf[m]] = m; | |
var fadd = 4; | |
for (m = 0; m < this.FREQMAX; m++) | |
freq[m] = 0; | |
var i; | |
var mtfno = 3; | |
for (i = 0; i < size; i++) { | |
var c = data[i]; | |
var ctxid = this.CTXIDS - 1; | |
if (ctxid > mtfno) | |
ctxid = mtfno; | |
mtfno = rmtf[c]; | |
if (i == markerpos) | |
mtfno = 256; | |
var b; | |
var ctxoff = 0; | |
switch (0) | |
{ | |
default: | |
b = (mtfno == 0); | |
this.zp.encode(b, this.ctx, ctxoff + ctxid); | |
if (b) | |
break; | |
ctxoff += this.CTXIDS; | |
b = (mtfno == 1); | |
this.zp.encode(b, this.ctx, ctxoff + ctxid); | |
if (b) | |
break; | |
ctxoff += this.CTXIDS; | |
b = (mtfno < 4); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 1, mtfno - 2); | |
break; | |
} | |
ctxoff += 1 + 1; | |
b = (mtfno < 8); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 2, mtfno - 4); | |
break; | |
} | |
ctxoff += 1 + 3; | |
b = (mtfno < 16); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 3, mtfno - 8); | |
break; | |
} | |
ctxoff += 1 + 7; | |
b = (mtfno < 32); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 4, mtfno - 16); | |
break; | |
} | |
ctxoff += 1 + 15; | |
b = (mtfno < 64); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 5, mtfno - 32); | |
break; | |
} | |
ctxoff += 1 + 31; | |
b = (mtfno < 128); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 6, mtfno - 64); | |
break; | |
} | |
ctxoff += 1 + 63; | |
b = (mtfno < 256); | |
this.zp.encode(b, this.ctx, ctxoff); | |
if (b) { | |
this.encode_binary(ctxoff + 1, 7, mtfno - 128); | |
break; | |
} | |
continue; | |
} | |
fadd = fadd + (fadd >> fshift); | |
if (fadd > 0x10000000) { | |
fadd = fadd >> 24; | |
freq[0] >>= 24; | |
freq[1] >>= 24; | |
freq[2] >>= 24; | |
freq[3] >>= 24; | |
for (var k = 4; k < this.FREQMAX; k++) | |
freq[k] = freq[k] >> 24; | |
} | |
var fc = fadd; | |
if (mtfno < this.FREQMAX) | |
fc += freq[mtfno]; | |
var k; | |
for (k = mtfno; k >= this.FREQMAX; k--) { | |
mtf[k] = mtf[k - 1]; | |
rmtf[mtf[k]] = k; | |
} | |
for (; k > 0 && fc >= freq[k - 1]; k--) { | |
mtf[k] = mtf[k - 1]; | |
freq[k] = freq[k - 1]; | |
rmtf[mtf[k]] = k; | |
} | |
mtf[k] = c; | |
freq[k] = fc; | |
rmtf[mtf[k]] = k; | |
} | |
this.encode_raw(24, 0); | |
this.zp.eflush(); | |
return 0; | |
} | |
} | |
class DjVuWriter { | |
constructor(length) { | |
this.bsw = new ByteStreamWriter(length || 1024 * 1024); | |
} | |
startDJVM() { | |
this.bsw.writeStr('AT&T').writeStr('FORM').saveOffsetMark('fileSize') | |
.jump(4).writeStr('DJVM'); | |
} | |
writeDirmChunk(dirm) { | |
this.dirm = dirm; | |
this.bsw.writeStr('DIRM').saveOffsetMark('DIRMsize').jump(4); | |
this.dirm.offsets = []; | |
this.bsw.writeByte(dirm.dflags) | |
.writeInt16(dirm.flags.length) | |
.saveOffsetMark('DIRMoffsets') | |
.jump(4 * dirm.flags.length); | |
var tmpBS = new ByteStreamWriter(); | |
for (var i = 0; i < dirm.sizes.length; i++) { | |
tmpBS.writeInt24(dirm.sizes[i]); | |
} | |
for (var i = 0; i < dirm.flags.length; i++) { | |
tmpBS.writeByte(dirm.flags[i]); | |
} | |
for (var i = 0; i < dirm.ids.length; i++) { | |
tmpBS.writeStrNT(dirm.ids[i]); | |
if (dirm.flags[i] & 128) { | |
tmpBS.writeStrNT(dirm.names[i]); | |
} | |
if (dirm.flags[i] & 64) { | |
tmpBS.writeStrNT(dirm.titles[i]); | |
} | |
} | |
tmpBS.writeByte(0); | |
var tmpBuffer = tmpBS.getBuffer(); | |
var bzzBS = new ByteStreamWriter(); | |
var zp = new ZPEncoder(bzzBS); | |
var bzz = new BZZEncoder(zp); | |
bzz.encode(tmpBuffer); | |
var encodedBuffer = bzzBS.getBuffer(); | |
this.bsw.writeBuffer(encodedBuffer); | |
this.bsw.rewriteSize('DIRMsize'); | |
} | |
get offset() { | |
return this.bsw.offset; | |
} | |
writeByte(byte) { | |
this.bsw.writeByte(byte); | |
return this; | |
} | |
writeStr(str) { | |
this.bsw.writeStr(str); | |
return this; | |
} | |
writeInt32(val) { | |
this.bsw.writeInt32(val); | |
return this; | |
} | |
writeFormChunkBS(bs) { | |
if (this.bsw.offset & 1) { | |
this.bsw.writeByte(0); | |
} | |
var off = this.bsw.offset; | |
this.dirm.offsets.push(off); | |
this.bsw.writeByteStream(bs); | |
} | |
writeFormChunkBuffer(buffer) { | |
if (this.bsw.offset & 1) { | |
this.bsw.writeByte(0); | |
} | |
var off = this.bsw.offset; | |
this.dirm.offsets.push(off); | |
this.bsw.writeBuffer(buffer); | |
} | |
writeChunk(chunk) { | |
if (this.bsw.offset & 1) { | |
this.bsw.writeByte(0); | |
} | |
this.bsw.writeByteStream(chunk.bs); | |
} | |
getBuffer() { | |
this.bsw.rewriteSize('fileSize'); | |
if (this.dirm.offsets.length !== (this.dirm.flags.length)) { | |
throw new Error("Записаны не все страницы и словари !!!"); | |
} | |
for (var i = 0; i < this.dirm.offsets.length; i++) { | |
this.bsw.rewriteInt32('DIRMoffsets', this.dirm.offsets[i]); | |
} | |
return this.bsw.getBuffer(); | |
} | |
} | |
class ThumChunk extends CompositeChunk { } | |
async function loadByteStream(url, errorData = {}) { | |
let xhr; | |
try { | |
xhr = await loadFileViaXHR(url); | |
} catch (e) { | |
throw new NetworkDjVuError({ url: url, ...errorData }); | |
} | |
if (xhr.status && xhr.status !== 200) { | |
throw new UnsuccessfulRequestDjVuError(xhr, { ...errorData }); | |
} | |
return new ByteStream(xhr.response); | |
} | |
function checkAndCropByteStream(bs, compositeChunkId = null, errorData = null) { | |
if (bs.readStr4() !== 'AT&T') { | |
throw new CorruptedFileDjVuError(`The byte stream isn't a djvu file.`, errorData); | |
} | |
if (!compositeChunkId) { | |
return bs.fork(); | |
} | |
let chunkId = bs.readStr4(); | |
const length = bs.getInt32(); | |
chunkId += bs.readStr4(); | |
if (chunkId !== compositeChunkId) { | |
throw new CorruptedFileDjVuError( | |
`Unexpected chunk id. Expected "${compositeChunkId}", but got "${chunkId}"`, | |
errorData | |
); | |
} | |
return bs.jump(-12).fork(length + 8); | |
} | |
async function loadPage(number, url) { | |
const errorData = { pageNumber: number }; | |
return checkAndCropByteStream(await loadByteStream(url, errorData), null, errorData); | |
} | |
async function loadPageDependency(id, name, baseUrl, pageNumber = null) { | |
const errorData = { pageNumber: pageNumber, dependencyId: id }; | |
return checkAndCropByteStream(await loadByteStream(baseUrl + name, errorData), 'FORMDJVI', errorData); | |
} | |
async function loadThumbnail(url, id = null) { | |
const errorData = { thumbnailId: id }; | |
return checkAndCropByteStream(await loadByteStream(url, errorData), 'FORMTHUM', errorData); | |
} | |
async function bundle(progressCallback = () => { }) { | |
const djvuWriter = new DjVuWriter(); | |
djvuWriter.startDJVM(); | |
const dirm = { | |
dflags: this.dirm.dflags | 128, | |
flags: [], | |
names: [], | |
titles: [], | |
sizes: [], | |
ids: [], | |
}; | |
const chunkByteStreams = []; | |
const filesQuantity = this.dirm.getFilesQuantity(); | |
const totalOperations = filesQuantity + 3; | |
let pageNumber = 0; | |
const limit = pLimit(4); | |
let downloadedNumber = 0; | |
const promises = []; | |
for (let i = 0; i < filesQuantity; i++) { | |
promises.push(limit(async () => { | |
let bs; | |
if (this.dirm.isPageIndex(i)) { | |
pageNumber++; | |
bs = await loadPage(pageNumber, this._getUrlByPageNumber(pageNumber)); | |
} else if (this.dirm.isThumbnailIndex(i)) { | |
bs = await loadThumbnail( | |
this.baseUrl + this.dirm.getComponentNameByItsId(this.dirm.ids[i]), | |
this.dirm.ids[i] | |
); | |
} else { | |
bs = await loadPageDependency( | |
this.dirm.ids[i], | |
this.dirm.getComponentNameByItsId(this.dirm.ids[i]), | |
this.baseUrl, | |
); | |
} | |
downloadedNumber++; | |
progressCallback(downloadedNumber / totalOperations); | |
return { | |
flags: this.dirm.flags[i], | |
id: this.dirm.ids[i], | |
name: this.dirm.names[i], | |
title: this.dirm.titles[i], | |
bs: bs, | |
}; | |
})); | |
} | |
for (const data of await Promise.all(promises)) { | |
dirm.flags.push(data.flags); | |
dirm.ids.push(data.id); | |
dirm.names.push(data.names); | |
dirm.titles.push(data.title); | |
dirm.sizes.push(data.bs.length); | |
chunkByteStreams.push(data.bs); | |
} | |
djvuWriter.writeDirmChunk(dirm); | |
if (this.navm) { | |
djvuWriter.writeChunk(this.navm); | |
} | |
progressCallback((totalOperations - 2) / totalOperations); | |
for (let i = 0; i < chunkByteStreams.length; i++) { | |
djvuWriter.writeFormChunkBS(chunkByteStreams[i]); | |
chunkByteStreams[i] = null; | |
} | |
progressCallback((totalOperations - 1) / totalOperations); | |
const newBuffer = djvuWriter.getBuffer(); | |
progressCallback(1); | |
return new this.constructor(newBuffer); | |
} | |
const MEMORY_LIMIT = 50 * 1024 * 1024; | |
class DjVuDocument { | |
constructor(arraybuffer, { baseUrl = null, memoryLimit = MEMORY_LIMIT } = {}) { | |
this.buffer = arraybuffer; | |
this.baseUrl = baseUrl && baseUrl.trim(); | |
if (typeof this.baseUrl === 'string') { | |
if (this.baseUrl[this.baseUrl.length - 1] !== '/') { | |
this.baseUrl += '/'; | |
} | |
if (!/^[A-Za-z]+:\/\//.test(this.baseUrl)) { | |
this.baseUrl = location.origin && (new URL(this.baseUrl, location.origin).href); | |
} | |
} | |
this.memoryLimit = memoryLimit; | |
this.djvi = {}; | |
this.getINCLChunkCallback = id => this.djvi[id].innerChunk; | |
this.bs = new ByteStream(arraybuffer); | |
this.formatID = this.bs.readStr4(); | |
if (this.formatID !== 'AT&T') { | |
throw new IncorrectFileFormatDjVuError(); | |
} | |
this.id = this.bs.readStr4(); | |
this.length = this.bs.getInt32(); | |
this.id += this.bs.readStr4(); | |
if (this.id === 'FORMDJVM') { | |
this._initMultiPageDocument(); | |
} else if (this.id === 'FORMDJVU') { | |
this.bs.jump(-12); | |
this.pages = [new DjVuPage(this.bs.fork(this.length + 8), this.getINCLChunkCallback)]; | |
} else { | |
throw new CorruptedFileDjVuError( | |
`The id of the first chunk of the document should be either FORMDJVM or FORMDJVU, but there is ${this.id}` | |
); | |
} | |
} | |
_initMultiPageDocument() { | |
this._readMetaDataChunk(); | |
this._readContentsChunkIfExists(); | |
this.pages = []; | |
this.thumbs = []; | |
if (this.dirm.isBundled) { | |
this._parseComponents(); | |
} else { | |
this.pages = new Array(this.dirm.getPagesQuantity()); | |
this.memoryUsage = this.bs.buffer.byteLength; | |
this.loadedPageNumbers = []; | |
} | |
} | |
_readMetaDataChunk() { | |
var id = this.bs.readStr4(); | |
if (id !== 'DIRM') { | |
throw new CorruptedFileDjVuError("The DIRM chunk must be the first but there is " + id + " instead!"); | |
} | |
var length = this.bs.getInt32(); | |
this.bs.jump(-8); | |
this.dirm = new DIRMChunk(this.bs.fork(length + 8)); | |
this.bs.jump(8 + length + (length & 1 ? 1 : 0)); | |
} | |
_readContentsChunkIfExists() { | |
this.navm = null; | |
if (this.bs.remainingLength() > 8) { | |
var id = this.bs.readStr4(); | |
var length = this.bs.getInt32(); | |
this.bs.jump(-8); | |
if (id === 'NAVM') { | |
this.navm = new NAVMChunk(this.bs.fork(length + 8)); | |
} | |
} | |
} | |
_parseComponents() { | |
this.dirmOrderedChunks = new Array(this.dirm.getFilesQuantity()); | |
for (var i = 0; i < this.dirm.offsets.length; i++) { | |
this.bs.setOffset(this.dirm.offsets[i]); | |
var id = this.bs.readStr4(); | |
var length = this.bs.getInt32(); | |
id += this.bs.readStr4(); | |
this.bs.jump(-12); | |
switch (id) { | |
case "FORMDJVU": | |
this.pages.push(this.dirmOrderedChunks[i] = new DjVuPage( | |
this.bs.fork(length + 8), | |
this.getINCLChunkCallback | |
)); | |
break; | |
case "FORMDJVI": | |
this.dirmOrderedChunks[i] = this.djvi[this.dirm.ids[i]] = new DjViChunk(this.bs.fork(length + 8)); | |
break; | |
case "FORMTHUM": | |
this.thumbs.push(this.dirmOrderedChunks[i] = new ThumChunk(this.bs.fork(length + 8))); | |
break; | |
default: | |
console.error("Incorrect chunk ID: ", id); | |
} | |
} | |
} | |
getPagesSizes() { | |
var sizes = this.pages.map(page => { | |
return { | |
width: page.getWidth(), | |
height: page.getHeight(), | |
dpi: page.getDpi(), | |
}; | |
}); | |
this.pages.forEach(page => page.reset()); | |
return sizes; | |
} | |
isBundled() { | |
return this.dirm ? this.dirm.isBundled : true; | |
} | |
getPagesQuantity() { | |
return this.dirm ? this.dirm.getPagesQuantity() : 1; | |
} | |
getContents() { | |
return this.navm ? this.navm.getContents() : null; | |
} | |
getMemoryUsage() { | |
return this.memoryUsage; | |
} | |
getMemoryLimit() { | |
return this.memoryLimit; | |
} | |
setMemoryLimit(limit = MEMORY_LIMIT) { | |
this.memoryLimit = limit; | |
} | |
getPageNumberByUrl(url) { | |
if (url[0] !== '#') { | |
return null; | |
} | |
const ref = url.slice(1); | |
let pageNumber = this.dirm.getPageNumberByItsId(ref); | |
if (!pageNumber) { | |
const num = Math.round(Number(ref)); | |
if (num >= 1 && num <= this.pages.length) { | |
pageNumber = num; | |
} | |
} | |
return pageNumber || null; | |
} | |
releaseMemoryIfRequired(preservedDependencies = null) { | |
if (this.memoryUsage <= this.memoryLimit) { | |
return; | |
} | |
while (this.memoryUsage > this.memoryLimit && this.loadedPageNumbers.length) { | |
var number = this.loadedPageNumbers.shift(); | |
this.memoryUsage -= this.pages[number].bs.buffer.byteLength; | |
this.pages[number] = null; | |
} | |
if (this.memoryUsage > this.memoryLimit && !this.loadedPageNumbers.length) { | |
this.resetLastRequestedPage(); | |
var newDjVi = {}; | |
if (preservedDependencies) { | |
preservedDependencies.forEach(id => { | |
newDjVi[id] = this.djvi[id]; | |
this.memoryUsage += newDjVi[id].bs.buffer.byteLength; | |
}); | |
} | |
Object.keys(this.djvi).forEach(key => { | |
this.memoryUsage -= this.djvi[key].bs.buffer.byteLength; | |
}); | |
this.djvi = newDjVi; | |
} | |
} | |
_getUrlByPageNumber(number) { | |
return this.baseUrl + this.dirm.getPageNameByItsNumber(number); | |
} | |
async getPage(number) { | |
var page = this.pages[number - 1]; | |
if (this.lastRequestedPage && this.lastRequestedPage !== page) { | |
this.lastRequestedPage.reset(); | |
} | |
this.lastRequestedPage = page; | |
if (!page) { | |
if (number < 1 || number > this.pages.length || this.isBundled()) { | |
throw new NoSuchPageDjVuError(number); | |
} else { | |
if (this.baseUrl === null) { | |
throw new NoBaseUrlDjVuError(); | |
} | |
const bs = await loadPage( | |
number, | |
this._getUrlByPageNumber(number) | |
); | |
const page = new DjVuPage(bs, this.getINCLChunkCallback); | |
this.memoryUsage += bs.buffer.byteLength; | |
await this._loadDependencies(page.getDependencies(), number); | |
this.releaseMemoryIfRequired(page.getDependencies()); | |
this.pages[number - 1] = page; | |
this.loadedPageNumbers.push(number - 1); | |
this.lastRequestedPage = page; | |
} | |
} else if (!this.isOnePageDependenciesLoaded && this.id === "FORMDJVU") { | |
var dependencies = page.getDependencies(); | |
if (dependencies.length) { | |
await this._loadDependencies(dependencies, 1); | |
} | |
this.isOnePageDependenciesLoaded = true; | |
} | |
return this.lastRequestedPage; | |
} | |
async _loadDependencies(dependencies, pageNumber = null) { | |
var unloadedDependencies = dependencies.filter(id => !this.djvi[id]); | |
if (!unloadedDependencies.length) { | |
return; | |
} | |
await Promise.all(unloadedDependencies.map(async id => { | |
const bs = await loadPageDependency( | |
id, | |
this.dirm ? this.dirm.getComponentNameByItsId(id) : id, | |
this.baseUrl, | |
pageNumber | |
); | |
this.djvi[id] = new DjViChunk(bs); | |
this.memoryUsage += bs.buffer.byteLength; | |
})); | |
} | |
getPageUnsafe(number) { | |
return this.pages[number - 1]; | |
} | |
resetLastRequestedPage() { | |
this.lastRequestedPage && this.lastRequestedPage.reset(); | |
this.lastRequestedPage = null; | |
} | |
countFiles() { | |
var count = 0; | |
var bs = this.bs.clone(); | |
bs.jump(16); | |
while (!bs.isEmpty()) { | |
var id = bs.readStr4(); | |
var length = bs.getInt32(); | |
bs.jump(length + (length & 1 ? 1 : 0)); | |
if (id === 'FORM') { | |
count++; | |
} | |
} | |
return count; | |
} | |
toString(html) { | |
var str = this.formatID + '\n'; | |
if (this.dirm) { | |
str += this.id + " " + this.length + '\n\n'; | |
str += this.dirm.toString(); | |
str += this.navm ? this.navm.toString() : ''; | |
if (this.isBundled()) { | |
this.dirmOrderedChunks.forEach((chunk, i) => { | |
str += this.dirm.getMetadataStringByIndex(i) + chunk.toString(); | |
}); | |
} else { | |
for (let i = 0; i < this.dirm.getFilesQuantity(); i++) { | |
str += this.dirm.getMetadataStringByIndex(i); | |
} | |
} | |
} else { | |
str += this.pages[0].toString(); | |
} | |
return html ? str.replace(/\n/g, '<br>').replace(/\s/g, ' ') : str; | |
} | |
createObjectURL() { | |
var blob = new Blob([this.bs.buffer]); | |
var url = URL.createObjectURL(blob); | |
return url; | |
} | |
slice(from = 1, to = this.pages.length) { | |
const djvuWriter = new DjVuWriter(); | |
djvuWriter.startDJVM(); | |
const dirm = { | |
dflags: this.dirm.dflags, | |
flags: [], | |
names: [], | |
titles: [], | |
sizes: [], | |
ids: [], | |
}; | |
const chunkByteStreams = []; | |
const totalPageCount = to - from + 1; | |
const dependencies = {}; | |
const filesQuantity = this.dirm.getFilesQuantity(); | |
for ( | |
let i = 0, pageIndex = 0, addedPageCount = 0; | |
i < filesQuantity && addedPageCount < totalPageCount; | |
i++ | |
) { | |
const isPage = (this.dirm.flags[i] & 63) === 1; | |
if (!isPage) continue; | |
pageIndex++; | |
if (pageIndex < from) continue; | |
addedPageCount++; | |
const pageByteStream = new ByteStream(this.buffer, this.dirm.offsets[i], this.dirm.sizes[i]); | |
const deps = new DjVuPage(pageByteStream).getDependencies(); | |
for (const dependencyId of deps) { | |
dependencies[dependencyId] = 1; | |
} | |
} | |
for ( | |
let i = 0, pageIndex = 0, addedPageCount = 0; | |
i < filesQuantity && addedPageCount < totalPageCount; | |
i++ | |
) { | |
const isPage = (this.dirm.flags[i] & 63) === 1; | |
if (isPage) { | |
pageIndex++; | |
if (pageIndex < from) continue; | |
addedPageCount++; | |
} | |
if ((this.dirm.ids[i] in dependencies) || isPage) { | |
dirm.flags.push(this.dirm.flags[i]); | |
dirm.sizes.push(this.dirm.sizes[i]); | |
dirm.ids.push(this.dirm.ids[i]); | |
dirm.names.push(this.dirm.names[i]); | |
dirm.titles.push(this.dirm.titles[i]); | |
chunkByteStreams.push( | |
new ByteStream(this.buffer, this.dirm.offsets[i], this.dirm.sizes[i]) | |
); | |
} | |
} | |
djvuWriter.writeDirmChunk(dirm); | |
if (this.navm) { | |
djvuWriter.writeChunk(this.navm); | |
} | |
for (const chunkByteStream of chunkByteStreams) { | |
djvuWriter.writeFormChunkBS(chunkByteStream); | |
} | |
const newBuffer = djvuWriter.getBuffer(); | |
DjVu.IS_DEBUG && console.log("New Buffer size = ", newBuffer.byteLength); | |
return new DjVuDocument(newBuffer); | |
} | |
static concat(doc1, doc2) { | |
var dirm = {}; | |
var length = doc1.pages.length + doc2.pages.length; | |
dirm.dflags = 129; | |
dirm.flags = []; | |
dirm.sizes = []; | |
dirm.ids = []; | |
var pages = []; | |
var idset = new Set(); | |
if (!doc1.dirm) { | |
dirm.flags.push(1); | |
dirm.sizes.push(doc1.pages[0].bs.length); | |
dirm.ids.push('single'); | |
idset.add('single'); | |
pages.push(doc1.pages[0]); | |
} | |
else { | |
for (var i = 0; i < doc1.pages.length; i++) { | |
dirm.flags.push(doc1.dirm.flags[i]); | |
dirm.sizes.push(doc1.dirm.sizes[i]); | |
dirm.ids.push(doc1.dirm.ids[i]); | |
idset.add(doc1.dirm.ids[i]); | |
pages.push(doc1.pages[i]); | |
} | |
} | |
if (!doc2.dirm) { | |
dirm.flags.push(1); | |
dirm.sizes.push(doc2.pages[0].bs.length); | |
var newid = 'single2'; | |
var tmp = 0; | |
while (idset.has(newid)) { | |
newid = 'single2' + tmp.toString(); | |
tmp++; | |
} | |
dirm.ids.push(newid); | |
pages.push(doc2.pages[0]); | |
} | |
else { | |
for (var i = 0; i < doc2.pages.length; i++) { | |
dirm.flags.push(doc2.dirm.flags[i]); | |
dirm.sizes.push(doc2.dirm.sizes[i]); | |
var newid = doc2.dirm.ids[i]; | |
var tmp = 0; | |
while (idset.has(newid)) { | |
newid = doc2.dirm.ids[i] + tmp.toString(); | |
tmp++; | |
} | |
dirm.ids.push(newid); | |
idset.add(newid); | |
pages.push(doc2.pages[i]); | |
} | |
} | |
var dw = new DjVuWriter(); | |
dw.startDJVM(); | |
dw.writeDirmChunk(dirm); | |
for (var i = 0; i < length; i++) { | |
dw.writeFormChunkBS(pages[i].bs); | |
} | |
return new DjVuDocument(dw.getBuffer()); | |
} | |
} | |
Object.assign(DjVuDocument.prototype, { | |
bundle, | |
}); | |
function getLinkToTheWholeLibrary() { | |
if (!getLinkToTheWholeLibrary.url) { | |
getLinkToTheWholeLibrary.url = URL.createObjectURL(new Blob( | |
["(" + DjVuScript.toString() + ")();"], | |
{ type: 'application/javascript' } | |
)); | |
} | |
return getLinkToTheWholeLibrary.url; | |
} | |
class DjVuWorker { | |
constructor(path = getLinkToTheWholeLibrary()) { | |
this.path = path; | |
this.reset(); | |
} | |
reset() { | |
this.terminate(); | |
this.worker = new Worker(this.path); | |
this.worker.onmessage = (e) => this.messageHandler(e); | |
this.worker.onerror = (e) => this.errorHandler(e); | |
this.promiseCallbacks = null; | |
this.currentPromise = null; | |
this.promiseMap = new Map(); | |
this.isWorking = false; | |
this.commandCounter = 0; | |
this.currentCommandId = null; | |
this.hyperCallbacks = {}; | |
this.hyperCallbackCounter = 0; | |
} | |
registerHyperCallback(func) { | |
const id = this.hyperCallbackCounter++; | |
this.hyperCallbacks[id] = func; | |
return { hyperCallback: true, id: id }; | |
} | |
unregisterHyperCallback(id) { | |
delete this.hyperCallbacks[id]; | |
} | |
terminate() { | |
this.worker && this.worker.terminate(); | |
} | |
get doc() { | |
return DjVuWorkerTask.instance(this); | |
} | |
errorHandler(event) { | |
console.error("DjVu.js Worker error!", event); | |
} | |
cancelTask(promise) { | |
if (!this.promiseMap.delete(promise)) { | |
if (this.currentPromise === promise) { | |
this.dropCurrentTask(); | |
} | |
} | |
} | |
dropCurrentTask() { | |
this.currentPromise = null; | |
this.promiseCallbacks = null; | |
this.currentCommandId = null; | |
} | |
emptyTaskQueue() { | |
this.promiseMap.clear(); | |
} | |
cancelAllTasks() { | |
this.emptyTaskQueue(); | |
this.dropCurrentTask(); | |
} | |
createNewPromise(commandObj, transferList = undefined) { | |
var callbacks; | |
var promise = new Promise((resolve, reject) => { | |
callbacks = { resolve, reject }; | |
}); | |
this.promiseMap.set(promise, { callbacks, commandObj, transferList }); | |
this.runNextTask(); | |
return promise; | |
} | |
prepareCommandObject(commandObj) { | |
if (!(commandObj.data instanceof Array)) return commandObj; | |
const hyperCallbackIds = []; | |
for (const { args: argsList } of commandObj.data) { | |
for (const args of argsList) { | |
for (let i = 0; i < args.length; i++) { | |
if (typeof args[i] === 'function') { | |
const hyperCallback = this.registerHyperCallback(args[i]); | |
args[i] = hyperCallback; | |
hyperCallbackIds.push(hyperCallback.id); | |
} | |
} | |
} | |
} | |
if (hyperCallbackIds.length) { | |
commandObj.sendBackData = { | |
...commandObj.sendBackData, | |
hyperCallbackIds | |
}; | |
} | |
return commandObj; | |
} | |
runNextTask() { | |
if (this.isWorking) { | |
return; | |
} | |
var next = this.promiseMap.entries().next().value; | |
if (next) { | |
const [promise, { callbacks, commandObj, transferList }] = next; | |
this.promiseCallbacks = callbacks; | |
this.currentPromise = promise; | |
this.currentCommandId = this.commandCounter++; | |
commandObj.sendBackData = { | |
commandId: this.currentCommandId, | |
}; | |
this.worker.postMessage(this.prepareCommandObject(commandObj), transferList); | |
this.isWorking = true; | |
this.promiseMap.delete(promise); | |
} else { | |
this.dropCurrentTask(); | |
} | |
} | |
isTaskInProcess(promise) { | |
return this.currentPromise === promise; | |
} | |
isTaskInQueue(promise) { | |
return this.promiseMap.has(promise) || this.isTaskInProcess(promise); | |
} | |
processAction(obj) { | |
switch (obj.action) { | |
case 'Process': | |
this.onprocess ? this.onprocess(obj.percent) : 0; | |
break; | |
case 'hyperCallback': | |
if (this.hyperCallbacks[obj.id]) this.hyperCallbacks[obj.id](...obj.args); | |
break; | |
} | |
} | |
messageHandler({ data: obj }) { | |
if (obj.action) return this.processAction(obj); | |
this.isWorking = false; | |
const callbacks = this.promiseCallbacks; | |
const commandId = obj.sendBackData && obj.sendBackData.commandId; | |
if (commandId === this.currentCommandId || this.currentCommandId === null) { | |
this.runNextTask(); | |
} else { | |
if (obj === "unhandledrejection" || obj === "error") { | |
console.warn("DjVu.js: " + obj + " occurred in the worker!"); | |
this.runNextTask(); | |
} else { | |
console.warn('DjVu.js: Something strange came from the worker.', obj); | |
} | |
return; | |
} | |
if (!callbacks) return; | |
const { resolve, reject } = callbacks; | |
switch (obj.command) { | |
case 'Error': | |
reject(obj.error); | |
break; | |
case 'createDocument': | |
case 'startMultiPageDocument': | |
case 'addPageToDocument': | |
resolve(); | |
break; | |
case 'createDocumentFromPictures': | |
case 'endMultiPageDocument': | |
resolve(obj.buffer); | |
break; | |
case 'run': | |
var restoredResult = !obj.result ? obj.result : | |
obj.result.length && obj.result.map ? obj.result.map(result => this.restoreValueAfterTransfer(result)) : | |
this.restoreValueAfterTransfer(obj.result); | |
resolve(restoredResult); | |
break; | |
default: | |
console.error("Unexpected message from DjVuWorker: ", obj); | |
} | |
if (obj.sendBackData && obj.sendBackData.hyperCallbackIds) { | |
obj.sendBackData.hyperCallbackIds.forEach(id => this.unregisterHyperCallback(id)); | |
} | |
} | |
restoreValueAfterTransfer(value) { | |
if (value) { | |
if (value.width && value.height && value.buffer) { | |
return new ImageData(new Uint8ClampedArray(value.buffer), value.width, value.height); | |
} | |
} | |
return value; | |
} | |
run(...tasks) { | |
const data = tasks.map(task => task._); | |
return this.createNewPromise({ | |
command: 'run', | |
data: data, | |
}); | |
} | |
revokeObjectURL(url) { | |
this.worker.postMessage({ | |
action: this.revokeObjectURL.name, | |
url: url, | |
}); | |
} | |
startMultiPageDocument(slicenumber, delayInit, grayscale) { | |
return this.createNewPromise({ | |
command: 'startMultiPageDocument', | |
slicenumber: slicenumber, | |
delayInit: delayInit, | |
grayscale: grayscale | |
}); | |
} | |
addPageToDocument(imageData) { | |
var simpleImage = { | |
buffer: imageData.data.buffer, | |
width: imageData.width, | |
height: imageData.height | |
}; | |
return this.createNewPromise({ | |
command: 'addPageToDocument', | |
simpleImage: simpleImage | |
}, [simpleImage.buffer]); | |
} | |
endMultiPageDocument() { | |
return this.createNewPromise({ command: 'endMultiPageDocument' }); | |
} | |
createDocument(buffer, options) { | |
return this.createNewPromise({ command: 'createDocument', buffer: buffer, options: options }, [buffer]); | |
} | |
createDocumentFromPictures(imageArray, slicenumber, delayInit, grayscale) { | |
var simpleImages = new Array(imageArray.length); | |
var buffers = new Array(imageArray.length); | |
for (var i = 0; i < imageArray.length; i++) { | |
simpleImages[i] = { | |
buffer: imageArray[i].data.buffer, | |
width: imageArray[i].width, | |
height: imageArray[i].height | |
}; | |
buffers[i] = imageArray[i].data.buffer; | |
} | |
return this.createNewPromise({ | |
command: 'createDocumentFromPictures', | |
images: simpleImages, | |
slicenumber: slicenumber, | |
delayInit: delayInit, | |
grayscale: grayscale | |
}, buffers); | |
} | |
} | |
class DjVuWorkerTask { | |
static instance(worker, funcs = [], args = []) { | |
var proxy = new Proxy(DjVuWorkerTask.emptyFunc, { | |
get: (target, key) => { | |
switch (key) { | |
case '_': | |
return { funcs, args }; | |
case 'run': | |
return () => worker.run(proxy); | |
default: | |
return DjVuWorkerTask.instance(worker, [...funcs, key], args); | |
} | |
}, | |
apply: (target, that, _args) => { | |
return DjVuWorkerTask.instance(worker, funcs, [...args, _args]); | |
} | |
}); | |
return proxy; | |
} | |
static emptyFunc() { } | |
} | |
class IWEncoder extends IWCodecBaseClass { | |
constructor(bytemap) { | |
super(); | |
this.width = bytemap.width; | |
this.height = bytemap.height; | |
this.inverseWaveletTransform(bytemap); | |
this.createBlocks(bytemap); | |
} | |
inverseWaveletTransform(bytemap) { | |
for (var scale = 1; scale < 32; scale <<= 1) { | |
this.filter_fh(scale, bytemap); | |
this.filter_fv(scale, bytemap); | |
} | |
return bytemap; | |
} | |
filter_fv(s, bitmap) { | |
var kmax = Math.floor((bitmap.height - 1) / s); | |
for (var i = 0; i < bitmap.width; i += s) { | |
for (var k = 1; k <= kmax; k += 2) { | |
if ((k - 3 >= 0) && (k + 3 <= kmax)) { | |
bitmap[k * s][i] -= (9 * (bitmap[(k - 1) * s][i] + bitmap[(k + 1) * s][i]) - (bitmap[(k - 3) * s][i] + bitmap[(k + 3) * s][i]) + 8) >> 4; | |
} else if (k + 1 <= kmax) { | |
bitmap[k * s][i] -= (bitmap[(k - 1) * s][i] + bitmap[(k + 1) * s][i] + 1) >> 1; | |
} else { | |
bitmap[k * s][i] -= bitmap[(k - 1) * s][i]; | |
} | |
} | |
for (var k = 0; k <= kmax; k += 2) { | |
var a, b, c, d; | |
if (k - 1 < 0) { | |
a = 0; | |
} else { | |
a = bitmap[(k - 1) * s][i]; | |
} | |
if (k - 3 < 0) { | |
c = 0; | |
} else { | |
c = bitmap[(k - 3) * s][i]; | |
} | |
if (k + 1 > kmax) { | |
b = 0; | |
} else { | |
b = bitmap[(k + 1) * s][i]; | |
} | |
if (k + 3 > kmax) { | |
d = 0; | |
} else { | |
d = bitmap[(k + 3) * s][i]; | |
} | |
bitmap[k * s][i] += (9 * (a + b) - (c + d) + 16) >> 5; | |
} | |
} | |
} | |
filter_fh(s, bitmap) { | |
var kmax = Math.floor((bitmap.width - 1) / s); | |
for (var i = 0; i < bitmap.height; i += s) { | |
for (var k = 1; k <= kmax; k += 2) { | |
if ((k - 3 >= 0) && (k + 3 <= kmax)) { | |
bitmap[i][k * s] -= (9 * (bitmap[i][(k - 1) * s] + bitmap[i][(k + 1) * s]) - (bitmap[i][(k - 3) * s] + bitmap[i][(k + 3) * s]) + 8) >> 4; | |
} else if (k + 1 <= kmax) { | |
bitmap[i][k * s] -= (bitmap[i][(k - 1) * s] + bitmap[i][(k + 1) * s] + 1) >> 1; | |
} else { | |
bitmap[i][k * s] -= bitmap[i][(k - 1) * s]; | |
} | |
} | |
for (var k = 0; k <= kmax; k += 2) { | |
var a, b, c, d; | |
if (k - 1 < 0) { | |
a = 0; | |
} else { | |
a = bitmap[i][(k - 1) * s]; | |
} | |
if (k - 3 < 0) { | |
c = 0; | |
} else { | |
c = bitmap[i][(k - 3) * s]; | |
} | |
if (k + 1 > kmax) { | |
b = 0; | |
} else { | |
b = bitmap[i][(k + 1) * s]; | |
} | |
if (k + 3 > kmax) { | |
d = 0; | |
} else { | |
d = bitmap[i][(k + 3) * s]; | |
} | |
bitmap[i][k * s] += (9 * (a + b) - (c + d) + 16) >> 5; | |
} | |
} | |
} | |
createBlocks(bitmap) { | |
var blockRows = Math.ceil(this.height / 32); | |
var blockCols = Math.ceil(this.width / 32); | |
var length = blockRows * blockCols; | |
var buffer = new ArrayBuffer(length << 11); | |
this.blocks = []; | |
for (var r = 0; r < blockRows; r++) { | |
for (var c = 0; c < blockCols; c++) { | |
var block = new Block(buffer, (r * blockCols + c) << 11, true); | |
for (var i = 0; i < 1024; i++) { | |
var val = 0; | |
if (bitmap[this.zigzagRow[i] + 32 * r]) { | |
val = bitmap[this.zigzagRow[i] + 32 * r][this.zigzagCol[i] + 32 * c]; | |
val = val || 0; | |
} | |
block.setCoef(i, val); | |
} | |
this.blocks.push(block); | |
} | |
} | |
buffer = new ArrayBuffer(length << 11); | |
this.eblocks = new Array(length); | |
for (var i = 0; i < length; i++) { | |
this.eblocks[i] = new Block(buffer, i << 11, true); | |
} | |
} | |
encodeSlice(zp) { | |
this.zp = zp; | |
if (!this.is_null_slice()) { | |
for (var i = 0; i < this.blocks.length; i++) { | |
var block = this.blocks[i]; | |
var eblock = this.eblocks[i]; | |
this.preliminaryFlagComputation(block, eblock); | |
if (this.blockBandEncodingPass()) { | |
this.bucketEncodingPass(eblock); | |
this.newlyActiveCoefficientEncodingPass(block, eblock); | |
} | |
this.previouslyActiveCoefficientEncodingPass(block, eblock); | |
} | |
} | |
return this.finish_code_slice(); | |
} | |
previouslyActiveCoefficientEncodingPass(block, eblock) { | |
var boff = 0; | |
var step = this.quant_hi[this.curband]; | |
var indices = this.getBandBuckets(this.curband); | |
for (var i = indices.from; i <= indices.to; i++ , | |
boff++) { | |
for (var j = 0; j < 16; j++) { | |
if (this.coeffstate[boff][j] & this.ACTIVE) { | |
if (!this.curband) { | |
step = this.quant_lo[j]; | |
} | |
var coef = Math.abs(block.buckets[i][j]); | |
var ecoef = eblock.buckets[i][j]; | |
var pix = coef >= ecoef ? 1 : 0; | |
if (ecoef <= 3 * step) { | |
this.zp.encode(pix, this.inreaseCoefCtx, 0); | |
} else { | |
this.zp.IWencode(pix); | |
} | |
eblock.buckets[i][j] = ecoef - (pix ? 0 : step) + (step >> 1); | |
} | |
} | |
} | |
} | |
newlyActiveCoefficientEncodingPass(block, eblock) { | |
var boff = 0; | |
var indices = this.getBandBuckets(this.curband); | |
var step = this.quant_hi[this.curband]; | |
for (var i = indices.from; i <= indices.to; i++ , | |
boff++) { | |
if (this.bucketstate[boff] & this.NEW) { | |
var shift = 0; | |
if (this.bucketstate[boff] & this.ACTIVE) { | |
shift = 8; | |
} | |
var bucket = block.buckets[i]; | |
var ebucket = eblock.buckets[i]; | |
var np = 0; | |
for (var j = 0; j < 16; j++) { | |
if (this.coeffstate[boff][j] & this.UNK) { | |
np++; | |
} | |
} | |
for (var j = 0; j < 16; j++) { | |
if (this.coeffstate[boff][j] & this.UNK) { | |
var ip = Math.min(7, np); | |
this.zp.encode((this.coeffstate[boff][j] & this.NEW) ? 1 : 0, this.activateCoefCtx, shift + ip); | |
if (this.coeffstate[boff][j] & this.NEW) { | |
this.zp.IWencode((bucket[j] < 0) ? 1 : 0); | |
np = 0; | |
if (!this.curband) { | |
step = this.quant_lo[j]; | |
} | |
ebucket[j] = (step + (step >> 1) - (step >> 3)); | |
ebucket[j] = (step + (step >> 1)); | |
} | |
if (np) { | |
np--; | |
} | |
} | |
} | |
} | |
} | |
} | |
bucketEncodingPass(eblock) { | |
var indices = this.getBandBuckets(this.curband); | |
var boff = 0; | |
for (var i = indices.from; i <= indices.to; i++ , | |
boff++) { | |
if (!(this.bucketstate[boff] & this.UNK)) { | |
continue; | |
} | |
var n = 0; | |
if (this.curband) { | |
var t = 4 * i; | |
for (var j = t; j < t + 4; j++) { | |
if (eblock.getCoef(j)) { | |
n++; | |
} | |
} | |
if (n === 4) { | |
n--; | |
} | |
} | |
if (this.bbstate & this.ACTIVE) { | |
n |= 4; | |
} | |
this.zp.encode((this.bucketstate[boff] & this.NEW) ? 1 : 0, this.decodeCoefCtx, n + this.curband * 8); | |
} | |
} | |
blockBandEncodingPass() { | |
var indices = this.getBandBuckets(this.curband); | |
var bcount = indices.to - indices.from + 1; | |
if (bcount < 16 || (this.bbstate & this.ACTIVE)) { | |
this.bbstate |= this.NEW; | |
} else if (this.bbstate & this.UNK) { | |
this.zp.encode(this.bbstate & this.NEW ? 1 : 0, this.decodeBucketCtx, 0); | |
} | |
return this.bbstate & this.NEW; | |
} | |
preliminaryFlagComputation(block, eblock) { | |
this.bbstate = 0; | |
var bstatetmp = 0; | |
var indices = this.getBandBuckets(this.curband); | |
var step = this.quant_hi[this.curband]; | |
if (this.curband) { | |
var boff = 0; | |
for (var j = indices.from; j <= indices.to; j++ , boff++) { | |
bstatetmp = 0; | |
var bucket = block.buckets[j]; | |
var ebucket = eblock.buckets[j]; | |
for (var k = 0; k < bucket.length; k++) { | |
if (ebucket[k]) { | |
this.coeffstate[boff][k] = this.ACTIVE; | |
} else if (bucket[k] >= step || bucket[k] <= -step) { | |
this.coeffstate[boff][k] = this.UNK | this.NEW; | |
} else { | |
this.coeffstate[boff][k] = this.UNK; | |
} | |
bstatetmp |= this.coeffstate[boff][k]; | |
} | |
this.bucketstate[boff] = bstatetmp; | |
this.bbstate |= bstatetmp; | |
} | |
} else { | |
var bucket = block.buckets[0]; | |
var ebucket = eblock.buckets[0]; | |
for (var k = 0; k < bucket.length; k++) { | |
step = this.quant_lo[k]; | |
if (this.coeffstate[0][k] !== this.ZERO) { | |
if (ebucket[k]) { | |
this.coeffstate[0][k] = this.ACTIVE; | |
} else if (bucket[k] >= step || bucket[k] <= -step) { | |
this.coeffstate[0][k] = this.UNK | this.NEW; | |
} else { | |
this.coeffstate[0][k] = this.UNK; | |
} | |
} | |
bstatetmp |= this.coeffstate[0][k]; | |
} | |
this.bucketstate[0] = bstatetmp; | |
this.bbstate |= bstatetmp; | |
} | |
} | |
} | |
class IWImageWriter { | |
constructor(slicenumber, delayInit, grayscale) { | |
this.slicenumber = slicenumber || 100; | |
this.grayscale = grayscale || 0; | |
this.delayInit = (delayInit & 127) || 0; | |
this.onprocess = undefined; | |
} | |
get width() { | |
return this.imageData.width; | |
} | |
get height() { | |
return this.imageData.height; | |
} | |
startMultiPageDocument() { | |
this.dw = new DjVuWriter(); | |
this.dw.startDJVM(); | |
this.pageBuffers = []; | |
var dirm = {}; | |
this.dirm = dirm; | |
dirm.offsets = []; | |
dirm.dflags = 129; | |
dirm.flags = []; | |
dirm.ids = []; | |
dirm.sizes = []; | |
} | |
addPageToDocument(imageData) { | |
var tbsw = new ByteStreamWriter(); | |
this.writeImagePage(tbsw, imageData); | |
var buffer = tbsw.getBuffer(); | |
this.pageBuffers.push(buffer); | |
this.dirm.flags.push(1); | |
this.dirm.ids.push('p' + this.dirm.ids.length); | |
this.dirm.sizes.push(buffer.byteLength); | |
} | |
endMultiPageDocument() { | |
this.dw.writeDirmChunk(this.dirm); | |
var len = this.pageBuffers.length; | |
for (var i = 0; i < len; i++) { | |
this.dw.writeFormChunkBuffer(this.pageBuffers.shift()); | |
} | |
var buffer = this.dw.getBuffer(); | |
delete this.dw; | |
delete this.pageBuffers; | |
delete this.dirm; | |
return buffer; | |
} | |
createMultiPageDocument(imageArray) { | |
var dw = new DjVuWriter(); | |
dw.startDJVM(); | |
var length = imageArray.length; | |
var pageBuffers = new Array(imageArray.length); | |
var dirm = {}; | |
this.dirm = dirm; | |
dirm.offsets = []; | |
dirm.dflags = 129; | |
dirm.flags = new Array(imageArray.length); | |
dirm.ids = new Array(imageArray.length); | |
dirm.sizes = new Array(imageArray.length); | |
var tbsw = new ByteStreamWriter(); | |
for (var i = 0; i < imageArray.length; i++) { | |
this.writeImagePage(tbsw, imageArray[i]); | |
var buffer = tbsw.getBuffer(); | |
pageBuffers[i] = buffer; | |
tbsw.reset(); | |
dirm.flags[i] = 1; | |
dirm.ids[i] = 'p' + i; | |
dirm.sizes[i] = buffer.byteLength; | |
this.onprocess ? this.onprocess((i + 1) / length) : 0; | |
} | |
dw.writeDirmChunk(dirm); | |
for (var i = 0; i < imageArray.length; i++) { | |
dw.writeFormChunkBuffer(pageBuffers[i]); | |
} | |
return new DjVuDocument(dw.getBuffer()); | |
} | |
writeImagePage(bsw, imageData) { | |
bsw.writeStr('FORM').saveOffsetMark('formSize').jump(4).writeStr('DJVU'); | |
bsw.writeStr('INFO') | |
.writeInt32(10) | |
.writeInt16(imageData.width) | |
.writeInt16(imageData.height) | |
.writeByte(24).writeByte(0) | |
.writeByte(100 & 0xff) | |
.writeByte(100 >> 8) | |
.writeByte(22).writeByte(1); | |
bsw.writeStr('BG44').saveOffsetMark('BG44Size').jump(4); | |
bsw.writeByte(0) | |
.writeByte(this.slicenumber) | |
.writeByte((this.grayscale << 7) | 1) | |
.writeByte(2) | |
.writeUint16(imageData.width) | |
.writeUint16(imageData.height) | |
.writeByte(this.delayInit); | |
var ycodec = new IWEncoder(this.RGBtoY(imageData)); | |
var crcodec, cbcodec; | |
if (!this.grayscale) { | |
cbcodec = new IWEncoder(this.RGBtoCb(imageData)); | |
crcodec = new IWEncoder(this.RGBtoCr(imageData)); | |
} | |
var zp = new ZPEncoder(bsw); | |
for (var i = 0; i < this.slicenumber; i++) { | |
ycodec.encodeSlice(zp); | |
if (cbcodec && crcodec && i >= this.delayInit) { | |
cbcodec.encodeSlice(zp); | |
crcodec.encodeSlice(zp); | |
} | |
} | |
zp.eflush(); | |
bsw.rewriteSize('formSize'); | |
bsw.rewriteSize('BG44Size'); | |
} | |
createOnePageDocument(imageData) { | |
var bsw = new ByteStreamWriter(10 * 1024); | |
bsw.writeStr('AT&T'); | |
this.writeImagePage(bsw, imageData); | |
return new DjVuDocument(bsw.getBuffer()); | |
} | |
RGBtoY(imageData) { | |
var rmul = new Int32Array(256); | |
var gmul = new Int32Array(256); | |
var bmul = new Int32Array(256); | |
var data = imageData.data; | |
var width = imageData.width; | |
var height = imageData.height; | |
var bytemap = new Bytemap(width, height); | |
if (this.grayscale) { | |
for (var i = 0; i < data.length; i++) { | |
data[i] = 255 - data[i]; | |
} | |
} | |
for (var k = 0; k < 256; k++) { | |
rmul[k] = (k * 0x10000 * this.rgb_to_ycc[0][0]); | |
gmul[k] = (k * 0x10000 * this.rgb_to_ycc[0][1]); | |
bmul[k] = (k * 0x10000 * this.rgb_to_ycc[0][2]); | |
} | |
for (var i = 0; i < height; i++) { | |
for (var j = 0; j < width; j++) { | |
var index = ((height - i - 1) * width + j) << 2; | |
var y = rmul[data[index]] + gmul[data[index + 1]] + bmul[data[index + 2]] + 32768; | |
bytemap[i][j] = ((y >> 16) - 128) << this.iw_shift; | |
} | |
} | |
return bytemap; | |
} | |
RGBtoCb(imageData) { | |
var rmul = new Int32Array(256); | |
var gmul = new Int32Array(256); | |
var bmul = new Int32Array(256); | |
var data = imageData.data; | |
var width = imageData.width; | |
var height = imageData.height; | |
var bytemap = new Bytemap(width, height); | |
for (var k = 0; k < 256; k++) { | |
rmul[k] = (k * 0x10000 * this.rgb_to_ycc[2][0]); | |
gmul[k] = (k * 0x10000 * this.rgb_to_ycc[2][1]); | |
bmul[k] = (k * 0x10000 * this.rgb_to_ycc[2][2]); | |
} | |
for (var i = 0; i < height; i++) { | |
for (var j = 0; j < width; j++) { | |
var index = ((height - i - 1) * width + j) << 2; | |
var y = rmul[data[index]] + gmul[data[index + 1]] + bmul[data[index + 2]] + 32768; | |
bytemap[i][j] = Math.max(-128, Math.min(127, y >> 16)) << this.iw_shift; | |
} | |
} | |
return bytemap; | |
} | |
RGBtoCr(imageData) { | |
var rmul = new Int32Array(256); | |
var gmul = new Int32Array(256); | |
var bmul = new Int32Array(256); | |
var data = imageData.data; | |
var width = imageData.width; | |
var height = imageData.height; | |
var bytemap = new Bytemap(width, height); | |
for (var k = 0; k < 256; k++) { | |
rmul[k] = (k * 0x10000 * this.rgb_to_ycc[1][0]); | |
gmul[k] = (k * 0x10000 * this.rgb_to_ycc[1][1]); | |
bmul[k] = (k * 0x10000 * this.rgb_to_ycc[1][2]); | |
} | |
for (var i = 0; i < height; i++) { | |
for (var j = 0; j < width; j++) { | |
var index = ((height - i - 1) * width + j) << 2; | |
var y = rmul[data[index]] + gmul[data[index + 1]] + bmul[data[index + 2]] + 32768; | |
bytemap[i][j] = Math.max(-128, Math.min(127, y >> 16)) << this.iw_shift; | |
} | |
} | |
return bytemap; | |
} | |
} | |
IWImageWriter.prototype.iw_shift = 6; | |
IWImageWriter.prototype.rgb_to_ycc = [ | |
[0.304348, 0.608696, 0.086956], | |
[0.463768, -0.405797, -0.057971], | |
[-0.173913, -0.347826, 0.521739]]; | |
function initWorker() { | |
var djvuDocument; | |
var iwiw; | |
addEventListener("error", e => { | |
console.error(e); | |
postMessage("error"); | |
}); | |
addEventListener("unhandledrejection", e => { | |
console.error(e); | |
postMessage("unhandledrejection"); | |
}); | |
onmessage = async function ({ data: obj }) { | |
if (obj.action) return handlers[obj.action](obj); | |
try { | |
const { data, transferList } = await handlers[obj.command](obj) || {}; | |
try { | |
postMessage({ | |
command: obj.command, | |
...data, | |
...(obj.sendBackData ? { sendBackData: obj.sendBackData } : null), | |
}, transferList && transferList.length ? transferList : undefined); | |
} catch (e) { | |
throw new UnableToTransferDataDjVuError(obj.data); | |
} | |
} catch (error) { | |
console.error(error); | |
var errorObj = error instanceof DjVuError ? error : { | |
code: DjVuErrorCodes.UNEXPECTED_ERROR, | |
name: error.name, | |
message: error.message | |
}; | |
errorObj.commandObject = obj; | |
postMessage({ | |
command: 'Error', | |
error: errorObj, | |
...(obj.sendBackData ? { sendBackData: obj.sendBackData } : null), | |
}); | |
} | |
}; | |
function processValueBeforeTransfer(value, transferList) { | |
if (value instanceof ArrayBuffer) { | |
transferList.push(value); | |
return value; | |
} | |
if (value instanceof ImageData) { | |
transferList.push(value.data.buffer); | |
return { | |
width: value.width, | |
height: value.height, | |
buffer: value.data.buffer | |
}; | |
} | |
if (value instanceof DjVuDocument) { | |
transferList.push(value.buffer); | |
return value.buffer; | |
} | |
return value; | |
} | |
function restoreHyperCallbacks(args) { | |
return args.map(arg => { | |
if (arg && (typeof arg === 'object') && arg.hyperCallback) { | |
return (...params) => postMessage({ | |
action: 'hyperCallback', | |
id: arg.id, | |
args: params | |
}); | |
} | |
return arg; | |
}); | |
} | |
var handlers = { | |
async run(obj) { | |
const results = await Promise.all(obj.data.map(async task => { | |
var res = djvuDocument; | |
for (var i = 0; i < task.funcs.length; i++) { | |
if (typeof res[task.funcs[i]] !== 'function') { | |
throw new IncorrectTaskDjVuError(task); | |
} | |
res = await res[task.funcs[i]](...restoreHyperCallbacks(task.args[i])); | |
} | |
return res; | |
})); | |
var transferList = []; | |
var processedResults = results.map(result => processValueBeforeTransfer(result, transferList)); | |
return { | |
data: { | |
result: processedResults.length === 1 ? processedResults[0] : processedResults | |
}, | |
transferList | |
}; | |
}, | |
revokeObjectURL(obj) { | |
URL.revokeObjectURL(obj.url); | |
}, | |
startMultiPageDocument(obj) { | |
iwiw = new IWImageWriter(obj.slicenumber, obj.delayInit, obj.grayscale); | |
iwiw.startMultiPageDocument(); | |
}, | |
addPageToDocument(obj) { | |
var imageData = new ImageData(new Uint8ClampedArray(obj.simpleImage.buffer), obj.simpleImage.width, obj.simpleImage.height); | |
iwiw.addPageToDocument(imageData); | |
}, | |
endMultiPageDocument(obj) { | |
var buffer = iwiw.endMultiPageDocument(); | |
return { | |
data: { buffer: buffer }, | |
transferList: [buffer] | |
}; | |
}, | |
createDocumentFromPictures(obj) { | |
var sims = obj.images; | |
var imageArray = new Array(sims.length); | |
for (var i = 0; i < sims.length; i++) { | |
imageArray[i] = new ImageData(new Uint8ClampedArray(sims[i].buffer), sims[i].width, sims[i].height); | |
} | |
var iw = new IWImageWriter(obj.slicenumber, obj.delayInit, obj.grayscale); | |
iw.onprocess = (percent) => { | |
postMessage({ action: 'Process', percent: percent }); | |
}; | |
var ndoc = iw.createMultyPageDocument(imageArray); | |
return { | |
data: { buffer: ndoc.buffer }, | |
transferList: [ndoc.buffer] | |
}; | |
}, | |
createDocument(obj) { | |
djvuDocument = new DjVuDocument(obj.buffer, obj.options); | |
}, | |
}; | |
} | |
if (!self.document) { | |
initWorker(); | |
} | |
var index = Object.assign({}, DjVu, { | |
Worker: DjVuWorker, | |
Document: DjVuDocument, | |
ErrorCodes: DjVuErrorCodes | |
}); | |
return index; | |
} | |
return Object.assign(DjVuScript(), {DjVuScript}); | |
}()); |
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! For license information please see djvu_viewer.js.LICENSE.txt */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment