Browse Source

Fix accidental infinite decompression loop, (h-haha)

pull/46/head
coomdev 2 years ago
parent
commit
ce08933a72
  1. 2
      README.md
  2. 28
      chrome/dist/main.js
  3. 2
      chrome/manifest.json
  4. 28
      dist/main.js
  5. BIN
      efdb47d2f0e04144bbaa-0.290.xpi
  6. 28
      firefox/dist/main.js
  7. 2
      firefox/manifest.json
  8. 2
      firefox_update.json
  9. 2
      main.meta.js
  10. 30
      main.user.js
  11. BIN
      pngextraembedder-0.290.xpi
  12. 7
      src/bitstream.ts
  13. 23
      src/dh-deflate.ts
  14. 6
      src/main.ts

2
README.md

@ -25,7 +25,7 @@ Please report any issue you have with those (only for mainstream browsers)
Also, use this if you plan to use b4k's archive. Also, use this if you plan to use b4k's archive.
- [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js) - [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js)
- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.289.xpi) or Chrome-based (Down for "maintainance")) - Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.290.xpi) or Chrome-based (Down for "maintainance"))
For FF users, the extension is signed so you can just drag and drop it on your about:addons tab. For FF users, the extension is signed so you can just drag and drop it on your about:addons tab.

28
chrome/dist/main.js

@ -73,7 +73,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289]; define_BUILD_VERSION_default = [0, 290];
} }
}); });
@ -21243,7 +21243,9 @@
} }
readSync(length) { readSync(length) {
let value = 0; let value = 0;
const byte = this.buffers[0][this._offset >> 3]; if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) { for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i); value = value * 2 + this.getBit(this._offset + i);
} }
@ -21306,7 +21308,6 @@
this.trans = new Uint16Array(288); this.trans = new Uint16Array(288);
} }
}; };
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => { var getPathTo = (tree, value) => {
if (tree[0] === value) if (tree[0] === value)
return "0"; return "0";
@ -21362,6 +21363,7 @@
this.dests = dests; this.dests = dests;
this.to_hide = to_hide; this.to_hide = to_hide;
this.hidden = hidden; this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = []; this.dest = [];
this.ltree = new Tree(); this.ltree = new Tree();
this.dtree = new Tree(); this.dtree = new Tree();
@ -21547,22 +21549,12 @@
i--; i--;
return [i, bits_table[i], value - base_table[i]]; return [i, bits_table[i], value - base_table[i]];
}; };
var encode_symbol = (sym, tree) => { var encode_symbol = (sym, tree, pathMap) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
const code = getPathTo(tree, sym); const code = getPathTo(tree, sym);
const v = { const v = {
length: code?.length, length: code?.length,
val: parseInt(code, 2) val: parseInt(code, 2)
}; };
m.set(sym, v);
return v; return v;
}; };
var capacity = 0; var capacity = 0;
@ -21584,7 +21576,7 @@
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset; const offs2 = d.dest.length - backoffset;
let match; let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768; let begin = d.dest.length - 32768;
if (begin < 0) if (begin < 0)
@ -21622,7 +21614,7 @@
} }
} }
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree); const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff); d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) { for (let i = offs2; i < offs2 + length; ++i) {
@ -32020,7 +32012,7 @@
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames); console.log(filenames);
fireNotification("info", "Analyzing images..."); fireNotification("info", "Analyzing images...");
const n = 7; const n = 1;
const processFile = (src, fn, hex) => { const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) { if (proc.skip) {
@ -32254,7 +32246,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata) if (csettings5.notcata)
return; return;
} }
const n = 7; const n = 1;
const range = ~~(posts.length / n) + 1; const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => { await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range); const postsslice = posts.slice(i * range, (i + 1) * range);

2
chrome/manifest.json

@ -2,7 +2,7 @@
"manifest_version": 3, "manifest_version": 3,
"name": "PngExtraEmbedder", "name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!", "description": "Discover embedded files on 4chan and archives!",
"version": "0.289", "version": "0.290",
"icons": { "icons": {
"64": "1449696017588.png" "64": "1449696017588.png"
}, },

28
dist/main.js

