@pi-flash-plugins/pf-wxbot 0.0.0-stage → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/wx.svg +5 -0
- package/package.json +9 -4
- package/pf-plugin.toml +18 -0
- package/pi/config.mjs +26 -0
- package/pi/design-002.test.mjs +323 -0
- package/pi/fixtures/ec-golden.json +1 -0
- package/pi/fixtures/getupdates-real.json +37 -0
- package/pi/fixtures/qr-golden.json +1 -0
- package/pi/hook.mjs +231 -0
- package/pi/hook.test.mjs +351 -0
- package/pi/index.mjs +658 -0
- package/pi/index.test.mjs +696 -0
- package/pi/inject.mjs +41 -0
- package/pi/inject.test.mjs +55 -0
- package/pi/jsonx.mjs +64 -0
- package/pi/lock.mjs +171 -0
- package/pi/messages.mjs +160 -0
- package/pi/poller.mjs +364 -0
- package/pi/poller.test.mjs +191 -0
- package/pi/qr.mjs +454 -0
- package/pi/qr.test.mjs +101 -0
- package/pi/register.mjs +236 -0
- package/pi/register.test.mjs +232 -0
- package/pi/reply.mjs +49 -0
- package/pi/state.mjs +248 -0
- package/pi/state.test.mjs +138 -0
- package/pi/transport.mjs +335 -0
- package/pi/transport.test.mjs +327 -0
- package/pi/wire.mjs +219 -0
- package/pi/wire.test.mjs +29 -0
- package/plugin.wasm +0 -0
- package/README.md +0 -3
package/assets/wx.svg
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- 微信通话图标:双气泡(微信意象),单色供宿主主题染色(勿写 fill="currentColor":usvg 会继承成不填充,gpui 染色失效=隐形) -->
|
|
3
|
+
<path d="M7 3C3.69 3 1 5.24 1 8c0 1.58.9 2.99 2.3 3.9L2.6 13.9a.4.4 0 0 0 .58.46l2.36-1.35c.47.11.96.17 1.46.18A4.98 4.98 0 0 1 7 11.5c0-2.76 2.46-5 5.5-5 .34 0 .67.03 1 .08C12.86 4.18 10.18 3 7 3Zm-2.2 3.1a.8.8 0 1 1 0 1.6.8.8 0 0 1 0-1.6Zm4.4 0a.8.8 0 1 1 0 1.6.8.8 0 0 1 0-1.6Z"/>
|
|
4
|
+
<path d="M12.5 7.5C10.01 7.5 8 9.21 8 11.3c0 2.1 2.01 3.8 4.5 3.8.4 0 .8-.05 1.17-.13l1.9 1.09a.33.33 0 0 0 .48-.38l-.57-1.62c1.13-.7 1.52-1.75 1.52-2.76 0-2.1-2.01-3.8-4.5-3.8Zm-1.5 2.6a.65.65 0 1 1 0 1.3.65.65 0 0 1 0-1.3Zm3 0a.65.65 0 1 1 0 1.3.65.65 0 0 1 0-1.3Z"/>
|
|
5
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-flash-plugins/pf-wxbot",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
}
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"engines": {
|
|
5
|
+
"pf": ">=0.3.2"
|
|
6
|
+
},
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public",
|
|
9
|
+
"registry": "https://registry.npmjs.org/"
|
|
10
|
+
}
|
|
11
|
+
}
|
package/pf-plugin.toml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# PF 内层插件清单(契约 inner_package;正版门 090-5 L3)
|
|
2
|
+
schema = 5
|
|
3
|
+
id = "pf-wxbot"
|
|
4
|
+
title = { zh = "微信通信", en = "PF-WeChat" }
|
|
5
|
+
version = "0.1.4"
|
|
6
|
+
|
|
7
|
+
wasm = "plugin.wasm"
|
|
8
|
+
|
|
9
|
+
[[contributes.fn_bar]]
|
|
10
|
+
command = "bind"
|
|
11
|
+
|
|
12
|
+
[[contributes.popups]]
|
|
13
|
+
id = "qr"
|
|
14
|
+
title = { zh = "绑定微信", en = "Bind WeChat" }
|
|
15
|
+
size = "MD"
|
|
16
|
+
|
|
17
|
+
[[contributes.pi_extensions]]
|
|
18
|
+
path = "pi/index.mjs"
|
package/pi/config.mjs
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// config —— 连接配置(transport 与 register 共用的连接面)。
|
|
2
|
+
// 自 wxprobe src/transport.rs 的 Config 段移植。
|
|
3
|
+
|
|
4
|
+
import * as state from "./state.mjs";
|
|
5
|
+
|
|
6
|
+
/** 状态盘缺 token 时的确定性错误(错误信息要指路:先跑扫码)。 */
|
|
7
|
+
export function require_token(st) {
|
|
8
|
+
const t = state.get_str(st, "bot_token");
|
|
9
|
+
if (!t) {
|
|
10
|
+
throw new Error("未扫码:先完成二维码绑定(register)");
|
|
11
|
+
}
|
|
12
|
+
return t;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** 从状态盘解出连接配置,与 IO 解耦(可单测)。缺 token → throw。 */
|
|
16
|
+
export function config_from_state(st = state.load()) {
|
|
17
|
+
const token = require_token(st);
|
|
18
|
+
return {
|
|
19
|
+
token,
|
|
20
|
+
bot_id: state.get_str(st, "bot_id") ?? "",
|
|
21
|
+
bot_user: state.get_str(st, "bot_user_id"),
|
|
22
|
+
chat_user: state.get_str(st, "chat_id") ?? null,
|
|
23
|
+
context_token: state.get_str(st, "context_token") ?? null,
|
|
24
|
+
client_id: state.ensure_client_id(st),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
// 002 设计逐条验收 —— 每一条设计条目一个可执行测试。
|
|
2
|
+
// 运行:node --test packages/pf-wxbot/design-002.test.mjs
|
|
3
|
+
//
|
|
4
|
+
// 规则:本文件只读设计(docs/插件设计/002-微信通信.md),不看实现。
|
|
5
|
+
// 失败 = 实现违背设计,改代码,不许改测试。
|
|
6
|
+
//
|
|
7
|
+
// 假宿主 = 契约 v3 能力面;假 ext = 004 §5.2 泵契约(门控 + 出码 + 扫码结果)。
|
|
8
|
+
|
|
9
|
+
import { test, beforeEach } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { mkdtempSync, mkdirSync } from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import * as plugin from "../main.js";
|
|
15
|
+
|
|
16
|
+
const GRID = JSON.stringify({
|
|
17
|
+
size: 8,
|
|
18
|
+
rows: [[[0, 3]], [], [[2, 4]], [[0, 1], [5, 2]], [], [[1, 6]], [], [[3, 2]]],
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
let ctx, calls, handlers, files;
|
|
22
|
+
|
|
23
|
+
function makeCtx() {
|
|
24
|
+
files = {};
|
|
25
|
+
calls = { toasts: [], popups: [], badges: [] };
|
|
26
|
+
handlers = { command: {}, broadcast: {} };
|
|
27
|
+
const dir = mkdtempSync(join(tmpdir(), "wx002-"));
|
|
28
|
+
mkdirSync(dir, { recursive: true });
|
|
29
|
+
ctx = {
|
|
30
|
+
dir,
|
|
31
|
+
fs: {
|
|
32
|
+
read: (n) => files[n] ?? "",
|
|
33
|
+
write: (n, s) => void (files[n] = s),
|
|
34
|
+
list: () => Object.keys(files),
|
|
35
|
+
},
|
|
36
|
+
isExecutive: () => false,
|
|
37
|
+
fileIcon: () => "icons/file_icons/file.svg",
|
|
38
|
+
run() {}, edit() {}, revealInExplorer() {},
|
|
39
|
+
toast: (m) => calls.toasts.push(m),
|
|
40
|
+
act: { openPopup: (id) => calls.popups.push(id), closePopup: (id) => calls.popups.push(`close:${id}`) },
|
|
41
|
+
onMenu() {},
|
|
42
|
+
onCommand: (id, h) => void (handlers.command[id] = h),
|
|
43
|
+
onPanelOpen() {},
|
|
44
|
+
onBroadcast: (n, h) => void (handlers.broadcast[n] = h),
|
|
45
|
+
sessions: {
|
|
46
|
+
newDraft() {},
|
|
47
|
+
setBadge: (b) => calls.badges.push({ ...b, op: "set" }),
|
|
48
|
+
clearBadge: (b) => calls.badges.push({ ...b, op: "clear" }),
|
|
49
|
+
},
|
|
50
|
+
hostProof: () => ({ kid: "dev", proof: "PF-DEV-PLACEHOLDER", nonceTag: "dev" }),
|
|
51
|
+
};
|
|
52
|
+
plugin.activate(ctx);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const mirror = () => JSON.parse(files["wx-state.json"] ?? "{}");
|
|
56
|
+
const set_mirror = (m) => void (files["wx-state.json"] = JSON.stringify(m));
|
|
57
|
+
|
|
58
|
+
/** 一拍 ext:key = 该 ext 所属会话(门控 = 被绑定 或 被点名出码)。 */
|
|
59
|
+
function extTick(key) {
|
|
60
|
+
const m = mirror();
|
|
61
|
+
if (m.enabled === "0") return false;
|
|
62
|
+
const bound = !!key && (m.session_id === key || m.session_file === key);
|
|
63
|
+
const asked = !!key && m.qr_pending === key;
|
|
64
|
+
if (!bound && !asked) return false;
|
|
65
|
+
if (bound && m.bound_current !== "1") set_mirror({ ...mirror(), bound_current: "1", session_file: m.session_file ?? key });
|
|
66
|
+
if (m.qr_request === "1" || (!m.bot_token && !m.qrcode_grid && !m.qr_error && !m.qr_timeout)) {
|
|
67
|
+
set_mirror({ ...mirror(), qrcode_grid: GRID, qr_request: undefined, qr_timeout: undefined, qr_error: undefined });
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** 扫码成功(微信回调):ext 落 token + 绑定指针 + 收窗信号。 */
|
|
73
|
+
function scanOk(key) {
|
|
74
|
+
set_mirror({
|
|
75
|
+
...mirror(),
|
|
76
|
+
session_id: key, session_file: key, bot_token: "TOK", bound_current: "1",
|
|
77
|
+
qr_pending: undefined, qr_request: undefined, qrcode_grid: undefined, bind_ok: "1",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const chrome = (key) => plugin.fn_bar(ctx, { session: { key } });
|
|
82
|
+
const popup = () => plugin.render_popup(ctx);
|
|
83
|
+
const flat = (n) => JSON.stringify(n ?? null);
|
|
84
|
+
|
|
85
|
+
beforeEach(makeCtx);
|
|
86
|
+
|
|
87
|
+
// ---------------------------------------------------------------- 功能说明
|
|
88
|
+
test("002·安装2 —— fn 槽只声明一颗微信 icon,样式交给宿主", () => {
|
|
89
|
+
const c = chrome("sA");
|
|
90
|
+
assert.equal(c.icon, "assets:wx.svg");
|
|
91
|
+
assert.ok(["accent", "text.faint"].includes(c.tone), "tone 只有绿/灰(无黄)");
|
|
92
|
+
assert.ok(c.tip?.zh);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// ---------------------------------------------------------------- 绑定
|
|
96
|
+
test("002·绑定1 —— 随意开一个会话,功能栏上是灰色 icon", () => {
|
|
97
|
+
assert.equal(chrome("sA").tone, "text.faint");
|
|
98
|
+
assert.equal(chrome("sB").tone, "text.faint");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("002·绑定2 —— 点 icon 弹出二维码,此时仍属未启用(灯不亮、徽标不打)", () => {
|
|
102
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
103
|
+
assert.equal(calls.popups.at(-1), "qr");
|
|
104
|
+
extTick("sA");
|
|
105
|
+
const canvas = find(popup(), (n) => n.type === "canvas");
|
|
106
|
+
assert.ok(canvas && canvas.paint.some((p) => p.op === "rect" && p.fill === "#1f1f1f"), "码已画出");
|
|
107
|
+
assert.equal(chrome("sA").tone, "text.faint", "未扫码 → icon 仍灰");
|
|
108
|
+
assert.equal(plugin.session_list_render(ctx, { session: { key: "sA" } }), null, "未扫码 → 列表无徽标");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("002·绑定3 —— 扫码成功 → icon 变绿", () => {
|
|
112
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
113
|
+
extTick("sA");
|
|
114
|
+
assert.equal(chrome("sA").tone, "text.faint", "扫码前灰");
|
|
115
|
+
scanOk("sA");
|
|
116
|
+
assert.equal(chrome("sA").tone, "accent", "扫码后绿");
|
|
117
|
+
assert.equal(popup(), null, "绑定成功 → 弹窗自动收起");
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("002·绑定4 —— 插件获得该 sessionId(= 扫码的那个会话)", () => {
|
|
121
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
122
|
+
extTick("sA");
|
|
123
|
+
scanOk("sA");
|
|
124
|
+
assert.equal(mirror().session_id, "sA");
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// ---------------------------------------------------------------- 切换
|
|
128
|
+
test("002·切换1 —— 仅支持绑定一个会话(多会话点 icon 只留一条绑定)", () => {
|
|
129
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
130
|
+
extTick("sA");
|
|
131
|
+
scanOk("sA");
|
|
132
|
+
handlers.command.bind({ session: { key: "sB" } });
|
|
133
|
+
extTick("sB");
|
|
134
|
+
assert.equal(mirror().session_id, "sA", "未扫码前指针不动");
|
|
135
|
+
assert.equal(chrome("sB").tone, "text.faint");
|
|
136
|
+
assert.ok(plugin.session_list_render(ctx, { session: { key: "sA" } }), "被绑会话行有徽标");
|
|
137
|
+
assert.equal(plugin.session_list_render(ctx, { session: { key: "sB" } }), null, "未绑会话行无徽标");
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test("002·切换2 —— 绑定会话的 icon 是绿色的", () => {
|
|
141
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
142
|
+
extTick("sA");
|
|
143
|
+
scanOk("sA");
|
|
144
|
+
assert.equal(chrome("sA").tone, "accent");
|
|
145
|
+
assert.equal(chrome("sB").tone, "text.faint");
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("002·切换3 —— 在另一个会话执行绑定后,持有的 sessionId 变更", () => {
|
|
149
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
150
|
+
extTick("sA");
|
|
151
|
+
scanOk("sA");
|
|
152
|
+
handlers.command.bind({ session: { key: "sB" } });
|
|
153
|
+
extTick("sB");
|
|
154
|
+
scanOk("sB");
|
|
155
|
+
assert.equal(mirror().session_id, "sB");
|
|
156
|
+
assert.equal(chrome("sB").tone, "accent");
|
|
157
|
+
assert.equal(chrome("sA").tone, "text.faint", "旧会话回到灰");
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("002·切换4 —— icon 只有 sessionId 核对正确 且 链接正常才变绿", () => {
|
|
161
|
+
set_mirror({ session_id: "sA", session_file: "sA" });
|
|
162
|
+
assert.equal(chrome("sA").tone, "text.faint", "无 token → 灰");
|
|
163
|
+
set_mirror({ session_id: "sA", session_file: "sA", bot_token: "TOK" });
|
|
164
|
+
assert.equal(chrome("sB").tone, "text.faint", "sessionId 不符 → 灰");
|
|
165
|
+
assert.equal(chrome("sA").tone, "accent", "两项都满足 → 绿");
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// ---------------------------------------------------------------- 过期
|
|
169
|
+
test("002·过期2 —— 过期 → icon 灰 + 自动弹二维码弹窗 + 提示原文", () => {
|
|
170
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
171
|
+
extTick("sA");
|
|
172
|
+
scanOk("sA");
|
|
173
|
+
set_mirror({ ...mirror(), session_expired: "1" });
|
|
174
|
+
calls.toasts.length = 0;
|
|
175
|
+
calls.popups.length = 0;
|
|
176
|
+
handlers.broadcast.session({ key: "sA" });
|
|
177
|
+
assert.equal(chrome("sA").tone, "text.faint");
|
|
178
|
+
assert.equal(calls.popups.at(-1), "qr");
|
|
179
|
+
assert.ok(calls.toasts.includes("微信链接已过期请重新绑定"), "提示原文逐字");
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// ---------------------------------------------------------------- 服务激活
|
|
183
|
+
test("002·激活2 —— 列表时间位置放微信 icon,标记已绑会话(icon size md)", () => {
|
|
184
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
185
|
+
extTick("sA");
|
|
186
|
+
scanOk("sA");
|
|
187
|
+
const row = plugin.session_list_render(ctx, { session: { key: "sA" } });
|
|
188
|
+
assert.equal(row?.icon, "assets:wx.svg");
|
|
189
|
+
assert.equal(row?.tone, "accent");
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("002·状态1 —— 用户未扫描:未启用(无绑定、无 token)", () => {
|
|
193
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
194
|
+
extTick("sA");
|
|
195
|
+
assert.equal(mirror().session_id, undefined, "未扫描不得写 sessionId");
|
|
196
|
+
assert.equal(mirror().bot_token, undefined, "未扫描不得有 token");
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test("002·状态2 —— 扫码出错:二维码框内提示「绑定出错请重试」", () => {
|
|
200
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
201
|
+
set_mirror({ ...mirror(), qrcode_grid: GRID, qr_error: "微信侧拒绝" });
|
|
202
|
+
const canvas = find(popup(), (n) => n.type === "canvas");
|
|
203
|
+
const texts = canvas.paint.filter((p) => p.op === "text").map((p) => p.value);
|
|
204
|
+
assert.ok(texts.includes("【刷新二维码】"));
|
|
205
|
+
assert.ok(texts.includes("绑定出错请重试"));
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("002·状态3 —— 扫码正常返回:绑定 sessionId 并启用", () => {
|
|
209
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
210
|
+
extTick("sA");
|
|
211
|
+
scanOk("sA");
|
|
212
|
+
assert.equal(mirror().session_id, "sA");
|
|
213
|
+
assert.equal(mirror().bot_token, "TOK");
|
|
214
|
+
assert.equal(chrome("sA").tone, "accent");
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// ---------------------------------------------------------------- 二维码展示区
|
|
218
|
+
test("002·码区1 —— 未启用:自动展示二维码,无提示信息", () => {
|
|
219
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
220
|
+
extTick("sA");
|
|
221
|
+
const canvas = find(popup(), (n) => n.type === "canvas");
|
|
222
|
+
assert.equal(canvas.paint.filter((p) => p.op === "text").length, 0, "态1 框内无提示");
|
|
223
|
+
assert.equal(canvas.command, undefined, "态1 画布不可点");
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test("002·码区3 —— 扫码超时:白遮旧码 + 「扫描超时,刷新重新扫码」", () => {
|
|
227
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
228
|
+
set_mirror({ ...mirror(), qrcode_grid: GRID, qr_timeout: "1" });
|
|
229
|
+
const canvas = find(popup(), (n) => n.type === "canvas");
|
|
230
|
+
const texts = canvas.paint.filter((p) => p.op === "text").map((p) => p.value);
|
|
231
|
+
assert.ok(texts.includes("扫描超时,刷新重新扫码"), "超时文案逐字");
|
|
232
|
+
assert.ok(canvas.paint.some((p) => p.op === "rect" && p.fill === "#ffffff"), "主题蒙层遮旧码");
|
|
233
|
+
assert.equal(canvas.command, "refresh-qr", "框内可点重出码");
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("002·码区3(态分离)—— 链接过期不走扫码超时白遮(两条流程,不互相污染)", () => {
|
|
237
|
+
// 002 过期流程:灰灯 + 提示「微信链接已过期请重新绑定」;码区超时是另一态
|
|
238
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
239
|
+
set_mirror({ ...mirror(), qrcode_grid: GRID, session_expired: "1" });
|
|
240
|
+
const canvas = find(popup(), (n) => n.type === "canvas");
|
|
241
|
+
assert.ok(!canvas.paint.some((p) => p.op === "text" && /扫描超时/.test(p.value ?? "")), "过期不冒充扫码超时");
|
|
242
|
+
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test("002·码区注 —— 提示信息显示在二维码方框内", () => {
|
|
246
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
247
|
+
set_mirror({ ...mirror(), qrcode_grid: GRID, qr_error: "x" });
|
|
248
|
+
const canvas = find(popup(), (n) => n.type === "canvas");
|
|
249
|
+
assert.ok(canvas.paint.some((p) => p.op === "text" && p.value === "【刷新二维码】"));
|
|
250
|
+
assert.equal(find(popup(), (n) => n.type === "text" && /【刷新二维码】/.test(n.value ?? "")), null, "框外无提示");
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// ---------------------------------------------------------------- 提示信息区
|
|
254
|
+
test("002·提示区 —— 三条固定文案逐字", () => {
|
|
255
|
+
const s = flat(popup());
|
|
256
|
+
assert.ok(s.includes("1、在微信上安装「微信ClawBot」插件"));
|
|
257
|
+
assert.ok(s.includes("2、用微信扫描二维码绑定Pi-Flash会话"));
|
|
258
|
+
assert.ok(s.includes("3、绑定仅限一个会话,但可随时切换"));
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test("002·提示区 switch —— 「开启/关闭微信通信」,扫码绑定后默认 on", () => {
|
|
262
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
263
|
+
extTick("sA");
|
|
264
|
+
scanOk("sA");
|
|
265
|
+
set_mirror({ ...mirror(), bind_ok: undefined });
|
|
266
|
+
const sw = find(popup(), (n) => n.type === "switch");
|
|
267
|
+
assert.ok(sw);
|
|
268
|
+
assert.equal(sw.value, true, "扫码绑定后默认 on");
|
|
269
|
+
// 文案与开关已拆成两个节点(文字 faint + switch 本体):整行里能搜到即可
|
|
270
|
+
assert.ok(JSON.stringify(popup()).includes("开启/关闭微信通信"), "switch 行文案");
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// ---------------------------------------------------------------- 主动断开
|
|
274
|
+
test("002·断开 —— switch 到 off = 断开链接 + 关服务,icon 转灰", () => {
|
|
275
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
276
|
+
extTick("sA");
|
|
277
|
+
scanOk("sA");
|
|
278
|
+
handlers.command["toggle-enabled"]({ value: false });
|
|
279
|
+
assert.equal(mirror().enabled, "0");
|
|
280
|
+
assert.equal(chrome("sA").tone, "text.faint");
|
|
281
|
+
handlers.command["toggle-enabled"]({ value: true });
|
|
282
|
+
assert.notEqual(mirror().enabled, "0");
|
|
283
|
+
assert.equal(chrome("sA").tone, "accent");
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("002·断开1 —— 通信会话被删除:ext 清 sessionId 并关服", () => {
|
|
287
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
288
|
+
extTick("sA");
|
|
289
|
+
scanOk("sA");
|
|
290
|
+
set_mirror({ ...mirror(), session_id: undefined, session_file: undefined, bot_token: undefined });
|
|
291
|
+
assert.equal(chrome("sA").tone, "text.faint");
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// ---------------------------------------------------------------- 会话管理
|
|
295
|
+
test("002·会话管理 —— 插件只保存当前 sessionId", () => {
|
|
296
|
+
handlers.command.bind({ session: { key: "sA" } });
|
|
297
|
+
extTick("sA");
|
|
298
|
+
scanOk("sA");
|
|
299
|
+
handlers.command.bind({ session: { key: "sB" } });
|
|
300
|
+
extTick("sB");
|
|
301
|
+
scanOk("sB");
|
|
302
|
+
const m = mirror();
|
|
303
|
+
assert.equal(m.session_id, "sB");
|
|
304
|
+
assert.equal(m.session_id_prev, undefined);
|
|
305
|
+
assert.equal(m.bindings, undefined);
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// ---- 树遍历 ----
|
|
309
|
+
function find(node, pred) {
|
|
310
|
+
if (!node || typeof node !== "object") return null;
|
|
311
|
+
if (pred(node)) return node;
|
|
312
|
+
for (const c of node.children ?? []) {
|
|
313
|
+
const r = find(c, pred);
|
|
314
|
+
if (r) return r;
|
|
315
|
+
}
|
|
316
|
+
for (const v of Object.values(node)) {
|
|
317
|
+
if (v && typeof v === "object" && !Array.isArray(v)) {
|
|
318
|
+
const r = find(v, pred);
|
|
319
|
+
if (r) return r;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"data":[198,79,20,175,216,75,154,46,98,7],"ecc":[226,58,61,93,90,107,9,176,241,177],"n":10},{"data":[119,202,125,75,250,235,109,161,160,203,83,40,21,16,147,140,35,165,211,217,56,237,90,133,48,154,8,45,214,222],"ecc":[12,254,22,208,108,67,89,224,129,126],"n":10},{"data":[227,78,146,171,166,16,197,111,231,165,167,239,85,167,104,90,178,128,112,201,17,98,211,226,74,174,157,252,68,44,128,29,177,27,237,209,199,17,208,242,201,35,249,134,160,193,59,142,253,96,18,135,240,145,168,100,105,171,142,223,42,148,8,188],"ecc":[186,24,142,196,177,117,23,19,148,88],"n":10},{"data":[255,5,82,166,75,184,245,18,145,71,76,28,92,195,181,161,124,160,234,107,61,69,144,139,45,255,112,18,81,189,45,63,102,177,143,33,45,47,24,208,203,129,74,147,64,174,99,31,225,244,225,47,192,85,216,188,47,47,255,111,24,128,215,185,8,82,39,42,110,240,160,132,224,35,226,178,171,237,93,58,234,16,220,100,239,98,0,225,53,162,205,168,1,38,117,38,58,170,124,133],"ecc":[71,92,24,113,186,56,59,175,242,145],"n":10},{"data":[5,211,118,87,83,130,12,37,54,132],"ecc":[123,25,225,110,156,208,204,159,127,203,177,181,206,228,76,153],"n":16},{"data":[224,107,72,229,37,156,34,33,251,33,178,4,80,139,129,216,216,66,163,141,122,60,92,163,132,62,138,153,34,15],"ecc":[53,12,55,5,76,72,107,4,154,70,104,108,42,74,218,249],"n":16},{"data":[201,192,108,135,3,104,88,18,76,55,232,29,207,37,114,205,89,148,147,225,229,222,202,132,60,45,175,113,19,39,162,14,49,103,95,90,97,206,211,209,47,127,80,163,240,92,157,87,105,151,217,204,192,21,120,43,73,211,84,102,102,82,128,194],"ecc":[213,253,15,64,119,90,36,254,157,109,179,84,86,107,251,76],"n":16},{"data":[54,110,18,189,71,77,158,97,14,226,229,238,180,104,69,7,3,86,212,20,186,58,38,125,246,154,71,71,45,200,247,220,44,35,124,51,33,100,222,239,228,166,189,87,130,206,248,1,198,233,136,243,63,108,182,176,243,187,80,239,10,96,203,163,14,230,69,0,72,145,190,243,27,62,15,149,134,189,234,113,235,255,45,28,76,223,117,203,46,185,38,94,216,57,35,253,13,81,107,192],"ecc":[114,163,40,208,176,206,155,35,245,241,78,37,133,100,251,217],"n":16},{"data":[227,155,218,93,188,159,112,115,59,110],"ecc":[138,90,38,226,173,91,13,13,115,39,236,173,218,97,143,163,43,54,190,87,167,130,104,57,189,215],"n":26},{"data":[4,218,34,78,13,157,141,91,205,15,62,235,236,183,113,94,204,251,169,242,93,132,80,80,52,59,41,9,148,9],"ecc":[34,57,177,129,197,143,30,65,202,169,122,244,9,45,220,150,129,30,67,77,100,169,96,18,239,236],"n":26},{"data":[110,6,107,219,224,132,226,47,10,68,111,225,90,146,48,181,248,229,10,222,70,116,148,104,6,198,151,227,81,96,131,118,198,245,150,122,59,186,176,22,68,16,0,52,211,106,104,168,151,145,229,161,60,86,184,173,253,25,140,156,97,251,93,21],"ecc":[68,77,129,39,122,202,64,59,234,46,146,17,86,152,8,122,162,251,10,213,111,144,233,124,68,70],"n":26},{"data":[195,215,211,236,55,95,36,120,225,84,70,111,4,182,237,233,199,242,247,7,116,26,52,82,144,177,196,201,254,241,148,62,73,217,89,224,163,177,114,52,204,61,215,215,200,216,122,216,24,6,182,27,118,244,89,47,228,2,3,143,247,238,170,120,162,149,208,67,103,170,175,62,220,146,66,123,112,91,38,83,111,92,67,65,2,253,251,136,204,201,144,253,124,133,108,50,4,117,102,144],"ecc":[76,223,230,170,79,55,252,249,203,126,97,209,54,130,53,144,109,221,120,26,234,233,8,231,130,135],"n":26},{"data":[94,111,178,117,250,57,192,153,54,138],"ecc":[2,179,44,180,33,89,241,225,41,131,99,249,53,217,178,219,208,244],"n":18},{"data":[228,172,210,179,183,186,34,230,137,47,47,210,32,187,209,253,180,2,148,149,82,147,170,69,109,255,196,52,96,137],"ecc":[171,128,128,15,215,8,96,230,158,170,132,123,175,85,229,220,144,123],"n":18},{"data":[55,126,129,39,170,28,239,177,195,35,175,18,236,54,71,44,133,163,158,89,239,34,235,181,134,0,205,30,179,34,178,38,225,174,29,240,135,153,219,193,198,162,113,97,62,29,93,28,37,157,77,189,42,62,45,196,159,243,20,143,191,68,245,181],"ecc":[35,4,180,30,84,209,78,69,43,113,109,244,99,56,160,193,201,179],"n":18},{"data":[237,4,41,150,102,65,73,253,152,249,202,25,165,254,244,231,115,60,35,129,92,93,201,63,231,98,186,92,134,249,199,83,210,104,231,1,119,223,50,126,69,26,196,42,70,97,192,32,24,199,128,2,159,40,181,24,233,119,199,60,240,195,77,215,186,217,102,237,98,21,135,102,14,125,27,5,212,35,3,191,221,212,254,91,152,225,52,5,160,170,175,102,83,198,227,65,250,244,251,229],"ecc":[73,251,83,254,234,73,67,15,139,147,60,188,110,187,249,103,114,225],"n":18},{"data":[7,249,130,110,124,218,86,191,242,46],"ecc":[132,137,59,82,181,162,62,159,48,255,112,56,227,23,218,113,2,184,232,165,20,142,240,22],"n":24},{"data":[125,198,94,17,47,160,121,61,100,68,204,187,181,236,25,199,74,159,2,15,67,182,205,58,109,236,251,83,102,160],"ecc":[247,52,207,231,88,50,35,83,98,34,31,154,184,213,63,197,140,163,108,160,53,202,239,138],"n":24},{"data":[26,197,218,105,61,156,218,155,136,205,80,229,198,28,190,152,229,179,80,121,212,196,158,111,92,192,241,94,230,42,193,68,2,61,154,190,219,208,183,252,37,216,117,148,212,233,185,62,57,155,3,183,252,2,43,213,234,204,229,111,36,238,2,49],"ecc":[33,239,121,134,203,112,41,232,81,157,187,45,231,26,151,197,245,59,90,168,44,220,71,239],"n":24},{"data":[127,65,130,221,139,150,171,27,76,192,214,225,255,83,117,154,151,52,92,15,0,161,71,95,251,154,155,134,55,46,4,239,237,149,137,141,68,57,138,43,156,226,133,9,108,146,254,167,44,222,105,231,89,114,137,172,172,128,169,202,214,169,125,163,16,82,65,113,221,178,78,248,220,249,177,66,39,89,126,121,239,30,254,194,231,205,62,127,111,147,58,175,0,2,33,38,126,172,202,169],"ecc":[224,91,153,114,230,165,171,39,18,101,74,28,89,59,64,30,92,39,60,245,92,81,207,23],"n":24},{"data":[188,126,216,26,0,250,52,126,133,198],"ecc":[199,252,45,170,159,97,72,0,214,208,21,208,116,247,238,90,129,161,4,28,87,98],"n":22},{"data":[151,150,76,165,225,43,227,167,105,56,88,196,217,249,142,236,56,158,127,47,58,2,12,238,41,180,172,121,159,184],"ecc":[177,75,227,68,71,68,126,40,122,80,211,234,186,72,18,33,197,125,155,102,62,11],"n":22},{"data":[236,207,66,204,67,205,116,26,88,32,60,201,223,130,192,78,77,224,193,156,119,130,142,153,117,243,36,168,60,140,198,191,52,57,40,144,18,155,231,223,24,146,24,51,38,222,163,53,144,73,10,173,198,171,18,11,78,120,200,84,71,36,208,120],"ecc":[118,40,224,161,174,250,113,226,110,146,102,47,202,153,237,27,159,186,197,140,26,220],"n":22},{"data":[113,6,132,209,86,65,226,138,45,40,9,126,185,39,252,167,71,60,208,120,47,201,83,24,83,42,237,201,165,247,192,177,80,101,125,85,179,30,176,213,209,232,195,51,221,15,220,20,144,159,219,87,192,89,137,205,218,207,130,131,243,220,134,95,234,37,5,143,247,65,241,141,227,75,31,80,74,73,54,237,209,229,30,111,51,250,134,49,136,20,74,165,154,173,137,111,21,165,51,250],"ecc":[236,200,252,220,24,197,71,156,252,166,65,42,119,53,179,82,10,195,0,82,132,143],"n":22},{"data":[193,100,195,123,220,72,24,201,119,175],"ecc":[172,173,83,149,90,250,216,40,157,70,116,111,119,131,60,1,27,38,118,130,52,169,100,233,240,231,128,80],"n":28},{"data":[169,172,74,55,77,72,211,167,32,105,134,223,23,174,80,166,183,12,65,68,35,243,165,118,115,203,67,232,73,122],"ecc":[121,21,71,4,225,61,217,167,115,22,175,114,180,150,146,211,130,208,156,45,69,192,243,206,42,152,130,246],"n":28},{"data":[95,220,209,95,42,38,1,231,229,127,35,99,54,32,138,183,34,76,14,105,195,85,81,15,207,149,163,249,161,86,230,163,194,82,19,176,39,227,83,104,135,2,183,1,104,34,79,39,246,200,172,9,179,142,120,246,43,146,255,53,250,113,65,227],"ecc":[135,96,247,233,23,45,48,169,31,222,86,156,208,108,15,122,244,169,211,133,20,62,148,176,210,210,219,140],"n":28},{"data":[235,26,235,109,141,229,244,22,28,208,84,190,15,94,214,239,145,201,90,136,60,249,236,187,9,240,101,81,190,222,188,173,248,227,180,146,220,36,212,3,43,240,42,219,117,197,152,68,25,232,158,227,113,99,122,181,66,105,148,38,64,148,82,65,158,166,252,210,210,194,54,33,199,142,18,4,243,156,206,211,33,134,63,70,166,83,196,219,220,233,88,127,170,244,138,42,106,198,75,160],"ecc":[186,222,5,123,187,62,214,128,123,64,91,144,94,70,94,247,144,126,93,68,242,172,74,185,7,198,48,204],"n":28}]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"msgs": [
|
|
3
|
+
{
|
|
4
|
+
"seq": 2,
|
|
5
|
+
"message_id": 7513480159106982024,
|
|
6
|
+
"from_user_id": "user_sandbox@im.wechat",
|
|
7
|
+
"to_user_id": "bot_sandbox@im.bot",
|
|
8
|
+
"client_id": "client_sandbox",
|
|
9
|
+
"create_time_ms": 1791353263566,
|
|
10
|
+
"update_time_ms": 1791353263667,
|
|
11
|
+
"delete_time_ms": 0,
|
|
12
|
+
"session_id": "",
|
|
13
|
+
"group_id": "",
|
|
14
|
+
"message_type": 1,
|
|
15
|
+
"message_state": 2,
|
|
16
|
+
"item_list": [
|
|
17
|
+
{
|
|
18
|
+
"type": 1,
|
|
19
|
+
"create_time_ms": 1791353263566,
|
|
20
|
+
"update_time_ms": 1791353263566,
|
|
21
|
+
"is_completed": true,
|
|
22
|
+
"msg_id": "v1:7080285058697933325",
|
|
23
|
+
"button_item_list": [],
|
|
24
|
+
"at_bot_username_list": [],
|
|
25
|
+
"text_item": {
|
|
26
|
+
"text": "测试文本"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"context_token": "SANITIZED_CONTEXT_TOKEN",
|
|
31
|
+
"root_id": 0,
|
|
32
|
+
"parent_id": 0
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"sync_buf": "CAIQxK3mp5E0GKf94KeRNA==",
|
|
36
|
+
"get_updates_buf": "ChAIAhDEreankTQYp/3gp5E0Ejo4NGUxNDQ3Y2ZmYTZAaW0uYm90OjA2MDAwMGJkNzkwMDUzMDVjMmZhY2JhNjE1NTYwNzcwNTNmMmZl"
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"grids":[{"cells":[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,true,false,false,false,false,false,false,true,true,true,true,false,false,true,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,true,true,false,false,false,true,true,false,true,false,true,true,true,false,false,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,true,true,true,false,true,true,true,false,true,false,false,true,true,true,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,true,true,true,false,false,false,false,true,true,true,true,false,false,true,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,true,false,true,true,true,true,true,true,false,true,false,true,true,true,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,false,true,false,true,true,true,false,false,true,false,false,true,true,false,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,true,false,true,false,true,false,true,true,true,true,true,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,true,true,true,true,false,false,false,true,false,false,true,true,false,false,true,true,false,false,false,true,true,true,false,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,true,false,true,true,false,true,false,true,true,false,false,false,false,true,false,false,true,true,true,true,true,true,false,true,false,false,true,true,false,true,true,false,true,false,false,false,false,false,false,false,false,true,true,true,false,true,false,true,false,true,false,false,false,true,true,true,true,true,false,true,false,false,true,false,false,true,true,false,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,true,false,false,true,true,true,false,false,false,true,false,false,true,false,false,false,false,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,true,false,false,true,false,false,true,false,true,true,true,true,true,false,false,true,false,false,false,false,true,true,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,false,true,false,true,false,false,true,false,false,false,false,true,false,true,false,true,false,false,true,true,false,false,true,false,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,true,false,false,true,true,true,true,true,false,false,false,false,true,true,true,false,false,false,true,false,false,false,true,true,false,true,false,false,true,false,false,false,false,false,false,false,false,false,true,false,false,true,true,true,false,false,false,true,false,true,false,true,false,true,false,false,true,true,true,true,true,true,false,true,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,true,false,true,true,false,true,true,true,true,true,false,true,true,false,true,true,false,true,false,false,true,false,false,true,true,true,false,true,true,false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,true,true,false,false,true,false,true,true,false,false,false,true,false,true,false,false,true,true,true,false,true,false,false,true,true,false,true,true,false,true,false,false,false,false,false,false,false,false,false,true,false,false,true,true,true,false,false,true,false,false,true,false,false,true,true,false,true,false,true,false,false,false,false,true,true,true,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,true,false,false,false,false,false,true,true,true,false,true,false,true,false,false,false,true,false,false,true,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,true,true,true,false,true,false,false,true,true,false,true,false,false,true,true,true,false,false,true,false,true,false,true,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,true,false,true,false,false,false,true,false,false,true,false,true,true,true,true,false,true,true,false,false,true,true,true,true,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,true,false,false,true,false,false,true,false,true,true,false,true,false,false,false,true,false,true,false,true,false,true,false,true,true,true,true,false,true,false,false,false,false,false,false,false,false,false,true,false,false,true,false,true,false,false,true,true,false,false,false,true,true,false,true,false,false,false,true,true,false,true,true,true,false,true,false,false,true,true,true,false,false,false,false,false,false,false,false,true,false,false,true,true,false,true,false,false,true,false,false,false,false,false,false,false,true,false,false,false,false,true,false,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,true,false,false,true,true,false,true,true,true,true,false,true,false,false,false,true,false,true,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,true,false,true,false,true,true,false,true,false,false,true,false,false,true,true,false,true,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,true,true,true,true,true,false,false,true,true,true,false,true,true,true,true,true,false,false,false,true,true,true,true,false,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,false,false,false,true,true,false,true,false,false,false,true,false,false,false,true,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,false,true,true,true,false,true,false,false,true,true,false,true,true,false,true,true,false,false,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,true,false,false,false,true,true,true,false,true,false,false,false,true,true,false,false,true,true,false,true,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,false,true,false,false,false,true,false,false,false,false,true,true,true,true,false,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,false,false,true,true,false,true,false,true,true,false,false,false,true,true,true,true,false,true,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"funcs":[true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"module_size":33,"quiet":4,"size":41,"url":"https://ilinkai.weixin.qq.com/ilink/bot/qr?x=1234567890"},{"cells":[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,false,false,true,false,true,true,false,true,false,false,false,false,true,true,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,false,true,false,false,false,false,true,true,false,true,false,false,true,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,false,false,true,true,false,true,true,false,false,false,false,true,false,false,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,false,true,false,false,true,true,false,true,true,false,true,false,true,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,false,false,true,false,true,false,false,false,true,true,true,false,true,true,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,true,true,false,false,false,false,false,true,false,true,true,false,true,true,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,true,false,true,true,true,true,true,false,false,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,true,false,true,true,true,true,false,false,true,false,false,false,false,true,true,true,false,true,true,false,true,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,false,true,false,false,false,false,true,true,true,false,false,false,true,true,true,false,false,false,false,false,false,false,false,false,true,true,false,true,false,false,true,true,true,true,false,false,true,false,false,true,false,true,false,false,false,true,true,true,true,true,false,false,false,true,false,true,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,true,true,true,true,true,false,false,true,false,true,true,true,true,true,true,false,false,false,true,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,true,true,false,false,true,false,true,false,true,true,false,false,false,true,false,true,true,false,true,true,false,true,false,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,false,true,false,true,true,true,false,false,false,false,false,false,true,true,false,true,false,false,true,true,false,true,false,true,false,true,true,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,true,true,false,false,true,true,false,false,false,false,true,false,true,true,false,true,false,true,true,true,true,true,false,true,false,true,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,true,true,true,true,false,true,true,false,false,true,false,true,true,true,false,true,false,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,true,false,true,true,false,true,false,true,false,true,true,true,false,true,false,false,true,true,true,false,true,false,true,false,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,true,true,false,true,false,true,false,true,true,true,true,false,true,false,false,true,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,true,true,true,false,true,true,true,false,false,false,false,true,true,false,false,true,false,false,true,false,false,false,true,true,false,true,false,true,false,true,false,true,false,false,false,false,false,false,false,false,false,true,false,true,false,false,true,false,true,true,false,false,true,false,false,true,false,false,false,false,true,true,true,true,false,false,true,false,true,false,false,false,true,false,false,false,false,false,false,false,false,false,false,true,true,false,true,false,true,true,false,false,false,false,false,false,true,true,true,false,false,false,true,true,false,false,true,false,true,false,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,false,true,true,true,false,true,true,true,true,true,false,true,false,false,false,false,true,true,true,true,true,true,false,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,true,true,true,true,true,false,false,false,false,true,false,false,false,false,true,true,true,true,true,true,false,true,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,true,true,false,true,false,false,true,true,true,false,true,false,false,true,true,true,true,false,true,true,false,false,false,true,true,false,true,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,false,true,true,true,false,false,false,false,true,true,true,false,false,true,false,true,true,true,true,false,true,true,true,true,true,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false,true,false,false,true,false,false,false,true,true,true,false,false,false,true,false,true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,false,true,false,false,true,true,false,true,false,false,true,false,true,false,true,false,true,false,true,true,false,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,false,false,true,false,false,true,false,true,true,false,false,true,false,false,true,false,false,false,true,false,false,true,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,true,false,false,true,false,true,false,false,true,false,false,true,false,false,true,true,true,true,true,true,false,true,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,false,false,true,true,false,true,true,false,false,true,true,true,true,false,false,true,true,true,false,true,false,false,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,true,false,true,true,false,true,false,true,false,false,true,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,false,true,false,true,false,false,false,true,true,false,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,true,false,true,false,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"funcs":[true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"module_size":33,"quiet":4,"size":41,"url":"https://work.weixin.qq.com/ca/cawdeadbeefcafe12345"},{"cells":[false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,true,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,true,true,true,false,false,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,false,false,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,false,false,false,true,false,true,false,true,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,true,false,true,false,true,false,false,false,false,false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,false,true,false,true,false,false,false,true,true,false,false,false,false,true,false,false,true,false,false,false,false,false,false,false,false,false,true,true,false,true,true,false,false,true,false,false,true,false,false,false,true,false,false,false,true,false,false,false,false,false,false,false,false,false,false,true,false,true,false,true,true,true,false,true,false,true,false,true,false,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,false,true,false,false,false,false,false,true,true,false,false,false,true,false,false,true,true,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,true,true,false,false,false,true,false,true,false,true,false,false,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,true,false,true,false,true,false,false,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,true,true,false,true,true,true,false,true,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,false,true,true,true,true,false,true,true,true,false,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,true,true,false,true,true,true,false,false,true,false,true,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,false,true,true,false,false,false,true,false,false,false,true,true,false,false,false,false,false,false,false,false,false,true,false,true,true,true,false,true,false,true,true,false,false,true,false,false,false,true,false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,true,false,false,true,true,false,false,false,true,false,false,false,true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,false,true,false,true,false,true,false,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],"funcs":[true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false],"module_size":21,"quiet":4,"size":29,"url":"短"}]}
|