// ==UserScript==
// @name youtube-comment-censor-detector
// @name:zh-CN YouTube发评反诈
// @name:zh-TW YouTube發評反詐
// @namespace npm/vite-plugin-monkey
// @version 1.0.0
// @author freedom-introvert
// @description A real-time comment checker, Fuck YouTube’s deceptive comment censorship
// @description:zh-CN Fuck YouTube版“阿瓦隆系统”,实时检查评论状态,防止评论被儿童偷偷误食你还被蒙在鼓里
// @description:zh-TW Fuck YouTube版“阿瓦隆系統”,即時檢查評論狀態,防止評論被兒童偷偷誤食你還被蒙在鼓裡
// @license GPL
// @icon https://raw.githubusercontent.com/freedom-introvert/youtube-comment-censor-detector/refs/heads/main/logo/logo_256x256.avif
// @match *://*.youtube.com/*
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js
// @require https://unpkg.com/vue-demi@latest/lib/index.iife.js
// @require data:application/javascript,window.Vue%3DVue%3B
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/index.full.min.js
// @resource element-plus/dist/index.css https://cdn.jsdelivr.net/npm/[email protected]/dist/index.css
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant unsafeWindow
// ==/UserScript==
(e=>{if(typeof GM_addStyle=="function"){GM_addStyle(e);return}const t=document.createElement("style");t.textContent=e,document.head.append(t)})(" .comment-checker[data-v-370017e7]{font-size:12px}.container[data-v-370017e7]{width:80%;margin:0 auto}.comment-checker[data-v-370017e7]{padding:15px 15px 11px;border-radius:8px;transition:background-color .3s}.title[data-v-370017e7]{font-weight:700;margin-bottom:6px}.message[data-v-370017e7]{margin-bottom:10px}.el-progress[data-v-370017e7]{margin-bottom:4px}.buttons[data-v-370017e7]>[data-v-370017e7]{display:inline-flex;align-items:center;padding:4px 8px;margin-left:-8px;color:#4b5e9d;border-radius:4px;transition:background-color .2s,color .2s;-webkit-user-select:none;user-select:none}.buttons[data-v-370017e7]>[data-v-370017e7]:hover{background-color:#0000000d}.buttons[data-v-370017e7]>[data-v-370017e7]:active{background-color:#0000001a}.comment-checker.not-check[data-v-370017e7]{background-color:#00f3}.comment-checker.normal[data-v-370017e7]{background-color:#0f03}.comment-checker.deleted[data-v-370017e7]{background-color:#f003}.comment-checker.shadow-ban[data-v-370017e7]{background-color:#ff03} ");
(function (vue, ElementPlus) {
'use strict';
function sleep(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, time);
});
}
function formatSecondsToMMSS(seconds) {
const sec = parseInt(seconds, 10);
const minutes = Math.floor(sec / 60);
const remainingSeconds = sec % 60;
const formattedMinutes = String(minutes).padStart(2, "0");
const formattedSeconds = String(remainingSeconds).padStart(2, "0");
return `${formattedMinutes}:${formattedSeconds}`;
}
const _export_sfc = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
const _hoisted_1 = { class: "title" };
const _hoisted_2 = { class: "message" };
const _hoisted_3 = { class: "buttons" };
const maxTimeSec = 120;
const _sfc_main = {
__name: "CommentChecker",
setup(__props) {
const check2 = vue.inject("check");
const commentRecord = vue.inject("commentRecord");
const onComplete = vue.inject("onComplete");
const interval = vue.inject("interval");
const stateClass = vue.ref("not-check");
const title = vue.ref("等待检查中……");
const message = vue.ref("");
const buttonText = vue.ref("取消");
let checked = false;
let completed = false;
let netErr = false;
const stripedFlow = vue.ref(false);
const currentTimeSec = vue.ref(0);
const percentage = vue.computed(() => {
if (currentTimeSec.value < 0 || currentTimeSec.value > maxTimeSec) {
return 100;
} else {
return currentTimeSec.value / maxTimeSec * 100;
}
});
function format() {
if (currentTimeSec.value < 0) {
return `--:-- / ${formatSecondsToMMSS(maxTimeSec)}`;
} else {
return `${formatSecondsToMMSS(currentTimeSec.value)} / ${formatSecondsToMMSS(maxTimeSec)}`;
}
}
function onButtonClick() {
if (completed) {
onComplete(commentRecord);
return;
}
if (checked && !netErr) {
completed = true;
message.value = "您已确认当前状态,检查完毕";
buttonText.value = "关闭";
} else {
completed = true;
onComplete(commentRecord);
}
}
let shown = null;
let startTime = Date.now() / 1e3;
async function startCheck() {
while (currentTimeSec.value < maxTimeSec || netErr) {
if (!netErr) {
for (let i = interval; i > 0; i--) {
message.value = "等待 " + i + "s 后检查评论状态";
await sleep(1e3);
currentTimeSec.value = Date.now() / 1e3 - startTime;
if (completed) {
return;
}
}
} else {
currentTimeSec.value = Date.now() / 1e3 - startTime;
if (completed) {
return;
}
}
message.value = "检查评论状态中……";
stripedFlow.value = true;
try {
await check2(commentRecord);
} catch (err) {
netErr = true;
title.value = "网络错误,获取当前状态失败";
buttonText.value = "取消";
stripedFlow.value = false;
console.error(err);
continue;
}
netErr = false;
stripedFlow.value = false;
if (commentRecord.currentState == "NORMAL") {
title.value = "当前状态:正常";
stateClass.value = "normal";
shown = commentRecord.currentState;
} else if (commentRecord.currentState == "SHADOW_BAN") {
title.value = "当前状态:仅自己可见";
stateClass.value = "shadow-ban";
shown = commentRecord.currentState;
} else if (commentRecord.currentState == "DELETED") {
title.value = "当前状态:已被删除";
stateClass.value = "deleted";
if (shown) {
completed = true;
message.value = `不用等了,你的评论检查到的状态先从 ${shown == "NORMAL" ? "正常" : "仅自己可见"} 再到删除,系统偷偷删了无疑。如果不信,你可以尝试编辑评论或添加回复来求证`;
buttonText.value = "关闭";
return;
}
}
checked = true;
buttonText.value = "确认此状态";
}
completed = true;
message.value = "观察时间已足够,当前状态可信,检查完毕";
buttonText.value = "关闭";
}
startCheck();
return (_ctx, _cache) => {
const _component_el_progress = vue.resolveComponent("el-progress");
return vue.openBlock(), vue.createElementBlock("div", {
class: vue.normalizeClass(["comment-checker", stateClass.value])
}, [
vue.createElementVNode("div", _hoisted_1, vue.toDisplayString(title.value), 1),
vue.createElementVNode("div", _hoisted_2, vue.toDisplayString(message.value), 1),
vue.createVNode(_component_el_progress, {
percentage: percentage.value,
striped: "",
format,
"striped-flow": stripedFlow.value
}, null, 8, ["percentage", "striped-flow"]),
vue.createElementVNode("div", _hoisted_3, [
vue.createElementVNode("span", { onClick: onButtonClick }, vue.toDisplayString(buttonText.value), 1)
])
], 2);
};
}
};
const CommentChecker = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-370017e7"]]);
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
var indexMinimal = {};
var minimal$1 = {};
var aspromise;
var hasRequiredAspromise;
function requireAspromise() {
if (hasRequiredAspromise) return aspromise;
hasRequiredAspromise = 1;
aspromise = asPromise;
function asPromise(fn, ctx) {
var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true;
while (index < arguments.length)
params[offset++] = arguments[index++];
return new Promise(function executor(resolve, reject) {
params[offset] = function callback(err) {
if (pending) {
pending = false;
if (err)
reject(err);
else {
var params2 = new Array(arguments.length - 1), offset2 = 0;
while (offset2 < params2.length)
params2[offset2++] = arguments[offset2];
resolve.apply(null, params2);
}
}
};
try {
fn.apply(ctx || null, params);
} catch (err) {
if (pending) {
pending = false;
reject(err);
}
}
});
}
return aspromise;
}
var base64 = {};
var hasRequiredBase64;
function requireBase64() {
if (hasRequiredBase64) return base64;
hasRequiredBase64 = 1;
(function(exports) {
var base642 = exports;
base642.length = function length(string) {
var p = string.length;
if (!p)
return 0;
var n = 0;
while (--p % 4 > 1 && string.charAt(p) === "=")
++n;
return Math.ceil(string.length * 3) / 4 - n;
};
var b64 = new Array(64);
var s64 = new Array(123);
for (var i = 0; i < 64; )
s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;
base642.encode = function encode(buffer, start, end) {
var parts = null, chunk = [];
var i2 = 0, j = 0, t;
while (start < end) {
var b = buffer[start++];
switch (j) {
case 0:
chunk[i2++] = b64[b >> 2];
t = (b & 3) << 4;
j = 1;
break;
case 1:
chunk[i2++] = b64[t | b >> 4];
t = (b & 15) << 2;
j = 2;
break;
case 2:
chunk[i2++] = b64[t | b >> 6];
chunk[i2++] = b64[b & 63];
j = 0;
break;
}
if (i2 > 8191) {
(parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));
i2 = 0;
}
}
if (j) {
chunk[i2++] = b64[t];
chunk[i2++] = 61;
if (j === 1)
chunk[i2++] = 61;
}
if (parts) {
if (i2)
parts.push(String.fromCharCode.apply(String, chunk.slice(0, i2)));
return parts.join("");
}
return String.fromCharCode.apply(String, chunk.slice(0, i2));
};
var invalidEncoding = "invalid encoding";
base642.decode = function decode(string, buffer, offset) {
var start = offset;
var j = 0, t;
for (var i2 = 0; i2 < string.length; ) {
var c = string.charCodeAt(i2++);
if (c === 61 && j > 1)
break;
if ((c = s64[c]) === void 0)
throw Error(invalidEncoding);
switch (j) {
case 0:
t = c;
j = 1;
break;
case 1:
buffer[offset++] = t << 2 | (c & 48) >> 4;
t = c;
j = 2;
break;
case 2:
buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;
t = c;
j = 3;
break;
case 3:
buffer[offset++] = (t & 3) << 6 | c;
j = 0;
break;
}
}
if (j === 1)
throw Error(invalidEncoding);
return offset - start;
};
base642.test = function test(string) {
return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);
};
})(base64);
return base64;
}
var eventemitter;
var hasRequiredEventemitter;
function requireEventemitter() {
if (hasRequiredEventemitter) return eventemitter;
hasRequiredEventemitter = 1;
eventemitter = EventEmitter;
function EventEmitter() {
this._listeners = {};
}
EventEmitter.prototype.on = function on(evt, fn, ctx) {
(this._listeners[evt] || (this._listeners[evt] = [])).push({
fn,
ctx: ctx || this
});
return this;
};
EventEmitter.prototype.off = function off(evt, fn) {
if (evt === void 0)
this._listeners = {};
else {
if (fn === void 0)
this._listeners[evt] = [];
else {
var listeners = this._listeners[evt];
for (var i = 0; i < listeners.length; )
if (listeners[i].fn === fn)
listeners.splice(i, 1);
else
++i;
}
}
return this;
};
EventEmitter.prototype.emit = function emit(evt) {
var listeners = this._listeners[evt];
if (listeners) {
var args = [], i = 1;
for (; i < arguments.length; )
args.push(arguments[i++]);
for (i = 0; i < listeners.length; )
listeners[i].fn.apply(listeners[i++].ctx, args);
}
return this;
};
return eventemitter;
}
var float;
var hasRequiredFloat;
function requireFloat() {
if (hasRequiredFloat) return float;
hasRequiredFloat = 1;
float = factory(factory);
function factory(exports) {
if (typeof Float32Array !== "undefined") (function() {
var f32 = new Float32Array([-0]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128;
function writeFloat_f32_cpy(val, buf, pos) {
f32[0] = val;
buf[pos] = f8b[0];
buf[pos + 1] = f8b[1];
buf[pos + 2] = f8b[2];
buf[pos + 3] = f8b[3];
}
function writeFloat_f32_rev(val, buf, pos) {
f32[0] = val;
buf[pos] = f8b[3];
buf[pos + 1] = f8b[2];
buf[pos + 2] = f8b[1];
buf[pos + 3] = f8b[0];
}
exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;
exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;
function readFloat_f32_cpy(buf, pos) {
f8b[0] = buf[pos];
f8b[1] = buf[pos + 1];
f8b[2] = buf[pos + 2];
f8b[3] = buf[pos + 3];
return f32[0];
}
function readFloat_f32_rev(buf, pos) {
f8b[3] = buf[pos];
f8b[2] = buf[pos + 1];
f8b[1] = buf[pos + 2];
f8b[0] = buf[pos + 3];
return f32[0];
}
exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;
exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;
})();
else (function() {
function writeFloat_ieee754(writeUint, val, buf, pos) {
var sign = val < 0 ? 1 : 0;
if (sign)
val = -val;
if (val === 0)
writeUint(1 / val > 0 ? (
/* positive */
0
) : (
/* negative 0 */
2147483648
), buf, pos);
else if (isNaN(val))
writeUint(2143289344, buf, pos);
else if (val > 34028234663852886e22)
writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);
else if (val < 11754943508222875e-54)
writeUint((sign << 31 | Math.round(val / 1401298464324817e-60)) >>> 0, buf, pos);
else {
var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;
writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);
}
}
exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);
exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);
function readFloat_ieee754(readUint, buf, pos) {
var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607;
return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 1401298464324817e-60 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);
}
exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);
exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);
})();
if (typeof Float64Array !== "undefined") (function() {
var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128;
function writeDouble_f64_cpy(val, buf, pos) {
f64[0] = val;
buf[pos] = f8b[0];
buf[pos + 1] = f8b[1];
buf[pos + 2] = f8b[2];
buf[pos + 3] = f8b[3];
buf[pos + 4] = f8b[4];
buf[pos + 5] = f8b[5];
buf[pos + 6] = f8b[6];
buf[pos + 7] = f8b[7];
}
function writeDouble_f64_rev(val, buf, pos) {
f64[0] = val;
buf[pos] = f8b[7];
buf[pos + 1] = f8b[6];
buf[pos + 2] = f8b[5];
buf[pos + 3] = f8b[4];
buf[pos + 4] = f8b[3];
buf[pos + 5] = f8b[2];
buf[pos + 6] = f8b[1];
buf[pos + 7] = f8b[0];
}
exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;
exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;
function readDouble_f64_cpy(buf, pos) {
f8b[0] = buf[pos];
f8b[1] = buf[pos + 1];
f8b[2] = buf[pos + 2];
f8b[3] = buf[pos + 3];
f8b[4] = buf[pos + 4];
f8b[5] = buf[pos + 5];
f8b[6] = buf[pos + 6];
f8b[7] = buf[pos + 7];
return f64[0];
}
function readDouble_f64_rev(buf, pos) {
f8b[7] = buf[pos];
f8b[6] = buf[pos + 1];
f8b[5] = buf[pos + 2];
f8b[4] = buf[pos + 3];
f8b[3] = buf[pos + 4];
f8b[2] = buf[pos + 5];
f8b[1] = buf[pos + 6];
f8b[0] = buf[pos + 7];
return f64[0];
}
exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;
exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;
})();
else (function() {
function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {
var sign = val < 0 ? 1 : 0;
if (sign)
val = -val;
if (val === 0) {
writeUint(0, buf, pos + off0);
writeUint(1 / val > 0 ? (
/* positive */
0
) : (
/* negative 0 */
2147483648
), buf, pos + off1);
} else if (isNaN(val)) {
writeUint(0, buf, pos + off0);
writeUint(2146959360, buf, pos + off1);
} else if (val > 17976931348623157e292) {
writeUint(0, buf, pos + off0);
writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);
} else {
var mantissa;
if (val < 22250738585072014e-324) {
mantissa = val / 5e-324;
writeUint(mantissa >>> 0, buf, pos + off0);
writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);
} else {
var exponent = Math.floor(Math.log(val) / Math.LN2);
if (exponent === 1024)
exponent = 1023;
mantissa = val * Math.pow(2, -exponent);
writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);
writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);
}
}
}
exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);
exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);
function readDouble_ieee754(readUint, off0, off1, buf, pos) {
var lo = readUint(buf, pos + off0), hi = readUint(buf, pos + off1);
var sign = (hi >> 31) * 2 + 1, exponent = hi >>> 20 & 2047, mantissa = 4294967296 * (hi & 1048575) + lo;
return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);
}
exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);
exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);
})();
return exports;
}
function writeUintLE(val, buf, pos) {
buf[pos] = val & 255;
buf[pos + 1] = val >>> 8 & 255;
buf[pos + 2] = val >>> 16 & 255;
buf[pos + 3] = val >>> 24;
}
function writeUintBE(val, buf, pos) {
buf[pos] = val >>> 24;
buf[pos + 1] = val >>> 16 & 255;
buf[pos + 2] = val >>> 8 & 255;
buf[pos + 3] = val & 255;
}
function readUintLE(buf, pos) {
return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0;
}
function readUintBE(buf, pos) {
return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0;
}
return float;
}
var inquire_1;
var hasRequiredInquire;
function requireInquire() {
if (hasRequiredInquire) return inquire_1;
hasRequiredInquire = 1;
inquire_1 = inquire;
function inquire(moduleName) {
try {
var mod = eval("quire".replace(/^/, "re"))(moduleName);
if (mod && (mod.length || Object.keys(mod).length))
return mod;
} catch (e) {
}
return null;
}
return inquire_1;
}
var utf8 = {};
var hasRequiredUtf8;
function requireUtf8() {
if (hasRequiredUtf8) return utf8;
hasRequiredUtf8 = 1;
(function(exports) {
var utf82 = exports;
utf82.length = function utf8_length(string) {
var len = 0, c = 0;
for (var i = 0; i < string.length; ++i) {
c = string.charCodeAt(i);
if (c < 128)
len += 1;
else if (c < 2048)
len += 2;
else if ((c & 64512) === 55296 && (string.charCodeAt(i + 1) & 64512) === 56320) {
++i;
len += 4;
} else
len += 3;
}
return len;
};
utf82.read = function utf8_read(buffer, start, end) {
var len = end - start;
if (len < 1)
return "";
var parts = null, chunk = [], i = 0, t;
while (start < end) {
t = buffer[start++];
if (t < 128)
chunk[i++] = t;
else if (t > 191 && t < 224)
chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;
else if (t > 239 && t < 365) {
t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 65536;
chunk[i++] = 55296 + (t >> 10);
chunk[i++] = 56320 + (t & 1023);
} else
chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;
if (i > 8191) {
(parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));
i = 0;
}
}
if (parts) {
if (i)
parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));
return parts.join("");
}
return String.fromCharCode.apply(String, chunk.slice(0, i));
};
utf82.write = function utf8_write(string, buffer, offset) {
var start = offset, c1, c2;
for (var i = 0; i < string.length; ++i) {
c1 = string.charCodeAt(i);
if (c1 < 128) {
buffer[offset++] = c1;
} else if (c1 < 2048) {
buffer[offset++] = c1 >> 6 | 192;
buffer[offset++] = c1 & 63 | 128;
} else if ((c1 & 64512) === 55296 && ((c2 = string.charCodeAt(i + 1)) & 64512) === 56320) {
c1 = 65536 + ((c1 & 1023) << 10) + (c2 & 1023);
++i;
buffer[offset++] = c1 >> 18 | 240;
buffer[offset++] = c1 >> 12 & 63 | 128;
buffer[offset++] = c1 >> 6 & 63 | 128;
buffer[offset++] = c1 & 63 | 128;
} else {
buffer[offset++] = c1 >> 12 | 224;
buffer[offset++] = c1 >> 6 & 63 | 128;
buffer[offset++] = c1 & 63 | 128;
}
}
return offset - start;
};
})(utf8);
return utf8;
}
var pool_1;
var hasRequiredPool;
function requirePool() {
if (hasRequiredPool) return pool_1;
hasRequiredPool = 1;
pool_1 = pool;
function pool(alloc, slice, size) {
var SIZE = size || 8192;
var MAX = SIZE >>> 1;
var slab = null;
var offset = SIZE;
return function pool_alloc(size2) {
if (size2 < 1 || size2 > MAX)
return alloc(size2);
if (offset + size2 > SIZE) {
slab = alloc(SIZE);
offset = 0;
}
var buf = slice.call(slab, offset, offset += size2);
if (offset & 7)
offset = (offset | 7) + 1;
return buf;
};
}
return pool_1;
}
var longbits;
var hasRequiredLongbits;
function requireLongbits() {
if (hasRequiredLongbits) return longbits;
hasRequiredLongbits = 1;
longbits = LongBits;
var util = requireMinimal$1();
function LongBits(lo, hi) {
this.lo = lo >>> 0;
this.hi = hi >>> 0;
}
var zero = LongBits.zero = new LongBits(0, 0);
zero.toNumber = function() {
return 0;
};
zero.zzEncode = zero.zzDecode = function() {
return this;
};
zero.length = function() {
return 1;
};
var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0";
LongBits.fromNumber = function fromNumber(value) {
if (value === 0)
return zero;
var sign = value < 0;
if (sign)
value = -value;
var lo = value >>> 0, hi = (value - lo) / 4294967296 >>> 0;
if (sign) {
hi = ~hi >>> 0;
lo = ~lo >>> 0;
if (++lo > 4294967295) {
lo = 0;
if (++hi > 4294967295)
hi = 0;
}
}
return new LongBits(lo, hi);
};
LongBits.from = function from(value) {
if (typeof value === "number")
return LongBits.fromNumber(value);
if (util.isString(value)) {
if (util.Long)
value = util.Long.fromString(value);
else
return LongBits.fromNumber(parseInt(value, 10));
}
return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;
};
LongBits.prototype.toNumber = function toNumber(unsigned) {
if (!unsigned && this.hi >>> 31) {
var lo = ~this.lo + 1 >>> 0, hi = ~this.hi >>> 0;
if (!lo)
hi = hi + 1 >>> 0;
return -(lo + hi * 4294967296);
}
return this.lo + this.hi * 4294967296;
};
LongBits.prototype.toLong = function toLong(unsigned) {
return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };
};
var charCodeAt = String.prototype.charCodeAt;
LongBits.fromHash = function fromHash(hash) {
if (hash === zeroHash)
return zero;
return new LongBits(
(charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0,
(charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0
);
};
LongBits.prototype.toHash = function toHash() {
return String.fromCharCode(
this.lo & 255,
this.lo >>> 8 & 255,
this.lo >>> 16 & 255,
this.lo >>> 24,
this.hi & 255,
this.hi >>> 8 & 255,
this.hi >>> 16 & 255,
this.hi >>> 24
);
};
LongBits.prototype.zzEncode = function zzEncode() {
var mask = this.hi >> 31;
this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;
this.lo = (this.lo << 1 ^ mask) >>> 0;
return this;
};
LongBits.prototype.zzDecode = function zzDecode() {
var mask = -(this.lo & 1);
this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;
this.hi = (this.hi >>> 1 ^ mask) >>> 0;
return this;
};
LongBits.prototype.length = function length() {
var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24;
return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10;
};
return longbits;
}
var hasRequiredMinimal$1;
function requireMinimal$1() {
if (hasRequiredMinimal$1) return minimal$1;
hasRequiredMinimal$1 = 1;
(function(exports) {
var util = exports;
util.asPromise = requireAspromise();
util.base64 = requireBase64();
util.EventEmitter = requireEventemitter();
util.float = requireFloat();
util.inquire = requireInquire();
util.utf8 = requireUtf8();
util.pool = requirePool();
util.LongBits = requireLongbits();
util.isNode = Boolean(typeof commonjsGlobal !== "undefined" && commonjsGlobal && commonjsGlobal.process && commonjsGlobal.process.versions && commonjsGlobal.process.versions.node);
util.global = util.isNode && commonjsGlobal || typeof window !== "undefined" && window || typeof self !== "undefined" && self || minimal$1;
util.emptyArray = Object.freeze ? Object.freeze([]) : (
/* istanbul ignore next */
[]
);
util.emptyObject = Object.freeze ? Object.freeze({}) : (
/* istanbul ignore next */
{}
);
util.isInteger = Number.isInteger || /* istanbul ignore next */
function isInteger(value) {
return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};
util.isString = function isString(value) {
return typeof value === "string" || value instanceof String;
};
util.isObject = function isObject(value) {
return value && typeof value === "object";
};
util.isset = /**
* Checks if a property on a message is considered to be present.
* @param {Object} obj Plain object or message instance
* @param {string} prop Property name
* @returns {boolean} `true` if considered to be present, otherwise `false`
*/
util.isSet = function isSet(obj, prop) {
var value = obj[prop];
if (value != null && obj.hasOwnProperty(prop))
return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;
return false;
};
util.Buffer = function() {
try {
var Buffer = util.inquire("buffer").Buffer;
return Buffer.prototype.utf8Write ? Buffer : (
/* istanbul ignore next */
null
);
} catch (e) {
return null;
}
}();
util._Buffer_from = null;
util._Buffer_allocUnsafe = null;
util.newBuffer = function newBuffer(sizeOrArray) {
return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray);
};
util.Array = typeof Uint8Array !== "undefined" ? Uint8Array : Array;
util.Long = /* istanbul ignore next */
util.global.dcodeIO && /* istanbul ignore next */
util.global.dcodeIO.Long || /* istanbul ignore next */
util.global.Long || util.inquire("long");
util.key2Re = /^true|false|0|1$/;
util.key32Re = /^-?(?:0|[1-9][0-9]*)$/;
util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;
util.longToHash = function longToHash(value) {
return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash;
};
util.longFromHash = function longFromHash(hash, unsigned) {
var bits = util.LongBits.fromHash(hash);
if (util.Long)
return util.Long.fromBits(bits.lo, bits.hi, unsigned);
return bits.toNumber(Boolean(unsigned));
};
function merge(dst, src, ifNotSet) {
for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)
if (dst[keys[i]] === void 0 || !ifNotSet)
dst[keys[i]] = src[keys[i]];
return dst;
}
util.merge = merge;
util.lcFirst = function lcFirst(str) {
return str.charAt(0).toLowerCase() + str.substring(1);
};
function newError(name) {
function CustomError(message, properties) {
if (!(this instanceof CustomError))
return new CustomError(message, properties);
Object.defineProperty(this, "message", { get: function() {
return message;
} });
if (Error.captureStackTrace)
Error.captureStackTrace(this, CustomError);
else
Object.defineProperty(this, "stack", { value: new Error().stack || "" });
if (properties)
merge(this, properties);
}
CustomError.prototype = Object.create(Error.prototype, {
constructor: {
value: CustomError,
writable: true,
enumerable: false,
configurable: true
},
name: {
get: function get() {
return name;
},
set: void 0,
enumerable: false,
// configurable: false would accurately preserve the behavior of
// the original, but I'm guessing that was not intentional.
// For an actual error subclass, this property would
// be configurable.
configurable: true
},
toString: {
value: function value() {
return this.name + ": " + this.message;
},
writable: true,
enumerable: false,
configurable: true
}
});
return CustomError;
}
util.newError = newError;
util.ProtocolError = newError("ProtocolError");
util.oneOfGetter = function getOneOf(fieldNames) {
var fieldMap = {};
for (var i = 0; i < fieldNames.length; ++i)
fieldMap[fieldNames[i]] = 1;
return function() {
for (var keys = Object.keys(this), i2 = keys.length - 1; i2 > -1; --i2)
if (fieldMap[keys[i2]] === 1 && this[keys[i2]] !== void 0 && this[keys[i2]] !== null)
return keys[i2];
};
};
util.oneOfSetter = function setOneOf(fieldNames) {
return function(name) {
for (var i = 0; i < fieldNames.length; ++i)
if (fieldNames[i] !== name)
delete this[fieldNames[i]];
};
};
util.toJSONOptions = {
longs: String,
enums: String,
bytes: String,
json: true
};
util._configure = function() {
var Buffer = util.Buffer;
if (!Buffer) {
util._Buffer_from = util._Buffer_allocUnsafe = null;
return;
}
util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from || /* istanbul ignore next */
function Buffer_from(value, encoding) {
return new Buffer(value, encoding);
};
util._Buffer_allocUnsafe = Buffer.allocUnsafe || /* istanbul ignore next */
function Buffer_allocUnsafe(size) {
return new Buffer(size);
};
};
})(minimal$1);
return minimal$1;
}
var writer;
var hasRequiredWriter;
function requireWriter() {
if (hasRequiredWriter) return writer;
hasRequiredWriter = 1;
writer = Writer;
var util = requireMinimal$1();
var BufferWriter;
var LongBits = util.LongBits, base642 = util.base64, utf82 = util.utf8;
function Op(fn, len, val) {
this.fn = fn;
this.len = len;
this.next = void 0;
this.val = val;
}
function noop() {
}
function State(writer2) {
this.head = writer2.head;
this.tail = writer2.tail;
this.len = writer2.len;
this.next = writer2.states;
}
function Writer() {
this.len = 0;
this.head = new Op(noop, 0, 0);
this.tail = this.head;
this.states = null;
}
var create = function create2() {
return util.Buffer ? function create_buffer_setup() {
return (Writer.create = function create_buffer() {
return new BufferWriter();
})();
} : function create_array() {
return new Writer();
};
};
Writer.create = create();
Writer.alloc = function alloc(size) {
return new util.Array(size);
};
if (util.Array !== Array)
Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);
Writer.prototype._push = function push(fn, len, val) {
this.tail = this.tail.next = new Op(fn, len, val);
this.len += len;
return this;
};
function writeByte(val, buf, pos) {
buf[pos] = val & 255;
}
function writeVarint32(val, buf, pos) {
while (val > 127) {
buf[pos++] = val & 127 | 128;
val >>>= 7;
}
buf[pos] = val;
}
function VarintOp(len, val) {
this.len = len;
this.next = void 0;
this.val = val;
}
VarintOp.prototype = Object.create(Op.prototype);
VarintOp.prototype.fn = writeVarint32;
Writer.prototype.uint32 = function write_uint32(value) {
this.len += (this.tail = this.tail.next = new VarintOp(
(value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5,
value
)).len;
return this;
};
Writer.prototype.int32 = function write_int32(value) {
return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) : this.uint32(value);
};
Writer.prototype.sint32 = function write_sint32(value) {
return this.uint32((value << 1 ^ value >> 31) >>> 0);
};
function writeVarint64(val, buf, pos) {
while (val.hi) {
buf[pos++] = val.lo & 127 | 128;
val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;
val.hi >>>= 7;
}
while (val.lo > 127) {
buf[pos++] = val.lo & 127 | 128;
val.lo = val.lo >>> 7;
}
buf[pos++] = val.lo;
}
Writer.prototype.uint64 = function write_uint64(value) {
var bits = LongBits.from(value);
return this._push(writeVarint64, bits.length(), bits);
};
Writer.prototype.int64 = Writer.prototype.uint64;
Writer.prototype.sint64 = function write_sint64(value) {
var bits = LongBits.from(value).zzEncode();
return this._push(writeVarint64, bits.length(), bits);
};
Writer.prototype.bool = function write_bool(value) {
return this._push(writeByte, 1, value ? 1 : 0);
};
function writeFixed32(val, buf, pos) {
buf[pos] = val & 255;
buf[pos + 1] = val >>> 8 & 255;
buf[pos + 2] = val >>> 16 & 255;
buf[pos + 3] = val >>> 24;
}
Writer.prototype.fixed32 = function write_fixed32(value) {
return this._push(writeFixed32, 4, value >>> 0);
};
Writer.prototype.sfixed32 = Writer.prototype.fixed32;
Writer.prototype.fixed64 = function write_fixed64(value) {
var bits = LongBits.from(value);
return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);
};
Writer.prototype.sfixed64 = Writer.prototype.fixed64;
Writer.prototype.float = function write_float(value) {
return this._push(util.float.writeFloatLE, 4, value);
};
Writer.prototype.double = function write_double(value) {
return this._push(util.float.writeDoubleLE, 8, value);
};
var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) {
buf.set(val, pos);
} : function writeBytes_for(val, buf, pos) {
for (var i = 0; i < val.length; ++i)
buf[pos + i] = val[i];
};
Writer.prototype.bytes = function write_bytes(value) {
var len = value.length >>> 0;
if (!len)
return this._push(writeByte, 1, 0);
if (util.isString(value)) {
var buf = Writer.alloc(len = base642.length(value));
base642.decode(value, buf, 0);
value = buf;
}
return this.uint32(len)._push(writeBytes, len, value);
};
Writer.prototype.string = function write_string(value) {
var len = utf82.length(value);
return len ? this.uint32(len)._push(utf82.write, len, value) : this._push(writeByte, 1, 0);
};
Writer.prototype.fork = function fork() {
this.states = new State(this);
this.head = this.tail = new Op(noop, 0, 0);
this.len = 0;
return this;
};
Writer.prototype.reset = function reset() {
if (this.states) {
this.head = this.states.head;
this.tail = this.states.tail;
this.len = this.states.len;
this.states = this.states.next;
} else {
this.head = this.tail = new Op(noop, 0, 0);
this.len = 0;
}
return this;
};
Writer.prototype.ldelim = function ldelim() {
var head = this.head, tail = this.tail, len = this.len;
this.reset().uint32(len);
if (len) {
this.tail.next = head.next;
this.tail = tail;
this.len += len;
}
return this;
};
Writer.prototype.finish = function finish() {
var head = this.head.next, buf = this.constructor.alloc(this.len), pos = 0;
while (head) {
head.fn(head.val, buf, pos);
pos += head.len;
head = head.next;
}
return buf;
};
Writer._configure = function(BufferWriter_) {
BufferWriter = BufferWriter_;
Writer.create = create();
BufferWriter._configure();
};
return writer;
}
var writer_buffer;
var hasRequiredWriter_buffer;
function requireWriter_buffer() {
if (hasRequiredWriter_buffer) return writer_buffer;
hasRequiredWriter_buffer = 1;
writer_buffer = BufferWriter;
var Writer = requireWriter();
(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;
var util = requireMinimal$1();
function BufferWriter() {
Writer.call(this);
}
BufferWriter._configure = function() {
BufferWriter.alloc = util._Buffer_allocUnsafe;
BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) {
buf.set(val, pos);
} : function writeBytesBuffer_copy(val, buf, pos) {
if (val.copy)
val.copy(buf, pos, 0, val.length);
else for (var i = 0; i < val.length; )
buf[pos++] = val[i++];
};
};
BufferWriter.prototype.bytes = function write_bytes_buffer(value) {
if (util.isString(value))
value = util._Buffer_from(value, "base64");
var len = value.length >>> 0;
this.uint32(len);
if (len)
this._push(BufferWriter.writeBytesBuffer, len, value);
return this;
};
function writeStringBuffer(val, buf, pos) {
if (val.length < 40)
util.utf8.write(val, buf, pos);
else if (buf.utf8Write)
buf.utf8Write(val, pos);
else
buf.write(val, pos);
}
BufferWriter.prototype.string = function write_string_buffer(value) {
var len = util.Buffer.byteLength(value);
this.uint32(len);
if (len)
this._push(writeStringBuffer, len, value);
return this;
};
BufferWriter._configure();
return writer_buffer;
}
var reader;
var hasRequiredReader;
function requireReader() {
if (hasRequiredReader) return reader;
hasRequiredReader = 1;
reader = Reader;
var util = requireMinimal$1();
var BufferReader;
var LongBits = util.LongBits, utf82 = util.utf8;
function indexOutOfRange(reader2, writeLength) {
return RangeError("index out of range: " + reader2.pos + " + " + (writeLength || 1) + " > " + reader2.len);
}
function Reader(buffer) {
this.buf = buffer;
this.pos = 0;
this.len = buffer.length;
}
var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) {
if (buffer instanceof Uint8Array || Array.isArray(buffer))
return new Reader(buffer);
throw Error("illegal buffer");
} : function create_array2(buffer) {
if (Array.isArray(buffer))
return new Reader(buffer);
throw Error("illegal buffer");
};
var create = function create2() {
return util.Buffer ? function create_buffer_setup(buffer) {
return (Reader.create = function create_buffer(buffer2) {
return util.Buffer.isBuffer(buffer2) ? new BufferReader(buffer2) : create_array(buffer2);
})(buffer);
} : create_array;
};
Reader.create = create();
Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */
util.Array.prototype.slice;
Reader.prototype.uint32 = /* @__PURE__ */ function read_uint32_setup() {
var value = 4294967295;
return function read_uint32() {
value = (this.buf[this.pos] & 127) >>> 0;
if (this.buf[this.pos++] < 128) return value;
value = (value | (this.buf[this.pos] & 127) << 7) >>> 0;
if (this.buf[this.pos++] < 128) return value;
value = (value | (this.buf[this.pos] & 127) << 14) >>> 0;
if (this.buf[this.pos++] < 128) return value;
value = (value | (this.buf[this.pos] & 127) << 21) >>> 0;
if (this.buf[this.pos++] < 128) return value;
value = (value | (this.buf[this.pos] & 15) << 28) >>> 0;
if (this.buf[this.pos++] < 128) return value;
if ((this.pos += 5) > this.len) {
this.pos = this.len;
throw indexOutOfRange(this, 10);
}
return value;
};
}();
Reader.prototype.int32 = function read_int32() {
return this.uint32() | 0;
};
Reader.prototype.sint32 = function read_sint32() {
var value = this.uint32();
return value >>> 1 ^ -(value & 1) | 0;
};
function readLongVarint() {
var bits = new LongBits(0, 0);
var i = 0;
if (this.len - this.pos > 4) {
for (; i < 4; ++i) {
bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;
if (this.buf[this.pos++] < 128)
return bits;
}
bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;
bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;
if (this.buf[this.pos++] < 128)
return bits;
i = 0;
} else {
for (; i < 3; ++i) {
if (this.pos >= this.len)
throw indexOutOfRange(this);
bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;
if (this.buf[this.pos++] < 128)
return bits;
}
bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;
return bits;
}
if (this.len - this.pos > 4) {
for (; i < 5; ++i) {
bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;
if (this.buf[this.pos++] < 128)
return bits;
}
} else {
for (; i < 5; ++i) {
if (this.pos >= this.len)
throw indexOutOfRange(this);
bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;
if (this.buf[this.pos++] < 128)
return bits;
}
}
throw Error("invalid varint encoding");
}
Reader.prototype.bool = function read_bool() {
return this.uint32() !== 0;
};
function readFixed32_end(buf, end) {
return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0;
}
Reader.prototype.fixed32 = function read_fixed32() {
if (this.pos + 4 > this.len)
throw indexOutOfRange(this, 4);
return readFixed32_end(this.buf, this.pos += 4);
};
Reader.prototype.sfixed32 = function read_sfixed32() {
if (this.pos + 4 > this.len)
throw indexOutOfRange(this, 4);
return readFixed32_end(this.buf, this.pos += 4) | 0;
};
function readFixed64() {
if (this.pos + 8 > this.len)
throw indexOutOfRange(this, 8);
return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));
}
Reader.prototype.float = function read_float() {
if (this.pos + 4 > this.len)
throw indexOutOfRange(this, 4);
var value = util.float.readFloatLE(this.buf, this.pos);
this.pos += 4;
return value;
};
Reader.prototype.double = function read_double() {
if (this.pos + 8 > this.len)
throw indexOutOfRange(this, 4);
var value = util.float.readDoubleLE(this.buf, this.pos);
this.pos += 8;
return value;
};
Reader.prototype.bytes = function read_bytes() {
var length = this.uint32(), start = this.pos, end = this.pos + length;
if (end > this.len)
throw indexOutOfRange(this, length);
this.pos += length;
if (Array.isArray(this.buf))
return this.buf.slice(start, end);
if (start === end) {
var nativeBuffer = util.Buffer;
return nativeBuffer ? nativeBuffer.alloc(0) : new this.buf.constructor(0);
}
return this._slice.call(this.buf, start, end);
};
Reader.prototype.string = function read_string() {
var bytes = this.bytes();
return utf82.read(bytes, 0, bytes.length);
};
Reader.prototype.skip = function skip(length) {
if (typeof length === "number") {
if (this.pos + length > this.len)
throw indexOutOfRange(this, length);
this.pos += length;
} else {
do {
if (this.pos >= this.len)
throw indexOutOfRange(this);
} while (this.buf[this.pos++] & 128);
}
return this;
};
Reader.prototype.skipType = function(wireType) {
switch (wireType) {
case 0:
this.skip();
break;
case 1:
this.skip(8);
break;
case 2:
this.skip(this.uint32());
break;
case 3:
while ((wireType = this.uint32() & 7) !== 4) {
this.skipType(wireType);
}
break;
case 5:
this.skip(4);
break;
/* istanbul ignore next */
default:
throw Error("invalid wire type " + wireType + " at offset " + this.pos);
}
return this;
};
Reader._configure = function(BufferReader_) {
BufferReader = BufferReader_;
Reader.create = create();
BufferReader._configure();
var fn = util.Long ? "toLong" : (
/* istanbul ignore next */
"toNumber"
);
util.merge(Reader.prototype, {
int64: function read_int64() {
return readLongVarint.call(this)[fn](false);
},
uint64: function read_uint64() {
return readLongVarint.call(this)[fn](true);
},
sint64: function read_sint64() {
return readLongVarint.call(this).zzDecode()[fn](false);
},
fixed64: function read_fixed64() {
return readFixed64.call(this)[fn](true);
},
sfixed64: function read_sfixed64() {
return readFixed64.call(this)[fn](false);
}
});
};
return reader;
}
var reader_buffer;
var hasRequiredReader_buffer;
function requireReader_buffer() {
if (hasRequiredReader_buffer) return reader_buffer;
hasRequiredReader_buffer = 1;
reader_buffer = BufferReader;
var Reader = requireReader();
(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;
var util = requireMinimal$1();
function BufferReader(buffer) {
Reader.call(this, buffer);
}
BufferReader._configure = function() {
if (util.Buffer)
BufferReader.prototype._slice = util.Buffer.prototype.slice;
};
BufferReader.prototype.string = function read_string_buffer() {
var len = this.uint32();
return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len));
};
BufferReader._configure();
return reader_buffer;
}
var rpc = {};
var service;
var hasRequiredService;
function requireService() {
if (hasRequiredService) return service;
hasRequiredService = 1;
service = Service;
var util = requireMinimal$1();
(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;
function Service(rpcImpl, requestDelimited, responseDelimited) {
if (typeof rpcImpl !== "function")
throw TypeError("rpcImpl must be a function");
util.EventEmitter.call(this);
this.rpcImpl = rpcImpl;
this.requestDelimited = Boolean(requestDelimited);
this.responseDelimited = Boolean(responseDelimited);
}
Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {
if (!request)
throw TypeError("request must be specified");
var self2 = this;
if (!callback)
return util.asPromise(rpcCall, self2, method, requestCtor, responseCtor, request);
if (!self2.rpcImpl) {
setTimeout(function() {
callback(Error("already ended"));
}, 0);
return void 0;
}
try {
return self2.rpcImpl(
method,
requestCtor[self2.requestDelimited ? "encodeDelimited" : "encode"](request).finish(),
function rpcCallback(err, response) {
if (err) {
self2.emit("error", err, method);
return callback(err);
}
if (response === null) {
self2.end(
/* endedByRPC */
true
);
return void 0;
}
if (!(response instanceof responseCtor)) {
try {
response = responseCtor[self2.responseDelimited ? "decodeDelimited" : "decode"](response);
} catch (err2) {
self2.emit("error", err2, method);
return callback(err2);
}
}
self2.emit("data", response, method);
return callback(null, response);
}
);
} catch (err) {
self2.emit("error", err, method);
setTimeout(function() {
callback(err);
}, 0);
return void 0;
}
};
Service.prototype.end = function end(endedByRPC) {
if (this.rpcImpl) {
if (!endedByRPC)
this.rpcImpl(null, null, null);
this.rpcImpl = null;
this.emit("end").off();
}
return this;
};
return service;
}
var hasRequiredRpc;
function requireRpc() {
if (hasRequiredRpc) return rpc;
hasRequiredRpc = 1;
(function(exports) {
var rpc2 = exports;
rpc2.Service = requireService();
})(rpc);
return rpc;
}
var roots;
var hasRequiredRoots;
function requireRoots() {
if (hasRequiredRoots) return roots;
hasRequiredRoots = 1;
roots = {};
return roots;
}
var hasRequiredIndexMinimal;
function requireIndexMinimal() {
if (hasRequiredIndexMinimal) return indexMinimal;
hasRequiredIndexMinimal = 1;
(function(exports) {
var protobuf = exports;
protobuf.build = "minimal";
protobuf.Writer = requireWriter();
protobuf.BufferWriter = requireWriter_buffer();
protobuf.Reader = requireReader();
protobuf.BufferReader = requireReader_buffer();
protobuf.util = requireMinimal$1();
protobuf.rpc = requireRpc();
protobuf.roots = requireRoots();
protobuf.configure = configure;
function configure() {
protobuf.util._configure();
protobuf.Writer._configure(protobuf.BufferWriter);
protobuf.Reader._configure(protobuf.BufferReader);
}
configure();
})(indexMinimal);
return indexMinimal;
}
var minimal;
var hasRequiredMinimal;
function requireMinimal() {
if (hasRequiredMinimal) return minimal;
hasRequiredMinimal = 1;
minimal = requireIndexMinimal();
return minimal;
}
var minimalExports = requireMinimal();
const $Writer = minimalExports.Writer;
const $root = minimalExports.roots["default"] || (minimalExports.roots["default"] = {});
const NextContinuation = $root.NextContinuation = (() => {
function NextContinuation2(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
NextContinuation2.prototype.commentAreaWrapper = null;
NextContinuation2.prototype.uField3 = 0;
NextContinuation2.prototype.mainCommentRequest = null;
NextContinuation2.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.commentAreaWrapper != null && Object.hasOwnProperty.call(m, "commentAreaWrapper"))
$root.CommentAreaWrapper.encode(m.commentAreaWrapper, w.uint32(18).fork()).ldelim();
if (m.uField3 != null && Object.hasOwnProperty.call(m, "uField3"))
w.uint32(24).int32(m.uField3);
if (m.mainCommentRequest != null && Object.hasOwnProperty.call(m, "mainCommentRequest"))
$root.MainCommentRequest.encode(m.mainCommentRequest, w.uint32(50).fork()).ldelim();
return w;
};
return NextContinuation2;
})();
$root.CommentAreaWrapper = (() => {
function CommentAreaWrapper(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
CommentAreaWrapper.prototype.videoId = "";
CommentAreaWrapper.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.videoId != null && Object.hasOwnProperty.call(m, "videoId"))
w.uint32(18).string(m.videoId);
return w;
};
return CommentAreaWrapper;
})();
$root.MainCommentRequest = (() => {
function MainCommentRequest(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
MainCommentRequest.prototype.commentParameters = null;
MainCommentRequest.prototype.sectionIdentifier = "";
MainCommentRequest.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.commentParameters != null && Object.hasOwnProperty.call(m, "commentParameters"))
$root.CommentParameters.encode(m.commentParameters, w.uint32(34).fork()).ldelim();
if (m.sectionIdentifier != null && Object.hasOwnProperty.call(m, "sectionIdentifier"))
w.uint32(66).string(m.sectionIdentifier);
return w;
};
return MainCommentRequest;
})();
$root.CommentParameters = (() => {
function CommentParameters(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
CommentParameters.prototype.videoId = "";
CommentParameters.prototype.postId = "";
CommentParameters.prototype.channelId = "";
CommentParameters.prototype.sortType = 0;
CommentParameters.prototype.targetCommentId = "";
CommentParameters.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.videoId != null && Object.hasOwnProperty.call(m, "videoId"))
w.uint32(34).string(m.videoId);
if (m.sortType != null && Object.hasOwnProperty.call(m, "sortType"))
w.uint32(48).int32(m.sortType);
if (m.targetCommentId != null && Object.hasOwnProperty.call(m, "targetCommentId"))
w.uint32(130).string(m.targetCommentId);
if (m.postId != null && Object.hasOwnProperty.call(m, "postId"))
w.uint32(234).string(m.postId);
if (m.channelId != null && Object.hasOwnProperty.call(m, "channelId"))
w.uint32(242).string(m.channelId);
return w;
};
CommentParameters.SortType = function() {
const valuesById = {}, values = Object.create(valuesById);
values[valuesById[0] = "HOT"] = 0;
values[valuesById[1] = "LATEST"] = 1;
return values;
}();
return CommentParameters;
})();
const BrowserContinuation = $root.BrowserContinuation = (() => {
function BrowserContinuation2(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
BrowserContinuation2.prototype.request = null;
BrowserContinuation2.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.request != null && Object.hasOwnProperty.call(m, "request"))
$root.BrowserContinuation.Request.encode(m.request, w.uint32(641815778).fork()).ldelim();
return w;
};
BrowserContinuation2.Request = function() {
function Request(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
Request.prototype.description = "";
Request.prototype.continuationBase64 = "";
Request.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.description != null && Object.hasOwnProperty.call(m, "description"))
w.uint32(18).string(m.description);
if (m.continuationBase64 != null && Object.hasOwnProperty.call(m, "continuationBase64"))
w.uint32(26).string(m.continuationBase64);
return w;
};
return Request;
}();
return BrowserContinuation2;
})();
const BrowserCommentListContinuation = $root.BrowserCommentListContinuation = (() => {
function BrowserCommentListContinuation2(p) {
if (p) {
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
}
BrowserCommentListContinuation2.prototype.description = "";
BrowserCommentListContinuation2.prototype.mainCommentRequest = null;
BrowserCommentListContinuation2.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.description != null && Object.hasOwnProperty.call(m, "description"))
w.uint32(18).string(m.description);
if (m.mainCommentRequest != null && Object.hasOwnProperty.call(m, "mainCommentRequest"))
$root.MainCommentRequest.encode(m.mainCommentRequest, w.uint32(426).fork()).ldelim();
return w;
};
return BrowserCommentListContinuation2;
})();
var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
const cssLoader = (e) => {
const t = GM_getResourceText(e);
return GM_addStyle(t), t;
};
cssLoader("element-plus/dist/index.css");
const originalFetch = _unsafeWindow.fetch;
var authorizationCache = null;
var contextCache = null;
function createUrl(path) {
return new URL(new URL(window.location.href).origin + path);
}
function waitForElement(observeSelector, targetSelector) {
return new Promise((resolve) => {
const parent = document.querySelector(observeSelector);
if (!parent) return;
const found = parent.querySelector(targetSelector);
if (found) {
resolve(found);
return;
}
const observer = new MutationObserver(() => {
const el = parent.querySelector(targetSelector);
if (el) {
observer.disconnect();
resolve(el);
}
});
observer.observe(parent, { childList: true, subtree: true });
});
}
async function findComment(commentRecord, isLogin = true) {
let continuation;
let requestUrl;
if (commentRecord.webPageType == "WEB_PAGE_TYPE_WATCH") {
let payload = {
uField3: 6,
commentAreaWrapper: {
videoId: commentRecord.commentAreaInfo.videoId
},
mainCommentRequest: {
sectionIdentifier: "comments-section",
commentParameters: {
videoId: commentRecord.commentAreaInfo.videoId,
targetCommentId: commentRecord.commentId
}
}
};
let encoded = NextContinuation.encode(payload);
let buffer = encoded.finish();
continuation = btoa(String.fromCharCode(...buffer));
continuation = continuation.replaceAll("=", "%3D");
requestUrl = "https://www.youtube.com/youtubei/v1/next?prettyPrint=false";
} else if (commentRecord.webPageType == "WEB_PAGE_TYPE_BROWSE") {
let payload = {
description: "community",
mainCommentRequest: {
sectionIdentifier: "comments-section",
commentParameters: {
channelId: commentRecord.commentAreaInfo.channelId,
postId: commentRecord.commentAreaInfo.postId,
targetCommentId: commentRecord.commentId
}
}
};
let encoded = BrowserCommentListContinuation.encode(payload);
let buffer = encoded.finish();
continuation = btoa(String.fromCharCode(...buffer));
continuation = continuation.replaceAll("=", "%3D");
payload = {
request: {
description: "FEcomment_post_detail_page_web_top_level",
continuationBase64: continuation
}
};
encoded = BrowserContinuation.encode(payload);
buffer = encoded.finish();
continuation = btoa(String.fromCharCode(...buffer));
continuation = continuation.replaceAll("=", "%3D");
requestUrl = "https://www.youtube.com/youtubei/v1/browse?prettyPrint=false";
} else {
throw new Error("Unsupported webPageType : " + commentRecord.webPageType);
}
let data = {
context: contextCache,
continuation
};
let headers = {};
if (isLogin) {
headers.authorization = authorizationCache;
}
let options = {
method: "POST",
body: JSON.stringify(data),
headers
};
let response = await (await originalFetch(requestUrl, options)).json();
let loggedOut = response.responseContext.mainAppWebResponseContext.loggedOut;
if (loggedOut == isLogin) {
console.warn("登录状态不符,需要的:" + isLogin + " API返回的:" + !loggedOut);
}
let mutations = response.frameworkUpdates.entityBatchUpdate.mutations;
for (let i = 0; i < mutations.length; i++) {
let mutation = mutations[i];
if (mutation.payload.commentEntityPayload) {
let entity = mutation.payload.commentEntityPayload;
let commentId = entity.properties.commentId;
if (commentId == commentRecord.commentId) {
let like = parseInt(entity.toolbar.likeCountNotliked);
like = like ? like : 0;
let replyCount = parseInt(entity.toolbar.replyCount);
replyCount = replyCount ? replyCount : 0;
return {
content: entity.properties.content.content,
commentId,
like,
replyCount
};
}
}
}
}
function appendHistory(commentRecord) {
let histories = commentRecord.histories;
let needPush = false;
if (histories.length == 0) {
needPush = true;
} else {
let lastHistory = histories[histories.length - 1];
needPush = lastHistory.state != commentRecord.currentState || lastHistory.content != commentRecord.content || lastHistory.hotBan != commentRecord.hotBan;
}
if (needPush) {
histories.push({
time: commentRecord.updatedTime,
content: commentRecord.content,
state: commentRecord.currentState,
hotBan: commentRecord.hotBan
});
}
}
function updateRecord(commentRecord, state, result) {
commentRecord.updatedTime = Date.now();
commentRecord.currentState = state;
if (result) {
commentRecord.like = result.like;
commentRecord.replyCount = result.replyCount;
commentRecord.content = result.content;
}
appendHistory(commentRecord);
}
async function check(commentRecord) {
let loggedOutResult = await findComment(commentRecord, false);
if (loggedOutResult) {
updateRecord(commentRecord, "NORMAL", loggedOutResult);
return;
}
let loggedInResult = await findComment(commentRecord, true);
if (loggedInResult) {
updateRecord(commentRecord, "SHADOW_BAN", loggedInResult);
} else {
updateRecord(commentRecord, "DELETED");
}
}
async function toCheck(commentRecord) {
let selector;
if (window.location.pathname.startsWith("/channel")) {
selector = "#sections";
} else {
selector = "#comments";
}
let element = (await waitForElement(selector, `a[href='${commentRecord.url}']`)).parentNode.parentNode.parentNode.parentNode;
let div = document.createElement("div");
div.style.marginTop = "8px";
div.id = "checker";
element.append(div);
let app = vue.createApp(CommentChecker);
app.use(ElementPlus);
app.provide("check", check);
app.provide("commentRecord", commentRecord);
app.provide("interval", 5);
app.provide("onComplete", (commentRecord2) => {
console.log("评论检查完成", commentRecord2);
div.remove();
});
app.mount(
/* @__PURE__ */ (() => {
return div;
})()
);
}
async function handlerYoutubei(request) {
let requsetClone = request.clone();
let requestBody = await requsetClone.json();
if (requestBody && requestBody.context) {
contextCache = requestBody.context;
}
if (request.url.startsWith("https://www.youtube.com/youtubei/v1/comment/create_comment")) {
let response = await originalFetch(request);
if (response.status != 200) {
return response;
}
let responseClone = response.clone();
try {
let json = await responseClone.json();
if (json.frameworkUpdates.entityBatchUpdate.mutations.length == 1) {
return response;
}
let entity = json.frameworkUpdates.entityBatchUpdate.mutations[0].payload.commentEntityPayload;
let innertubeCommand = json.frameworkUpdates.entityBatchUpdate.mutations[1].payload.commentSurfaceEntityPayload.publishedTimeCommand.innertubeCommand;
let webCommandMetadata = innertubeCommand.commandMetadata.webCommandMetadata;
let webPageType = webCommandMetadata.webPageType;
let url = webCommandMetadata.url;
let commentAreaInfo = {};
if (webPageType == "WEB_PAGE_TYPE_WATCH") {
commentAreaInfo.videoId = innertubeCommand.watchEndpoint.videoId;
} else if (webPageType == "WEB_PAGE_TYPE_BROWSE") {
commentAreaInfo.channelId = url.split("/")[2];
commentAreaInfo.postId = createUrl(url).searchParams.get("lb");
}
let author = entity.author;
let properties = entity.properties;
let content = properties.content.content;
let recodedTime = Date.now();
let commentRecord = {
//评论ID
commentId: properties.commentId,
//@发送者
displayName: author.displayName,
//频道ID,类似UID
channelId: author.channelId,
//评论内容
content,
//webPageType 评论区类型 视频 or 帖子
webPageType,
//URL 点击可跳转“所要查看的评论” 例如 /watch?v=${视频ID}&lc=${评论ID}
url,
//评论区信息,视频{视频ID},帖子{频道ID,帖子ID}
commentAreaInfo,
//当前状态 默认从SHADOW_BAN开始,到NORMAL或DELETED
currentState: "NOT_CHECK",
//是否在热门排序中被禁止显示(搜索整个热门评论区来检查),前提条件currentState = "NORMAL",值:null | false | true
//此状态不会因为修改评论内容而解除,但会因为修改评论内容而赋予
hotBan: null,
//历史记录,时间 内容 状态 是否热门屏蔽
histories: [],
//{ time: recodedTime, state: "SHADOW_BAN", content, hotBan: null }
//点赞与回复数,不记录历史
like: 0,
replyCount: 0,
//记录的时间,用的是系统当前时间,约等于评论的发布时间,API里的publishedTime距离发布时间戳多久的Shit不是时间戳(PS:YouTube开放API可查询具体发布时间戳)
recodedTime,
//更新时间
updatedTime: recodedTime,
//是否是用户自己执行的删除?用于区分是被系统删的还是自己删除。state为"DELETED"时该属性为才有意义。(劫持删除评论请求时记录)
isUserDelete: false
};
console.log(commentRecord);
console.log(createUrl(url).href);
toCheck(commentRecord);
} catch (err) {
console.error(err);
throw err;
}
return response;
}
return await originalFetch(request);
}
_unsafeWindow.fetch = function(resource, options) {
if (typeof resource == "string") {
return originalFetch(resource, options);
}
if (!resource.url.startsWith("https://www.youtube.com/youtubei/")) {
return originalFetch(resource, options);
}
let auth = resource.headers.get("Authorization");
if (auth) {
authorizationCache = auth;
if (resource.method != "POST") {
return originalFetch(resource);
} else {
return handlerYoutubei(resource);
}
}
return originalFetch(resource, options);
};
})(Vue, ElementPlus);