@ -73,7 +73,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289]; define_BUILD_VERSION_default = [0, 290];
} }
}); });
@ -21078,7 +21078,9 @@
} }
readSync(length) { readSync(length) {
let value = 0; let value = 0;
const byte = this.buffers[0][this._offset >> 3]; if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) { for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i); value = value * 2 + this.getBit(this._offset + i);
} }
@ -21141,7 +21143,6 @@
this.trans = new Uint16Array(288); this.trans = new Uint16Array(288);
} }
}; };
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => { var getPathTo = (tree, value) => {
if (tree[0] === value) if (tree[0] === value)
return "0"; return "0";
@ -21197,6 +21198,7 @@
this.dests = dests; this.dests = dests;
this.to_hide = to_hide; this.to_hide = to_hide;
this.hidden = hidden; this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = []; this.dest = [];
this.ltree = new Tree(); this.ltree = new Tree();
this.dtree = new Tree(); this.dtree = new Tree();
@ -21382,22 +21384,12 @@
i--; i--;
return [i, bits_table[i], value - base_table[i]]; return [i, bits_table[i], value - base_table[i]];
}; };
var encode_symbol = (sym, tree) => { var encode_symbol = (sym, tree, pathMap) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
const code = getPathTo(tree, sym); const code = getPathTo(tree, sym);
const v = { const v = {
length: code?.length, length: code?.length,
val: parseInt(code, 2) val: parseInt(code, 2)
}; };
m.set(sym, v);
return v; return v;
}; };
var capacity = 0; var capacity = 0;
@ -21419,7 +21411,7 @@
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset; const offs2 = d.dest.length - backoffset;
let match; let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768; let begin = d.dest.length - 32768;
if (begin < 0) if (begin < 0)
@ -21457,7 +21449,7 @@
} }
} }
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree); const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff); d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) { for (let i = offs2; i < offs2 + length; ++i) {
@ -31855,7 +31847,7 @@
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames); console.log(filenames);
fireNotification("info", "Analyzing images..."); fireNotification("info", "Analyzing images...");
const n = 7; const n = 1;
const processFile = (src, fn, hex) => { const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) { if (proc.skip) {
@ -32089,7 +32081,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata) if (csettings5.notcata)
return; return;
} }
const n = 7; const n = 1;
const range = ~~(posts.length / n) + 1; const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => { await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range); const postsslice = posts.slice(i * range, (i + 1) * range);

BIN
efdb47d2f0e04144bbaa-0.290.xpi

Binary file not shown.

28
firefox/dist/main.js

@ -73,7 +73,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289]; define_BUILD_VERSION_default = [0, 290];
} }
}); });
@ -21220,7 +21220,9 @@
} }
readSync(length) { readSync(length) {
let value = 0; let value = 0;
const byte = this.buffers[0][this._offset >> 3]; if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) { for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i); value = value * 2 + this.getBit(this._offset + i);
} }
@ -21283,7 +21285,6 @@
this.trans = new Uint16Array(288); this.trans = new Uint16Array(288);
} }
}; };
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => { var getPathTo = (tree, value) => {
if (tree[0] === value) if (tree[0] === value)
return "0"; return "0";
@ -21339,6 +21340,7 @@
this.dests = dests; this.dests = dests;
this.to_hide = to_hide; this.to_hide = to_hide;
this.hidden = hidden; this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = []; this.dest = [];
this.ltree = new Tree(); this.ltree = new Tree();
this.dtree = new Tree(); this.dtree = new Tree();
@ -21524,22 +21526,12 @@
i--; i--;
return [i, bits_table[i], value - base_table[i]]; return [i, bits_table[i], value - base_table[i]];
}; };
var encode_symbol = (sym, tree) => { var encode_symbol = (sym, tree, pathMap) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
const code = getPathTo(tree, sym); const code = getPathTo(tree, sym);
const v = { const v = {
length: code?.length, length: code?.length,
val: parseInt(code, 2) val: parseInt(code, 2)
}; };
m.set(sym, v);
return v; return v;
}; };
var capacity = 0; var capacity = 0;
@ -21561,7 +21553,7 @@
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset; const offs2 = d.dest.length - backoffset;
let match; let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768; let begin = d.dest.length - 32768;
if (begin < 0) if (begin < 0)
@ -21599,7 +21591,7 @@
} }
} }
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree); const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff); d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) { for (let i = offs2; i < offs2 + length; ++i) {
@ -31997,7 +31989,7 @@
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames); console.log(filenames);
fireNotification("info", "Analyzing images..."); fireNotification("info", "Analyzing images...");
const n = 7; const n = 1;
const processFile = (src, fn, hex) => { const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) { if (proc.skip) {
@ -32231,7 +32223,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata) if (csettings5.notcata)
return; return;
} }
const n = 7; const n = 1;
const range = ~~(posts.length / n) + 1; const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => { await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range); const postsslice = posts.slice(i * range, (i + 1) * range);

2
firefox/manifest.json

@ -7,7 +7,7 @@
}, },
"name": "PngExtraEmbedder", "name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!", "description": "Discover embedded files on 4chan and archives!",
"version": "0.289", "version": "0.290",
"icons": { "icons": {
"64": "1449696017588.png" "64": "1449696017588.png"
}, },

2
firefox_update.json

@ -1 +1 @@
{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.289","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.289.xpi"}]}}} {"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.290","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.290.xpi"}]}}}

2
main.meta.js

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name PNGExtraEmbed // @name PNGExtraEmbed
// @namespace https://coom.tech/ // @namespace https://coom.tech/
// @version 0.289 // @version 0.290
// @description uhh // @description uhh
// @author You // @author You
// @match https://boards.4channel.org/* // @match https://boards.4channel.org/*

30
main.user.js

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name PNGExtraEmbed // @name PNGExtraEmbed
// @namespace https://coom.tech/ // @namespace https://coom.tech/
// @version 0.289 // @version 0.290
// @description uhh // @description uhh
// @author You // @author You
// @match https://boards.4channel.org/* // @match https://boards.4channel.org/*
@ -109,7 +109,7 @@ const _DOMParser = DOMParser;
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289]; define_BUILD_VERSION_default = [0, 290];
} }
}); });
@ -21114,7 +21114,9 @@ const _DOMParser = DOMParser;
} }
readSync(length) { readSync(length) {
let value = 0; let value = 0;
const byte = this.buffers[0][this._offset >> 3]; if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) { for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i); value = value * 2 + this.getBit(this._offset + i);
} }
@ -21177,7 +21179,6 @@ const _DOMParser = DOMParser;
this.trans = new Uint16Array(288); this.trans = new Uint16Array(288);
} }
}; };
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => { var getPathTo = (tree, value) => {
if (tree[0] === value) if (tree[0] === value)
return "0"; return "0";
@ -21233,6 +21234,7 @@ const _DOMParser = DOMParser;
this.dests = dests; this.dests = dests;
this.to_hide = to_hide; this.to_hide = to_hide;
this.hidden = hidden; this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = []; this.dest = [];
this.ltree = new Tree(); this.ltree = new Tree();
this.dtree = new Tree(); this.dtree = new Tree();
@ -21418,22 +21420,12 @@ const _DOMParser = DOMParser;
i--; i--;
return [i, bits_table[i], value - base_table[i]]; return [i, bits_table[i], value - base_table[i]];
}; };
var encode_symbol = (sym, tree) => { var encode_symbol = (sym, tree, pathMap) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
const code = getPathTo(tree, sym); const code = getPathTo(tree, sym);
const v = { const v = {
length: code?.length, length: code?.length,
val: parseInt(code, 2) val: parseInt(code, 2)
}; };
m.set(sym, v);
return v; return v;
}; };
var capacity = 0; var capacity = 0;
@ -21455,7 +21447,7 @@ const _DOMParser = DOMParser;
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset; const offs2 = d.dest.length - backoffset;
let match; let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0; const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) { if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768; let begin = d.dest.length - 32768;
if (begin < 0) if (begin < 0)
@ -21493,7 +21485,7 @@ const _DOMParser = DOMParser;
} }
} }
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree); const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff); d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) { for (let i = offs2; i < offs2 + length; ++i) {
@ -31891,7 +31883,7 @@ const _DOMParser = DOMParser;
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]); const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames); console.log(filenames);
fireNotification("info", "Analyzing images..."); fireNotification("info", "Analyzing images...");
const n = 7; const n = 1;
const processFile = (src, fn, hex) => { const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => { return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) { if (proc.skip) {
@ -32125,7 +32117,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata) if (csettings5.notcata)
return; return;
} }
const n = 7; const n = 1;
const range = ~~(posts.length / n) + 1; const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => { await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range); const postsslice = posts.slice(i * range, (i + 1) * range);

BIN
pngextraembedder-0.290.xpi

Binary file not shown.

7
src/bitstream.ts

@ -14,7 +14,7 @@ export const revbyte = (n: number, len = 8) => {
}; };
export class BitstreamReader { export class BitstreamReader {
private buffers: any[] = []; private buffers: Uint8Array[] = [];
private bufferedLength = 0; private bufferedLength = 0;
@ -64,7 +64,10 @@ export class BitstreamReader {
readSync(length: number): number { readSync(length: number): number {
let value = 0; let value = 0;
//console.log(this.buffers[0]) //console.log(this.buffers[0])
const byte = this.buffers[0][this._offset >> 3]; if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
//const byte = this.buffers[0][this._offset >> 3];
for (let i = length - 1; i >= 0; --i) { for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i); value = value * 2 + this.getBit(this._offset + i);
} }

23
src/dh-deflate.ts

@ -13,10 +13,6 @@ type HCtree = [number | HCtree, (number | HCtree)?];
// these two functions are a big bottleneck because im not clever enough to figure out how to encode // these two functions are a big bottleneck because im not clever enough to figure out how to encode
// something directly by using the sorted code length/value tables, haha // something directly by using the sorted code length/value tables, haha
const pathMap = new Map<HCtree, Map<number, {
length: number,
val: number
}>>();
const getPathTo = (tree: HCtree, value: number): string | undefined => { const getPathTo = (tree: HCtree, value: number): string | undefined => {
if (tree[0] === value) if (tree[0] === value)
@ -75,6 +71,11 @@ function buildHuffmanTable(codeLengths: ArrayLike<number>, values: ArrayLike<num
} }
class Data { class Data {
pathMap = new Map<HCtree, Map<number, {
length: number,
val: number
}>>();
computeReverse() { computeReverse() {
this.rltree = buildHuffmanTable(this.ltree.table, this.ltree.trans)[0]! as any; // unneeded, but maybe sometime i'll throw symbol reduction into the mix this.rltree = buildHuffmanTable(this.ltree.table, this.ltree.trans)[0]! as any; // unneeded, but maybe sometime i'll throw symbol reduction into the mix
this.rdtree = buildHuffmanTable(this.dtree.table, this.dtree.trans)[0]! as any; this.rdtree = buildHuffmanTable(this.dtree.table, this.dtree.trans)[0]! as any;
@ -352,15 +353,15 @@ const get_symbol = (value: number, bits_table: Uint8Array, base_table: Uint16Arr
return [i, bits_table[i], value - base_table[i]]; return [i, bits_table[i], value - base_table[i]];
}; };
const encode_symbol = (sym: number, tree: HCtree) => { const encode_symbol = (sym: number, tree: HCtree, pathMap: Map<HCtree, Map<number, { length: number, val: number }>>) => {
let m: Map<number, { length: number, val: number }> | undefined; /*let m: Map<number, { length: number, val: number }> | undefined;
if ((m = pathMap.get(tree))) { if ((m = pathMap.get(tree))) {
const v = m.get(sym); const v = m.get(sym);
if (v) return v; if (v) return v;
} else { } else {
m = new Map; m = new Map;
pathMap.set(tree, m); pathMap.set(tree, m);
} }*/
const code = getPathTo(tree, sym)!; const code = getPathTo(tree, sym)!;
@ -368,7 +369,7 @@ const encode_symbol = (sym: number, tree: HCtree) => {
length: code?.length, length: code?.length,
val: parseInt(code, 2) val: parseInt(code, 2)
}; };
m.set(sym, v); //m.set(sym, v);
return v; return v;
}; };
/* ----------------------------- * /* ----------------------------- *
@ -386,7 +387,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) {
if (sym === 256) { if (sym === 256) {
return TINF_OK; return TINF_OK;
} }
if (sym < 256) { if (sym < 256) {
d.dest.push(sym); d.dest.push(sym);
// same // same
@ -412,7 +413,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) {
let match: Buffer; let match: Buffer;
// don't consider matches that could be in the lookahead buffer // don't consider matches that could be in the lookahead buffer
const skip = d.to_hide && d.to_hide instanceof BitstreamReader && d.to_hide.available == 0; const skip = !d.to_hide || (d.to_hide && d.to_hide instanceof BitstreamReader && d.to_hide.available == 0);
if (!skip && (match = Buffer.from(d.dest.slice(offs, offs + length))).length == length) { if (!skip && (match = Buffer.from(d.dest.slice(offs, offs + length))).length == length) {
let begin = d.dest.length - 32768; let begin = d.dest.length - 32768;
if (begin < 0) if (begin < 0)
@ -460,7 +461,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) {
//d.hidden.write(enclen.length, enclen.val); //d.hidden.write(enclen.length, enclen.val);
//d.hidden.write(llen, loff); //d.hidden.write(llen, loff);
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base); const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree); const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length)); d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff); d.hidden?.write(dlen, doff);

6
src/main.ts

@ -109,7 +109,7 @@ const processImage = async (srcs: AsyncGenerator<string, void, void>, fn: string
try { try {
const n = await srcs.next(); const n = await srcs.next();
if (n.done) if (n.done)
return; // no more links to try return; // no more links to try
const iter = streamRemote(n.value); const iter = streamRemote(n.value);
if (!iter) if (!iter)
return; return;
@ -304,7 +304,7 @@ const scrapeBoard = async (self: HTMLButtonElement) => {
console.log(filenames); console.log(filenames);
fireNotification("info", "Analyzing images..."); fireNotification("info", "Analyzing images...");
const n = 7; const n = 1;
//console.log(posts); //console.log(posts);
const processFile = (src: string, fn: string, hex: string) => { const processFile = (src: string, fn: string, hex: string) => {
return Promise.all(processors.filter(e => e.match(fn)).map(async proc => { return Promise.all(processors.filter(e => e.match(fn)).map(async proc => {
@ -612,7 +612,7 @@ const startup = async (is4chanX = true) => {
return; return;
} }
const n = 7; const n = 1;
//console.log(posts); //console.log(posts);
const range = ~~(posts.length / n) + 1; const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => { await Promise.all([...new Array(n + 1)].map(async (e, i) => {

Loading…
Cancel
Save