commit 92bdb2074160385f0c947a355d624e9e23dbe6c8 Author: mula.liu Date: Fri Sep 18 13:28:05 2026 +0800 v 0.1.0 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..4a9190f --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +# 数据库连接。留空时后端自动使用仓库根目录下的 data/math.db +# 例:sqlite:////Users/you/nex_math/data/math.db +DATABASE_URL= + +# 允许跨域访问的前端地址,逗号分隔 +CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173 + +# 可选:为将来接入真实大模型讲解预留(当前本地规则版无需配置) +OPENAI_API_KEY= + +# JWT 签名密钥(生产环境务必改成随机长字符串) +JWT_SECRET= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5210193 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +*.pyc +.venv/ +backend/.venv/ +node_modules/ +frontend/dist/ +.DS_Store +data/*.db +.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..42763f5 --- /dev/null +++ b/README.md @@ -0,0 +1,247 @@ +# 数学学习系统(前后端分离版) + +把原单文件静态页 `math_learning_dashboard_v3.html` 重构为可运行的前后端分离系统, +前端采用 Ant Design,包含用户体系与标准 RBAC。 +页面结构、题库与学习流程在此基础上重设计:知识点以“初等/高等数学知识图谱” +为全局地基,章节与题目通过关系表挂到图谱节点,不再使用文本标签匹配。 +学习状态从浏览器 localStorage 改为 SQLite 持久化;教材目录以 +《盖尔范德中学生数学思维丛书》为基础,并支持大模型配置与按章节生成题目。 + +## 技术栈 + +- 后端:FastAPI + SQLAlchemy + SQLite +- 前端:React + TypeScript + Vite + Ant Design +- 公式渲染:KaTeX(支持 `$...$` / `$$...$$` 与 Markdown 插图) +- 认证:JWT(HS256)+ PBKDF2 密码散列 +- RBAC:user / role / user_role / permission / role_permission +- 部署:支持本机直接运行或 `docker compose` + +## 目录结构 + +```text +nex_math/ +├── backend/ # FastAPI 应用 +│ ├── main.py # 入口(CORS、路由注册) +│ ├── database.py # SQLite 连接与默认库路径 +│ ├── models/ # ORM:教材 / 章节 / 知识点 / 题目 / 记录 / 错题 / 模型配置 +│ ├── schemas/ # Pydantic 请求响应模型 +│ ├── routers/ # overview / practice / data / analytics / archive / catalog / question-bank / llm +│ ├── services/ # llm_client / question_generator / ai_teacher / question_engine / mastery_engine / recommendation +│ └── seed/ # 目录与题库种子数据 +├── frontend/ # Vite + React 前端 +│ └── src/ +│ ├── pages/ # 九个页面 +│ ├── components/ +│ ├── api/ # API 客户端 +│ └── types/ +├── data/math.db # SQLite 数据库(首次初始化后生成) +└── scripts/ # init.sh / start.sh +``` + +## 界面与导航 + +- 左侧菜单栏支持**展开 / 收拢**两种模式:底部“收拢菜单”按钮或顶栏折叠按钮 + 一键切换,偏好写入 localStorage 下次进入自动恢复;收拢态只显示图标, + 悬停出现文字提示,功能分组以分隔线保留。 +- 窄屏(<768px)自动切换为覆盖式抽屉导航,顶栏汉堡按钮开合,不再挤压内容区。 +- 顶栏统一展示“分区 · 页面说明”、角色标识与头像菜单(设置 / 退出登录), + 与侧栏底部用户卡片入口一致。 +- 全站样式与控件收敛到三层:**theme.ts(设计令牌)→ ui.tsx(Page / Panel / + Toolbar / DataTable / RowActions / MetricGrid / CountTag / EmptyState 等) + → 页面**,新页面只组合统一控件,不各写一套尺寸与颜色。 + +## 快速开始(本机) + +要求:Python 3.10+(推荐使用 [uv](https://docs.astral.sh/uv/))、Node.js 18+。 + +```bash +./scripts/init.sh # 创建虚拟环境、安装依赖、写入种子数据 +./scripts/start.sh # 同时启动后端 :8000 与前端 :5173 +``` + +打开 http://localhost:5173。 + +默认账号: + +| 账号 | 密码 | 角色 | 说明 | +| --- | --- | --- | --- | +| admin | admin123 | 管理员 | 用户、模型、教材课程、题库管理 | +| student | student123 | 普通用户 | 学习总览、练习、错题、分析等 | + +首次登录后请通过左侧栏底部用户卡片的“个人设置”修改默认密码, +并在生产环境设置 JWT_SECRET(环境变量)。管理员可在“模型配置”维护多通道模型。 +管理员是纯管理账号:不创建学习档案,学习总览/知识地图等学习功能不展示, +学习类接口对管理员返回无权限。 + +## 快速开始(Docker) + +```bash +docker compose up --build +``` + +前端 http://localhost:5173,后端文档 http://localhost:8000/docs。 +数据库会以卷形式挂载在宿主机的 `./data/math.db`。 + +## 热加载 + +- 前端:Vite 开发服务器自带 HMR,保存代码页面即时更新; +- 后端:`./scripts/start.sh` 与 `docker compose` 均以 + `uvicorn --reload` 启动,Python 代码变更自动重载。 + +## 功能对照 + +| 静态版模块 | 新系统位置 | 说明 | +| --- | --- | --- | +| 学习总览 | `/` 学习总览 | 指标卡 + 掌握度 + 推荐计划 | +| 知识地图 | 知识地图 | 知识点掌握度;点击卡片查看定义、掌握度、相关知识点,以及讲了它的教材章节与视频课程(可一键进入本章测试) | +| 章节测试 | 章节测试 | 选书→选章→按掌握度动态抽取 5 题,可“换一套”;唯一的组卷与练习入口 | +| 错题本 | 错题本 | 记录每道错题的题干、你的错误回答、正确答案与解析 | +| 练习记录 | 练习记录 | 展开记录可回看每题作答与详细解析 | +| 今日任务 | 今日任务 | 推荐今日章节 → 做章节测试 → 对章节提交掌握反馈 | +| 学习分析 | 学习分析 | 正确率、错题、诊断排序 | +| 导出 / 导入档案 | 个人设置 → 学习档案 | `/api/archive/export`、`/api/archive/import` | +| 教材 / 课程 | 教材 / 课程 | 盖尔范德丛书书目(ISBN)+ 在线课程链接 | +| 教材详情 | 点击教材卡片 | 查看章节目录、每章知识点、题目数量并直接开始本章测试 | +| 题库管理 | 题库管理 | 列出/筛选/删除题目,按教材章节调用模型生成 | +| 模型配置 | 模型配置 | 多通道模型配置、通道命名、默认通道与连通测试 | +| 用户管理 | 用户管理(管理员) | 创建用户、启停账号、切换角色、重置密码 | +| 个人设置 | 左侧栏底部用户卡片 → 个人设置(主内容区整页) | 修改昵称/密码,导出与导入学习档案 | +| 教材课程管理 | 教材课程管理(管理员) | 教材/课程维护;章节可新增/编辑/删除,也可按教材 AI 自动生成目录,章节可直接跳转到对应题库 | +| 题库生成 | 题库管理 | 先选教材,再选章节与数量,按章节调用大模型生成新题 | + +学习数据(掌握度、练习记录、错题、每日完成)按用户隔离,同一账号的数据互相独立。 +练习提交时会保存每题题目快照与作答(错误选项、正确答案、解析),因此题库后续 +删题也不影响错题本与练习记录的逐题回看;所有明细均归属当前用户,用户之间不可见。 + +## RBAC 权限 + +| 权限码 | 说明 | 管理员 | 普通用户 | +| --- | --- | --- | --- | +| learning:use | 学习总览/练习/错题/分析/档案 | ✘ | ✔ | +| users:manage | 用户管理 | ✔ | ✘ | +| llm:manage | 模型配置 | ✔ | ✘ | +| catalog:manage | 教材/课程管理 | ✔ | ✘ | +| question-bank:manage | 题库管理与生成 | ✔ | ✘ | +| knowledge:manage | 知识图谱管理 | ✔ | ✘ | + +除登录、健康检查外,所有 `/api/*` 接口都要求 `Authorization: Bearer `; +管理接口在后端通过权限依赖二次校验(`backend/dependencies.py`)。 + +知识点状态由掌握度自动计算:`≥85 已掌握`、`75–84 基本掌握`、`60–74 待加强`、`<60 重点`。 + +## 教材目录 + +当前教材基线为《盖尔范德中学生数学思维丛书》(中国科学技术大学出版社): + +| 分册 | ISBN | +| --- | --- | +| 函数和图像(主教材,已挂章节与题库) | 978-7-312-05005-3 | +| 代数 | 978-7-312-04893-7 | +| 三角函数 | 978-7-312-04695-7 | +| 坐标方法 | 978-7-312-05006-0 | +| 几何 | 978-7-312-05779-3 | + +《函数和图像》的章节(引言、第1章 例子 … 第7章 有理函数)已写入数据库, +可据此按章节生成新题;其余分册目录可在 `backend/seed/catalog.py` 中扩充后重启生效 +(幂等同步,不清空学习记录)。 + +## 模型配置与题目生成 + +1. 打开“模型配置”→“新增通道”,选择 OpenAI / DeepSeek / 阿里千问(百炼)/ + OpenAI 兼容;通道名称建议按“服务商 · 模型”填写(例如“阿里千问 · qwen-plus”), + 系统会随服务商选择自动带出默认 Base URL 与模型名。 +2. 填写 API Key 并点击该通道的“测试”;Key 仅保存在本地 `data/math.db`, + 回显只显示末四位。可新增多个通道并用“设为默认”指定生成题目时使用的通道。 +3. 打开“题库管理”,选择教材、章节、数量、难度、该章节知识点(可多选)与 + 生成使用的模型通道(默认取“默认通道”), + 点击“开始生成”。返回结果会做 JSON 结构校验(4 个选项、唯一答案、非空题干)后 + 入库并挂到所选教材章节下,可在该章“章节测试”中直接使用;题库页支持筛选与删除。 + +大模型调用统一走 OpenAI Chat Completions 协议(`services/llm_client.py`), +不需要额外 SDK;生成的题若带新知识点,首次作答会自动建立该知识点并参与掌握度计算。 +生成提示词要求模型把数学公式写成 LaTeX(`$...$` 或 `$$...$$`)、插图写成 +`![图注](图片地址)`;题库、练习、错题本与练习记录中的题目内容均由前端 KaTeX +渲染公式并展示图片。 + +### 教材章节的 AI 生成与题库跳转 + +在“教材课程管理”中打开某本教材的“章节”抽屉后: + +1. “添加章节”仍可手动输入名称与内容提示; +2. “AI 生成章节”按钮位于“添加章节”之后;无需选择数量,选择模型通道与可选说明后, + 系统会先查找内置官方目录(函数与图像、三角函数、坐标方法、几何等正式章节), + 再按 ISBN 查询 Open Library / Google Books;查到正式目录时直接按正式章节补齐, + 不会让模型自由发挥;如果无法核实正式目录,接口会明确拒绝生成并提示手动添加, + 避免产生与原书无关的章节。新章节入库后可继续编辑或删除; +3. 每个章节行都有“题库”入口,点击后跳转到题库管理并自动筛选该书与章节。 + +题库管理每道题会标注“使用状态”(已使用次数 / 未使用)。使用过的题目和被 +章节挂载的题目不允许删除,只能编辑;题目编辑会保留历史答题快照。 + +### AI 出题配图机制(自动生成,不使用图库/上传) + +生成新题弹窗中有一个“需要配图(AI 根据题目自动生成图像)”开关: + +- 不勾选:题目正常生成,不携带图像; +- 勾选后:提示词要求模型为这道题生成与题目语义一致的原创 SVG(函数图/几何示意图, + 含坐标轴与关键标注),模型把它放在 JSON 的 `image_svg` 字段; +- 后端把每张 SVG 独立保存为 `/api/question-images/generated_*.svg` 并自动写入题干, + 因此每道题都有自己独立的图,互不共享。 + +### 知识点与章节、多知识点 + +- 每个章节可维护多个“本章知识点”(教材课程管理 → 章节 → 编辑); +- 生成新题先选教材和章节后,知识点下拉自动展示该章节的知识点,可多选; +- 题目支持多个知识点:列表、练习记录、错题、掌握度与推荐都会按全部知识点统计; +- 练习提交时如果出现未见过的新知识点,会自动为用户建立并参与掌握度计算。 + +## 主要 API + +所有接口前缀 `/api`,交互文档见 http://localhost:8000/docs。 + +| 方法 | 路径 | 说明 | +| --- | --- | --- | +| GET | `/overview` | 学习总览指标与推荐计划 | +| GET | `/knowledge` | 知识点掌握度 | +| GET | `/knowledge/detail/{id}` | 知识点详情:定义、相关知识点、关联章节与视频资源 | +| POST/DELETE | `/knowledge/nodes/{id}/resources`、`/knowledge/resources/{id}` | 知识点关联视频/课程(管理员) | +| GET | `/practice/chapter/{id}` | 章节测试组卷(不含答案) | +| POST | `/practice/submit` | 提交答案并判分、更新掌握度与错题 | +| GET/POST | `/daily`、`/daily/complete` | 今日完成状态 | +| GET | `/errors`、`/records`、`/records/{id}`、`/analytics` | 错题(含逐题详情)、记录、记录详情、分析 | +| GET/POST | `/archive/export`、`/archive/import` | 学习档案导出 / 恢复 | +| GET | `/textbooks` | 教材/课程目录(含章节,登录可用) | +| POST/PUT/DELETE | `/textbooks` 与 `/textbooks/{id}` | 教材/课程增删改(管理员) | +| POST/PUT/DELETE | `/textbooks/.../chapters` | 章节管理(管理员) | +| POST | `/textbooks/{id}/chapters/generate` | 按教材 AI 生成章节(管理员) | +| GET/POST/PUT/DELETE | `/question-bank/questions`、`…/generate` | 题库管理:列表/生成/编辑/删除(管理员),已使用题禁止删除 | +| GET | `/llm/settings` | 模型通道列表与服务商预设(管理员) | +| POST/PUT/DELETE | `/llm/channels` 与 `/llm/channels/{id}` | 模型通道增删改(管理员) | +| PUT | `/llm/channels/{id}/default` | 设置默认通道(管理员) | +| POST | `/llm/channels/{id}/test`、`/llm/test` | 通道连通测试(管理员) | +| PUT | `/auth/profile` | 修改自己的用户昵称 | +| POST | `/auth/login`、`/auth/change-password` | 登录、修改自己的密码 | +| GET | `/auth/me` | 当前用户与角色 | +| GET/POST/PUT | `/users`、`/users/{id}`、`/users/roles` | 用户管理(管理员) | + +## 配置 + +复制 `.env.example` 并按需修改(本机直接运行时使用环境变量): + +- `DATABASE_URL`:留空默认使用 `<项目根>/data/math.db` +- `CORS_ORIGINS`:允许访问的前端地址 +- `OPENAI_API_KEY`:可选。数据库还没有任何模型通道时,启动会自动创建 + “OpenAI · gpt-4o-mini”默认通道并使用该 Key; + `ai_teacher.py` 的逐题讲解仍为本地规则实现 +- `JWT_SECRET`:JWT 签名密钥,生产环境必须设置 + +## 重置演示数据 + +```bash +cd backend +.venv/bin/python -m seed --force +``` + +会清空全部用户的学习数据与题库(含 AI 生成题)并重新写入种子数据; +用户、角色、教材目录与模型配置保留。演示账号的学习历史(练习记录、错题本) +现在包含逐题明细,可直接展开查看每题作答。 diff --git a/backend/database.py b/backend/database.py new file mode 100644 index 0000000..2433b95 --- /dev/null +++ b/backend/database.py @@ -0,0 +1,185 @@ +"""SQLite 数据库连接与会话管理。""" +from __future__ import annotations + +import os +from pathlib import Path + +from sqlalchemy import create_engine, event +from sqlalchemy import inspect, text +from sqlalchemy.orm import DeclarativeBase, sessionmaker + + +REPO_ROOT = Path(__file__).resolve().parent.parent +DEFAULT_DB_PATH = REPO_ROOT / "data" / "math.db" + + +class Base(DeclarativeBase): + pass + + +def _engine_url() -> str: + url = os.getenv("DATABASE_URL", "").strip() + if url: + return url + DEFAULT_DB_PATH.parent.mkdir(parents=True, exist_ok=True) + return f"sqlite:///{DEFAULT_DB_PATH}" + + +DATABASE_URL = _engine_url() +connect_args = {"check_same_thread": False} if DATABASE_URL.startswith("sqlite") else {} + +engine = create_engine(DATABASE_URL, connect_args=connect_args) +SessionLocal = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False) + + +if DATABASE_URL.startswith("sqlite"): + @event.listens_for(engine, "connect") + def _enable_sqlite_foreign_keys(dbapi_connection, _connection_record): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() + + +def ensure_schema() -> None: + """建表并为旧库补充新增列(SQLite 不会由 create_all 自动加列)。""" + Base.metadata.create_all(bind=engine) + inspector = inspect(engine) + + additions: dict[str, list[tuple[str, str]]] = { + "questions": [ + ("chapter_id", "INTEGER"), + ("difficulty", "INTEGER NOT NULL DEFAULT 1"), + ("is_generated", "BOOLEAN NOT NULL DEFAULT 0"), + ("used_count", "INTEGER NOT NULL DEFAULT 0"), + ], + "llm_settings": [ + ("name", "VARCHAR(128) NOT NULL DEFAULT ''"), + ("is_default", "BOOLEAN NOT NULL DEFAULT 0"), + ("created_at", "DATETIME"), + ("max_tokens", "INTEGER"), + ], + "attempt_items": [ + ("knowledge_names", "TEXT NOT NULL DEFAULT '[]'"), + ], + "knowledge": [ + ("domain", "VARCHAR(16) NOT NULL DEFAULT '初等'"), + ("category", "VARCHAR(64) NOT NULL DEFAULT ''"), + ], + "error_entries": [ + ("attempt_id", "INTEGER"), + ("question_id", "INTEGER"), + ("stem", "TEXT NOT NULL DEFAULT ''"), + ("options", "TEXT NOT NULL DEFAULT ''"), + ("selected", "INTEGER"), + ("correct_index", "INTEGER"), + ("explanation", "TEXT NOT NULL DEFAULT ''"), + ("knowledge_names", "TEXT NOT NULL DEFAULT '[]'"), + ], + "attempt_sessions": [ + ("chapter_id", "INTEGER"), + ], + "chapters": [ + ("ebook_page", "INTEGER NOT NULL DEFAULT 0"), + ], + "textbooks": [ + ("ebook_file", "VARCHAR(256) NOT NULL DEFAULT ''"), + ("ebook_name", "VARCHAR(256) NOT NULL DEFAULT ''"), + ("ebook_format", "VARCHAR(8) NOT NULL DEFAULT ''"), + ("ebook_size", "INTEGER NOT NULL DEFAULT 0"), + ("ebook_pages", "INTEGER NOT NULL DEFAULT 0"), + ("ebook_uploaded_at", "DATETIME"), + ], + "knowledge_resources": [ + ("course_id", "INTEGER"), + ], + "daily_completions": [ + ("chapter_id", "INTEGER"), + ("rating", "VARCHAR(16) NOT NULL DEFAULT ''"), + ], + } + for table_name, columns in additions.items(): + if table_name not in inspector.get_table_names(): + continue + existing = { + column["name"] for column in inspector.get_columns(table_name) + } + for name, definition in columns: + if name in existing: + continue + with engine.begin() as connection: + connection.execute( + text( + f"ALTER TABLE {table_name} " + f"ADD COLUMN {name} {definition}" + ) + ) + + # 补列之后再搬数据:迁移要写 knowledge_resources.course_id + _split_courses() + + +def _split_courses() -> None: + """把旧 textbooks 表里的“在线课程”行搬到 courses 表,并去掉 kind 列。 + + 教材与课程从此各用一张表:教材带章节目录与电子书,课程只有外链。 + 幂等:kind 列不存在(已迁移过)时直接返回。 + """ + inspector = inspect(engine) + tables = inspector.get_table_names() + if "textbooks" not in tables or "courses" not in tables: + return + columns = {column["name"] for column in inspector.get_columns("textbooks")} + if "kind" not in columns: + return + + with engine.begin() as connection: + rows = connection.execute( + text( + "SELECT id, name, publisher, link, grade, description, position " + "FROM textbooks WHERE kind = 'course'" + ) + ).fetchall() + for row in rows: + exists = connection.execute( + text("SELECT id FROM courses WHERE name = :name"), + {"name": row[1]}, + ).first() + if exists is None: + connection.execute( + text( + "INSERT INTO courses " + "(name, provider, url, grade, description, position) " + "VALUES (:name, :provider, :url, :grade, :description, :position)" + ), + { + "name": row[1], + "provider": row[2] or "", + "url": row[3] or "", + "grade": row[4] or "", + "description": row[5] or "", + "position": row[6] or 0, + }, + ) + exists = connection.execute( + text("SELECT id FROM courses WHERE name = :name"), + {"name": row[1]}, + ).first() + # 知识点上的视频资源改挂课程,删教材行时不会被级联删掉 + connection.execute( + text( + "UPDATE knowledge_resources " + "SET course_id = :course_id, textbook_id = NULL " + "WHERE textbook_id = :textbook_id" + ), + {"course_id": exists[0], "textbook_id": row[0]}, + ) + connection.execute(text("DELETE FROM textbooks WHERE kind = 'course'")) + connection.execute(text("ALTER TABLE textbooks DROP COLUMN kind")) + + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/backend/dependencies.py b/backend/dependencies.py new file mode 100644 index 0000000..94a9f79 --- /dev/null +++ b/backend/dependencies.py @@ -0,0 +1,62 @@ +"""认证与 RBAC 依赖。""" +from __future__ import annotations + +from fastapi import Depends, HTTPException, status +from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer +from sqlalchemy.orm import Session + +from database import get_db +from models import Permission, Role, RolePermission, User, UserRole +from services.security import decode_access_token + + +bearer = HTTPBearer(auto_error=False) + + +def get_current_user( + credentials: HTTPAuthorizationCredentials | None = Depends(bearer), + db: Session = Depends(get_db), +) -> User: + if credentials is None: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="请先登录", + headers={"WWW-Authenticate": "Bearer"}, + ) + user_id = decode_access_token(credentials.credentials) + if user_id is None: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="登录已失效") + user = db.get(User, user_id) + if user is None or not user.active: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="用户不可用") + return user + + +def user_permissions(db: Session, user: User) -> set[str]: + rows = ( + db.query(Permission.code) + .join(RolePermission, RolePermission.permission_id == Permission.id) + .join(Role, Role.id == RolePermission.role_id) + .join(UserRole, UserRole.role_id == Role.id) + .filter(UserRole.user_id == user.id) + .all() + ) + return {code for (code,) in rows} + + +def require_permission(code: str): + def checker( + user: User = Depends(get_current_user), + db: Session = Depends(get_db), + ) -> User: + if code not in user_permissions(db, user): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="没有权限执行该操作", + ) + return user + + return checker + + +require_learning_user = require_permission("learning:use") diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..469acd8 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,141 @@ +"""数学学习系统后端入口。""" +from __future__ import annotations + +import json +import os + +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from sqlalchemy import text + +from database import REPO_ROOT, SessionLocal, ensure_schema +from routers import ( + analytics, + archive, + auth, + catalog, + courses, + data, + ebooks, + llm, + knowledge_graph, + overview, + practice, + question_bank, + users, +) +from seed.catalog import ensure_catalog +from services import ebooks as ebook_store +from seed.ebooks import ensure_ebooks +from seed.knowledge_graph import ensure_knowledge_graph +from seed.rbac import ensure_rbac +from services.learning_profile import ( + ensure_default_profiles, + remove_unused_admin_profile, + user_has_admin_role, +) +from services.llm_config import ensure_llm_channels +from models import AttemptItem, ErrorEntry, Question, User +from services.knowledge_service import set_question_knowledge_names + + +ensure_schema() +db = SessionLocal() +try: + ensure_rbac(db) + ensure_knowledge_graph(db) + ensure_default_profiles(db) + for user in db.query(User).all(): + if user_has_admin_role(db, user.id): + remove_unused_admin_profile(db, user.id) + ensure_catalog(db) + ensure_ebooks(db) + ebook_store.backfill_pages(db) + ensure_llm_channels(db) + db.execute( + text( + "UPDATE questions SET used_count = (" + "SELECT COUNT(*) FROM attempt_items " + "WHERE attempt_items.question_id = questions.id" + ") WHERE id IN (SELECT DISTINCT question_id FROM attempt_items " + "WHERE question_id IS NOT NULL)" + ) + ) + for question in db.query(Question).all(): + has_links = db.execute( + text( + "SELECT 1 FROM question_knowledge " + "WHERE question_id = :qid LIMIT 1" + ), + {"qid": question.id}, + ).first() + if has_links is None: + set_question_knowledge_names( + db, + question, + [question.knowledge_name], + attach_to_chapter=True, + ) + for row in db.query(ErrorEntry).all(): + if not row.knowledge_names or row.knowledge_names == "[]": + row.knowledge_names = json.dumps( + [row.knowledge_name], ensure_ascii=False + ) + for row in db.query(AttemptItem).all(): + if not row.knowledge_names or row.knowledge_names == "[]": + row.knowledge_names = json.dumps( + [row.knowledge_name], ensure_ascii=False + ) + db.commit() +finally: + db.close() + + +def _cors_origins() -> list[str]: + raw = os.getenv("CORS_ORIGINS", "http://localhost:5173,http://127.0.0.1:5173") + return [origin.strip() for origin in raw.split(",") if origin.strip()] + + +app = FastAPI( + title="数学学习系统 API", + description="个人数学学习系统后端:章节组卷判分、掌握度引擎、错题与学习档案。", + version="1.0.0", +) +app.add_middleware( + CORSMiddleware, + allow_origins=_cors_origins(), + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + # 阅读器依赖 Range 分段加载,需要能读到这几个响应头 + expose_headers=["Accept-Ranges", "Content-Range", "Content-Length"], +) + +app.include_router(overview.router, prefix="/api") +app.include_router(data.router, prefix="/api") +app.include_router(analytics.router, prefix="/api") +app.include_router(practice.router, prefix="/api") +app.include_router(archive.router, prefix="/api") +app.include_router(catalog.router, prefix="/api") +app.include_router(courses.router, prefix="/api") +app.include_router(ebooks.router, prefix="/api") +app.include_router(ebooks.progress_router, prefix="/api") +app.include_router(question_bank.router, prefix="/api") +app.include_router(llm.router, prefix="/api") +app.include_router(auth.router, prefix="/api") +app.include_router(users.router, prefix="/api") +app.include_router(knowledge_graph.router, prefix="/api") + +image_dir = REPO_ROOT / "data" / "question_images" +image_dir.mkdir(parents=True, exist_ok=True) +app.mount( + "/api/question-images", + StaticFiles(directory=image_dir), + name="question-images", +) + + +@app.get("/api/health") +def health(): + return {"status": "ok", "service": "math-learning-backend"} diff --git a/backend/models/__init__.py b/backend/models/__init__.py new file mode 100644 index 0000000..d4df30c --- /dev/null +++ b/backend/models/__init__.py @@ -0,0 +1,399 @@ +"""ORM 模型:知识点、题目、练习记录、错题与每日完成状态。""" +from __future__ import annotations + +from datetime import date, datetime + +from sqlalchemy import ( + Boolean, + Date, + Float, + ForeignKey, + Integer, + String, + Text, + UniqueConstraint, + DateTime, +) +from sqlalchemy.orm import Mapped, mapped_column + +from database import Base + + +class User(Base): + __tablename__ = "users" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + username: Mapped[str] = mapped_column(String(64), unique=True, index=True) + password_hash: Mapped[str] = mapped_column(Text) + display_name: Mapped[str] = mapped_column(String(64), default="") + active: Mapped[bool] = mapped_column(Boolean, default=True) + created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) + + +class Role(Base): + __tablename__ = "roles" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + code: Mapped[str] = mapped_column(String(32), unique=True) + name: Mapped[str] = mapped_column(String(64)) + description: Mapped[str] = mapped_column(Text, default="") + + +class Permission(Base): + __tablename__ = "permissions" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + code: Mapped[str] = mapped_column(String(64), unique=True) + name: Mapped[str] = mapped_column(String(64)) + group: Mapped[str] = mapped_column(String(32), default="system") + + +class UserRole(Base): + __tablename__ = "user_roles" + __table_args__ = (UniqueConstraint("user_id", "role_id"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + role_id: Mapped[int] = mapped_column( + ForeignKey("roles.id", ondelete="CASCADE"), index=True + ) + + +class RolePermission(Base): + __tablename__ = "role_permissions" + __table_args__ = (UniqueConstraint("role_id", "permission_id"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + role_id: Mapped[int] = mapped_column( + ForeignKey("roles.id", ondelete="CASCADE"), index=True + ) + permission_id: Mapped[int] = mapped_column( + ForeignKey("permissions.id", ondelete="CASCADE"), index=True + ) + + +class Knowledge(Base): + """全局知识点(同一知识点可被多个章节复用,用关系表关联)。""" + + __tablename__ = "knowledge" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String(64), unique=True) + domain: Mapped[str] = mapped_column(String(16), default="初等") # 初等 / 高等 + category: Mapped[str] = mapped_column(String(64), default="") + description: Mapped[str] = mapped_column(Text, default="") + + +class KnowledgeRelation(Base): + """知识点间关系,支持未来知识图谱(前置/包含/相关等)。""" + + __tablename__ = "knowledge_relations" + __table_args__ = ( + UniqueConstraint("source_id", "target_id", "relation_type"), + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + source_id: Mapped[int] = mapped_column( + ForeignKey("knowledge.id", ondelete="CASCADE"), index=True + ) + target_id: Mapped[int] = mapped_column( + ForeignKey("knowledge.id", ondelete="CASCADE"), index=True + ) + relation_type: Mapped[str] = mapped_column( + String(16), default="前置" + ) # 前置 / 包含 / 相关 + + +class KnowledgeResource(Base): + """知识点对外资源链接(视频 / 在线课程 / 电子教材)。 + + 教材与章节不在此登记:章节通过 ChapterKnowledge 反向引用知识点, + 知识点详情据此反查“哪本书的哪一章讲了它”。 + """ + + __tablename__ = "knowledge_resources" + __table_args__ = (UniqueConstraint("knowledge_id", "kind", "url"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + knowledge_id: Mapped[int] = mapped_column( + ForeignKey("knowledge.id", ondelete="CASCADE"), index=True + ) + kind: Mapped[str] = mapped_column(String(16), default="video") # video | book + title: Mapped[str] = mapped_column(String(128), default="") + url: Mapped[str] = mapped_column(String(256), default="") + textbook_id: Mapped[int | None] = mapped_column( + ForeignKey("textbooks.id", ondelete="CASCADE"), + nullable=True, + ) + course_id: Mapped[int | None] = mapped_column( + ForeignKey("courses.id", ondelete="CASCADE"), + nullable=True, + ) + position: Mapped[int] = mapped_column(Integer, default=0) + + +class ChapterKnowledge(Base): + __tablename__ = "chapter_knowledge" + __table_args__ = (UniqueConstraint("chapter_id", "knowledge_id"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + chapter_id: Mapped[int] = mapped_column( + ForeignKey("chapters.id", ondelete="CASCADE"), index=True + ) + knowledge_id: Mapped[int] = mapped_column( + ForeignKey("knowledge.id", ondelete="CASCADE"), index=True + ) + + +class QuestionKnowledge(Base): + __tablename__ = "question_knowledge" + __table_args__ = (UniqueConstraint("question_id", "knowledge_id"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + question_id: Mapped[int] = mapped_column( + ForeignKey("questions.id", ondelete="CASCADE"), index=True + ) + knowledge_id: Mapped[int] = mapped_column( + ForeignKey("knowledge.id", ondelete="CASCADE"), index=True + ) + + +class UserKnowledge(Base): + """用户对某全局知识点的掌握度(知识点经章节/题目引用,不靠名称匹配)。""" + + __tablename__ = "user_knowledge" + __table_args__ = (UniqueConstraint("user_id", "knowledge_id"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + knowledge_id: Mapped[int] = mapped_column( + ForeignKey("knowledge.id", ondelete="CASCADE"), index=True + ) + mastery: Mapped[int] = mapped_column(Integer, default=60) + position: Mapped[int] = mapped_column(Integer, default=0) + + +class Textbook(Base): + __tablename__ = "textbooks" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String(128), unique=True) + author: Mapped[str] = mapped_column(String(128), default="") + publisher: Mapped[str] = mapped_column(String(128), default="") + isbn: Mapped[str] = mapped_column(String(32), default="") + edition: Mapped[str] = mapped_column(String(64), default="") + grade: Mapped[str] = mapped_column(String(32), default="") + link: Mapped[str] = mapped_column(String(256), default="") + description: Mapped[str] = mapped_column(Text, default="") + position: Mapped[int] = mapped_column(Integer, default=0) + # 电子书:文件放在 data/ebooks/{textbook_id}/ 下,表里只存文件名与元信息 + ebook_file: Mapped[str] = mapped_column(String(256), default="") + ebook_name: Mapped[str] = mapped_column(String(256), default="") # 上传时的原始文件名 + ebook_format: Mapped[str] = mapped_column(String(8), default="") # pdf | epub + ebook_size: Mapped[int] = mapped_column(Integer, default=0) + # 篇幅:PDF 页数 / EPUB 章节数,阅读器首次打开后回填真实值 + ebook_pages: Mapped[int] = mapped_column(Integer, default=0) + ebook_uploaded_at: Mapped[datetime | None] = mapped_column( + DateTime, nullable=True + ) + + +class Course(Base): + """在线课程 / 视频课:只有外链,不带章节与电子书,因此与教材分表存放。""" + + __tablename__ = "courses" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String(128), unique=True) + provider: Mapped[str] = mapped_column(String(128), default="") # 开课方 + url: Mapped[str] = mapped_column(String(256), default="") + grade: Mapped[str] = mapped_column(String(32), default="") + description: Mapped[str] = mapped_column(Text, default="") + position: Mapped[int] = mapped_column(Integer, default=0) + + +class Chapter(Base): + __tablename__ = "chapters" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + textbook_id: Mapped[int] = mapped_column( + ForeignKey("textbooks.id", ondelete="CASCADE"), index=True + ) + name: Mapped[str] = mapped_column(String(128)) + position: Mapped[int] = mapped_column(Integer, default=0) + summary: Mapped[str] = mapped_column(Text, default="") + # 章节在电子书里的起始定位:PDF 是页码,EPUB 是 spine 节序号;0 表示未设置 + ebook_page: Mapped[int] = mapped_column(Integer, default=0) + + +class Question(Base): + __tablename__ = "questions" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + # 遗留字段:早期“专项练习 / 自适应题库”分类,已不再作为业务概念使用, + # 仅为兼容旧数据库保留列。 + source: Mapped[str] = mapped_column(String(16), default="bank") + stem: Mapped[str] = mapped_column(Text) + options: Mapped[str] = mapped_column(Text) # JSON 字符串 + correct_index: Mapped[int] = mapped_column(Integer) + knowledge_name: Mapped[str] = mapped_column(String(64), index=True) + explanation: Mapped[str] = mapped_column(Text, default="") + chapter_id: Mapped[int | None] = mapped_column( + ForeignKey("chapters.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) + difficulty: Mapped[int] = mapped_column(Integer, default=1) + is_generated: Mapped[bool] = mapped_column(Boolean, default=False) + used_count: Mapped[int] = mapped_column(Integer, default=0) + + +class AttemptSession(Base): + __tablename__ = "attempt_sessions" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + mode: Mapped[str] = mapped_column(String(16)) + title: Mapped[str] = mapped_column(String(64)) + total: Mapped[int] = mapped_column(Integer) + correct: Mapped[int] = mapped_column(Integer) + chapter_id: Mapped[int | None] = mapped_column( + ForeignKey("chapters.id", ondelete="SET NULL"), + nullable=True, + index=True, + ) + happened_on: Mapped[date] = mapped_column(Date, default=date.today) + + +class AttemptItem(Base): + """练习中的逐题作答明细(题目做快照保存,删除题库不影响历史记录)。""" + + __tablename__ = "attempt_items" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + attempt_id: Mapped[int] = mapped_column( + ForeignKey("attempt_sessions.id", ondelete="CASCADE"), index=True + ) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + question_index: Mapped[int] = mapped_column(Integer, default=1) + question_id: Mapped[int | None] = mapped_column( + ForeignKey("questions.id", ondelete="SET NULL"), + nullable=True, + ) + stem: Mapped[str] = mapped_column(Text) + options: Mapped[str] = mapped_column(Text) # JSON 字符串 + correct_index: Mapped[int] = mapped_column(Integer) + selected: Mapped[int | None] = mapped_column(Integer, nullable=True) + correct: Mapped[bool] = mapped_column(Boolean) + knowledge_name: Mapped[str] = mapped_column(String(64), index=True) + knowledge_names: Mapped[str] = mapped_column(Text, default="[]") + explanation: Mapped[str] = mapped_column(Text, default="") + + +class ErrorEntry(Base): + __tablename__ = "error_entries" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + source_label: Mapped[str] = mapped_column(String(64)) + knowledge_name: Mapped[str] = mapped_column(String(64), index=True) + knowledge_names: Mapped[str] = mapped_column(Text, default="[]") + diagnosis: Mapped[str] = mapped_column(Text) + status: Mapped[str] = mapped_column(String(16), default="待复习") + created_on: Mapped[date] = mapped_column(Date, default=date.today) + attempt_id: Mapped[int | None] = mapped_column( + ForeignKey("attempt_sessions.id", ondelete="SET NULL"), + nullable=True, + ) + question_id: Mapped[int | None] = mapped_column( + ForeignKey("questions.id", ondelete="SET NULL"), + nullable=True, + ) + stem: Mapped[str] = mapped_column(Text, default="") + options: Mapped[str] = mapped_column(Text, default="") # JSON 字符串 + selected: Mapped[int | None] = mapped_column(Integer, nullable=True) + correct_index: Mapped[int | None] = mapped_column(Integer, nullable=True) + explanation: Mapped[str] = mapped_column(Text, default="") + + +class DailyCompletion(Base): + __tablename__ = "daily_completions" + __table_args__ = (UniqueConstraint("user_id", "done_on"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + chapter_id: Mapped[int | None] = mapped_column( + ForeignKey("chapters.id", ondelete="SET NULL"), nullable=True, index=True + ) + rating: Mapped[str] = mapped_column(String(16), default="") + done_on: Mapped[date] = mapped_column(Date) + + +class LlmSetting(Base): + __tablename__ = "llm_settings" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String(128), default="") + provider: Mapped[str] = mapped_column(String(32), default="openai") + api_key: Mapped[str] = mapped_column(Text, default="") + base_url: Mapped[str] = mapped_column(String(256), default="") + model: Mapped[str] = mapped_column(String(64), default="") + temperature: Mapped[float] = mapped_column(Float, default=0.3) + max_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + is_default: Mapped[bool] = mapped_column(Boolean, default=False) + created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) + + +class LlmTask(Base): + """异步大模型任务:题目生成 / 章节生成,支持进度查询。""" + + __tablename__ = "llm_tasks" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + kind: Mapped[str] = mapped_column(String(32)) # generate_questions / generate_chapters + status: Mapped[str] = mapped_column(String(16), default="pending") + progress: Mapped[int] = mapped_column(Integer, default=0) + message: Mapped[str] = mapped_column(Text, default="等待执行") + params: Mapped[str] = mapped_column(Text, default="{}") + result: Mapped[str] = mapped_column(Text, default="") + created_by: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) + finished_at: Mapped[datetime | None] = mapped_column( + DateTime, nullable=True + ) + + +class EbookProgress(Base): + """阅读进度:PDF 记页码,EPUB 记 CFI,每人每本书一条。""" + + __tablename__ = "ebook_progress" + __table_args__ = (UniqueConstraint("user_id", "textbook_id"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), index=True + ) + textbook_id: Mapped[int] = mapped_column( + ForeignKey("textbooks.id", ondelete="CASCADE"), index=True + ) + locator: Mapped[str] = mapped_column(String(512), default="") # EPUB CFI + page: Mapped[int] = mapped_column(Integer, default=0) + total: Mapped[int] = mapped_column(Integer, default=0) + position: Mapped[float] = mapped_column(Float, default=0.0) # 0~1 + updated_at: Mapped[datetime] = mapped_column( + DateTime, default=datetime.utcnow, onupdate=datetime.utcnow + ) diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..ddc9ee0 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,8 @@ +fastapi>=0.115,<1.0 +uvicorn[standard]>=0.30 +sqlalchemy>=2.0,<3.0 +pydantic>=2.7,<3.0 +httpx>=0.27,<1.0 +pyjwt>=2.8,<3.0 +python-multipart>=0.0.20 +pypdf>=5.0,<7.0 diff --git a/backend/routers/__init__.py b/backend/routers/__init__.py new file mode 100644 index 0000000..f129712 --- /dev/null +++ b/backend/routers/__init__.py @@ -0,0 +1 @@ +"""API 路由模块。""" diff --git a/backend/routers/analytics.py b/backend/routers/analytics.py new file mode 100644 index 0000000..c62ea1d --- /dev/null +++ b/backend/routers/analytics.py @@ -0,0 +1,95 @@ +"""学习分析。""" +from __future__ import annotations + +import json + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import get_current_user, user_permissions +from models import AttemptSession, ErrorEntry, User +from schemas import AnalyticsOut, DiagnosisOut, MetricItem +from services.mastery_engine import action_for, snapshot + + +router = APIRouter(tags=["analytics"]) + + +def build_analytics(db: Session, user_id: int) -> AnalyticsOut: + """按用户聚合学习分析:本人分析与管理员查看指定用户共用同一份逻辑。""" + sessions = ( + db.query(AttemptSession) + .filter(AttemptSession.user_id == user_id) + .order_by(AttemptSession.id.asc()) + .all() + ) + total_answers = sum(s.total for s in sessions) + total_correct = sum(s.correct for s in sessions) + accuracy = total_correct / total_answers * 100 if total_answers else 0.0 + + last = sessions[-1] if sessions else None + errors_count = ( + db.query(ErrorEntry).filter(ErrorEntry.user_id == user_id).count() + ) + knowledge_rows = snapshot(db, user_id) + weak_count = sum(1 for k in knowledge_rows if k.mastery < 60) + + metrics = [ + MetricItem( + label="历史正确率", + value=f"{accuracy:.1f}%" if total_answers else "0%", + ), + MetricItem( + label="最近一次", + value=f"{last.correct}/{last.total}" if last else "—", + ), + MetricItem(label="错题数量", value=str(errors_count)), + MetricItem(label="需重点干预", value=str(weak_count)), + ] + + error_counts: dict[str, int] = {} + for row in ( + db.query(ErrorEntry.knowledge_name, ErrorEntry.knowledge_names) + .filter(ErrorEntry.user_id == user_id) + .all() + ): + try: + names = json.loads(row[1] or "[]") + if not isinstance(names, list) or not names: + names = [row[0]] + except (TypeError, ValueError): + names = [row[0]] + for name in {str(name) for name in names}: + error_counts[name] = error_counts.get(name, 0) + 1 + + diagnosis = [ + DiagnosisOut( + name=k.name, + mastery=k.mastery, + error_count=error_counts.get(k.name, 0), + action=action_for(k.mastery), + ) + for k in sorted(knowledge_rows, key=lambda x: x.mastery) + ] + return AnalyticsOut(metrics=metrics, diagnosis=diagnosis) + + +@router.get("/analytics", response_model=AnalyticsOut) +def get_analytics( + user_id: int | None = None, + db: Session = Depends(get_db), + user: User = Depends(get_current_user), +): + """默认返回本人学习分析;管理员可用 user_id 查看指定用户(用户管理子页面)。""" + permissions = user_permissions(db, user) + target_id = user.id + if user_id is not None and user_id != user.id: + if "users:manage" not in permissions: + raise HTTPException(status_code=403, detail="没有权限查看该用户的学习分析") + target_id = user_id + elif "learning:use" not in permissions and "users:manage" not in permissions: + raise HTTPException(status_code=403, detail="没有权限执行该操作") + if db.get(User, target_id) is None: + raise HTTPException(status_code=404, detail="用户不存在") + return build_analytics(db, target_id) diff --git a/backend/routers/archive.py b/backend/routers/archive.py new file mode 100644 index 0000000..fe3b586 --- /dev/null +++ b/backend/routers/archive.py @@ -0,0 +1,377 @@ +"""学习档案导入 / 导出(对应静态版的导出 / 导入 JSON)。""" +from __future__ import annotations + +import json +from datetime import date, datetime + +from fastapi import APIRouter, Depends, HTTPException, Response +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_learning_user +from models import ( + AttemptItem, + AttemptSession, + DailyCompletion, + ErrorEntry, + Knowledge, + User, + UserKnowledge, +) +from schemas import ImportPayload, ImportResult +from services.knowledge_service import ensure_knowledge + + +router = APIRouter(prefix="/archive", tags=["archive"]) + + +def _as_date(value) -> date: + if isinstance(value, date): + return value + return date.fromisoformat(str(value)) + + +def _options_to_json(value) -> str: + if isinstance(value, list): + return json.dumps([str(option) for option in value], ensure_ascii=False) + return "" + + +def _parse_options(value) -> list[str]: + if not isinstance(value, list): + return [] + return [str(option) for option in value] + + +def _parse_item_dict(value, index: int) -> dict: + if not isinstance(value, dict): + raise ValueError(f"第 {index} 题明细格式不正确") + stem = str(value.get("stem", "")).strip() + options = _parse_options(value.get("options")) + if not stem or len(options) != 4: + raise ValueError(f"第 {index} 题明细缺少题干或选项") + try: + correct_index = int(value.get("correct_index", -1)) + except (TypeError, ValueError) as exc: + raise ValueError(f"第 {index} 题明细 correct_index 不是数字") from exc + selected = value.get("selected") + if selected is not None: + try: + selected = int(selected) + except (TypeError, ValueError) as exc: + raise ValueError(f"第 {index} 题明细 selected 不是数字") from exc + raw_names = value.get("knowledge_names") or [] + if not isinstance(raw_names, list) or not raw_names: + raw_names = [value.get("knowledge_name") or "章节综合"] + return { + "question_index": index, + "question_id": value.get("question_id"), + "stem": stem, + "options": options, + "correct_index": correct_index, + "selected": selected, + "correct": bool(value.get("correct", correct_index == selected)), + "knowledge_name": str(value.get("knowledge_name", "")).strip() or "章节综合", + "knowledge_names": [str(name) for name in raw_names], + "explanation": str(value.get("explanation", "")).strip(), + } + + +def _parse_record(item) -> dict: + if isinstance(item, list): + if len(item) != 4: + raise ValueError("练习记录需要 4 个字段") + return { + "happened_on": _as_date(item[0]), + "mode": "imported", + "title": str(item[1]), + "total": int(item[2]), + "correct": int(item[3]), + "items": [], + } + if isinstance(item, dict): + raw_items = item.get("items") or [] + parsed_items = [] + for index, raw in enumerate(raw_items, start=1): + parsed_items.append(_parse_item_dict(raw, index)) + return { + "happened_on": _as_date(item.get("date") or item.get("happened_on")), + "mode": str(item.get("mode", "imported")), + "title": str(item.get("title", "")), + "total": int(item.get("total", 0)), + "correct": int(item.get("correct", 0)), + "items": parsed_items, + } + raise ValueError("练习记录格式不正确") + + +def _parse_error(item) -> dict: + if isinstance(item, list): + if len(item) != 3: + raise ValueError("错题需要 3 个字段") + return { + "source_label": str(item[0]), + "knowledge_name": str(item[1]), + "knowledge_names": [str(item[1])], + "diagnosis": str(item[2]), + "stem": "", + "options": [], + "selected": None, + "correct_index": None, + "explanation": "", + } + if isinstance(item, dict): + raw_names = item.get("knowledge_names") or [] + knowledge_name = str(item.get("knowledge_name", "")) + if not isinstance(raw_names, list) or not raw_names: + raw_names = [knowledge_name] + return { + "source_label": str(item.get("source_label", "")), + "knowledge_name": knowledge_name, + "knowledge_names": [str(name) for name in raw_names], + "diagnosis": str(item.get("diagnosis", "")), + "stem": str(item.get("stem", "")), + "options": _parse_options(item.get("options")), + "selected": item.get("selected"), + "correct_index": item.get("correct_index"), + "explanation": str(item.get("explanation", "")), + } + raise ValueError("错题格式不正确") + + +def _session_items(db: Session, session_id: int) -> list[dict]: + rows = ( + db.query(AttemptItem) + .filter(AttemptItem.attempt_id == session_id) + .order_by(AttemptItem.question_index.asc(), AttemptItem.id.asc()) + .all() + ) + result = [] + for row in rows: + try: + options = json.loads(row.options) + if not isinstance(options, list): + options = [] + except (TypeError, ValueError): + options = [] + result.append( + { + "question_index": row.question_index, + "question_id": row.question_id, + "stem": row.stem, + "options": [str(option) for option in options], + "correct_index": row.correct_index, + "selected": row.selected, + "correct": bool(row.correct), + "knowledge_name": row.knowledge_name, + "knowledge_names": ( + json.loads(row.knowledge_names) + if row.knowledge_names + else [row.knowledge_name] + ), + "explanation": row.explanation, + } + ) + return result + + +@router.get("/export") +def export_archive( + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + knowledge = [ + {"name": knowledge.name, "mastery": user_knowledge.mastery} + for user_knowledge, knowledge in ( + db.query(UserKnowledge, Knowledge) + .join(Knowledge, Knowledge.id == UserKnowledge.knowledge_id) + .filter(UserKnowledge.user_id == user.id) + .order_by(UserKnowledge.position) + .all() + ) + ] + sessions = ( + db.query(AttemptSession) + .filter(AttemptSession.user_id == user.id) + .order_by(AttemptSession.id) + .all() + ) + records = [ + { + "date": session.happened_on.isoformat(), + "mode": session.mode, + "title": session.title, + "total": session.total, + "correct": session.correct, + "items": _session_items(db, session.id), + } + for session in sessions + ] + errors = [] + for error in ( + db.query(ErrorEntry) + .filter(ErrorEntry.user_id == user.id) + .order_by(ErrorEntry.id) + .all() + ): + item = { + "source_label": error.source_label, + "knowledge_name": error.knowledge_name, + "knowledge_names": ( + json.loads(error.knowledge_names) + if error.knowledge_names + else [error.knowledge_name] + ), + "diagnosis": error.diagnosis, + "stem": error.stem, + "selected": error.selected, + "correct_index": error.correct_index, + "explanation": error.explanation, + } + if error.options: + try: + parsed = json.loads(error.options) + item["options"] = parsed if isinstance(parsed, list) else [] + except (TypeError, ValueError): + item["options"] = [] + errors.append(item) + daily = [ + d.done_on.isoformat() + for d in db.query(DailyCompletion) + .filter(DailyCompletion.user_id == user.id) + .order_by(DailyCompletion.done_on) + .all() + ] + payload = { + "version": 2, + "exported_at": datetime.now().isoformat(timespec="seconds"), + "knowledge": knowledge, + "records": records, + "errors": errors, + "daily_completions": daily, + } + return Response( + content=json.dumps(payload, ensure_ascii=False, indent=2), + media_type="application/json", + headers={ + "Content-Disposition": 'attachment; filename="math-learning-archive.json"' + }, + ) + + +@router.post("/import", response_model=ImportResult) +def import_archive( + payload: ImportPayload, + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + if not payload.knowledge: + raise HTTPException(status_code=400, detail="档案中缺少 knowledge 字段") + + knowledge_items = [] + for item in payload.knowledge: + name = str(item.get("name", "")).strip() + mastery = item.get("mastery", item.get("v")) + if not name or mastery is None: + raise HTTPException(status_code=400, detail="knowledge 项缺少 name 或 mastery") + knowledge_items.append({"name": name, "mastery": max(0, min(100, int(mastery)))}) + + parsed_records: list[dict] = [] + for item in payload.records: + try: + parsed_records.append(_parse_record(item)) + except (ValueError, TypeError) as exc: + raise HTTPException(status_code=400, detail=f"记录格式错误:{exc}") from exc + + parsed_errors: list[dict] = [] + for item in payload.errors: + try: + parsed_errors.append(_parse_error(item)) + except (ValueError, TypeError) as exc: + raise HTTPException(status_code=400, detail=f"错题格式错误:{exc}") from exc + + try: + done_dates = [_as_date(value) for value in payload.daily_completions] + except ValueError as exc: + raise HTTPException(status_code=400, detail="日期格式应为 YYYY-MM-DD") from exc + + # 恢复式导入:档案内容作为当前学习状态替换进来 + db.query(AttemptItem).filter(AttemptItem.user_id == user.id).delete() + db.query(DailyCompletion).filter(DailyCompletion.user_id == user.id).delete() + db.query(ErrorEntry).filter(ErrorEntry.user_id == user.id).delete() + db.query(AttemptSession).filter(AttemptSession.user_id == user.id).delete() + db.query(UserKnowledge).filter(UserKnowledge.user_id == user.id).delete() + + for index, item in enumerate(knowledge_items): + knowledge = ensure_knowledge(db, item["name"]) + db.add( + UserKnowledge( + user_id=user.id, + knowledge_id=knowledge.id, + mastery=item["mastery"], + position=index, + ) + ) + for done_on in done_dates: + db.add(DailyCompletion(user_id=user.id, done_on=done_on)) + + item_count = 0 + for error in parsed_errors: + db.add( + ErrorEntry( + user_id=user.id, + source_label=error["source_label"], + knowledge_name=error["knowledge_name"], + knowledge_names=json.dumps( + error["knowledge_names"], ensure_ascii=False + ), + diagnosis=error["diagnosis"], + stem=error["stem"], + options=_options_to_json(error["options"]), + selected=error["selected"], + correct_index=error["correct_index"], + explanation=error["explanation"], + ) + ) + + for record in parsed_records: + session = AttemptSession( + user_id=user.id, + mode=record["mode"], + title=record["title"], + total=record["total"], + correct=record["correct"], + happened_on=record["happened_on"], + ) + db.add(session) + db.flush() + for item in record["items"]: + db.add( + AttemptItem( + attempt_id=session.id, + user_id=user.id, + question_index=item["question_index"], + # 题库题目可能已被删除,导入只保留快照不重建外键 + question_id=None, + stem=item["stem"], + options=_options_to_json(item["options"]), + correct_index=item["correct_index"], + selected=item.get("selected"), + correct=bool(item.get("correct")), + knowledge_name=item["knowledge_name"], + knowledge_names=json.dumps( + item["knowledge_names"], ensure_ascii=False + ), + explanation=item["explanation"], + ) + ) + item_count += 1 + db.commit() + return ImportResult( + imported=True, + knowledge=len(knowledge_items), + records=len(parsed_records), + errors=len(parsed_errors), + items=item_count, + message="学习档案导入成功。", + ) diff --git a/backend/routers/auth.py b/backend/routers/auth.py new file mode 100644 index 0000000..18fc05d --- /dev/null +++ b/backend/routers/auth.py @@ -0,0 +1,92 @@ +"""登录、会话与个人账号接口。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import get_current_user +from models import Role, User, UserRole +from schemas import ( + ChangePasswordIn, + LoginIn, + ProfileUpdate, + RoleOut, + TokenOut, + UserOut, +) +from services.security import create_access_token, hash_password, verify_password + + +router = APIRouter(prefix="/auth", tags=["auth"]) + + +def user_roles(db: Session, user: User) -> list[Role]: + return ( + db.query(Role) + .join(UserRole, UserRole.role_id == Role.id) + .filter(UserRole.user_id == user.id) + .order_by(Role.id.asc()) + .all() + ) + + +def user_to_out(db: Session, user: User) -> UserOut: + roles = user_roles(db, user) + return UserOut( + id=user.id, + username=user.username, + display_name=user.display_name, + active=user.active, + roles=[RoleOut.model_validate(role) for role in roles], + created_at=user.created_at, + ) + + +@router.post("/login", response_model=TokenOut) +def login(payload: LoginIn, db: Session = Depends(get_db)): + user = db.query(User).filter(User.username == payload.username).first() + if user is None or not verify_password(payload.password, user.password_hash): + raise HTTPException(status_code=401, detail="用户名或密码错误") + if not user.active: + raise HTTPException(status_code=403, detail="账号已被停用") + roles = user_roles(db, user) + if not roles: + raise HTTPException(status_code=403, detail="账号未分配角色") + return TokenOut( + access_token=create_access_token(user.id), + role=roles[0].code, + display_name=user.display_name or user.username, + ) + + +@router.get("/me", response_model=UserOut) +def me(user: User = Depends(get_current_user), db: Session = Depends(get_db)): + return user_to_out(db, user) + + +@router.post("/change-password") +def change_password( + payload: ChangePasswordIn, + user: User = Depends(get_current_user), + db: Session = Depends(get_db), +): + if not verify_password(payload.old_password, user.password_hash): + raise HTTPException(status_code=400, detail="原密码不正确") + user.password_hash = hash_password(payload.new_password) + db.commit() + return {"ok": True, "message": "密码已更新,下次登录请使用新密码。"} + + +@router.put("/profile", response_model=UserOut) +def update_profile( + payload: ProfileUpdate, + user: User = Depends(get_current_user), + db: Session = Depends(get_db), +): + name = payload.display_name.strip() + if not name: + raise HTTPException(status_code=400, detail="昵称不能为空") + user.display_name = name + db.commit() + return user_to_out(db, user) diff --git a/backend/routers/catalog.py b/backend/routers/catalog.py new file mode 100644 index 0000000..ef0c379 --- /dev/null +++ b/backend/routers/catalog.py @@ -0,0 +1,554 @@ +"""教材 / 课程目录:读取对登录用户开放,增删改仅管理员。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy import func +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import get_current_user, require_permission +from models import ( + Chapter, + EbookProgress, + ChapterKnowledge, + Knowledge, + LlmSetting, + Question, + Textbook, + User, +) +from schemas import ( + ChapterCreate, + EbookProgressOut, + ChapterOut, + ChapterUpdate, + ChaptersGenerateIn, + ChaptersGenerateOut, + ChaptersOrganizeIn, + TextbookCreate, + TextbookOut, + TextbookUpdate, +) +from services import ebooks as ebook_store +from services.catalog_generator import ( + generate_chapters, + organize_reference_chapters, +) +from services.isbn_lookup import fetch_isbn_context +from services.llm_config import get_default_channel +from services.knowledge_service import ( + set_chapter_knowledge_names, + set_chapter_knowledge_ids, +) + + +router = APIRouter(prefix="/textbooks", tags=["catalog"]) + + +def _chapter_out(db: Session, chapter: Chapter) -> ChapterOut: + question_count = ( + db.query(func.count(Question.id)) + .filter(Question.chapter_id == chapter.id) + .scalar() + or 0 + ) + knowledge_rows = ( + db.query(Knowledge.id, Knowledge.name) + .join(ChapterKnowledge, ChapterKnowledge.knowledge_id == Knowledge.id) + .filter(ChapterKnowledge.chapter_id == chapter.id) + .order_by(ChapterKnowledge.id.asc()) + .all() + ) + knowledge_names = [name for _, name in knowledge_rows] + return ChapterOut( + id=chapter.id, + textbook_id=chapter.textbook_id, + name=chapter.name, + position=chapter.position, + summary=chapter.summary, + ebook_page=chapter.ebook_page, + question_count=question_count, + knowledge_names=[str(name) for name in knowledge_names], + knowledge_ids=[kid for kid, _ in knowledge_rows], + ) + + +def _textbook_out( + db: Session, textbook: Textbook, user: User | None = None +) -> TextbookOut: + chapters = ( + db.query(Chapter) + .filter(Chapter.textbook_id == textbook.id) + .order_by(Chapter.position.asc(), Chapter.id.asc()) + .all() + ) + return TextbookOut( + id=textbook.id, + name=textbook.name, + author=textbook.author, + publisher=textbook.publisher, + isbn=textbook.isbn, + edition=textbook.edition, + grade=textbook.grade, + link=textbook.link, + description=textbook.description, + position=textbook.position, + chapters=[_chapter_out(db, chapter) for chapter in chapters], + ebook_file=textbook.ebook_file, + ebook_format=textbook.ebook_format, + ebook_name=textbook.ebook_name, + ebook_size=textbook.ebook_size, + ebook_pages=textbook.ebook_pages, + ebook_uploaded_at=textbook.ebook_uploaded_at, + ebook_progress=_ebook_progress_out(db, textbook, user), + ) + + +def _ebook_progress_out( + db: Session, textbook: Textbook, user: User | None +) -> EbookProgressOut | None: + if user is None or not textbook.ebook_file: + return None + row = ( + db.query(EbookProgress) + .filter( + EbookProgress.user_id == user.id, + EbookProgress.textbook_id == textbook.id, + ) + .first() + ) + if row is None: + return None + return EbookProgressOut.model_validate(row) + + +def _load_textbook(db: Session, textbook_id: int) -> Textbook: + textbook = db.get(Textbook, textbook_id) + if textbook is None: + raise HTTPException(status_code=404, detail="教材不存在") + return textbook + + +def _resolve_channel(db: Session, channel_id: int | None) -> LlmSetting: + if channel_id is not None: + channel = db.get(LlmSetting, channel_id) + if channel is None: + raise HTTPException(status_code=404, detail="指定的模型通道不存在") + return channel + channel = get_default_channel(db) + if channel is None: + raise HTTPException( + status_code=400, + detail="尚未配置模型通道,请先在“模型配置”新增并设为默认", + ) + return channel + + +def _book_graph_context(db: Session, textbook: Textbook) -> list[str]: + name = textbook.name + category_hints: list[str] = [] + if "代数" in name: + category_hints = ["数与式", "方程与不等式", "函数与图像", "数列与证明"] + elif "几何" in name: + category_hints = ["平面几何"] + elif "坐标" in name: + category_hints = ["坐标与解析几何"] + elif "三角" in name: + category_hints = ["三角函数"] + elif "函数" in name or "图像" in name: + category_hints = ["函数与图像", "坐标与解析几何"] + if category_hints: + return [ + node_name + for (node_name,) in db.query(Knowledge.name) + .filter(Knowledge.category.in_(category_hints)) + .all() + ] + # 兜底:给常见初等图谱节点 + return [ + node_name + for (node_name,) in db.query(Knowledge.name) + .filter(Knowledge.domain == "初等", Knowledge.category != "总纲") + .all() + ] + + +@router.get("", response_model=list[TextbookOut]) +def list_textbooks( + db: Session = Depends(get_db), + user: User = Depends(get_current_user), +): + textbooks = ( + db.query(Textbook) + .order_by(Textbook.position.asc(), Textbook.id.asc()) + .all() + ) + return [_textbook_out(db, textbook, user) for textbook in textbooks] + + +@router.get("/{textbook_id}/chapters", response_model=list[ChapterOut]) +def list_chapters( + textbook_id: int, + db: Session = Depends(get_db), + _: User = Depends(get_current_user), +): + textbook = _load_textbook(db, textbook_id) + chapters = ( + db.query(Chapter) + .filter(Chapter.textbook_id == textbook.id) + .order_by(Chapter.position.asc(), Chapter.id.asc()) + .all() + ) + return [_chapter_out(db, chapter) for chapter in chapters] + + +@router.post("", response_model=TextbookOut) +def create_textbook( + payload: TextbookCreate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + if db.query(Textbook).filter(Textbook.name == payload.name).first(): + raise HTTPException(status_code=400, detail="同名教材已存在") + max_position = db.query(Textbook).count() + textbook = Textbook( + name=payload.name, + author=payload.author, + publisher=payload.publisher, + isbn=payload.isbn, + edition=payload.edition, + grade=payload.grade, + link=payload.link, + description=payload.description, + position=max_position, + ) + db.add(textbook) + db.commit() + return _textbook_out(db, textbook) + + +@router.put("/{textbook_id}", response_model=TextbookOut) +def update_textbook( + textbook_id: int, + payload: TextbookUpdate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load_textbook(db, textbook_id) + fields = payload.model_dump(exclude_unset=True) + if "name" in fields and fields["name"] != textbook.name: + exists = ( + db.query(Textbook) + .filter(Textbook.name == fields["name"], Textbook.id != textbook.id) + .first() + ) + if exists: + raise HTTPException(status_code=400, detail="同名教材已存在") + for field, value in fields.items(): + setattr(textbook, field, value) + db.commit() + return _textbook_out(db, textbook) + + +@router.delete("/{textbook_id}") +def delete_textbook( + textbook_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load_textbook(db, textbook_id) + question_count = ( + db.query(func.count(Question.id)) + .join(Chapter, Chapter.id == Question.chapter_id) + .filter(Chapter.textbook_id == textbook.id) + .scalar() + or 0 + ) + if question_count > 0: + raise HTTPException( + status_code=400, + detail=f"该书下还有 {question_count} 道题目,不能删除教材,只能修改", + ) + db.query(Chapter).filter(Chapter.textbook_id == textbook.id).delete() + ebook_store.drop_progress(db, textbook.id) + ebook_store.drop_book_files(textbook.id) + db.delete(textbook) + db.commit() + return {"deleted": textbook_id} + + +@router.post("/{textbook_id}/chapters", response_model=ChapterOut) +def create_chapter( + textbook_id: int, + payload: ChapterCreate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load_textbook(db, textbook_id) + chapter = Chapter( + textbook_id=textbook.id, + name=payload.name, + position=db.query(Chapter).filter(Chapter.textbook_id == textbook.id).count(), + summary=payload.summary, + ) + db.add(chapter) + db.flush() + if payload.knowledge_ids: + set_chapter_knowledge_ids(db, chapter.id, payload.knowledge_ids) + else: + set_chapter_knowledge_names(db, chapter.id, payload.knowledge_names) + db.commit() + return _chapter_out(db, chapter) + + +@router.post("/{textbook_id}/chapters/generate", response_model=ChaptersGenerateOut) +def generate_catalog_chapters( + textbook_id: int, + payload: ChaptersGenerateIn, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load_textbook(db, textbook_id) + existing = ( + db.query(Chapter) + .filter(Chapter.textbook_id == textbook.id) + .order_by(Chapter.position.asc(), Chapter.id.asc()) + .all() + ) + existing_names = {chapter.name for chapter in existing} + external_context: dict = {} + lookup_titles: list[str] = [] + if textbook.isbn: + external_context = fetch_isbn_context(textbook.isbn) + lookup_titles = external_context.get("chapter_titles") or [] + fixed_titles: list[str] | None = None + generation_count = payload.count if payload.count is not None else 60 + source_note = "已结合书名 / ISBN / 作者信息自动获取章节" + if lookup_titles: + missing_titles = [ + title for title in lookup_titles if title not in existing_names + ] + if missing_titles: + fixed_titles = missing_titles[:12] + generation_count = len(fixed_titles) + source_note = "已按 ISBN 查询到的正式章节名生成摘要" + + selected_names: list[str] = [] + if payload.knowledge_ids: + rows = ( + db.query(Knowledge.name) + .filter(Knowledge.id.in_(payload.knowledge_ids)) + .all() + ) + selected_names = [name for (name,) in rows] + else: + selected_names = _book_graph_context(db, textbook) + channel = _resolve_channel(db, payload.channel_id) + if not channel.api_key or not channel.base_url or not channel.model: + raise HTTPException( + status_code=400, detail="模型通道未完整配置,请先补全并测试" + ) + try: + proposed = generate_chapters( + setting=channel, + textbook=textbook, + count=generation_count, + existing_names=sorted(existing_names), + instructions=( + f"可挂接的知识图谱节点参考:{'、'.join(selected_names)}。\n" + if selected_names + else "" + ) + payload.instructions.strip(), + fixed_titles=fixed_titles, + external_context=external_context, + graph_context=selected_names or None, + ) + except ValueError as exc: + raise HTTPException(status_code=400, detail=f"生成失败:{exc}") from exc + + max_position = ( + db.query(func.max(Chapter.position)) + .filter(Chapter.textbook_id == textbook.id) + .scalar() + ) + position = (max_position if max_position is not None else -1) + 1 + inserted: list[Chapter] = [] + skipped: list[str] = [] + for item in proposed: + if item["name"] in existing_names: + skipped.append(item["name"]) + continue + existing_names.add(item["name"]) + chapter = Chapter( + textbook_id=textbook.id, + name=item["name"], + summary=item["summary"], + position=position, + ) + db.add(chapter) + db.flush() + if payload.knowledge_ids: + try: + set_chapter_knowledge_ids( + db, chapter.id, payload.knowledge_ids + ) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + else: + item_names = item.get("knowledge_names") or [] + valid_names = [ + node_name + for (node_name,) in ( + db.query(Knowledge.name) + .filter(Knowledge.name.in_(item_names)) + .all() + ) + ] if item_names else [] + if valid_names: + set_chapter_knowledge_names(db, chapter.id, valid_names) + inserted.append(chapter) + position += 1 + db.flush() + created = [_chapter_out(db, chapter) for chapter in inserted] + db.commit() + message = f"{source_note}:已新增 {len(created)} 个章节" if source_note else f"已新增 {len(created)} 个章节" + if skipped: + message += f",跳过重复章节 {len(skipped)} 个" + return ChaptersGenerateOut( + created=created, + skipped_duplicates=skipped, + message=message, + ) + + +@router.post("/{textbook_id}/chapters/organize", response_model=ChaptersGenerateOut) +def organize_textbook_chapters( + textbook_id: int, + payload: ChaptersOrganizeIn, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load_textbook(db, textbook_id) + existing = ( + db.query(Chapter) + .filter(Chapter.textbook_id == textbook.id) + .order_by(Chapter.position.asc(), Chapter.id.asc()) + .all() + ) + existing_names = {chapter.name for chapter in existing} + channel = _resolve_channel(db, payload.channel_id) + if not channel.api_key or not channel.base_url or not channel.model: + raise HTTPException( + status_code=400, detail="模型通道未完整配置,请先补全并测试" + ) + graph_context = _book_graph_context(db, textbook) + try: + proposed = organize_reference_chapters( + setting=channel, + textbook=textbook, + reference_text=payload.reference_text.strip(), + existing_names=sorted(existing_names), + graph_context=graph_context, + ) + except ValueError as exc: + raise HTTPException(status_code=400, detail=f"整理失败:{exc}") from exc + + max_position = ( + db.query(func.max(Chapter.position)) + .filter(Chapter.textbook_id == textbook.id) + .scalar() + ) + position = (max_position if max_position is not None else -1) + 1 + inserted: list[Chapter] = [] + skipped: list[str] = [] + for item in proposed: + if item["name"] in existing_names: + skipped.append(item["name"]) + continue + existing_names.add(item["name"]) + chapter = Chapter( + textbook_id=textbook.id, + name=item["name"], + summary=item["summary"], + position=position, + ) + db.add(chapter) + db.flush() + item_names = item.get("knowledge_names") or [] + valid_names = ( + [ + node_name + for (node_name,) in ( + db.query(Knowledge.name) + .filter(Knowledge.name.in_(item_names)) + .all() + ) + ] + if item_names + else [] + ) + if valid_names: + set_chapter_knowledge_names(db, chapter.id, valid_names) + inserted.append(chapter) + position += 1 + created = [_chapter_out(db, chapter) for chapter in inserted] + db.commit() + message = f"AI 整理完成:已新增 {len(created)} 个章节并关联知识图谱" + if skipped: + message += f",跳过重复 {len(skipped)} 个" + return ChaptersGenerateOut( + created=created, + skipped_duplicates=skipped, + message=message, + ) + + +@router.put("/chapters/{chapter_id}", response_model=ChapterOut) +def update_chapter( + chapter_id: int, + payload: ChapterUpdate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + chapter = db.get(Chapter, chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + update_fields = payload.model_dump(exclude_unset=True) + knowledge_names = update_fields.pop("knowledge_names", None) + knowledge_ids = update_fields.pop("knowledge_ids", None) + for field, value in update_fields.items(): + setattr(chapter, field, value) + if knowledge_ids is not None: + try: + set_chapter_knowledge_ids(db, chapter.id, knowledge_ids) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + elif knowledge_names is not None: + set_chapter_knowledge_names(db, chapter.id, knowledge_names) + db.commit() + return _chapter_out(db, chapter) + + +@router.delete("/chapters/{chapter_id}") +def delete_chapter( + chapter_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + chapter = db.get(Chapter, chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + question_count = ( + db.query(func.count(Question.id)) + .filter(Question.chapter_id == chapter.id) + .scalar() + or 0 + ) + if question_count > 0: + raise HTTPException( + status_code=400, + detail=f"该章节下有 {question_count} 道题目,不能删除,只能修改章节", + ) + db.delete(chapter) + db.commit() + return {"deleted": chapter_id} diff --git a/backend/routers/courses.py b/backend/routers/courses.py new file mode 100644 index 0000000..6e0aec0 --- /dev/null +++ b/backend/routers/courses.py @@ -0,0 +1,96 @@ +"""在线课程:只有外链的视频/课程资源,与教材分表维护。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import get_current_user, require_permission +from models import Course, User +from schemas import CourseCreate, CourseOut, CourseUpdate + +router = APIRouter(prefix="/courses", tags=["courses"]) + + +def _load(db: Session, course_id: int) -> Course: + course = db.get(Course, course_id) + if course is None: + raise HTTPException(status_code=404, detail="课程不存在") + return course + + +def _clean_url(url: str | None) -> str: + url = (url or "").strip() + if not url: + raise HTTPException(status_code=400, detail="请填写课程链接") + return url + + +@router.get("", response_model=list[CourseOut]) +def list_courses( + db: Session = Depends(get_db), + _: User = Depends(get_current_user), +): + return ( + db.query(Course) + .order_by(Course.position.asc(), Course.id.asc()) + .all() + ) + + +@router.post("", response_model=CourseOut) +def create_course( + payload: CourseCreate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + if db.query(Course).filter(Course.name == payload.name).first(): + raise HTTPException(status_code=400, detail="同名课程已存在") + course = Course( + name=payload.name, + provider=payload.provider, + url=_clean_url(payload.url), + grade=payload.grade, + description=payload.description, + position=db.query(Course).count(), + ) + db.add(course) + db.commit() + return course + + +@router.put("/{course_id}", response_model=CourseOut) +def update_course( + course_id: int, + payload: CourseUpdate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + course = _load(db, course_id) + fields = payload.model_dump(exclude_unset=True) + if "name" in fields and fields["name"] != course.name: + exists = ( + db.query(Course) + .filter(Course.name == fields["name"], Course.id != course.id) + .first() + ) + if exists: + raise HTTPException(status_code=400, detail="同名课程已存在") + if "url" in fields: + fields["url"] = _clean_url(fields["url"]) + for field, value in fields.items(): + setattr(course, field, value) + db.commit() + return course + + +@router.delete("/{course_id}") +def delete_course( + course_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + course = _load(db, course_id) + db.delete(course) + db.commit() + return {"deleted": course_id} diff --git a/backend/routers/data.py b/backend/routers/data.py new file mode 100644 index 0000000..81ff127 --- /dev/null +++ b/backend/routers/data.py @@ -0,0 +1,427 @@ +"""知识点、错题本、练习记录、今日任务与课程资源。""" +from __future__ import annotations + +import json +from datetime import date, timedelta + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_learning_user +from models import ( + AttemptItem, + AttemptSession, + Chapter, + ChapterKnowledge, + DailyCompletion, + ErrorEntry, + Knowledge, + KnowledgeRelation, + Question, + QuestionKnowledge, + Textbook, + User, + UserKnowledge, +) +from schemas import ( + AttemptItemOut, + DailyCompleteIn, + DailyOut, + ErrorOut, + KnowledgeChapterOut, + KnowledgeDetailOut, + KnowledgeRelatedOut, + KnowledgeResourceOut, + KnowledgeOut, + RecordDetailOut, + RecordOut, +) +from services.mastery_engine import snapshot, status_for +from services.recommendation import build_daily_recommendation +from services.knowledge_service import chapter_knowledge_names, knowledge_resources + + +router = APIRouter(tags=["data"]) + + +def _error_out(error: ErrorEntry) -> ErrorOut: + options: list[str] = [] + if error.options: + try: + parsed = json.loads(error.options) + if isinstance(parsed, list): + options = [str(option) for option in parsed] + except (TypeError, ValueError): + options = [] + try: + knowledge_names = json.loads(error.knowledge_names or "[]") + if not isinstance(knowledge_names, list) or not knowledge_names: + knowledge_names = [error.knowledge_name] + except (TypeError, ValueError): + knowledge_names = [error.knowledge_name] + return ErrorOut( + id=error.id, + source_label=error.source_label, + knowledge_name=error.knowledge_name, + diagnosis=error.diagnosis, + status=error.status, + created_on=error.created_on, + attempt_id=error.attempt_id, + question_id=error.question_id, + stem=error.stem, + options=options, + selected=error.selected, + correct_index=error.correct_index, + explanation=error.explanation, + knowledge_names=[str(name) for name in knowledge_names], + ) + + +def _record_out(session: AttemptSession) -> RecordOut: + return RecordOut( + id=session.id, + mode=session.mode, + title=session.title, + total=session.total, + correct=session.correct, + happened_on=session.happened_on, + ) + + +def _ebook_ref(db: Session, chapter_id: int | None) -> dict: + """章节对应的电子书定位:章节或电子书缺失时返回空,前端据此隐藏入口。""" + chapter = db.get(Chapter, chapter_id) if chapter_id else None + textbook = db.get(Textbook, chapter.textbook_id) if chapter else None + if textbook is None or not textbook.ebook_file: + return {"has_ebook": False} + return { + "textbook_id": textbook.id, + "ebook_page": chapter.ebook_page, + "has_ebook": True, + } + + +def _daily_context(db: Session, user_id: int, today: date) -> dict: + completion = ( + db.query(DailyCompletion) + .filter( + DailyCompletion.user_id == user_id, + DailyCompletion.done_on == today, + ) + .first() + ) + if completion and completion.chapter_id is not None: + chapter = db.get(Chapter, completion.chapter_id) + textbook = ( + db.get(Textbook, chapter.textbook_id) if chapter is not None else None + ) + return { + "chapter_id": chapter.id if chapter else None, + "chapter_name": chapter.name if chapter else "", + "book_name": textbook.name if textbook else "", + "rating": completion.rating, + "knowledge_names": chapter_knowledge_names(db, chapter.id) + if chapter + else [], + "reason": "今日章节已完成", + **_ebook_ref(db, chapter.id if chapter else None), + } + recommendation = build_daily_recommendation(db, user_id) or {} + return { + "chapter_id": recommendation.get("chapter_id"), + "chapter_name": recommendation.get("chapter_name", ""), + "book_name": recommendation.get("book_name", ""), + "rating": "", + "knowledge_names": recommendation.get("knowledge_names", []), + "reason": recommendation.get("reason", ""), + **_ebook_ref(db, recommendation.get("chapter_id")), + } + + +def _streak(done_dates: set[date]) -> int: + today = date.today() + if today not in done_dates and today - timedelta(days=1) not in done_dates: + return 0 + anchor = today if today in done_dates else today - timedelta(days=1) + count = 0 + while anchor in done_dates: + count += 1 + anchor -= timedelta(days=1) + return count + + +@router.get("/knowledge", response_model=list[KnowledgeOut]) +def list_knowledge( + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + return [ + KnowledgeOut( + id=k.id, + knowledge_id=k.knowledge_id, + name=k.name, + mastery=k.mastery, + position=k.position, + status=status_for(k.mastery), + domain=k.domain, + category=k.category, + ) + for k in snapshot(db, user.id) + ] + + +@router.get("/knowledge/detail/{knowledge_id}", response_model=KnowledgeDetailOut) +def knowledge_detail( + knowledge_id: int, + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + """知识点详情:定义、掌握度、相关知识点与反向关联的学习资源。""" + node = db.get(Knowledge, knowledge_id) + if node is None: + raise HTTPException(status_code=404, detail="知识点不存在") + + mastery_map = { + user_knowledge.knowledge_id: user_knowledge.mastery + for user_knowledge in db.query(UserKnowledge) + .filter(UserKnowledge.user_id == user.id) + .all() + } + mastery = mastery_map.get(node.id, 0) + + relation_rows = ( + db.query(KnowledgeRelation, Knowledge) + .join( + Knowledge, + (Knowledge.id == KnowledgeRelation.target_id) + | (Knowledge.id == KnowledgeRelation.source_id), + ) + .filter( + (KnowledgeRelation.source_id == node.id) + | (KnowledgeRelation.target_id == node.id), + Knowledge.id != node.id, + ) + .all() + ) + related: list[KnowledgeRelatedOut] = [] + seen_related: set[int] = set() + for relation, other in relation_rows: + if other.id in seen_related: + continue + seen_related.add(other.id) + related.append( + KnowledgeRelatedOut( + id=other.id, + name=other.name, + relation_type=relation.relation_type, + direction="in" if relation.target_id == node.id else "out", + mastery=mastery_map.get(other.id), + ) + ) + + question_count = ( + db.query(QuestionKnowledge) + .filter(QuestionKnowledge.knowledge_id == node.id) + .count() + ) + chapter_rows = ( + db.query(Chapter, Textbook) + .join(ChapterKnowledge, ChapterKnowledge.chapter_id == Chapter.id) + .join(Textbook, Textbook.id == Chapter.textbook_id) + .filter(ChapterKnowledge.knowledge_id == node.id) + .order_by(Textbook.position.asc(), Chapter.position.asc()) + .all() + ) + chapters = [ + KnowledgeChapterOut( + chapter_id=chapter.id, + chapter_name=chapter.name, + textbook_id=textbook.id, + textbook_name=textbook.name, + ebook_page=chapter.ebook_page, + has_ebook=bool(textbook.ebook_file), + question_count=db.query(Question) + .filter(Question.chapter_id == chapter.id) + .count(), + ) + for chapter, textbook in chapter_rows + ] + + resources = [ + KnowledgeResourceOut( + id=row.id, + kind=row.kind, + title=row.title, + url=row.url, + source_name=row.title, + ) + for row in knowledge_resources(db, node.id) + ] + + return KnowledgeDetailOut( + id=node.id, + name=node.name, + domain=node.domain, + category=node.category, + description=node.description or "", + mastery=mastery, + status=status_for(mastery) if node.id in mastery_map else "未学习", + related_knowledge_count=len(related), + chapter_count=len(chapters), + question_count=question_count, + related=related, + chapters=chapters, + resources=resources, + ) + + +@router.get("/errors", response_model=list[ErrorOut]) +def list_errors( + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + rows = ( + db.query(ErrorEntry) + .filter(ErrorEntry.user_id == user.id) + .order_by(ErrorEntry.id.desc()) + .all() + ) + return [ + _error_out(e) + for e in rows + ] + + +@router.get("/records", response_model=list[RecordOut]) +def list_records( + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + rows = ( + db.query(AttemptSession) + .filter(AttemptSession.user_id == user.id) + .order_by(AttemptSession.id.desc()) + .all() + ) + return [ + _record_out(s) + for s in rows + ] + + +@router.get("/records/{record_id}", response_model=RecordDetailOut) +def record_detail( + record_id: int, + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + session = ( + db.query(AttemptSession) + .filter( + AttemptSession.id == record_id, + AttemptSession.user_id == user.id, + ) + .first() + ) + if session is None: + raise HTTPException(status_code=404, detail="练习记录不存在") + items = ( + db.query(AttemptItem) + .filter(AttemptItem.attempt_id == session.id) + .order_by(AttemptItem.question_index.asc(), AttemptItem.id.asc()) + .all() + ) + parsed_items: list[AttemptItemOut] = [] + for item in items: + try: + options = json.loads(item.options) + if not isinstance(options, list): + options = [] + except (TypeError, ValueError): + options = [] + try: + parsed_names = json.loads(item.knowledge_names or "[]") + if not isinstance(parsed_names, list) or not parsed_names: + parsed_names = [item.knowledge_name] + except (TypeError, ValueError): + parsed_names = [item.knowledge_name] + parsed_items.append( + AttemptItemOut( + question_index=item.question_index, + question_id=item.question_id, + stem=item.stem, + options=[str(option) for option in options], + selected=item.selected, + correct_index=item.correct_index, + correct=bool(item.correct), + knowledge_name=item.knowledge_name, + explanation=item.explanation, + knowledge_names=[str(name) for name in parsed_names], + ) + ) + return RecordDetailOut( + **_record_out(session).model_dump(), + items=parsed_items, + ) + + +@router.get("/daily", response_model=DailyOut) +def get_daily( + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + today = date.today() + done_dates = { + row.done_on + for row in db.query(DailyCompletion) + .filter(DailyCompletion.user_id == user.id) + .all() + } + context = _daily_context(db, user.id, today) + return DailyOut( + today=today, + completed=today in done_dates, + streak=_streak(done_dates), + **context, + ) + + +@router.post("/daily/complete", response_model=DailyOut) +def complete_daily( + payload: DailyCompleteIn, + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + today = date.today() + chapter = db.get(Chapter, payload.chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + exists = ( + db.query(DailyCompletion) + .filter( + DailyCompletion.user_id == user.id, + DailyCompletion.done_on == today, + ) + .first() + ) + if exists is None: + exists = DailyCompletion( + user_id=user.id, chapter_id=chapter.id, done_on=today + ) + db.add(exists) + exists.chapter_id = chapter.id + exists.rating = payload.rating + db.commit() + done_dates = { + row.done_on + for row in db.query(DailyCompletion) + .filter(DailyCompletion.user_id == user.id) + .all() + } + return DailyOut( + today=today, + completed=True, + streak=_streak(done_dates), + **_daily_context(db, user.id, today), + ) diff --git a/backend/routers/ebooks.py b/backend/routers/ebooks.py new file mode 100644 index 0000000..149fa97 --- /dev/null +++ b/backend/routers/ebooks.py @@ -0,0 +1,141 @@ +"""电子书:管理员上传/替换 PDF·EPUB,登录用户在线阅读并记录进度。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends, File, HTTPException, UploadFile +from fastapi.responses import FileResponse +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import get_current_user, require_permission +from models import EbookProgress, Textbook, User +from schemas import EbookProgressIn, EbookProgressOut +from services import ebooks as store + + +# 上传 / 删除 / 取文件挂在教材下,进度单独成组 +router = APIRouter(prefix="/textbooks", tags=["ebooks"]) +progress_router = APIRouter(prefix="/ebooks", tags=["ebooks"]) + + +def _load(db: Session, textbook_id: int) -> Textbook: + textbook = db.get(Textbook, textbook_id) + if textbook is None: + raise HTTPException(status_code=404, detail="教材不存在") + return textbook + + +def _require_file(textbook: Textbook) -> None: + if not textbook.ebook_file: + raise HTTPException(status_code=404, detail="该书还没有上传电子书") + + +@router.post("/{textbook_id}/ebook") +async def upload_ebook( + textbook_id: int, + file: UploadFile = File(...), + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load(db, textbook_id) + await store.store_upload(db, textbook, file) + return { + "id": textbook.id, + "ebook_format": textbook.ebook_format, + "ebook_name": textbook.ebook_name, + "ebook_size": textbook.ebook_size, + "ebook_pages": textbook.ebook_pages, + } + + +@router.delete("/{textbook_id}/ebook") +def delete_ebook( + textbook_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("catalog:manage")), +): + textbook = _load(db, textbook_id) + _require_file(textbook) + store.clear_ebook(db, textbook) + return {"deleted": textbook_id} + + +@router.get("/{textbook_id}/ebook/file/{filename}") +def ebook_file( + textbook_id: int, + filename: str, + db: Session = Depends(get_db), + _: User = Depends(get_current_user), +): + """阅读器取原始文件。FileResponse 自带 Range/206 支持,PDF 可分段加载。""" + textbook = _load(db, textbook_id) + _require_file(textbook) + if filename != textbook.ebook_file: + raise HTTPException(status_code=404, detail="电子书文件不存在") + path = store.resolve_path(textbook.id, filename) + return FileResponse( + path, + media_type=store.media_type(textbook.ebook_format), + filename=textbook.ebook_name or path.name, + content_disposition_type="inline", + ) + + +@progress_router.get("/progress", response_model=list[EbookProgressOut]) +def list_progress( + db: Session = Depends(get_db), + user: User = Depends(get_current_user), +): + rows = ( + db.query(EbookProgress) + .filter(EbookProgress.user_id == user.id) + .all() + ) + return [ + EbookProgressOut( + textbook_id=row.textbook_id, + locator=row.locator, + page=row.page, + total=row.total, + position=row.position, + updated_at=row.updated_at, + ) + for row in rows + ] + + +@progress_router.put("/{textbook_id}/progress", response_model=EbookProgressOut) +def save_progress( + textbook_id: int, + payload: EbookProgressIn, + db: Session = Depends(get_db), + user: User = Depends(get_current_user), +): + textbook = _load(db, textbook_id) + _require_file(textbook) + row = ( + db.query(EbookProgress) + .filter( + EbookProgress.user_id == user.id, + EbookProgress.textbook_id == textbook_id, + ) + .first() + ) + if row is None: + row = EbookProgress(user_id=user.id, textbook_id=textbook_id) + db.add(row) + row.locator = payload.locator[:512] + row.page = max(0, payload.page) + row.total = max(0, payload.total) + row.position = min(1.0, max(0.0, payload.position)) + # 阅读器拿到的才是真实篇幅(PDF 页数 / EPUB 章节数),回填给管理端展示 + if row.total > 0 and textbook.ebook_pages != row.total: + textbook.ebook_pages = row.total + db.commit() + return EbookProgressOut( + textbook_id=textbook_id, + locator=row.locator, + page=row.page, + total=row.total, + position=row.position, + updated_at=row.updated_at, + ) diff --git a/backend/routers/knowledge_graph.py b/backend/routers/knowledge_graph.py new file mode 100644 index 0000000..301c442 --- /dev/null +++ b/backend/routers/knowledge_graph.py @@ -0,0 +1,313 @@ +"""知识图谱:节点 / 关系浏览与管理员维护。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy import func +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_permission +from models import ( + ChapterKnowledge, + Course, + Knowledge, + KnowledgeRelation, + KnowledgeResource, + QuestionKnowledge, + Textbook, + User, + UserKnowledge, +) +from schemas import ( + KnowledgeGraphEdge, + KnowledgeGraphNode, + KnowledgeGraphOut, + KnowledgeNodeCreate, + KnowledgeNodeUpdate, + KnowledgeRelationIn, + KnowledgeResourceIn, + KnowledgeResourceOut, +) +from services.knowledge_service import knowledge_resources + + +router = APIRouter(prefix="/knowledge", tags=["knowledge-graph"]) + +RELATION_TYPES = {"包含", "前置", "相关"} + + +def _node_out(db: Session, node: Knowledge) -> KnowledgeGraphNode: + chapter_count = ( + db.query(func.count(ChapterKnowledge.id)) + .filter(ChapterKnowledge.knowledge_id == node.id) + .scalar() + or 0 + ) + question_count = ( + db.query(func.count(QuestionKnowledge.id)) + .filter(QuestionKnowledge.knowledge_id == node.id) + .scalar() + or 0 + ) + return KnowledgeGraphNode( + id=node.id, + name=node.name, + domain=node.domain, + category=node.category, + description=node.description, + chapter_count=chapter_count, + question_count=question_count, + resources=[ + KnowledgeResourceOut( + id=row.id, + kind=row.kind, + title=row.title, + url=row.url, + source_name=row.title, + ) + for row in knowledge_resources(db, node.id) + ], + ) + + +def _unique_name(db: Session, name: str, exclude_id: int | None = None): + query = db.query(Knowledge).filter(Knowledge.name == name) + if exclude_id is not None: + query = query.filter(Knowledge.id != exclude_id) + if query.first() is not None: + raise HTTPException(status_code=400, detail="知识点名称已存在") + + +@router.get("/graph", response_model=KnowledgeGraphOut) +def get_graph( + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + nodes = db.query(Knowledge).order_by(Knowledge.domain, Knowledge.category, Knowledge.id).all() + edges = db.query(KnowledgeRelation).order_by(KnowledgeRelation.id).all() + return KnowledgeGraphOut( + nodes=[_node_out(db, node) for node in nodes], + edges=[ + KnowledgeGraphEdge( + source=edge.source_id, + target=edge.target_id, + relation_type=edge.relation_type, + ) + for edge in edges + ], + ) + + +@router.post("/nodes", response_model=KnowledgeGraphNode) +def create_node( + payload: KnowledgeNodeCreate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + name = payload.name.strip() + _unique_name(db, name) + node = Knowledge( + name=name, + domain=payload.domain.strip() or "初等", + category=payload.category.strip(), + description=payload.description.strip(), + ) + db.add(node) + db.commit() + return _node_out(db, node) + + +@router.put("/nodes/{node_id}", response_model=KnowledgeGraphNode) +def update_node( + node_id: int, + payload: KnowledgeNodeUpdate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + node = db.get(Knowledge, node_id) + if node is None: + raise HTTPException(status_code=404, detail="知识点不存在") + fields = payload.model_dump(exclude_unset=True) + if fields.get("name"): + name = fields["name"].strip() + _unique_name(db, name, exclude_id=node.id) + node.name = name + if fields.get("domain"): + node.domain = fields["domain"].strip() + if "category" in fields: + node.category = (fields["category"] or "").strip() + if "description" in fields: + node.description = (fields["description"] or "").strip() + db.commit() + return _node_out(db, node) + + +@router.delete("/nodes/{node_id}") +def delete_node( + node_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + node = db.get(Knowledge, node_id) + if node is None: + raise HTTPException(status_code=404, detail="知识点不存在") + usage = ( + db.query(func.count(ChapterKnowledge.id)) + .filter(ChapterKnowledge.knowledge_id == node.id) + .scalar() + or 0 + ) + ( + db.query(func.count(QuestionKnowledge.id)) + .filter(QuestionKnowledge.knowledge_id == node.id) + .scalar() + or 0 + ) + if usage > 0: + raise HTTPException( + status_code=400, + detail=f"该知识点已关联 {usage} 个章节/题目,不能删除;可改名或先解除引用", + ) + db.query(KnowledgeRelation).filter( + (KnowledgeRelation.source_id == node.id) + | (KnowledgeRelation.target_id == node.id) + ).delete(synchronize_session=False) + db.query(UserKnowledge).filter(UserKnowledge.knowledge_id == node.id).delete( + synchronize_session=False + ) + db.delete(node) + db.commit() + return {"deleted": node_id} + + +@router.post("/nodes/{node_id}/resources", response_model=KnowledgeResourceOut) +def add_resource( + node_id: int, + payload: KnowledgeResourceIn, + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + node = db.get(Knowledge, node_id) + if node is None: + raise HTTPException(status_code=404, detail="知识点不存在") + kind = payload.kind.strip() or "video" + title = payload.title.strip() + url = payload.url.strip() + if payload.course_id is not None: + course = db.get(Course, payload.course_id) + if course is None: + raise HTTPException(status_code=404, detail="课程不存在") + title = title or course.name + url = url or course.url + elif payload.textbook_id is not None: + textbook = db.get(Textbook, payload.textbook_id) + if textbook is None: + raise HTTPException(status_code=404, detail="教材不存在") + title = title or textbook.name + url = url or textbook.link + if not title or not url: + raise HTTPException(status_code=400, detail="资源标题与链接不能为空") + exists = ( + db.query(KnowledgeResource) + .filter( + KnowledgeResource.knowledge_id == node.id, + KnowledgeResource.kind == kind, + KnowledgeResource.url == url, + ) + .first() + ) + if exists is not None: + raise HTTPException(status_code=400, detail="该资源已关联到本知识点") + row = KnowledgeResource( + knowledge_id=node.id, + kind=kind, + title=title, + url=url, + textbook_id=payload.textbook_id, + course_id=payload.course_id, + ) + db.add(row) + db.commit() + return KnowledgeResourceOut( + id=row.id, + kind=row.kind, + title=row.title, + url=row.url, + source_name=row.title, + ) + + +@router.delete("/resources/{resource_id}") +def remove_resource( + resource_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + row = db.get(KnowledgeResource, resource_id) + if row is None: + raise HTTPException(status_code=404, detail="资源链接不存在") + db.delete(row) + db.commit() + return {"deleted": resource_id} + + +@router.post("/relations", response_model=KnowledgeGraphEdge) +def add_relation( + payload: KnowledgeRelationIn, + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + if payload.relation_type not in RELATION_TYPES: + raise HTTPException(status_code=400, detail="关系类型仅支持 包含/前置/相关") + if payload.source_id == payload.target_id: + raise HTTPException(status_code=400, detail="不能连接到自身") + source = db.get(Knowledge, payload.source_id) + target = db.get(Knowledge, payload.target_id) + if source is None or target is None: + raise HTTPException(status_code=404, detail="知识点不存在") + exists = ( + db.query(KnowledgeRelation) + .filter( + KnowledgeRelation.source_id == source.id, + KnowledgeRelation.target_id == target.id, + KnowledgeRelation.relation_type == payload.relation_type, + ) + .first() + ) + if exists is not None: + raise HTTPException(status_code=400, detail="该关系已存在") + relation = KnowledgeRelation( + source_id=source.id, + target_id=target.id, + relation_type=payload.relation_type, + ) + db.add(relation) + db.commit() + return KnowledgeGraphEdge( + source=relation.source_id, + target=relation.target_id, + relation_type=relation.relation_type, + ) + + +@router.delete("/relations") +def remove_relation( + source_id: int, + target_id: int, + relation_type: str = "前置", + db: Session = Depends(get_db), + _: User = Depends(require_permission("knowledge:manage")), +): + relation = ( + db.query(KnowledgeRelation) + .filter( + KnowledgeRelation.source_id == source_id, + KnowledgeRelation.target_id == target_id, + KnowledgeRelation.relation_type == relation_type, + ) + .first() + ) + if relation is None: + raise HTTPException(status_code=404, detail="关系不存在") + db.delete(relation) + db.commit() + return {"deleted": relation.id} diff --git a/backend/routers/llm.py b/backend/routers/llm.py new file mode 100644 index 0000000..1836d87 --- /dev/null +++ b/backend/routers/llm.py @@ -0,0 +1,318 @@ +"""大模型多通道配置:OpenAI / DeepSeek / 阿里千问 / OpenAI 兼容。 + +每个通道保存一份独立的 provider / base_url / model / api_key / temperature, +通道名建议为“服务商 · 模型”,例如“阿里千问(百炼) · qwen-plus”; +生成题目时默认使用 is_default 通道,也可在调用方显式指定 channel_id。 +""" +from __future__ import annotations + +import json + +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_permission +from models import LlmSetting, LlmTask, User +from schemas import ( + LlmChannelCreate, + LlmChannelOut, + LlmChannelUpdate, + LlmProviderOut, + LlmSettingsOut, + LlmTestResult, + LlmTaskCreate, + LlmTaskOut, +) +from services.llm_client import PROVIDER_PRESETS, chat_completion, mask_key +from services.llm_config import ( + default_channel_name, + ensure_llm_channels, + get_default_channel, + promote_default, + provider_label, +) +from services.task_runner import run_llm_task + + +router = APIRouter(prefix="/llm", tags=["llm"]) + + +def _providers() -> list[LlmProviderOut]: + return [ + LlmProviderOut( + id=provider_id, + label=preset["label"], + base_url=preset["base_url"], + model=preset["model"], + ) + for provider_id, preset in PROVIDER_PRESETS.items() + ] + + +def _channel_out(channel: LlmSetting) -> LlmChannelOut: + return LlmChannelOut( + id=channel.id, + name=channel.name or default_channel_name(channel.provider, channel.model), + provider=channel.provider, + provider_label=provider_label(channel.provider), + base_url=channel.base_url, + model=channel.model, + temperature=channel.temperature, + max_tokens=channel.max_tokens, + has_api_key=bool(channel.api_key), + api_key_preview=mask_key(channel.api_key), + is_default=bool(channel.is_default), + ) + + +def _settings_out(db: Session) -> LlmSettingsOut: + channels = ( + db.query(LlmSetting) + .order_by(LlmSetting.is_default.desc(), LlmSetting.id.asc()) + .all() + ) + return LlmSettingsOut( + channels=[_channel_out(channel) for channel in channels], + providers=_providers(), + ) + + +def _load_channel(db: Session, channel_id: int) -> LlmSetting: + channel = db.get(LlmSetting, channel_id) + if channel is None: + raise HTTPException(status_code=404, detail="模型通道不存在") + return channel + + +def _ensure_provider(provider: str) -> dict: + preset = PROVIDER_PRESETS.get(provider) + if preset is None: + raise HTTPException(status_code=400, detail="不支持的模型服务商") + return preset + + +def _ensure_unique_name(db: Session, name: str, exclude_id: int | None = None) -> None: + query = db.query(LlmSetting).filter(LlmSetting.name == name) + if exclude_id is not None: + query = query.filter(LlmSetting.id != exclude_id) + if query.first() is not None: + raise HTTPException(status_code=400, detail="通道名称已存在,请换一个名称") + + +def _preset_fill(provider: str, base_url: str, model: str) -> tuple[str, str]: + preset = _ensure_provider(provider) + return ( + base_url.strip() or preset["base_url"], + model.strip() or preset["model"], + ) + + +@router.get("/settings", response_model=LlmSettingsOut) +def get_settings( + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + ensure_llm_channels(db) + return _settings_out(db) + + +@router.post("/channels", response_model=LlmChannelOut) +def create_channel( + payload: LlmChannelCreate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + _ensure_provider(payload.provider) + name = payload.name.strip() or default_channel_name(payload.provider, payload.model) + _ensure_unique_name(db, name) + base_url, model = _preset_fill(payload.provider, payload.base_url, payload.model) + count = db.query(LlmSetting).count() + channel = LlmSetting( + name=name, + provider=payload.provider, + base_url=base_url, + model=model, + temperature=payload.temperature, + max_tokens=payload.max_tokens, + api_key=(payload.api_key or "").strip(), + is_default=count == 0, + ) + db.add(channel) + db.commit() + db.refresh(channel) + return _channel_out(channel) + + +@router.put("/channels/{channel_id}", response_model=LlmChannelOut) +def update_channel( + channel_id: int, + payload: LlmChannelUpdate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + channel = _load_channel(db, channel_id) + provider = payload.provider or channel.provider + _ensure_provider(provider) + base_url, model = _preset_fill( + provider, + payload.base_url if payload.base_url is not None else channel.base_url, + payload.model if payload.model is not None else channel.model, + ) + if payload.name is not None and payload.name.strip(): + name = payload.name.strip() + else: + name = channel.name or default_channel_name(provider, model) + _ensure_unique_name(db, name, exclude_id=channel.id) + + channel.name = name + channel.provider = provider + channel.base_url = base_url + channel.model = model + if payload.temperature is not None: + channel.temperature = payload.temperature + if payload.clear_max_tokens: + channel.max_tokens = None + elif payload.max_tokens is not None: + channel.max_tokens = payload.max_tokens + if payload.clear_api_key: + channel.api_key = "" + elif payload.api_key and payload.api_key.strip(): + channel.api_key = payload.api_key.strip() + db.commit() + return _channel_out(channel) + + +@router.delete("/channels/{channel_id}") +def delete_channel( + channel_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + channel = _load_channel(db, channel_id) + was_default = bool(channel.is_default) + db.delete(channel) + db.flush() + if was_default: + promote_default(db, None) + else: + db.commit() + return {"deleted": channel_id} + + +@router.put("/channels/{channel_id}/default", response_model=LlmSettingsOut) +def set_default_channel( + channel_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + _load_channel(db, channel_id) + promote_default(db, channel_id) + return _settings_out(db) + + +def _run_test(channel: LlmSetting) -> str: + if not channel.base_url or not channel.model: + raise HTTPException(status_code=400, detail="通道缺少 Base URL 或模型名称,请先补全") + if not channel.api_key: + raise HTTPException(status_code=400, detail="通道尚未保存 API Key,请先配置") + try: + return chat_completion( + base_url=channel.base_url, + api_key=channel.api_key, + model=channel.model, + temperature=0.0, + max_tokens=256, + timeout=45.0, + messages=[ + { + "role": "system", + "content": "你是连通性测试助手,只回复两个字:正常", + }, + {"role": "user", "content": "请确认服务可用。"}, + ], + ) + except ValueError as exc: + raise HTTPException(status_code=400, detail=f"测试失败:{exc}") from exc + + +@router.post("/channels/{channel_id}/test", response_model=LlmTestResult) +def test_channel( + channel_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + channel = _load_channel(db, channel_id) + reply = _run_test(channel) + return LlmTestResult(ok=True, message=f"连接成功,模型已回复:“{reply[:40]}”") + + +@router.post("/test", response_model=LlmTestResult) +def test_default_channel( + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + """兼容旧前端:测试默认通道。""" + ensure_llm_channels(db) + channel = get_default_channel(db) + if channel is None: + raise HTTPException(status_code=400, detail="尚未配置任何模型通道") + reply = _run_test(channel) + return LlmTestResult(ok=True, message=f"连接成功,模型已回复:“{reply[:40]}”") + + +@router.post("/tasks", response_model=LlmTaskOut, status_code=201) +def create_task( + payload: LlmTaskCreate, + background_tasks: BackgroundTasks, + db: Session = Depends(get_db), + user: User = Depends(require_permission("llm:manage")), +): + if payload.kind not in { + "generate_questions", + "generate_chapters", + "organize_chapters", + }: + raise HTTPException(status_code=400, detail="不支持的任务类型") + task = LlmTask( + kind=payload.kind, + params=json.dumps(payload.params, ensure_ascii=False), + created_by=user.id, + ) + db.add(task) + db.commit() + db.refresh(task) + background_tasks.add_task( + run_llm_task, task.id, task.kind, payload.params + ) + return LlmTaskOut( + id=task.id, + kind=task.kind, + status=task.status, + progress=task.progress, + message=task.message, + result={}, + ) + + +@router.get("/tasks/{task_id}", response_model=LlmTaskOut) +def get_task( + task_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("llm:manage")), +): + task = db.get(LlmTask, task_id) + if task is None: + raise HTTPException(status_code=404, detail="任务不存在") + try: + result = json.loads(task.result or "{}") + except ValueError: + result = {} + return LlmTaskOut( + id=task.id, + kind=task.kind, + status=task.status, + progress=task.progress, + message=task.message, + result=result, + ) diff --git a/backend/routers/overview.py b/backend/routers/overview.py new file mode 100644 index 0000000..81c72ec --- /dev/null +++ b/backend/routers/overview.py @@ -0,0 +1,70 @@ +"""学习总览。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_learning_user +from models import AttemptSession, User +from schemas import KnowledgeOut, MetricItem, OverviewOut, PlanOut +from services.mastery_engine import snapshot, status_for +from services.recommendation import build_plan + + +router = APIRouter(tags=["overview"]) + + +@router.get("/overview", response_model=OverviewOut) +def get_overview( + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + total_questions = ( + db.query(AttemptSession.total) + .filter(AttemptSession.user_id == user.id) + .all() + ) + total_answers = sum(row.total for row in total_questions) + total_correct = ( + db.query(AttemptSession.correct) + .filter(AttemptSession.user_id == user.id) + .all() + ) + correct_answers = sum(row.correct for row in total_correct) + accuracy = correct_answers / total_answers * 100 if total_answers else 0.0 + + knowledge = snapshot(db, user.id) + weak_count = sum(1 for k in knowledge if k.mastery < 60) + + metrics = [ + MetricItem(label="累计题目", value=str(total_answers)), + MetricItem( + label="累计正确率", + value=f"{accuracy:.1f}%" if total_answers else "0%", + ), + MetricItem(label="薄弱知识点", value=str(weak_count)), + MetricItem(label="当前阶段", value="L2 基础应用"), + ] + plan = build_plan(db, user.id) + return OverviewOut( + metrics=metrics, + knowledge=[ + KnowledgeOut( + id=k.id, + knowledge_id=k.knowledge_id, + name=k.name, + mastery=k.mastery, + position=k.position, + status=status_for(k.mastery), + domain=k.domain, + category=k.category, + ) + for k in knowledge + ], + plan=PlanOut( + notice=plan["notice"], + focus_names=plan["focus_names"], + steps=plan["steps"], + ), + ) diff --git a/backend/routers/practice.py b/backend/routers/practice.py new file mode 100644 index 0000000..e37abbf --- /dev/null +++ b/backend/routers/practice.py @@ -0,0 +1,217 @@ +"""练习:章节组卷与提交判分(学习数据按用户隔离)。""" +from __future__ import annotations + +import json + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_learning_user +from models import ( + AttemptItem, + AttemptSession, + Chapter, + ErrorEntry, + Knowledge, + Question, + Textbook, + UserKnowledge, + User, +) +from schemas import ( + AnswerIn, + KnowledgeOut, + PerQuestionOut, + PracticeSessionOut, + QuestionOut, + SubmitIn, + SubmitResultOut, +) +from services.ai_teacher import explain as teacher_explain +from services.mastery_engine import apply_answers, snapshot, status_for +from services.question_engine import chapter_question_ids, load_questions +from services.knowledge_service import question_knowledge_names + + +router = APIRouter(prefix="/practice", tags=["practice"]) + + +def _to_question_out(q: Question) -> QuestionOut: + return QuestionOut( + id=q.id, + stem=q.stem, + options=json.loads(q.options), + knowledge_name=q.knowledge_name, + ) + + +@router.get("/chapter/{chapter_id}", response_model=PracticeSessionOut) +def chapter_session( + chapter_id: int, + limit: int = 5, + variant: int = 0, + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + chapter = db.get(Chapter, chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + textbook = db.get(Textbook, chapter.textbook_id) + question_ids = chapter_question_ids( + db, user.id, chapter.id, limit=max(1, min(limit, 10)), variant=variant + ) + questions = load_questions(db, question_ids) + return PracticeSessionOut( + mode="chapter", + title=f"{textbook.name if textbook else '教材'} · {chapter.name}", + chapter_id=chapter.id, + questions=[_to_question_out(q) for q in questions], + ) + + +@router.post("/submit", response_model=SubmitResultOut) +def submit_answers( + payload: SubmitIn, + db: Session = Depends(get_db), + user: User = Depends(require_learning_user), +): + mode = payload.mode + if mode != "chapter": + raise HTTPException(status_code=400, detail="未知的练习模式") + + seen: set[int] = set() + for answer in payload.answers: + if answer.question_id in seen: + raise HTTPException(status_code=400, detail="同一道题提交了多次") + seen.add(answer.question_id) + + questions = load_questions(db, list(seen)) + by_id = {q.id: q for q in questions} + if len(by_id) != len(seen): + raise HTTPException(status_code=400, detail="部分题目不存在") + + knowledge_map = { + knowledge.name: user_knowledge + for user_knowledge, knowledge in ( + db.query(UserKnowledge, Knowledge) + .join(Knowledge, Knowledge.id == UserKnowledge.knowledge_id) + .filter(UserKnowledge.user_id == user.id) + .all() + ) + } + if payload.chapter_id is None: + raise HTTPException(status_code=400, detail="章节测试需要指定 chapter_id") + chapter = db.get(Chapter, payload.chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + textbook = db.get(Textbook, chapter.textbook_id) + title = f"{textbook.name if textbook else '教材'} · {chapter.name}" + if any(q.chapter_id != chapter.id for q in questions): + raise HTTPException( + status_code=400, + detail="提交的题目不属于所选章节,请重新开始测试", + ) + score = 0 + answered_mastery: list[tuple[str, bool]] = [] + per_question: list[PerQuestionOut] = [] + + attempt = AttemptSession( + user_id=user.id, + mode=mode, + title=title, + total=len(payload.answers), + correct=0, + chapter_id=chapter.id, + ) + db.add(attempt) + db.flush() + + for index, answer in enumerate(payload.answers, start=1): + q = by_id[answer.question_id] + correct = answer.selected == q.correct_index + if correct: + score += 1 + tags = question_knowledge_names(db, q) + for tag in tags: + answered_mastery.append((tag, correct)) + + teacher_text = teacher_explain( + q, + answer.selected, + correct, + knowledge_map.get(q.knowledge_name), + ) + q.used_count = (q.used_count or 0) + 1 + db.add( + AttemptItem( + attempt_id=attempt.id, + user_id=user.id, + question_index=index, + question_id=q.id, + stem=q.stem, + options=q.options, + correct_index=q.correct_index, + selected=answer.selected, + correct=correct, + knowledge_name=tags[0] if tags else q.knowledge_name, + knowledge_names=json.dumps(tags or [q.knowledge_name], ensure_ascii=False), + explanation=teacher_text, + ) + ) + if not correct: + diagnosis = q.explanation or "需要复习该知识点" + db.add( + ErrorEntry( + user_id=user.id, + attempt_id=attempt.id, + source_label=f"{title} · {index}", + knowledge_name=tags[0] if tags else q.knowledge_name, + knowledge_names=json.dumps( + tags or [q.knowledge_name], ensure_ascii=False + ), + diagnosis=diagnosis, + question_id=q.id, + stem=q.stem, + options=q.options, + selected=answer.selected, + correct_index=q.correct_index, + explanation=teacher_text, + ) + ) + per_question.append( + PerQuestionOut( + question_id=q.id, + correct=correct, + selected=answer.selected, + correct_index=q.correct_index, + explanation=teacher_text, + ) + ) + + apply_answers(db, user.id, mode, answered_mastery) + attempt.correct = score + db.commit() + + accuracy = score / len(payload.answers) * 100 if payload.answers else 0.0 + return SubmitResultOut( + mode=mode, + title=title, + total=len(payload.answers), + score=score, + accuracy=round(accuracy, 1), + per_question=per_question, + knowledge=[ + KnowledgeOut( + id=k.id, + knowledge_id=k.knowledge_id, + name=k.name, + mastery=k.mastery, + position=k.position, + status=status_for(k.mastery), + domain=k.domain, + category=k.category, + ) + for k in snapshot(db, user.id) + ], + ) diff --git a/backend/routers/question_bank.py b/backend/routers/question_bank.py new file mode 100644 index 0000000..49b49a1 --- /dev/null +++ b/backend/routers/question_bank.py @@ -0,0 +1,290 @@ +"""题库管理:题目列表、删除、按章节生成新题。""" +from __future__ import annotations + +import json +import uuid + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from database import REPO_ROOT +from dependencies import require_permission +from models import ( + Chapter, + Knowledge, + LlmSetting, + Question, + QuestionKnowledge, + Textbook, + User, +) +from schemas import GenerateIn, QuestionBankItemOut, QuestionUpdate +from services.question_generator import generate_questions +from services.llm_config import get_default_channel +from services.knowledge_service import ( + question_knowledge_names, + set_question_knowledge_names, +) + + +router = APIRouter(prefix="/question-bank", tags=["question-bank"]) + +IMAGE_UPLOAD_DIR = REPO_ROOT / "data" / "question_images" + + +def _store_generated_svg(svg: str) -> str: + """把模型生成的 SVG 存成题目独立图片,返回可访问的相对 URL。""" + import re + + clean = re.sub(r"", "", svg, flags=re.I) + clean = re.sub(r"\son\w+=[\"'][^\"']*[\"']", "", clean, flags=re.I) + IMAGE_UPLOAD_DIR.mkdir(parents=True, exist_ok=True) + filename = f"generated_{uuid.uuid4().hex}.svg" + (IMAGE_UPLOAD_DIR / filename).write_text(clean, encoding="utf-8") + return f"/api/question-images/{filename}" + + +def _resolve_selected_knowledge( + db: Session, + knowledge_ids: list[int], + knowledge_names: list[str], + fallback: str, +) -> list[str]: + if knowledge_ids: + rows = ( + db.query(Knowledge) + .filter(Knowledge.id.in_(knowledge_ids)) + .all() + ) + by_id = {row.id: row for row in rows} + missing = [kid for kid in knowledge_ids if kid not in by_id] + if missing: + raise HTTPException( + status_code=400, detail="部分所选知识点不存在,请刷新知识图谱后重试" + ) + return [by_id[kid].name for kid in knowledge_ids] + names = [ + name.strip() for name in knowledge_names if name.strip() + ] + if names: + return names + return [fallback.strip()] if fallback.strip() else [] + + +def _to_item( + db: Session, + question: Question, + chapter: Chapter | None, + textbook: Textbook | None, +): + knowledge_rows = ( + db.query(Knowledge.id, Knowledge.name) + .join( + QuestionKnowledge, + QuestionKnowledge.knowledge_id == Knowledge.id, + ) + .filter(QuestionKnowledge.question_id == question.id) + .order_by(QuestionKnowledge.id.asc()) + .all() + ) + if not knowledge_rows and question.knowledge_name: + knowledge_rows = [ + (0, question.knowledge_name), + ] + knowledge_names = [name for _, name in knowledge_rows] + return QuestionBankItemOut( + id=question.id, + chapter_id=question.chapter_id, + chapter_name=chapter.name if chapter else "", + textbook_name=textbook.name if textbook else "", + knowledge_name=question.knowledge_name, + stem=question.stem, + options=json.loads(question.options), + correct_index=question.correct_index, + explanation=question.explanation, + difficulty=question.difficulty, + is_generated=bool(question.is_generated), + used_count=question.used_count or 0, + knowledge_names=[str(name) for name in knowledge_names], + knowledge_ids=[kid for kid, _ in knowledge_rows if kid], + ) + + +def _query(db: Session): + return ( + db.query(Question, Chapter, Textbook) + .outerjoin(Chapter, Question.chapter_id == Chapter.id) + .outerjoin(Textbook, Chapter.textbook_id == Textbook.id) + ) + + +@router.get("/questions", response_model=list[QuestionBankItemOut]) +def list_questions( + textbook_id: int | None = None, + chapter_id: int | None = None, + knowledge_name: str = "", + generated: bool | None = None, + db: Session = Depends(get_db), + _: User = Depends(require_permission("question-bank:manage")), +): + query = _query(db) + if textbook_id: + query = query.filter(Textbook.id == textbook_id) + if chapter_id: + query = query.filter(Question.chapter_id == chapter_id) + if knowledge_name: + query = query.filter(Question.knowledge_name == knowledge_name) + if generated is not None: + query = query.filter(Question.is_generated == generated) + rows = query.order_by(Question.id.desc()).all() + return [_to_item(db, question, chapter, textbook) for question, chapter, textbook in rows] + + +@router.delete("/questions/{question_id}") +def delete_question( + question_id: int, + db: Session = Depends(get_db), + _: User = Depends(require_permission("question-bank:manage")), +): + question = db.get(Question, question_id) + if question is None: + raise HTTPException(status_code=404, detail="题目不存在") + used_count = question.used_count or 0 + if used_count > 0: + raise HTTPException( + status_code=400, + detail=f"该题目已被使用 {used_count} 次,不能删除;只能编辑题目内容", + ) + db.delete(question) + db.commit() + return {"deleted": question_id} + + +@router.put("/questions/{question_id}", response_model=QuestionBankItemOut) +def update_question( + question_id: int, + payload: QuestionUpdate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("question-bank:manage")), +): + question = db.get(Question, question_id) + if question is None: + raise HTTPException(status_code=404, detail="题目不存在") + if payload.chapter_id is not None: + chapter = db.get(Chapter, payload.chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + question.chapter_id = chapter.id + else: + question.chapter_id = None + options = [option.strip() for option in payload.options] + if any(not option for option in options) or len(set(options)) != 4: + raise HTTPException(status_code=400, detail="选项必须是 4 个非空且不重复的内容") + question.stem = payload.stem.strip() + question.options = json.dumps(options, ensure_ascii=False) + question.correct_index = payload.correct_index + question.explanation = payload.explanation.strip() + chosen = _resolve_selected_knowledge( + db, payload.knowledge_ids, payload.knowledge_names, payload.knowledge_name + ) + if not chosen: + raise HTTPException(status_code=400, detail="请至少选择一个知识点") + question.knowledge_name = chosen[0] + set_question_knowledge_names( + db, question, chosen, attach_to_chapter=True + ) + question.difficulty = payload.difficulty + db.commit() + chapter = ( + db.query(Chapter).filter(Chapter.id == question.chapter_id).first() + if question.chapter_id is not None + else None + ) + textbook = ( + db.query(Textbook).filter(Textbook.id == chapter.textbook_id).first() + if chapter is not None + else None + ) + return _to_item(db, question, chapter, textbook) + + +@router.post("/generate", response_model=list[QuestionBankItemOut]) +def generate( + payload: GenerateIn, + db: Session = Depends(get_db), + _: User = Depends(require_permission("question-bank:manage")), +): + chapter = db.get(Chapter, payload.chapter_id) + if chapter is None: + raise HTTPException(status_code=404, detail="章节不存在") + textbook = db.get(Textbook, chapter.textbook_id) + if textbook is None: + raise HTTPException(status_code=404, detail="教材/课程不存在") + if payload.channel_id is not None: + setting = db.get(LlmSetting, payload.channel_id) + if setting is None: + raise HTTPException(status_code=404, detail="指定的模型通道不存在") + else: + setting = get_default_channel(db) + if setting is None: + raise HTTPException( + status_code=400, + detail="尚未配置模型通道,请先到“模型配置”新增并设为默认", + ) + + try: + raw_items = generate_questions( + db=db, + setting=setting, + chapter=chapter, + textbook=textbook, + count=payload.count, + difficulty=payload.difficulty, + knowledge_name=( + "、".join( + name.strip() + for name in payload.knowledge_names + if name.strip() + ) + or payload.knowledge_name.strip() + ), + instructions=payload.instructions.strip(), + need_figure=payload.need_figure, + ) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + + inserted: list[Question] = [] + for item in raw_items: + chosen = _resolve_selected_knowledge( + db, + payload.knowledge_ids, + payload.knowledge_names, + item["knowledge_name"], + ) + if not chosen: + chosen = [item["knowledge_name"]] + stem = item["stem"] + if payload.need_figure and item.get("image_svg"): + image_url = _store_generated_svg(item["image_svg"]) + stem = f"{stem}\n\n![AI 配图]({image_url})" + question = Question( + stem=stem, + options=json.dumps(item["options"], ensure_ascii=False), + correct_index=item["correct_index"], + knowledge_name=chosen[0], + explanation=item["explanation"], + chapter_id=chapter.id, + difficulty=item["difficulty"], + is_generated=True, + ) + db.add(question) + inserted.append(question) + db.flush() + for question in inserted: + set_question_knowledge_names(db, question, chosen, attach_to_chapter=True) + + result = [_to_item(db, question, chapter, textbook) for question in inserted] + db.commit() + return result diff --git a/backend/routers/users.py b/backend/routers/users.py new file mode 100644 index 0000000..7aedeef --- /dev/null +++ b/backend/routers/users.py @@ -0,0 +1,144 @@ +"""管理员用户管理。""" +from __future__ import annotations + +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from database import get_db +from dependencies import require_permission +from models import Role, User, UserRole +from routers.auth import user_to_out +from schemas import ( + ResetPasswordIn, + RoleOut, + UserCreate, + UserOut, + UserUpdate, +) +from seed.rbac import ROLES +from services.learning_profile import ( + ensure_profile, + remove_unused_admin_profile, + reset_all_learning, +) +from services.security import hash_password + + +router = APIRouter(prefix="/users", tags=["users"], dependencies=[]) + + +@router.post("/reset-learning") +def reset_learning( + db: Session = Depends(get_db), + _: User = Depends(require_permission("users:manage")), +): + """清空所有用户的学习过程数据(保留用户/教材/题库/知识点图谱)。""" + reset_all_learning(db) + return {"ok": True, "message": "所有学习过程数据已清空,可从新的章节任务重新开始"} + + +def _role(db: Session, code: str) -> Role: + role = db.query(Role).filter(Role.code == code).first() + if role is None: + raise HTTPException(status_code=400, detail="角色不存在") + return role + + +@router.get("", response_model=list[UserOut]) +def list_users( + role_code: str = "", + db: Session = Depends(get_db), + _: User = Depends(require_permission("users:manage")), +): + query = db.query(User) + if role_code: + query = ( + query.join(UserRole, UserRole.user_id == User.id) + .join(Role, Role.id == UserRole.role_id) + .filter(Role.code == role_code) + ) + users = query.order_by(User.id.asc()).all() + return [user_to_out(db, user) for user in users] + + +@router.get("/roles", response_model=list[RoleOut]) +def list_roles( + db: Session = Depends(get_db), + _: User = Depends(require_permission("users:manage")), +): + return [RoleOut.model_validate(role) for role in db.query(Role).order_by(Role.id).all()] + + +@router.post("", response_model=UserOut) +def create_user( + payload: UserCreate, + db: Session = Depends(get_db), + _: User = Depends(require_permission("users:manage")), +): + if payload.role_code not in ROLES: + raise HTTPException(status_code=400, detail="不支持的角色") + if db.query(User).filter(User.username == payload.username).first(): + raise HTTPException(status_code=400, detail="用户名已存在") + role = _role(db, payload.role_code) + user = User( + username=payload.username, + display_name=payload.display_name or payload.username, + password_hash=hash_password(payload.password), + active=True, + ) + db.add(user) + db.flush() + db.add(UserRole(user_id=user.id, role_id=role.id)) + db.commit() + if role.code != "admin": + ensure_profile(db, user.id) + else: + remove_unused_admin_profile(db, user.id) + db.refresh(user) + return user_to_out(db, user) + + +@router.put("/{user_id}", response_model=UserOut) +def update_user( + user_id: int, + payload: UserUpdate, + db: Session = Depends(get_db), + operator: User = Depends(require_permission("users:manage")), +): + user = db.get(User, user_id) + if user is None: + raise HTTPException(status_code=404, detail="用户不存在") + if user.id == operator.id and payload.active is False: + raise HTTPException(status_code=400, detail="不能停用自己的账号") + + if payload.display_name is not None: + user.display_name = payload.display_name + if payload.active is not None: + user.active = payload.active + if payload.role_code is not None: + role = _role(db, payload.role_code) + if user.id == operator.id and role.code != "admin": + raise HTTPException(status_code=400, detail="不能移除自己的管理员角色") + db.query(UserRole).filter(UserRole.user_id == user.id).delete() + db.add(UserRole(user_id=user.id, role_id=role.id)) + if role.code == "admin": + remove_unused_admin_profile(db, user.id) + else: + ensure_profile(db, user.id) + db.commit() + return user_to_out(db, user) + + +@router.post("/{user_id}/reset-password") +def reset_password( + user_id: int, + payload: ResetPasswordIn, + db: Session = Depends(get_db), + _: User = Depends(require_permission("users:manage")), +): + user = db.get(User, user_id) + if user is None: + raise HTTPException(status_code=404, detail="用户不存在") + user.password_hash = hash_password(payload.password) + db.commit() + return {"ok": True, "message": f"已重置 {user.username} 的密码。"} diff --git a/backend/schemas/__init__.py b/backend/schemas/__init__.py new file mode 100644 index 0000000..7d7d3ff --- /dev/null +++ b/backend/schemas/__init__.py @@ -0,0 +1,561 @@ +"""API 请求 / 响应模型。""" +from __future__ import annotations + +from datetime import date, datetime +from typing import Any + +from pydantic import BaseModel, ConfigDict, Field + + +class ORMModel(BaseModel): + model_config = ConfigDict(from_attributes=True) + + +class KnowledgeOut(ORMModel): + id: int + knowledge_id: int + name: str + mastery: int + position: int + status: str = "" + domain: str = "" + category: str = "" + + +class KnowledgeResourceOut(BaseModel): + id: int + kind: str + title: str + url: str + source_name: str = "" + + +class KnowledgeRelatedOut(BaseModel): + id: int + name: str + relation_type: str + direction: str = "out" # out: 当前节点指向对方;in: 对方指向当前节点 + mastery: int | None = None + + +class KnowledgeChapterOut(BaseModel): + chapter_id: int + chapter_name: str + textbook_id: int + textbook_name: str + question_count: int = 0 + # 电子书定位:has_ebook 为假时前端不显示「读教材」入口 + ebook_page: int = 0 + has_ebook: bool = False + + +class KnowledgeDetailOut(BaseModel): + id: int + name: str + domain: str + category: str + description: str + mastery: int + status: str + related_knowledge_count: int + chapter_count: int + question_count: int + related: list[KnowledgeRelatedOut] = [] + chapters: list[KnowledgeChapterOut] = [] + resources: list[KnowledgeResourceOut] = [] + + +class KnowledgeResourceIn(BaseModel): + kind: str = "video" + title: str = "" + url: str = "" + textbook_id: int | None = None + course_id: int | None = None + + +class QuestionOut(BaseModel): + id: int + stem: str + options: list[str] + knowledge_name: str + + +class PracticeSessionOut(BaseModel): + mode: str + title: str + chapter_id: int | None = None + questions: list[QuestionOut] + + +class AnswerIn(BaseModel): + question_id: int + selected: int + + +class SubmitIn(BaseModel): + mode: str + chapter_id: int | None = None + answers: list[AnswerIn] = Field(min_length=1) + + +class PerQuestionOut(BaseModel): + question_id: int + correct: bool + selected: int + correct_index: int + explanation: str + + +class SubmitResultOut(BaseModel): + mode: str + title: str + total: int + score: int + accuracy: float + per_question: list[PerQuestionOut] + knowledge: list[KnowledgeOut] + + +class ErrorOut(BaseModel): + id: int + source_label: str + knowledge_name: str + diagnosis: str + status: str + created_on: date + attempt_id: int | None = None + question_id: int | None = None + stem: str = "" + options: list[str] = [] + selected: int | None = None + correct_index: int | None = None + explanation: str = "" + knowledge_names: list[str] = [] + + +class RecordOut(BaseModel): + id: int + mode: str + title: str + total: int + correct: int + happened_on: date + + +class AttemptItemOut(BaseModel): + question_index: int + question_id: int | None + stem: str + options: list[str] + selected: int | None + correct_index: int + correct: bool + knowledge_name: str + explanation: str + knowledge_names: list[str] = [] + + +class RecordDetailOut(RecordOut): + items: list[AttemptItemOut] = [] + + +class DailyOut(BaseModel): + today: date + completed: bool + streak: int + chapter_id: int | None = None + chapter_name: str = "" + book_name: str = "" + # 今日章节对应的电子书定位,没有电子书时 has_ebook 为假 + textbook_id: int | None = None + ebook_page: int = 0 + has_ebook: bool = False + rating: str = "" + knowledge_names: list[str] = [] + reason: str = "" + + +class DailyCompleteIn(BaseModel): + chapter_id: int + rating: str = "" + + +class MetricItem(BaseModel): + label: str + value: str + + +class PlanOut(BaseModel): + notice: str + focus_names: list[str] + steps: list[str] + + +class OverviewOut(BaseModel): + metrics: list[MetricItem] + knowledge: list[KnowledgeOut] + plan: PlanOut + + +class DiagnosisOut(BaseModel): + name: str + mastery: int + error_count: int + action: str + + +class AnalyticsOut(BaseModel): + metrics: list[MetricItem] + diagnosis: list[DiagnosisOut] + + +class ImportPayload(BaseModel): + version: int = 1 + knowledge: list[dict[str, Any]] = [] + records: list[Any] = [] + errors: list[Any] = [] + daily_completions: list[date] = [] + + +class ImportResult(BaseModel): + imported: bool + knowledge: int + records: int + errors: int + items: int = 0 + message: str + + +class ChapterOut(ORMModel): + id: int + textbook_id: int + name: str + position: int + summary: str = "" + ebook_page: int = 0 + question_count: int = 0 + knowledge_names: list[str] = [] + knowledge_ids: list[int] = [] + + +class EbookProgressOut(ORMModel): + textbook_id: int + locator: str = "" + page: int = 0 + total: int = 0 + position: float = 0.0 + updated_at: datetime | None = None + + +class EbookProgressIn(BaseModel): + locator: str = Field(default="", max_length=512) + page: int = 0 + total: int = 0 + position: float = 0.0 + + +class TextbookOut(ORMModel): + id: int + name: str + author: str + publisher: str + isbn: str + edition: str + grade: str + link: str + description: str + position: int + chapters: list[ChapterOut] = [] + # 在线阅读:文件本身走 /api/textbooks/{id}/ebook/file/{file} + ebook_file: str = "" + ebook_format: str = "" + ebook_name: str = "" + ebook_size: int = 0 + ebook_pages: int = 0 + ebook_uploaded_at: datetime | None = None + ebook_progress: EbookProgressOut | None = None + + +class CourseOut(ORMModel): + id: int + name: str + provider: str + url: str + grade: str + description: str + position: int + + +class QuestionBankItemOut(BaseModel): + id: int + chapter_id: int | None + chapter_name: str = "" + textbook_name: str = "" + knowledge_name: str + stem: str + options: list[str] + correct_index: int + explanation: str + difficulty: int + is_generated: bool + used_count: int + knowledge_names: list[str] = [] + knowledge_ids: list[int] = [] + + +class QuestionUpdate(BaseModel): + stem: str = Field(min_length=1) + options: list[str] = Field(min_length=4, max_length=4) + correct_index: int = Field(ge=0, le=3) + explanation: str = "" + knowledge_name: str = Field(min_length=1, max_length=64) + difficulty: int = Field(default=1, ge=1, le=3) + chapter_id: int | None = None + knowledge_names: list[str] = [] + knowledge_ids: list[int] = [] + + +class GenerateIn(BaseModel): + chapter_id: int + count: int = Field(default=3, ge=1, le=10) + difficulty: int = Field(default=2, ge=1, le=3) + knowledge_name: str = "" + instructions: str = "" + channel_id: int | None = None + knowledge_names: list[str] = [] + knowledge_ids: list[int] = [] + need_figure: bool = False + + +class LlmProviderOut(BaseModel): + id: str + label: str + base_url: str + model: str + + +class LlmChannelOut(BaseModel): + id: int + name: str + provider: str + provider_label: str + base_url: str + model: str + temperature: float + max_tokens: int | None = None + has_api_key: bool + api_key_preview: str + is_default: bool + + +class LlmSettingsOut(BaseModel): + channels: list[LlmChannelOut] = [] + providers: list[LlmProviderOut] + + +class LlmChannelCreate(BaseModel): + name: str = Field(min_length=1, max_length=128) + provider: str = "openai" + base_url: str = "" + model: str = "" + temperature: float = Field(default=0.3, ge=0.0, le=2.0) + max_tokens: int | None = Field(default=None, ge=64, le=12000) + api_key: str | None = None + + +class LlmChannelUpdate(BaseModel): + name: str | None = Field(default=None, min_length=1, max_length=128) + provider: str | None = None + base_url: str | None = None + model: str | None = None + temperature: float | None = Field(default=None, ge=0.0, le=2.0) + max_tokens: int | None = Field(default=None, ge=64, le=12000) + clear_max_tokens: bool = False + api_key: str | None = None + clear_api_key: bool = False + + +class LlmTestResult(BaseModel): + ok: bool + message: str + + +class LlmTaskCreate(BaseModel): + kind: str + params: dict[str, Any] = {} + + +class LlmTaskOut(BaseModel): + id: int + kind: str + status: str + progress: int + message: str + result: dict[str, Any] = {} + + +class LoginIn(BaseModel): + username: str + password: str + + +class TokenOut(BaseModel): + access_token: str + token_type: str = "bearer" + role: str + display_name: str + + +class ChangePasswordIn(BaseModel): + old_password: str + new_password: str = Field(min_length=6, max_length=128) + + +class RoleOut(ORMModel): + id: int + code: str + name: str + description: str + + +class UserOut(BaseModel): + id: int + username: str + display_name: str + active: bool + roles: list[RoleOut] = [] + created_at: datetime | None = None + + +class UserCreate(BaseModel): + username: str = Field(min_length=2, max_length=64, pattern=r"^[A-Za-z0-9_.-]+$") + display_name: str = Field(default="", max_length=64) + password: str = Field(min_length=6, max_length=128) + role_code: str = "student" + + +class UserUpdate(BaseModel): + display_name: str | None = Field(default=None, max_length=64) + active: bool | None = None + role_code: str | None = None + + +class ResetPasswordIn(BaseModel): + password: str = Field(min_length=6, max_length=128) + + +class TextbookCreate(BaseModel): + name: str = Field(min_length=1, max_length=128) + author: str = "" + publisher: str = "" + isbn: str = "" + edition: str = "" + grade: str = "" + link: str = "" + description: str = "" + + +class TextbookUpdate(BaseModel): + name: str | None = Field(default=None, max_length=128) + author: str | None = None + publisher: str | None = None + isbn: str | None = None + edition: str | None = None + grade: str | None = None + link: str | None = None + description: str | None = None + + +class CourseCreate(BaseModel): + name: str = Field(min_length=1, max_length=128) + provider: str = "" + url: str = "" + grade: str = "" + description: str = "" + + +class CourseUpdate(BaseModel): + name: str | None = Field(default=None, max_length=128) + provider: str | None = None + url: str | None = None + grade: str | None = None + description: str | None = None + + +class ChapterCreate(BaseModel): + name: str = Field(min_length=1, max_length=128) + summary: str = "" + knowledge_names: list[str] = [] + knowledge_ids: list[int] = [] + + +class ChapterUpdate(BaseModel): + name: str | None = Field(default=None, max_length=128) + summary: str | None = None + ebook_page: int | None = None + knowledge_names: list[str] | None = None + knowledge_ids: list[int] | None = None + + +class ChaptersGenerateIn(BaseModel): + count: int | None = Field(default=None, ge=1, le=12) + channel_id: int | None = None + instructions: str = "" + knowledge_ids: list[int] = [] + + +class ChaptersGenerateOut(BaseModel): + created: list[ChapterOut] = [] + skipped_duplicates: list[str] = [] + message: str = "" + + +class ChaptersOrganizeIn(BaseModel): + reference_text: str = Field(min_length=1) + channel_id: int | None = None + + +class ProfileUpdate(BaseModel): + display_name: str = Field(min_length=1, max_length=64) + + +class KnowledgeGraphNode(BaseModel): + id: int + name: str + domain: str + category: str + description: str + chapter_count: int = 0 + question_count: int = 0 + resources: list[KnowledgeResourceOut] = [] + + +class KnowledgeGraphEdge(BaseModel): + source: int + target: int + relation_type: str + + +class KnowledgeGraphOut(BaseModel): + nodes: list[KnowledgeGraphNode] = [] + edges: list[KnowledgeGraphEdge] = [] + + +class KnowledgeNodeCreate(BaseModel): + name: str = Field(min_length=1, max_length=64) + domain: str = "初等" + category: str = "" + description: str = "" + + +class KnowledgeNodeUpdate(BaseModel): + name: str | None = Field(default=None, min_length=1, max_length=64) + domain: str | None = None + category: str | None = None + description: str | None = None + + +class KnowledgeRelationIn(BaseModel): + source_id: int + target_id: int + relation_type: str = "前置" diff --git a/backend/seed/__init__.py b/backend/seed/__init__.py new file mode 100644 index 0000000..ed2666d --- /dev/null +++ b/backend/seed/__init__.py @@ -0,0 +1 @@ +"""初始化数据:知识点、题库、示例练习记录。""" diff --git a/backend/seed/__main__.py b/backend/seed/__main__.py new file mode 100644 index 0000000..5d6ec9b --- /dev/null +++ b/backend/seed/__main__.py @@ -0,0 +1,180 @@ +"""初始化数据库:RBAC 账号、学习档案、题库与教材目录。 + +用法:在 backend/ 目录下执行 python -m seed [--force] +--force 会清空全部学习数据与题库后重新导入,保留用户与角色。 +""" +from __future__ import annotations + +import argparse +import json +from datetime import date, timedelta + +from database import DATABASE_URL, SessionLocal, ensure_schema +from models import ( + AttemptItem, + AttemptSession, + DailyCompletion, + ErrorEntry, + Question, + User, + UserKnowledge, +) +from seed.catalog import ensure_catalog +from seed.data import KNOWLEDGE, QUESTIONS +from seed.rbac import DEFAULT_USERS, ensure_rbac +from services.learning_profile import ( + ensure_default_profiles, + remove_unused_admin_profile, + user_has_admin_role, +) +from services.llm_config import ensure_llm_channels +from services.knowledge_service import set_question_knowledge_names + + +def _insert_questions(db) -> None: + for item in QUESTIONS: + db.add( + Question( + stem=item["stem"], + options=json.dumps(item["options"], ensure_ascii=False), + correct_index=item["correct_index"], + knowledge_name=item["knowledge_name"], + explanation=item["explanation"], + ) + ) + + +def _demo_history(db, student: User) -> None: + questions = db.query(Question).order_by(Question.id.asc()).all() + configs = [ + # (标题, 题目, 答错题号集合, 几天前) + ("第一轮基础题", questions[:10], {2, 4, 7}, 3), + ("第二轮综合题", questions[10:18], {1, 3, 5}, 1), + ] + for title, questions, wrong_indexes, days_ago in configs: + if not questions: + continue + correct_count = len(questions) - len(wrong_indexes) + session = AttemptSession( + user_id=student.id, + mode="legacy", + title=title, + total=len(questions), + correct=correct_count, + happened_on=date.today() - timedelta(days=days_ago), + ) + db.add(session) + db.flush() + for index, question in enumerate(questions, start=1): + is_correct = index not in wrong_indexes + selected = ( + question.correct_index + if is_correct + else (question.correct_index + 1) % 4 + ) + teacher_text = question.explanation or "结合定义与图像性质重新判断。" + question.used_count = (question.used_count or 0) + 1 + db.add( + AttemptItem( + attempt_id=session.id, + user_id=student.id, + question_index=index, + question_id=question.id, + stem=question.stem, + options=question.options, + correct_index=question.correct_index, + selected=selected, + correct=is_correct, + knowledge_name=question.knowledge_name, + knowledge_names=json.dumps( + [question.knowledge_name], ensure_ascii=False + ), + explanation=teacher_text, + ) + ) + if not is_correct: + db.add( + ErrorEntry( + user_id=student.id, + attempt_id=session.id, + source_label=f"{title} · {index}", + knowledge_name=question.knowledge_name, + knowledge_names=json.dumps( + [question.knowledge_name], ensure_ascii=False + ), + diagnosis="答题错误,需要复习", + question_id=question.id, + stem=question.stem, + options=question.options, + selected=selected, + correct_index=question.correct_index, + explanation=teacher_text, + ) + ) + # 保持每日任务演示数据(昨天已完成) + db.add(DailyCompletion(user_id=student.id, done_on=date.today() - timedelta(days=1))) + + +def load_seed(force: bool = False) -> bool: + ensure_schema() + db = SessionLocal() + created = False + try: + ensure_rbac(db) + users = { + username: db.query(User).filter(User.username == username).first() + for username, _, _, _ in DEFAULT_USERS + } + ensure_default_profiles(db) + ensure_llm_channels(db) + + if force: + db.query(AttemptItem).delete() + db.query(DailyCompletion).delete() + db.query(ErrorEntry).delete() + db.query(AttemptSession).delete() + db.query(UserKnowledge).delete() + db.query(Question).delete() + ensure_default_profiles(db) + _insert_questions(db) + db.flush() + for question in db.query(Question).all(): + set_question_knowledge_names( + db, question, [question.knowledge_name] + ) + _demo_history(db, users["student"]) + created = True + elif db.query(Question).count() == 0: + _insert_questions(db) + db.flush() + for question in db.query(Question).all(): + set_question_knowledge_names( + db, question, [question.knowledge_name] + ) + _demo_history(db, users["student"]) + created = True + + db.commit() + ensure_catalog(db, force_sync=force) + for user in users.values(): + if user and user_has_admin_role(db, user.id): + remove_unused_admin_profile(db, user.id) + return created + finally: + db.close() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="初始化数学学习系统数据库") + parser.add_argument("--force", action="store_true", help="清空学习数据后重新导入种子") + args = parser.parse_args() + created = load_seed(force=args.force) + print(f"数据库:{DATABASE_URL}") + if created: + total = len(QUESTIONS) + print( + "已完成初始化:默认账号 admin/admin123、student/student123," + f"{total} 道题目。" + ) + else: + print("已存在数据,跳过导入(重置可运行:python -m seed --force)。") diff --git a/backend/seed/catalog.py b/backend/seed/catalog.py new file mode 100644 index 0000000..a7b4be4 --- /dev/null +++ b/backend/seed/catalog.py @@ -0,0 +1,389 @@ +"""教材与在线课程种子数据(两张表分别写入)。 + +教材以《盖尔范德中学生数学思维丛书》(中国科学技术大学出版社)为基础; +书号 / 出版信息均核对公开书目信息,课程使用官方站点链接。 +""" +from __future__ import annotations + +from sqlalchemy.orm import Session + +from models import Chapter, ChapterKnowledge, Course, Knowledge, Question, Textbook +from services.knowledge_service import ( + ensure_knowledge_resource, + set_chapter_knowledge_names, +) + + +# 现有题库知识点与《函数和图像》章节的对应关系(按丛书内容就近归类) +KNOWLEDGE_CHAPTER_MAP = { + "函数概念": "引言", + "函数值": "引言", + "定义域": "引言", + "正负性": "引言", + "零点": "第4章 二次三项式", + "偶函数": "第6章 幂函数", + "奇函数": "第6章 幂函数", + "图像对称性": "第6章 幂函数", +} + +DEFAULT_CHAPTER_KNOWLEDGE = { + "引言": ["函数概念", "函数值", "定义域", "正负性"], + "第4章 二次三项式": ["零点"], + "第6章 幂函数": ["偶函数", "奇函数", "图像对称性"], + "第1章 三角函数": ["三角函数"], + "第2章 三角形中的三角比": ["三角比", "直角三角形"], + "第3章 三角比之间的关系": ["三角恒等式", "同角关系"], + "第4章 三角形内的关系": ["正弦定理", "余弦定理"], + "第5章 角与旋转": ["任意角", "弧度制"], + "第6章 弧度法": ["弧度制", "弧长与扇形"], + "第7章 加法公式": ["和角公式", "差角公式"], + "第8章 三角恒等式": ["倍角公式", "三角恒等式"], + "第9章 三角函数的图形": ["三角函数图像", "周期函数"], + "第10章 反函数与三角方程": ["反三角函数", "三角方程"], + "点与直线:走进射影几何": ["点线面的基本关系", "几何变换"], + "平行线:走进仿射几何": ["平行与垂直"], + "面积:走进辛几何": ["面积与周长"], + "圆:走进欧氏几何": ["圆"], + "绪论": ["数轴", "平面直角坐标系"], + "第1章 直线上点的坐标": ["数轴", "实数", "两点间距离"], + "第2章 平面里点的坐标": [ + "平面直角坐标系", + "两点间距离", + "曲线与方程", + ], + "第3章 三维空间里点的坐标": ["平面直角坐标系", "点线面的基本关系"], + "第4章 引言": ["平面直角坐标系", "曲线与方程"], + "第5章 四维空间": ["平面直角坐标系", "曲线与方程"], + "第6章 四维方体": ["平面直角坐标系", "曲线与方程"], +} + +# 在线课程 / 视频与知识点的默认关联(知识点 → 课程资源反向链接)。 +COURSE_KNOWLEDGE_MAP = { + "Khan Academy · Algebra 1: Functions": [ + "函数与图像", + "函数概念", + "函数值", + "定义域", + "值域", + "零点", + "单调性", + "奇偶性", + "偶函数", + "奇函数", + "图像对称性", + "一次函数", + "函数图像与变换", + ], + "3Blue1Brown · Essence of Calculus": [ + "极限与连续", + "导数与微分", + "一元函数积分", + ], + "国家中小学智慧教育平台 · 高中数学(人教A版)": [ + "二次函数", + "抛物线", + "幂函数", + "三角函数", + "任意角", + "弧度制", + "三角比", + "同角三角函数关系", + "和角与差角公式", + "三角恒等式", + "三角函数图像", + "解三角形", + "直线方程", + ], +} + +# 以正式出版目录为准的官方章节模板(中文书名/ISBN 来自中国科学技术大学出版社版本)。 +OFFICIAL_PRIMARY_CHAPTERS = [ + {"name": "引言", "summary": "函数、自变量、定义域与函数值:从真实图像理解函数。"}, + {"name": "第1章 例子", "summary": "不同函数图像的直观例子与作图方法。"}, + {"name": "第2章 线性函数", "summary": "一次函数的图像、斜率与直线。"}, + {"name": "第3章 函数 y=|x|", "summary": "绝对值函数的图像与性质,关于 y 轴对称的典型例子。"}, + {"name": "第4章 二次三项式", "summary": "二次函数图像、配方、判别式与零点。"}, + {"name": "第5章 分式线性函数", "summary": "y=1/x 类函数图像与渐近行为。"}, + {"name": "第6章 幂函数", "summary": "y=x、y=x²、y=x³ 等幂函数的奇偶性与对称性。"}, + {"name": "第7章 有理函数", "summary": "更一般的有理函数图像与性质综合。"}, +] + +OFFICIAL_TRIG_CHAPTERS = [ + {"name": "第1章 三角函数", "summary": "从角与旋转进入三角函数,建立正弦、余弦、正切的基本概念。"}, + {"name": "第2章 三角形中的三角比", "summary": "在直角三角形中定义正弦、余弦与正切,理解锐角三角比。"}, + {"name": "第3章 三角比之间的关系", "summary": "同角三角比的关系、互余关系与基本恒等式推导。"}, + {"name": "第4章 三角形内的关系", "summary": "正弦定理、余弦定理以及三角形中边角关系的应用。"}, + {"name": "第5章 角与旋转", "summary": "把角推广到任意旋转角,定义任意角的三角函数。"}, + {"name": "第6章 弧度法", "summary": "引入弧度制,理解弧长、扇形与角度制换算。"}, + {"name": "第7章 加法公式", "summary": "两角和与差的三角函数公式及其几何与代数证明。"}, + {"name": "第8章 三角恒等式", "summary": "倍角、半角与和差化积等常用三角恒等式。"}, + {"name": "第9章 三角函数的图形", "summary": "正弦、余弦、正切函数的图像、周期与变换。"}, + {"name": "第10章 反函数与三角方程", "summary": "反三角函数的基本概念与三角方程的求解方法。"}, +] + +OFFICIAL_COORDINATE_CHAPTERS = [ + {"name": "绪论", "summary": "用坐标把几何问题转化为代数问题的方法引言。"}, + {"name": "第1章 直线上点的坐标", "summary": "数轴、数的绝对值与两点之间的距离。"}, + {"name": "第2章 平面里点的坐标", "summary": "坐标平面、坐标间关系、距离公式、确定平面图形与其他坐标系。"}, + {"name": "第3章 三维空间里点的坐标", "summary": "空间坐标轴与坐标平面,确定空间中的图形。"}, + {"name": "第4章 引言", "summary": "从三维推广到四维空间的动机:几何、计算与物理。"}, + {"name": "第5章 四维空间", "summary": "四维空间中的坐标轴、坐标平面与距离问题。"}, + {"name": "第6章 四维方体", "summary": "球与方体的定义、四维方体的结构与相关问题。"}, +] + +OFFICIAL_GEOMETRY_CHAPTERS = [ + {"name": "点与直线:走进射影几何", "summary": "从点与直线的位置关系出发理解射影几何的基本思想。"}, + {"name": "平行线:走进仿射几何", "summary": "以平行关系为线索建立仿射几何的直观框架。"}, + {"name": "面积:走进辛几何", "summary": "通过面积概念与保持面积变换认识辛几何。"}, + {"name": "圆:走进欧氏几何", "summary": "以圆为核心回到经典欧氏几何的结构与性质。"}, +] + +COURSES = [ + { + "name": "Khan Academy · Algebra 1: Functions", + "provider": "Khan Academy", + "url": "https://www.khanacademy.org/math/algebra/x2f8bb11595b61c86:functions", + "grade": "初中衔接 / 高中", + "description": ( + "函数单元含函数求值、定义域值域、函数图像与性质等大量免费练习," + "英文界面,适合配合盖尔范德丛书做自动化巩固。" + ), + }, + { + "name": "3Blue1Brown · Essence of Calculus", + "provider": "3Blue1Brown", + "url": "https://www.youtube.com/playlist?list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr", + "grade": "高中高年级 / 大学先修", + "description": ( + "微积分本质系列:从几何直觉理解导数与积分,适合函数图像直觉建立后" + "进入微积分阶段使用。" + ), + }, + { + "name": "国家中小学智慧教育平台 · 高中数学(人教A版)", + "provider": "教育部教育技术与资源发展中心", + "url": "https://basic.smartedu.cn/syncClassroom", + "grade": "高中全学段", + "description": ( + "官方免费同步课程与配套课件,可按教材版本与册次点播," + "适合做课内进度对照。" + ), + }, +] + +OFFICIAL_CHAPTERS_BY_ISBN = {} + + +CATALOG = [ + { + "name": "函数和图像(盖尔范德中学生数学思维丛书)", + "author": "I. M. Gelfand, E. G. Glagoleva, E. E. Shnol 著;麻希南、胡长青 译", + "publisher": "中国科学技术大学出版社", + "isbn": "9787312050053", + "edition": "2020年12月第1版", + "grade": "初中至高中低年级", + "link": "", + "description": ( + "本系统的主教材。以大量真实图像(地震图、心电图等)引入函数," + "强调“画图就是看见公式”,系统训练函数概念、图像与性质直觉;" + "英译本 Functions and Graphs 由 Dover 出版。现有函数与对称性题库" + "以本书为依据。" + ), + "chapters": [], + }, + { + "name": "代数(盖尔范德中学生数学思维丛书)", + "author": "I. M. Gelfand, A. Shen 著;胡长青、麻希南 译", + "publisher": "中国科学技术大学出版社", + "isbn": "9787312048937", + "edition": "2020年第1版", + "grade": "初中至高中低年级", + "link": "", + "description": ( + "用问题驱动的叙述串联自然数、负数、代数式与方程," + "重视“为什么可以这样变形”的代数思维,适合作为代数学基础。" + ), + "chapters": [], + }, + { + "name": "几何(盖尔范德中学生数学思维丛书)", + "author": "I. M. Gelfand 等 著", + "publisher": "中国科学技术大学出版社", + "isbn": "9787312057793", + "edition": "2023年第1版", + "grade": "初中至高中低年级", + "link": "", + "description": ( + "以直观可视的方式从图形构造逐步建立几何,突出“先看见、再证明”" + "的思维路线。" + ), + "chapters": [], + }, + { + "name": "三角函数(盖尔范德中学生数学思维丛书)", + "author": "I. M. Gelfand, M. Saul 著;王作勤 译", + "publisher": "中国科学技术大学出版社", + "isbn": "9787312046957", + "edition": "2020年第1版", + "grade": "初中至高中低年级", + "link": "", + "description": ( + "从初等几何直觉进入正弦、余弦与正切,解释周期与波动现象的数学本质。" + ), + "chapters": [], + }, + { + "name": "坐标方法(盖尔范德中学生数学思维丛书)", + "author": "I. M. Gelfand, E. G. Glagoleva, A. A. Kirillov 著;王作勤 译", + "publisher": "中国科学技术大学出版社", + "isbn": "9787312050060", + "edition": "2020年12月第1版", + "grade": "初中至高中低年级", + "link": "", + "description": ( + "讲解如何用坐标把几何问题转化为代数问题,是解析几何与函数图像" + "方法的基础。" + ), + "chapters": [], + }, +] + + +def ensure_catalog(db: Session, force_sync: bool = False) -> None: + """仅在空库时写入默认目录;管理员后续可自由增删改并持久保留。""" + _ensure_courses(db) + if db.query(Textbook).count() > 0 and not force_sync: + # 存量库不覆盖用户修改,但会补齐新增的“官方正式目录”章节 + for item in CATALOG: + textbook = ( + db.query(Textbook) + .filter(Textbook.name == item["name"]) + .first() + ) + if textbook is None or not item["chapters"]: + continue + existing = { + chapter.name: chapter + for chapter in db.query(Chapter) + .filter(Chapter.textbook_id == textbook.id) + .all() + } + position = len(existing) + for chapter in item["chapters"]: + if chapter["name"] not in existing: + db.add( + Chapter( + textbook_id=textbook.id, + name=chapter["name"], + position=position, + summary=chapter["summary"], + ) + ) + position += 1 + _sync_default_chapter_knowledge(db) + _sync_default_course_resources(db) + db.commit() + return + + for position, item in enumerate(CATALOG): + textbook = db.query(Textbook).filter(Textbook.name == item["name"]).first() + if textbook is None: + textbook = Textbook(name=item["name"], position=position) + db.add(textbook) + db.flush() + textbook.author = item["author"] + textbook.publisher = item["publisher"] + textbook.isbn = item["isbn"] + textbook.edition = item["edition"] + textbook.grade = item["grade"] + textbook.link = item["link"] + textbook.description = item["description"] + textbook.position = position + + existing = { + chapter.name: chapter + for chapter in db.query(Chapter) + .filter(Chapter.textbook_id == textbook.id) + .all() + } + for chapter_index, chapter in enumerate(item["chapters"]): + if chapter["name"] not in existing: + db.add( + Chapter( + textbook_id=textbook.id, + name=chapter["name"], + position=chapter_index, + summary=chapter["summary"], + ) + ) + + # 按最新知识点-章节映射重新关联所有题目 + primary = db.query(Textbook).filter(Textbook.name == CATALOG[0]["name"]).first() + if primary: + chapter_map = { + chapter.name: chapter + for chapter in db.query(Chapter) + .filter(Chapter.textbook_id == primary.id) + .all() + } + for question in db.query(Question).all(): + chapter = chapter_map.get( + KNOWLEDGE_CHAPTER_MAP.get(question.knowledge_name, "") + ) + question.chapter_id = chapter.id if chapter else None + _sync_default_chapter_knowledge(db) + _sync_default_course_resources(db) + db.commit() + + +def _sync_default_chapter_knowledge(db: Session) -> None: + """仅为还没有知识点关联的章节写入默认知识点(不覆盖管理员维护)。""" + for chapter in db.query(Chapter).all(): + linked = ( + db.query(ChapterKnowledge) + .filter(ChapterKnowledge.chapter_id == chapter.id) + .count() + ) + if linked: + continue + names = DEFAULT_CHAPTER_KNOWLEDGE.get(chapter.name, []) + if names: + set_chapter_knowledge_names(db, chapter.id, names) + + +def _ensure_courses(db: Session) -> None: + """课程表为空时写入默认在线课程;管理员删掉后不再自动恢复。""" + if db.query(Course).count() > 0: + return + for position, item in enumerate(COURSES): + db.add( + Course( + name=item["name"], + provider=item["provider"], + url=item["url"], + grade=item["grade"], + description=item["description"], + position=position, + ) + ) + db.commit() + + +def _sync_default_course_resources(db: Session) -> None: + """把在线课程 / 视频挂到对应知识点,作为知识点详情里的反向资源链接。""" + for course_name, knowledge_names in COURSE_KNOWLEDGE_MAP.items(): + course = db.query(Course).filter(Course.name == course_name).first() + if course is None or not course.url: + continue + for name in knowledge_names: + knowledge = db.query(Knowledge).filter(Knowledge.name == name).first() + if knowledge is None: + continue + ensure_knowledge_resource( + db, + knowledge.id, + kind="video", + title=course.name, + url=course.url, + course_id=course.id, + ) diff --git a/backend/seed/data.py b/backend/seed/data.py new file mode 100644 index 0000000..f35c29c --- /dev/null +++ b/backend/seed/data.py @@ -0,0 +1,151 @@ +"""从 math_learning_dashboard_v3.html 抽取的初始内容。""" +KNOWLEDGE = [ + {"name": "函数概念", "mastery": 80, "position": 1}, + {"name": "函数值", "mastery": 85, "position": 2}, + {"name": "定义域", "mastery": 90, "position": 3}, + {"name": "零点", "mastery": 80, "position": 4}, + {"name": "正负性", "mastery": 70, "position": 5}, + {"name": "偶函数", "mastery": 40, "position": 6}, + {"name": "奇函数", "mastery": 40, "position": 7}, + {"name": "图像对称性", "mastery": 50, "position": 8}, +] +QUESTIONS = [ + { + "stem": "已知函数 f(x) 满足 f(-x)=f(x),且 f(3)=5。下列哪个点一定在图像上?", + "options": ["A. (-3,5)", "B. (-3,-5)", "C. (3,-5)", "D. (5,-3)"], + "correct_index": 0, + "knowledge_name": "偶函数", + "explanation": "由偶函数定义 f(-x)=f(x) 可知,点 (3,5) 关于 y 轴的镜像点 (-3,5) 一定在图像上。", + }, + { + "stem": "已知函数 f(x) 满足 f(-x)=-f(x),且 f(2)=4。下列哪个点一定在图像上?", + "options": ["A. (-2,4)", "B. (-2,-4)", "C. (2,-4)", "D. (4,-2)"], + "correct_index": 1, + "knowledge_name": "奇函数", + "explanation": "由奇函数定义 f(-x)=-f(x) 可知,(2,4) 关于原点的对称点 (-2,-4) 一定在图像上。", + }, + { + "stem": "下列函数的图像关于 $y$ 轴对称的是?", + "options": ["A. $y=x+1$", "B. $y=x^3$", "C. $y=x^2+2$", "D. $y=x^2+x$"], + "correct_index": 2, + "knowledge_name": "偶函数", + "explanation": "$y=x^2+2$ 满足 $f(-x)=f(x)$,因此图像关于 $y$ 轴对称,属于偶函数。", + }, + { + "stem": "函数 y=1/(x²-9) 的图像不可能经过哪个点?", + "options": ["A. (0,-1/9)", "B. (4,1/7)", "C. (-4,1/7)", "D. (3,1)"], + "correct_index": 3, + "knowledge_name": "定义域", + "explanation": "分母 x²-9 不能为 0,x=±3 不在定义域内,所以图像不可能经过 (3,1)。", + }, + { + "stem": "若函数图像关于原点对称,则下列关系一定成立的是?", + "options": ["A. f(-x)=f(x)", "B. f(-x)=-f(x)", "C. f(x)=0", "D. f(x)>0"], + "correct_index": 1, + "knowledge_name": "奇函数", + "explanation": "图像关于原点对称对应奇函数,即对任意定义域内的 x 有 f(-x)=-f(x)。", + }, + { + "stem": "已知 $f(-x)=f(x)$,则函数图像的几何性质是?", + "options": ["A. 关于 x 轴对称", "B. 关于 y 轴对称", "C. 关于原点对称", "D. 无法判断"], + "correct_index": 1, + "knowledge_name": "偶函数", + "explanation": "f(-x)=f(x) 是偶函数的定义式,几何上等价于图像关于 y 轴对称。", + }, + { + "stem": "函数 y=2/(x²-1) 的图像不可能经过哪个点?", + "options": ["A. (0,-2)", "B. (2,2/3)", "C. (-2,2/3)", "D. (1,2)"], + "correct_index": 3, + "knowledge_name": "定义域", + "explanation": "分母 x²-1 不能为 0,x=±1 不在定义域内,所以图像不可能经过 (1,2)。", + }, + { + "stem": "若 f(-x)=-f(x),且图像经过 (5,-2),则一定经过?", + "options": ["A. (-5,-2)", "B. (-5,2)", "C. (5,2)", "D. (2,5)"], + "correct_index": 1, + "knowledge_name": "奇函数", + "explanation": "奇函数图像关于原点对称,(5,-2) 关于原点的对称点是 (-5,2)。", + }, + { + "stem": "若 f(-x)=f(x),且图像经过 (4,7),则下列点一定在图像上的是?", + "options": ["(-4,7)", "(-4,-7)", "(4,-7)", "(7,4)"], + "correct_index": 0, + "knowledge_name": "偶函数", + "explanation": "由偶函数定义得到关于 y 轴的镜像点。", + }, + { + "stem": "若 f(-x)=-f(x),且图像经过 (3,5),则下列点一定在图像上的是?", + "options": ["(-3,5)", "(-3,-5)", "(3,-5)", "(5,3)"], + "correct_index": 1, + "knowledge_name": "奇函数", + "explanation": "由奇函数定义得到关于原点的对称点。", + }, + { + "stem": "下列函数中属于偶函数的是?", + "options": ["$y=x^3$", "$y=x^2+1$", "$y=x+1$", "$y=x^3+x$"], + "correct_index": 1, + "knowledge_name": "偶函数", + "explanation": "代入 $-x$ 检验 $f(-x)=f(x)$。", + }, + { + "stem": "下列函数中属于奇函数的是?", + "options": ["y=x²", "y=x^3", "y=x²+1", "y=x^3+1"], + "correct_index": 1, + "knowledge_name": "奇函数", + "explanation": "代入 -x 检验 f(-x)=-f(x)。", + }, + { + "stem": "函数 y=1/(x-2) 的图像不可能经过哪个点?", + "options": ["(0,-1/2)", "(3,1)", "(2,0)", "(4,1/2)"], + "correct_index": 2, + "knowledge_name": "定义域", + "explanation": "分母不能为 0,因此 x=2 不属于定义域。", + }, + { + "stem": "若一个函数图像关于 y 轴对称,则该函数通常满足?", + "options": ["f(-x)=f(x)", "f(-x)=-f(x)", "f(x)=0", "f(x)>0"], + "correct_index": 0, + "knowledge_name": "图像对称性", + "explanation": "关于 y 轴对称对应偶函数。", + }, + { + "stem": "若一个函数图像关于原点对称,则该函数通常满足?", + "options": ["f(-x)=f(x)", "f(-x)=-f(x)", "f(x)=1", "f(x)>0"], + "correct_index": 1, + "knowledge_name": "图像对称性", + "explanation": "关于原点对称对应奇函数。", + }, + { + "stem": "若 f(x) 是偶函数,且 f(-5)=9,则 f(5)=?", + "options": ["-9", "0", "9", "无法确定"], + "correct_index": 2, + "knowledge_name": "偶函数", + "explanation": "偶函数的两个对称自变量对应相同函数值。", + }, + { + "stem": "若 f(x) 是奇函数,且 f(-6)=4,则 f(6)=?", + "options": ["4", "-4", "0", "无法确定"], + "correct_index": 1, + "knowledge_name": "奇函数", + "explanation": "奇函数的两个相反自变量对应相反函数值。", + }, + { + "stem": "判断函数 y=x⁴-x² 的奇偶性。", + "options": ["偶函数", "奇函数", "既奇又偶", "非奇非偶"], + "correct_index": 0, + "knowledge_name": "偶函数", + "explanation": "偶次幂组成,代入 -x 后表达式不变。", + }, +] +SAMPLE_ERRORS = [ + ("第1轮 · 1", "函数图像", "基础判断不稳定"), + ("第1轮 · 8", "定义域", "无定义点识别"), + ("第1轮 · 9", "偶函数", "核心概念混淆"), + ("第2轮 · 5", "偶函数", "点的对应关系错误"), + ("第2轮 · 7", "偶函数", "对称性判断错误"), + ("第2轮 · 8", "奇函数", "与偶函数混淆"), +] +SAMPLE_RECORDS = [ + ("第一轮基础题", 10, 7), + ("第二轮专项题", 8, 5), +] diff --git a/backend/seed/ebooks.py b/backend/seed/ebooks.py new file mode 100644 index 0000000..5563436 --- /dev/null +++ b/backend/seed/ebooks.py @@ -0,0 +1,88 @@ +"""电子书种子:把 res/ 下已有的三本书挂到教材上。 + +幂等:只补不覆盖,管理员在后台重新上传的文件不会被种子冲掉。 +""" +from __future__ import annotations + +from pathlib import Path + +from sqlalchemy.orm import Session + +from database import REPO_ROOT +from models import Textbook +from services import ebooks as store + +RES_ROOT = REPO_ROOT / "res" + +# res/ 里的文件名带书目后缀,展示时用干净的名称 +PRINCETON = { + "name": "普林斯顿微积分读本(修订版)", + "author": "阿德里安·班纳 (Adrian Banner)", + "publisher": "人民邮电出版社", + "grade": "高中至大学先修", + "description": "面向微积分入门的系统辅导书,覆盖极限、导数、积分与级数," + "按考点组织,适合自学与考前查漏补缺。", + "resource": "普林斯顿微积分读本(修订版)", + "display": "普林斯顿微积分读本(修订版).epub", +} + +# 已有教材 → res/ 中的 PDF(按教材名前缀匹配) +PDF_LINKS = [ + ("函数和图像", "函数和图像", "函数和图像(盖尔范德中学生数学思维丛书).pdf"), + ("三角函数", "三角函数", "三角函数(盖尔范德中学生数学思维丛书).pdf"), +] + + +def _find_resource(prefix: str, suffix: str) -> Path | None: + """res/ 下的文件名带作者与来源后缀,只按标题前缀匹配。""" + if not RES_ROOT.is_dir(): + return None + for path in sorted(RES_ROOT.iterdir()): + if ( + path.is_file() + and path.suffix.lower() == suffix + and path.name.startswith(prefix) + ): + return path + return None + + +def ensure_ebooks(db: Session) -> None: + created = False + textbook = ( + db.query(Textbook).filter(Textbook.name == PRINCETON["name"]).first() + ) + if textbook is None: + position = ( + db.query(Textbook).count() + ) + textbook = Textbook( + name=PRINCETON["name"], + author=PRINCETON["author"], + publisher=PRINCETON["publisher"], + grade=PRINCETON["grade"], + description=PRINCETON["description"], + position=position, + ) + db.add(textbook) + db.commit() + created = True + if created: + epub = _find_resource(PRINCETON["resource"], ".epub") + if epub is not None and not textbook.ebook_file: + store.attach_local_file( + db, textbook, epub, display_name=PRINCETON["display"] + ) + + for name_prefix, file_prefix, display in PDF_LINKS: + textbook = ( + db.query(Textbook) + .filter(Textbook.name.startswith(name_prefix)) + .first() + ) + if textbook is None or textbook.ebook_file: + continue + pdf = _find_resource(file_prefix, ".pdf") + if pdf is None: + continue + store.attach_local_file(db, textbook, pdf, display_name=display) diff --git a/backend/seed/knowledge_graph.py b/backend/seed/knowledge_graph.py new file mode 100644 index 0000000..8b5e61e --- /dev/null +++ b/backend/seed/knowledge_graph.py @@ -0,0 +1,512 @@ +"""初等 / 高等数学标准知识图谱(v1)。 + +知识图谱作为全局地基: +- 每个知识点是唯一 Knowledge 节点; +- 不同教材/章节通过 ChapterKnowledge 引用节点; +- 题目通过 QuestionKnowledge 引用节点; +- 用户掌握度 UserKnowledge 绑定 knowledge_id; +- 节点间关系(包含 / 前置 / 相关)存于 knowledge_relations, + 供后续图谱展示、推荐与路径规划使用。 +""" +from __future__ import annotations + +from sqlalchemy.orm import Session + +from models import Knowledge +from services.knowledge_service import ( + ensure_knowledge_relation, +) + + +LEGACY_KNOWLEDGE_MAP = { + "直角三角形": "三角比", + "同角关系": "同角三角函数关系", + "弧长与扇形": "弧度制", + "和角公式": "和角与差角公式", + "差角公式": "和角与差角公式", + "周期函数": "三角函数图像", + "斜率": "直线方程", + "一次函数图像": "一次函数", + "图像平移": "函数图像与变换", +} + +# 常用知识点的定义;仅在节点描述为空时写入,不覆盖管理员维护的内容。 +KNOWLEDGE_DEFINITIONS = { + "函数与图像": "以图像直观呈现自变量与函数值对应关系的分支:先“看见”图像,再回到公式与性质。", + "函数概念": "设 x 取数集 D 中的值,若按确定的对应法则,每个 x 都有唯一确定的 y 与之对应,则称 y 是 x 的函数,记作 y=f(x),x∈D。", + "函数值": "当自变量取定 x=a 时,按对应法则算出的 f(a) 就是函数在 a 处的函数值,它是图像上点 (a, f(a)) 的纵坐标。", + "定义域": "使函数表达式有意义的所有自变量取值组成的集合,常见限制有分母不为零、偶次根号下非负、对数的真数为正等。", + "值域": "自变量取遍定义域时,所有函数值组成的集合,即 {f(x) | x∈D}。", + "零点": "使 f(x)=0 的自变量 x 的值,几何上对应函数图像与 x 轴交点的横坐标。", + "正负性": "函数在区间上取正值或负值的性质,由 f(x)>0 与 f(x)<0 的解集刻画,对应图像位于 x 轴上方或下方。", + "单调性": "在区间 I 上,若 x₁f(x₂)),则称函数在 I 上单调递增(或递减)。", + "最值": "函数在给定区间上取得的最大值与最小值,可结合单调性、图像或配方等方法求得。", + "奇偶性": "若定义域关于原点对称,且对任意 x 有 f(-x)=f(x),则为偶函数;若恒有 f(-x)=-f(x),则为奇函数。", + "偶函数": "满足 f(-x)=f(x) 的函数,其图像关于 y 轴对称。", + "奇函数": "满足 f(-x)=-f(x) 的函数,其图像关于原点中心对称;若 0 在定义域内,则 f(0)=0。", + "图像对称性": "函数图像的轴对称与中心对称性质,与奇偶性、平移伸缩等变换密切相关。", + "一次函数": "形如 y=kx+b(k≠0)的函数,图像是一条直线,k 为斜率、b 为纵截距;k>0 时单调递增。", + "二次函数": "形如 y=ax²+bx+c(a≠0)的函数,图像是抛物线,可通过配方求顶点、对称轴与最值。", + "抛物线": "二次函数图像的几何形状,具有对称轴与顶点,开口方向由二次项系数的正负决定。", + "幂函数": "形如 y=x^α 的函数,其定义域、图像与单调性随指数 α 的不同而明显变化。", + "函数图像与变换": "由基本函数的图像出发,经平移(左加右减、上加下减)、伸缩与对称得到新图像的方法。", + "直线方程": "用方程表示直线的形式,如斜截式 y=kx+b、点斜式 y-y₀=k(x-x₀);两直线平行则斜率相等。", + "三角函数": "以角为自变量、以三角比为函数值的函数,包括正弦、余弦、正切等,具有周期性与有界性。", + "任意角": "由射线绕顶点旋转生成的角,按旋转方向分为正角、负角与零角,并用终边位置统一刻画。", + "弧度制": "用弧长与半径之比度量角的大小,π 弧度 = 180°,使弧长与扇形面积公式的形式更简洁。", + "三角比": "直角三角形中边与边的比值(正弦、余弦、正切),并可借助单位圆推广到任意角。", + "同角三角函数关系": "同一个角的正弦、余弦、正切之间的基本关系,如 sin²α+cos²α=1、tanα=sinα/cosα。", + "和角与差角公式": "描述两角和或差的三角函数公式,如 sin(α±β)=sinαcosβ±cosαsinβ,是推导倍角公式的基础。", + "三角恒等式": "对定义域内任意角都成立的三角关系式,包括平方关系、和差角、倍角与半角公式等。", + "三角函数图像": "正弦、余弦、正切函数的图像及其周期、振幅、相位与图像变换规律。", + "反三角函数": "三角函数在限定单调区间上的反函数,如反正弦 arcsin、反余弦 arccos、反正切 arctan。", + "三角方程": "含有未知角的三角函数的方程,通常先化为基本三角方程,再结合周期性写出通解。", + "正弦定理": "在 △ABC 中 a/sinA = b/sinB = c/sinC = 2R(R 为外接圆半径),用于已知边角组合解三角形。", + "余弦定理": "在 △ABC 中 a²=b²+c²-2bc·cosA,用于已知两边及夹角或三边求解三角形。", + "解三角形": "利用正弦定理、余弦定理与内角和关系,由已知元素求三角形其余边角的过程。", +} + + +GRAPH = [ + { + "name": "初等数学", + "domain": "初等", + "description": "中学与竞赛基础的数学知识总图", + "children": [ + { + "name": "数与式", + "children": [ + "自然数与整数", + "有理数", + "实数", + "数的整除", + "代数式", + "因式分解", + "根式与无理式", + "幂与指数", + ], + }, + { + "name": "方程与不等式", + "children": [ + "一元一次方程", + "一元二次方程", + "二元一次方程组", + "分式方程", + "一元一次不等式", + "一元二次不等式", + "不等式的性质与证明", + ], + }, + { + "name": "函数与图像", + "children": [ + "函数概念", + "函数值", + "定义域", + "值域", + "零点", + "正负性", + "单调性", + "最值", + "奇偶性", + "偶函数", + "奇函数", + "图像对称性", + "一次函数", + "二次函数", + "幂函数", + "指数函数", + "对数函数", + "函数图像与变换", + ], + }, + { + "name": "三角函数", + "children": [ + "任意角", + "弧度制", + "三角比", + "同角三角函数关系", + "诱导公式", + "和角与差角公式", + "倍角公式", + "三角恒等式", + "三角函数图像", + "反三角函数", + "三角方程", + "正弦定理", + "余弦定理", + "解三角形", + ], + }, + { + "name": "平面几何", + "children": [ + "点线面的基本关系", + "平行与垂直", + "三角形", + "全等", + "相似", + "四边形", + "圆", + "面积与周长", + "几何变换", + ], + }, + { + "name": "坐标与解析几何", + "children": [ + "数轴", + "平面直角坐标系", + "两点间距离", + "直线方程", + "圆的标准方程", + "椭圆", + "双曲线", + "抛物线", + "曲线与方程", + ], + }, + { + "name": "数列与证明", + "children": [ + "等差数列", + "等比数列", + "数列通项与求和", + "递推数列", + "数学归纳法", + "逻辑与证明方法", + ], + }, + { + "name": "概率统计", + "children": [ + "计数原理", + "排列组合", + "古典概型", + "条件概率", + "随机变量", + "统计图表", + "均值与方差", + ], + }, + ], + }, + { + "name": "高等数学", + "domain": "高等", + "description": "大学基础数学知识总图", + "children": [ + { + "name": "分析与微积分", + "children": [ + "集合与映射", + "极限与连续", + "导数与微分", + "微分中值定理", + "一元函数积分", + "无穷级数", + "多元函数微分", + "重积分与曲线曲面积分", + "微分方程", + ], + }, + { + "name": "线性代数", + "children": [ + "行列式", + "矩阵", + "线性方程组", + "向量空间", + "特征值与特征向量", + "二次型", + ], + }, + { + "name": "概率论与数理统计", + "children": [ + "概率空间", + "随机变量及其分布", + "数字特征", + "大数定律与中心极限定理", + "参数估计", + "假设检验", + "回归分析", + ], + }, + { + "name": "离散与优化", + "children": [ + "图论基础", + "组合优化", + "最优化方法", + ], + }, + ], + }, +] + + +PREREQUISITES: list[tuple[str, str]] = [ + ("自然数与整数", "有理数"), + ("有理数", "实数"), + ("自然数与整数", "数的整除"), + ("实数", "代数式"), + ("代数式", "因式分解"), + ("一元一次方程", "一元二次方程"), + ("一元二次方程", "二次函数"), + ("幂与指数", "指数函数"), + ("幂与指数", "幂函数"), + ("函数概念", "定义域"), + ("函数概念", "函数值"), + ("函数概念", "偶函数"), + ("函数概念", "奇函数"), + ("偶函数", "奇函数"), + ("定义域", "零点"), + ("一次函数", "二次函数"), + ("二次函数", "函数图像与变换"), + ("三角比", "任意角"), + ("任意角", "弧度制"), + ("弧度制", "三角函数图像"), + ("和角与差角公式", "倍角公式"), + ("倍角公式", "三角恒等式"), + ("函数与图像", "三角函数"), + ("平面直角坐标系", "直线方程"), + ("直线方程", "圆的标准方程"), + ("圆的标准方程", "抛物线"), + ("极限与连续", "导数与微分"), + ("导数与微分", "微分中值定理"), + ("导数与微分", "一元函数积分"), + ("一元函数积分", "多元函数微分"), + ("矩阵", "行列式"), + ("矩阵", "线性方程组"), + ("线性方程组", "特征值与特征向量"), + ("随机变量及其分布", "数字特征"), + ("概率空间", "随机变量及其分布"), +] + + +def _create( + db: Session, + name: str, + domain: str, + category: str = "", + description: str = "", +) -> Knowledge: + row = db.query(Knowledge).filter(Knowledge.name == name).first() + if row is None: + row = Knowledge( + name=name, + domain=domain, + category=category, + description=description, + ) + db.add(row) + db.flush() + else: + if row.domain != domain: + row.domain = domain + if category and not row.category: + row.category = category + if description and not row.description: + row.description = description + return row + + +def _insert_tree(db: Session, node: dict, parent: Knowledge | None = None) -> None: + if isinstance(node, str): + current = _create( + db, + str(node), + parent.domain if parent else "初等", + parent.category if parent else "", + ) + if parent is not None: + ensure_knowledge_relation(db, parent, current, "包含") + return + name = node["name"] + if parent is None: + category = "总纲" + elif parent.name in {"初等数学", "高等数学"}: + category = name + else: + category = node.get("category") or (parent.category or "") + current = _create( + db, + name, + node.get("domain") or (parent.domain if parent else "初等"), + category, + node.get("description", ""), + ) + if parent is not None: + ensure_knowledge_relation(db, parent, current, "包含") + for child in node.get("children", []): + _insert_tree(db, child, current) + + +def ensure_knowledge_graph(db: Session) -> None: + if db.query(Knowledge).count() == 0: + for node in GRAPH: + _insert_tree(db, node) + else: + _repair_existing_categories(db) + _cleanup_legacy_knowledge(db) + for name, text in KNOWLEDGE_DEFINITIONS.items(): + row = db.query(Knowledge).filter(Knowledge.name == name).first() + if row is not None and not (row.description or "").strip(): + row.description = text + for source_name, target_name in PREREQUISITES: + source = db.query(Knowledge).filter(Knowledge.name == source_name).first() + target = db.query(Knowledge).filter(Knowledge.name == target_name).first() + if source is None or target is None: + continue + ensure_knowledge_relation(db, source, target, "前置") + db.commit() + + +def _cleanup_legacy_knowledge(db: Session) -> None: + """把早期自由生成的节点合并到标准图谱,并重挂章节/题目/用户掌握度。""" + from models import ( + ChapterKnowledge, + KnowledgeRelation, + QuestionKnowledge, + UserKnowledge, + ) + + for legacy_name, canonical_name in LEGACY_KNOWLEDGE_MAP.items(): + legacy = db.query(Knowledge).filter(Knowledge.name == legacy_name).first() + if legacy is None: + continue + canonical = db.query(Knowledge).filter(Knowledge.name == canonical_name).first() + if canonical is None: + canonical = Knowledge( + name=canonical_name, + domain=legacy.domain, + category=legacy.category or "三角函数", + ) + db.add(canonical) + db.flush() + + old_chapter_links = ( + db.query(ChapterKnowledge) + .filter(ChapterKnowledge.knowledge_id == legacy.id) + .all() + ) + old_question_links = ( + db.query(QuestionKnowledge) + .filter(QuestionKnowledge.knowledge_id == legacy.id) + .all() + ) + old_user_links = ( + db.query(UserKnowledge) + .filter(UserKnowledge.knowledge_id == legacy.id) + .all() + ) + db.query(ChapterKnowledge).filter( + ChapterKnowledge.knowledge_id == legacy.id + ).delete(synchronize_session=False) + db.query(QuestionKnowledge).filter( + QuestionKnowledge.knowledge_id == legacy.id + ).delete(synchronize_session=False) + db.query(UserKnowledge).filter( + UserKnowledge.knowledge_id == legacy.id + ).delete(synchronize_session=False) + + for link in old_chapter_links: + exists = ( + db.query(ChapterKnowledge) + .filter( + ChapterKnowledge.chapter_id == link.chapter_id, + ChapterKnowledge.knowledge_id == canonical.id, + ) + .first() + ) + if exists is None: + db.add( + ChapterKnowledge( + chapter_id=link.chapter_id, + knowledge_id=canonical.id, + ) + ) + for link in old_question_links: + exists = ( + db.query(QuestionKnowledge) + .filter( + QuestionKnowledge.question_id == link.question_id, + QuestionKnowledge.knowledge_id == canonical.id, + ) + .first() + ) + if exists is None: + db.add( + QuestionKnowledge( + question_id=link.question_id, + knowledge_id=canonical.id, + ) + ) + for link in old_user_links: + exists = ( + db.query(UserKnowledge) + .filter( + UserKnowledge.user_id == link.user_id, + UserKnowledge.knowledge_id == canonical.id, + ) + .first() + ) + if exists is None: + db.add( + UserKnowledge( + user_id=link.user_id, + knowledge_id=canonical.id, + mastery=link.mastery, + position=link.position, + ) + ) + db.query(KnowledgeRelation).filter( + (KnowledgeRelation.source_id == legacy.id) + | (KnowledgeRelation.target_id == legacy.id) + ).delete(synchronize_session=False) + db.delete(legacy) + db.flush() + + +def _repair_existing_categories(db: Session) -> None: + """存量库按种子树回填 domain/category(不删除已有节点)。""" + + def visit(node: dict, parent: Knowledge | None = None) -> None: + if isinstance(node, str): + row = db.query(Knowledge).filter(Knowledge.name == node).first() + if row is not None: + row.domain = parent.domain if parent else row.domain + if parent and parent.category: + row.category = parent.category + return + domain = node.get("domain") or (parent.domain if parent else "初等") + if parent is None: + category = "总纲" + elif parent.name in {"初等数学", "高等数学"}: + category = node["name"] + else: + category = parent.category or "" + row = db.query(Knowledge).filter(Knowledge.name == node["name"]).first() + if row is None: + row = Knowledge( + name=node["name"], + domain=domain, + category=category, + description=node.get("description", ""), + ) + db.add(row) + db.flush() + else: + row.domain = domain + row.category = category + if node.get("description") and not row.description: + row.description = node["description"] + for child in node.get("children", []): + visit(child, row) + + for top in GRAPH: + visit(top) + db.commit() diff --git a/backend/seed/rbac.py b/backend/seed/rbac.py new file mode 100644 index 0000000..fd6650f --- /dev/null +++ b/backend/seed/rbac.py @@ -0,0 +1,111 @@ +"""RBAC 种子:权限、角色与默认账号。""" +from __future__ import annotations + +from sqlalchemy.orm import Session + +from models import Permission, Role, RolePermission, User, UserRole +from services.security import hash_password + + +PERMISSIONS = [ + ("learning:use", "使用学习功能", "learning"), + ("users:manage", "用户管理", "admin"), + ("catalog:manage", "教材/课程管理", "admin"), + ("question-bank:manage", "题库管理", "admin"), + ("llm:manage", "模型配置管理", "admin"), + ("knowledge:manage", "知识图谱管理", "admin"), +] + +ROLES = { + "admin": { + "name": "管理员", + "description": "拥有用户、模型、教材课程与题库的全部管理权限", + # 管理员是纯管理账号,不参与学习,因此不授予 learning:use + "permissions": [ + code for code, _, _ in PERMISSIONS if code != "learning:use" + ], + }, + "student": { + "name": "普通用户", + "description": "使用学习总览、练习、错题、分析等学习功能", + "permissions": ["learning:use"], + }, +} + +DEFAULT_USERS = [ + ("admin", "admin123", "系统管理员", "admin"), + ("student", "student123", "演示学生", "student"), +] + + +def _permission_map(db: Session) -> dict[str, Permission]: + rows = {row.code: row for row in db.query(Permission).all()} + for code, name, group in PERMISSIONS: + if code not in rows: + row = Permission(code=code, name=name, group=group) + db.add(row) + db.flush() + rows[code] = row + return rows + + +def ensure_rbac(db: Session) -> None: + """幂等创建权限、角色与默认账号,并同步旧库中已过期的角色权限。""" + permissions = _permission_map(db) + roles = {row.code: row for row in db.query(Role).all()} + for code, meta in ROLES.items(): + if code not in roles: + role = Role(code=code, name=meta["name"], description=meta["description"]) + db.add(role) + db.flush() + roles[code] = role + expected = set(meta["permissions"]) + existing_rows = ( + db.query(RolePermission, Permission.code) + .join(Permission, Permission.id == RolePermission.permission_id) + .filter(RolePermission.role_id == roles[code].id) + .all() + ) + for role_permission, permission_code in existing_rows: + if permission_code not in expected: + db.delete(role_permission) + for permission_code in meta["permissions"]: + exists = ( + db.query(RolePermission) + .filter( + RolePermission.role_id == roles[code].id, + RolePermission.permission_id == permissions[permission_code].id, + ) + .first() + ) + if exists is None: + db.add( + RolePermission( + role_id=roles[code].id, + permission_id=permissions[permission_code].id, + ) + ) + db.flush() + + for username, password, display_name, role_code in DEFAULT_USERS: + user = db.query(User).filter(User.username == username).first() + if user is None: + user = User( + username=username, + password_hash=hash_password(password), + display_name=display_name, + active=True, + ) + db.add(user) + db.flush() + assignment = ( + db.query(UserRole) + .filter( + UserRole.user_id == user.id, + UserRole.role_id == roles[role_code].id, + ) + .first() + ) + if assignment is None: + db.add(UserRole(user_id=user.id, role_id=roles[role_code].id)) + db.commit() diff --git a/backend/services/__init__.py b/backend/services/__init__.py new file mode 100644 index 0000000..19fcc11 --- /dev/null +++ b/backend/services/__init__.py @@ -0,0 +1 @@ +"""业务逻辑服务。""" diff --git a/backend/services/ai_teacher.py b/backend/services/ai_teacher.py new file mode 100644 index 0000000..993eba8 --- /dev/null +++ b/backend/services/ai_teacher.py @@ -0,0 +1,30 @@ +"""AI 教师:基于题目讲解与知识点状态生成即时反馈。 + +当前为本地规则式实现,不依赖外部模型:能够给出“为什么对/为什么错”的 +讲解与后续建议;若配置了 OPENAI_API_KEY,可在此基础上扩展为真实模型调用。 +""" +from __future__ import annotations + +from models import Question, UserKnowledge +from services.mastery_engine import action_for + + +def explain( + question: Question, + selected: int, + correct: bool, + knowledge: UserKnowledge | None, +) -> str: + head = "回答正确。" if correct else "回答错误。" + base = question.explanation or "结合定义与图像性质重新判断。" + + mastery_hint = "" + if knowledge is not None: + mastery_hint = ( + f" 该知识点当前掌握度为 {knowledge.mastery}%," + f"建议{action_for(knowledge.mastery)}。" + ) + + if correct: + return f"{head} 考点「{question.knowledge_name}」:{base}{mastery_hint}" + return f"{head} 你选择了选项 {chr(65 + selected)}。正确思路:{base}{mastery_hint}" diff --git a/backend/services/catalog_generator.py b/backend/services/catalog_generator.py new file mode 100644 index 0000000..636b13d --- /dev/null +++ b/backend/services/catalog_generator.py @@ -0,0 +1,269 @@ +"""通过大模型按教材/课程生成章节目录。""" +from __future__ import annotations + +from models import LlmSetting, Textbook +from services import llm_client + + +SYSTEM_PROMPT = ( + "你是一位资深数学教材编审与课程设计专家,熟悉盖尔范德" + "《函数和图像》《代数》《三角函数》等中学生数学思维丛书。" +) + + +def build_chapters_prompt( + *, + textbook: Textbook, + count: int, + existing_names: list[str], + instructions: str, + fixed_titles: list[str] | None = None, + external_context: dict | None = None, + graph_context: list[str] | None = None, +) -> str: + extra = f"\n额外要求:{instructions}" if instructions else "" + existing = "、".join(existing_names) if existing_names else "(暂无章节)" + isbn = textbook.isbn or "" + external = external_context or {} + external_title = external.get("title") or "" + external_description = external.get("description") or "" + lookup_status = ( + "ISBN 公开目录未收录,请结合书名 + ISBN + 作者/出版社" + "确认正式出版物后作答" + if (isbn and not external) + else "已通过 ISBN 查询到公开书目信息" + ) + knowledge_hint = ( + "、".join(graph_context) if graph_context else "(按该书内容从知识图谱选择)" + ) + graph_line = f"\n知识图谱可用节点:{knowledge_hint}" + + if fixed_titles: + numbered = "\n".join( + f"{index}. {title}" for index, title in enumerate(fixed_titles, start=1) + ) + lookup_note = "已根据 ISBN 查询到该书正式目录" + if external_title: + lookup_note += f"({external_title})" + knowledge_hint = ( + "、".join(graph_context) if graph_context else "(按该书内容选择)" + ) + return f"""通过 ISBN 查询到《{textbook.name}》的正式章节目录。 +{lookup_note}。请为下列章节编写符合数学教材风格的内容摘要。 + +正式目录章节: +{numbered} +系统知识图谱可用节点:{knowledge_hint} + +要求: +1. 章节名称必须与上面给定名称完全一致,不得改名、不得新增或删减; +2. 每章 summary 用 1-2 句中文说明该章核心主题、知识能力与学习任务; +3. 每章从系统知识图谱可用节点中按语义选择 1-5 个作为 knowledge_names; +4. 不要输出多余文字,只输出 JSON: +{{"chapters":[{{"name":"给定章节名","summary":"摘要","knowledge_names":["节点名"]}}]}}""" + + return f"""请像检索真实书目一样,根据以下信息还原《{textbook.name}》中文正式版的完整章节目录。 + +书目信息: +- 书名:{textbook.name} +- ISBN:{isbn or "(未填写)"} +- 作者/翻译/出版:{textbook.author} {textbook.publisher} +- 版本/学段:{textbook.edition} {textbook.grade} +- 简介:{textbook.description or "请结合标题判断"} +- 本书目前已存在章节:{existing or "(暂无)"} +{f"- 外部书目补充:{external_description}" if external_description else ""} +{graph_line} + +要求: +1. 只做“目录还原”,不要编撰新章节,不要套用通用课程大纲; +2. 请检索/回忆该 ISBN 对应版本的中文正式目录,原样输出目录条目 + (引言、第 X 章、附录/习题解答等都要保留原名,例如“第 8 章 独立求解的问题”); +3. 输出全部正式目录;若确有把握有限,也可只输出能确认的部分,不要补造; +4. 为每个目录条目写 1 句 summary(前言/解答等可写其用途); +5. 每个教学章节从“知识图谱可用节点”中选择 1-5 个作为 knowledge_names; + 前言、习题解答等非教学条目 knowledge_names 输出空数组; +6. 不要输出多余文字,只输出 JSON: +{{"chapters":[{{"name":"目录原样条目","summary":"摘要","knowledge_names":["节点名"]}}]}} +""" + + +def _extract_json(content: str) -> dict: + from services.json_utils import extract_json_lax + + return extract_json_lax(content) + + +def generate_chapters( + *, + setting: LlmSetting, + textbook: Textbook, + count: int, + existing_names: list[str], + instructions: str, + fixed_titles: list[str] | None = None, + external_context: dict | None = None, + graph_context: list[str] | None = None, +) -> list[dict]: + use_titles = fixed_titles or [] + if use_titles: + count = len(use_titles) + prompt = build_chapters_prompt( + textbook=textbook, + count=count, + existing_names=existing_names, + instructions=instructions, + fixed_titles=use_titles or None, + external_context=external_context, + graph_context=graph_context, + ) + payload = {} + last_error = "" + for attempt in range(3): + try: + content = llm_client.chat_completion( + base_url=setting.base_url, + api_key=setting.api_key, + model=setting.model, + temperature=0.3, + max_tokens=setting.max_tokens or 5000, + timeout=200.0, + messages=[ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": prompt}, + ], + ) + except ValueError as exc: + last_error = str(exc) + continue + try: + payload = _extract_json(content) + break + except ValueError as exc: + last_error = str(exc) + else: + raise ValueError( + f"模型连续 3 次未返回合法 JSON,最后一次:{last_error}" + ) + raw_chapters = payload.get("chapters") + if not isinstance(raw_chapters, list) or not raw_chapters: + raise ValueError("模型返回内容中没有 chapters 列表") + + result: list[dict] = [] + fixed_set = set(use_titles) + for raw in raw_chapters[:count]: + if not isinstance(raw, dict): + raise ValueError("模型返回的章节格式不正确") + name = str(raw.get("name", "")).strip() + summary = str(raw.get("summary", "")).strip() + if not name: + raise ValueError("模型返回的章节名称为空") + if fixed_set and name not in fixed_set: + raise ValueError( + f"模型返回的章节“{name}”不在 ISBN 查询到的正式目录中,请重试" + ) + raw_knowledge = raw.get("knowledge_names") or [] + if not isinstance(raw_knowledge, list): + raw_knowledge = [] + result.append( + { + "name": name[:128], + "summary": summary[:1000], + "knowledge_names": [ + str(tag).strip()[:64] for tag in raw_knowledge + ], + } + ) + return result + + +def organize_reference_chapters( + *, + setting: LlmSetting, + textbook: Textbook, + reference_text: str, + existing_names: list[str], + graph_context: list[str], +) -> list[dict]: + """根据用户粘贴的目录素材整理出章节,并为每个章节从知识图谱选节点。""" + prompt = f"""你是一名教材目录整理助手。下面是从用户或其他 AI 处得到的 +《{textbook.name}》目录原始资料,请整理成结构化章节列表。 + +教材信息: +- ISBN:{textbook.isbn or "未填写"} +- 作者/出版:{textbook.author} {textbook.publisher} +- 已存在章节:{"、".join(existing_names) if existing_names else "(暂无)"} + +知识图谱可用节点(只能从这里选 knowledge_names): +{"、".join(graph_context) if graph_context else "(暂无)"} + +用户提供的目录素材: +========================== +{reference_text} +========================== + +要求: +1. 只整理素材中真实出现的章节目录,不得新增、不得凭印象补造; +2. 保留正式名称(含“第 X 章”、引言、前言、习题解答等),去除多余格式符号; +3. 无法判断为目录项的文字不要输出; +4. 每章 summary 用 1 句中文说明; +5. 教学章节从“知识图谱可用节点”中按语义选择 1-5 个 knowledge_names, + 非教学条目为空数组;不得自造图谱节点; +6. 只输出 JSON:{{"chapters":[{{"name":"目录项","summary":"摘要","knowledge_names":["节点"]}}]}} +""" + payload = {} + last_error = "" + for attempt in range(3): + try: + content = llm_client.chat_completion( + base_url=setting.base_url, + api_key=setting.api_key, + model=setting.model, + temperature=0.1, + max_tokens=setting.max_tokens or 5000, + timeout=200.0, + messages=[ + { + "role": "system", + "content": ( + "你只负责整理用户提供的真实目录素材,不编造内容。" + "JSON 必须完整闭合。" + ), + }, + {"role": "user", "content": prompt}, + ], + ) + except ValueError as exc: + last_error = str(exc) + continue + try: + payload = _extract_json(content) + break + except ValueError as exc: + last_error = str(exc) + else: + raise ValueError( + f"模型连续 3 次未返回合法 JSON,最后一次:{last_error}" + ) + raw_chapters = payload.get("chapters") + if not isinstance(raw_chapters, list) or not raw_chapters: + raise ValueError("整理结果中没有 chapters 列表") + result: list[dict] = [] + for raw in raw_chapters: + if not isinstance(raw, dict): + continue + name = str(raw.get("name", "")).strip() + if not name: + continue + raw_knowledge = raw.get("knowledge_names") or [] + if not isinstance(raw_knowledge, list): + raw_knowledge = [] + result.append( + { + "name": name[:128], + "summary": str(raw.get("summary", "")).strip()[:1000], + "knowledge_names": [ + str(tag).strip()[:64] for tag in raw_knowledge + ], + } + ) + return result diff --git a/backend/services/ebooks.py b/backend/services/ebooks.py new file mode 100644 index 0000000..76275fb --- /dev/null +++ b/backend/services/ebooks.py @@ -0,0 +1,242 @@ +"""电子书存储:文件放 data/ebooks/{textbook_id}/ 下,数据库只存文件名与元信息。 + +上传按分块写临时文件(不整体进内存),先校验扩展名与文件头魔数, +再原子改名,避免半截文件污染在线阅读。 +""" +from __future__ import annotations + +import os +import re +import shutil +import uuid +import zipfile +from datetime import datetime +from pathlib import Path +from xml.etree import ElementTree + +from fastapi import HTTPException, UploadFile +from sqlalchemy.orm import Session + +from pypdf import PdfReader + +from database import REPO_ROOT +from models import EbookProgress, Textbook + + +EBOOK_ROOT = REPO_ROOT / "data" / "ebooks" +MAX_EBOOK_BYTES = 500 * 1024 * 1024 # 500MB +_CHUNK = 1024 * 1024 + +# 扩展名 -> (格式标识, 魔数, MIME) +KINDS: dict[str, tuple[str, bytes]] = { + ".pdf": ("pdf", b"%PDF-"), + ".epub": ("epub", b"PK\x03\x04"), +} +MIME_BY_FORMAT = {"pdf": "application/pdf", "epub": "application/epub+zip"} + + +def book_dir(textbook_id: int) -> Path: + return EBOOK_ROOT / str(textbook_id) + + +def resolve_path(textbook_id: int, filename: str) -> Path: + """只允许该书目录下的裸文件名,杜绝 ../ 穿越。""" + safe = os.path.basename(filename) + if not safe or safe.startswith("."): + raise HTTPException(status_code=404, detail="电子书文件不存在") + path = (book_dir(textbook_id) / safe).resolve() + root = book_dir(textbook_id).resolve() + if path.parent != root or not path.is_file(): + raise HTTPException(status_code=404, detail="电子书文件不存在") + return path + + +def media_type(fmt: str) -> str: + return MIME_BY_FORMAT.get(fmt, "application/octet-stream") + + +def file_kind(filename: str) -> tuple[str, str]: + """按扩展名给出 (格式, 魔数);不支持的扩展名直接拒绝。""" + ext = Path(filename or "").suffix.lower() + kind = KINDS.get(ext) + if kind is None: + raise HTTPException(status_code=400, detail="只支持 PDF 与 EPUB 两种格式") + return kind[0], kind[1] + + +def _safe_name(filename: str) -> str: + """原始文件名只用于展示:去掉路径与可能破坏排版的控制字符。""" + name = os.path.basename(filename or "").strip() + name = re.sub(r"[\r\n\t]+", " ", name) + return name[:180] + + +async def store_upload(db: Session, textbook: Textbook, upload: UploadFile) -> Textbook: + fmt, magic = file_kind(upload.filename or "") + target_dir = book_dir(textbook.id) + target_dir.mkdir(parents=True, exist_ok=True) + temp = target_dir / f".upload-{uuid.uuid4().hex}.part" + size = 0 + try: + with temp.open("wb") as handle: + while True: + chunk = await upload.read(_CHUNK) + if not chunk: + break + if size == 0 and not chunk.startswith(magic): + raise HTTPException( + status_code=400, detail="文件内容与扩展名不符,请上传真实的 PDF / EPUB 文件" + ) + size += len(chunk) + if size > MAX_EBOOK_BYTES: + raise HTTPException(status_code=400, detail="电子书超过 500MB 上限") + handle.write(chunk) + if size == 0: + raise HTTPException(status_code=400, detail="上传的文件是空的") + final = target_dir / f"{uuid.uuid4().hex}.{fmt}" + os.replace(temp, final) + finally: + if temp.exists(): + temp.unlink(missing_ok=True) + await upload.close() + + # 覆盖式上传:旧文件随后清理,磁盘上不留重复副本 + if textbook.ebook_file: + try: + resolve_path(textbook.id, textbook.ebook_file).unlink(missing_ok=True) + except HTTPException: + pass + + textbook.ebook_file = final.name + textbook.ebook_format = fmt + textbook.ebook_name = _safe_name(upload.filename or final.name) + textbook.ebook_size = size + textbook.ebook_pages = count_pages(final, fmt) + textbook.ebook_uploaded_at = datetime.utcnow() + db.commit() + return textbook + + +def clear_ebook(db: Session, textbook: Textbook) -> Textbook: + if textbook.ebook_file: + try: + resolve_path(textbook.id, textbook.ebook_file).unlink(missing_ok=True) + except HTTPException: + pass + textbook.ebook_file = "" + textbook.ebook_name = "" + textbook.ebook_format = "" + textbook.ebook_size = 0 + textbook.ebook_pages = 0 + textbook.ebook_uploaded_at = None + db.commit() + return textbook + + +def attach_local_file( + db: Session, + textbook: Textbook, + source: Path, + display_name: str = "", +) -> Textbook: + """给种子脚本用:把仓库里的电子书复制进 data/ebooks/{id}/ 并登记。""" + fmt, magic = file_kind(source.name) + if not source.is_file(): + raise FileNotFoundError(str(source)) + target_dir = book_dir(textbook.id) + target_dir.mkdir(parents=True, exist_ok=True) + final = target_dir / f"{uuid.uuid4().hex}.{fmt}" + with source.open("rb") as reader, final.open("wb") as writer: + head = reader.read(len(magic)) + if not head.startswith(magic): + final.unlink(missing_ok=True) + raise ValueError(f"{source.name} 不是有效的 {fmt.upper()} 文件") + writer.write(head) + shutil.copyfileobj(reader, writer, _CHUNK) + if textbook.ebook_file: + try: + resolve_path(textbook.id, textbook.ebook_file).unlink(missing_ok=True) + except HTTPException: + pass + textbook.ebook_file = final.name + textbook.ebook_format = fmt + textbook.ebook_name = _safe_name(display_name or source.name) + textbook.ebook_size = final.stat().st_size + textbook.ebook_pages = count_pages(final, fmt) + textbook.ebook_uploaded_at = datetime.utcnow() + db.commit() + return textbook + + +def _pdf_pages(path: Path) -> int: + return len(PdfReader(path).pages) + + +def _epub_pages(path: Path) -> int: + """EPUB 没有“页”,用正文文档数(spine 条目)作为篇幅。""" + with zipfile.ZipFile(path) as archive: + container = ElementTree.fromstring(archive.read("META-INF/container.xml")) + opf = next( + ( + node.get("full-path") + for node in container.iter() + if node.tag.endswith("rootfile") + ), + "", + ) + if not opf: + return 0 + package = ElementTree.fromstring(archive.read(opf)) + spine = next((node for node in package if node.tag.endswith("spine")), None) + if spine is None: + return 0 + return len( + [ + item + for item in spine + if item.tag.endswith("itemref") and item.get("idref") + ] + ) + + +def count_pages(path: Path, fmt: str) -> int: + """解析篇幅;文件损坏时返回 0,交给阅读器再回填,不阻断上传。""" + try: + return _pdf_pages(path) if fmt == "pdf" else _epub_pages(path) + except Exception: # noqa: BLE001 - 解析器版本/畸形文件都按“未知篇幅”处理 + return 0 + + +def backfill_pages(db: Session) -> None: + """给存量数据补篇幅:上传时没解析过(或当时解析失败)的书。""" + rows = ( + db.query(Textbook) + .filter(Textbook.ebook_file != "", Textbook.ebook_pages == 0) + .all() + ) + changed = False + for textbook in rows: + try: + path = resolve_path(textbook.id, textbook.ebook_file) + except HTTPException: + continue + pages = count_pages(path, textbook.ebook_format) + if pages and textbook.ebook_pages != pages: + textbook.ebook_pages = pages + changed = True + if textbook.ebook_uploaded_at is None: + textbook.ebook_uploaded_at = datetime.utcfromtimestamp( + path.stat().st_mtime + ) + changed = True + if changed: + db.commit() + + + +def drop_book_files(textbook_id: int) -> None: + shutil.rmtree(book_dir(textbook_id), ignore_errors=True) + + +def drop_progress(db: Session, textbook_id: int) -> None: + db.query(EbookProgress).filter(EbookProgress.textbook_id == textbook_id).delete() diff --git a/backend/services/isbn_lookup.py b/backend/services/isbn_lookup.py new file mode 100644 index 0000000..16516a6 --- /dev/null +++ b/backend/services/isbn_lookup.py @@ -0,0 +1,79 @@ +"""通过 ISBN 查询公开书目信息与章节目录。 + +优先 Open Library,其次 Google Books。网络不可用或 ISBN 无收录时返回空结果, +调用方继续使用书名 + ISBN 让大模型依据正式出版物内容生成。 +""" +from __future__ import annotations + +import re + +import httpx + + +def _normalize_isbn(isbn: str) -> str: + return re.sub(r"[^0-9Xx]", "", isbn).upper() + + +def _clean_toc_item(item: dict) -> str | None: + title = str(item.get("title", "")).strip() + label = str(item.get("label", "")).strip() + if not title and not label: + return None + title = title or label + # 去掉 Open Library 常见的前置编号/页眉,避免把“引言”“1”当标题 + title = re.sub(r"^\s*(?:page\s*)?\d+\s*[:.]?\s*", "", title, flags=re.I) + return title.strip() or None + + +def fetch_isbn_context(isbn: str) -> dict: + """返回 {source, title, description, chapter_titles}。""" + normalized = _normalize_isbn(isbn) + if not normalized: + return {"source": "", "title": "", "description": "", "chapter_titles": []} + + # 1) Open Library 按 ISBN 查书目 + try: + with httpx.Client(timeout=6.0, follow_redirects=True) as client: + response = client.get( + f"https://openlibrary.org/isbn/{normalized}.json" + ) + if response.status_code == 200: + payload = response.json() + titles: list[str] = [] + for item in payload.get("table_of_contents") or []: + if not isinstance(item, dict): + continue + title = _clean_toc_item(item) + if title and title not in titles: + titles.append(title) + return { + "source": "openlibrary", + "title": str(payload.get("title", "")), + "description": "", + "chapter_titles": titles, + } + except httpx.HTTPError: + pass + + # 2) Google Books 按 ISBN 查书目 + try: + with httpx.Client(timeout=6.0) as client: + response = client.get( + "https://www.googleapis.com/books/v1/volumes", + params={"q": f"isbn:{normalized}", "maxResults": 1}, + ) + if response.status_code == 200: + data = response.json() + items = data.get("items") or [] + if items: + volume = items[0].get("volumeInfo", {}) + return { + "source": "google_books", + "title": str(volume.get("title", "")), + "description": str(volume.get("description", ""))[:1500], + "chapter_titles": [], + } + except httpx.HTTPError: + pass + + return {"source": "", "title": "", "description": "", "chapter_titles": []} diff --git a/backend/services/json_utils.py b/backend/services/json_utils.py new file mode 100644 index 0000000..b45dbf8 --- /dev/null +++ b/backend/services/json_utils.py @@ -0,0 +1,85 @@ +"""宽松 JSON 提取:模型常把 LaTeX 的 \\ 写进 JSON,需要修复非法转义。""" +from __future__ import annotations + +import json +import re + + +VALID_JSON_ESCAPES = set('"\\/bfnrtu') + + +def _repair_json_escapes(content: str) -> str: + """把字符串里未被正确转义的单个反斜杠补成双反斜杠。""" + result: list[str] = [] + index = 0 + in_string = False + length = len(content) + while index < length: + char = content[index] + if not in_string: + result.append(char) + if char == '"': + in_string = True + index += 1 + continue + if char != "\\": + result.append(char) + if char == '"': + in_string = False + index += 1 + continue + + run_end = index + while run_end < length and content[run_end] == "\\": + run_end += 1 + run_length = run_end - index + next_char = content[run_end] if run_end < length else "" + if ( + run_length % 2 == 1 + and next_char + and next_char not in VALID_JSON_ESCAPES + ): + result.append("\\" * (run_length + 1)) + else: + result.append("\\" * run_length) + index = run_end + return "".join(result) + + +def extract_json_lax(content: str) -> dict: + text = content.strip() + if text.startswith("```"): + text = re.sub(r"^```(?:json)?\s*", "", text) + text = re.sub(r"\s*```$", "", text) + end = text.rfind("}") + if end <= 0: + raise ValueError("模型没有返回 JSON,请重试或调整模型") + starts = [ + match.start() + for match in re.finditer(r'\{"(questions|chapters)":', text) + ] + starts.extend(match.start() for match in re.finditer(r"\{", text)) + starts = sorted(set(starts)) + # 限制扫描数量,避免模型把大量思考文本误当成 JSON + for start in starts: + if start >= end: + break + payload = text[start : end + 1] + try: + return json.loads(payload, strict=False) + except json.JSONDecodeError: + repaired = _repair_json_escapes(payload) + try: + return json.loads(repaired, strict=False) + except json.JSONDecodeError: + continue + # 没有可解析候选时,给出最后一次错误细节 + payload = text[starts[0] : end + 1] if starts else text + try: + json.loads(payload, strict=False) + except json.JSONDecodeError as exc: + raise ValueError( + "模型返回的 JSON 格式不正确" + f"({exc.msg},位置 {exc.pos}),请重试或调整模型" + ) from exc + raise ValueError("模型返回的 JSON 格式不正确,请重试或调整模型") diff --git a/backend/services/knowledge_service.py b/backend/services/knowledge_service.py new file mode 100644 index 0000000..508ba45 --- /dev/null +++ b/backend/services/knowledge_service.py @@ -0,0 +1,226 @@ +"""知识点关系:全局 Knowledge + 章节/题目多对多 + 用户掌握度。""" +from __future__ import annotations + +from sqlalchemy.orm import Session + +from models import ( + ChapterKnowledge, + Knowledge, + KnowledgeRelation, + KnowledgeResource, + Question, + QuestionKnowledge, + UserKnowledge, +) + + +def ensure_knowledge(db: Session, name: str) -> Knowledge: + clean = name.strip() + row = db.query(Knowledge).filter(Knowledge.name == clean).first() + if row is None: + row = Knowledge(name=clean) + db.add(row) + db.flush() + return row + + +def ensure_knowledge_relation( + db: Session, + source: Knowledge, + target: Knowledge, + relation_type: str = "前置", +) -> KnowledgeRelation: + row = ( + db.query(KnowledgeRelation) + .filter( + KnowledgeRelation.source_id == source.id, + KnowledgeRelation.target_id == target.id, + KnowledgeRelation.relation_type == relation_type, + ) + .first() + ) + if row is None: + row = KnowledgeRelation( + source_id=source.id, + target_id=target.id, + relation_type=relation_type, + ) + db.add(row) + db.flush() + return row + + +def chapter_knowledge_names(db: Session, chapter_id: int) -> list[str]: + rows = ( + db.query(Knowledge.name) + .join(ChapterKnowledge, ChapterKnowledge.knowledge_id == Knowledge.id) + .filter(ChapterKnowledge.chapter_id == chapter_id) + .order_by(ChapterKnowledge.id.asc()) + .all() + ) + return [name for (name,) in rows] + + +def knowledge_resources(db: Session, knowledge_id: int) -> list[KnowledgeResource]: + return ( + db.query(KnowledgeResource) + .filter(KnowledgeResource.knowledge_id == knowledge_id) + .order_by(KnowledgeResource.position.asc(), KnowledgeResource.id.asc()) + .all() + ) + + +def ensure_knowledge_resource( + db: Session, + knowledge_id: int, + *, + kind: str, + title: str, + url: str, + textbook_id: int | None = None, + course_id: int | None = None, +) -> KnowledgeResource: + row = ( + db.query(KnowledgeResource) + .filter( + KnowledgeResource.knowledge_id == knowledge_id, + KnowledgeResource.kind == kind, + KnowledgeResource.url == url, + ) + .first() + ) + if row is None: + row = KnowledgeResource( + knowledge_id=knowledge_id, + kind=kind, + title=title, + url=url, + textbook_id=textbook_id, + course_id=course_id, + ) + db.add(row) + db.flush() + return row + + +def set_chapter_knowledge_names( + db: Session, chapter_id: int, names: list[str] +) -> list[Knowledge]: + cleaned = list(dict.fromkeys(name.strip() for name in names if name.strip())) + db.query(ChapterKnowledge).filter( + ChapterKnowledge.chapter_id == chapter_id + ).delete(synchronize_session=False) + db.flush() + ordered: list[Knowledge] = [] + for name in cleaned: + knowledge = ensure_knowledge(db, name) + db.add(ChapterKnowledge(chapter_id=chapter_id, knowledge_id=knowledge.id)) + ordered.append(knowledge) + db.flush() + return ordered + + +def set_chapter_knowledge_ids( + db: Session, chapter_id: int, knowledge_ids: list[int] +) -> list[Knowledge]: + ids = list(dict.fromkeys(int(kid) for kid in knowledge_ids)) + rows = ( + db.query(Knowledge).filter(Knowledge.id.in_(ids)).all() + if ids + else [] + ) + by_id = {row.id: row for row in rows} + if len(by_id) != len(ids): + raise ValueError("部分知识点不存在") + db.query(ChapterKnowledge).filter( + ChapterKnowledge.chapter_id == chapter_id + ).delete(synchronize_session=False) + db.flush() + ordered = [by_id[kid] for kid in ids] + for knowledge in ordered: + db.add(ChapterKnowledge(chapter_id=chapter_id, knowledge_id=knowledge.id)) + db.flush() + return ordered + + +def question_knowledge_names(db: Session, question: Question) -> list[str]: + rows = ( + db.query(Knowledge.name) + .join(QuestionKnowledge, QuestionKnowledge.knowledge_id == Knowledge.id) + .filter(QuestionKnowledge.question_id == question.id) + .order_by(QuestionKnowledge.id.asc()) + .all() + ) + names = [name for (name,) in rows] + return names or ([question.knowledge_name] if question.knowledge_name else []) + + +def set_question_knowledge_names( + db: Session, + question: Question, + names: list[str], + *, + attach_to_chapter: bool = False, +) -> list[Knowledge]: + cleaned = list(dict.fromkeys(name.strip() for name in names if name.strip())) + if not cleaned and question.knowledge_name: + cleaned = [question.knowledge_name] + db.query(QuestionKnowledge).filter( + QuestionKnowledge.question_id == question.id + ).delete(synchronize_session=False) + db.flush() + ordered: list[Knowledge] = [] + for name in cleaned: + knowledge = ensure_knowledge(db, name) + db.add( + QuestionKnowledge(question_id=question.id, knowledge_id=knowledge.id) + ) + ordered.append(knowledge) + if attach_to_chapter and question.chapter_id is not None: + exists = ( + db.query(ChapterKnowledge) + .filter( + ChapterKnowledge.chapter_id == question.chapter_id, + ChapterKnowledge.knowledge_id == knowledge.id, + ) + .first() + ) + if exists is None: + db.add( + ChapterKnowledge( + chapter_id=question.chapter_id, + knowledge_id=knowledge.id, + ) + ) + db.flush() + if cleaned: + question.knowledge_name = cleaned[0] + return ordered + + +def ensure_user_knowledge( + db: Session, user_id: int, knowledge: Knowledge +) -> UserKnowledge: + row = ( + db.query(UserKnowledge) + .filter( + UserKnowledge.user_id == user_id, + UserKnowledge.knowledge_id == knowledge.id, + ) + .first() + ) + if row is None: + max_position = ( + db.query(UserKnowledge.position) + .filter(UserKnowledge.user_id == user_id) + .count() + ) + row = UserKnowledge( + user_id=user_id, + knowledge_id=knowledge.id, + mastery=60, + position=max_position, + ) + db.add(row) + db.flush() + return row diff --git a/backend/services/learning_profile.py b/backend/services/learning_profile.py new file mode 100644 index 0000000..7126ca0 --- /dev/null +++ b/backend/services/learning_profile.py @@ -0,0 +1,76 @@ +"""学习账号初始化与清理(用户掌握度按全局 Knowledge 节点记录)。""" +from __future__ import annotations + +from sqlalchemy.orm import Session +from sqlalchemy import text + +from models import ( + AttemptItem, + AttemptSession, + DailyCompletion, + ErrorEntry, + Role, + User, + UserKnowledge, + UserRole, +) +from seed.rbac import DEFAULT_USERS + + +def user_has_admin_role(db: Session, user_id: int) -> bool: + return ( + db.query(Role.id) + .join(UserRole, UserRole.role_id == Role.id) + .filter(Role.code == "admin", UserRole.user_id == user_id) + .first() + is not None + ) + + +def ensure_profile(db: Session, user_id: int) -> None: + """新学习账号无需预置掌握度:从第一次章节测试起由答题结果生成。""" + db.commit() + + +def ensure_default_profiles(db: Session) -> None: + """默认学生账号同样从空学习记录开始,管理员不建学习档案。""" + for username, _, _, _ in DEFAULT_USERS: + user = db.query(User).filter(User.username == username).first() + if user is None or user_has_admin_role(db, user.id): + continue + ensure_profile(db, user.id) + + +def remove_unused_admin_profile(db: Session, user_id: int) -> None: + """管理员不保留学习数据。""" + db.query(UserKnowledge).filter(UserKnowledge.user_id == user_id).delete() + db.query(ErrorEntry).filter(ErrorEntry.user_id == user_id).delete() + db.query(AttemptItem).filter(AttemptItem.user_id == user_id).delete() + db.query(AttemptSession).filter(AttemptSession.user_id == user_id).delete() + db.query(DailyCompletion).filter(DailyCompletion.user_id == user_id).delete() + db.commit() + + +def reset_user_learning(db: Session, user_id: int) -> None: + remove_unused_admin_profile(db, user_id) + + +def reset_all_learning(db: Session) -> None: + db.query(UserKnowledge).delete() + db.query(ErrorEntry).delete() + db.query(AttemptItem).delete() + db.query(AttemptSession).delete() + db.query(DailyCompletion).delete() + db.execute(text("DROP TABLE IF EXISTS knowledge_points")) + for table_name, column in ( + ("chapters", "knowledge_names"), + ("questions", "knowledge_names"), + ): + try: + db.execute( + text(f"ALTER TABLE {table_name} DROP COLUMN {column}") + ) + except Exception: + # 新库本来就没有这些旧文本列,忽略 + pass + db.commit() diff --git a/backend/services/llm_client.py b/backend/services/llm_client.py new file mode 100644 index 0000000..b3e2ea9 --- /dev/null +++ b/backend/services/llm_client.py @@ -0,0 +1,149 @@ +"""大模型调用客户端:OpenAI / DeepSeek / 阿里百炼 qwen / OpenAI 兼容。""" +from __future__ import annotations + +import httpx + + +PROVIDER_PRESETS = { + "openai": { + "label": "OpenAI", + "base_url": "https://api.openai.com/v1", + "model": "gpt-4o-mini", + }, + "deepseek": { + "label": "DeepSeek", + "base_url": "https://api.deepseek.com/v1", + "model": "deepseek-chat", + }, + "qwen": { + "label": "阿里千问(百炼)", + "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "model": "qwen-plus", + }, + "openai_compatible": { + "label": "OpenAI 兼容(自定义)", + "base_url": "", + "model": "", + }, +} + + +def mask_key(api_key: str) -> str: + if not api_key: + return "" + if len(api_key) <= 8: + return "****" + return f"****{api_key[-4:]}" + + +def _content_text(value) -> str: + """兼容 content 为字符串或 OpenAI 多段数组([{"type":"text","text":...}])。""" + if value is None: + return "" + if isinstance(value, str): + return value + if isinstance(value, list): + chunks: list[str] = [] + for part in value: + if isinstance(part, dict): + text = part.get("text") + if isinstance(text, str): + chunks.append(text) + else: + chunks.append(str(part)) + return "".join(chunks) + if isinstance(value, dict): + text = value.get("text") + return text if isinstance(text, str) else "" + return str(value) + + +def _message_text(message: dict) -> str: + """OpenAI 兼容网关常见差异:正文可能在 content 或 reasoning/reasoning_content。""" + text = _content_text(message.get("content")) + if text.strip(): + return text.strip() + for key in ("reasoning_content", "reasoning"): + fallback = _content_text(message.get(key)) + if fallback.strip(): + return fallback.strip() + refusal = message.get("refusal") + if isinstance(refusal, str) and refusal.strip(): + raise ValueError(f"模型拒绝回答:{refusal[:200]}") + return "" + + +def chat_completion( + *, + base_url: str, + api_key: str, + model: str, + messages: list[dict[str, str]], + temperature: float = 0.3, + max_tokens: int = 1600, + timeout: float = 120.0, +) -> str: + if not base_url or not api_key or not model: + raise ValueError("请先完整填写模型配置(地址、API Key、模型名)。") + endpoint = f"{base_url.rstrip('/')}/chat/completions" + payload = { + "model": model, + "messages": messages, + "temperature": temperature, + "max_tokens": max_tokens, + } + headers = { + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json", + } + try: + with httpx.Client(timeout=timeout) as client: + response = client.post(endpoint, json=payload, headers=headers) + except httpx.HTTPError as exc: + raise ValueError(f"无法连接模型服务:{exc.__class__.__name__}") from exc + + if response.status_code != 200: + detail = response.text[:300] + raise ValueError(f"模型服务返回 {response.status_code}:{detail}") + try: + data = response.json() + message = data["choices"][0].get("message") + if not isinstance(message, dict): + raise KeyError("message") + content = _message_text(message) + if not content: + finish_reason = data["choices"][0].get("finish_reason") + raise ValueError( + "模型没有返回可见文本" + f"(finish_reason={finish_reason})。" + "若模型启用了推理模式,请提高 max_tokens 或缩短提示。" + ) + return content + except ValueError: + raise + except (KeyError, IndexError, TypeError) as exc: + raise ValueError("模型返回格式不符合 Chat Completions 规范") from exc + + +def quick_test( + *, + base_url: str, + api_key: str, + model: str, + temperature: float = 0.0, +) -> str: + return chat_completion( + base_url=base_url, + api_key=api_key, + model=model, + temperature=temperature, + max_tokens=256, + timeout=45.0, + messages=[ + { + "role": "system", + "content": "你是连通性测试助手,只回复两个字:正常", + }, + {"role": "user", "content": "请确认服务可用。"}, + ], + ) diff --git a/backend/services/llm_config.py b/backend/services/llm_config.py new file mode 100644 index 0000000..3d9b5c0 --- /dev/null +++ b/backend/services/llm_config.py @@ -0,0 +1,66 @@ +"""模型通道(多通道)配置辅助:默认命名、幂等初始化与默认通道管理。""" +from __future__ import annotations + +import os + +from sqlalchemy.orm import Session + +from models import LlmSetting +from services.llm_client import PROVIDER_PRESETS + + +def provider_label(provider: str) -> str: + preset = PROVIDER_PRESETS.get(provider) + return preset["label"] if preset else provider + + +def default_channel_name(provider: str, model: str) -> str: + label = provider_label(provider) + return f"{label} · {model}" if model else label + + +def ensure_llm_channels(db: Session) -> None: + """老库升级:给历史单通道配置补名字并保证存在默认通道。""" + rows = db.query(LlmSetting).order_by(LlmSetting.id.asc()).all() + if not rows: + api_key = os.getenv("OPENAI_API_KEY", "").strip() + if api_key: + preset = PROVIDER_PRESETS["openai"] + db.add( + LlmSetting( + name=default_channel_name("openai", preset["model"]), + provider="openai", + base_url=preset["base_url"], + model=preset["model"], + temperature=0.3, + api_key=api_key, + is_default=True, + ) + ) + db.commit() + return + for row in rows: + if not row.name: + row.name = default_channel_name(row.provider, row.model) + if not any(row.is_default for row in rows): + rows[0].is_default = True + db.commit() + + +def get_default_channel(db: Session) -> LlmSetting | None: + return ( + db.query(LlmSetting) + .filter(LlmSetting.is_default.is_(True)) + .order_by(LlmSetting.id.asc()) + .first() + ) + + +def promote_default(db: Session, channel_id: int | None = None) -> None: + """把指定通道设为默认;未指定时选择第一个可用通道。""" + rows = db.query(LlmSetting).order_by(LlmSetting.id.asc()).all() + for row in rows: + row.is_default = channel_id is not None and row.id == channel_id + if channel_id is None and rows: + rows[0].is_default = True + db.commit() diff --git a/backend/services/mastery_engine.py b/backend/services/mastery_engine.py new file mode 100644 index 0000000..e623972 --- /dev/null +++ b/backend/services/mastery_engine.py @@ -0,0 +1,83 @@ +"""掌握度引擎:状态分级、按全局知识点节点答题后更新。""" +from __future__ import annotations + +from dataclasses import dataclass + +from sqlalchemy.orm import Session + +from models import Knowledge, UserKnowledge +from services.knowledge_service import ensure_knowledge, ensure_user_knowledge + + +MASTERY_DELTA = { + "chapter": (5, 4), + "legacy": (4, 3), + "imported": (0, 0), +} + + +@dataclass +class KnowledgeView: + id: int + knowledge_id: int + name: str + mastery: int + position: int + domain: str + category: str + + +def status_for(mastery: int) -> str: + if mastery >= 85: + return "已掌握" + if mastery >= 75: + return "基本掌握" + if mastery >= 60: + return "待加强" + return "重点" + + +def action_for(mastery: int) -> str: + if mastery < 60: + return "优先强化" + if mastery < 75: + return "继续练习" + return "保持复习" + + +def snapshot(db: Session, user_id: int) -> list[KnowledgeView]: + rows = ( + db.query(UserKnowledge, Knowledge) + .join(Knowledge, Knowledge.id == UserKnowledge.knowledge_id) + .filter(UserKnowledge.user_id == user_id) + .order_by(UserKnowledge.position.asc(), UserKnowledge.id.asc()) + .all() + ) + return [ + KnowledgeView( + id=user_knowledge.id, + knowledge_id=knowledge.id, + name=knowledge.name, + mastery=user_knowledge.mastery, + position=user_knowledge.position, + domain=knowledge.domain, + category=knowledge.category, + ) + for user_knowledge, knowledge in rows + ] + + +def apply_answers( + db: Session, + user_id: int, + mode: str, + answered: list[tuple[str, bool]], +) -> None: + """按题目全量知识点逐点调整掌握度(答对加分、答错扣分,封顶 0-100)。""" + plus, minus = MASTERY_DELTA.get(mode, (4, 3)) + for knowledge_name, is_correct in answered: + knowledge = ensure_knowledge(db, knowledge_name) + row = ensure_user_knowledge(db, user_id, knowledge) + row.mastery = max( + 0, min(100, row.mastery + (plus if is_correct else -minus)) + ) diff --git a/backend/services/question_engine.py b/backend/services/question_engine.py new file mode 100644 index 0000000..5eec9e2 --- /dev/null +++ b/backend/services/question_engine.py @@ -0,0 +1,89 @@ +"""题目引擎:按章节动态组卷(掌握度缺口 + 错题 + 轮换扰动)。""" +from __future__ import annotations + +import json + +from sqlalchemy.orm import Session +from sqlalchemy import func + +from models import ( + AttemptItem, + Chapter, + ErrorEntry, + Knowledge, + Question, + UserKnowledge, +) +from services.knowledge_service import question_knowledge_names + + +def load_questions(db: Session, ids: list[int]) -> list[Question]: + rows = db.query(Question).filter(Question.id.in_(ids)).all() + by_id = {row.id: row for row in rows} + return [by_id[qid] for qid in ids if qid in by_id] + + +def chapter_question_ids( + db: Session, + user_id: int, + chapter_id: int, + limit: int = 5, + variant: int = 0, +) -> list[int]: + """按章节动态组卷:只取该章题库,不足则返回实际题量,不从其他章节补题。 + + 权重 = 掌握度缺口 + 错题加成 + 上次已做惩罚 + 轮换扰动,避免每轮完全相同。 + """ + chapter = db.get(Chapter, chapter_id) + if chapter is None: + return [] + + knowledge_map = { + knowledge.name: user_knowledge.mastery + for user_knowledge, knowledge in ( + db.query(UserKnowledge, Knowledge) + .join(Knowledge, Knowledge.id == UserKnowledge.knowledge_id) + .filter(UserKnowledge.user_id == user_id) + .all() + ) + } + error_counts: dict[str, int] = {} + for primary, raw_names in ( + db.query(ErrorEntry.knowledge_name, ErrorEntry.knowledge_names) + .filter(ErrorEntry.user_id == user_id) + .all() + ): + try: + names = json.loads(raw_names or "[]") + if not isinstance(names, list) or not names: + names = [primary] + except (TypeError, ValueError): + names = [primary] + for name in {str(name) for name in names}: + error_counts[name] = error_counts.get(name, 0) + 1 + + attempt_counts = dict( + db.query(AttemptItem.question_id, func.count(AttemptItem.id)) + .filter(AttemptItem.user_id == user_id, AttemptItem.question_id.isnot(None)) + .group_by(AttemptItem.question_id) + .all() + ) + + chapter_questions = ( + db.query(Question).filter(Question.chapter_id == chapter_id).all() + ) + + ranked = [] + for question in chapter_questions: + tags = question_knowledge_names(db, question) + knowledge_deficit = max( + (110 - knowledge_map.get(tag, 60) for tag in tags), + default=50, + ) + errors = sum(error_counts.get(tag, 0) for tag in tags) + repeated = attempt_counts.get(question.id, 0) * 22 + jitter = (question.id * 7 + variant * 13) % 19 + weight = knowledge_deficit + errors * 12 - repeated + jitter + ranked.append((weight, question)) + ranked.sort(key=lambda pair: (-pair[0], pair[1].id)) + return [q.id for _, q in ranked[:limit]] diff --git a/backend/services/question_generator.py b/backend/services/question_generator.py new file mode 100644 index 0000000..35cde02 --- /dev/null +++ b/backend/services/question_generator.py @@ -0,0 +1,320 @@ +"""按教材章节调用大模型生成客观题,并做结构化校验后入库。""" +from __future__ import annotations + +from models import Chapter, Knowledge, LlmSetting, Question, Textbook +from services import llm_client + + +SYSTEM_PROMPT = ( + "你是一位经验丰富的高中数学教师和命题人,擅长编写规范、严谨、" + "区分度良好的单项选择题。所有题面必须自洽且答案唯一。" +) + + +def build_user_prompt( + *, + textbook_name: str, + chapter_name: str, + chapter_summary: str, + count: int, + difficulty: int, + knowledge_name: str, + instructions: str, + available_knowledge: list[str], + need_figure: bool = False, +) -> str: + difficulty_text = {1: "基础识记与直接计算", 2: "概念理解与中等计算", 3: "综合推理与易错辨析"}[ + difficulty + ] + knowledge_hint = ( + f"知识点限定为“{knowledge_name}”。" + if knowledge_name + else "知识点由你依据章节内容选择,尽量使用下面给出的知识点名称;" + "若下面列表没有合适名称,可自拟简洁的中文知识点名。" + ) + extra = f"额外要求:{instructions}" if instructions else "" + figure_requirement = ( + ( + "配图要求:每题必须在 image_svg 字段中给出与题意对应的原创 SVG 图像" + "(只画该题需要的函数图像/几何示意图,含坐标轴与必要标注)," + "SVG 用单行字符串输出(内部换行用 \\n),不要用 Markdown 图片或外链;" + "题干中不要再重复插入任何图片标记。" + ) + if need_figure + else "配图要求:默认不配图,image_svg 字段填空字符串 \"\"。" + ) + figure_hint = f"\n{figure_requirement}\n" if need_figure else f"\n{figure_requirement}" + return f"""请围绕以下教材章节命制 {count} 道高中数学单选题。 + +教材:{textbook_name} +章节:{chapter_name} +章节内容提示:{chapter_summary or "请结合章节标题自行判断"} +难度:{difficulty_text} +{knowledge_hint} +本系统已有知识点:{", ".join(available_knowledge) or "(暂无)"} +{extra} +{figure_hint} + +硬性要求: +1. 每题必须恰好 4 个选项,且只有一个正确选项; +2. 不使用“以上都对”“以上都错”这类选项; +3. 涉及数学符号、公式时必须用 LaTeX:行内公式写 $...$,独立公式写 $$...$$, + 不要使用 x²、x³、√、¼ 这类 Unicode 记号,例如 $x^2$、$\\sqrt{{x+1}}$、 + $\\frac{{1}}{{x^2-9}}$、$f(-x)=-f(x)$; +4. 图像只通过 JSON 的 image_svg 字段提供:配图要求开启时,每题必须有与题目 + 语义一致的原创 SVG 图(函数图或几何示意图,含坐标轴/关键标注), + 题干中不得再写任何 Markdown 图片;未开启配图时不要输出 image_svg; +5. explanation 用 1-2 句中文解释关键思路,便于学生理解,含公式时同样用 LaTeX; +6. 不要输出多余文字,只输出 JSON: +{{"questions":[ + {{"stem":"题干","options":["A选项","B选项","C选项","D选项"], + "correct_index":0,"explanation":"解析","knowledge_name":"知识点","difficulty":{difficulty}, + "image_svg":" 或空字符串"}} +]}}""" + + +def _extract_json(content: str) -> dict: + from services.json_utils import extract_json_lax + + return extract_json_lax(content) + + +def _normalize_item(raw: dict, fallback_knowledge: str, difficulty: int) -> dict: + stem = str(raw.get("stem", "")).strip() + options = raw.get("options") or [] + options = [str(option).strip() for option in options] + explanation = str(raw.get("explanation", "")).strip() + knowledge_name = str(raw.get("knowledge_name", "")).strip() or fallback_knowledge + image_svg = str(raw.get("image_svg") or "").strip() + # 部分兼容网关会对 JSON 内的 SVG 引号/换行做双重转义 + image_svg = image_svg.replace("\\\\", "\\") + image_svg = ( + image_svg.replace('\\"', '"') + .replace("\\n", "\n") + .replace("\\t", "\t") + .replace("\\r", "\r") + ) + + if not stem: + raise ValueError("模型返回的题干为空") + if len(options) != 4 or any(not option for option in options): + raise ValueError(f"选项必须是 4 个非空选项,实际为 {len(options)} 个") + if len(set(options)) != 4: + raise ValueError("选项存在重复") + try: + correct_index = int(raw.get("correct_index", -1)) + except (TypeError, ValueError) as exc: + raise ValueError("correct_index 必须是数字") from exc + if correct_index < 0 or correct_index >= 4: + raise ValueError("correct_index 超出选项范围") + return { + "stem": stem, + "options": options, + "correct_index": correct_index, + "explanation": explanation or "请依据本章定义与性质重新判断。", + "knowledge_name": knowledge_name, + "difficulty": max(1, min(3, difficulty)), + "image_svg": image_svg, + } + + +def generate_questions( + *, + db, + setting: LlmSetting, + chapter: Chapter, + textbook: Textbook, + count: int, + difficulty: int, + knowledge_name: str, + instructions: str, + need_figure: bool = False, +) -> list[dict]: + if not setting or not setting.api_key: + raise ValueError("尚未配置大模型 API Key,请先到“模型配置”页面保存并测试") + + # 带图模式先按无图生成文本题目,再逐题补 SVG,避免长 JSON 超时/截断 + if need_figure: + text_items = generate_questions( + db=db, + setting=setting, + chapter=chapter, + textbook=textbook, + count=count, + difficulty=difficulty, + knowledge_name=knowledge_name, + instructions=instructions, + need_figure=False, + ) + for item in text_items: + item["image_svg"] = _request_figure_svg(setting, item["stem"]) + return text_items + + knowledge_names = {name for (name,) in db.query(Knowledge.name).all()} + knowledge_names.update( + name for (name,) in db.query(Question.knowledge_name).all() + ) + available_knowledge = sorted(knowledge_names) + prompt = build_user_prompt( + textbook_name=textbook.name, + chapter_name=chapter.name, + chapter_summary=chapter.summary, + count=count, + difficulty=difficulty, + knowledge_name=knowledge_name, + instructions=instructions, + available_knowledge=available_knowledge, + need_figure=need_figure, + ) + payload = {} + last_error = "" + for attempt in range(3): + try: + content = llm_client.chat_completion( + base_url=setting.base_url, + api_key=setting.api_key, + model=setting.model, + temperature=setting.temperature, + max_tokens=_effective_max_tokens(setting, need_figure), + timeout=200.0, + messages=[ + { + "role": "system", + "content": ( + SYSTEM_PROMPT + + " JSON 必须完整且闭合:字符串中的双引号写 \\\"," + "反斜杠写 \\\\,不要输出多余字符。" + ), + }, + {"role": "user", "content": prompt}, + ], + ) + except ValueError as exc: + last_error = str(exc) + continue + try: + payload = _extract_json(content) + break + except ValueError as exc: + last_error = str(exc) + else: + raise ValueError( + f"模型连续 3 次未返回合法 JSON,最后一次:{last_error}" + ) + raw_items = payload.get("questions") + if not isinstance(raw_items, list) or not raw_items: + raise ValueError("模型返回内容中没有 questions 列表") + + generated: list[dict] = [] + for raw in raw_items[:count]: + item = _normalize_item(raw, knowledge_name or "章节综合", difficulty) + if need_figure and ( + "" not in item["image_svg"].lower() + ): + # 补图:只让模型针对该题生成一张 SVG,缩短输出降低截断概率 + for _ in range(3): + svg_content = llm_client.chat_completion( + base_url=setting.base_url, + api_key=setting.api_key, + model=setting.model, + temperature=0.1, + max_tokens=max( + int(setting.max_tokens) + if setting.max_tokens + else 3000, + 1200, + ), + timeout=120.0, + messages=[ + { + "role": "system", + "content": "只输出 JSON:{\"image_svg\":\"\"}", + }, + { + "role": "user", + "content": ( + f"请为下列题干生成与题意一致的原创 SVG 示意图:\n{item['stem']}" + ), + }, + ], + ) + try: + svg_payload = _extract_json(svg_content) + svg_value = str(svg_payload.get("image_svg") or "") + svg_value = svg_value.replace("\\\\", "\\") + svg_value = ( + svg_value.replace('\\"', '"') + .replace("\\n", "\n") + .replace("\\t", "\t") + .replace("\\r", "\r") + ) + if ( + "" in svg_value.lower() + ): + item["image_svg"] = svg_value + break + except ValueError: + continue + if ( + "" not in item["image_svg"].lower() + ): + raise ValueError( + "模型未能生成本题有效配图,请尝试减少题量或更换模型通道" + ) + generated.append(item) + return generated + + +def _request_figure_svg(setting: LlmSetting, stem: str) -> str: + """针对单一题干请求一张尽量简单的 SVG 配图。""" + max_tokens = int(setting.max_tokens) if setting.max_tokens else 1600 + for _ in range(3): + try: + content = llm_client.chat_completion( + base_url=setting.base_url, + api_key=setting.api_key, + model=setting.model, + temperature=0.1, + max_tokens=max_tokens, + timeout=300.0, + messages=[ + { + "role": "system", + "content": ( + "你是数学示意图生成器。只输出 JSON:" + '{"image_svg":""}。SVG 必须非常简洁,' + "建议坐标轴+图形+少量标注,控制在 100 行内。" + ), + }, + { + "role": "user", + "content": f"请为以下题干生成与题意一致的示意图:\n{stem}", + }, + ], + ) + except ValueError: + continue + try: + payload = _extract_json(content) + svg = str(payload.get("image_svg") or "") + svg = svg.replace("\\\\", "\\") + svg = ( + svg.replace('\\"', '"') + .replace("\\n", "\n") + .replace("\\t", "\t") + .replace("\\r", "\r") + ) + if "" in svg.lower(): + return svg + except ValueError: + continue + raise ValueError("模型未能为本题生成有效 SVG,请更换模型通道或关闭配图") + + +def _effective_max_tokens(setting: LlmSetting, need_figure: bool) -> int: + if getattr(setting, "max_tokens", None): + return int(setting.max_tokens) + return 3000 if need_figure else 1600 diff --git a/backend/services/recommendation.py b/backend/services/recommendation.py new file mode 100644 index 0000000..7f0b977 --- /dev/null +++ b/backend/services/recommendation.py @@ -0,0 +1,151 @@ +"""推荐引擎:找出薄弱知识点并生成“下一步任务”。""" +from __future__ import annotations + +import json + +from sqlalchemy.orm import Session + +from models import ( + AttemptItem, + Chapter, + DailyCompletion, + ErrorEntry, + Knowledge, + Question, + Textbook, + UserKnowledge, +) +from services.mastery_engine import snapshot +from services.knowledge_service import chapter_knowledge_names + + +def _error_counts(db: Session, user_id: int) -> dict[str, int]: + counts: dict[str, int] = {} + for primary, raw_names in ( + db.query(ErrorEntry.knowledge_name, ErrorEntry.knowledge_names) + .filter(ErrorEntry.user_id == user_id) + .all() + ): + try: + names = json.loads(raw_names or "[]") + if not isinstance(names, list) or not names: + names = [primary] + except (TypeError, ValueError): + names = [primary] + for item in names: + counts[str(item)] = counts.get(str(item), 0) + 1 + return counts + + +def build_plan(db: Session, user_id: int) -> dict: + knowledge = snapshot(db, user_id) + counts = _error_counts(db, user_id) + weak = [k for k in knowledge if k.mastery < 75] + strong = [k for k in knowledge if k.mastery >= 75] + + focus_names = [k.name for k in weak] + if not focus_names: + focus_names = [strong[0].name] if strong else [] + + focus_text = " / ".join(focus_names[:2]) or "当前知识点" + notice = f"系统根据已有答题记录,将“{focus_text}”设为当前强化重点。" + + steps: list[str] = [] + if weak: + group = weak[:2] + step1 = " / ".join(k.name for k in group) + steps.append(f"① 重点强化 {step1}:巩固定义 → 点的对应 → 图像性质判断。") + if len(weak) > 2: + steps.append(f"② {weak[2].name}:从表达式判断图像性质,补做针对性小题。") + else: + steps.append("② 再完成一次章节测试,检验本轮掌握情况。") + steps.append("③ 间隔复习:在后续测试中穿插旧知识,防止遗忘。") + else: + steps.append("① 保持当前节奏,进入下一章节的学习。") + steps.append("② 每周做一次章节测试,维持各知识点掌握度。") + steps.append("③ 错题清零后开始新主题,建立更完整的知识地图。") + + top_error = sorted(knowledge, key=lambda k: (-counts.get(k.name, 0), k.mastery)) + return { + "notice": notice, + "focus_names": focus_names, + "steps": steps, + "top_error": ( + top_error[0].name + if top_error and counts.get(top_error[0].name, 0) + else None + ), + } + + +def build_daily_recommendation( + db: Session, user_id: int +) -> dict | None: + """推荐今日章节:无掌握度且未做过的章优先,然后按薄弱反馈/错误加权。""" + chapters = ( + db.query(Chapter, Textbook) + .join(Textbook, Textbook.id == Chapter.textbook_id) + .order_by(Textbook.position.asc(), Chapter.position.asc()) + .all() + ) + candidates: list[dict] = [] + for chapter, textbook in chapters: + question_count = ( + db.query(Question.id).filter(Question.chapter_id == chapter.id).count() + ) + if question_count == 0: + continue + tags = chapter_knowledge_names(db, chapter.id) + masteries = [ + mastery + for mastery, in db.query(UserKnowledge.mastery) + .join(Knowledge, Knowledge.id == UserKnowledge.knowledge_id) + .filter( + UserKnowledge.user_id == user_id, + Knowledge.name.in_(tags), + ) + .all() + ] + answered = ( + db.query(AttemptItem.id) + .join(Question, Question.id == AttemptItem.question_id) + .filter( + AttemptItem.user_id == user_id, + Question.chapter_id == chapter.id, + ) + .count() + ) + candidates.append( + { + "chapter": chapter, + "textbook": textbook, + "tags": tags, + "mastery_avg": sum(masteries) / len(masteries) + if masteries + else None, + "answered": answered, + "knowledge_count": len(tags), + } + ) + if not candidates: + return None + # 未开始章节优先;同等情况按章节顺序 + candidates.sort( + key=lambda item: ( + 0 if item["answered"] == 0 and item["mastery_avg"] is None else 1, + item["mastery_avg"] if item["mastery_avg"] is not None else 50, + ) + ) + choice = candidates[0] + reason = ( + "你还没有练习过这一章,建议从本章开始建立基础" + if choice["answered"] == 0 + else "该章知识点掌握度较低,需要优先强化" + ) + return { + "chapter_id": choice["chapter"].id, + "chapter_name": choice["chapter"].name, + "book_name": choice["textbook"].name, + "knowledge_names": choice["tags"], + "reason": reason, + } diff --git a/backend/services/security.py b/backend/services/security.py new file mode 100644 index 0000000..2d76a31 --- /dev/null +++ b/backend/services/security.py @@ -0,0 +1,56 @@ +"""密码散列与 JWT 工具。""" +from __future__ import annotations + +import hashlib +import hmac +import os +import secrets +from datetime import datetime, timedelta, timezone + +import jwt + + +PBKDF2_ITERATIONS = 200_000 + + +def hash_password(password: str) -> str: + salt = secrets.token_hex(16) + digest = hashlib.pbkdf2_hmac( + "sha256", password.encode("utf-8"), bytes.fromhex(salt), PBKDF2_ITERATIONS + ).hex() + return f"pbkdf2_sha256${PBKDF2_ITERATIONS}${salt}${digest}" + + +def verify_password(password: str, stored: str) -> bool: + try: + algorithm, iterations, salt, expected = stored.split("$") + if algorithm != "pbkdf2_sha256": + return False + digest = hashlib.pbkdf2_hmac( + "sha256", password.encode("utf-8"), bytes.fromhex(salt), int(iterations) + ).hex() + return hmac.compare_digest(digest, expected) + except (ValueError, TypeError): + return False + + +def _jwt_secret() -> str: + return os.getenv("JWT_SECRET", "nex-math-dev-secret-change-me-in-production") + + +def create_access_token(user_id: int, expires_hours: int = 24 * 7) -> str: + now = datetime.now(timezone.utc) + payload = { + "sub": str(user_id), + "iat": now, + "exp": now + timedelta(hours=expires_hours), + } + return jwt.encode(payload, _jwt_secret(), algorithm="HS256") + + +def decode_access_token(token: str) -> int | None: + try: + payload = jwt.decode(token, _jwt_secret(), algorithms=["HS256"]) + return int(payload["sub"]) + except (jwt.PyJWTError, KeyError, ValueError): + return None diff --git a/backend/services/task_runner.py b/backend/services/task_runner.py new file mode 100644 index 0000000..f4eb206 --- /dev/null +++ b/backend/services/task_runner.py @@ -0,0 +1,119 @@ +"""异步大模型任务执行器。""" +from __future__ import annotations + +import json +import traceback +from datetime import datetime +from fastapi import HTTPException + +from database import SessionLocal +from models import LlmTask + + +class _FakeUser: + id = 0 + + +def run_llm_task(task_id: int, kind: str, params: dict) -> None: + db = SessionLocal() + task = db.get(LlmTask, task_id) + if task is None: + db.close() + return + task.status = "running" + task.progress = 10 + task.message = "任务已开始,正在调用模型…" + db.commit() + try: + task.progress = 25 + db.commit() + if kind == "generate_questions": + from routers.question_bank import generate as execute + from schemas import GenerateIn + + payload = GenerateIn.model_validate(params) + task.progress = 40 + task.message = "正在生成题目并解析结构…" + db.commit() + result = execute(payload=payload, db=db, _=_FakeUser()) + count = len(result) + ids = [item.id for item in result] + task.progress = 100 + task.status = "success" + task.message = f"成功生成 {count} 道题" + task.result = json.dumps({"count": count, "ids": ids}, ensure_ascii=False) + elif kind == "generate_chapters": + from routers.catalog import generate_catalog_chapters + from schemas import ChaptersGenerateIn + + payload = ChaptersGenerateIn.model_validate(params) + task.progress = 40 + task.message = "正在生成章节目录…" + db.commit() + result = execute_generate_chapters( + db, params["textbook_id"], payload + ) + task.progress = 100 + task.status = "success" + task.message = result.message + task.result = json.dumps( + { + "count": len(result.created), + "message": result.message, + }, + ensure_ascii=False, + ) + elif kind == "organize_chapters": + from routers.catalog import organize_textbook_chapters + from schemas import ChaptersOrganizeIn + + payload = ChaptersOrganizeIn.model_validate(params) + task.progress = 40 + task.message = "正在解析目录素材并关联知识图谱…" + db.commit() + result = organize_textbook_chapters( + textbook_id=params["textbook_id"], + payload=payload, + db=db, + _=_FakeUser(), + ) + task.progress = 100 + task.status = "success" + task.message = result.message + task.result = json.dumps( + { + "count": len(result.created), + "message": result.message, + }, + ensure_ascii=False, + ) + else: + raise ValueError(f"不支持的任务类型:{kind}") + except Exception as exc: # noqa: BLE001 + db.rollback() + task = db.get(LlmTask, task_id) + task.status = "failed" + task.message = ( + str(exc.detail)[:500] + if isinstance(exc, HTTPException) + else (str(exc)[:500] or exc.__class__.__name__) + ) + task.progress = 100 + task.result = json.dumps( + {"trace": traceback.format_exc()[-2000:]}, ensure_ascii=False + ) + finally: + task.finished_at = datetime.utcnow() + db.commit() + db.close() + + +def execute_generate_chapters(db, textbook_id: int, payload): + from routers.catalog import generate_catalog_chapters + + return generate_catalog_chapters( + textbook_id=textbook_id, + payload=payload, + db=db, + _=_FakeUser(), + ) diff --git a/data/ebooks/1/da4d4ff2d0b0448fac3719cb7d536d5b.pdf b/data/ebooks/1/da4d4ff2d0b0448fac3719cb7d536d5b.pdf new file mode 100644 index 0000000..1433e9b Binary files /dev/null and b/data/ebooks/1/da4d4ff2d0b0448fac3719cb7d536d5b.pdf differ diff --git a/data/ebooks/10/4559e9e2fa084fb7a8e8a06aea5196bc.epub b/data/ebooks/10/4559e9e2fa084fb7a8e8a06aea5196bc.epub new file mode 100644 index 0000000..faaa472 Binary files /dev/null and b/data/ebooks/10/4559e9e2fa084fb7a8e8a06aea5196bc.epub differ diff --git a/data/ebooks/4/c1945315d608455eb429eacc3378d7d5.pdf b/data/ebooks/4/c1945315d608455eb429eacc3378d7d5.pdf new file mode 100644 index 0000000..db1ea83 Binary files /dev/null and b/data/ebooks/4/c1945315d608455eb429eacc3378d7d5.pdf differ diff --git a/data/ebooks/9/8dc7e48036ac4db8abf0020334b47b07.pdf b/data/ebooks/9/8dc7e48036ac4db8abf0020334b47b07.pdf new file mode 100644 index 0000000..d0f693e Binary files /dev/null and b/data/ebooks/9/8dc7e48036ac4db8abf0020334b47b07.pdf differ diff --git a/data/question_images/generated_0593f340b84e4715933fa16e83c02f3c.svg b/data/question_images/generated_0593f340b84e4715933fa16e83c02f3c.svg new file mode 100644 index 0000000..287edfa --- /dev/null +++ b/data/question_images/generated_0593f340b84e4715933fa16e83c02f3c.svg @@ -0,0 +1 @@ +xy平移 \ No newline at end of file diff --git a/data/question_images/generated_0a1ad757b6a8448ea670ad3f0db798fb.svg b/data/question_images/generated_0a1ad757b6a8448ea670ad3f0db798fb.svg new file mode 100644 index 0000000..5dc7df5 --- /dev/null +++ b/data/question_images/generated_0a1ad757b6a8448ea670ad3f0db798fb.svg @@ -0,0 +1 @@ +xyx=2y=3(2,3) \ No newline at end of file diff --git a/data/question_images/generated_0d31624403734ff5a4d41b8fdbd779ba.svg b/data/question_images/generated_0d31624403734ff5a4d41b8fdbd779ba.svg new file mode 100644 index 0000000..b39ade5 --- /dev/null +++ b/data/question_images/generated_0d31624403734ff5a4d41b8fdbd779ba.svg @@ -0,0 +1 @@ +xyy轴 \ No newline at end of file diff --git a/data/question_images/generated_2c6366420f1d4360a18ca957e7f6d025.svg b/data/question_images/generated_2c6366420f1d4360a18ca957e7f6d025.svg new file mode 100644 index 0000000..16baa89 --- /dev/null +++ b/data/question_images/generated_2c6366420f1d4360a18ca957e7f6d025.svg @@ -0,0 +1 @@ +xyf(x)=|x|y轴对称 \ No newline at end of file diff --git a/data/question_images/generated_321203f2033a4ca1ba2b819a4cb2fd6e.svg b/data/question_images/generated_321203f2033a4ca1ba2b819a4cb2fd6e.svg new file mode 100644 index 0000000..f447046 --- /dev/null +++ b/data/question_images/generated_321203f2033a4ca1ba2b819a4cb2fd6e.svg @@ -0,0 +1 @@ +xyOy轴对称 \ No newline at end of file diff --git a/data/question_images/generated_348d9aa5800e448da32dc9e58e8695e5.svg b/data/question_images/generated_348d9aa5800e448da32dc9e58e8695e5.svg new file mode 100644 index 0000000..5c7ee77 --- /dev/null +++ b/data/question_images/generated_348d9aa5800e448da32dc9e58e8695e5.svg @@ -0,0 +1 @@ +xyy=kx+bOk<0b>0 \ No newline at end of file diff --git a/data/question_images/generated_37228572e66647378697e8ea7d7e847a.svg b/data/question_images/generated_37228572e66647378697e8ea7d7e847a.svg new file mode 100644 index 0000000..0366079 --- /dev/null +++ b/data/question_images/generated_37228572e66647378697e8ea7d7e847a.svg @@ -0,0 +1 @@ +xy最小值=3-21f(x) \ No newline at end of file diff --git a/data/question_images/generated_3b05c134f5844e7ea41efe235ed2700b.svg b/data/question_images/generated_3b05c134f5844e7ea41efe235ed2700b.svg new file mode 100644 index 0000000..7324b2d --- /dev/null +++ b/data/question_images/generated_3b05c134f5844e7ea41efe235ed2700b.svg @@ -0,0 +1 @@ +y轴y=|x|x \ No newline at end of file diff --git a/data/question_images/generated_426645ae57c74de6a93df2ad5f858d98.svg b/data/question_images/generated_426645ae57c74de6a93df2ad5f858d98.svg new file mode 100644 index 0000000..cddc5c5 --- /dev/null +++ b/data/question_images/generated_426645ae57c74de6a93df2ad5f858d98.svg @@ -0,0 +1 @@ +xyO(2,3)y=|x|y=|x-2|+3右2 上3 \ No newline at end of file diff --git a/data/question_images/generated_459a497ba160443ca54692c539ec3d6a.svg b/data/question_images/generated_459a497ba160443ca54692c539ec3d6a.svg new file mode 100644 index 0000000..8c1df68 --- /dev/null +++ b/data/question_images/generated_459a497ba160443ca54692c539ec3d6a.svg @@ -0,0 +1 @@ +A(1,2)B(-1,6)y=-2x+4xyO \ No newline at end of file diff --git a/data/question_images/generated_4820ffee890240f39e587fc39c89a1dc.svg b/data/question_images/generated_4820ffee890240f39e587fc39c89a1dc.svg new file mode 100644 index 0000000..1ee2c20 --- /dev/null +++ b/data/question_images/generated_4820ffee890240f39e587fc39c89a1dc.svg @@ -0,0 +1 @@ +... \ No newline at end of file diff --git a/data/question_images/generated_4e64a8c624ac48f48b83c119c3574240.svg b/data/question_images/generated_4e64a8c624ac48f48b83c119c3574240.svg new file mode 100644 index 0000000..97cbb64 --- /dev/null +++ b/data/question_images/generated_4e64a8c624ac48f48b83c119c3574240.svg @@ -0,0 +1 @@ +xyy=3(-1,3)(2,3)f(x)=|x-2|+|x+1|-120 \ No newline at end of file diff --git a/data/question_images/generated_4fbdf3c628c047fbb6fb95d7ff6f3962.svg b/data/question_images/generated_4fbdf3c628c047fbb6fb95d7ff6f3962.svg new file mode 100644 index 0000000..18157a3 --- /dev/null +++ b/data/question_images/generated_4fbdf3c628c047fbb6fb95d7ff6f3962.svg @@ -0,0 +1,15 @@ + + + + + + + +-2 +2 +4 +(-2, 4) +(2, 4) +x +y + \ No newline at end of file diff --git a/data/question_images/generated_517b779a05ba4e88b2550e1365c0d3d1.svg b/data/question_images/generated_517b779a05ba4e88b2550e1365c0d3d1.svg new file mode 100644 index 0000000..22bc5c3 --- /dev/null +++ b/data/question_images/generated_517b779a05ba4e88b2550e1365c0d3d1.svg @@ -0,0 +1 @@ +xyf(2)=4f(-2)=?y=f(x)y轴对称 \ No newline at end of file diff --git a/data/question_images/generated_5e2274b554a44d8f98507ba1adfd1083.svg b/data/question_images/generated_5e2274b554a44d8f98507ba1adfd1083.svg new file mode 100644 index 0000000..d59ce9e --- /dev/null +++ b/data/question_images/generated_5e2274b554a44d8f98507ba1adfd1083.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + x + y + + O + + + 0 + + + x=1 + + + y=2 + + + (1,2) + + + + + + f(x)=(2x+3)/(x-1) + \ No newline at end of file diff --git a/data/question_images/generated_5f707a81eeb048078020b9e1f830d436.svg b/data/question_images/generated_5f707a81eeb048078020b9e1f830d436.svg new file mode 100644 index 0000000..20093d1 --- /dev/null +++ b/data/question_images/generated_5f707a81eeb048078020b9e1f830d436.svg @@ -0,0 +1 @@ +xyOy=x^3(0,+∞)奇函数,x>0递增 \ No newline at end of file diff --git a/data/question_images/generated_61c1180d8f2947cab148aa843d8bf456.svg b/data/question_images/generated_61c1180d8f2947cab148aa843d8bf456.svg new file mode 100644 index 0000000..b7c9d24 --- /dev/null +++ b/data/question_images/generated_61c1180d8f2947cab148aa843d8bf456.svg @@ -0,0 +1 @@ +y=|x|y=|x-2|+1(2,1)21xy \ No newline at end of file diff --git a/data/question_images/generated_6cbada6ba37241f195e4cbaec7410f0c.svg b/data/question_images/generated_6cbada6ba37241f195e4cbaec7410f0c.svg new file mode 100644 index 0000000..be79d5d --- /dev/null +++ b/data/question_images/generated_6cbada6ba37241f195e4cbaec7410f0c.svg @@ -0,0 +1,7 @@ + + + + A + B + C + \ No newline at end of file diff --git a/data/question_images/generated_6ee7278495ab436899a07f10fdae7c0c.svg b/data/question_images/generated_6ee7278495ab436899a07f10fdae7c0c.svg new file mode 100644 index 0000000..f8b6aeb --- /dev/null +++ b/data/question_images/generated_6ee7278495ab436899a07f10fdae7c0c.svg @@ -0,0 +1 @@ +xy23右2上3y=|x|y=|x-2|+3(2,3) \ No newline at end of file diff --git a/data/question_images/generated_78583ace58414eb6b887641230eb9a3e.svg b/data/question_images/generated_78583ace58414eb6b887641230eb9a3e.svg new file mode 100644 index 0000000..8fefb79 --- /dev/null +++ b/data/question_images/generated_78583ace58414eb6b887641230eb9a3e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/question_images/generated_7a959b8b06e64cf4a132ede3253c5c7e.svg b/data/question_images/generated_7a959b8b06e64cf4a132ede3253c5c7e.svg new file mode 100644 index 0000000..6bdbf05 --- /dev/null +++ b/data/question_images/generated_7a959b8b06e64cf4a132ede3253c5c7e.svg @@ -0,0 +1,9 @@ + + + + + A + B + C + D + \ No newline at end of file diff --git a/data/question_images/generated_7cda410027da408aab4a9d0dcfa93bf6.svg b/data/question_images/generated_7cda410027da408aab4a9d0dcfa93bf6.svg new file mode 100644 index 0000000..8922fdc --- /dev/null +++ b/data/question_images/generated_7cda410027da408aab4a9d0dcfa93bf6.svg @@ -0,0 +1,26 @@ + + + + + + + -2 + + -1 + + 1 + + 2 + + 1 + + 2 + + 3 + + 4 + + O + x + y + \ No newline at end of file diff --git a/data/question_images/generated_809697ad32334f7c980d1e4e98c1464b.svg b/data/question_images/generated_809697ad32334f7c980d1e4e98c1464b.svg new file mode 100644 index 0000000..22dd82f --- /dev/null +++ b/data/question_images/generated_809697ad32334f7c980d1e4e98c1464b.svg @@ -0,0 +1 @@ +xy2y=|x|y=|x-2|y=-|x-2| \ No newline at end of file diff --git a/data/question_images/generated_87ffc543c7f74baca187be4148b5a81a.svg b/data/question_images/generated_87ffc543c7f74baca187be4148b5a81a.svg new file mode 100644 index 0000000..8ed72b2 --- /dev/null +++ b/data/question_images/generated_87ffc543c7f74baca187be4148b5a81a.svg @@ -0,0 +1 @@ +x=3y=2y=(2x+1)/(x-3) \ No newline at end of file diff --git a/data/question_images/generated_8c4c67f3adfb43709ee9caab4b09c1d9.svg b/data/question_images/generated_8c4c67f3adfb43709ee9caab4b09c1d9.svg new file mode 100644 index 0000000..bcc7582 --- /dev/null +++ b/data/question_images/generated_8c4c67f3adfb43709ee9caab4b09c1d9.svg @@ -0,0 +1 @@ +xyx=2递减(2,+∞)f(x)=(ax+1)/(x-2)a>-1/2 \ No newline at end of file diff --git a/data/question_images/generated_8cd2daf1623642dc862e1643f8e19099.svg b/data/question_images/generated_8cd2daf1623642dc862e1643f8e19099.svg new file mode 100644 index 0000000..38bd906 --- /dev/null +++ b/data/question_images/generated_8cd2daf1623642dc862e1643f8e19099.svg @@ -0,0 +1 @@ +xy-22y=1f(x)=||x|-2| \ No newline at end of file diff --git a/data/question_images/generated_95c5461e430e427ba2966b44b64a5e33.svg b/data/question_images/generated_95c5461e430e427ba2966b44b64a5e33.svg new file mode 100644 index 0000000..96a5e7c --- /dev/null +++ b/data/question_images/generated_95c5461e430e427ba2966b44b64a5e33.svg @@ -0,0 +1 @@ +... \ No newline at end of file diff --git a/data/question_images/generated_a01bc4360a0c49e38935d3029773bb0e.svg b/data/question_images/generated_a01bc4360a0c49e38935d3029773bb0e.svg new file mode 100644 index 0000000..38de051 --- /dev/null +++ b/data/question_images/generated_a01bc4360a0c49e38935d3029773bb0e.svg @@ -0,0 +1 @@ +xyx=0.5m=3f(x)-12 \ No newline at end of file diff --git a/data/question_images/generated_b1c201224d71464c90f595ae23a63d94.svg b/data/question_images/generated_b1c201224d71464c90f595ae23a63d94.svg new file mode 100644 index 0000000..3f9ca83 --- /dev/null +++ b/data/question_images/generated_b1c201224d71464c90f595ae23a63d94.svg @@ -0,0 +1 @@ +xy-112 \ No newline at end of file diff --git a/data/question_images/generated_b42d0c95022e4b3887333087cb87169a.svg b/data/question_images/generated_b42d0c95022e4b3887333087cb87169a.svg new file mode 100644 index 0000000..80c7630 --- /dev/null +++ b/data/question_images/generated_b42d0c95022e4b3887333087cb87169a.svg @@ -0,0 +1 @@ +-11231Oxyy=|x^2-2x| \ No newline at end of file diff --git a/data/question_images/generated_d6a942649ea04a8bb475e2a3af8f1eec.svg b/data/question_images/generated_d6a942649ea04a8bb475e2a3af8f1eec.svg new file mode 100644 index 0000000..8fefb79 --- /dev/null +++ b/data/question_images/generated_d6a942649ea04a8bb475e2a3af8f1eec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/question_images/generated_db3e82206db4422eab0d749e9aee6473.svg b/data/question_images/generated_db3e82206db4422eab0d749e9aee6473.svg new file mode 100644 index 0000000..1244ae5 --- /dev/null +++ b/data/question_images/generated_db3e82206db4422eab0d749e9aee6473.svg @@ -0,0 +1 @@ +23xyy=x^2-5x+6 \ No newline at end of file diff --git a/data/question_images/generated_db4dd20088e3439990aa82cd37706802.svg b/data/question_images/generated_db4dd20088e3439990aa82cd37706802.svg new file mode 100644 index 0000000..17e6174 --- /dev/null +++ b/data/question_images/generated_db4dd20088e3439990aa82cd37706802.svg @@ -0,0 +1 @@ +(2,-1)x=2f(x)=x²-4x+3xy最小值 -1 \ No newline at end of file diff --git a/data/question_images/generated_df72b8b42b7c4c77abf8919179537ffd.svg b/data/question_images/generated_df72b8b42b7c4c77abf8919179537ffd.svg new file mode 100644 index 0000000..8fefb79 --- /dev/null +++ b/data/question_images/generated_df72b8b42b7c4c77abf8919179537ffd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/question_images/generated_f9985d95029f480e8e72ddd5a7439181.svg b/data/question_images/generated_f9985d95029f480e8e72ddd5a7439181.svg new file mode 100644 index 0000000..e367b40 --- /dev/null +++ b/data/question_images/generated_f9985d95029f480e8e72ddd5a7439181.svg @@ -0,0 +1 @@ +0x ≠ 0定义域:(-∞,0) ∪ (0,+∞) \ No newline at end of file diff --git a/data/question_images/generated_fca7ea5bac9c4b9abf69b19634144cd9.svg b/data/question_images/generated_fca7ea5bac9c4b9abf69b19634144cd9.svg new file mode 100644 index 0000000..4b63939 --- /dev/null +++ b/data/question_images/generated_fca7ea5bac9c4b9abf69b19634144cd9.svg @@ -0,0 +1,9 @@ + + + + + A + B + C + D + \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..824e38e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +services: + backend: + image: python:3.12-slim + working_dir: /app/backend + volumes: + - ./backend:/app/backend + - ./data:/app/data + environment: + DATABASE_URL: sqlite:////app/data/math.db + CORS_ORIGINS: http://localhost:5173,http://127.0.0.1:5173 + command: > + sh -c "pip install --no-cache-dir -q -r requirements.txt && + python -m seed && + uvicorn main:app --host 0.0.0.0 --port 8000 --reload" + ports: + - "8000:8000" + + frontend: + image: node:22-alpine + working_dir: /app/frontend + volumes: + - ./frontend:/app/frontend + environment: + VITE_API_PROXY: http://backend:8000 + command: sh -c "npm install && npm run dev -- --host 0.0.0.0" + ports: + - "5173:5173" + depends_on: + - backend diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..6a769da --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + 数学学习系统 + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..731337b --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2813 @@ +{ + "name": "math-learning-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "math-learning-frontend", + "version": "1.0.0", + "dependencies": { + "@ant-design/icons": "^6.3.4", + "antd": "^6.6.2", + "epubjs": "^0.3.93", + "katex": "^0.18.6", + "pdfjs-dist": "^6.3.289", + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/node": "^26.4.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^6.1.1", + "typescript": "^7.0.2", + "vite": "^8.2.2" + } + }, + "node_modules/@ant-design/colors": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-8.0.1.tgz", + "integrity": "sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^3.0.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-2.1.2.tgz", + "integrity": "sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs-utils/-/cssinjs-utils-2.1.2.tgz", + "integrity": "sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^2.1.2", + "@babel/runtime": "^7.23.2", + "@rc-component/util": "^1.4.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@ant-design/fast-color/-/fast-color-3.0.1.tgz", + "integrity": "sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==", + "license": "MIT", + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "6.3.4", + "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-6.3.4.tgz", + "integrity": "sha512-kDoUlppczVyCUTFthF6cHmPzMBYqNZQhu9j6EyIX/YIdM9j9CZNZoJUjzVw7/1v1VO8WwVMmPp15r/uwIAS0AQ==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^8.0.1", + "@ant-design/icons-svg": "^4.6.0", + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.6.0.tgz", + "integrity": "sha512-PRomU725ABMf/lnQp5HiB7my1kjEbFY0D10N4lXYxK6TIB1gKjIVD5MRThpDaezLgw1D774J8eOeeDB0M6wHrQ==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-2.0.0.tgz", + "integrity": "sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "clsx": "^2.1.1", + "json2mq": "^0.2.0", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@napi-rs/canvas": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas/-/canvas-1.0.9.tgz", + "integrity": "sha512-QviPdJImDi/jMAvBfqaw+19BndMd/sizXVW3NnpMd3VJGz++QXkOHcP9kWR/smHG0hNjHeyuHFyrx/5lD0oNcQ==", + "license": "MIT", + "optional": true, + "workspaces": [ + "e2e/*" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "1.0.9", + "@napi-rs/canvas-darwin-arm64": "1.0.9", + "@napi-rs/canvas-darwin-x64": "1.0.9", + "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.9", + "@napi-rs/canvas-linux-arm64-gnu": "1.0.9", + "@napi-rs/canvas-linux-arm64-musl": "1.0.9", + "@napi-rs/canvas-linux-riscv64-gnu": "1.0.9", + "@napi-rs/canvas-linux-x64-gnu": "1.0.9", + "@napi-rs/canvas-linux-x64-musl": "1.0.9", + "@napi-rs/canvas-win32-arm64-msvc": "1.0.9", + "@napi-rs/canvas-win32-x64-msvc": "1.0.9" + } + }, + "node_modules/@napi-rs/canvas-android-arm64": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.9.tgz", + "integrity": "sha512-4LGXk2/0HVzE29K8SzML5WubgCp++B1FH3qgl35XmSZE+lLdr6P9VRQEnZ0MCLZMTSuJP41yyhtoiVNEuvrTIA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-darwin-arm64": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.9.tgz", + "integrity": "sha512-YNdfLBzY0W/Pep9fo2L6RmoNlNksnn05LRnX66W63R3ij58S25QOTcjdtEt2v8+PnCESzqZsYzUo+QPeIR44NA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-darwin-x64": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.9.tgz", + "integrity": "sha512-ceZQSknTEcy3dOXoekv59LTCkXjvnLsq+VW5PeNNDHEPQbRS5Ervkm1EaDa7WLAjiYWMLuSQTRTHao1dEX4prg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.9.tgz", + "integrity": "sha512-XhfI0Wwv4llhd6nnWDtY3kQKjq0r+y1i91PlJlJI24ag2U9WrnwbG1qS3+fDLEyouwEVFchiKkTEHozK+5iUNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-gnu": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.9.tgz", + "integrity": "sha512-012oiYtKaE7i9oxc8q7nraT7kDOpLcaCmFLzVe9Ty34RHDdoDzbWLrVh827CNxYh/EADX1eSikA3ymLjo/nNuw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-musl": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.9.tgz", + "integrity": "sha512-Ls5UWYFFn63casTZEczbeyEg3vRDRkv9lscuGwfchtY5yLLQhgOB8SN4YGxmfJ5vTaBwZ2YUxBS3NtmjJmFXdA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.9.tgz", + "integrity": "sha512-hLKEGxV7ZiRHqndePTokgDMdBlo/rDfzg7P4p4QIv9pUhuYobnu3R2NIFLCRghG0nwfo+s2sw+c1xZFeCmEAsw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-gnu": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.9.tgz", + "integrity": "sha512-6kaz3w0QMy77PDWk6rJ1ksIihdad3qzEyX2o2oGT8GwCaypfT5mhjr8buOO5hstyLxcWXDScuz56RsINLtBPIQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-musl": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.9.tgz", + "integrity": "sha512-xrGvmS3v55hmZ86ls/kBLVNMUTYio3f6Ik0DireemG994VfPAwiA3ZXA0Uf1bByctkB3NQ1Sfb+H5bkdUnnzfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-arm64-msvc": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.9.tgz", + "integrity": "sha512-yjmVS3ArZeRVCP7jqbPq4rpZa/BhTeI7ELE2XqJg3snICQBDevLZyArxswHkiTnT34KRic33/4fLirrHI+SY8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-x64-msvc": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.9.tgz", + "integrity": "sha512-QlSYQdMQslB81nlABo9wNfQ6npFhE7/O+saCZdqVGueGanyRk4jCogD5EwQenfP3kIq9e+mm6GreQBjX5MrA8g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.148.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.148.0.tgz", + "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-6.0.0.tgz", + "integrity": "sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/cascader": { + "version": "1.22.0", + "resolved": "https://registry.npmmirror.com/@rc-component/cascader/-/cascader-1.22.0.tgz", + "integrity": "sha512-SffrA57aS9oub3VuI7ajPhJTPtaNxngSvtRhD40Rd8dwJ5vfWPSrVanWgeepdWFGBt7EHftIK5RUU0u3rCTwWw==", + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.10.0", + "@rc-component/tree": "~1.4.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/checkbox": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@rc-component/checkbox/-/checkbox-2.0.0.tgz", + "integrity": "sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/collapse": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@rc-component/collapse/-/collapse-1.2.0.tgz", + "integrity": "sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-3.1.1.tgz", + "integrity": "sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^3.0.1", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-2.0.2.tgz", + "integrity": "sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/dialog": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/@rc-component/dialog/-/dialog-1.10.0.tgz", + "integrity": "sha512-eDukNlz9vNszAGv7i3zKXdxEd3wgVmNxuJijYt8zvTh17QwTu8KK/bdURRd/lU4qaMzhO1HKKmMrwOnkaw0BvQ==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.3.3", + "@rc-component/portal": "^2.1.0", + "@rc-component/util": "^1.9.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/drawer": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/@rc-component/drawer/-/drawer-1.4.2.tgz", + "integrity": "sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.1.3", + "@rc-component/util": "^1.9.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/dropdown": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rc-component/dropdown/-/dropdown-1.0.3.tgz", + "integrity": "sha512-YTST/N6kpqpDz3IMuM/PSSZnrDpSOA6dgHv12gPA90ZTSLv2CoqkZ0+9NtwTY6BeO7dstPblSic2QJg7dSFy/g==", + "license": "MIT", + "dependencies": { + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/@rc-component/form": { + "version": "1.8.6", + "resolved": "https://registry.npmmirror.com/@rc-component/form/-/form-1.8.6.tgz", + "integrity": "sha512-1EXVsSKPZC6kGrIqxVck7kAWM6T65b6et/n5wIcyiaIa41VrDshD0nVLHoBDEIZr2ATQsOP6icb4XQkNFMLBAw==", + "license": "MIT", + "dependencies": { + "@rc-component/async-validator": "^6.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/image": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/@rc-component/image/-/image-1.10.0.tgz", + "integrity": "sha512-BjeZCRQ+hw+4WAhvrw8rJvy5fckA2xpf/X2XQEOABUHvLTNB9inB98X3Mp54jYQ7g10DfWERQWHXeC4ylxp1Uw==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.0.0", + "@rc-component/portal": "^2.1.2", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/input": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@rc-component/input/-/input-1.3.1.tgz", + "integrity": "sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==", + "license": "MIT", + "dependencies": { + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@rc-component/input-number": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/@rc-component/input-number/-/input-number-1.6.2.tgz", + "integrity": "sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==", + "license": "MIT", + "dependencies": { + "@rc-component/mini-decimal": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/listy": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/@rc-component/listy/-/listy-1.2.3.tgz", + "integrity": "sha512-IXiMjV5s0rczLBlfh7G5nB4M3365mrEeedjwKtf5I+Ns3PqRUsebR2h5u8CeFarsVfLUPC2I5p0h09TNoOWyvQ==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.0.0", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.3.1", + "@rc-component/virtual-list": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/mentions": { + "version": "1.12.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mentions/-/mentions-1.12.0.tgz", + "integrity": "sha512-v5MBx8zDcqCT+uybJgKpcx3Fgrvj0m3u+A/15RlSBaMx12lLoJZTTYggC3pbYYfohcKujWWUyBz6O6Gp2vGiNA==", + "license": "MIT", + "dependencies": { + "@rc-component/input": "~1.3.1", + "@rc-component/menu": "~1.5.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/menu": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@rc-component/menu/-/menu-1.5.0.tgz", + "integrity": "sha512-RjvzPsZkwVEg3xu+/jDDqDeUCBJAnWylONFlGeQgg5enlNAnlpybqhaMGE/UPEIvr6hL90PGhjFBguJqj0Qb2Q==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.4.tgz", + "integrity": "sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/motion": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/@rc-component/motion/-/motion-1.3.3.tgz", + "integrity": "sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz", + "integrity": "sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/notification": { + "version": "2.0.8", + "resolved": "https://registry.npmmirror.com/@rc-component/notification/-/notification-2.0.8.tgz", + "integrity": "sha512-MTRA3b8eHE14gh5R9nlXzbWZEDEBFVkEHj/FI1VOXw2zrSnSxqbuuU3drsq+k53e6MHwtegoFay1tnNYhtl61Q==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/overflow": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/overflow/-/overflow-1.0.1.tgz", + "integrity": "sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/pagination": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@rc-component/pagination/-/pagination-1.4.0.tgz", + "integrity": "sha512-CW1g7P9V8u+e8JQdUsl2RWg+GCsoee0mtJjZUCCxn/vb3jzOwDKm6hAdwddHCVBfWJ58eGUBZz3IvnU8rRktjw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/picker": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@rc-component/picker/-/picker-1.12.2.tgz", + "integrity": "sha512-ZB1A+tzTQkgtR4flPrAMvxIAOelIIOOOsp22fU2Nad6PbZcJacnyGJUJqUH7ZS9mwxeUwurf1pLMKXrVsK1tlA==", + "license": "MIT", + "dependencies": { + "@rc-component/overflow": "^1.0.0", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/trigger": "^3.6.15", + "@rc-component/util": "^1.13.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/@rc-component/portal": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-2.2.1.tgz", + "integrity": "sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/progress": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rc-component/progress/-/progress-1.0.3.tgz", + "integrity": "sha512-Q1nPLIvKr95el/q76yaBh5nv1hqCsWaHQb8U7vXEDMefEhHgM7n3CPoN+o4LHnTyANQHmMFgoS/naAT4Bhxuaw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-2.0.0.tgz", + "integrity": "sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/rate": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/rate/-/rate-1.0.1.tgz", + "integrity": "sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/resize-observer": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz", + "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/segmented": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@rc-component/segmented/-/segmented-1.3.0.tgz", + "integrity": "sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@rc-component/select": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@rc-component/select/-/select-1.10.1.tgz", + "integrity": "sha512-H+yQsl+qED9NilQ3g6zdpsMwUgwVjrcMTkNHAWRVU/MoNCYgTbDgU+MIMgZDK+rVdd2JUfI/MkysMcZZ0cyQKw==", + "license": "MIT", + "dependencies": { + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/slider": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@rc-component/slider/-/slider-1.1.1.tgz", + "integrity": "sha512-LSzgWGYDgeCDgR4r1XlU29gbYws6HpLnvJd/uMhLeW/vQgxldeR+Wb4uzHDCHiYEbr1bnEHWdjkPxjJRHxuiig==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/steps": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/@rc-component/steps/-/steps-1.2.3.tgz", + "integrity": "sha512-/b9gHcvDGjTDWJZW7+1kKFvzs0jrEeQ8mFvvIgX+h7xNT0FsOYODJYKjyJR4fPbvMBCfCOEqaBK66HBxov5BQA==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/switch": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rc-component/switch/-/switch-1.0.3.tgz", + "integrity": "sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/table": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@rc-component/table/-/table-1.11.1.tgz", + "integrity": "sha512-OWdS6DMmeWb7bJBGqPxYZpQbzBlBiXZUu2sqo6Ii7Sjs9GeK1IsrXrWk26SL2c6KEseabswdxrRj7WUm9LdECw==", + "license": "MIT", + "dependencies": { + "@rc-component/context": "^2.0.1", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/tabs": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/@rc-component/tabs/-/tabs-1.13.0.tgz", + "integrity": "sha512-3FXr+9ZII8tFLWuDWrgjRaxZd2mazkKJAGRFEfVmp4r1qnBglOlxQ78l54Td1aj6/iFaaEReKSAF2HToztU5uw==", + "license": "MIT", + "dependencies": { + "@rc-component/dropdown": "~1.0.0", + "@rc-component/menu": "~1.5.0", + "@rc-component/motion": "^1.1.3", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tooltip": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/@rc-component/tooltip/-/tooltip-1.5.2.tgz", + "integrity": "sha512-VLq4BclU3LgRe46g2hTr2bdsM8tFYs7dVwpuD88rPNNg4lCGe8mBSS4FiRzYzS+ffnZ46y4SI8KYKo9K7qBnhw==", + "license": "MIT", + "dependencies": { + "@rc-component/trigger": "^3.10.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-2.4.0.tgz", + "integrity": "sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==", + "license": "MIT", + "dependencies": { + "@rc-component/portal": "^2.2.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.7.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tree": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@rc-component/tree/-/tree-1.4.0.tgz", + "integrity": "sha512-dGsJGDJQedA0BqqVgj3F8BvHXTSZijyhTXdbAdkcx8lynzZkty/CV3Z3LOm/fxz+BCfl3dfGiAQpb7Q5XNvl0Q==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.0.0", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/tree-select": { + "version": "1.16.1", + "resolved": "https://registry.npmmirror.com/@rc-component/tree-select/-/tree-select-1.16.1.tgz", + "integrity": "sha512-a1Oi6EJhqAhdOxxupdJi6fP0RPHMKn5TcfkX2+llaQ4lF4nwfH7b6SCHcnsybaa2s+pk1yZYwVyeOYkDnEBRdg==", + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.10.0", + "@rc-component/tree": "~1.4.0", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/trigger": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-3.10.1.tgz", + "integrity": "sha512-mXlDN0IXdtV8Yqqm8195ECCyrbmfvvfKvwVvSlH0+qvKD6BUF8gRhEjSy0FOcD1+CcDRHgTiX99LoxfQrmh3Cw==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.3.3", + "@rc-component/portal": "^2.2.1", + "@rc-component/resize-observer": "^1.1.2", + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/upload": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@rc-component/upload/-/upload-1.1.1.tgz", + "integrity": "sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.11.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/util": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/@rc-component/util/-/util-1.13.0.tgz", + "integrity": "sha512-IXf2zBfZrbQGT+G8LxnoICDBGnMHIPIiq5HCRn3EDfKUx28x1rnbZBj46ULJf4sM8ImTG1SepqfNBdxZziqQ4w==", + "license": "MIT", + "dependencies": { + "is-mobile": "^5.0.0", + "react-is": "^19.2.7" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/virtual-list": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@rc-component/virtual-list/-/virtual-list-1.5.1.tgz", + "integrity": "sha512-boqHxdtyWC88u8quYgEO49bcBy5fzRiOcnBge+N4nLzs2k8hUQ/yw7JE9dM6yCBE4jSm5YSHVCVMS+suBuJGKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^8.0.0", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/virtual-list/node_modules/@babel/runtime": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-8.0.0.tgz", + "integrity": "sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", + "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", + "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", + "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", + "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", + "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", + "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", + "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/localforage": { + "version": "0.0.34", + "resolved": "https://registry.npmmirror.com/@types/localforage/-/localforage-0.0.34.tgz", + "integrity": "sha512-tJxahnjm9dEI1X+hQSC5f2BSd/coZaqbIl1m3TCl0q9SVuC52XcXfV0XmoCU1+PmjyucuVITwoTnN8OlTbEXXA==", + "deprecated": "This is a stub types definition for localforage (https://github.com/localForage/localForage). localforage provides its own type definitions, so you don't need @types/localforage installed!", + "license": "MIT", + "dependencies": { + "localforage": "*" + } + }, + "node_modules/@types/node": { + "version": "26.4.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-26.4.1.tgz", + "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version is no longer supported, please update to at least 0.8.*", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/antd": { + "version": "6.6.2", + "resolved": "https://registry.npmmirror.com/antd/-/antd-6.6.2.tgz", + "integrity": "sha512-aTOPWXsqfWrlSiI0a1qR9UWR4jBCTJ8FNZfZmYQP9/aGGLJSrw9/c5uE+4vSVSt3riQlIPAwR3BcAgEHmE7GMg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^8.0.1", + "@ant-design/cssinjs": "^2.1.2", + "@ant-design/cssinjs-utils": "^2.1.2", + "@ant-design/fast-color": "^3.0.1", + "@ant-design/icons": "^6.3.2", + "@ant-design/react-slick": "~2.0.0", + "@babel/runtime": "^7.29.2", + "@rc-component/cascader": "~1.22.0", + "@rc-component/checkbox": "~2.0.0", + "@rc-component/collapse": "~1.2.0", + "@rc-component/color-picker": "~3.1.1", + "@rc-component/dialog": "~1.10.0", + "@rc-component/drawer": "~1.4.2", + "@rc-component/dropdown": "~1.0.3", + "@rc-component/form": "~1.8.6", + "@rc-component/image": "~1.10.0", + "@rc-component/input": "~1.3.1", + "@rc-component/input-number": "~1.6.2", + "@rc-component/listy": "~1.2.3", + "@rc-component/mentions": "~1.12.0", + "@rc-component/menu": "~1.5.0", + "@rc-component/motion": "^1.3.3", + "@rc-component/mutate-observer": "^2.0.1", + "@rc-component/notification": "~2.0.8", + "@rc-component/pagination": "~1.4.0", + "@rc-component/picker": "~1.12.0", + "@rc-component/progress": "~1.0.3", + "@rc-component/qrcode": "~2.0.0", + "@rc-component/rate": "~1.0.1", + "@rc-component/resize-observer": "^1.1.2", + "@rc-component/segmented": "~1.3.0", + "@rc-component/select": "~1.10.1", + "@rc-component/slider": "~1.1.1", + "@rc-component/steps": "~1.2.3", + "@rc-component/switch": "~1.0.3", + "@rc-component/table": "~1.11.1", + "@rc-component/tabs": "~1.13.0", + "@rc-component/tooltip": "~1.5.2", + "@rc-component/tour": "~2.4.0", + "@rc-component/tree": "~1.4.0", + "@rc-component/tree-select": "~1.16.1", + "@rc-component/trigger": "^3.10.1", + "@rc-component/upload": "~1.1.1", + "@rc-component/util": "^1.12.0", + "clsx": "^2.1.1", + "dayjs": "^1.11.11", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "15.0.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.50.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/epubjs": { + "version": "0.3.93", + "resolved": "https://registry.npmmirror.com/epubjs/-/epubjs-0.3.93.tgz", + "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", + "license": "BSD-2-Clause", + "dependencies": { + "@types/localforage": "0.0.34", + "@xmldom/xmldom": "^0.7.5", + "core-js": "^3.18.3", + "event-emitter": "^0.3.5", + "jszip": "^3.7.1", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "marks-pane": "^1.0.9", + "path-webpack": "0.0.3" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-mobile": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-mobile/-/is-mobile-5.0.0.tgz", + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/jszip": { + "version": "3.10.2", + "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.2.tgz", + "integrity": "sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/katex": { + "version": "0.18.6", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.18.6.tgz", + "integrity": "sha512-5B7yiIsr7gq9hlIH6uG7hTNglHSz7I+Csa9I66dK4Ljz/YEGQMoBcC1IwtFFp34I7byBcEPtCyYFNnzuxZnGlw==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^15.0.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage/node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/marks-pane": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/marks-pane/-/marks-pane-1.0.9.tgz", + "integrity": "sha512-Ahs4oeG90tbdPWwAJkAAoHg2lRR8lAs9mZXETNPO9hYg3AkjUJBKi1NQ4aaIQZVGrig7c/3NUV1jANl8rFTeMg==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/path-webpack": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/path-webpack/-/path-webpack-0.0.3.tgz", + "integrity": "sha512-AmeDxedoo5svf7aB3FYqSAKqMxys014lVKBzy1o/5vv9CtU7U4wgGWL1dA2o6MOzcD53ScN4Jmiq6VbtLz1vIQ==", + "license": "MIT" + }, + "node_modules/pdfjs-dist": { + "version": "6.3.289", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-6.3.289.tgz", + "integrity": "sha512-ZHjSVpDa3D6izMq8/04lvkhkATUmL9px6ChPaXc1k6nU2Mrhlg1/7F0bdUqCwUjw3NsPTfPZsMDUU6ZIcRaeQw==", + "license": "Apache-2.0", + "engines": { + "node": ">=22.13.0 || >=24" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^1.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rolldown": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.2.7.tgz", + "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.148.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.7", + "@rolldown/binding-android-arm64": "1.2.7", + "@rolldown/binding-darwin-arm64": "1.2.7", + "@rolldown/binding-darwin-x64": "1.2.7", + "@rolldown/binding-freebsd-x64": "1.2.7", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", + "@rolldown/binding-linux-arm64-gnu": "1.2.7", + "@rolldown/binding-linux-arm64-musl": "1.2.7", + "@rolldown/binding-linux-ppc64-gnu": "1.2.7", + "@rolldown/binding-linux-s390x-gnu": "1.2.7", + "@rolldown/binding-linux-x64-gnu": "1.2.7", + "@rolldown/binding-linux-x64-musl": "1.2.7", + "@rolldown/binding-openharmony-arm64": "1.2.7", + "@rolldown/binding-win32-arm64-msvc": "1.2.7", + "@rolldown/binding-win32-x64-msvc": "1.2.7" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmmirror.com/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..dd25245 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,30 @@ +{ + "name": "math-learning-frontend", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "predev": "node scripts/copy-pdfjs-wasm.mjs", + "dev": "vite", + "prebuild": "node scripts/copy-pdfjs-wasm.mjs", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons": "^6.3.4", + "antd": "^6.6.2", + "epubjs": "^0.3.93", + "katex": "^0.18.6", + "pdfjs-dist": "^6.3.289", + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/node": "^26.4.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^6.1.1", + "typescript": "^7.0.2", + "vite": "^8.2.2" + } +} diff --git a/frontend/public/pdfjs-wasm/jbig2.wasm b/frontend/public/pdfjs-wasm/jbig2.wasm new file mode 100644 index 0000000..254e1e4 Binary files /dev/null and b/frontend/public/pdfjs-wasm/jbig2.wasm differ diff --git a/frontend/public/pdfjs-wasm/jbig2_nowasm_fallback.js b/frontend/public/pdfjs-wasm/jbig2_nowasm_fallback.js new file mode 100644 index 0000000..c86528f --- /dev/null +++ b/frontend/public/pdfjs-wasm/jbig2_nowasm_fallback.js @@ -0,0 +1,15 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function JBig2(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(ha){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;s=s>>>0;if(q+s>a.length)throw"trap: invalid memory.fill";a.fill(u,q,q+s)}function ga(n){var v=new ArrayBuffer(16777216);var w=new Int8Array(v);var x=new Int16Array(v);var y=new Int32Array(v);var z=new Uint8Array(v);var A=new Uint16Array(v);var B=new Uint32Array(v);var C=new Float32Array(v);var D=new Float64Array(v);var E=Math.imul;var F=Math.fround;var G=Math.abs;var H=Math.clz32;var I=Math.min;var J=Math.max;var K=Math.floor;var L=Math.ceil;var M=Math.trunc;var N=Math.sqrt;var O=n.a;var P=O.a;var Q=O.b;var R=O.c;var S=O.d;var T=O.e;var U=O.f;var V=O.g;var W=O.h;var X=O.i;var Y=72736;var Z=0; +// EMSCRIPTEN_START_FUNCS +function yc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,u=0,v=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;J=Y-16|0;Y=J;a:{b:{c:{d:{c=y[a+4>>2];b=y[c+8>>2];i=y[c+4>>2];e:{if(b>>>0>i>>>0){break e}if((b|0)==(i|0)){aa=2;break c}R=a+80|0;while(1){if(b>>>0>i>>>0){break e}if(i-b>>>0<11){break c}f:{g:{h:{m=y[R>>2];i:{if(!m){b=na(72);w[b+4|0]=0;y[b>>2]=0;t(b+8|0,0,64);y[J+4>>2]=0;ib(R,b);ac(J+4|0);j:{c=y[a+80>>2];k:{if(ra(y[a+4>>2],c)){break k}if(va(y[a+4>>2],c+4|0)){break k}b=y[a+4>>2];d=y[b+8>>2];g=y[b>>2];l:{m:{if(B[b+4>>2]<=d>>>0){w[J+15|0]=0;break m}d=z[d+g|0];w[J+15|0]=d;if(d>>>0<224){break m}if(ra(b,c+8|0)){break k}b=y[c+8>>2]&536870911;y[c+8>>2]=b;if(b>>>0>64){break k}g=y[a+4>>2];i=y[g+8>>2];d=i+(b+8>>>3|0)|0;if(d>>>0>>0){break l}h=g;g=y[g+4>>2];y[h+8>>2]=d>>>0>>0?d:g;break l}if(va(b,J+15|0)){break k}b=z[J+15|0]>>>5|0;y[c+8>>2]=b}g=z[c+4|0];n:{if(!b){break n}d=y[c>>2];xc(c+12|0,b);b=0;d=(d>>>0>65536?4:d>>>0>256?2:1)-1|0;while(1){if(y[c+8>>2]<=(b|0)){break n}o:{p:{switch(d-1|0){default:if(va(y[a+4>>2],J+15|0)){break k}m=z[J+15|0];y[y[c+12>>2]+(b<<2)>>2]=m;break o;case 0:if(Wa(y[a+4>>2],J+12|0)){break k}m=A[J+12>>1];y[y[c+12>>2]+(b<<2)>>2]=m;break o;case 1:break e;case 2:break p}}if(ra(y[a+4>>2],J+8|0)){break k}m=y[J+8>>2];y[y[c+12>>2]+(b<<2)>>2]=m}b=b+1|0;if(B[c>>2]>m>>>0){continue}break}break k}b=y[a+4>>2];q:{if(!(g&64)){if(va(b,J+15|0)){break k}y[c+24>>2]=z[J+15|0];break q}if(ra(b,c+24|0)){break k}}if(!ra(y[a+4>>2],c+28|0)){break j}}ib(R,0);break i}b=y[a+4>>2];d=y[b+20>>2];y[c+40>>2]=y[b+16>>2];y[c+44>>2]=d;b=y[b+8>>2];y[c+48>>2]=1;y[c+36>>2]=b;y[a+84>>2]=b;m=y[a+80>>2]}r:{while(1){h=0;c=0;f=Y-368|0;Y=f;b=2;s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{d=z[m+4|0]&63;switch(d-16|0){case 0:break T;case 1:case 2:case 3:case 5:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 25:case 28:case 29:case 30:case 31:break B;case 4:case 6:case 7:break S;case 20:case 22:case 23:break R;case 24:case 26:case 27:break Q;case 32:break P;case 33:break O;case 34:break N;case 35:break u;case 36:break M;case 37:break L;default:break U}}V:{switch(d|0){case 0:b=0;s=0;F=0;N=0;e=Y-272|0;Y=e;l=1;if(!Wa(y[a+4>>2],e+118|0)){j=na(56);y[j+40>>2]=0;y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;h=A[e+118>>1];c=h&1;w[j|0]=c;d=h>>>10&3;w[j+3|0]=d;g=h&12288;w[j+2|0]=(g|0)!=0;i=(h&254)>>>1&1;w[j+1|0]=i;Q=j+16|0;W:{X:{Y:{if(!c){c=d?2:8;d=j+44|0;while(1){if((b|0)!=(c|0)){g=b+d|0;b=b+1|0;if(!va(y[a+4>>2],g)){continue}break W}break}if(z[j+1|0]!=1){break X}if(!z[j+2|0]){break Y}break X}if(g|!i){break X}}c=j+52|0;b=0;while(1){if((b|0)==4){break X}d=b+c|0;b=b+1|0;if(!va(y[a+4>>2],d)){continue}break}break W}if(ra(y[a+4>>2],j+12|0)){break W}if(ra(y[a+4>>2],j+8|0)|B[j+12>>2]>65535|B[j+8>>2]>65535){break W}b=y[m+8>>2];i=(b|0)>0?b:0;b=0;while(1){if((b|0)==(i|0)){c=1;k=0;b=0;while(1)if((b|0)==(i|0)){Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{if(!(c&1)){break fa}y[j+4>>2]=k;U=Ub(e+104|0,k);n=y[U>>2];ga:{if((n|0)==y[U+4>>2]){break ga}b=y[m+8>>2];q=(b|0)>0?b:0;c=1;k=0;while(1){if((q|0)==(F|0)){break ga}ha:{b=Ma(a,y[y[m+12>>2]+(F<<2)>>2]);if(z[b+4|0]&63){break ha}b=y[b+56>>2];g=y[b+24>>2];d=y[b+28>>2]-g>>2;b=0;while(1){if((b|0)==(d|0)){g=0;i=0;if(c&1){b=d+k|0;g=b>>>0>=d>>>0;i=g?b:0}k=i;c=g;break ha}i=b+k|0;if(!(i>>>0>=b>>>0&c)){break fa}y[n+(i<<2)>>2]=y[g+(b<<2)>>2];b=b+1|0;continue}}F=F+1|0;continue}}bb(Q,U);ia:{if(z[j|0]!=1){break ia}b=h>>>2&3;if((b|0)==2){break Z}d=h>>>4&3;if((d|0)==2){break Z}ja:{ka:{switch(b|0){case 0:c=sa(a,4);b=0;break ja;case 1:c=sa(a,5);b=0;break ja;default:break ka}}b=Ga(a,m,0);if(!b){break Z}c=y[b+68>>2];b=1}y[j+28>>2]=c;la:{ma:{switch(d|0){case 0:c=sa(a,2);break la;case 1:c=sa(a,3);break la;default:break ma}}c=Ga(a,m,b);if(!c){break Z}b=b+1|0;c=y[c+68>>2]}y[j+32>>2]=c;na:{if(!(h&64)){c=sa(a,1);break na}c=Ga(a,m,b);if(!c){break Z}b=b+1|0;c=y[c+68>>2]}y[j+36>>2]=c;if(z[j+1|0]!=1){break ia}oa:{if(!(h&128)){b=sa(a,1);break oa}b=Ga(a,m,b);if(!b){break Z}b=y[b+68>>2]}y[j+40>>2]=b}W=z[j+1|0];V=z[j|0];b=z[j+3|0];c=z[j+2|0];y[e+100>>2]=0;y[e+92>>2]=0;y[e+96>>2]=0;y[e+88>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;c=c?1024:8192;b=b?(b|0)==1?8192:1024:65536;pa:{if(!(!(h&256)|!s)){if(!(V&1)){d=Sb(e+92|0,y[s+56>>2]);if((b|0)!=y[e+96>>2]-y[d>>2]>>3){break _}}if(!(W&1)){break pa}b=Sb(e+80|0,y[s+56>>2]+12|0);if((c|0)==y[e+84>>2]-y[b>>2]>>3){break pa}break _}if(!(V&1)){kb(e+92|0,b)}if(!(W&1)){break pa}kb(e+80|0,c)}b=y[m+44>>2];d=b;c=y[m+40>>2];y[e+64>>2]=c;y[e+68>>2]=b;g=y[m+36>>2];y[e+72>>2]=g;y[m+52>>2]=2;qa:{if(!(b|c)|z[a+48|0]!=1){break qa}i=y[a+108>>2];b=i;while(1){b=y[b+4>>2];if((i|0)==(b|0)){break qa}if((c|0)!=y[b+8>>2]|(d|0)!=y[b+12>>2]|(g|0)!=y[b+16>>2]){continue}break}c=Ad(y[b+24>>2]);y[e+120>>2]=0;Rb(m+56|0,c);Za(e+120|0);zd(y[a+108>>2],e- -64|0,b+24|0);c=y[a+108>>2];d=y[b>>2];g=y[b+4>>2];y[d+4>>2]=g;y[g>>2]=d;y[c+8>>2]=y[c+8>>2]-1;oc(b);break aa}if(!(V&1)){u=Ra(y[a+4>>2]);y[e+60>>2]=u;I=y[e+92>>2];d=y[e+96>>2];C=y[e+80>>2];g=y[e+84>>2];ba=Fa();y[e+268>>2]=ba;ca=Fa();y[e+252>>2]=ca;da=Fa();y[e+248>>2]=da;ea=Fa();y[e+244>>2]=ea;i=y[j+8>>2]+y[j+4>>2]|0;b=0;while(1){c=b;b=b+1|0;if(i>>>0>1<>>0){continue}break}_=I+3240|0;S=g-C>>3;P=Cd(e+120|0,c&255);O=gb(e+256|0,y[j+8>>2]);G=d-I>>3;X=G>>>0>405;i=0;F=0;while(1){ra:{sa:{ta:{b=y[j+8>>2];if(b>>>0>i>>>0){y[e+240>>2]=0;Aa(ba,u,e+236|0);F=y[e+236>>2]+F|0;if(F>>>0>65535){break ta}K=0;while(1){ua:{l=Aa(ca,u,e+232|0);if(!l|B[j+8>>2]<=i>>>0){break ua}l=1;K=y[e+232>>2]+K|0;if(K>>>0>65535){break ua}if(!(!F|!K)){va:{wa:{xa:{ya:{za:{if(!z[j+1|0]){r=qb();y[e+228>>2]=r;y[r+8>>2]=F;y[r+4>>2]=K;w[r|0]=0;b=z[j+3|0];w[r+1|0]=0;w[r+2|0]=0;w[r+3|0]=b;w[r+16|0]=z[j+44|0];w[r+17|0]=z[j+45|0];w[r+18|0]=z[j+46|0];w[r+19|0]=z[j+47|0];w[r+20|0]=z[j+48|0];w[r+21|0]=z[j+49|0];w[r+22|0]=z[j+50|0];w[r+23|0]=z[j+51|0];Aa:{switch(b|0){case 0:if(xd(r)){D=nc(r,u,I,G,0);break wa}D=mc(r,u,I,G,0);break wa;case 1:if(wd(r)){D=nc(r,u,I,G,1);break wa}D=mc(r,u,I,G,1);break wa;case 2:if(Qb(r)){D=nc(r,u,I,G,2);break wa}D=mc(r,u,I,G,2);break wa;default:break Aa}}if(!Qb(r)){break za}D=xa(K,F);y[e+160>>2]=D;if(!qa(D)){break ya}b=y[r+4>>2];if(!b){break fa}b=b-1|0;L=b>>>3|0;T=(b&7)+1|0;g=0;k=0;n=0;c=0;while(1){Ba:{Ca:{if(B[r+8>>2]>n>>>0){ja(e+192|0,D,n);h=y[e+196>>2];q=y[e+192>>2];if(z[r+1|0]!=1){b=c;break Ca}if(z[u|0]){break ya}if(!X){break fa}b=0;d=ka(u,_);if((d|0)==(c|0)){break Ca}y[e+184>>2]=h;y[e+180>>2]=q;y[e+172>>2]=k;y[e+168>>2]=g;b=y[e+184>>2];y[e+8>>2]=y[e+180>>2];y[e+12>>2]=b;b=y[e+172>>2];y[e>>2]=y[e+168>>2];y[e+4>>2]=b;Pa(e+8|0,e);c=c^d;break Ba}y[e+160>>2]=0;break xa}c=0;H=0;Da:{if(!n){Ea:{while(1){k=7;v=0;if((H|0)==(L|0)){break Ea}Fa:{while(1){if((k|0)>=0){if(z[u|0]){break Fa}if(c>>>0>=G>>>0){break fa}d=ka(u,(c<<3)+I|0);c=d|c<<1&1006;v=d<>>0>>0){break ya}}k=0;v=0;while(1){if((k|0)==(T|0)){break Da}if(z[u|0]){break ya}if(c>>>0>=G>>>0){break fa}d=ka(u,(c<<3)+I|0);c=d|c<<1&1006;v=d<<7-k|v;k=k+1|0;continue}}if(!k){break fa}$=k-1|0;H=z[g|0];k=H>>>1&112;d=0;while(1){Ga:{if((d|0)!=(L|0)){if((d|0)==($|0)){break fa}s=d+1|0;H=z[s+g|0]|H<<8;c=7;v=0;while(1){if((c|0)<0){break Ga}if(z[u|0]){break ya}if(k>>>0>=G>>>0){break fa}M=ka(u,(k<<3)+I|0);k=M|(H>>>c+1&16|k<<1&1006);v=M<>>0>=G>>>0){break fa}g=ka(u,(k<<3)+I|0);k=g|(d>>>8-c&16|k<<1&1006);v=g<<7-c|v;c=c+1|0;continue}break}break Da}if((d|0)==(h|0)){break fa}w[d+q|0]=v;d=s;continue}}if(h>>>0<=L>>>0){break fa}w[q+L|0]=v;c=b}n=n+1|0;g=q;k=h;continue}}Aa(da,u,e+180|0);d=y[e+180>>2];if(d>>>0>=2){g=wa(6);y[e+168>>2]=g;h=wa(8);y[e+160>>2]=h;k=wa(11);y[e+228>>2]=k;l=wa(15);y[e+224>>2]=l;n=wa(15);y[e+220>>2]=n;q=wa(15);y[e+216>>2]=q;s=wa(15);y[e+212>>2]=s;r=wa(1);y[e+208>>2]=r;c=Yb();y[e+204>>2]=c;b=z[j|0];y[c+20>>2]=1;y[c+16>>2]=d;y[c+12>>2]=F;y[c+8>>2]=K;w[c+1|0]=1;w[c|0]=b;b=y[j+4>>2]+i|0;y[c+24>>2]=b;d=Ub(e+192|0,b);b=y[j+4>>2];v=y[j+16>>2];if(b>>>0>y[j+20>>2]-v>>2>>>0){break fa}M=b;b=y[d>>2];vd(v,M,b,y[e+196>>2]-b>>2);v=b+(y[j+4>>2]<<2)|0;D=y[O>>2];b=0;while(1)if((b|0)==(i|0)){bb(c+40|0,d);x[c+4>>1]=0;y[c+52>>2]=0;y[c+56>>2]=1;w[c+3|0]=0;y[c+88>>2]=r;y[c+84>>2]=s;y[c+80>>2]=q;y[c+76>>2]=n;y[c+72>>2]=l;y[c+68>>2]=k;y[c+64>>2]=h;y[c+60>>2]=g;w[c+2|0]=z[j+2|0];w[c+92|0]=z[j+52|0];w[c+93|0]=z[j+53|0];w[c+94|0]=z[j+54|0];w[c+95|0]=z[j+55|0];b=Bd(c,u,C,S,P);y[e+176>>2]=0;oa(e+240|0,b);la(e+176|0);b=y[e+240>>2];ya(d);pc(e+204|0);pa(e+208|0);pa(e+212|0);pa(e+216|0);pa(e+220|0);pa(e+224|0);pa(e+228|0);pa(e+160|0);pa(e+168|0);if(!b){break ta}break va}else{H=b<<2;y[H+v>>2]=y[D+H>>2];b=b+1|0;continue}}b=0;if((d|0)!=1){break va}c=y[j+4>>2];Ac(y[P+36>>2],u,e+192|0);b=y[e+192>>2];if(b>>>0>=c+i>>>0){break ta}c=y[j+4>>2];if(c>>>0>b>>>0){b=y[Q>>2]+(b<<2)|0}else{b=b-c|0;c=y[O>>2];if(b>>>0>=y[O+4>>2]-c>>2>>>0){break fa}b=c+(b<<2)|0}c=y[b>>2];if(!c){break ta}Aa(y[P+28>>2],u,e+168|0);Aa(y[P+32>>2],u,e+160|0);b=db();y[e+228>>2]=b;y[b+8>>2]=F;y[b+4>>2]=K;d=z[j+2|0];y[b+20>>2]=c;w[b|0]=d;y[b+12>>2]=y[e+168>>2];c=y[e+160>>2];w[b+1|0]=0;y[b+16>>2]=c;w[b+24|0]=z[j+52|0];w[b+25|0]=z[j+53|0];w[b+26|0]=z[j+54|0];w[b+27|0]=z[j+55|0];b=cb(b,u,C,S);y[e+224>>2]=0;oa(e+240|0,b);la(e+224|0);b=y[e+240>>2];Ua(e+228|0);if(!b){break ta}break va}D=xa(K,F);y[e+160>>2]=D;Ha:{Ia:{if(!qa(D)){break Ia}n=0;Qa(D,0);h=0;c=0;b=0;while(1){Ja:{Ka:{if(B[r+8>>2]>b>>>0){ja(e+192|0,D,b);g=y[e+196>>2];q=y[e+192>>2];if(z[r+1|0]!=1){d=c;break Ka}if(z[u|0]){break Ia}if(!X){break fa}d=0;k=ka(u,_);if((k|0)==(c|0)){break Ka}y[e+184>>2]=g;y[e+180>>2]=q;y[e+172>>2]=h;y[e+168>>2]=n;d=y[e+184>>2];y[e+24>>2]=y[e+180>>2];y[e+28>>2]=d;d=y[e+172>>2];y[e+16>>2]=y[e+168>>2];y[e+20>>2]=d;c=c^k;D=y[e+160>>2];Pa(e+24|0,e+16|0);break Ja}y[e+160>>2]=0;break Ha}H=0;L=0;if(z[r+2|0]==1){ja(e+192|0,y[r+12>>2],b);L=y[e+192>>2];H=y[e+196>>2]}D=y[e+160>>2];ja(e+192|0,D,w[r+17|0]+b|0);T=y[e+196>>2];$=y[e+192>>2];s=z[n|0]>>>6|0;k=y[D+8>>2];c=!h|(k|0)<2?0:s&1;v=!h|(k|0)<=0?c:s&2|c;s=0;c=0;while(1){if(B[r+4>>2]<=c>>>0){c=d;break Ja}La:{Ma:{if(z[r+2|0]==1){if(ia(y[y[r+12>>2]+8>>2],c,L,H)){break Ma}}k=ia(k,w[r+16|0]+c|0,$,T);if(z[u|0]){break Ia}k=v<<5|k<<4|s;if(k>>>0>=G>>>0){break fa}M=ka(u,(k<<3)+I|0);k=y[D+8>>2];if(!M){break Ma}La(k,c,q,g,1);k=y[D+8>>2];M=1;break La}M=0}v=ia(k,c+2|0,n,h)|v<<1&30;c=c+1|0;s=s<<1&14|M;continue}}b=b+1|0;n=q;h=g;continue}}D=0}la(e+160|0);break wa}D=0}la(e+160|0)}y[e+192>>2]=0;oa(e+240|0,D);la(e+192|0);b=y[e+240>>2];ua(e+228|0);if(!b){break ua}}c=y[O>>2];y[e+240>>2]=0;oa((i<<2)+c|0,b)}i=i+1|0;continue}break}b=l^1;break sa}y[e+200>>2]=0;y[e+192>>2]=0;y[e+196>>2]=0;ud(e+192|0,b+y[j+4>>2]|0);g=y[e+192>>2];i=0;b=0;k=0;Na:{while(1){if(y[j+8>>2]+y[j+4>>2]>>>0>b>>>0){Aa(ea,u,e+160|0);d=y[e+160>>2];c=d+b|0;if(!(c>>>0<=y[j+8>>2]+y[j+4>>2]>>>0&c>>>0>=d>>>0)){break Na}Pb(e+180|0,g,0,b);sd(e+168|0,y[e+180>>2],y[e+184>>2],d,i);k=(i&1?d:0)+k|0;i=(i^-1)&1;b=c;continue}break}if(B[j+12>>2]>>0){break Na}N=lc();d=y[O>>2];b=0;l=0;while(1){c=y[j+4>>2];if(c+y[j+8>>2]>>>0<=b>>>0){break Na}if(!(!(y[g+(b>>>3&536870908)>>2]>>>b&1)|B[j+12>>2]<=l>>>0)){Oa:{if(b>>>0>>0){c=y[y[Q>>2]+(b<<2)>>2];if(!c){i=0;break Oa}i=kc(c);break Oa}c=d+(b-c<<2)|0;i=y[c>>2];y[c>>2]=0}rd(N,i);l=l+1|0}b=b+1|0;continue}}Ob(e+192|0);break ra}b=0}la(e+240|0);if(b){continue}}break}$a(O);qc(P);Ea(e+244|0);Ea(e+248|0);Ea(e+252|0);Ea(e+268|0);y[e+120>>2]=0;Rb(m+56|0,N);Za(e+120|0);if(y[m+56>>2]){ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){g=b;c=c+2|0;b=y[b+4>>2];y[g+8>>2]=b>>>0>c>>>0?c:b}ua(e+60|0);break ba}ua(e+60|0);break $}g=y[e+80>>2];b=y[e+84>>2];n=y[a+4>>2];q=qd(n);y[e+268>>2]=q;C=gb(e+120|0,y[j+8>>2]);y[e+264>>2]=0;y[e+256>>2]=0;y[e+260>>2]=0;if(!z[j+1|0]){xc(e+256|0,y[j+8>>2])}u=b-g>>3;y[e+252>>2]=0;s=0;d=0;Pa:while(1){if(B[j+8>>2]<=d>>>0){break da}if(za(q,y[j+28>>2],e+160|0)){break ea}s=y[e+160>>2]+s|0;if(s>>>0>65535){break ea}F=0;c=0;i=d;while(1){b=za(q,y[j+32>>2],e+248|0);y[e+244>>2]=b;Qa:{Ra:{Sa:{Ta:{Ua:{switch(b|0){case 0:if(B[j+8>>2]<=i>>>0){break ea}c=y[e+248>>2]+c|0;if(c>>>0>65535){break ea}if(!c|!s){break Qa}if(z[j+1|0]!=1){break Ra}if(za(q,y[j+40>>2],e+240|0)){break ea}oa(e+252|0,0);h=y[e+240>>2];if(h>>>0<2){break Ta}v=wa(6);y[e+236>>2]=v;D=wa(8);y[e+232>>2]=D;H=wa(11);y[e+228>>2]=H;I=wa(15);y[e+224>>2]=I;G=wa(15);y[e+220>>2]=G;K=wa(15);y[e+216>>2]=K;O=wa(15);y[e+212>>2]=O;b=1;P=wa(1);y[e+208>>2]=P;l=Yb();y[e+204>>2]=l;k=z[j|0];y[l+20>>2]=1;y[l+16>>2]=h;y[l+12>>2]=s;y[l+8>>2]=c;w[l+1|0]=1;w[l|0]=k;h=y[j+4>>2]+i|0;y[l+24>>2]=h;r=Ed(e+192|0,h);k=y[j+8>>2]+y[j+4>>2]|0;while(1){h=b;b=b+1|0;if(k>>>0>1<>>0){continue}break};h=h&255;k=y[r>>2];L=y[l+24>>2];b=0;while(1)if((b|0)==(L|0)){bb(l+28|0,r);h=Ub(e+180|0,y[l+24>>2]);b=y[j+4>>2];k=y[j+16>>2];if(b>>>0>y[j+20>>2]-k>>2>>>0){break fa}M=b;b=y[h>>2];vd(k,M,b,y[e+184>>2]-b>>2);L=b+(y[j+4>>2]<<2)|0;k=y[C>>2];b=0;while(1)if((b|0)==(i|0)){bb(l+40|0,h);x[l+4>>1]=0;y[l+52>>2]=0;y[l+56>>2]=1;w[l+3|0]=0;y[l+88>>2]=P;y[l+84>>2]=O;y[l+80>>2]=K;y[l+76>>2]=G;y[l+72>>2]=I;y[l+68>>2]=H;y[l+64>>2]=D;y[l+60>>2]=v;w[l+2|0]=z[j+2|0];w[l+92|0]=z[j+52|0];w[l+93|0]=z[j+53|0];w[l+94|0]=z[j+54|0];w[l+95|0]=z[j+55|0];b=Dd(l,n,g,u);y[e+176>>2]=0;oa(e+252|0,b);la(e+176|0);b=y[e+252>>2];ya(h);ya(r);pc(e+204|0);pa(e+208|0);pa(e+212|0);pa(e+216|0);pa(e+220|0);pa(e+224|0);pa(e+228|0);pa(e+232|0);pa(e+236|0);if(b){break Sa}break ea}else{N=b<<2;y[N+L>>2]=y[k+N>>2];b=b+1|0;continue}}else{N=k+(b<<3)|0;y[N+4>>2]=b;y[N>>2]=h;b=b+1|0;continue};case 1:break Ua;default:break ea}}Va:{if(!z[j+1|0]){if(za(q,y[j+36>>2],e+192|0)){break ea}ta(n);y[e+180>>2]=0;Wa:{if(!y[e+192>>2]){if((F|0)>65535){break Va}b=F+7>>>3|0;c=se(b,0,s);if(Z){break Va}h=y[n+4>>2];k=y[n+8>>2];if(h>>>0>>0){break fa}if(c>>>0>h-k>>>0){break Va}c=0;h=xa(F,s);y[e+248>>2]=0;oa(e+180|0,h);la(e+248|0);v=y[e+180>>2];while(1){if((c|0)==(s|0)){break Wa}ja(e+168|0,v,c);l=y[n+8>>2];h=y[n+4>>2];if(l>>>0>h>>>0|b>>>0>h-l>>>0|b>>>0>B[e+172>>2]){break fa}if(b){if(b){p(y[e+168>>2],y[n>>2]+l|0,b)}l=y[n+8>>2]}h=b+l|0;if(h>>>0>=l>>>0){k=y[n+4>>2];y[n+8>>2]=h>>>0>>0?h:k}c=c+1|0;continue}}b=qb();y[e+248>>2]=b;y[b+8>>2]=s;y[b+4>>2]=F;w[b|0]=1;hb(b,e+180|0,n);ta(n);ua(e+248|0);v=y[e+180>>2]}Xa:{if(!v){break Xa}c=d>>>0>i>>>0?d:i;h=y[C>>2];b=0;k=y[e+256>>2];while(1){if((c|0)==(d|0)){break Xa}l=d<<2;r=l+k|0;F=sb(v,b,0,y[r>>2],s);y[e+248>>2]=0;oa(h+l|0,F);d=d+1|0;la(e+248|0);b=y[r>>2]+b|0;continue}}la(e+180|0)}d=i;continue Pa}la(e+180|0);break ea}if((h|0)!=1){k=y[C>>2];b=y[e+252>>2];break Sa}r=y[j+8>>2]+y[j+4>>2]|0;b=1;l=1;while(1){k=b;b=b+1|0;h=l;l=h+1|0;if(r>>>0>1<>>0){continue}break}y[e+192>>2]=h;h=k&255;l=0;b=0;while(1){if((b|0)!=(h|0)){if(wb(n,e+192|0)){break ea}b=b+1|0;l=y[e+192>>2]|l<<1;continue}break}b=y[j+4>>2];if(b+i>>>0<=l>>>0){break ea}k=y[C>>2];if(b>>>0>l>>>0){b=y[Q>>2]+(l<<2)|0}else{b=l-b|0;if(b>>>0>=y[C+4>>2]-k>>2>>>0){break fa}b=(b<<2)+k|0}h=y[b>>2];if(!h){break ea}b=wa(15);y[e+180>>2]=b;l=wa(1);y[e+236>>2]=l;Ya:{if(za(q,b,e+232|0)){break Ya}if(za(q,b,e+228|0)){break Ya}if(za(q,l,e+244|0)){break Ya}ta(n);r=y[n+8>>2];y[e+192>>2]=r;b=db();y[e+224>>2]=b;y[b+8>>2]=s;y[b+4>>2]=c;l=z[j+2|0];y[b+20>>2]=h;w[b|0]=l;y[b+12>>2]=y[e+232>>2];h=y[e+228>>2];l=0;w[b+1|0]=0;y[b+16>>2]=h;w[b+24|0]=z[j+52|0];w[b+25|0]=z[j+53|0];w[b+26|0]=z[j+54|0];w[b+27|0]=z[j+55|0];h=Ra(n);y[e+220>>2]=h;b=cb(b,h,g,u);y[e+216>>2]=0;oa(e+252|0,b);la(e+216|0);b=y[e+252>>2];if(b){ta(n);l=y[n+8>>2];if(l>>>0<=4294967293){h=l+2|0;l=y[n+4>>2];l=h>>>0>>0?h:l;y[n+8>>2]=l}l=y[e+244>>2]==(l-r|0)}ua(e+220|0);Ua(e+224|0);pa(e+236|0);pa(e+180|0);if(l){break Sa}break ea}pa(e+236|0);pa(e+180|0);break ea}y[e+252>>2]=0;oa((i<<2)+k|0,b);if(z[j+1|0]){break Qa}}y[y[e+256>>2]+(i<<2)>>2]=c}F=c+F|0;i=i+1|0;continue}}}o()}b=0;break ca}i=wa(1);y[e+248>>2]=i;y[e+200>>2]=0;y[e+192>>2]=0;y[e+196>>2]=0;ud(e+192|0,y[j+8>>2]+y[j+4>>2]|0);g=y[e+192>>2];l=0;b=0;k=0;Za:{while(1){if(y[j+8>>2]+y[j+4>>2]>>>0>b>>>0){_a:{$a:{if(za(q,i,e+244|0)){break $a}d=y[e+244>>2];c=d+b|0;if(c>>>0>>0){break $a}if(c>>>0<=y[j+8>>2]+y[j+4>>2]>>>0){break _a}}b=0;break Za}Pb(e+180|0,g,0,b);sd(e+160|0,y[e+180>>2],y[e+184>>2],d,l);k=(l&1?d:0)+k|0;l=(l^-1)&1;b=c;continue}break}b=0;if(B[j+12>>2]>>0){break Za}b=lc();d=y[C>>2];l=0;i=0;while(1){c=y[j+4>>2];if(c+y[j+8>>2]>>>0<=l>>>0){break Za}if(!(!(y[g+(l>>>3&536870908)>>2]>>>l&1)|B[j+12>>2]<=i>>>0)){ab:{if(c>>>0>l>>>0){c=y[y[Q>>2]+(l<<2)>>2];if(!c){c=0;break ab}c=kc(c);break ab}h=d+(l-c<<2)|0;c=y[h>>2];y[h>>2]=0}rd(b,c);i=i+1|0}l=l+1|0;continue}}Ob(e+192|0);pa(e+248|0)}la(e+252|0);Ja(e+256|0);$a(C);Ua(e+268|0);y[e+120>>2]=0;Rb(m+56|0,b);Za(e+120|0);if(!y[m+56>>2]){break $}ta(y[a+4>>2])}if(z[a+48|0]!=1){break aa}fa=e,ga=Ad(y[m+56>>2]),y[fa+120>>2]=ga;b=y[a+108>>2];l=y[b+8>>2];while(1){if(l>>>0>=2){c=y[b>>2];d=y[c>>2];g=y[c+4>>2];y[d+4>>2]=g;y[g>>2]=d;y[b+8>>2]=y[b+8>>2]-1;oc(c);l=l-1|0;b=y[a+108>>2];continue}break}c=b;b=e+120|0;zd(c,e- -64|0,b);Za(b)}l=0;if(!(z[e+119|0]&2)){break _}if(!(V&1)){b=y[m+56>>2];y[e+48>>2]=y[e+92>>2];c=y[e+96>>2];d=y[e+100>>2];y[e+96>>2]=0;y[e+100>>2]=0;y[e+52>>2]=c;y[e+56>>2]=d;y[e+92>>2]=0;c=b;b=e+48|0;pd(c,b);Ja(b)}if(!(W&1)){break _}b=y[m+56>>2];y[e+36>>2]=y[e+80>>2];c=y[e+84>>2];d=y[e+88>>2];y[e+84>>2]=0;y[e+88>>2]=0;y[e+40>>2]=c;y[e+44>>2]=d;y[e+80>>2]=0;c=b+12|0;b=e+36|0;pd(c,b);Ja(b);break _}l=1}Ja(e+80|0);Ja(e+92|0)}ya(U);break W}else{d=Ma(a,y[y[m+12>>2]+(b<<2)>>2]);if(!(z[d+4|0]&63)){g=0;if(c&1){c=y[d+56>>2];c=y[c+28>>2]-y[c+24>>2]>>2;g=c+k|0;n=g;g=c>>>0<=g>>>0;k=g?n:0}else{k=0}s=d;c=g}b=b+1|0;continue}}c=b<<2;b=b+1|0;if(Ma(a,y[c+y[m+12>>2]>>2])){continue}break}}ya(Q);ma(j)}Y=e+272|0;b=l;break u;case 1:case 2:case 3:case 5:break B;case 4:case 6:case 7:break V;default:break K}}b=1;if(z[a+49|0]!=1){break u}if(tb(a,f+332|0)){break u}d=f+14|0;if(Wa(y[a+4>>2],d)){break u}c=y[f+332>>2];if(c-1>>>0>65534){break u}q=y[f+336>>2];if(q-1>>>0>65534){break u}h=Yb();y[f+308>>2]=h;y[h+12>>2]=q;y[h+8>>2]=c;c=A[f+14>>1];g=c&1;w[h|0]=g;w[h+2|0]=c>>>15;y[h+56>>2]=c>>>4&3;y[h+52>>2]=c>>>7&3;w[h+3|0]=c>>>6&1;w[h+4|0]=c>>>9&1;y[h+20>>2]=1<<(c>>>2&3);i=(c&254)>>>1&1;w[h+1|0]=i;k=c>>>10&31;w[h+5|0]=(k>>>0>15?-32:0)|k;bb:{if(g){if(Wa(y[a+4>>2],d)){break v}if(z[h+1|0]!=1){break w}if(!z[h+2|0]){break bb}break w}if(!i|c<<16>>16<0){break w}}c=h+92|0;d=0;while(1){if((d|0)==4){break w}g=c+d|0;d=d+1|0;if(!va(y[a+4>>2],g)){continue}break}break v}g=na(12);y[g+8>>2]=0;y[g>>2]=0;y[g+4>>2]=0;if(va(y[a+4>>2],f+352|0)){break y}b=1;if(va(y[a+4>>2],g+1|0)){break x}if(va(y[a+4>>2],g+2|0)){break x}if(ra(y[a+4>>2],g+4|0)){break x}i=y[g+4>>2];if(i>>>0>65535){break x}b=z[f+352|0];d=b&1;w[g|0]=d;b=b>>>1&3;w[g+8|0]=b;y[m+52>>2]=3;if(d){d=y[a+4>>2];b=wc(g);y[f+24>>2]=b;if(b){y[f+332>>2]=0;hb(b,f+332|0,d);cb:{d=y[f+332>>2];if(!d){break cb}c=vc(i+1|0);b=0;while(1){if(b>>>0>i>>>0){break cb}h=z[g+1|0];h=sb(d,E(h,b),0,h,z[g+2|0]);k=y[c+4>>2];y[f+312>>2]=0;oa((b<<2)+k|0,h);b=b+1|0;la(f+312|0);continue}}la(f+332|0)}ua(f+24|0);y[f+332>>2]=0;Xb(m+60|0,c);Zb(f+332|0);if(!y[m+60>>2]){break y}ta(y[a+4>>2]);b=0;break x}k=b?(b|0)==1?8192:1024:65536;l=ab(k,8);y[f+336>>2]=k;y[f+332>>2]=l;n=Ra(y[a+4>>2]);y[f+16>>2]=n;d=wc(g);y[f+312>>2]=d;if(!d){break z}w[d+1|0]=0;w[d+2|0]=0;w[d+3|0]=b;h=z[g+1|0];w[d+17|0]=0;w[d+16|0]=0-h;if(!b){w[d+22|0]=254;w[d+23|0]=254;w[d+18|0]=253;w[d+19|0]=255;w[d+20|0]=2;w[d+21|0]=254}y[f+356>>2]=0;y[f+40>>2]=0;y[f+32>>2]=l;y[f+36>>2]=k;y[f+28>>2]=n;y[f+24>>2]=f+356;b=Wb(d,f+24|0);y[f+40>>2]=0;while(1){if((b|0)==3){b=Vb(d,f+24|0);continue}break}y[d+44>>2]=0;y[d+48>>2]=0;y[d+36>>2]=0;y[d+40>>2]=0;y[d+28>>2]=0;y[d+32>>2]=0;if(!y[f+356>>2]){break A}c=vc(i+1|0);b=0;while(1){if(b>>>0>i>>>0){break A}d=sb(y[f+356>>2],E(b,h),0,h,z[g+2|0]);k=y[c+4>>2];y[f>>2]=0;oa((b<<2)+k|0,d);b=b+1|0;la(f);continue}}b=1;if(z[a+49|0]!=1){break u}q=na(56);y[q+16>>2]=0;db:{if(tb(a,f+312|0)){break db}if(va(y[a+4>>2],f+14|0)){break db}if(ra(y[a+4>>2],q+32|0)){break db}if(ra(y[a+4>>2],q+36|0)){break db}if(ra(y[a+4>>2],q+40|0)){break db}if(ra(y[a+4>>2],q+44|0)){break db}if(Wa(y[a+4>>2],q+48|0)){break db}if(Wa(y[a+4>>2],q+50|0)){break db}C=y[q+32>>2];if(C-1>>>0>65534){break db}e=y[q+36>>2];if(e-1>>>0>65534){break db}v=y[f+312>>2];if(v-1>>>0>65534){break db}k=y[f+316>>2];if(k-1>>>0>65534){break db}y[q+4>>2]=k;y[q>>2]=v;d=z[f+14|0];F=d&1;w[q+8|0]=F;w[q+20|0]=d>>>7;i=d>>>3|0;K=i&1;w[q+28|0]=K;s=d>>>1&3;w[q+9|0]=s;g=d>>>4|0;y[q+24>>2]=(g&7)==4?4:g&3;if(y[m+8>>2]!=1){break db}g=Ma(a,y[y[m+12>>2]>>2]);if(!g|(z[g+4|0]&63)!=16){break db}g=y[g+60>>2];if(!g){break db}j=y[g>>2];if(!j){break db}y[q+12>>2]=j;y[q+16>>2]=g+4;b=y[y[g+4>>2]>>2];g=y[b+8>>2];w[q+52|0]=g;r=y[b+12>>2];w[q+53|0]=r;y[m+52>>2]=1;eb:{fb:{gb:{if(d&1){d=y[a+4>>2];b=1;while(1){c=b;b=b+1|0;if(j>>>0>1<>>0){continue}break}x[f+80>>1]=0;y[f+36>>2]=0;y[f+48>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+68>>2]=0;y[f+72>>2]=0;y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+32>>2]=e;y[f+28>>2]=C;w[f+24|0]=F;b=c&255;g=gb(f+332|0,b);i=y[g>>2];c=(i+(b<<2)|0)-4|0;hb(f+24|0,c,d);h=0;hb:{if(!y[c>>2]){break hb}ta(d);c=y[d+8>>2];if(c>>>0<=4294967292){c=c+3|0;h=y[d+4>>2];y[d+8>>2]=c>>>0>>0?c:h}b=b-2|0;while(1){if((b|0)>=0){c=i+(b<<2)|0;hb(f+24|0,c,d);h=0;if(!y[c>>2]){break hb}ta(d);h=y[d+8>>2];if(h>>>0<=4294967292){h=h+3|0;l=y[d+4>>2];y[d+8>>2]=h>>>0>>0?h:l}fb(y[c>>2],0,0,0,0,y[c+4>>2],2);b=b-1|0;continue}break}h=uc(q,g)}b=h;$a(g);y[f+356>>2]=0;oa(m- -64|0,b);la(f+356|0);if(!y[m+64>>2]){break eb}ta(y[a+4>>2]);break gb}b=s?(s|0)==1?8192:1024:65536;d=ab(b,8);y[f+4>>2]=b;y[f>>2]=d;Q=Ra(y[a+4>>2]);y[f+308>>2]=Q;n=0;y[f+16>>2]=0;l=b;ib:{if(!(i&1)){break ib}b=xa(C,e);y[f+24>>2]=0;oa(f+16|0,b);b=r&255;O=1-b|0;D=0-(b>>>0>1)|0;b=g&255;P=1-b|0;H=0-(b>>>0>1)|0;la(f+24|0);n=y[f+16>>2];jb:while(1){if(!c&(e|0)==(h|0)){break ib}ja(f+24|0,n,h);b=y[q+44>>2];L=A[q+48>>1];g=se(h,c,L);r=b+g|0;b=Z+(b>>31)|0;V=g>>>0>r>>>0?b+1|0:b;b=y[q+40>>2];N=A[q+50>>1];g=se(h,c,N);I=b+g|0;b=Z+(b>>31)|0;U=g>>>0>I>>>0?b+1|0:b;g=0;i=0;W=y[f+28>>2];_=y[f+24>>2];while(1)if(!i&(g|0)==(C|0)){h=h+1|0;c=h?c:c+1|0;continue jb}else{S=y[n+8>>2];b=se(g,i,N);u=r-b|0;G=V-(Z+(b>>>0>r>>>0)|0)|0;b=G>>8;X=(G&255)<<24|u>>>8;T=se(g,i,L);u=T+I|0;G=Z+U|0;M=S;G=u>>>0>>0?G+1|0:G;S=(G&255)<<24|u>>>8;u=G>>8;La(M,g,_,W,k>>>0<=X>>>0&(b|0)>=0|(b|0)>0|(P>>>0>S>>>0&(H|0)>=(u|0)|(u|0)<(H|0)|((b|0)<=(D|0)&O>>>0>X>>>0|(b|0)<(D|0))|(v>>>0<=S>>>0&(u|0)>=0|(u|0)>0)));g=g+1|0;i=g?i:i+1|0;continue}}}g=d;b=1;while(1){c=b;b=b+1|0;if(j>>>0>1<>>0){continue}break}y[f+48>>2]=0;y[f+52>>2]=0;x[f+80>>1]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+68>>2]=0;y[f+72>>2]=0;y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+32>>2]=e;y[f+28>>2]=C;w[f+24|0]=F;y[f+36>>2]=n;w[f+26|0]=K;w[f+25|0]=0;w[f+27|0]=s;kb:{if(s>>>0>=2){x[f+40>>1]=65282;break kb}x[f+40>>1]=65283;if(s){break kb}x[f+46>>1]=65278;x[f+42>>1]=65533;x[f+44>>1]=65026}b=c&255;c=gb(f+356|0,b);h=y[c>>2];n=b-1|0;d=n;lb:{mb:{while(1){if((d|0)<0){break mb}y[f+352>>2]=0;y[f+348>>2]=0;y[f+340>>2]=g;y[f+344>>2]=l;y[f+336>>2]=Q;y[f+332>>2]=f+352;b=Wb(f+24|0,f+332|0);y[f+348>>2]=0;while(1){if((b|0)==3){b=Vb(f+24|0,f+332|0);continue}break}y[f+68>>2]=0;y[f+72>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;b=y[f+352>>2];nb:{if(!b){break nb}y[f+352>>2]=0;i=h+(d<<2)|0;oa(i,b);if((d|0)>=(n|0)){break nb}fb(y[i>>2],0,0,0,0,y[i+4>>2],2)}d=d-1|0;la(f+352|0);if(b){continue}break}b=0;break lb}b=uc(q,c)}$a(c);la(f+16|0);y[f+24>>2]=0;oa(m- -64|0,b);la(f+24|0);if(!y[m+64>>2]){break fb}ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){g=b;c=c+2|0;b=y[b+4>>2];y[g+8>>2]=b>>>0>c>>>0?c:b}ua(f+308|0);Ha(f)}if((z[m+4|0]&63)==20){b=0;break db}ob:{if(z[a+50|0]){break ob}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break ob}c=k+y[f+324>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break ob}eb(d,c,z[b+16|0])}b=y[f+320>>2];g=b;h=b>>31;b=y[f+324>>2];c=b;d=b>>31;b=z[f+328|0];fb(y[a+32>>2],g,h,c,d,y[m+64>>2],(b&7)==4?4:b&3);b=0;oa(m- -64|0,0);break db}ua(f+308|0);Ha(f)}b=1}ma(q);break u}b=1;if(z[a+49|0]!=1){break u}g=a+76|0;d=y[a+76>>2];if(!d){c=qb();y[f+24>>2]=c;pb:{qb:{if(tb(a,a+88|0)){break qb}if(va(y[a+4>>2],f+332|0)){break qb}d=y[a+92>>2];if((d|0)<0){break qb}i=y[a+88>>2];if((i|0)<0){break qb}y[c+8>>2]=d;y[c+4>>2]=i;d=z[f+332|0];i=d&1;w[c|0]=i;h=d>>>1&3;w[c+3|0]=h;w[c+1|0]=d>>>3&1;if(i){break pb}i=c+16|0;d=0;if(!h){while(1){if((d|0)==8){break pb}h=d+i|0;d=d+1|0;if(!va(y[a+4>>2],h)){continue}break qb}}while(1){if((d|0)==2){break pb}h=d+i|0;d=d+1|0;if(!va(y[a+4>>2],h)){continue}break}}ua(f+24|0);break u}w[c+2|0]=0;y[f+24>>2]=0;Va(g,c);ua(f+24|0);d=y[g>>2]}y[m+52>>2]=1;rb:{if(z[d|0]==1){hb(d,m- -64|0,y[a+4>>2]);if(!y[m+64>>2]){Va(g,0);break D}ta(y[a+4>>2]);break rb}if(y[a+60>>2]==y[a+64>>2]){b=z[d+3|0];kb(a+60|0,b?(b|0)==1?8192:1024:65536)}c=a+72|0;h=f;b=y[a+72>>2];if(b){d=b}else{d=Ra(y[a+4>>2]);y[f+24>>2]=0;Va(c,d);ua(f+24|0);d=y[a+72>>2]}y[h+28>>2]=d;d=m- -64|0;y[f+24>>2]=d;h=y[a+64>>2];i=y[a+60>>2];y[f+40>>2]=0;y[f+32>>2]=i;y[f+36>>2]=h-i>>3;i=y[a+76>>2];sb:{if(!b){b=Wb(i,f+24|0);break sb}b=Vb(i,f+24|0)}y[a+56>>2]=b;if((b|0)==3){if((z[m+4|0]&63)==36){break B}tb:{if(z[a+50|0]){break tb}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break tb}c=y[a+92>>2]+y[a+100>>2]|0;g=y[a+32>>2];if((c|0)<=y[g+12>>2]){break tb}eb(g,c,z[b+16|0])}b=y[a+76>>2];c=y[b+64>>2]+y[a+96>>2]|0;g=c;i=c>>31;c=y[b+68>>2]+y[a+100>>2]|0;h=b- -64|0;b=z[a+104|0];tc(y[a+32>>2],g,i,c,c>>31,y[d>>2],h,(b&7)==4?4:b&3);break B}b=y[a+76>>2];y[b+44>>2]=0;y[b+48>>2]=0;y[b+36>>2]=0;y[b+40>>2]=0;y[b+28>>2]=0;y[b+32>>2]=0;Va(c,0);y[a+64>>2]=y[a+60>>2];if(!y[d>>2]){y[a+56>>2]=-1;Va(g,0);break D}ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0>4294967293){break rb}d=b;c=c+2|0;b=y[b+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}if((z[m+4|0]&63)!=36){ub:{if(z[a+50|0]){break ub}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break ub}c=y[a+92>>2]+y[a+100>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break ub}eb(d,c,z[b+16|0])}b=y[a+76>>2];c=y[b+64>>2]+y[a+96>>2]|0;d=c;i=c>>31;c=y[b+68>>2]+y[a+100>>2]|0;h=b- -64|0;b=z[a+104|0];tc(y[a+32>>2],d,i,c,c>>31,y[m+64>>2],h,(b&7)==4?4:b&3);oa(m- -64|0,0)}b=0;Va(g,0);break u}b=1;if(z[a+49|0]!=1){break u}if(tb(a,f+24|0)){break u}if(va(y[a+4>>2],f+352|0)){break u}i=y[f+24>>2];if(i-1>>>0>65534){break u}g=y[f+28>>2];if(g-1>>>0>65534){break u}d=0;y[f+312>>2]=0;c=db();y[f+356>>2]=c;y[c+8>>2]=g;y[c+4>>2]=i;b=z[f+352|0];h=b&1;w[c|0]=h;w[c+1|0]=b>>>1&1;vb:{wb:{if(h){break wb}h=c+24|0;while(1){if((d|0)==4){break wb}b=1;k=d+h|0;d=d+1|0;if(!va(y[a+4>>2],k)){continue}break}break vb}h=y[m+8>>2];xb:{if((h|0)>0){d=0;b=1;while(1){if((d|0)==(h|0)){break vb}i=Ma(a,y[y[m+12>>2]>>2]);if(!i){break vb}k=(z[i+4|0]&63)-4|0;k=(k<<6|(k&252)>>>2)&255;if(!(1<>>0<=9:0)){d=d+1|0;continue}break}b=i- -64|0;break xb}d=sb(y[a+32>>2],y[f+32>>2],y[f+36>>2],i,g);y[f+332>>2]=0;b=f+312|0;oa(b,d);la(f+332|0)}b=y[b>>2];y[c+12>>2]=0;y[c+16>>2]=0;y[c+20>>2]=b;d=z[c|0];i=d?1024:8192;b=ab(i,8);y[f+336>>2]=i;y[f+332>>2]=b;i=Ra(y[a+4>>2]);y[f>>2]=i;y[m+52>>2]=1;c=cb(c,i,b,d?1024:8192);y[f+16>>2]=0;b=m- -64|0;oa(b,c);la(f+16|0);c=1;yb:{if(!y[m+64>>2]){break yb}ta(y[a+4>>2]);c=y[a+4>>2];d=y[c+8>>2];if(d>>>0<=4294967293){h=c;d=d+2|0;c=y[c+4>>2];y[h+8>>2]=c>>>0>d>>>0?d:c}c=0;if((z[m+4|0]&63)==40){break yb}zb:{if(z[a+50|0]){break zb}c=y[y[a+24>>2]-4>>2];if(z[c+17|0]!=1){break zb}d=g+y[f+36>>2]|0;g=y[a+32>>2];if((d|0)<=y[g+12>>2]){break zb}eb(g,d,z[c+16|0])}c=y[f+32>>2];d=c;i=c>>31;c=y[f+36>>2];g=c;h=c>>31;c=z[f+40|0];fb(y[a+32>>2],d,i,g,h,y[b>>2],(c&7)==4?4:c&3);oa(b,0);c=0}b=c;ua(f);Ha(f+332|0)}Ua(f+356|0);la(f+312|0);break u}c=na(20);y[c+16>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;y[c>>2]=0;y[c+4>>2]=0;y[f+24>>2]=c;if(ra(y[a+4>>2],c)){break E}if(ra(y[a+4>>2],c+4|0)){break E}if(ra(y[a+4>>2],c+8|0)){break E}if(ra(y[a+4>>2],c+12|0)){break E}if(va(y[a+4>>2],f+356|0)){break E}if(Wa(y[a+4>>2],f+312|0)){break E}w[c+16|0]=z[f+356|0]>>>2&1;g=A[f+312>>1];b=g&32767;x[c+18>>1]=b;w[c+17|0]=g>>>15;d=y[c+4>>2];if((d|0)!=-1){break J}if(g<<16>>16>=0){w[c+17|0]=1}if(z[a+50|0]){break F}d=b;break G}w[a+49|0]=0;break u}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}y[m+52>>2]=4;k=m+68|0;vb(k,0);g=y[a+4>>2];d=na(44);w[d+1|0]=0;t(d+4|0,0,40);if((va(g,f+356|0)|0)==-1){break I}b=1;i=z[f+356|0];w[d+1|0]=i&1;Ab:{Bb:{if((ra(g,f+332|0)|0)==-1){break Bb}if((ra(g,f+312|0)|0)==-1){break Bb}c=y[f+332>>2];h=y[f+312>>2];if((c|0)>(h|0)){break Bb}l=(i>>>4&7)+1|0;i=(i>>>1&7)+1|0;pb(d,0);y[f+28>>2]=c;w[f+24|0]=1;b=c;while(1){if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}if((Ia(g,l,y[d+20>>2]+(y[d+4>>2]<<2)|0)|0)==-1){break Ab}n=y[d+20>>2];q=y[d+4>>2]<<2;if(B[n+q>>2]>63){break Ab}y[q+y[d+32>>2]>>2]=b;b=y[n+(y[d+4>>2]<<2)>>2];if((b|0)>31){break Ab}if(z[Na(f+24|0,1<>2];if((h|0)>(b|0)){continue}break}if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}y[y[d+20>>2]+(y[d+4>>2]<<2)>>2]=32;if((c|0)==-2147483648){break Ab}y[y[d+32>>2]+(y[d+4>>2]<<2)>>2]=c-1;pb(d,1);if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}y[y[d+20>>2]+(y[d+4>>2]<<2)>>2]=32;y[y[d+32>>2]+(y[d+4>>2]<<2)>>2]=h;pb(d,1);b=y[d+4>>2];if(z[d+1|0]==1){if((Ia(g,i,y[d+8>>2]+(b<<3)|0)|0)==-1){break Ab}b=y[d+4>>2]+1|0;y[d+4>>2]=b}c=y[d+8>>2];if(y[d+12>>2]-c>>3>>>0>>0){break t}c=ob(c,b);w[d|0]=c;y[f+24>>2]=d;b=1;if(!c){break H}b=0;y[f+24>>2]=0;vb(k,d);ta(y[a+4>>2]);break H}w[d|0]=0;y[f+24>>2]=d;break H}break I}if((d|0)!=62){break B}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}if(!z[a+50|0]){break G}break F}w[d|0]=0;y[f+24>>2]=d;b=1}pa(f+24|0);break u}b=xa(y[c>>2],d);y[f+332>>2]=0;oa(a+32|0,b);la(f+332|0)}if(qa(y[a+32>>2])){break C}y[a+56>>2]=-1}$b(f+24|0)}b=1;break u}Qa(y[a+32>>2],z[c+16|0]);Cb:{Db:{b=y[a+24>>2];h=y[a+28>>2];Eb:{if(b>>>0>>0){y[f+24>>2]=0;y[b>>2]=c;b=b+4|0;break Eb}d=y[a+20>>2];g=b-d|0;k=g>>2;i=k+1|0;if(i>>>0>=1073741824){break Db}b=0;h=h-d|0;l=h>>1;i=h>>>0>=2147483644?1073741823:i>>>0>>0?l:i;if(i){if(i>>>0>=1073741824){break Cb}b=na(i<<2)}y[f+24>>2]=0;h=b+g|0;y[h>>2]=c;c=h-(k<<2)|0;if(g){p(c,d,g)}y[a+28>>2]=(i<<2)+b;b=h+4|0;y[a+24>>2]=b;y[a+20>>2]=c;if(!d){break Eb}ma(d)}w[a+49|0]=1;y[a+24>>2]=b;$b(f+24|0);break B}Ba();o()}jb();o()}b=0;break u}la(f+356|0)}ua(f+312|0);y[f+24>>2]=0;Xb(m+60|0,c);Zb(f+24|0);if(y[m+60>>2]){ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){d=b;c=c+2|0;b=y[b+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}ua(f+16|0);Ha(f+332|0);b=0;break x}ua(f+16|0);Ha(f+332|0)}b=1}ma(g);break u}if(ra(y[a+4>>2],h+16|0)){break v}c=y[a+4>>2];g=y[c>>2];c=y[c+4>>2];if((c|0)<0){break t}d=c>>>27&15;c=((c&134217727)<<5|g>>>27)&-32;if(!d&c>>>0>=2147483648|d){break t}if(!d&B[h+16>>2]>c>>>0){break v}n=0;b=y[m+8>>2];c=(b|0)>0?b:0;d=0;while(1){if((c|0)==(d|0)){i=1;b=0;while(1)if((b|0)==(c|0)){if(!(i&1)){break t}y[h+24>>2]=n;l=Ub(f+356|0,n);k=y[l>>2];Fb:{if((k|0)==y[l+4>>2]){break Fb}b=y[m+8>>2];s=(b|0)>0?b:0;i=1;n=0;c=0;while(1){if((c|0)==(s|0)){break Fb}Gb:{b=Ma(a,y[y[m+12>>2]+(c<<2)>>2]);if(z[b+4|0]&63){break Gb}b=y[b+56>>2];g=y[b+24>>2];d=y[b+28>>2]-g>>2;b=0;while(1){if((b|0)==(d|0)){g=0;if(i&1){b=d+n|0;d=b>>>0>=d>>>0;g=d;n=d?b:0}else{n=0}i=g;break Gb}C=b+n|0;if(!(C>>>0>=b>>>0&i)){break t}y[k+(C<<2)>>2]=y[g+(b<<2)>>2];b=b+1|0;continue}}c=c+1|0;continue}}bb(h+40|0,l);Hb:{Ib:{Jb:{Kb:{if(!z[h|0]){c=y[h+24>>2];b=0;while(1){d=b;b=b+1|0;if(c>>>0>1<>>0){continue}break}break Kb}n=y[h+24>>2];b=0;while(1){if((b|0)!=35){c=b<<3;b=b+1|0;if(!Ia(y[a+4>>2],4,c+(f+24|0)|0)){continue}break Jb}break}if(!ob(f+24|0,35)){break Jb}i=Ed(f+312|0,n);k=y[i>>2];c=0;Lb:while(1){Mb:{Nb:{Ob:{if((c|0)<(n|0)){d=0;y[f+20>>2]=0;w[f+16|0]=1;Pb:while(1){if(wb(y[a+4>>2],f+352|0)){break Nb}g=Tb(f+16|0);if(z[g|0]!=1){break Nb}b=0;C=y[f+20>>2]|y[f+352>>2];s=(C|0)>=0;y[g>>2]=s;j=g;g=s?C:0;y[j+4>>2]=g;if(!s){break t}d=d+1|0;while(1){if((b|0)==35){continue Pb}s=(f+24|0)+(b<<3)|0;if(!(y[s>>2]==(d|0)&(g|0)==y[s+4>>2])){b=b+1|0;continue}break}break}if(b>>>0<=31){y[k+(c<<3)>>2]=b;break Mb}g=y[a+4>>2];Qb:{switch(b-33|0){default:if(Ia(g,2,f+352|0)){break Nb}d=3;break Ob;case 1:if(Ia(g,7,f+352|0)){break Nb}d=11;break Ob;case 0:break Qb}}d=3;if(!Ia(g,3,f+352|0)){break Ob}break Nb}b=y[i+4>>2];if(!ob(k,b-k>>3)){break Nb}y[f+4>>2]=b;y[f>>2]=k;y[f+8>>2]=y[i+8>>2];d=0;y[i+8>>2]=0;y[i>>2]=0;y[i+4>>2]=0;ya(i);if((b|0)==(k|0)){break Ib}ta(y[a+4>>2]);bb(h+28|0,f);ya(f);b=1;if(z[h|0]!=1){break Kb}c=A[f+14>>1];g=c>>>12&3;if((g|0)==2){break Hb}k=c>>>10&3;if((k|0)==2){break Hb}n=c>>>8&3;if((n|0)==2){break Hb}i=c&3;if((i|0)==2){break Hb}s=c>>>6&3;if((s|0)==2){break Hb}Rb:{Sb:{switch(i|0){case 0:i=0;j=sa(a,6);break Rb;case 1:i=0;j=sa(a,7);break Rb;default:break Sb}}C=Ga(a,m,0);if(!C){break Hb}i=1;j=y[C+68>>2]}y[h+60>>2]=j;Tb:{Ub:{switch((c>>>2&3)-1|0){default:j=sa(a,8);break Tb;case 0:j=sa(a,9);break Tb;case 1:j=sa(a,10);break Tb;case 2:break Ub}}C=Ga(a,m,i);if(!C){break Hb}i=i+1|0;j=y[C+68>>2]}y[h+64>>2]=j;Vb:{Wb:{switch((c>>>4&3)-1|0){default:j=sa(a,11);break Vb;case 0:j=sa(a,12);break Vb;case 1:j=sa(a,13);break Vb;case 2:break Wb}}C=Ga(a,m,i);if(!C){break Hb}i=i+1|0;j=y[C+68>>2]}y[h+68>>2]=j;Xb:{Yb:{switch(s|0){case 0:j=sa(a,14);break Xb;case 1:j=sa(a,15);break Xb;default:break Yb}}s=Ga(a,m,i);if(!s){break Hb}i=i+1|0;j=y[s+68>>2]}y[h+72>>2]=j;Zb:{_b:{switch(n|0){case 0:n=sa(a,14);break Zb;case 1:n=sa(a,15);break Zb;default:break _b}}n=Ga(a,m,i);if(!n){break Hb}i=i+1|0;n=y[n+68>>2]}y[h+76>>2]=n;$b:{ac:{switch(k|0){case 0:n=sa(a,14);break $b;case 1:n=sa(a,15);break $b;default:break ac}}k=Ga(a,m,i);if(!k){break Hb}i=i+1|0;n=y[k+68>>2]}y[h+80>>2]=n;bc:{cc:{switch(g|0){case 0:g=sa(a,14);break bc;case 1:g=sa(a,15);break bc;default:break cc}}g=Ga(a,m,i);if(!g){break Hb}i=i+1|0;g=y[g+68>>2]}y[h+84>>2]=g;if(!(c&16384)){fa=h,ga=sa(a,1),y[fa+88>>2]=ga;break Kb}c=Ga(a,m,i);if(!c){break Hb}y[h+88>>2]=y[c+68>>2];break Kb}s=y[f+352>>2]+d|0;if((s|0)<=0){break Mb}g=c+s|0;if((g|0)>(n|0)){break Nb}d=0;b=(b|0)==32&(c|0)>0;c=k+(c<<3)|0;C=c-8|0;while(1)if((d|0)==(s|0)){c=g;continue Lb}else{y[c+(d<<3)>>2]=b?y[C>>2]:0;d=d+1|0;continue}}y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0;ya(i);break Ib}c=c+1|0;continue}}i=0;y[f+312>>2]=0;y[f+316>>2]=0;if(z[h+1|0]==1){b=z[h+2|0];c=b?1024:8192;g=ab(c,8);y[f+24>>2]=0;rc(f+312|0,g);y[f+316>>2]=c;y[f+28>>2]=0;Ha(f+24|0);i=b?1024:8192}y[m+52>>2]=1;dc:{ec:{fc:{gc:{if(z[h|0]==1){b=Dd(h,y[a+4>>2],y[f+312>>2],i);y[f+24>>2]=0;oa(m- -64|0,b);la(f+24|0);if(!y[m+64>>2]){break ec}ta(y[a+4>>2]);break gc}c=Ra(y[a+4>>2]);y[f>>2]=c;b=Cd(f+24|0,d&255);c=Bd(h,c,y[f+312>>2],i,b);y[f+16>>2]=0;oa(m- -64|0,c);la(f+16|0);if(!y[m+64>>2]){break fc}ta(y[a+4>>2]);c=y[a+4>>2];d=y[c+8>>2];if(d>>>0<=4294967293){g=c;d=d+2|0;c=y[c+4>>2];y[g+8>>2]=c>>>0>d>>>0?d:c}qc(b);ua(f)}b=0;if((z[m+4|0]&63)==4){break dc}hc:{if(z[a+50|0]){break hc}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break hc}c=q+y[f+344>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break hc}eb(d,c,z[b+16|0])}b=y[f+340>>2];g=b;h=b>>31;b=y[f+344>>2];c=b;d=b>>31;b=z[f+348|0];fb(y[a+32>>2],g,h,c,d,y[m+64>>2],(b&7)==4?4:b&3);oa(m- -64|0,0);b=0;break dc}qc(b);ua(f)}b=1}Ha(f+312|0);break Hb}y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0}ya(f);b=1}ya(l);break v}else{d=Ma(a,y[y[m+12>>2]+(b<<2)>>2]);if(!(z[d+4|0]&63)){g=0;if(i&1){d=y[d+56>>2];d=y[d+28>>2]-y[d+24>>2]>>2;g=d+n|0;i=g;g=d>>>0<=g>>>0;n=g?i:0}else{n=0}i=g}b=b+1|0;continue}}b=1;g=d<<2;d=d+1|0;if(Ma(a,y[g+y[m+12>>2]>>2])){continue}break}}pc(f+308|0)}Y=f+368|0;break s}o()}if(y[a+56>>2]!=3){break r}b=y[a+4>>2];c=y[b+8>>2];b=y[b+4>>2];if(c>>>0>b>>>0){break e}if((b|0)!=(c|0)){continue}break}y[a+52>>2]=2;break c}ic:{switch(b|0){default:ib(R,0);break i;case 0:break ic;case 2:break d}}g=y[R>>2];b=y[g+28>>2];if((b|0)==-1){break g}c=y[a+84>>2];b=b+c|0;if(b>>>0>=c>>>0){break h}}aa=1;break c}y[a+84>>2]=b;d=y[a+4>>2];c=y[d+4>>2];y[d+8>>2]=b>>>0>>0?b:c;break f}d=y[a+4>>2];b=y[d+8>>2];if(b>>>0>4294967291){break f}b=b+4|0;c=y[d+4>>2];y[d+8>>2]=b>>>0>>0?b:c}b=y[a+12>>2];i=y[a+16>>2];jc:{if(b>>>0>>0){y[R>>2]=0;y[b>>2]=g;b=b+4|0;break jc}c=y[a+8>>2];b=b-c|0;k=b>>2;d=k+1|0;if(d>>>0>=1073741824){break b}i=i-c|0;h=i>>1;d=i>>>0>=2147483644?1073741823:d>>>0>>0?h:d;if(d){if(d>>>0>=1073741824){break a}i=na(d<<2)}else{i=0}y[a+80>>2]=0;h=b+i|0;y[h>>2]=g;g=h-(k<<2)|0;if(b){p(g,c,b)}y[a+16>>2]=i+(d<<2);b=h+4|0;y[a+12>>2]=b;y[a+8>>2]=g;if(c){ma(c)}d=y[a+4>>2]}y[a+12>>2]=b;b=y[d+8>>2];i=y[d+4>>2];if(b>>>0<=i>>>0){continue}break}}o()}ib(R,0)}Y=J+16|0;return aa}Ba();o()}jb();o()}function cb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=Y-96|0;Y=e;f=y[a+8>>2];g=y[a+4>>2];a:{if(!(f-1>>>0<65535&g-1>>>0<=65534)){n=xa(g,f);break a}b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(!z[a|0]){l:{if(z[a+24|0]!=255|z[a+25|0]!=255|(z[a+26|0]!=255|z[a+27|0]!=255)){break l}if(y[a+12>>2]){break l}k=y[a+20>>2];if((g|0)!=y[k+8>>2]){break l}if(!qa(k)){break b}p=y[a+4>>2];f=y[a+8>>2];n=xa(p,f);y[e+44>>2]=n;if(!qa(n)){break d}q=d;A=c;c=y[a+20>>2];G=y[c+8>>2];x=y[c+12>>2];c=y[a+16>>2];if(!((1-x|0)<=(c|0)&(c|0)<(x|0))){y[a+16>>2]=0}K=(f|0)>0?f:0;L=x+1|0;E=x-1|0;H=A+128|0;while(1){if((l|0)!=(K|0)){if(z[a+1|0]==1){if(z[b|0]){break d}if((d|0)==16|d>>>0<16){break k}C=ka(b,H)^C}ja(e+32|0,n,l);i=0;m:{if(!l){u=0;s=0;k=0;break m}ja(e+72|0,n,l-1|0);s=y[e+76>>2];if(!s){break k}u=y[e+72>>2];k=z[u|0]<<4}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=l-c|0;if(!((g|0)<=0|(g|0)>(x|0))){ja(e+48|0,y[a+20>>2],g-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break k}c=z[f|0];y[e+8>>2]=c;i=c&192}j=0;c=0;n:{if((g|0)<0){break n}c=0;if((g|0)>=(x|0)){break n}ja(e+48|0,y[a+20>>2],g);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break k}c=z[f|0];y[e+12>>2]=c;c=c>>>3&24}if(!((g|0)<-1|(g|0)>=(E|0))){ja(e+48|0,y[a+20>>2],g+1|0);g=y[e+52>>2];y[e+92>>2]=g;f=y[e+48>>2];y[e+88>>2]=f;if(!g){break k}g=z[f|0];y[e+16>>2]=g;j=g>>>6|0}o:{if(!C){h=c|(k&3072|i)|j;r=0;v=y[e+32>>2];I=y[e+36>>2];m=0;p:while(1){if((m|0)>=(p|0)){break o}q:{if(!l){break q}k=k<<8;if((p|0)<=(m+8|0)){break q}c=(m>>>3|0)+1|0;if(c>>>0>=s>>>0){break k}k=z[c+u|0]<<4|k}r:{if((L+y[a+16>>2]|0)<(l|0)){y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=0;i=0;c=0;break r}c=(m>>>3|0)+1|0;i=e+8|0;f=0;g=(G|0)<=(m+8|0);while(1){if((f|0)!=24){j=(e+72|0)+f|0;t=y[j+4>>2];s:{if(!t){break s}D=y[i>>2]<<8;y[i>>2]=D;if(g){break s}if(c>>>0>=t>>>0){break k}y[i>>2]=D|z[c+y[j>>2]|0]}i=i+4|0;f=f+8|0;continue}break}g=y[e+12>>2];i=y[e+8>>2];c=y[e+16>>2]}f=0;j=r+p|0;j=(j|0)>0?j:0;D=(j|0)>=8?8:j;j=0;while(1){if((f|0)==(D|0)){c=m>>>3|0;if(c>>>0>=I>>>0){break k}w[c+v|0]=j;r=r-8|0;m=m+8|0;continue p}if(h>>>0>=q>>>0){break k}F=ka(b,A+(h<<3)|0);t=7-f|0;j=F<>>13-f&1|(g>>>10-f&8|(i>>>t&64|(k>>>t&1024|h<<1&6582|F<<9)));f=f+1|0;continue}}}Jb(e+48|0,a,l);i=c|(k&3072|i)|j;c=0;v=y[e+32>>2];I=y[e+36>>2];D=y[e+60>>2];F=y[e+56>>2];r=0;while(1){if((c|0)>=(p|0)){break o}t:{if(!l){g=c+8|0;break t}k=k<<8;g=c+8|0;if((p|0)<=(g|0)){break t}f=(c>>>3|0)+1|0;if(f>>>0>=s>>>0){break k}k=z[f+u|0]<<4|k}j=c>>>3|0;m=j+1|0;f=0;h=e+8|0;while(1){u:{if((f|0)==24){f=0;m=r+p|0;m=(m|0)>0?m:0;J=(m|0)>=8?8:m;N=y[e+16>>2];M=y[e+12>>2];O=y[e+8>>2];m=0;while(1){if((f|0)==(J|0)){break u}t=y[y[a+20>>2]+8>>2];P=c+f|0;h=ia(t,P,F,D);v:{if(z[a+1|0]==1){if(Ib(t,P,h,e+48|0)){break v}}if(z[b|0]){break d}if(i>>>0>=q>>>0){break k}h=ka(b,A+(i<<3)|0)}t=7-f|0;i=N>>>13-f&1|(M>>>10-f&8|(k>>>t&1024|i<<1&6582|h<<9|O>>>t&64));f=f+1|0;m=h<>2];w:{if(!J){break w}N=y[h>>2]<<8;y[h>>2]=N;if((g|0)>=(G|0)){break w}if(m>>>0>=J>>>0){break k}y[h>>2]=N|z[m+y[t>>2]|0]}h=h+4|0;f=f+8|0;continue}break}if(j>>>0>=I>>>0){break k}w[j+v|0]=m;r=r-8|0;c=g;continue}}l=l+1|0;continue}break}y[e+44>>2]=0;break c}n=xa(g,f);y[e+44>>2]=n;if(!qa(n)){break f}Qa(n,0);A=c;u=c+128|0;c=0;while(1){if(B[a+8>>2]>c>>>0){if(z[a+1|0]==1){if(z[b|0]){break f}if((d|0)==16|d>>>0<16){break k}m=ka(b,u)^m}ja(e+32|0,n,c);f=e+72|0;ja(f,n,c-1|0);g=y[e+76>>2];q=y[e+72>>2];dd(f,a,c);f=0;k=y[n+8>>2];f=!g|(k|0)<2?f:z[q|0]>>>6&1;if(!(!g|(k|0)<=0)){f=z[q|0]>>>6&2|f}y[e+8>>2]=f;y[e+12>>2]=0;r=y[a+20>>2];f=y[r+8>>2];k=y[a+12>>2];i=1-k|0;l=y[e+72>>2];j=y[e+76>>2];h=0-k|0;Q=e,R=ia(f,i,l,j)|ia(f,h,l,j)<<1,y[Q+16>>2]=R;l=y[e+80>>2];j=y[e+84>>2];s=ia(f,i,l,j);p=s|ia(f,h,l,j)<<1;s=k^-1;Q=e,R=p|ia(f,s,l,j)<<2,y[Q+20>>2]=R;j=i;k=y[e+88>>2];i=y[e+92>>2];l=ia(f,j,k,i);Q=e,R=l|ia(f,h,k,i)<<1|ia(f,s,k,i)<<2,y[Q+24>>2]=R;f=e+48|0;ja(f,r,w[a+27|0]+(c-y[a+16>>2]|0)|0);k=y[e+52>>2];h=y[e+48>>2];ja(f,n,w[a+25|0]+c|0);f=y[e+52>>2];i=y[e+48>>2];x:{if(!m){l=q;q=g;j=i;i=f;g=k;r=h;f=0;k=y[e+32>>2];s=y[e+36>>2];while(1){if(B[a+4>>2]<=f>>>0){break x}p=e+8|0;h=cd(a,y[n+8>>2],p,f,r,g,j,i);if(z[b|0]){break f}if(d>>>0<=h>>>0){break k}bd(a,n,p,f,ka(b,A+(h<<3)|0),e+72|0,l,q,k,s);f=f+1|0;continue}}Jb(e+48|0,a,c);l=q;q=g;j=i;i=f;g=k;r=h;f=0;k=y[e+32>>2];s=y[e+36>>2];p=y[e+60>>2];C=y[e+56>>2];while(1){if(B[a+4>>2]<=f>>>0){break x}x=y[y[a+20>>2]+8>>2];h=ia(x,f,C,p);y:{if(z[a+1|0]==1){if(Ib(x,f,h,e+48|0)){break y}}h=cd(a,y[n+8>>2],e+8|0,f,r,g,j,i);if(z[b|0]==1){break f}if(d>>>0<=h>>>0){break k}h=ka(b,A+(h<<3)|0)}bd(a,n,e+8|0,f,h,e+72|0,l,q,k,s);f=f+1|0;continue}}c=c+1|0;continue}break}y[e+44>>2]=0;break e}z:{if(y[a+12>>2]){break z}k=y[a+20>>2];if((g|0)!=y[k+8>>2]){break z}if(!qa(k)){break b}q=y[a+4>>2];f=y[a+8>>2];n=xa(q,f);y[e+44>>2]=n;if(!qa(n)){break h}A=d;m=c;c=y[a+20>>2];x=y[c+8>>2];p=y[c+12>>2];c=y[a+16>>2];if(!((1-p|0)<=(c|0)&(c|0)<(p|0))){y[a+16>>2]=0}t=(f|0)>0?f:0;K=p-1|0;L=m- -64|0;while(1){A:{B:{if((l|0)!=(t|0)){if(z[a+1|0]==1){if(z[b|0]){break h}if((d|0)==8|d>>>0<8){break k}G=ka(b,L)^G}ja(e+32|0,n,l);i=0;C:{if(!l){C=0;s=0;k=0;break C}ja(e+72|0,n,l-1|0);s=y[e+76>>2];if(!s){break k}C=y[e+72>>2];k=z[C|0]<<1}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=l-c|0;if(!((g|0)<=0|(g|0)>(p|0))){ja(e+48|0,y[a+20>>2],g-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break k}c=z[f|0];y[e+8>>2]=c;i=c>>>2&32}j=0;c=0;D:{if((g|0)<0){break D}c=0;if((g|0)>=(p|0)){break D}ja(e+48|0,y[a+20>>2],g);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break k}c=z[f|0];y[e+12>>2]=c;c=c>>>4&12}if(!((g|0)<-1|(g|0)>=(K|0))){ja(e+48|0,y[a+20>>2],g+1|0);g=y[e+52>>2];y[e+92>>2]=g;f=y[e+48>>2];y[e+88>>2]=f;if(!g){break k}g=z[f|0];y[e+16>>2]=g;j=g>>>6|0}if(G){break B}h=c|(k&384|i)|j;f=0;u=y[e+32>>2];E=y[e+36>>2];r=0;E:while(1){if((f|0)>=(q|0)){break A}F:{if(!l){c=f+8|0;break F}k=k<<8;c=f+8|0;if((q|0)<=(c|0)){break F}g=(f>>>3|0)+1|0;if(g>>>0>=s>>>0){break k}k=z[g+C|0]<<1|k}g=f>>>3|0;j=g+1|0;i=e+8|0;f=0;while(1){if((f|0)==24){f=0;i=r+q|0;i=(i|0)>0?i:0;j=(i|0)>=8?8:i;H=y[e+16>>2];v=y[e+12>>2];I=y[e+8>>2];i=0;while(1){if((f|0)==(j|0)){if(g>>>0>=E>>>0){break k}w[g+u|0]=i;r=r-8|0;f=c;continue E}if(h>>>0>=A>>>0){break k}D=ka(b,m+(h<<3)|0);F=7-f|0;i=D<>>13-f&1|(v>>>11-f&4|(I>>>9-f&32|(k>>>F&128|h<<1&794|D<<6)));f=f+1|0;continue}}H=(e+72|0)+f|0;v=y[H+4>>2];G:{if(!v){break G}I=y[i>>2]<<8;y[i>>2]=I;if((c|0)>=(x|0)){break G}if(j>>>0>=v>>>0){break k}y[i>>2]=I|z[j+y[H>>2]|0]}i=i+4|0;f=f+8|0;continue}}}y[e+44>>2]=0;break g}Jb(e+48|0,a,l);i=c|(k&384|i)|j;c=0;E=y[e+32>>2];H=y[e+36>>2];v=y[e+60>>2];I=y[e+56>>2];u=0;while(1){if((c|0)>=(q|0)){break A}H:{if(!l){g=c+8|0;break H}k=k<<8;g=c+8|0;if((q|0)<=(g|0)){break H}f=(c>>>3|0)+1|0;if(f>>>0>=s>>>0){break k}k=z[f+C|0]<<1|k}r=c>>>3|0;j=r+1|0;f=0;h=e+8|0;while(1){I:{if((f|0)==24){f=0;h=q+u|0;h=(h|0)>0?h:0;D=(h|0)>=8?8:h;F=y[e+16>>2];J=y[e+12>>2];N=y[e+8>>2];j=0;while(1){if((f|0)==(D|0)){break I}M=y[y[a+20>>2]+8>>2];O=c+f|0;h=ia(M,O,I,v);J:{if(z[a+1|0]==1){if(Ib(M,O,h,e+48|0)){break J}}if(z[b|0]){break h}if(i>>>0>=A>>>0){break k}h=ka(b,m+(i<<3)|0)}M=7-f|0;i=F>>>13-f&1|(J>>>11-f&4|(N>>>9-f&32|(k>>>M&128|i<<1&794|h<<6)));f=f+1|0;j=h<>2];K:{if(!F){break K}J=y[h>>2]<<8;y[h>>2]=J;if((g|0)>=(x|0)){break K}if(j>>>0>=F>>>0){break k}y[h>>2]=J|z[j+y[D>>2]|0]}h=h+4|0;f=f+8|0;continue}break}if(r>>>0>=H>>>0){break k}w[r+E|0]=j;u=u-8|0;c=g;continue}}l=l+1|0;continue}}n=xa(g,f);y[e+32>>2]=n;if(!qa(n)){break j}Qa(n,0);g=c;t=c- -64|0;while(1){if(B[a+8>>2]>u>>>0){if(z[a+1|0]==1){if(z[b|0]){break j}if((d|0)==8|d>>>0<8){break k}r=ka(b,t)^r}ja(e+8|0,n,u);c=e+72|0;ja(c,n,u-1|0);k=y[e+76>>2];A=y[e+72>>2];dd(c,a,u);h=0;c=y[n+8>>2];h=!k|(c|0)<2?h:z[A|0]>>>6&1;h=!k|(c|0)<=0?h:z[A|0]>>>6&2|h;c=y[y[a+20>>2]+8>>2];m=y[a+12>>2];f=0-m|0;p=y[e+72>>2];C=y[e+76>>2];ia(c,f,p,C);l=ia(c,f,p,C);j=1-m|0;q=y[e+80>>2];s=y[e+84>>2];i=ia(c,j,q,s)|ia(c,f,q,s)<<1|ia(c,m^-1,q,s)<<2;x=y[e+88>>2];G=y[e+92>>2];j=ia(c,j,x,G)|ia(c,f,x,G)<<1;L:{if(!r){m=0;K=y[e+12>>2];L=y[e+8>>2];f=0;while(1){if(B[a+4>>2]<=f>>>0){break L}if(z[b|0]){break j}c=i<<2|l<<5|m<<6|h<<7|j;if(c>>>0>=d>>>0){break k}m=ka(b,g+(c<<3)|0);La(y[n+8>>2],f,L,K,m);l=y[a+12>>2];h=ia(y[n+8>>2],f+2|0,A,k)|h<<1&6;c=y[y[a+20>>2]+8>>2];E=f-l|0;l=ia(c,E+1|0,p,C);E=E+2|0;i=ia(c,E,q,s)|i<<1&6;j=ia(c,E,x,G)|j<<1&2;f=f+1|0;continue}}Jb(e+48|0,a,u);c=0;K=y[e+12>>2];L=y[e+8>>2];E=y[e+60>>2];H=y[e+56>>2];f=0;while(1){if(B[a+4>>2]<=f>>>0){break L}v=y[y[a+20>>2]+8>>2];m=ia(v,f,H,E);M:{if(z[a+1|0]==1){if(Ib(v,f,m,e+48|0)){break M}}if(z[b|0]==1){break j}c=i<<2|l<<5|c<<6|h<<7|j;if(c>>>0>=d>>>0){break k}m=ka(b,g+(c<<3)|0)}La(y[n+8>>2],f,L,K,m);l=y[a+12>>2];h=ia(y[n+8>>2],f+2|0,A,k)|h<<1&6;c=y[y[a+20>>2]+8>>2];v=f-l|0;l=ia(c,v+1|0,p,C);v=v+2|0;i=ia(c,v,q,s)|i<<1&6;j=ia(c,v,x,G)|j<<1&2;f=f+1|0;c=m;continue}}u=u+1|0;continue}break}y[e+32>>2]=0;break i}o()}n=0}la(e+32|0);break a}n=0}la(e+44|0);break a}n=0}la(e+44|0);break a}n=0}la(e+44|0);break a}}Y=e+96|0;return n}function Zc(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;i=Y-32|0;Y=i;j=d-(c>>>0<1048577)|0;l=f-(e>>>0<1048577)|0;a:{if((j|0)==-1&c-1048577>>>0<4292870143|(j|0)!=-1|((l|0)==-1&e-1048577>>>0<4292870143|(l|0)!=-1)){break a}p=y[h>>2];q=y[h+8>>2];j=y[h+4>>2];m=y[h+12>>2];y[i+28>>2]=y[b+8>>2];w[i+24|0]=1;l=Yc(i+24|0,c);v=z[l|0];k=y[i+28>>2];h=y[b+12>>2];y[l>>2]=1;y[l+4>>2]=h;l=Yc(l,e);h=m-j|0;m=y[i+28>>2];x=z[l|0]?(h|0)<(m|0)?h:m:h;l=0-e&f>>31;if((x|0)<=(l|0)){break a}h=q-p|0;m=v?(h|0)<(k|0)?h:k:h;h=0-c&d>>31;if((m|0)<=(h|0)){break a}b:{c:{p=h+p|0;if((p|0)<0){break c}c=!!c&(d|0)>=0|(d|0)>0?c:0;n=c+(m-h|0)|0;D=-1<<0-n;E=-1>>>c|0;v=j+l|0;k=h&31;j=x-l|0;q=c&31;d=!!e&(f|0)>=0|(f|0)>0?e:0;l=c>>>5|0;p=p>>>5|0;if((c^n-1)>>>0<=31){c=D&E;if((h^m-1)>>>0>=32){h=0;j=(j|0)>0?j:0;k=k-q|0;q=32-k|0;m=p<<2;while(1){if((h|0)==(j|0)){break a}f=i+8|0;Ca(f,a,h+v|0);e=y[i+12>>2];n=y[i+8>>2];Ca(f,b,d+h|0);if(!e){break b}f=y[i+12>>2];if(!f){break b}if(e>>>0

>>0){break c}y[i+20>>2]=e-p;y[i+16>>2]=m+n;e=_a(i+16|0);if(!y[i+20>>2]|f>>>0>>0|(f|0)==(l|0)){break c}f=y[i+8>>2]+(l<<2)|0;n=(te(e,24)&16711935|te(e&16711935,8))<>2]>>2];n=n|(te(e&16711935,8)|te(e,24)&16711935)>>>q;e=y[f>>2];e=Oa(g,n,te(e&16711935,8)|te(e,24)&16711935,c);I=f,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}h=0;f=(j|0)>0?j:0;if(k>>>0>q>>>0){k=k-q|0;q=p<<2;while(1){if((f|0)==(h|0)){break a}j=i+16|0;Ca(j,a,h+v|0);e=y[i+20>>2];m=y[i+16>>2];Ca(j,b,d+h|0);if(!e){break b}j=y[i+20>>2];if(!j){break b}if((e|0)==(p|0)|e>>>0

>>0|((j|0)==(l|0)|j>>>0>>0)){break c}e=y[i+16>>2]+(l<<2)|0;n=e;j=y[m+q>>2];j=(te(j&16711935,8)|te(j,24)&16711935)<>2];e=Oa(g,j,te(e&16711935,8)|te(e,24)&16711935,c);I=n,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}k=q-k|0;q=p<<2;while(1){if((f|0)==(h|0)){break a}j=i+16|0;Ca(j,a,h+v|0);e=y[i+20>>2];m=y[i+16>>2];Ca(j,b,d+h|0);if(!e){break b}j=y[i+20>>2];if(!j){break b}if((e|0)==(p|0)|e>>>0

>>0|((j|0)==(l|0)|j>>>0>>0)){break c}e=y[i+16>>2]+(l<<2)|0;n=e;j=y[m+q>>2];j=(te(j&16711935,8)|te(j,24)&16711935)>>>k|0;e=y[e>>2];e=Oa(g,j,te(e&16711935,8)|te(e,24)&16711935,c);I=n,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}x=n&31;A=(y[a+16>>2]>>>2)-(h>>>5)|0;if(k>>>0<=q>>>0){if((k|0)==(q|0)){k=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}A=(j|0)>0?j:0;t=p<<2;d:while(1){if((k|0)==(A|0)){break a}f=i+8|0;Ca(f,a,k+v|0);c=y[i+12>>2];j=y[i+8>>2];Ca(f,b,d+k|0);if(!c){break b}h=y[i+12>>2];if(!h){break b}if(c>>>0

>>0){break c}y[i+20>>2]=c-p;y[i+16>>2]=j+t;if(h>>>0>>0){break c}j=h-l|0;y[i+12>>2]=j;y[i+8>>2]=y[i+8>>2]+(l<<2);if(q){c=_a(i+16|0);f=gc(f);h=te(c,24)&16711935|te(c&16711935,8);c=y[f>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,E);I=f,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J;j=y[i+12>>2]}if(e>>>0>j>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];u=e<<2;m=h+u|0;n=y[i+20>>2];f=c;while(1)if((h|0)==(m|0)){if(x){if((e|0)==(n|0)|e>>>0>n>>>0|(e|0)==(j|0)){break c}c=y[f+u>>2];f=te(c&16711935,8)|te(c,24)&16711935;c=y[m>>2];c=Oa(g,f,te(c&16711935,8)|te(c,24)&16711935,D);I=m,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}k=k+1|0;continue d}else{r=y[c>>2];s=te(r&16711935,8)|te(r,24)&16711935;r=y[h>>2];r=Eb(g,s,te(r&16711935,8)|te(r,24)&16711935);I=h,J=te(r&16711935,8)|te(r,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}m=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}n=q-k|0;u=32-n|0;F=(j|0)>0?j:0;G=p<<2;e:while(1){if((m|0)==(F|0)){break a}f=i+8|0;Ca(f,a,m+v|0);c=y[i+12>>2];h=y[i+8>>2];Ca(f,b,d+m|0);if(!c){break b}f=y[i+12>>2];if(!f){break b}if(c>>>0

>>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0>>0){break c}y[i+20>>2]=A}if(f>>>0>>0){break c}k=f-l|0;y[i+12>>2]=k;y[i+8>>2]=y[i+8>>2]+(l<<2);c=_a(i+16|0);j=te(c&16711935,8)|te(c,24)&16711935;if(q){c=gc(i+8|0);f=y[c>>2];f=Oa(g,j>>>n|0,te(f&16711935,8)|te(f,24)&16711935,E);h=te(f&16711935,8);I=c,J=te(f,24)&16711935|h,y[I>>2]=J;k=y[i+12>>2]}if(e>>>0>k>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];C=e<<2;t=h+C|0;r=y[i+20>>2];f=c;while(1)if((h|0)==(t|0)){if(x){if(e>>>0>r>>>0){break c}h=j<>2];h=(te(c&16711935,8)|te(c,24)&16711935)>>>n|h}if((e|0)==(k|0)){break c}c=y[t>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,D);I=t,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}m=m+1|0;continue e}else{H=j<>2];j=te(j&16711935,8)|te(j,24)&16711935;s=y[h>>2];s=Eb(g,H|j>>>n,te(s&16711935,8)|te(s,24)&16711935);I=h,J=te(s&16711935,8)|te(s,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}m=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}n=k-q|0;t=32-n|0;F=(j|0)>0?j:0;G=p<<2;f:while(1){if((m|0)==(F|0)){break a}f=i+8|0;Ca(f,a,m+v|0);c=y[i+12>>2];h=y[i+8>>2];Ca(f,b,d+m|0);if(!c){break b}f=y[i+12>>2];if(!f){break b}if(c>>>0

>>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0>>0){break c}y[i+20>>2]=A}if(f>>>0>>0){break c}k=f-l|0;y[i+12>>2]=k;y[i+8>>2]=y[i+8>>2]+(l<<2);c=i+16|0;f=_a(c);j=te(f&16711935,8)|te(f,24)&16711935;if(q){c=_a(c);f=gc(i+8|0);h=j<>2];c=Oa(g,h|j>>>t,te(c&16711935,8)|te(c,24)&16711935,E);I=f,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J;k=y[i+12>>2]}if(e>>>0>k>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];C=e<<2;u=h+C|0;r=y[i+20>>2];f=c;while(1)if((h|0)==(u|0)){if(x){if(e>>>0>r>>>0){break c}h=j<>2];h=(te(c&16711935,8)|te(c,24)&16711935)>>>t|h}if((e|0)==(k|0)){break c}c=y[u>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,D);I=u,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}m=m+1|0;continue f}else{H=j<>2];j=te(j&16711935,8)|te(j,24)&16711935;s=y[h>>2];s=Eb(g,H|j>>>t,te(s&16711935,8)|te(s,24)&16711935);I=h,J=te(s&16711935,8)|te(s,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}o()}}Y=i+32|0}function Dd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0;f=Y-128|0;Y=f;n=xa(y[a+8>>2],y[a+12>>2]);y[f+124>>2]=n;if(qa(n)){Qa(n,z[a+4|0]);k=qd(b);y[f+116>>2]=k;e=0;a:{if(za(k,y[a+68>>2],f+120|0)){break a}y[f+108>>2]=y[f+120>>2];w[f+104|0]=1;q=Db(f+104|0,y[a+20>>2]);e=q;g=y[f+108>>2];h=0-g|0;y[e>>2]=z[e|0]&(g|0)!=-2147483648;y[e+4>>2]=h;y[f+100>>2]=0;w[f+96|0]=1;b:{c:{d:{e:while(1){if(B[a+16>>2]>r>>>0){if(za(k,y[a+68>>2],f+92|0)){break b}y[f+84>>2]=y[f+92>>2];e=1;w[f+80|0]=1;g=Db(f+80|0,y[a+20>>2]);s=Vc(q,y[g>>2],y[g+4>>2]);y[f+76>>2]=0;w[f+72|0]=1;while(1){f:{if(e&1){if(za(k,y[a+60>>2],f+8|0)){break b}h=Na(f+96|0,y[f+8>>2]);e=y[h+4>>2];y[f+72>>2]=y[h>>2];y[f+76>>2]=e;break f}g:{switch(za(k,y[a+64>>2],f+8|0)|0){case 0:break g;case 1:continue e;default:break b}}Na(Na(f+72|0,y[f+8>>2]),w[a+5|0])}e=1;j=0;g=y[a+20>>2];if((g|0)!=1){while(1){h=e;e=e+1|0;if(g>>>0>1<>>0){continue}break}if(Ia(b,h,f+8|0)){break b}j=z[f+8|0]}e=y[s+4>>2];if(!(y[s>>2]&1)){break b}h=e+j|0;e=h&(e^-1);if((e|0)<0){break b}t=(e|0)>=0?h:0;j=0;y[f+68>>2]=0;w[f+64|0]=1;h:while(1){if(wb(b,f+8|0)){break b}e=Tb(f- -64|0);if(z[e|0]!=1){break b}h=y[f+68>>2]|y[f+8>>2];g=(h|0)>=0;y[e>>2]=g;h=g?h:0;y[e+4>>2]=h;if(!g){break d}j=j+1|0;l=y[a+28>>2];i=y[a+24>>2];e=0;while(1){if((e|0)==(i|0)){continue h}g=l+(e<<3)|0;if(!(y[g>>2]==(j|0)&(h|0)==y[g+4>>2])){e=e+1|0;continue}break}break}i:{j:{k:{if(!z[a+1|0]){w[f+60|0]=0;y[f+56>>2]=0;break k}h=y[b>>2];g=y[b+8>>2];if(g>>>0>=B[b+4>>2]){break b}g=z[g+h|0];h=y[b+12>>2];_b(b);w[f+60|0]=0;y[f+56>>2]=0;if(g>>>7-h&1){break j}}Uc(f+56|0,y[y[a+40>>2]+(e<<2)>>2]);break i}if(za(k,y[a+72>>2],f+52|0)){break c}if(za(k,y[a+76>>2],f+48|0)){break c}if(za(k,y[a+80>>2],f+44|0)){break c}if(za(k,y[a+84>>2],f+40|0)){break c}if(za(k,y[a+88>>2],f+36|0)){break c}ta(b);j=y[y[a+40>>2]+(e<<2)>>2];if(!j){break c}l=y[f+52>>2];h=l>>31;e=y[j+8>>2]+l|0;if(e>>>0>>0?h+1|0:h){break c}i=y[f+48>>2];g=i>>31;h=i+y[j+12>>2]|0;if(h>>>0>>0?g+1|0:g){break c}g=y[b+8>>2];Cb(f+8|0,l,2,y[f+44>>2]);Cb(f+28|0,i,2,y[f+40>>2]);if(!(w[f+32|0]&1)|z[f+12|0]!=1){break c}i=db();y[f+24>>2]=i;y[i+8>>2]=h;y[i+4>>2]=e;e=z[a+2|0];y[i+20>>2]=j;w[i|0]=e;y[i+12>>2]=y[f+8>>2];e=y[f+28>>2];j=0;w[i+1|0]=0;y[i+16>>2]=e;w[i+24|0]=z[a+92|0];w[i+25|0]=z[a+93|0];w[i+26|0]=z[a+94|0];w[i+27|0]=z[a+95|0];e=Ra(b);y[f+20>>2]=e;if(fc(Tc(f+56|0,cb(i,e,c,d)))){ta(b);e=y[b+8>>2];if(e>>>0<=4294967293){h=e+2|0;e=y[b+4>>2];e=e>>>0>h>>>0?h:e;y[b+8>>2]=e}j=y[f+36>>2]==(e-g|0)}ua(f+20|0);Ua(f+24|0);if(!j){break c}}e=f+56|0;if(fc(e)){i=y[Xa(e)+8>>2];e=Xa(e);p=y[a+56>>2];j=y[e+12>>2];l:{m:{l=z[a+3|0];if(!l){e=z[f+72|0];if((p&-2)!=2){break m}if(!(e&1)){break c}g=y[f+76>>2];h=g>>31;e=i-1|0;m=e;e=e+g|0;g=m>>>0>e>>>0?h+1|0:h;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+72>>2]=0|g;y[f+76>>2]=g?e:0;if(!g){break c}break l}e=z[f+72|0];n:{switch(p|0){default:if(!(e&1)){break c}break l;case 0:case 2:break n}}if(!(e&1)){break c}g=y[f+76>>2];h=g>>31;e=j-1|0;m=e;e=e+g|0;h=m>>>0>e>>>0?h+1|0:h;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;y[f+72>>2]=0|g;y[f+76>>2]=g?e:0;if(g){break l}break c}if(!(e&1)){break c}}g=y[f+76>>2];Rc(f+8|0,l,p,g,t,i,j);m=Xa(f+56|0);e=y[f+8>>2];h=e;i=e>>31;e=y[f+12>>2];Hb(m,n,h,i,e,e>>31,y[a+52>>2]);e=y[f+16>>2];if(e){h=g>>31;m=e;e=e+g|0;g=m>>>0>e>>>0?h+1|0:h;h=e;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;e=0;y[f+72>>2]=e|g;y[f+76>>2]=g?h:0}r=r+1|0}mb(f+56|0);e=0;continue}}break}y[f+124>>2]=0;e=n;break a}o()}mb(f+56|0)}e=0}Ua(f+116|0)}la(f+124|0);Y=f+128|0;return e}function Bd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;f=Y-112|0;Y=f;k=xa(y[a+8>>2],y[a+12>>2]);y[f+108>>2]=k;g=0;a:{if(!qa(k)){break a}o=y[e>>2];g=0;if(!Aa(o,b,f+104|0)){break a}t=y[e+36>>2];u=y[e+32>>2];v=y[e+28>>2];x=y[e+24>>2];A=y[e+20>>2];C=y[e+16>>2];D=y[e+12>>2];E=y[e+8>>2];F=y[e+4>>2];Qa(k,z[a+4|0]);y[f+100>>2]=y[f+104>>2];w[f+96|0]=1;p=Db(f+96|0,y[a+20>>2]);e=p;h=y[f+100>>2];g=0-h|0;y[e>>2]=z[e|0]&(h|0)!=-2147483648;y[e+4>>2]=g;y[f+92>>2]=0;w[f+88|0]=1;e=y[a+16>>2];b:{c:while(1){if(e>>>0>m>>>0){y[f+84>>2]=0;w[f+80|0]=1;if(!Aa(o,b,f+76|0)){break b}y[f+68>>2]=y[f+76>>2];e=1;w[f+64|0]=1;g=Db(f- -64|0,y[a+20>>2]);q=Vc(p,y[g>>2],y[g+4>>2]);while(1){d:{if(e&1){Aa(F,b,f+4|0);e=Na(f+88|0,y[f+4>>2]);g=y[e+4>>2];y[f+80>>2]=y[e>>2];y[f+84>>2]=g;break d}if(!Aa(E,b,f+4|0)){e=y[a+16>>2];continue c}Na(Na(f+80|0,y[f+4>>2]),w[a+5|0])}e=y[a+16>>2];if(m>>>0>=e>>>0){continue c}y[f+60>>2]=0;if(y[a+20>>2]!=1){Aa(D,b,f+60|0)}e=y[q+4>>2];if(!(y[q>>2]&1)){break b}g=y[f+60>>2];n=e+g|0;if(((e^n)&(g^n))<0){break b}Ac(t,b,f+56|0);e=y[f+56>>2];if(e>>>0>=B[a+24>>2]){break b}e:{f:{g:{h:{i:{if(!z[a+1|0]){y[f+52>>2]=0;w[f+48|0]=0;y[f+44>>2]=0;break i}Aa(C,b,f+52|0);g=y[f+52>>2];w[f+48|0]=0;y[f+44>>2]=0;if(g){break h}}Uc(f+44|0,y[y[a+40>>2]+(e<<2)>>2]);break g}Aa(A,b,f+40|0);Aa(x,b,f+36|0);Aa(v,b,f+32|0);Aa(u,b,f+28|0);h=y[y[a+40>>2]+(e<<2)>>2];if(!h){break f}i=y[f+40>>2];g=i>>31;e=y[h+8>>2]+i|0;if(e>>>0>>0?g+1|0:g){break f}j=y[f+36>>2];g=j>>31;l=j+y[h+12>>2]|0;g=l>>>0>>0?g+1|0:g;if((g|0)==1|g>>>0>1){break f}Cb(f+4|0,i,1,y[f+32>>2]);Cb(f+20|0,j,1,y[f+28>>2]);if(!(w[f+24|0]&1)|z[f+8|0]!=1){break f}g=db();y[f+16>>2]=g;y[g+8>>2]=l;y[g+4>>2]=e;e=z[a+2|0];y[g+20>>2]=h;w[g|0]=e;y[g+12>>2]=y[f+4>>2];e=y[f+20>>2];w[g+1|0]=0;y[g+16>>2]=e;w[g+24|0]=z[a+92|0];w[g+25|0]=z[a+93|0];w[g+26|0]=z[a+94|0];w[g+27|0]=z[a+95|0];Tc(f+44|0,cb(g,b,c,d));Ua(f+16|0)}i=0;e=f+44|0;if(!fc(e)){break e}l=y[Xa(e)+8>>2];e=Xa(e);j=y[a+56>>2];r=y[e+12>>2];j:{k:{l:{s=z[a+3|0];if(!s){e=z[f+80|0];if((j&-2)!=2){break l}if(!(e&1)){break j}g=y[f+84>>2];e=g>>31;h=l-1|0;g=g+h|0;h=h>>>0>g>>>0?e+1|0:e;e=g;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;y[f+80>>2]=0|g;y[f+84>>2]=g?e:0;if(g){break k}break e}e=z[f+80|0];m:{switch(j|0){default:if(e&1){break k}break e;case 0:case 2:break m}}if(!(e&1)){break j}e=y[f+84>>2];g=e>>31;h=r-1|0;e=e+h|0;g=h>>>0>e>>>0?g+1|0:g;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+80>>2]=0|g;y[f+84>>2]=g?e:0;if(g){break k}break e}if(!(e&1)){break e}}g=y[f+84>>2];Rc(f+4|0,s,j,g,n,l,r);i=Xa(f+44|0);e=y[f+4>>2];h=e;j=e>>31;e=y[f+8>>2];Hb(i,k,h,j,e,e>>31,y[a+52>>2]);h=y[f+12>>2];if(h){e=g>>31;g=g+h|0;h=g>>>0>>0?e+1|0:e;e=g;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;h=0;y[f+80>>2]=g|h;y[f+84>>2]=g?e:0}i=1;m=m+1|0;break e}y[f+80>>2]=0;y[f+84>>2]=0;break e}i=0}mb(f+44|0);e=0;if(i){continue}break}break b}break}y[f+108>>2]=0;g=k;break a}g=0}la(f+108|0);Y=f+112|0;return g}function eb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0;j=Y-32|0;Y=j;a:{b:{c:{if(!qa(a)){break c}k=y[a+12>>2];if((k|0)>=(b|0)){break c}g=y[a+16>>2];if((268435452/(g|0)|0)<(b|0)){break c}if((k|0)<0){break b}d=g>>31;q=se(g,d,k);k=Z;if((k|0)==1|k>>>0>1){break b}g=se(g,d,b);d=Z;if((d|0)==1|d>>>0>1){break b}d:{if(z[a+4|0]==1){k=y[a>>2];y[a>>2]=0;y[j+20>>2]=0;_c(a,j+20|0);y[j+28>>2]=0;if(!d&g>>>0>2147479550|d){break a}e:{if(!k){g=Ya(g);break e}if(!g){ma(k);g=0;break e}f:{if(g>>>0>4294967239){break f}m=g>>>0<=8?8:g+3&-4;d=m+8|0;g=k;r=g-4|0;i=r;f=y[i>>2];e=f+i|0;h=y[e>>2];g:{h:{i:{if((h|0)!=y[(e+h|0)-4>>2]){h=f+h|0;if(h>>>0>=d+16>>>0){f=y[e+4>>2];e=y[e+8>>2];y[f+8>>2]=e;y[e+4>>2]=f;f=d+i|0;e=h-d|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e|1;e=y[f>>2]-8|0;j:{if(e>>>0<=127){n=(e>>>3|0)-1|0;break j}h=H(e);n=((e>>>29-h^4)-(h<<2)|0)+110|0;if(e>>>0<=4095){break j}e=((e>>>30-h^2)-(h<<1)|0)+71|0;n=e>>>0>=63?63:e}e=n;h=e<<4;y[f+4>>2]=h+6080;h=h+6088|0;y[f+8>>2]=y[h>>2];y[h>>2]=f;y[y[f+8>>2]+4>>2]=f;h=y[1779];f=e&31;if((e&63)>>>0>=32){f=1<>>32-f}y[1778]=e|y[1778];y[1779]=f|h;y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d;e=1;break g}if(d>>>0>h>>>0){break i}d=y[e+4>>2];f=y[e+8>>2];y[d+8>>2]=f;y[f+4>>2]=d;y[i>>2]=h;y[(i+(h&-4)|0)-4>>2]=h;e=1;break g}if(f>>>0>=d+16>>>0){y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d;i=d+i|0;d=f-d|0;y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d|1;d=y[i>>2]-8|0;k:{if(d>>>0<=127){e=(d>>>3|0)-1|0;break k}f=H(d);e=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break k}d=((d>>>30-f^2)-(f<<1)|0)+71|0;e=d>>>0>=63?63:d}f=e;d=f<<4;y[i+4>>2]=d+6080;d=d+6088|0;y[i+8>>2]=y[d>>2];y[d>>2]=i;y[y[i+8>>2]+4>>2]=i;i=y[1779];d=f&31;if((f&63)>>>0>=32){f=1<>>32-d}y[1778]=e|y[1778];y[1779]=f|i;e=1;break g}e=1;if(d>>>0<=f>>>0){break h}}e=0}}if(e){break e}g=Ya(m);if(!g){break f}l=y[r>>2]-8|0;l=l>>>0>m>>>0?m:l;if(l){p(g,k,l)}ma(k);l=g}g=l}if(!g){break a}nb(a,g);Ha(j+28|0);break d}Da(j+20|0,a);k=y[j+20>>2];l=y[j+24>>2];nb(a,ab(g,1));Da(j+12|0,a);if(l>>>0>B[j+16>>2]){break b}if(!l){break d}p(y[j+12>>2],k,l)}y[a+12>>2]=b;Da(j+20|0,a);a=y[j+24>>2];if(q>>>0>a>>>0){break b}c=0-c|0;b=q+y[j+20>>2]|0;a=a-q|0;while(1){if((a|0)<=0){break c}w[b|0]=c;a=a-1|0;b=b+1|0;continue}}Y=j+32|0;return}o()}rb();o()}function nc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;f=Y-48|0;Y=f;v=xa(y[a+4>>2],y[a+8>>2]);y[f+44>>2]=v;a:{b:{if(!qa(v)){break b}c:{m=y[a+4>>2];if(!m){break c}n=y[a+8>>2];L=e?n:n&2147483647;e=e<<1;B=e+2448|0;G=e+2466|0;C=e+2442|0;H=e+2436|0;I=e+2430|0;M=e+2460|0;N=e+2454|0;O=e+2424|0;e=m-1|0;p=e>>>3|0;J=(e&7)+1|0;n=0;m=0;e=0;while(1){d:{e:{if((x|0)!=(L|0)){ja(f+36|0,v,x);r=y[f+40>>2];s=y[f+36>>2];if(z[a+1|0]!=1){t=e;break e}if(z[b|0]){break b}h=A[O>>1];if(h>>>0>=d>>>0){break c}t=0;h=ka(b,(h<<3)+c|0);if((h|0)==(e|0)){break e}y[f+32>>2]=r;y[f+28>>2]=s;y[f+24>>2]=m;y[f+20>>2]=n;t=y[f+32>>2];y[f+8>>2]=y[f+28>>2];y[f+12>>2]=t;t=y[f+24>>2];y[f>>2]=y[f+20>>2];y[f+4>>2]=t;Pa(f+8|0,f);e=e^h;break d}y[f+44>>2]=0;break a}f:{g:{h:{if(x>>>0<=1){i=0;k=0;l=(x|0)!=1;if(!l){if(!m){break c}k=z[n|0]}q=A[I>>1];g=A[H>>1]&k>>>q;while(1){if((i|0)!=(p|0)){if(!l){e=i+1|0;if(e>>>0>=m>>>0){break c}k=z[e+n|0]|k<<8}j=0;e=7;while(1){if((e|0)>=0){if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}u=A[B>>1]&k>>>e+q|(A[C>>1]&g)<<1;h=ka(b,(g<<3)+c|0);g=u|h;j=h<>>0<=g>>>0){break c}u=A[B>>1]&h>>>l-e|(A[C>>1]&g)<<1;i=ka(b,(g<<3)+c|0);g=u|i;j=i<<7-e|j;e=e+1|0;continue}}if(!g|!m|(m-1>>>0

>>0|p>>>0>r>>>0)|g-1>>>0

>>0){break c}k=z[n|0];F=A[I>>1];K=A[N>>1];D=z[i|0]<>1]&k>>>F|D&A[M>>1];u=p+s|0;h=n;l=s;while(1){i:{E=D<<8;if((l|0)==(u|0)){break i}h=h+1|0;k=z[h|0]|k<<8;i=i+1|0;D=E|z[i|0]<=0){if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}E=A[B>>1]&k>>>e+F|(A[G>>1]&D>>>e|(A[C>>1]&g)<<1);q=ka(b,(g<<3)+c|0);g=E|q;j=q<>>0<=g>>>0){break c}h=ka(b,(g<<3)+c|0);i=7-j|0;e=h<>1]&l>>>q-j|(A[G>>1]&E>>>i|(A[C>>1]&g)<<1));j=j+1|0;continue}}if(p>>>0>=r>>>0){break c}w[p+s|0]=j;break f}if(p>>>0>=r>>>0){break c}w[u|0]=e}e=t}x=x+1|0;i=n;g=m;n=s;m=r;continue}}o()}v=0}la(f+44|0);Y=f+48|0;return v}function ic(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{if(!z[a+1|0]){g=y[a+60>>2];break d}f=y[b+4>>2];if(z[f|0]){break a}h=y[c>>2];if(h>>>0>=B[b+12>>2]){break c}g=y[a+60>>2]^ka(f,y[b+8>>2]+(h<<3)|0);y[a+60>>2]=g}if(g){ed(a,y[y[b>>2]>>2]);break b}f=y[a+24>>2];if(f>>>0<=1){if((f|0)==1){if(!y[a+40>>2]){break c}j=z[y[a+36>>2]]}i=y[c+12>>2]&j>>>y[c+8>>2];h=(f|0)!=1;while(1){if((d|0)!=(k|0)){if(!h){f=k+1|0;if(f>>>0>=B[a+40>>2]){break c}j=z[f+y[a+36>>2]|0]|j<<8}g=7;l=0;while(1){if((g|0)>=0){f=y[b+4>>2];if(z[f|0]){break a}if(B[b+12>>2]<=i>>>0){break c}f=ka(f,y[b+8>>2]+(i<<3)|0);i=f|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+4>>2]&i)<<1);l=f<>2]<=k>>>0){break c}w[y[a+44>>2]+k|0]=l;k=k+1|0;continue}break}f=j<<8;g=0;l=0;while(1){if((e|0)!=(g|0)){h=y[b+4>>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}h=ka(h,y[b+8>>2]+(i<<3)|0);j=7-g|0;l=h<>2]&f>>>j+y[c+8>>2]|(y[c+4>>2]&i)<<1);g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=l;break b}if(!y[a+32>>2]|!y[a+40>>2]){break c}j=z[y[a+36>>2]];k=z[y[a+28>>2]]<>2];i=y[c+12>>2]&j>>>y[c+8>>2]|k&y[c+24>>2];f=0;while(1){e:{if((d|0)!=(f|0)){h=f+1|0;if(h>>>0>=B[a+32>>2]|h>>>0>=B[a+40>>2]){break c}k=z[h+y[a+28>>2]|0]<>2]|k<<8;j=z[h+y[a+36>>2]|0]|j<<8;g=7;l=0;while(1){if((g|0)<0){break e}m=y[b+4>>2];if(z[m|0]){break a}if(B[b+12>>2]<=i>>>0){break c}m=ka(m,y[b+8>>2]+(i<<3)|0);i=m|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+28>>2]&k>>>g|(y[c+4>>2]&i)<<1));l=m<>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}k=ka(h,y[b+8>>2]+(i<<3)|0);h=7-g|0;f=k<>2]&l>>>h+y[c+8>>2]|(y[c+28>>2]&j>>>h|(y[c+4>>2]&i)<<1));g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;break b}if(B[a+48>>2]<=f>>>0){break c}w[y[a+44>>2]+f|0]=l;f=h;continue}}o()}return 1}return 0}function pe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;c=Y-48|0;Y=c;m=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];g=y[y[b>>2]>>2];ja(c+40|0,g,y[a+24>>2]-1|0);ja(c+32|0,g,y[a+24>>2]-2|0);A=u+317736|0;n=y[c+36>>2];p=y[c+32>>2];d=y[a+24>>2];C=t>>>0>39717;q=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,g,d);h=y[c+36>>2];r=y[c+32>>2];y[c+40>>2]=r;y[c+44>>2]=h;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[m|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(m,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=r;y[c+28>>2]=h;y[c+8>>2]=r;y[c+12>>2]=h;h=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=h;Pa(c+8|0,c);break d}i=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);x=y[c+36>>2];v=y[c+32>>2]}d=c+32|0;ja(d,g,y[a+24>>2]+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+19|0]|0);F=y[c+36>>2];G=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+21|0]|0);H=y[c+36>>2];I=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+23|0]|0);J=y[c+36>>2];K=y[c+32>>2];e=y[g+8>>2];i=!n|(e|0)<2?i:z[p|0]>>>6&1;i=!n|(e|0)<=0?i:z[p|0]>>>6&2|i;f=0;f=!j|(e|0)<3?f:z[k|0]>>>5&1;f=!j|(e|0)<2?f:z[k|0]>>>5&2|f;f=!j|(e|0)<=0?f:z[k|0]>>>5&4|f;s=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,v,x)){break h}}l=ia(e,w[a+16|0]+d|0,E,D);L=ia(e,w[a+18|0]+d|0,G,F);M=ia(e,w[a+20|0]+d|0,I,H);e=ia(e,w[a+22|0]+d|0,K,J);if(z[m|0]){break b}e=f<<5|i<<12|l<<4|L<<10|M<<11|e<<15|s;if(e>>>0>=t>>>0){break e}l=ka(m,(e<<3)+u|0);e=y[g+8>>2];if(!l){break h}La(e,d,r,h,1);e=y[g+8>>2];l=1;break g}l=0}i=ia(e,d+2|0,p,n)|i<<1&6;f=ia(e,d+3|0,k,j)|f<<1&30;d=d+1|0;s=s<<1&14|l;continue}}o()}h=y[b+16>>2];if(!h){break c}if(!(_[y[y[h>>2]+8>>2]](h)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;q=3}y[a+52>>2]=q;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;p=k;n=j;continue}break}q=-1}Y=c+48|0;return q|0} +function mc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;f=Y-48|0;Y=f;i=xa(y[a+4>>2],y[a+8>>2]);y[f+44>>2]=i;a:{b:{if(!qa(i)){break b}Qa(i,0);K=e|2;L=5-e|0;M=4-e|0;k=e>>>1|0;N=k^3;j=e<<1;O=j+2490|0;P=j+2484|0;Q=j+2478|0;R=j+2472|0;S=k^1;T=2-k|0;x=e&1;U=x+1|0;V=j+2424|0;j=0;k=0;while(1){c:{d:{e:{if(B[a+8>>2]>m>>>0){ja(f+36|0,i,m);t=y[f+40>>2];u=y[f+36>>2];if(z[a+1|0]!=1){n=g;break e}if(z[b|0]){break b}h=A[V>>1];if(h>>>0>=d>>>0){break d}n=0;h=ka(b,(h<<3)+c|0);if((h|0)==(g|0)){break e}y[f+32>>2]=t;y[f+28>>2]=u;y[f+24>>2]=k;y[f+20>>2]=j;n=y[f+32>>2];y[f+8>>2]=y[f+28>>2];y[f+12>>2]=n;n=y[f+24>>2];y[f>>2]=y[f+20>>2];y[f+4>>2]=n;g=g^h;i=y[f+44>>2];Pa(f+8|0,f);break c}y[f+44>>2]=0;break a}C=0;D=0;E=0;if(z[a+2|0]==1){ja(f+36|0,y[a+12>>2],m);E=y[f+40>>2];D=y[f+36>>2]}g=f+36|0;i=y[f+44>>2];ja(g,i,w[a+17|0]+m|0);W=y[f+40>>2];X=y[f+36>>2];F=0;G=0;H=0;I=0;J=0;if(!e){ja(g,i,w[a+19|0]+m|0);C=y[f+40>>2];F=y[f+36>>2];ja(g,i,w[a+21|0]+m|0);G=y[f+40>>2];H=y[f+36>>2];ja(g,i,w[a+23|0]+m|0);J=y[f+36>>2];I=y[f+40>>2]}h=y[i+8>>2];p=ia(h,U,r,s)|ia(h,x,r,s)<<1;p=!s|(e|0)!=1|(h|0)<=0?p:z[r|0]>>>5&4|p;q=ia(h,T,j,k)|ia(h,S,j,k)<<1;q=!k|e>>>0>1|(h|0)<=0?q:z[j|0]>>>5&4|q;v=0;g=0;while(1){if(B[a+4>>2]<=g>>>0){g=n;break c}f:{g:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],g,D,E)){break g}}if(z[b|0]){break b}l=q<>1]|v;if(!e){l=ia(h,w[a+18|0]+g|0,F,C)<<10|ia(h,w[a+20|0]+g|0,H,G)<<11|ia(h,w[a+22|0]+g|0,J,I)<<15|l}if(d>>>0<=l>>>0){break d}l=ka(b,(l<<3)+c|0);h=y[i+8>>2];if(!l){break g}La(h,g,u,t,1);h=y[i+8>>2];l=1;break f}l=0}p=(ia(h,g+K|0,r,s)|p<<1)&A[Q>>1];q=(ia(h,g+N|0,j,k)|q<<1)&A[P>>1];g=g+1|0;v=A[O>>1]&(l|v<<1);continue}}o()}m=m+1|0;r=j;s=k;j=u;k=t;continue}}i=0}la(f+44|0);Y=f+48|0;return i}function ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0;k=Y-16|0;Y=k;h=y[b+4>>2];l=y[b+12>>2];m=y[b+8>>2];n=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(k+8|0,n);d=y[k+12>>2];y[a+44>>2]=y[k+8>>2];y[a+48>>2]=d}a:{b:{c:{d=y[a+4>>2];if(!d){break c}r=m+3240|0;d=d-1|0;i=d>>>3|0;p=(d&7)+1|0;c=y[a+24>>2];s=l>>>0>405;while(1){d:{if(B[a+8>>2]<=c>>>0){c=4}else{e:{if(!z[a+1|0]){c=y[a+60>>2];break e}if(z[h|0]){break b}if(!s){break c}c=y[a+60>>2]^ka(h,r);y[a+60>>2]=c}f:{if(c){ed(a,n);break f}c=0;g=0;g:{if(!y[a+24>>2]){h:{while(1){e=7;f=0;if((g|0)==(i|0)){break h}i:{while(1){if((e|0)>=0){if(z[h|0]){break i}if(c>>>0>=l>>>0){break c}d=ka(h,(c<<3)+m|0);c=d|c<<1&1006;f=d<>2]<=g>>>0){break c}w[y[a+44>>2]+g|0]=f;g=g+1|0;continue}break}if(g>>>0>>0){break b}}e=0;f=0;while(1){if((e|0)==(p|0)){break g}if(z[h|0]){break b}if(c>>>0>=l>>>0){break c}d=ka(h,(c<<3)+m|0);c=d|c<<1&1006;f=d<<7-e|f;e=e+1|0;continue}}if(!y[a+40>>2]){break c}g=z[y[a+36>>2]];e=g>>>1&112;d=0;while(1){j:{if((d|0)!=(i|0)){j=d+1|0;if(j>>>0>=B[a+40>>2]){break c}g=z[j+y[a+36>>2]|0]|g<<8;c=7;f=0;while(1){if((c|0)<0){break j}if(z[h|0]){break b}if(e>>>0>=l>>>0){break c}q=ka(h,(e<<3)+m|0);e=q|(g>>>c+1&16|e<<1&1006);f=q<>>0>=l>>>0){break c}j=ka(h,(e<<3)+m|0);e=j|(d>>>8-c&16|e<<1&1006);f=j<<7-c|f;c=c+1|0;continue}break}if(B[a+48>>2]<=i>>>0){break c}w[y[a+44>>2]+i|0]=f;break f}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;d=j;continue}}if(B[a+48>>2]<=i>>>0){break c}w[y[a+44>>2]+i|0]=f}Kb(a,n);d=y[b+16>>2];if(!d){break d}if(!(_[y[y[d>>2]+8>>2]](d)|0)){break d}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c;break a}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}c=-1}Y=k+16|0;return c|0}function $d(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=Y-80|0;Y=g;w[g+72|0]=0;y[g+68>>2]=0;i=c+31>>>3&536870908;k=E(i,d);h=yd(k,1);y[g>>2]=0;j=g+68|0;nb(j,h);Ha(g);a:{b:{if(!qa(j)){break b}j=Nb(j);h=g+56|0;y[g+60>>2]=h;y[g+56>>2]=h;y[g+64>>2]=0;y[g+48>>2]=0;y[g+52>>2]=0;l=a;y[g+32>>2]=a;y[g+36>>2]=b;y[g>>2]=c;h=e;y[g+24>>2]=h;y[g+28>>2]=f;y[g+16>>2]=0;y[g+20>>2]=0;y[g+40>>2]=j;y[g+44>>2]=k;y[g+8>>2]=0;y[g+12>>2]=0;y[g+4>>2]=d;y[g+48>>2]=i;a=se(d,0,i);if(Z|a>>>0>k>>>0){break a}e=j;while(1){if((a|0)>0){w[e|0]=0;a=a-1|0;e=e+1|0;continue}break}a=b;b=g+56|0;a=zc(na(116),l,a,b,0);if(f){b=zc(na(116),h,f,b,1);y[g+76>>2]=0;zb(a,b);Ab(g+76|0)}e=c+7>>>3|0;y[g+76>>2]=0;f=g+52|0;zb(f,a);Ab(g+76|0);c:{d:{b=y[g+52>>2];a=y[b>>2];if(!a){break d}if(!yc(a)){break d}y[b+56>>2]=-1;a=0;break c}y[b+52>>2]=0;a=na(20);y[a+16>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;w[a+4|0]=0;y[a>>2]=0;e:{if((c|d)<0|i>>>0>268435452){break e}h=i<<3;if((h|0)<(c|0)|(!(!i|(d|0)<=0|k)|(2147483616/(h>>>0)|0)<(d|0))){break e}y[a+16>>2]=i;y[a+12>>2]=d;y[a+8>>2]=c;y[g+76>>2]=j;_c(a,g+76|0)}y[g+76>>2]=0;oa(b+32|0,a);la(g+76|0);w[b+50|0]=1;a=id(b)}f:{while(1){g:{a=a&1;h:{b=y[y[g+52>>2]+56>>2];if((b|0)!=4){break h}zb(g+52|0,0);b=-1;if(!a){break h}i:{b=E(y[g+48>>2],y[g+4>>2]);if(b>>>0>B[g+44>>2]){break i}a=y[g+40>>2];if(a&3){break i}c=(b&-4)+a|0;b=4;while(1){if((a|0)==(c|0)){break h}y[a>>2]=y[a>>2]^-1;a=a+4|0;continue}}o()}j:{switch(b-3|0){case 0:break j;case 1:break g;default:break f}}a=id(y[g+52>>2]);continue}break}X(Nb(g+68|0)|0,e|0,i|0,d|0)}Ab(f);if(!y[g+64>>2]){break b}a=y[g+60>>2];b=y[a>>2];c=y[y[g+56>>2]+4>>2];y[b+4>>2]=c;y[c>>2]=b;y[g+64>>2]=0;while(1){if((g+56|0)==(a|0)){break b}b=y[a+4>>2];oc(a);a=b;continue}}ub(g+68|0);Y=g+80|0;return}o()}function Ya(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{while(1){if(a>>>0>4294967239){break b}b=y[1779];c=b;f=y[1778];a=a>>>0<=8?8:a+3&-4;c:{if(a>>>0<=127){d=(a>>>3|0)-1|0;break c}e=H(a);d=((a>>>29-e^4)-(e<<2)|0)+110|0;if(a>>>0<=4095){break c}e=((a>>>30-e^2)-(e<<1)|0)+71|0;d=e>>>0>=63?63:e}g=d;d=g&31;if((g&63)>>>0>=32){e=0;b=b>>>d|0}else{e=b>>>d|0;b=((1<>>d}if(b|e){while(1){d=e;d:{if(d|b){c=d-1|0;e=c+1|0;f=c;c=b-1|0;f=(c|0)!=-1?e:f;e=H(d^f);e=(e|0)==32?H(b^c)+32|0:e;c=63-e|0;Z=0-(e>>>0>63)|0;break d}Z=0;c=64}f=c;c=f&31;if((f&63)>>>0>=32){e=0;h=d>>>c|0}else{e=d>>>c|0;h=((1<>>c}g=f+g|0;b=g<<4;d=y[b+6088>>2];c=b+6080|0;e:{if((d|0)!=(c|0)){b=dc(d,a);if(b){break a}b=y[d+4>>2];f=y[d+8>>2];y[b+8>>2]=f;y[f+4>>2]=b;y[d+8>>2]=c;y[d+4>>2]=y[c+4>>2];y[c+4>>2]=d;y[y[d+4>>2]+8>>2]=d;g=g+1|0;b=(e&1)<<31|h>>>1;e=e>>>1|0;break e}j=y[1779];f=g&63;b=f;d=b&31;if(b>>>0>=32){b=0;c=-1>>>d|0}else{b=-1>>>d|0;c=b|(1<>>0>=32){b=c<>>32-d|b<>>0>=32){b=-1<>>32-b}k=c&-2;c=f&31;if(f>>>0>=32){f=0;c=b>>>c|0}else{f=b>>>c|0;c=((1<>>c}b=c|i;Z=d|f;y[1778]=y[1778]&b;y[1779]=Z&j;b=h^1}if(b|e){continue}break}f=y[1778];c=y[1779]}e=H(c);d=63-((e|0)==32?H(f)+32|0:e)|0;f:{if(!(c|f)){g=0;break f}b=d<<4;g=y[b+6088>>2];if(!c&f>>>0<1073741824){break f}e=98;c=b+6080|0;if((c|0)==(g|0)){break f}while(1){b=dc(g,a);if(b){break a}g=y[g+8>>2];if((c|0)==(g|0)){break f}b=e;e=b-1|0;if(b){continue}break}}if(Fd(a+48|0)){continue}break}if(!g){break b}e=(d<<4)+6080|0;if((e|0)==(g|0)){break b}while(1){b=dc(g,a);if(b){break a}g=y[g+8>>2];if((e|0)!=(g|0)){continue}break}}b=0}return b}function Ld(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=a<<3;o=c+7136|0;i=D[c+7168>>3];if(i!=0){l=D[o>>3];m=J(l,b);b=m-l;if(b<0x10000000000000000&b>=0){d=~~b>>>0;if(G(b)>=1){c=~~(b>0?I(K(b*2.3283064365386963e-10),4294967295):L((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}}else{c=0}if(i<0x10000000000000000&i>=0){h=~~i>>>0;if(G(i)>=1){e=~~(i>0?I(K(i*2.3283064365386963e-10),4294967295):L((i-+(~~i>>>0>>>0))*2.3283064365386963e-10))>>>0}else{e=0}}else{e=0}a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(c){if(!h){break k}if(!e){break j}f=H(e)-H(c)|0;if(f>>>0<=31){break i}break c}if((e|0)==1|e>>>0>1){break c}Z=0;c=(d>>>0)/(h>>>0)|0;break a}if(!d){break h}if(!e|e-1&e){break g}c=c>>>ue(e)|0;Z=0;break a}if(!(h-1&h)){break f}k=(H(h)+33|0)-H(c)|0;j=0-k|0;break d}k=f+1|0;j=63-f|0;break d}Z=0;c=(c>>>0)/(e>>>0)|0;break a}f=H(e)-H(c)|0;if(f>>>0<31){break e}break c}if((h|0)==1){break b}h=ue(h);e=h&31;if((h&63)>>>0>=32){c=c>>>e|0}else{f=c>>>e|0;c=((1<>>e}Z=f;break a}k=f+1|0;j=63-f|0}f=k&63;g=f&31;if(f>>>0>=32){f=0;n=c>>>g|0}else{f=c>>>g|0;n=((1<>>g}j=j&63;g=j&31;if(j>>>0>=32){c=d<>>32-g|c<>>31;f=n<<1|c>>>31;g=s-(p+(f>>>0>j>>>0)|0)>>31;q=g&h;n=f-q|0;f=p-((e&g)+(f>>>0>>0)|0)|0;c=c<<1|d>>>31;d=r|d<<1;r=g&1;k=k-1|0;if(k){continue}break}}Z=c<<1|d>>>31;c=r|d<<1;break a}d=0;c=0}Z=c;c=d}d=Z;c=c+1|0;d=c?d:d+1|0;l=(+(c>>>0)+ +(d>>>0)*4294967296)*i+l;m=l-m}D[o>>3]=l;Q(a|0,+m)|0;a=(a|0)==2?27:(a|0)==1?26:14;c=a-1|0;l:{if(y[1780]>>>c&1){y[1782]=y[1782]|1<>2];if(c){_[c|0](a)}}}function ne(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;c=Y-48|0;Y=c;n=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];i=y[y[b>>2]>>2];ja(c+40|0,i,y[a+24>>2]-1|0);ja(c+32|0,i,y[a+24>>2]-2|0);C=u+15528|0;l=y[c+36>>2];m=y[c+32>>2];e=y[a+24>>2];D=t>>>0>1941;p=4;a:{while(1){b:{c:{if(B[a+8>>2]>e>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,e);h=y[c+36>>2];q=y[c+32>>2];y[c+40>>2]=q;y[c+44>>2]=h;d:{e:{f:{if(!z[a+1|0]){e=y[a+60>>2];break f}if(z[n|0]){break b}if(!D){break e}e=y[a+60>>2]^ka(n,C);y[a+60>>2]=e}if(e){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=q;y[c+28>>2]=h;y[c+8>>2]=q;y[c+12>>2]=h;h=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=h;Pa(c+8|0,c);break d}f=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);x=y[c+32>>2];v=y[c+36>>2]}ja(c+32|0,i,y[a+24>>2]+w[a+17|0]|0);E=y[c+36>>2];F=y[c+32>>2];d=y[i+8>>2];f=!l|(d|0)<3?f:z[m|0]>>>5&1;f=!l|(d|0)<2?f:z[m|0]>>>5&2|f;f=!l|(d|0)<=0?f:z[m|0]>>>5&4|f;g=0;g=!j|(d|0)<3?g:z[k|0]>>>5&1;g=!j|(d|0)<2?g:z[k|0]>>>5&2|g;g=!j|(d|0)<=0?g:z[k|0]>>>5&4|g;s=0;e=0;while(1){if(B[a+4>>2]<=e>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],e,x,v)){break h}}d=ia(d,w[a+16|0]+e|0,F,E);if(z[n|0]){break b}d=g<<4|f<<9|d<<3|s;if(d>>>0>=t>>>0){break e}r=ka(n,(d<<3)+u|0);d=y[i+8>>2];if(!r){break h}La(d,e,q,h,1);d=y[i+8>>2];r=1;break g}r=0}A=e+3|0;f=ia(d,A,m,l)|f<<1&14;g=ia(d,A,k,j)|g<<1&30;e=e+1|0;s=s<<1&6|r;continue}}o()}h=y[b+16>>2];if(!h){break c}if(!(_[y[y[h>>2]+8>>2]](h)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;p=3}y[a+52>>2]=p;break a}e=y[a+24>>2]+1|0;y[a+24>>2]=e;m=k;l=j;continue}break}p=-1}Y=c+48|0;return p|0}function le(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0;c=Y-48|0;Y=c;l=y[b+4>>2];s=y[b+12>>2];t=y[b+8>>2];i=y[y[b>>2]>>2];ja(c+40|0,i,y[a+24>>2]-1|0);ja(c+32|0,i,y[a+24>>2]-2|0);A=t+1832|0;m=y[c+36>>2];n=y[c+32>>2];d=y[a+24>>2];C=s>>>0>229;a:{while(1){b:{c:{if(B[a+8>>2]<=d>>>0){d=4}else{j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,d);f=y[c+36>>2];p=y[c+32>>2];y[c+40>>2]=p;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[l|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(l,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=p;y[c+28>>2]=f;y[c+8>>2]=p;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Pa(c+8|0,c);break d}g=0;u=0;v=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);v=y[c+32>>2];u=y[c+36>>2]}ja(c+32|0,i,y[a+24>>2]+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];e=y[i+8>>2];g=!m|(e|0)<2?g:z[n|0]>>>6&1;g=!m|(e|0)<=0?g:z[n|0]>>>6&2|g;h=0;h=!j|(e|0)<2?h:z[k|0]>>>6&1;h=!j|(e|0)<=0?h:z[k|0]>>>6&2|h;r=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,v,u)){break h}}e=ia(e,w[a+16|0]+d|0,E,D);if(z[l|0]){break b}e=h<<3|g<<7|e<<2|r;if(e>>>0>=s>>>0){break e}q=ka(l,(e<<3)+t|0);e=y[i+8>>2];if(!q){break h}La(e,d,p,f,1);e=y[i+8>>2];q=1;break g}q=0}x=d+2|0;g=ia(e,x,n,m)|g<<1&6;h=ia(e,x,k,j)|h<<1&14;d=d+1|0;r=r<<1&2|q;continue}}o()}f=y[b+16>>2];if(!f){break c}if(!(_[y[y[f>>2]+8>>2]](f)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;d=3}y[a+52>>2]=d;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;n=k;m=j;continue}break}d=-1}Y=c+48|0;return d|0}function ec(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,C=0,D=0,E=0;k=((b&536870911)<<3|a>>>29)&-8;m=e;n=g;p=d;q=f;r=1;e=-1;a:{b:{c:while(1){j=r&1;u=j?326:325;v=j?1392:1056;w=j?325:326;x=j?1056:1392;d:while(1){A=e+1|0;t=e>>>3|0;C=t+q|0;D=1<<((e^-1)&7);d=y[c>>2];E=(e|0)<0;while(1){if(d>>>0>=k>>>0){break b}if(E){f=1}else{if(n>>>0<=t>>>0){break a}f=(z[C|0]&D)!=0}d=h;g=d;l=f^1;i=cc(q,n,d,A,l);s=d;e:{if((i|0)>=(d|0)){break e}f:{if((f|0)==(j|0)){l=f;break f}i=cc(q,n,h,i+1|0,f)}s=h;if((d|0)<=(i|0)){break e}g=i;s=cc(q,n,d,i+1|0,l)}d=s;g:{f=0;h:{if(Ka(a,b,c)){break h}if(B[c>>2]>=k>>>0){break b}i=Ka(a,b,c);if(B[c>>2]>=k>>>0){break b}l=Ka(a,b,c);f=l?1:-1;if(i){break h}if(l){d=0;while(1){f=bc(x,w,a,b,c);d=f+d|0;if((f|0)>63){continue}break}d=(e>>>31|0)+d|0;if((d|0)<0){break b}f=d+e|0;if(!j){lb(p,m,h,e,f)}d=0;while(1){e=bc(v,u,a,b,c);d=e+d|0;if((e|0)>63){continue}break}if((d|0)<0){break b}e=d+f|0;if(j){lb(p,m,h,f,e)}if((e|0)<(h|0)){continue d}break b}if(B[c>>2]>=k>>>0){break b}if(Ka(a,b,c)){if(!j){lb(p,m,h,e,d)}e=d;if((d|0)<(h|0)){continue d}break b}if(B[c>>2]>=k>>>0){break b}d=Ka(a,b,c);if(B[c>>2]>=k>>>0){break b}i=Ka(a,b,c);f=i?2:-2;if(d){break h}d=y[c>>2];if(!i){break g}if(d>>>0>=k>>>0){break b}f=Ka(a,b,c)?3:-3}d=f+g|0;if(!j){lb(p,m,h,e,d)}if((d|0)<=(e|0)|(d|0)>=(h|0)){break b}r=r^1;e=d;continue c}if(d>>>0>=k>>>0){break b}f=Ka(a,b,c);d=y[c>>2];if(f){d=d+3|0;y[c>>2]=d;continue}break}break}break}y[c>>2]=d+5}return}o()}function uc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0;f=Y-32|0;Y=f;m=xa(y[a>>2],y[a+4>>2]);y[f+28>>2]=m;a:{if(!qa(m)){break a}Qa(m,z[a+20|0]);b:{while(1){if(!k&l>>>0>=B[a+36>>2]|k){y[f+28>>2]=0;d=m;break a}d=y[b>>2];g=y[b+4>>2];e=0;y[f+24>>2]=0;y[f+16>>2]=0;y[f+20>>2]=0;c=g-d|0;h=c>>2;c:{d:{if((d|0)==(g|0)){j=0;break d}if(h>>>0>=536870912){break c}j=na(c<<1);y[f+16>>2]=j;e=(h<<3)+j|0;y[f+24>>2]=e;c=j;while(1){if((c|0)!=(e|0)){y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}y[f+20>>2]=e}if(h>>>0>e-j>>3>>>0){break b}c=j;while(1){if((d|0)==(g|0)){e:{c=y[a+44>>2];d=se(l,k,A[a+48>>1]);e=c+d|0;q=e;c=Z+(c>>31)|0;r=d>>>0>e>>>0?c+1|0:c;c=y[a+40>>2];d=se(l,k,A[a+50>>1]);e=c+d|0;s=e;c=Z+(c>>31)|0;t=d>>>0>e>>>0?c+1|0:c;g=0;e=0;f:while(1){if(!e&B[a+32>>2]<=g>>>0|e){break e}i=y[b>>2];p=y[b+4>>2]-i>>2;c=0;d=0;while(1){h=c&255;if(h>>>0>=p>>>0){c=y[a+12>>2]-1|0;h=y[y[y[a+16>>2]>>2]+((c>>>0>>0?c:d)<<2)>>2];d=se(g,e,A[a+48>>1]);c=d+s|0;i=Z+t|0;d=c>>>0>>0?i+1|0:i;i=se(g,e,A[a+50>>1]);p=q-i|0;u=(d&255)<<24|c>>>8;n=d>>8;c=r-(Z+(i>>>0>q>>>0)|0)|0;d=c>>8;Hb(h,m,u,n,(c&255)<<24|p>>>8,d,y[a+24>>2]);g=g+1|0;e=g?e:e+1|0;continue f}else{n=(h<<3)+j|0;d=d|ia(y[y[i+(h<<2)>>2]+8>>2],g,y[n>>2],y[n+4>>2])<>2],l);e=y[f+12>>2];y[c>>2]=y[f+8>>2];y[c+4>>2]=e;c=c+8|0;d=d+4|0;continue}break}l=l+1|0;k=l?k:k+1|0;ya(f+16|0);continue}break}Ba()}o()}la(f+28|0);Y=f+32|0;return d}function sb(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;f=Y-16|0;Y=f;a:{j=xa(d,e);if(!qa(j)){break a}if(!qa(a)|(b|0)<0|(c|0)<0|y[a+8>>2]<=(b|0)){break a}g=y[a+12>>2];if((g|0)<=(c|0)){break a}b:{if(!(b&7)){d=y[a+16>>2];b=b>>>3|0;if(d>>>0<=b>>>0){break b}d=d-b|0;e=y[j+16>>2];d=d>>>0>>0?d:e;if(!d){break b}e=0;h=g-c|0;i=y[j+12>>2];h=(h|0)<(i|0)?h:i;h=(h|0)>0?h:0;while(1){if((e|0)==(h|0)){break a}ja(f+8|0,a,c+e|0);i=y[f+12>>2];if(i>>>0>>0|d>>>0>i-b>>>0){break b}i=y[f+8>>2];ja(f,j,e);if(d>>>0>B[f+4>>2]){break b}if(d){p(y[f>>2],b+i|0,d)}e=e+1|0;continue}}h=b>>>5|0;e=y[a+16>>2]>>>2|0;if(h>>>0>=e>>>0){break b}d=y[j+16>>2]>>>2|0;if(!d){break b}e=e-h|0;i=d>>>0>e>>>0?e:d;q=b&31;d=g-c|0;e=y[j+12>>2];d=(d|0)<(e|0)?d:e;r=(d|0)>0?d:0;s=b^-1;c:while(1){if((l|0)==(r|0)){break a}d=f+8|0;ja(d,a,c+l|0);e=y[f+8>>2];if(e&3){break b}g=y[f+12>>2]>>>2|0;if(g>>>0>>0){break b}y[f+12>>2]=g-h;y[f+8>>2]=e+(h<<2);Ca(f,j,l);if(B[f+4>>2]>>0){break b}e=y[f>>2];g=_a(d);d=y[f+8>>2];n=y[f+12>>2];k=i>>>0>n>>>0?n:i;if(k>>>0>B[f+12>>2]){break b}k=(k<<2)+e|0;g=te(g,24)&16711935|te(g&16711935,8);while(1)if((e|0)==(k|0)){if(i>>>0>n>>>0){d=g<>2]=u}l=l+1|0;continue c}else{m=g<>2];g=te(g&16711935,8)|te(g,24)&16711935;m=m|g>>>1>>>s;t=e,u=te(m&16711935,8)|te(m,24)&16711935,y[t>>2]=u;d=d+4|0;e=e+4|0;continue}}}o()}Y=f+16|0;return j}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0;c=Y-48|0;Y=c;i=y[b+4>>2];q=y[b+12>>2];r=y[b+8>>2];h=y[y[b>>2]>>2];ja(c+40|0,h,y[a+24>>2]-1|0);u=r+3240|0;d=y[a+24>>2];v=q>>>0>405;j=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){k=y[c+44>>2];l=y[c+40>>2];ja(c+32|0,h,d);f=y[c+36>>2];m=y[c+32>>2];y[c+40>>2]=m;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[i|0]){break b}if(!v){break e}d=y[a+60>>2]^ka(i,u);y[a+60>>2]=d}if(d){y[c+20>>2]=k;y[c+16>>2]=l;y[c+24>>2]=m;y[c+28>>2]=f;y[c+8>>2]=m;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Pa(c+8|0,c);break d}g=0;s=0;t=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);t=y[c+36>>2];s=y[c+32>>2]}ja(c+32|0,h,y[a+24>>2]+w[a+17|0]|0);x=y[c+36>>2];A=y[c+32>>2];e=y[h+8>>2];g=!k|(e|0)<2?g:z[l|0]>>>6&1;g=!k|(e|0)<=0?g:z[l|0]>>>6&2|g;p=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,s,t)){break h}}e=ia(e,w[a+16|0]+d|0,A,x);if(z[i|0]){break b}e=g<<5|e<<4|p;if(e>>>0>=q>>>0){break e}n=ka(i,(e<<3)+r|0);e=y[h+8>>2];if(!n){break h}La(e,d,m,f,1);e=y[h+8>>2];n=1;break g}n=0}g=ia(e,d+2|0,l,k)|g<<1&30;d=d+1|0;p=p<<1&14|n;continue}}o()}f=y[b+16>>2];if(!f){break c}if(!(_[y[y[f>>2]+8>>2]](f)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;j=3}y[a+52>>2]=j;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;continue}break}j=-1}Y=c+48|0;return j|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c=y[b+56>>2];d=y[b+60>>2];f=b+48|0;Hc(c,d,f);h=((d&536870911)<<3|c>>>29)&-8;if(h>>>0<=B[b+48>>2]){y[a>>2]=0;y[a+4>>2]=0;return}Ic(y[b+64>>2],y[b+68>>2]);i=b- -64|0;c=y[b+44>>2];a:{if((c|0)<0){e=y[b+64>>2];c=y[b+68>>2]-e|0;d=0;l=c;g=y[b+76>>2];c=y[b+80>>2]-g|0;ec(y[b+56>>2],y[b+60>>2],f,e|d,l,d|g,c,y[b+4>>2]);Gc(b+76|0,i);break a}if(!c){d=y[b+64>>2];c=y[b+68>>2]-d|0;Fc(y[b+56>>2],y[b+60>>2],f,d,c,y[b+4>>2]);break a}e=Ka(y[b+56>>2],y[b+60>>2],f);g=y[b+64>>2];c=y[b+68>>2]-g|0;d=y[b+56>>2];j=y[b+60>>2];b:{if(e){Fc(d,j,f,g,c,y[b+4>>2]);break b}l=d;d=0;e=c;k=y[b+76>>2];c=y[b+80>>2]-k|0;ec(l,j,f,d|g,e,d|k,c,y[b+4>>2])}Gc(b+76|0,i)}if(z[b+53|0]==1){Hc(y[b+56>>2],y[b+60>>2],f)}c:{d:{e:{if(z[b+52|0]!=1){break e}d=y[f>>2];if(h>>>0<=d>>>0){break e}e=d+7&-8;i=y[b+56>>2];g=y[b+60>>2];while(1){c=d>>>3|0;h=c+i|0;j=1<<((d^-1)&7);k=c>>>0>>0;c=1;f:{while(1){if(!c|d>>>0>=e>>>0){break f}if(!k){break d}if(z[h|0]&j){c=0;w[b+52|0]=0;continue}break}d=d+1|0;continue}break}if(!c){break e}y[f>>2]=e}c=y[b+64>>2];if(!z[b+54|0]){d=y[b+68>>2]-c|0;break c}if(c&3){break d}d=y[b+68>>2]-c|0;e=c+(d&-4)|0;b=c;while(1){if((b|0)==(e|0)){break c}y[b>>2]=y[b>>2]^-1;b=b+4|0;continue}}o()}y[a+4>>2]=d;y[a>>2]=c}function hd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Y-32|0;Y=d;i=y[a+24>>2];y[d+16>>2]=0;a:{b:{switch(z[a+3|0]){case 0:c=xd(a)?3:4;break a;case 1:c=wd(a)?5:6;break a;case 2:c=Qb(a)?7:8;break a;default:break b}}c=Qb(a)?9:10}e=Y-48|0;Y=e;y[e+24>>2]=0;if(c){y[e+16>>2]=0;y[e+12>>2]=c;y[e+8>>2]=2600;g=e+8|0;y[e+24>>2]=g}h=e+8|0;c:{if((h|0)==(d|0)){break c}c=y[d+16>>2];if((g|0)==(h|0)){if((d|0)==(c|0)){f=e+32|0;_[y[y[g>>2]+12>>2]](g,f);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=0;c=y[d+16>>2];_[y[y[c>>2]+12>>2]](c,h);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=0;y[e+24>>2]=h;_[y[y[e+32>>2]+12>>2]](f,d);_[y[y[e+32>>2]+16>>2]](f);y[d+16>>2]=d;break c}_[y[y[g>>2]+12>>2]](g,d);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=y[d+16>>2];y[d+16>>2]=d;break c}if((d|0)==(c|0)){f=e+8|0;_[y[y[c>>2]+12>>2]](c,f);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=y[e+24>>2];y[e+24>>2]=f;break c}y[e+24>>2]=c;y[d+16>>2]=g}gd(e+8|0);Y=e+48|0;c=y[y[b>>2]>>2];f=y[d+16>>2];y[d+28>>2]=b;if(f){f=_[y[y[f>>2]+24>>2]](f,a,d+28|0)|0;y[a+64>>2]=0;y[a+52>>2]=f;b=y[c+8>>2];y[a+68>>2]=i;y[a+72>>2]=b;y[a+76>>2]=y[a+24>>2];if((f|0)==4){y[a+24>>2]=0}gd(d);Y=d+32|0;return f}a=Fb(4);y[a>>2]=5228;P(a|0,5240,11);o()}function hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;d=Y-32|0;Y=d;h=xa(y[a+4>>2],y[a+8>>2]);y[d+8>>2]=h;Da(d,h);a:{l=y[d+4>>2];if(!l){oa(b,0);y[a+52>>2]=-1;break a}b:{f=y[h+16>>2];if((f|0)<0|!f){break b}j=y[c+12>>2]+(y[c+8>>2]<<3)|0;i=y[a+8>>2];n=y[a+4>>2];q=y[c>>2];r=y[c+4>>2];k=y[d>>2];y[d+20>>2]=0;y[d+12>>2]=0;y[d+16>>2]=0;g=d+12|0;y[d+24>>2]=g;jc(g,f);e=y[d+16>>2];g=f+e|0;while(1){if((e|0)!=(g|0)){w[e|0]=255;e=e+1|0;continue}break}w[d+28|0]=1;y[d+16>>2]=g;fd(d+24|0);m=y[d+12>>2];g=y[d+16>>2];y[d+24>>2]=j;j=0;s=(i|0)>0?i:0;e=0;g=g-m|0;t=e|m;while(1){if((j|0)!=(s|0)){i=k;e=f;if(l>>>0>>0){break b}while(1){if((e|0)>0){w[i|0]=255;e=e-1|0;i=i+1|0;continue}break}ec(q,r,d+24|0,k|u,f,t,g,n);if(f>>>0>g>>>0){break b}if(f){p(m,k,f)}j=j+1|0;l=l-f|0;k=f+k|0;continue}break}f=y[d+24>>2];g=d+12|0;ya(g);y[c+12>>2]=f&7;y[c+8>>2]=f>>>3;Da(g,h);e=y[d+12>>2];c=e+y[d+16>>2]|0;while(1)if((c|0)==(e|0)){y[a+64>>2]=0;y[a+52>>2]=4;c=y[h+8>>2];y[a+68>>2]=0;y[a+72>>2]=c;y[a+76>>2]=y[h+12>>2];y[d+8>>2]=0;oa(b,h);break a}else{w[e|0]=z[e|0]^-1;e=e+1|0;continue}}o()}la(d+8|0);Y=d+32|0}function ae(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=Y-16|0;Y=k;l=i?i:c;a:{if((l|0)<=0){break a}j=j?j:d;if((j|0)<=0|(j|l)>>>0>65535){break a}i=na(88);y[i+40>>2]=0;y[i+32>>2]=-1;y[i+36>>2]=0;y[i+20>>2]=1;y[i+24>>2]=1;y[i+16>>2]=j;y[i+12>>2]=l;y[i+8>>2]=j;y[i+4>>2]=l;y[i+56>>2]=a;y[i+60>>2]=b;w[i+54|0]=(h|0)!=0;w[i+53|0]=(f|0)!=0;w[i+52|0]=(g|0)!=0;y[i+48>>2]=0;y[i+44>>2]=e;y[i>>2]=2e3;a=l+31>>>3&16380;y[i+28>>2]=a;od(i- -64|0,a);od(i+76|0,y[i+28>>2]);e=c+7>>>3|0;W(E(e,d)|0);a=0;while(1){b:{if((a|0)==(d|0)){break b}c:{j=y[i+32>>2];b=a+1|0;if((j|0)==(b|0)){j=y[i+40>>2];c=y[i+36>>2];break c}d:{if(!((j|0)>=0&(a|0)>=(j|0))){j=0;if(!(_[y[y[i>>2]+12>>2]](i)|0)){break b}c=0;break d}c=1}while(1){if(!c){y[i+32>>2]=j;c=1;continue}e:{if((a|0)>(j|0)){_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[i+32>>2]+1|0;break e}_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[k+12>>2];c=y[k+8>>2];y[i+36>>2]=c;y[i+40>>2]=j;y[i+32>>2]=y[i+32>>2]+1;break c}c=0;continue}}if(!j){break b}V(c|0,e|0,E(a,e)|0);a=b;continue}break}_[y[y[i>>2]+4>>2]](i)}Y=k+16|0}function Fd(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=y[1508];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=$()<<16>>>0){break b}if(R(a|0)|0){break b}}y[1516]=48;b=-1;break a}y[1508]=a}d=b;if((d|0)!=-1){a=d+c|0;y[a-4>>2]=16;f=a-16|0;y[f>>2]=16;b=y[1776];if(b){e=y[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=y[d-4>>2]&-2;g=d-e|0;h=y[g-4>>2];y[b+8>>2]=a;b=h&-2;a=g-b|0;if(y[(a+y[a>>2]|0)-4>>2]&1){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;y[a>>2]=b;break c}a=d-16|0;break d}y[d>>2]=16;y[d+8>>2]=a;y[d+4>>2]=b;y[d+12>>2]=16;y[1776]=d;a=d+16|0}b=f-a|0;y[a>>2]=b}y[((b&-4)+a|0)-4>>2]=b|1;c=y[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=H(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;y[a+4>>2]=c+6080;c=c+6088|0;y[a+8>>2]=y[c>>2];y[c>>2]=a;y[y[a+8>>2]+4>>2]=a;c=y[1779];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}y[1778]=e|y[1778];y[1779]=b|c}return(d|0)!=-1}function Bb(a,b){var c=0,d=0,e=0;c=Y+-64|0;Y=c;d=y[a>>2];e=y[d-8>>2];d=y[d-4>>2];a:{if(y[d+4>>2]==y[b+4>>2]){a=e?0:a;break a}e=a+e|0;if((e|0)<=(a|0)){y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=b;y[c+8>>2]=a;y[c+4>>2]=d;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+60>>2]=0;y[c+52>>2]=1;y[c+56>>2]=16777216;_[y[y[d>>2]+20>>2]](d,c+4|0,e,e,1,0);if(y[c+28>>2]){break a}}y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=5336;y[c+8>>2]=a;y[c+4>>2]=b;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;a=0;w[c+55|0]=0;w[c+56|0]=0;w[c+57|0]=0;w[c+58|0]=0;y[c+60>>2]=0;w[c+59|0]=1;_[y[y[d>>2]+24>>2]](d,c+4|0,e,1,0);b:{switch(y[c+40>>2]){case 0:a=y[c+44>>2]==1?y[c+32>>2]==1?y[c+36>>2]==1?y[c+24>>2]:0:0:0;break a;case 1:break b;default:break a}}if(y[c+28>>2]!=1){if(y[c+44>>2]|y[c+32>>2]!=1|y[c+36>>2]!=1){break a}}a=y[c+20>>2]}Y=c- -64|0;return a}function ud(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-32|0;Y=d;a:{b:{c:{d:{e:{c=y[a+4>>2];if(c>>>0>>0){g=b-c|0;f=y[a+8>>2];e=f<<5;if(!(g>>>0>e>>>0|c>>>0>e-g>>>0)){y[a+4>>2]=b;e=c&31;b=y[a>>2]+(c>>>3&536870908)|0;break b}y[d+16>>2]=0;y[d+8>>2]=0;y[d+12>>2]=0;if((b|0)<0){break e}c=2147483647;if(e>>>0<=1073741822){e=f<<6;b=b+31&-32;c=b>>>0>>0?e:b;if((c|0)<0){break e}}e=(c-1>>>5|0)+1|0;b=na(e<<2);y[d+24>>2]=0;y[d+28>>2]=0;y[d+8>>2]=b;y[d+20>>2]=0;y[d+16>>2]=e;y[d+24>>2]=0;Ob(d+20|0);e=y[a+4>>2];y[d+12>>2]=e+g;if((e|0)<=0){break d}f=y[a>>2];h=e>>>5|0;c=h<<2;if(!(!h|!c)){p(b,f,c)}b=(h<<2)+b|0;e=e&31;if(!e){break d}f=y[c+f>>2];c=y[b>>2];y[b>>2]=(f^c)&-1>>>32-e^c;break c}y[a+4>>2]=b;break a}Ba();o()}e=0}c=y[a>>2];y[a>>2]=y[d+8>>2];y[d+8>>2]=c;c=y[a+4>>2];y[a+4>>2]=y[d+12>>2];y[d+12>>2]=c;c=y[a+8>>2];y[a+8>>2]=y[d+16>>2];y[d+16>>2]=c;Ob(d+8|0)}Xc(b,e,g);Pb(d+20|0,b,e,g)}Y=d+32|0}function cc(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{b:{if((c|0)<=(d|0)){break b}h=e-1|0;c:{f=(d|0)/8|0;g=f<<3;if((g|0)!=(d|0)){if(b>>>0<=f>>>0){break a}f=(z[a+f|0]^h)&255>>>d-g;if(f){break c}f=(d+7|0)/8|0}g=(c+7|0)/8|0;d:{if((c|0)<57){break d}i=g-8|0;if((i|0)<=(f|0)){break d}d=e?1718:1726;while(1){if((f|0)>=(i|0)){break d}if(b>>>0>>0|b-f>>>0<=7){break a}e=a+f|0;if((z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24))!=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))|(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))!=(z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24))){break d}f=f+8|0;continue}}b=b>>>0>>0?f:b;d=(f|0)>(g|0)?f:g;e=h&255;while(1){if((d|0)==(f|0)){break b}if((b|0)==(f|0)){break a}g=z[a+f|0];if((g|0)!=(e|0)){a=z[((g^h)&255)+1734|0]+(f<<3)|0;return(a|0)>(c|0)?c:a}else{f=f+1|0;continue}}}c=g+z[f+1734|0]|0}return c}o()}function dc(a,b){var c=0,d=0,e=0,f=0,g=0;e=a+4|0;d=e+7&-8;c=y[a>>2];if(d+b>>>0<=(c+a|0)-4>>>0){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(y[a-4>>2]&-2)|0;e=d+y[f>>2]|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;c=c-d|0;y[a>>2]=c}a:{if(b+24>>>0<=c>>>0){e=a+b|0;c=(c-b|0)-8|0;y[e+8>>2]=c;g=e+8|0;y[(g+(c&-4)|0)-4>>2]=c|1;d=y[e+8>>2]-8|0;b:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break b}f=H(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;y[e+12>>2]=d+6080;d=d+6088|0;y[e+16>>2]=y[d>>2];y[d>>2]=g;y[y[e+16>>2]+4>>2]=g;d=y[1778];f=y[1779];e=c&31;if((c&63)>>>0>=32){c=1<>>32-e}y[1778]=g|d;y[1779]=c|f;c=b+8|0;y[a>>2]=c;b=(c&-4)+a|0;break a}b=a+c|0}y[b-4>>2]=c;a=a+4|0}else{a=0}return a}function ma(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=y[b>>2];c=f;d=b;e=y[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=y[d+4>>2];e=y[d+8>>2];y[c+8>>2]=e;y[e+4>>2]=c;c=a+f|0}a=b+f|0;b=y[a>>2];if((b|0)!=y[(a+b|0)-4>>2]){f=y[a+4>>2];a=y[a+8>>2];y[f+8>>2]=a;y[a+4>>2]=f;c=b+c|0}y[d>>2]=c;y[((c&-4)+d|0)-4>>2]=c|1;b=y[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=H(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;y[d+4>>2]=b+6080;b=b+6088|0;y[d+8>>2]=y[b>>2];y[b>>2]=d;y[y[d+8>>2]+4>>2]=d;b=y[1778];c=y[1779];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}y[1778]=e|b;y[1779]=a|c}}function ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=Y-32|0;Y=d;g=(b<<3)+a|0;b=a;while(1){if((b|0)==(g|0)){a:{b=f+1|0;i=md(d+20|0,b);j=md(d+8|0,b);h=y[i>>2];b=a;while(1)if((b|0)==(g|0)){y[h>>2]=0;k=((f|0)>0?f:0)+1|0;l=y[j>>2];c=1;while(1){if((c|0)==(k|0)){c=k;break a}b=c<<2;e=b-4|0;y[d+4>>2]=y[e+l>>2];w[d|0]=1;if(z[Tb(Na(d,y[e+h>>2]))|0]!=1){break a}e=y[d+4>>2];y[b+l>>2]=e;b=a;while(1){if((b|0)!=(g|0)){if(y[b>>2]==(c|0)){y[b+4>>2]=e;e=e+1|0}b=b+8|0;continue}break}c=c+1|0;continue}}else{c=(y[b>>2]<<2)+h|0;y[c>>2]=y[c>>2]+1;b=b+8|0;continue}}}else{c=y[b>>2];f=(c|0)>(f|0)?c:f;b=b+8|0;continue}break}ya(j);ya(i);Y=d+32|0;return(c|0)>(f|0)}function za(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=Y-16|0;Y=e;y[e+12>>2]=0;w[e+8|0]=1;h=-1;a:{b:while(1){if((wb(y[a>>2],e+4|0)|0)==-1){break a}d=Tb(e+8|0);if(z[d|0]!=1){break a}g=y[e+12>>2]|y[e+4>>2];f=(g|0)>=0;y[d>>2]=f;g=f?g:0;y[d+4>>2]=g;if(f){i=i+1|0;f=y[b+4>>2];d=0;while(1){if((d|0)==(f|0)){continue b}j=y[b+8>>2]+(d<<3)|0;if(y[j>>2]!=(i|0)|y[j+4>>2]!=(g|0)){d=d+1|0;continue}else{if((f-1|0)==(d|0)){h=1;if(w[b+1|0]&1){break a}}h=-1;f=y[a>>2];a=d<<2;if((Ia(f,y[a+y[b+20>>2]>>2],e+4|0)|0)==-1){break a}h=0;f=y[a+y[b+32>>2]>>2];a=y[e+4>>2];y[c>>2]=f+((y[b+4>>2]+(z[b+1|0]?-3:-2)|0)==(d|0)?0-a|0:a);break a}}}break}o()}Y=e+16|0;return h}function lb(a,b,c,d,e){var f=0,g=0,h=0;a:{d=(d|0)>0?d:0;f=(e|0)>=0?(c|0)<(e|0)?c:e:0;if((d|0)>=(f|0)){break a}b:{h=d>>>3|0;if(h>>>0>=b>>>0){break b}e=d&7;c=a+h|0;g=f-1|0;f=g>>>3|0;if((f|0)==(h|0)){a=g&7;while(1){if(a>>>0>>0){break a}w[c|0]=z[c|0]+(-1<<7-e);e=e+1|0;continue}}d=z[c|0];while(1)if((e|0)==8){w[c|0]=d;if(b>>>0<=f>>>0){break b}d=(g&7)+1|0;g=a+f|0;c=z[g|0];e=0;while(1)if((d|0)==(e|0)){w[g|0]=c;c=h+1|0;if(c>>>0>=f>>>0){break a}e=f+(h^-1)|0;if(e>>>0>b-c>>>0){break b}c=a+c|0;while(1){if((e|0)<=0){break a}w[c|0]=0;e=e-1|0;c=c+1|0;continue}}else{c=(-1<<7-e)+c|0;e=e+1|0;continue}}else{d=(-1<<7-e)+d|0;e=e+1|0;continue}}o()}}function ka(a,b){var c=0,d=0,e=0,f=0;c=y[b+4>>2];if(c>>>0<47){c=E(c,6);e=A[c+2080>>1];d=y[a+8>>2]-e|0;y[a+8>>2]=d;c=c+2080|0;f=y[a+4>>2];a:{if(d>>>0>f>>>16>>>0){if(d&32768){return z[b|0]}if(d>>>0>>0){d=z[b|0]^1;e=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}y[b+4>>2]=e;b=d&1;break a}y[b+4>>2]=z[c+2|0];b=z[b|0];break a}y[a+4>>2]=f-(d<<16);b:{if(d>>>0>>0){y[b+4>>2]=z[c+2|0];b=z[b|0];break b}d=z[b|0]^1;f=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}y[b+4>>2]=f;b=d&1}y[a+8>>2]=e}c=y[a+12>>2];while(1){if(!c){Dc(a);c=y[a+12>>2]}c=c-1|0;y[a+12>>2]=c;d=y[a+8>>2];y[a+8>>2]=d<<1;y[a+4>>2]=y[a+4>>2]<<1;if(!(d&16384)){continue}break}return b}o()}function xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{b:{c=y[a+4>>2];e=y[a>>2];g=c-e|0;h=g>>2;c:{if(h>>>0>>0){f=b-h|0;d=y[a+8>>2];if(f>>>0<=d-c>>2>>>0){b=(f<<2)+c|0;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b;return}if(b>>>0>=1073741824){break b}c=d-e|0;d=c>>1;d=c>>>0>=2147483644?1073741823:b>>>0>>0?d:b;if(d>>>0>=1073741824){break a}i=na(d<<2);b=i+g|0;f=b+(f<<2)|0;c=b;while(1){if((c|0)!=(f|0)){y[c>>2]=0;c=c+4|0;continue}break}b=b-(h<<2)|0;if(g){p(b,e,g)}y[a+8>>2]=(d<<2)+i;y[a+4>>2]=f;y[a>>2]=b;if(!e){break c}ma(e);return}if(b>>>0>=h>>>0){break c}y[a+4>>2]=(b<<2)+e}return}Ba();o()}jb();o()}function Td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Sa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(Sa(a,y[b>>2],e)){if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+32>>2]=d;b:{if(y[b+44>>2]==4){break b}x[b+52>>1]=0;a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,c,1,e);if(z[b+53|0]==1){y[b+44>>2]=3;if(!z[b+52|0]){break b}break a}y[b+44>>2]=4}y[b+20>>2]=c;y[b+40>>2]=y[b+40>>2]+1;if(y[b+36>>2]!=1|y[b+24>>2]!=2){break a}w[b+54|0]=1;return}a=y[a+8>>2];_[y[y[a>>2]+24>>2]](a,b,c,d,e)}}function kb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{c=y[a+4>>2];d=y[a>>2];e=c-d>>3;if(e>>>0>>0){g=b-e|0;f=y[a+8>>2];if(g>>>0<=f-c>>3>>>0){b=(g<<3)+c|0;while(1){if((b|0)!=(c|0)){y[c+4>>2]=0;w[c|0]=0;c=c+8|0;continue}break}y[a+4>>2]=b;return}d=Bc(d,f,b);b=y[a+4>>2]-y[a>>2]|0;e=0;if(d){e=yb(d)}b=b+e|0;g=b+(g<<3)|0;c=b;while(1){if((c|0)!=(g|0)){y[c+4>>2]=0;w[c|0]=0;c=c+8|0;continue}break}f=b;b=y[a>>2];c=y[a+4>>2]-b|0;f=f-c|0;if(c){p(f,b,c)}y[a+4>>2]=g;y[a>>2]=f;y[a+8>>2]=(d<<3)+e;if(!b){break a}ma(b);return}if(b>>>0>=e>>>0){break a}y[a+4>>2]=d+(b<<3)}}function ad(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{e=y[a+4>>2];c=y[a>>2];f=e-c|0;d=f>>3;b:{if(d>>>0>>0){d=b-d|0;g=y[a+8>>2];if(d>>>0<=g-e>>3>>>0){ld(a,d);return}if(b>>>0>=536870912){break a}h=d<<3;e=f;c=g-c|0;d=c>>2;f=c>>>0>=2147483640?536870911:b>>>0>>0?d:b;g=yb(f);c=e+g|0;d=h+c|0;b=c;while(1){if((b|0)!=(d|0)){y[b>>2]=0;y[b+4>>2]=0;b=b+8|0;continue}break}e=c;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g+(f<<3);if(!b){break b}ma(b);return}if(b>>>0>=d>>>0){break b}y[a+4>>2]=c+(b<<3)}return}Ba();o()}function Gb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{e=y[a+4>>2];c=y[a>>2];f=e-c|0;d=f>>2;b:{if(d>>>0>>0){d=b-d|0;g=y[a+8>>2];if(d>>>0<=g-e>>2>>>0){kd(a,d);return}if(b>>>0>=1073741824){break a}h=d<<2;e=f;c=g-c|0;d=c>>1;f=c>>>0>=2147483644?1073741823:b>>>0>>0?d:b;g=Lb(f);c=e+g|0;d=h+c|0;b=c;while(1){if((b|0)!=(d|0)){y[b>>2]=0;b=b+4|0;continue}break}e=c;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g+(f<<2);if(!b){break b}ma(b);return}if(b>>>0>=d>>>0){break b}y[a+4>>2]=c+(b<<2)}return}Ba();o()}function Rc(a,b,c,d,e,f,g){y[a+8>>2]=0;a:{b:{if(!(b&255)){c:{switch(c|0){case 1:y[a+4>>2]=e;y[a>>2]=d;y[a+8>>2]=f-1;return;case 3:y[a+4>>2]=e;break a;case 0:y[a>>2]=d;y[a+8>>2]=f-1;y[a+4>>2]=(e-g|0)+1;return;case 2:break c;default:break b}}y[a+4>>2]=(e-g|0)+1;break a}d:{switch(c|0){case 1:y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g-1;return;case 3:y[a+4>>2]=d;y[a+8>>2]=g-1;y[a>>2]=(e-f|0)+1;return;case 0:y[a>>2]=e;y[a+4>>2]=(d-g|0)+1;return;case 2:break d;default:break b}}y[a+4>>2]=(d-g|0)+1;y[a>>2]=(e-f|0)+1}return}y[a>>2]=(d-f|0)+1}function bc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;k=((d&536870911)<<3|c>>>29)&-8;a:{b:while(1){c:{if(b>>>0<=f>>>0){break c}g=-1;i=z[a+f|0];if((i|0)==255){break a}h=y[e>>2];if(h>>>0>=k>>>0){break a}g=h>>>3|0;if(g>>>0>=d>>>0){break c}g=z[c+g|0];y[e>>2]=h+1;j=g>>>((h^-1)&7)&1|j<<1;f=f+1|0;h=f+E(i,3)|0;while(1){if((f|0)>=(h|0)){continue b}if(b>>>0<=f>>>0){break c}if(z[a+f|0]==(j|0)){c=f+1|0;if(c>>>0>=b>>>0){break c}d=b;b=f+2|0;if(d>>>0<=b>>>0){break c}g=z[a+c|0]|z[a+b|0]<<8;break a}else{f=f+3|0;continue}}}break}o()}return g}function Ia(a,b,c){var d=0,e=0,f=0,g=0;e=-1;g=y[a>>2];a:{f=y[a+8>>2];d=y[a+4>>2];if(f>>>0>=d>>>0){break a}b:{if((d|0)==536870912|d>>>0>536870912){break b}f=y[a+12>>2]+(f<<3)|0;if(f>>>0>(((d&536870911)<<3|g>>>29)&-8)>>>0){break a}y[c>>2]=0;g=y[a>>2];d=y[a+4>>2];if((d|0)==536870912|d>>>0>536870912){break b}d=((d&536870911)<<3|g>>>29)&-8;e=d>>>0>>0?d-f|0:b;while(1){if(!e){e=0;break a}b=y[a+8>>2];if(b>>>0>=B[a+4>>2]){break b}y[c>>2]=z[b+y[a>>2]|0]>>>7-y[a+12>>2]&1|y[c>>2]<<1;_b(a);e=e-1|0;continue}}o()}return e}function Aa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=Y-16|0;Y=f;i=ka(b,y[a>>2]+8|0);d=i|2;while(1){a:{if((e|0)==5){e=5;break a}g=ka(b,y[a>>2]+(d<<3)|0);d=g|d<<1;if(!g){break a}e=e+1|0;continue}break}g=0;e=e<<3;h=y[e+2364>>2];h=(h|0)>0?h:0;k=e+2364|0;e=0;while(1){if((e|0)!=(h|0)){j=ka(b,y[a>>2]+(d<<3)|0);d=j|d<<1;d=(d|0)>255?d&255|256:d;g=g<<1|j;e=e+1|0;continue}break}w[f+8|0]=1;y[f+12>>2]=y[k+4>>2];d=0;e=0;if(z[Na(f+8|0,g)|0]){a=y[f+12>>2];b=a>>31;d=i?b-(a^b)|0:a;e=!i|(d|0)!=0}y[c>>2]=d;Y=f+16|0;return e}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if((a|0)!=(b|0)){f=y[b+4>>2];d=y[b>>2];b=f-d|0;c=y[a>>2];if(b>>>0<=y[a+8>>2]-c>>>0){e=y[a+4>>2];g=e-c|0;if(b>>>0>g>>>0){if((c|0)!=(e|0)){if(g){p(c,d,g)}e=y[a+4>>2]}b=d+g|0;d=f-b|0;if(!(!d|(b|0)==(f|0))){p(e,b,d)}y[a+4>>2]=d+e;return a}if(!(!b|(d|0)==(f|0))){p(c,d,b)}y[a+4>>2]=b+c;return a}jd(a);e=Bc(y[a>>2],y[a+8>>2],b>>3);if(e>>>0>=536870912){break a}c=yb(e);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=c+(e<<3);if(!(!b|(d|0)==(f|0))){p(c,d,b)}y[a+4>>2]=b+c}return a}Ba();o()}function me(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-16|0;Y=d;f=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,f);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;g=c>>>3|0;h=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(B[a+8>>2]<=c>>>0){c=4}else{if(!ic(a,b,2560,g,h)){c=-1;break b}Kb(a,f);e=y[b+16>>2];c=y[a+24>>2];if(!e|(c>>>0)%50){break a}e=_[y[y[e>>2]+8>>2]](e)|0;c=y[a+24>>2];if(!e){break a}y[a+24>>2]=c+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=c+1|0;y[a+24>>2]=c;continue}}o()}function qe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-16|0;Y=d;e=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,e);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){f=y[a+8>>2]&2147483647;c=c-1|0;g=c>>>3|0;h=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(c>>>0>=f>>>0){c=4}else{if(!ic(a,b,2496,g,h)){c=-1;break b}Kb(a,e);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function zc(a,b,c,d,e){var f=0,g=0;y[a>>2]=0;f=na(24);y[f+8>>2]=0;y[f+12>>2]=0;g=b;b=(c|0)==268435456|c>>>0<268435456;y[f>>2]=b?g:0;y[f+4>>2]=b?c:0;y[f+16>>2]=0;y[f+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a+4>>2]=f;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;c=na(64);y[a+36>>2]=c;b=c- -64|0;y[a+44>>2]=b;f=0;while(1){if((f|0)!=64){y[c+f>>2]=0;f=f+4|0;continue}break}y[a+52>>2]=10;w[a+49|0]=0;w[a+50|0]=0;w[a+48|0]=e;y[a+40>>2]=b;t(a+56|0,0,49);w[a+112|0]=0;y[a+108>>2]=d;return a}function Wc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=y[a+4>>2];d=y[a+8>>2];b:{if(c>>>0>>0){e=y[b>>2];y[b>>2]=0;y[c>>2]=e;b=c+4|0;break b}f=y[a>>2];e=c-f|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break a}d=d-f|0;g=d>>1;g=d>>>0>=2147483644?1073741823:c>>>0>>0?g:c;c:{if(!g){c=e;d=0;break c}d=Lb(g);f=y[a>>2];c=y[a+4>>2]-f|0;h=c>>2}i=y[b>>2];y[b>>2]=0;b=d+e|0;y[b>>2]=i;e=b-(h<<2)|0;if(c){p(e,f,c)}y[a+8>>2]=(g<<2)+d;b=b+4|0;y[a+4>>2]=b;y[a>>2]=e;if(!f){break b}ma(f)}y[a+4>>2]=b;return}Ba();o()}function zb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ac(c+80|0);ua(c+76|0);ua(c+72|0);Ja(c+60|0);b=y[c+36>>2];if(b){a=y[c+40>>2];while(1){if((a|0)!=(b|0)){a=pa(a-4|0);continue}break}y[c+40>>2]=b;ma(y[c+36>>2])}la(c+32|0);b=y[c+20>>2];if(b){a=y[c+24>>2];while(1){if((a|0)!=(b|0)){a=$b(a-4|0);continue}break}y[c+24>>2]=b;ma(y[c+20>>2])}b=y[c+8>>2];if(b){a=y[c+12>>2];while(1){if((a|0)!=(b|0)){a=ac(a-4|0);continue}break}y[c+12>>2]=b;ma(y[c+8>>2])}a=y[c+4>>2];y[c+4>>2]=0;if(a){ma(a)}ma(Ab(c))}}function oe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,e);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;f=c>>>3|0;g=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(B[a+8>>2]<=c>>>0){c=4}else{if(!ic(a,b,2528,f,g)){c=-1;break b}Kb(a,e);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(y[b+4>>2]==5604){b=y[a+12>>2];a:{if(b){a=5592;if(Bb(b,5480)){break a}}a=5600}y[c>>2]=a;return 1}e=y[a+8>>2];b:{c:{if(!(e&24)){d=Bb(b,5432);if(!d){break c}c=1;if(!Sa(a,b,(y[d+8>>2]&24)!=0)){break c}break b}c=1;if(Sa(a,b,1)){break b}}c=0;b=Bb(b,5532);if(!b){break b}d=y[b+8>>2];if(d&(e^-1)&7|(d^-1)&e&96|y[y[a+12>>2]+4>>2]!=y[y[b+12>>2]+4>>2]){break b}c=y[y[a+16>>2]+4>>2]==y[y[b+16>>2]+4>>2]}return c|0}function Wb(a,b){var c=0,d=0,e=0,f=0,g=0;e=Y-16|0;Y=e;a:{b:{f=y[a+4>>2];if(f-1>>>0<=65534){g=y[a+8>>2];if(g-1>>>0<65535){break b}}y[a+52>>2]=4;a=4;break a}y[a+52>>2]=2;c=y[b>>2];d=y[c>>2];if(!d){d=xa(f,g);y[e+12>>2]=0;oa(c,d);la(e+12|0);d=y[c>>2]}if(!qa(d)){oa(c,0);y[a+52>>2]=-1;a=-1;break a}Qa(y[c>>2],0);y[a+60>>2]=0;x[a+56>>1]=1;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;a=hd(a,b)}Y=e+16|0;return a}function Ba(){var a=0,b=0,c=0,d=0;c=Fb(8);y[c>>2]=5828;a=4883;b=0;a:{if(!z[4883]){break a}b:{c:{while(1){a=a+1|0;if(!(a&3)){break c}if(z[a|0]){continue}break}break b}while(1){b=a;a=a+4|0;d=y[b>>2];if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}while(1){a=b;b=a+1|0;if(z[a|0]){continue}break}}b=a-4883|0}a=na(b+13|0);y[a+8>>2]=0;y[a+4>>2]=b;y[a>>2]=b;a=a+12|0;b=b+1|0;if(b){p(a,4883,b)}y[c>>2]=5876;y[c+4>>2]=a;P(c|0,5888,1);o()}function Gc(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if((a|0)!=(b|0)){f=y[b+4>>2];e=y[b>>2];d=f-e|0;c=y[a+8>>2];b=y[a>>2];if(d>>>0<=c-b>>>0){g=y[a+4>>2];c=g-b|0;if(c>>>0>>0){if(!(!c|(b|0)==(g|0))){p(b,e,c)}Ec(a,c+e|0,f);return}if(!(!d|(e|0)==(f|0))){p(b,e,d)}y[a+4>>2]=b+d;return}if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;c=0}if((d|0)<0){break a}b=c<<1;jc(a,c>>>0>=1073741823?2147483647:b>>>0>d>>>0?b:d);Ec(a,e,f)}return}Ba();o()}function Dc(a){var b=0,c=0,d=0,e=0,f=0;e=255;b=y[a+16>>2];a:{if(z[a+1|0]==255){f=8;d=y[b+8>>2];c=d+1|0;if(c>>>0>=B[b+4>>2]){break a}c=z[c+y[b>>2]|0];if(c>>>0>143){break a}Cc(b);w[a+1|0]=c;y[a+4>>2]=(y[a+4>>2]-(c<<9)|0)+65024;b=y[a+16>>2];d=y[b+8>>2];f=7;break a}Cc(b);f=8;b=y[a+16>>2];d=y[b+8>>2];c=y[b>>2];e=B[b+4>>2]>d>>>0?z[c+d|0]:e;w[a+1|0]=e;y[a+4>>2]=(y[a+4>>2]-(e<<8)|0)+65280}y[a+12>>2]=f;if(B[b+4>>2]<=d>>>0){w[a|0]=1}}function Ib(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;f=b-1|0;g=y[d>>2];e=y[d+4>>2];a:{if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,b,g,e)|0)!=(c|0)){break a}h=b+1|0;if((ia(a,h,g,e)|0)!=(c|0)){break a}g=y[d+8>>2];e=y[d+12>>2];if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,h,g,e)|0)!=(c|0)){break a}e=f;f=y[d+16>>2];d=y[d+20>>2];if((ia(a,e,f,d)|0)!=(c|0)){break a}if((ia(a,b,f,d)|0)!=(c|0)){break a}i=(ia(a,h,f,d)|0)==(c|0)}return i}function ja(a,b,c){var d=0,e=0;d=Y-16|0;Y=d;a:{b:{c:{if(!(!(!qa(b)|(c|0)<0)&y[b+12>>2]>(c|0))){w[d+8|0]=0;break c}e=y[b+16>>2];if((e|0)<0){break b}c=se(e,0,c);if(Z){break b}y[d+8>>2]=c;e=1}w[d+12|0]=e;break a}o()}d:{e:{if(!z[d+12|0]){y[a>>2]=0;y[a+4>>2]=0;break e}Da(d,b);e=y[d+4>>2];c=y[d+8>>2];if(e>>>0>>0){break d}b=y[b+16>>2];if(b>>>0>e-c>>>0){break d}e=y[d>>2];y[a+4>>2]=b;y[a>>2]=c+e}Y=d+16|0;return}o()}function nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=a+8|0;t(d,0,36);b=E(b,12);c=y[b+3072>>2];y[a+4>>2]=c;w[a+1|0]=z[b+3064|0];ad(d,c);Gb(a+20|0,c);Gb(a+32|0,c);b=y[b+3068>>2];d=b+(c<<3)|0;g=y[a+32>>2];h=y[a+20>>2];c=y[a+8>>2];while(1){if((b|0)!=(d|0)){y[c+(e<<3)>>2]=z[b|0];f=e<<2;y[f+h>>2]=z[b+1|0];y[g+f>>2]=y[b+4>>2];b=b+8|0;e=e+1|0;continue}break}i=a,j=ob(c,y[a+12>>2]-c>>3),w[i|0]=j;return a}function bd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0;La(y[b+8>>2],d,i,j,e);i=y[a+12>>2];j=y[c>>2];b=ia(y[b+8>>2],d+2|0,g,h);y[c+4>>2]=e;y[c>>2]=b|j<<1&2;e=y[c+8>>2];a=y[a+20>>2];b=(d-i|0)+2|0;k=c,l=ia(y[a+8>>2],b,y[f>>2],y[f+4>>2])|e<<1&2,y[k+8>>2]=l;d=y[c+12>>2];k=c,l=ia(y[a+8>>2],b,y[f+8>>2],y[f+12>>2])|d<<1&6,y[k+12>>2]=l;d=y[c+16>>2];k=c,l=ia(y[a+8>>2],b,y[f+16>>2],y[f+20>>2])|d<<1&6,y[k+16>>2]=l}function Fc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=((b&536870911)<<3|a>>>29)&-8;h=1;while(1){a:{if(B[c>>2]>=l>>>0){break a}i=h&1;n=i?325:326;g=i?1056:1392;j=0;while(1){k=bc(g,n,a,b,c);if((k|0)<0){while(1){if(B[c>>2]>=l>>>0){break a}if(!Ka(a,b,c)){continue}break}break a}j=j+k|0;if(k>>>0>63){continue}break}g=j+m|0;if(!i){lb(d,e,f,m,g)}h=h^1;m=g;if((f|0)>(g|0)){continue}}break}}function Pd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Sa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(!Sa(a,y[b>>2],e)){break a}if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+20>>2]=c;y[b+32>>2]=d;y[b+40>>2]=y[b+40>>2]+1;if(!(y[b+36>>2]!=1|y[b+24>>2]!=2)){w[b+54|0]=1}y[b+44>>2]=4}}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Y+-64|0;Y=d;a:{e=1;b:{if(y[a+4>>2]==y[b+4>>2]){break b}b=Bb(b,5384);e=0;if(!b){break b}e=y[c>>2];if(!e){break a}t(d+8|0,0,56);w[d+59|0]=1;y[d+16>>2]=-1;y[d+12>>2]=a;y[d+4>>2]=b;y[d+52>>2]=1;_[y[y[b>>2]+28>>2]](b,d+4|0,e,1);a=y[d+28>>2];if((a|0)==1){y[c>>2]=y[d+20>>2]}e=(a|0)==1}Y=d- -64|0;return e|0}Qc();o()}function Pc(a,b,c,d){w[a+53|0]=1;a:{if(y[a+4>>2]!=(c|0)){break a}w[a+52|0]=1;c=y[a+16>>2];b:{if(!c){y[a+36>>2]=1;y[a+24>>2]=d;y[a+16>>2]=b;if((d|0)!=1){break a}if(y[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=y[a+24>>2];if((c|0)==2){y[a+24>>2]=d;c=d}if(y[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}y[a+36>>2]=y[a+36>>2]+1}w[a+54|0]=1}}function Cd(a,b){var c=0,d=0,e=0;d=a,e=Fa(),y[d>>2]=e;d=a,e=Fa(),y[d+4>>2]=e;d=a,e=Fa(),y[d+8>>2]=e;d=a,e=Fa(),y[d+12>>2]=e;d=a,e=Fa(),y[d+16>>2]=e;d=a,e=Fa(),y[d+20>>2]=e;d=a,e=Fa(),y[d+24>>2]=e;d=a,e=Fa(),y[d+28>>2]=e;d=a,e=Fa(),y[d+32>>2]=e;c=na(16);w[c+12|0]=b;y[c+8>>2]=0;y[c>>2]=0;y[c+4>>2]=0;kb(c,1<>2]=c;return a}function kc(a){var b=0,c=0,d=0,e=0;b=Y-16|0;Y=b;c=na(20);w[c+4|0]=0;y[c>>2]=0;y[c+8>>2]=y[a+8>>2];d=y[a+12>>2];y[c+12>>2]=d;e=y[a+16>>2];y[c+16>>2]=e;Da(b+8|0,a);a:{b:{if(!y[b+12>>2]){break b}nb(c,td(e,d));Da(b,c);a=y[b+8>>2];e=0;d=y[b+12>>2];if(d>>>0>B[b+4>>2]){break a}if(!d|!(d|e)){break b}p(y[b>>2],a,d)}Y=b+16|0;return c}o()}function sd(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{if(!d){break a}if(e&1){f=b;g=d;if(c){e=32-c|0;f=d>>>0>>0?d:e;y[b>>2]=y[b>>2]|-1<>>e-f;g=d-f|0;f=b+4|0}i=g>>>5|0;e=i;h=f;while(1){if(e){y[h>>2]=-1;e=e-1|0;h=h+4|0;continue}break}e=g&31;if(!e){break a}f=(i<<2)+f|0;y[f>>2]=y[f>>2]|-1>>>32-e;break a}Xc(b,c,d)}Pb(a,b,c,d)}function ed(a,b){var c=0,d=0,e=0;c=Y-32|0;Y=c;a:{d=y[a+40>>2];if(d){e=y[a+48>>2];y[c+24>>2]=y[a+44>>2];y[c+28>>2]=e;b=y[b+16>>2];if(b>>>0>d>>>0){break a}a=y[a+36>>2];y[c+20>>2]=b;y[c+16>>2]=a;a=y[c+28>>2];y[c+8>>2]=y[c+24>>2];y[c+12>>2]=a;a=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=a;Pa(c+8|0,c)}Y=c+32|0;return}o()}function ra(a,b){var c=0,d=0,e=0,f=0,g=0;a:{d=y[a+8>>2];f=d+3|0;c=y[a+4>>2];if(f>>>0>>0){if(c>>>0<=d>>>0){break a}g=d+1|0;if(g>>>0>=c>>>0){break a}e=c;c=d+2|0;if(e>>>0<=c>>>0){break a}e=b;b=y[a>>2];y[e>>2]=z[b+g|0]<<16|z[b+d|0]<<24|z[b+c|0]<<8|z[b+f|0];y[a+8>>2]=y[a+8>>2]+4;a=0}else{a=-1}return a}o()}function dd(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,y[b+20>>2],(y[b+16>>2]^-1)+c|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,y[b+20>>2],c-y[b+16>>2]|0);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,y[b+20>>2],(c-y[b+16>>2]|0)+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function xa(a,b){var c=0,d=0;c=na(20);y[c+16>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;w[c+4|0]=0;y[c>>2]=0;a:{if(a-2147483617>>>0<2147483680|(b|0)<=0){break a}d=a+31&2147483616;if(2147483616/(d>>>0)>>>0>>0){break a}y[c+12>>2]=b;y[c+8>>2]=a;a=d>>>3|0;y[c+16>>2]=a;nb(c,td(a,b))}return c}function Sa(a,b,c){var d=0;if(!c){return y[a+4>>2]==y[b+4>>2]}if((a|0)==(b|0)){return 1}c=y[a+4>>2];a=z[c|0];b=y[b+4>>2];d=z[b|0];a:{if(!a|(d|0)!=(a|0)){break a}while(1){d=z[b+1|0];a=z[c+1|0];if(!a){break a}b=b+1|0;c=c+1|0;if((a|0)==(d|0)){continue}break}}return(a|0)==(d|0)}function Pa(a,b){var c=0,d=0,e=0;a:{c=y[a+4>>2];b:{if(!c){break b}if(!y[b+4>>2]){a=y[a>>2];while(1){if((c|0)<=0){break b}w[a|0]=0;c=c-1|0;a=a+1|0;continue}}e=y[b>>2];d=y[b+4>>2];c=y[a>>2];b=0;if(1&B[a+4>>2]>>0){break a}if(!(b|d)|!d){break b}p(c,e,d)}return}o()}function Ad(a){var b=0,c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=lc();f=e+24|0;g=y[a+28>>2];c=y[a+24>>2];while(1){if((c|0)!=(g|0)){b=y[c>>2];if(b){b=kc(b)}else{b=0}y[d+12>>2]=b;b=d+12|0;Wc(f,b);c=c+4|0;la(b);continue}break}c=Sb(e,a);Sb(c+12|0,a+12|0);Y=d+16|0;return c}function Jb(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,y[b+20>>2],c-1|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,y[b+20>>2],c);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,y[b+20>>2],c+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function Oc(a,b,c){var d=0;d=y[a+36>>2];if(!d){y[a+24>>2]=c;y[a+16>>2]=b;y[a+36>>2]=1;y[a+20>>2]=y[a+56>>2];return}a:{if(!(y[a+20>>2]!=y[a+56>>2]|y[a+16>>2]!=(b|0))){if(y[a+24>>2]!=2){break a}y[a+24>>2]=c;return}w[a+54|0]=1;y[a+24>>2]=2;y[a+36>>2]=d+1}}function Ra(a){var b=0,c=0,d=0,e=0;b=na(20);y[b+16>>2]=a;w[b|0]=0;c=255;d=y[a>>2];e=y[a+4>>2];a=y[a+8>>2];if(e>>>0>a>>>0){c=z[a+d|0]}w[b+1|0]=c;y[b+4>>2]=((c^-1)&255)<<16;Dc(b);y[b+8>>2]=32768;y[b+4>>2]=y[b+4>>2]<<7;y[b+12>>2]=y[b+12>>2]-7;return b}function Xc(a,b,c){var d=0,e=0;if(b){d=32-b|0;e=c>>>0>>0?c:d;y[a>>2]=y[a>>2]&(-1<>>d-e^-1);c=c-e|0;a=a+4|0}e=c>>>5|0;b=e;d=a;while(1){if(b){y[d>>2]=0;b=b-1|0;d=d+4|0;continue}break}b=c&31;if(b){a=(e<<2)+a|0;y[a>>2]=y[a>>2]&(-1>>>32-b^-1)}}function tb(a,b){var c=0;c=1;a:{if(ra(y[a+4>>2],b)){break a}if(ra(y[a+4>>2],b+4|0)){break a}if(ra(y[a+4>>2],b+8|0)){break a}if(ra(y[a+4>>2],b+12|0)){break a}if(va(y[a+4>>2],b+16|0)|(y[b>>2]>4096|y[b+4>>2]>4096)&z[a+112|0]==1){break a}c=0}return c}function zd(a,b,c){var d=0,e=0;d=na(32);e=y[b+12>>2];y[d+16>>2]=y[b+8>>2];y[d+20>>2]=e;e=y[b+4>>2];y[d+8>>2]=y[b>>2];y[d+12>>2]=e;b=y[c>>2];y[c>>2]=0;y[d>>2]=a;y[d+24>>2]=b;b=y[a+4>>2];y[d+4>>2]=b;y[b>>2]=d;y[a+4>>2]=d;y[a+8>>2]=y[a+8>>2]+1}function Ga(a,b,c){var d=0,e=0,f=0,g=0;d=y[b+8>>2];g=(d|0)>0?d:0;d=0;while(1){a:{if((d|0)==(g|0)){e=0;break a}e=Ma(a,y[y[b+12>>2]+(d<<2)>>2]);if(!(!e|(z[e+4|0]&63)!=53)){if((c|0)==(f|0)){break a}f=f+1|0}d=d+1|0;continue}break}return e}function Ub(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=b<<2;b=na(c);y[a>>2]=b;c=b+c|0;y[a+8>>2]=c;while(1){if((b|0)!=(c|0)){y[b>>2]=0;b=b+4|0;continue}break}y[a+4>>2]=c}return a}Ba();o()}function gb(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=Lb(b);y[a>>2]=c;b=(b<<2)+c|0;y[a+8>>2]=b;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b}return a}Ba();o()}function od(a,b){var c=0,d=0;c=Y-16|0;Y=c;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[c+8>>2]=a;if(b){jc(a,b);d=b;b=y[a+4>>2];d=d+b|0;while(1){if((b|0)!=(d|0)){w[b|0]=0;b=b+1|0;continue}break}y[a+4>>2]=d}w[c+12|0]=1;fd(c+8|0);Y=c+16|0}function Kc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)==255){a=Fb(4);y[a>>2]=5288;P(a|0,5300,2);o()}y[c+4>>2]=c+3;e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;a=_[y[(c+8|0)+(d<<2)>>2]](c+4|0,a)|0;Y=c+16|0;return a}function qb(){var a=0;a=na(80);x[a+56>>1]=0;y[a+12>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;return a}function Yb(){var a=0;a=na(96);y[a+44>>2]=0;y[a+48>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=0;y[a+84>>2]=0;y[a+88>>2]=0;return a}function La(a,b,c,d,e){a:{if(!(!d|(b|0)<0|(a|0)<=(b|0))){a=b>>>3|0;b=1<<((b^-1)&7);if(e){if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=b|z[a|0];return}if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=z[a|0]&(b^-1)}return}o()}function id(a){var b=0,c=0,d=0;y[a+56>>2]=2;c=1;b=4;d=y[a+52>>2];a:{b:{if((d|0)==5){break b}if((d|0)>=3){y[a+52>>2]=5;break b}b=yc(a);c=!b;if(y[a+56>>2]==3){break a}y[a+52>>2]=5;b=b?-1:4}y[a+56>>2]=b}return c}function se(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=E(e,d);f=c&65535;a=a&65535;g=E(f,a);d=(g>>>16|0)+E(d,f)|0;a=(d&65535)+E(a,e)|0;Z=h+E(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Ma(a,b){var c=0,d=0;c=y[a>>2];a:{if(c){c=Ma(c,b);if(c){break a}}d=y[a+12>>2];a=y[a+8>>2];while(1){if((a|0)==(d|0)){return 0}c=y[a>>2];a=a+4|0;if(y[c>>2]!=(b|0)){continue}break}}return c}function xd(a){var b=0;a:{if(z[a+16|0]!=3|z[a+17|0]!=255|(z[a+18|0]!=253|z[a+19|0]!=255)){break a}if(z[a+20|0]!=2|z[a+21|0]!=254|(z[a+22|0]!=254|z[a+23|0]!=254)){break a}b=z[a+2|0]^1}return b&1}function Wa(a,b){var c=0,d=0,e=0;a:{c=y[a+8>>2];e=c+1|0;d=y[a+4>>2];if(e>>>0>>0){if(c>>>0>=d>>>0){break a}d=b;b=y[a>>2];x[d>>1]=z[b+c|0]<<8|z[b+e|0];y[a+8>>2]=c+2;a=0}else{a=-1}return a}o()}function Kb(a,b){var c=0;c=y[a+40>>2];y[a+28>>2]=y[a+36>>2];y[a+32>>2]=c;c=y[a+48>>2];b=y[b+16>>2];if(c>>>0>>0){o()}y[a+40>>2]=c;y[a+48>>2]=c-b;c=y[a+44>>2];y[a+36>>2]=c;y[a+44>>2]=b+c}function cd(a,b,c,d,e,f,g,h){return y[c+16>>2]|y[c+12>>2]<<3|y[c+8>>2]<<6|ia(y[y[a+20>>2]+8>>2],w[a+26|0]+(d-y[a+12>>2]|0)|0,e,f)<<8|y[c+4>>2]<<9|y[c>>2]<<10|ia(b,w[a+24|0]+d|0,g,h)<<12}function sa(a,b){var c=0,d=0,e=0;d=Y-16|0;Y=d;e=b<<2;c=y[e+y[a+36>>2]>>2];if(!c){b=nd(na(44),b);c=y[a+36>>2];y[d+12>>2]=0;vb(c+e|0,b);pa(d+12|0);c=y[y[a+36>>2]+e>>2]}Y=d+16|0;return c}function bb(a,b){var c=0;c=y[a>>2];if(c){y[a+4>>2]=c;ma(c);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function Hc(a,b,c){var d=0,e=0;e=((b&536870911)<<3|a>>>29)&-8;d=y[c>>2];a:{while(1){if(B[c>>2]>=e>>>0){break a}if(!Ka(a,b,c)){continue}break}if(y[c>>2]-d>>>0>11){break a}y[c>>2]=d}}function Ed(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=536870912){break a}c=yb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<3)+c;ld(a,b)}return a}Ba();o()}function Jc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)!=255){e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;_[y[(c+8|0)+(d<<2)>>2]](c+7|0,a)}w[a+4|0]=255;Y=c+16|0}function Tc(a,b){var c=0;c=Y-16|0;Y=c;y[c+8>>2]=0;a:{if(z[a+4|0]==1){oa(a,b);break a}mb(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;la(c+12|0);la(c+8|0);Y=c+16|0;return a}function Db(a,b){var c=0;if(z[a|0]==1){c=y[a+4>>2];b=se(c,c>>31,b);c=Z;c=!(b- -2147483648>>>0<2147483648?c+1|0:c);b=c?b:0}else{b=0}y[a>>2]=c;y[a+4>>2]=b;return a}function Ac(a,b,c){var d=0,e=0,f=0;d=1;while(1){e=z[a+12|0];if(e>>>0<=(f&255)>>>0){y[c>>2]=(-1<>2]+(d<<3)|0)|d<<1;f=f+1|0;continue}break}}function Hb(a,b,c,d,e,f,g){var h=0,i=0;h=Y-16|0;Y=h;if(qa(a)){i=y[a+12>>2];y[h+8>>2]=y[a+8>>2];y[h+12>>2]=i;y[h>>2]=0;y[h+4>>2]=0;Zc(a,b,c,d,e,f,g,h)}Y=h+16|0}function Cb(a,b,c,d){var e=0;e=Y-16|0;Y=e;y[e+12>>2]=d;d=1;w[e+8|0]=1;a:{if(!z[Na(e+8|0,b>>c)|0]){d=0;w[a|0]=0;break a}y[a>>2]=y[e+12>>2]}w[a+4|0]=d;Y=e+16|0}function qc(a){var b=0;b=y[a+36>>2];y[a+36>>2]=0;if(b){ma(Ja(b))}Ea(a+32|0);Ea(a+28|0);Ea(a+24|0);Ea(a+20|0);Ea(a+16|0);Ea(a+12|0);Ea(a+8|0);Ea(a+4|0);Ea(a)}function Qa(a,b){var c=0,d=0;c=Y-16|0;Y=c;Da(c+8|0,a);d=0-b|0;a=y[c+12>>2];b=y[c+8>>2];while(1){if((a|0)>0){w[b|0]=d;a=a-1|0;b=b+1|0;continue}break}Y=c+16|0}function md(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;if(b>>>0>=1073741824){Ba();o()}c=Lb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<2)+c;kd(a,b);return a}function pb(a,b){var c=0;c=y[a+4>>2];if(b){c=c+1|0;y[a+4>>2]=c}b=y[a+12>>2]-y[a+8>>2]>>3;if(b>>>0<=c>>>0){b=b+16|0;ad(a+8|0,b);Gb(a+20|0,b);Gb(a+32|0,b)}}function jc(a,b){var c=0;a:{if((b|0)>=0){if(b>>>0>2147479550){break a}c=Ya(b);if(!c){break a}y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=b+c;return}Ba();o()}rb();o()}function _c(a,b){var c=0;a:{if(!z[a+4|0]){c=y[b>>2];if((c|0)==y[a>>2]){break a}y[b>>2]=0;y[a>>2]=c;return}ub(a);c=y[b>>2];y[b>>2]=0;w[a+4|0]=0;y[a>>2]=c}}function Ud(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Sa(a,y[b+8>>2],f)){Pc(b,c,d,e);return}a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,d,e,f)}function Eb(a,b,c){a:{switch(a|0){case 1:return b&c;case 2:return b^c;case 3:return b^c^-1;default:o();case 0:b=b|c;break;case 4:break a}}return b}function wc(a){var b=0,c=0,d=0;c=E(z[a+1|0],y[a+4>>2]+1|0);if(c>>>0<=65535){d=z[a+2|0];b=qb();a=z[a|0];y[b+8>>2]=d;y[b+4>>2]=c;w[b|0]=a}return b}function Tb(a){var b=0,c=0,d=0;a:{if(z[a|0]!=1){break a}b=y[a+4>>2];if((b|0)<0){break a}c=b>>>0<1073741824;d=b<<1}y[a>>2]=c;y[a+4>>2]=d;return a}function Vc(a,b,c){var d=0;if(!(b&1)|z[a|0]!=1){b=0;c=0}else{b=y[a+4>>2];d=b;b=b+c|0;c=((d^b)&(b^c))>=0;b=c?b:0}y[a>>2]=c;y[a+4>>2]=b;return a}function ld(a,b){var c=0;c=y[a+4>>2];b=c+(b<<3)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}}function fe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=y[a+4>>2];a=y[a+8>>2];b=(a>>1)+b|0;c=y[c>>2];if(a&1){d=y[d+y[b>>2]>>2]}return _[d|0](b,c)|0}function Da(a,b){var c=0,d=0;d=Nb(b);a:{c=y[b+16>>2];if((c|0)>=0){b=y[b+12>>2];b=se(b,b>>31,c);if(!Z){break a}}o()}y[a+4>>2]=b;y[a>>2]=d}function Sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(y[a+4>>2]==y[y[b+8>>2]+4>>2]){Oc(b,c,d);return}a=y[a+8>>2];_[y[y[a>>2]+28>>2]](a,b,c,d)}function vd(a,b,c,d){if(b>>>0<=d>>>0){b=(b<<2)+a|0;while(1){if((a|0)!=(b|0)){y[c>>2]=y[a>>2];c=c+4|0;a=a+4|0;continue}break}return}o()}function ia(a,b,c,d){a:{if(!d|(b|0)<0|(a|0)<=(b|0)){a=0}else{a=b>>>3|0;if(a>>>0>=d>>>0){break a}a=z[a+c|0]>>>((b^-1)&7)&1}return a}o()}function wb(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){y[b>>2]=z[d+c|0]>>>7-y[a+12>>2]&1;_b(a);a=0}else{a=-1}return a}function Yc(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c-b|0;c=((c^d)&(b^c))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function Na(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c+b|0;c=((d^c)&(b^d))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function nb(a,b){var c=0;c=Y-16|0;Y=c;a:{if(z[a+4|0]==1){rc(a,b);break a}ub(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;Ha(c+12|0);Y=c+16|0}function $a(a){var b=0,c=0;b=y[a>>2];if(b){c=y[a+4>>2];while(1){if((c|0)!=(b|0)){c=la(c-4|0);continue}break}y[a+4>>2]=b;ma(y[a>>2])}}function va(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){w[b|0]=z[d+c|0];y[a+8>>2]=y[a+8>>2]+1;a=0}else{a=-1}return a}function re(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+6080|0;y[b+6084>>2]=c;y[b+6088>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}Fd(48)}function Sc(a){a=a|0;var b=0,c=0,d=0;y[a>>2]=5828;b=y[a+4>>2];c=b-4|0;d=y[c>>2]-1|0;y[c>>2]=d;if((d|0)<0){ma(b-12|0)}return a|0}function kd(a,b){var c=0;c=y[a+4>>2];b=c+(b<<2)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;c=c+4|0;continue}break}}function Ca(a,b,c){var d=0;d=Y-16|0;Y=d;ja(d+8|0,b,c);b=y[d+8>>2];if(b&3){o()}c=y[d+12>>2];y[a>>2]=b;y[a+4>>2]=c>>>2;Y=d+16|0}function Ec(a,b,c){var d=0;d=y[a+4>>2];while(1){if((b|0)!=(c|0)){w[d|0]=z[b|0];d=d+1|0;b=b+1|0;continue}break}y[a+4>>2]=d}function Pb(a,b,c,d){a:{if((d|0)>=0){d=c+d|0;c=d>>>5|0;break a}d=c+d|0;c=(d-31|0)/32|0}y[a+4>>2]=d&31;y[a>>2]=(c<<2)+b}function Ka(a,b,c){var d=0;d=c;c=y[c>>2];y[d>>2]=c+1;d=b;b=c>>>3|0;if(d>>>0<=b>>>0){o()}return z[a+b|0]>>>((c^-1)&7)&1}function ta(a){var b=0,c=0;if(y[a+12>>2]){b=y[a+8>>2]+1|0;if(b){c=y[a+4>>2];y[a+8>>2]=b>>>0>>0?b:c}y[a+12>>2]=0}}function yd(a,b){var c=0;c=se(b,0,a);if(Z|c>>>0>2147479550){a=0}else{b=E(a,b);a=Ya(b);if(b?a:0){t(a,0,b)}}return a}function ib(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){pa(c+68|0);la(c- -64|0);Zb(c+60|0);Za(c+56|0);Ja(c+12|0);ma(c)}}function Bc(a,b,c){if(c>>>0>=536870912){Ba();o()}a=b-a|0;b=a>>2;return a>>>0>=2147483640?536870911:b>>>0>c>>>0?b:c}function pd(a,b){jd(a);y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function gd(a){var b=0;a:{b=a;a=y[a+16>>2];if((b|0)==(a|0)){b=16}else{if(!a){break a}b=20}_[y[b+y[a>>2]>>2]](a)}}function Vb(a,b){var c=0;c=y[a+52>>2];if((c|0)==3){if(A[a+56>>1]!=1){y[a+52>>2]=-1;return-1}c=hd(a,b)}return c}function ie(a){a=a|0;var b=0,c=0;b=na(12);y[b>>2]=2600;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c;return b|0}function _b(a){var b=0;b=y[a+12>>2];a:{if((b|0)==7){y[a+8>>2]=y[a+8>>2]+1;b=0;break a}b=b+1|0}y[a+12>>2]=b}function _a(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return y[c>>2]}function Uc(a,b){a:{b:{if(!z[a+4|0]){if(y[a>>2]!=(b|0)){break b}break a}mb(a);w[a+4|0]=0}y[a>>2]=b}}function Od(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Sa(a,y[b+8>>2],f)){Pc(b,c,d,e)}}function gc(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return c}function he(a,b){a=a|0;b=b|0;var c=0;y[b>>2]=2600;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c}function rd(a,b){var c=0;c=Y-16|0;Y=c;y[c+12>>2]=b;b=a+24|0;a=c+12|0;Wc(b,a);la(a);Y=c+16|0}function jd(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}}function Cc(a){var b=0,c=0;b=y[a+8>>2]+1|0;if(b){c=a;a=y[a+4>>2];y[c+8>>2]=a>>>0>b>>>0?b:a}}function tc(a,b,c,d,e,f,g,h){a:{if(!qa(a)){break a}if(!qa(f)){break a}Zc(f,a,b,c,d,e,h,g)}}function vb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ya(c+32|0);ya(c+20|0);ya(c+8|0);ma(c)}}function te(a,b){var c=0,d=0;c=b&31;d=(-1<>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<>2]==y[y[b+8>>2]+4>>2]){Oc(b,c,d)}}function Jd(a){a=a|0;var b=0;b=y[a+60>>2];a=y[a+48>>2]+7>>>3|0;return(a>>>0>b>>>0?b:a)|0}function Ic(a,b){b=b-a|0;while(1){if((b|0)>0){w[a|0]=255;b=b-1|0;a=a+1|0;continue}break}}function Rb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){$a(c+24|0);Ja(c+12|0);ma(Ja(c))}}function Fa(){var a=0;a=na(12);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;kb(a,512);return a}function Nc(a){a=a|0;y[a+36>>2]=0;y[a+40>>2]=0;ya(a+76|0);ya(a- -64|0);return a|0}function td(a,b){if(4294967295/(b>>>0)>>>0<=a>>>0){rb();o()}return ab(E(a,b),1)}function Lc(a,b){var c=0;return(z[a+16|0]!=(b|0)|z[a+17|0]!=255?c:z[a+2|0]^1)&1}function pc(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ya(b+40|0);ya(b+28|0);ma(b)}}function Id(a){a=a|0;Ic(y[a+76>>2],y[a+80>>2]);y[a+48>>2]=0;return 1}function Xb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){$a(c+4|0);ma(c)}}function Ja(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}return a}function oa(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ub(c);ma(c)}}function $b(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}return a}function vc(a){var b=0;b=na(16);y[b>>2]=a;gb(b+4|0,a);return b}function ee(a,b){a=a|0;b=b|0;return(y[b+4>>2]==2888?a+4|0:0)|0}function Lb(a){if(a>>>0>=1073741824){jb();o()}return na(a<<2)}function yb(a){if(a>>>0>=536870912){jb();o()}return na(a<<3)}function jb(){var a=0;a=Fb(4);y[a>>2]=5724;P(a|0,5780,2);o()}function Ea(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(Ja(b))}}function na(a){a=Ya(a>>>0<=1?1:a);if(!a){Qc();o()}return a}function ya(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}}function Va(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ma(c)}}function fb(a,b,c,d,e,f,g){if(qa(a)){Hb(f,a,b,c,d,e,g)}}function Ua(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}}function ue(a){if(a){return 31-H(a-1^a)|0}return 32} +function db(){var a=0;a=na(28);y[a+20>>2]=0;return a}function ab(a,b){a=yd(a,b);if(!a){rb();o()}return a}function rc(a,b){var c=0;c=y[a>>2];y[a>>2]=b;ma(c)}function qd(a){var b=0;b=na(4);y[b>>2]=a;return b}function lc(){var a=0;a=na(36);t(a,0,36);return a}function rb(){y[(Y-16|0)+12>>2]=6036;sc();o()}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Oa(a,b,c,d){return(Eb(a,b,c)^c)&d^c}function Mb(a,b){a=a|0;b=b|0;return y[b>>2]}function ge(a){a=a|0;_[y[y[a>>2]+4>>2]](a)}function fd(a){if(!z[a+4|0]){ya(y[a>>2])}}function Zd(a){a=a|0;T();S(a+128|0);o()}function Ob(a){a=y[a>>2];if(a){ma(a)}}function Md(a){a=a|0;return y[a+4>>2]}function Gd(a){a=a|0;return Ya(a)|0}function Fb(a){return Ya(a|80)+80|0}function wa(a){return nd(na(44),a)}function ce(a,b){a=a|0;b=b|0;Ha(b)}function be(a,b){a=a|0;b=b|0;la(b)}function qa(a){return(Nb(a)|0)!=0}function fc(a){return(Xa(a)|0)!=0}function de(a){a=a|0;return 2868}function Yd(a){a=a|0;return 4890}function Xd(a){a=a|0;return 4864}function Xa(a){return Kc(a,4944)}function Nd(a){a=a|0;return 4913}function Nb(a){return Kc(a,2416)}function xb(a){a=a|0;return a|0}function pa(a){vb(a,0);return a}function oc(a){Za(a+24|0);ma(a)}function la(a){oa(a,0);return a}function ac(a){ib(a,0);return a}function Ab(a){zb(a,0);return a}function Mc(a){a=a|0;ma(Sc(a))}function Kd(a){a=a|0;ma(Nc(a))}function wd(a){return Lc(a,3)}function _d(a){a=a|0;sc();o()}function Qb(a){return Lc(a,2)}function $c(a,b){a=a|0;b=b|0}function Ta(a){a=a|0;ma(a)}function ub(a){Jc(a,4856)}function mb(a){Jc(a,4936)}function ua(a){Va(a,0)}function Zb(a){Xb(a,0)}function Za(a){Rb(a,0)}function Qc(){sc();o()}function Ha(a){rc(a,0)}function sc(){U();o()}function hc(a){a=a|0} +// EMSCRIPTEN_END_FUNCS +a=z;m(n);var _=[null,Sc,xb,qe,pe,oe,ne,me,le,ke,je,xb,Nc,Kd,Jd,Id,Hd,Mb,Mb,xb,Ta,ie,he,hc,ge,fe,ee,de,$c,ce,$c,be,Mb,Mb,Zd,_d,Ta,Yd,Ta,Xd,xb,Ta,hc,hc,Wd,Ta,Qd,Ta,Nd,Mc,Md,Mc,Ta,Vd,Od,Pd,Rd,Ta,Ud,Td,Sd];function $(){return v.byteLength>>16}function ea(fa){fa=fa|0;var aa=$()|0;var ba=aa+fa|0;if(aa{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);uncaughtExceptionCount++;abort()};var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _createImageData(size){Module.imageData=new Uint8Array(size)}var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,_ccitt_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["l"];_free=Module["_free"]=wasmExports["m"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["n"];_ccitt_decode=Module["_ccitt_decode"]=wasmExports["o"];__emscripten_timeout=wasmExports["p"];memory=wasmMemory=wasmExports["j"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={a:___cxa_throw,f:__abort_js,e:__emscripten_runtime_keepalive_clear,b:__setitimer_js,h:_createImageData,c:_emscripten_resize_heap,d:_proc_exit,i:_setImageData,g:_setLineData};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default JBig2; diff --git a/frontend/public/pdfjs-wasm/openjpeg.wasm b/frontend/public/pdfjs-wasm/openjpeg.wasm new file mode 100644 index 0000000..5acce73 Binary files /dev/null and b/frontend/public/pdfjs-wasm/openjpeg.wasm differ diff --git a/frontend/public/pdfjs-wasm/openjpeg_nowasm_fallback.js b/frontend/public/pdfjs-wasm/openjpeg_nowasm_fallback.js new file mode 100644 index 0000000..0df96ae --- /dev/null +++ b/frontend/public/pdfjs-wasm/openjpeg_nowasm_fallback.js @@ -0,0 +1,17 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function OpenJPEG(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(Aa){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;A=A>>>0;if(z+A>a.length)throw"trap: invalid memory.fill";a.fill(v,z,z+A)}function B(z,C,A){a.copyWithin(z,C,C+A)}function D(){throw new Error("abort")}function za(n){var E=new ArrayBuffer(16777216);var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=n.a;var Y=X.a;var Z=X.b;var _=X.c;var $=X.d;var aa=X.e;var ba=X.f;var ca=X.g;var da=X.h;var ea=X.i;var fa=X.j;var ga=X.k;var ha=X.l;var ia=X.m;var ja=X.n;var ka=X.o;var la=X.p;var ma=X.q;var na=94240;var oa=0;var pa=0;var qa=0; +// EMSCRIPTEN_START_FUNCS +function Zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,M=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=O(0),ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,sa=0,ta=0,ua=0,va=0,wa=0;Y=na-96|0;na=Y;C=H[a+8>>2];a:{b:{c:{if(!H[a>>2]){g=N(H[C+16>>2]-H[C+8>>2]|0,H[C+20>>2]-H[C+12>>2]|0)<<2;c=Ia(g);H[C+60>>2]=c;if(!c){Ba(H[a+32>>2],1,8023,0);d=a+28|0;break b}if(!g){break c}y(c,0,g);break c}c=H[C+60>>2];if(!c){break c}Ca(c);H[C+60>>2]=0}if(!H[H[a+28>>2]>>2]){break a}oa=H[a+16>>2];c=H[oa+28>>2]+N(H[oa+24>>2],152)|0;va=H[c-152>>2];wa=H[c-144>>2];pa=H[a+20>>2];qa=H[a+12>>2];ua=H[a+4>>2];d=a+28|0;d:{q=H[b+4>>2];f=0;e:{if((q|0)<=0){break e}k=H[b>>2];c=0;f:{while(1){g=k+N(c,12)|0;if(!H[g>>2]){break f}c=c+1|0;if((q|0)!=(c|0)){continue}break}f=0;break e}f=H[g+4>>2]}if(f){break d}f=Ea(1,156);if(!f){Ba(H[a+32>>2],1,6313,0);break b}H[f+140>>2]=0;c=0;k=H[b+4>>2];g:{if((k|0)==2147483647){break g}g=H[b>>2];if((k|0)>0){while(1){q=g+N(c,12)|0;if(!H[q>>2]){k=H[q+8>>2];if(k){ra[k|0](H[q+4>>2]);g=H[b>>2]}b=g+N(c,12)|0;H[b+8>>2]=15;H[b+4>>2]=f;c=1;break g}c=c+1|0;if((k|0)!=(c|0)){continue}break}}g=Ha(g,N(k,12)+12|0);c=0;if(!g){break g}H[b>>2]=g;c=H[b+4>>2];g=g+N(c,12)|0;H[g+8>>2]=15;H[g+4>>2]=f;H[g>>2]=0;H[b+4>>2]=c+1;c=1}if(c){break d}Ba(H[a+32>>2],1,8338,0);b=H[f+116>>2];if(b){Ca(b);H[f+116>>2]=0}b=H[f+120>>2];if(b){Ca(b);H[f+120>>2]=0}Ca(H[f+148>>2]);Ca(f);break b}H[f+144>>2]=H[a+24>>2];E=H[a+40>>2];_=H[a+36>>2];S=H[a+32>>2];j=H[pa+808>>2];b=H[qa+16>>2];h:{V=H[pa+16>>2];i:{if(V&64){k=na-304|0;na=k;j:{if(j){if(_){Ba(S,1,3219,0);break j}Ba(S,1,3219,0);break j}i=H[f+116>>2];c=H[C+20>>2]-H[C+12>>2]|0;b=H[C+16>>2]-H[C+8>>2]|0;g=N(c,b);k:{l:{if(g>>>0>K[f+132>>2]){Ca(i);j=g<<2;i=Ia(j);H[f+116>>2]=i;if(!i){i=0;break j}H[f+132>>2]=g;break l}if(!i){break k}j=g<<2}if(!j){break k}y(i,0,j)}i=H[f+120>>2];m:{if(K[f+136>>2]>2639){break m}Ca(i);i=Ia(10560);H[f+120>>2]=i;if(i){break m}i=0;break j}H[f+136>>2]=2640;y(i,0,10560);H[f+128>>2]=c;H[f+124>>2]=b;n=H[C+24>>2];if(!n){i=1;break j}q=H[C+28>>2];i=1;n:{o:{p:{q:{j=H[C+52>>2];r:{if(j){g=j&3;c=H[C+4>>2];i=0;s:{if(j>>>0>=4){b=j&-4;while(1){o=c+(i<<3)|0;h=H[o+28>>2]+(H[o+20>>2]+(H[o+12>>2]+(H[o+4>>2]+h|0)|0)|0)|0;i=i+4|0;z=z+4|0;if((b|0)!=(z|0)){continue}break}if(!g){break s}}while(1){h=H[(c+(i<<3)|0)+4>>2]+h|0;i=i+1|0;l=l+1|0;if((g|0)!=(l|0)){continue}break}}if(!H[f+144>>2]&(j|0)==1){break o}if(K[f+152>>2]>=h>>>0){break r}z=Ha(H[f+148>>2],h);if(z){break q}i=0;break j}if(!H[f+144>>2]){break j}}z=H[f+148>>2];if(z){break p}i=0;break j}H[f+152>>2]=h;H[f+148>>2]=z}if(!H[C+52>>2]){h=0;break n}j=H[C+4>>2];h=0;i=0;while(1){g=i<<3;c=g+j|0;b=H[c+4>>2];if(b){B(h+z|0,H[c>>2],b)}j=H[C+4>>2];h=H[(g+j|0)+4>>2]+h|0;i=i+1|0;if(i>>>0>2]){continue}break}break n}z=H[H[C+4>>2]>>2]}i=0;j=0;c=H[C+40>>2];g=0;t:{if(!c){break t}b=H[C>>2];j=H[b+8>>2];g=0;if((c|0)==1){break t}g=H[b+32>>2]}c=n-q|0;j=g+j|0;u:{if(!j){l=0;break u}i=1;b=H[C>>2];p=H[b>>2];l=0;if((j|0)==1){i=0;break u}l=H[b+24>>2]}P=c+1|0;ha=H[f+116>>2];s=H[f+120>>2];X=H[C+12>>2];x=H[C+20>>2];ca=H[C+8>>2];D=H[C+16>>2];v:{w:{x:{y:{z:{A:{B:{C:{if(!(!i|l)){if(!_){break C}Ba(S,2,10806,0);j=1;break B}if(j>>>0<4){break B}if(_){H[k+112>>2]=j;Ba(S,1,9590,k+112|0);break v}H[k+96>>2]=j;Ba(S,1,9590,k+96|0);i=0;break j}Ba(S,2,10806,0);i=H[C+24>>2];if(i>>>0>30){break A}e=1;if(i>>>0>=P>>>0){break y}break w}i=H[C+24>>2];if(i>>>0<=30){break z}if(!_){break A}H[k+32>>2]=H[C+24>>2];Ba(S,1,12302,k+32|0);break v}H[k>>2]=i;Ba(S,1,12302,k);i=0;break j}if(i>>>0

>>0){break x}if(j>>>0<2){e=j;break y}if((i|0)!=(P|0)){e=j;break y}e=1;if(I[26384]){break y}if(!_){F[26384]=1;H[k+64>>2]=j;Ba(S,2,10299,k- -64|0);break y}if(!I[26384]){F[26384]=1;H[k+80>>2]=j;Ba(S,2,10299,k+80|0)}}if(!(!(p>>>0<2|h>>>0

>>0)&l+p>>>0<=h>>>0)){if(_){i=0;Ba(S,1,9532,0);break j}i=0;Ba(S,1,9532,0);break j}U=p+z|0;b=I[U-1|0];i=b<<4|I[U-2|0]&15;if(!(!(i>>>0<2|(b|0)==255)&(i|0)<=(p|0))){if(_){i=0;Ba(S,1,15305,0);break j}i=0;Ba(S,1,15305,0);break j}sa=H[C+28>>2];H[k+272>>2]=0;H[k+280>>2]=0;H[k+264>>2]=0;H[k+268>>2]=0;H[k+296>>2]=0;H[k+300>>2]=0;H[k+284>>2]=0;H[k+288>>2]=0;b=i-1|0;H[k+276>>2]=b;o=(p+z|0)-i|0;H[k+256>>2]=o;q=I[o|0];c=8;H[k+272>>2]=8;j=o+1|0;H[k+256>>2]=j;g=i-2|0;H[k+276>>2]=g;n=(b|0)==1?q|15:q;b=0;q=b;H[k+264>>2]=n;H[k+268>>2]=b;H[k+280>>2]=!b&(n|0)==255;u=o&3;D:{E:{if((u|0)==3){break E}v=0;if(!((n|0)!=255|(b|0)!=0|I[j|0]<=143)){break D}b=255;b=i>>>0>=3?I[j|0]:b;h=i-3|0;H[k+276>>2]=h;o=!q&(n|0)==255;c=o?15:16;H[k+272>>2]=c;R=j+(i>>>0>2)|0;H[k+256>>2]=R;b=(g|0)==1?b|15:b;g=0;H[k+280>>2]=!g&(b|0)==255;g=b;j=n;b=o?7:8;o=b&31;if((b&63)>>>0>=32){m=j<>>32-o|q<>2]=n;H[k+268>>2]=b;if((u|0)==2){break E}o=255;v=0;if(!((g|0)!=255|(r|0)!=0|I[R|0]<=143)){break D}o=i>>>0>=4?I[R|0]:o;j=i-4|0;H[k+276>>2]=j;R=R+(i>>>0>3)|0;H[k+256>>2]=R;b=(h|0)==1?o|15:o;o=0;m=o;H[k+280>>2]=!m&(b|0)==255;o=!r&(g|0)==255;c=(o?7:8)+c|0;H[k+272>>2]=c;g=b;h=n;b=o?7:8;r=b&31;if((b&63)>>>0>=32){o=h<>>32-r|q<>2]=n;H[k+268>>2]=b;if((u|0)==1){break E}v=0;if(!((g|0)!=255|(m|0)!=0|I[R|0]<=143)){break D}b=255;b=i>>>0>=5?I[R|0]:b;H[k+276>>2]=i-5;H[k+256>>2]=R+(i>>>0>4);o=0;b=(j|0)==1?b|15:b;H[k+280>>2]=1&(b|0)==255;g=!m&(g|0)==255;c=(g?7:8)+c|0;H[k+272>>2]=c;j=n;g=g?7:8;h=g&31;if((g&63)>>>0>=32){E=j<>>32-h|q<>2]=n;H[k+268>>2]=b}b=n;c=64-c|0;g=c&31;if((c&63)>>>0>=32){w=b<>>32-g|q<>2]=b;H[k+268>>2]=w;v=1}if(!v){if(_){i=0;Ba(S,1,11470,0);break j}i=0;Ba(S,1,11470,0);break j}A=D-ca|0;o=0;m=i;r=i-2|0;H[k+244>>2]=r;c=p+z|0;b=c-3|0;H[k+224>>2]=b;g=I[c-2|0];c=g>>>0>143;H[k+248>>2]=c;q=0;n=g>>>4|0;H[k+232>>2]=n;H[k+236>>2]=0;h=(n&7)==7?3:4;H[k+240>>2]=h;g=(b&3)+1|0;R=g>>>0>>0?g:r;F:{G:{if(r){while(1){i=c;u=b;b=b-1|0;H[k+224>>2]=b;g=I[u|0];c=g>>>0>143;H[k+248>>2]=c;j=h&31;if((h&63)>>>0>=32){E=g<>>32-j;j=g<>2]=n;q=q|E;H[k+236>>2]=q;h=(i&1?(g&127)==127?7:8:8)+h|0;H[k+240>>2]=h;o=o+1|0;if((R|0)!=(o|0)){continue}break}j=r-R|0;H[k+244>>2]=j;if(h>>>0>32){break F}if((j|0)>=4){o=H[u-4>>2];H[k+224>>2]=u-5;H[k+244>>2]=j-4;break G}if((j|0)<=0){o=0;break G}H:{if((R|0)==(m-3|0)){i=24;o=0;break H}E=j&1;r=j&2147483646;i=24;o=0;g=0;while(1){u=b-1|0;H[k+224>>2]=u;R=I[b|0];b=b-2|0;H[k+224>>2]=b;H[k+244>>2]=j-1;u=I[u|0];j=j-2|0;H[k+244>>2]=j;o=R<>2]=b-1;b=I[b|0];H[k+244>>2]=j-1;o=b<>2]=r-R}u=o&255;H[k+248>>2]=u>>>0>143;g=c?(o&2130706432)==2130706432?7:8:8;c=g+(o>>>0<=2415919103?8:(o&8323072)==8323072?7:8)|0;i=o>>>16&255;b=c+(i>>>0<=143?8:(o&32512)==32512?7:8)|0;j=o>>>8&255;H[k+240>>2]=b+((j>>>0<=143?8:(o&127)==127?7:8)+h|0);b=i<>>24|j<>>0>=32){o=b<>>32-c;b=b<>2]=b|n;H[k+236>>2]=o|q}Zb(k+192|0,z,p-m|0,255);b=0;I:{if(e>>>0<2){break I}Zb(k+160|0,U,l,0);b=0;if((e|0)==2){break I}n=0;q=0;o=0;H[k+152>>2]=1;H[k+144>>2]=0;H[k+136>>2]=0;H[k+140>>2]=0;c=l;i=c-1|0;H[k+148>>2]=i;b=(p+z|0)+c|0;g=b-1|0;H[k+128>>2]=g;R=g&3;J:{if((c|0)<=0){b=g;break J}b=b-2|0;H[k+128>>2]=b;n=I[g|0]}H[k+136>>2]=n;H[k+140>>2]=0;p=n>>>0>143;H[k+152>>2]=p;l=(n&127)==127?7:8;H[k+144>>2]=l;K:{if(!R){break K}u=c-2|0;H[k+148>>2]=u;L:{if((c|0)<2){g=b;break L}g=b-1|0;H[k+128>>2]=g;o=I[b|0]}p=o>>>0>143;H[k+152>>2]=p;b=l&31;if((l&63)>>>0>=32){m=o<>>32-b;b=o<>2]=q;H[k+140>>2]=m;l=(n>>>0<=143?8:(o&127)==127?7:8)+l|0;H[k+144>>2]=l;if((R|0)==1){b=g;n=q;q=m;c=i;i=u;break K}h=c-3|0;H[k+148>>2]=h;M:{if((c|0)<3){j=g;break M}j=g-1|0;H[k+128>>2]=j;aa=I[g|0]}p=aa>>>0>143;H[k+152>>2]=p;b=l&31;if((l&63)>>>0>=32){E=aa<>>32-b;b=aa<>2]=n;H[k+140>>2]=b;l=(o>>>0<=143?8:(aa&127)==127?7:8)+l|0;H[k+144>>2]=l;if((R|0)==2){b=j;c=u;i=h;break K}i=c-4|0;H[k+148>>2]=i;o=0;N:{if((c|0)<4){b=j;break N}b=j-1|0;H[k+128>>2]=b;o=I[j|0]}p=o>>>0>143;H[k+152>>2]=p;c=l&31;if((l&63)>>>0>=32){w=o<>>32-c;c=o<>2]=n;H[k+140>>2]=c;l=(aa>>>0<=143?8:(o&127)==127?7:8)+l|0;H[k+144>>2]=l;c=h}if(l>>>0<=32){O:{if((c|0)>=5){g=H[b-3>>2];H[k+148>>2]=c-5;H[k+128>>2]=b-4;break O}g=0;if((c|0)<2){break O}c=24;while(1){j=b-1|0;H[k+128>>2]=j;b=I[b|0];o=i-1|0;H[k+148>>2]=o;g=b<>>0>1;b=j;c=c-8|0;i=o;if(h){continue}break}}h=g&255;H[k+152>>2]=h>>>0>143;i=p?(g&2130706432)==2130706432?7:8:8;c=i+(g>>>0<=2415919103?8:(g&8323072)==8323072?7:8)|0;o=g>>>16&255;b=c+(o>>>0<=143?8:(g&32512)==32512?7:8)|0;j=g>>>8&255;H[k+144>>2]=b+((j>>>0<=143?8:(g&127)==127?7:8)+l|0);b=o<>>24|j<>>0>=32){m=b<>>32-c;b=b<>2]=b|n;H[k+140>>2]=m|q}b=1}aa=b;$=x-X|0;ta=P+1|0;F[s+2112|0]=0;u=s+2112|0;g=Ya(k+256|0);if((A|0)>0){P=sa-1|0;l=s;j=u;b=0;c=ha;z=0;while(1){R=z;h=J[(b<<8|(lb(k+224|0)&127)<<1)+16656>>1];P:{if(b){break P}b=g-2|0;h=(b|0)==-1?h:0;if((g|0)>1){g=b;break P}g=Ya(k+256|0)}q=H[k+236>>2];n=H[k+232>>2];i=H[k+240>>2];x=h>>>4|0;p=H[l>>2]|(x&3|h>>>2&48)<>2]=p;E=h&16;b=h>>>5&7|E>>>4;o=i;i=h&7;z=o-i|0;n=((1<>>i;q=q>>>i|0;o=n;i=0;if((A|0)>(R|2)){i=J[(b<<8|(n&127)<<1)+16656>>1];Q:{if(b){break Q}b=g-2|0;i=(b|0)==-1?i:0;if((g|0)>1){g=b;break Q}g=Ya(k+256|0)}b=i&7;z=z-b|0;n=((1<>>b;q=q>>>b|0;o=n;b=i>>>4&1|i>>>5&7}H[l>>2]=p|(i<<2&768|i&48)<>>2&2|h>>>3&1;R:{if((p|0)!=3){break R}m=g-2|0;p=(m|0)==-1?4:3;if((g|0)>1){g=m;break R}g=Ya(k+256|0)}S:{if(!p){H[k+120>>2]=1;H[k+124>>2]=1;o=0;break S}if(p>>>0<=2){m=I[(o&7)+20804|0];w=m>>>2&7;r=m&3;m=(((-1<>>r)+(m>>>5|0)|0)+1|0;o=(p|0)==1;H[k+124>>2]=o?1:m;H[k+120>>2]=o?m:1;o=r+w|0;break S}v=o;o=I[(o&7)+20804|0];U=o&3;m=v>>>U|0;if((p|0)==3){X=(o>>>5|0)+1|0;if((U|0)==3){H[k+124>>2]=m&1|2;o=o>>>2&7;H[k+120>>2]=X+((-1<>>1);o=o+4|0;break S}r=I[(m&7)+20804|0];p=r&3;m=m>>>p|0;w=o>>>2&7;H[k+120>>2]=X+(m&(-1<>>2&7;H[k+124>>2]=(((-1<>>w)+(r>>>5|0)|0)+1;o=o+(p+(w+U|0)|0)|0;break S}r=I[(m&7)+20804|0];p=r&3;m=m>>>p|0;w=o>>>2&7;H[k+120>>2]=((m&(-1<>>5|0)|0)+3;o=r>>>2&7;H[k+124>>2]=(((-1<>>w)+(r>>>5|0)|0)+3;o=o+(w+(p+U|0)|0)|0}T:{X=H[k+120>>2];if(X>>>0<=ta>>>0){w=H[k+124>>2];if(w>>>0<=ta>>>0){break T}}if(_){i=0;Ba(S,1,15756,0);break j}i=0;Ba(S,1,15756,0);break j}H[k+240>>2]=z-o;m=o&31;if((o&63)>>>0>=32){o=0;q=q>>>m|0}else{o=q>>>m|0;q=((1<>>m}H[k+232>>2]=q;H[k+236>>2]=o;o=i&240|x&15;z=R+4|0;q=(z|0)<=(A|0)?255:255>>>(z-A<<1)|0;x=($|0)>1?q:q&85;if(o&(x^-1)){if(_){i=0;Ba(S,1,12194,0);break j}i=0;Ba(S,1,12194,0);break j}U:{V:{if(E){n=Ma(k+192|0);p=X+(h<<19>>31)|0;H[k+208>>2]=H[k+208>>2]-p;m=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=m>>>r|0}else{o=m>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;T=(n&(-1<>>8&1)<>2]=T}W:{if(h&32){n=Ma(k+192|0);p=X+(h<<18>>31)|0;H[k+208>>2]=H[k+208>>2]-p;m=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=m>>>r|0}else{o=m>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break W}if(!(x&2)){break W}H[(A<<2)+c>>2]=0}p=c+4|0;X:{Y:{if(h&64){n=Ma(k+192|0);r=X+(h<<17>>31)|0;H[k+208>>2]=H[k+208>>2]-r;m=H[k+204>>2];q=H[k+200>>2];E=r&31;if((r&63)>>>0>=32){o=0;q=m>>>E|0}else{o=m>>>E|0;q=((1<>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=(n&(-1<>>10&1)<>2]=q}F[j+1|0]=0;Z:{if(h&128){n=Ma(k+192|0);r=X-(h>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-r;m=H[k+204>>2];q=H[k+200>>2];E=r&31;if((r&63)>>>0>=32){o=0;q=m>>>E|0}else{o=m>>>E|0;q=((1<>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=c+8|0;_:{$:{if(i&16){n=Ma(k+192|0);p=w+(i<<19>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<>>8&1)<>2]=p}aa:{if(i&32){n=Ma(k+192|0);p=w+(i<<18>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break aa}if(!(x&32)){break aa}H[m+(A<<2)>>2]=0}m=c+12|0;ba:{ca:{if(i&64){n=Ma(k+192|0);p=w+(i<<17>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<>>10&1)<>2]=p}j=j+2|0;F[j|0]=0;da:{if(i&128){n=Ma(k+192|0);p=w-(i>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;i=n&(-1<>>11&1)<>2]=i+2<>>0<128){break da}H[m+(A<<2)>>2]=0}Z=Z^16;l=(R&4)+l|0;c=c+16|0;if((z|0)<(A|0)){continue}break}}ia=V&8;ja=s+1584|0;ka=s+1056|0;fa=s+528|0;if(($|0)>=3){la=N(A,12);ma=A<<3;da=sa-1|0;b=sa-2|0;t=3<>>1&2147483644)+4|0;r=2;while(1){R=r;T=I[u|0];F[u|0]=0;Z=Z&-17^2;ea:{if((A|0)<=0){r=r+2|0;break ea}b=R&4?fa:s;r=R+2|0;j=ha+(N(A,R)<<2)|0;p=0;c=u;E=0;while(1){V=p;P=T&255;i=I[c+1|0]>>>5&4|(P>>>7|E);h=J[(i<<8|(lb(k+224|0)&127)<<1)+18704>>1];fa:{if(i){break fa}i=g-2|0;h=(i|0)==-1?h:0;if((g|0)>1){g=i;break fa}g=Ya(k+256|0)}q=H[k+236>>2];n=H[k+232>>2];i=H[k+240>>2];l=H[b>>2]|(h>>>4&3|h>>>2&48)<>2]=l;U=h&64;X=h&128;E=U>>>5|X>>>6;o=i;i=h&7;x=o-i|0;n=((1<>>i;q=q>>>i|0;p=n;i=0;if((A|0)>(V|2)){o=I[c+2|0]>>>5&4|I[c+1|0]>>>7|E;i=J[(o<<8|(n&127)<<1)+18704>>1];ga:{if(o){break ga}o=g-2|0;i=(o|0)==-1?i:0;if((g|0)>1){g=o;break ga}g=Ya(k+256|0)}o=i&7;x=x-o|0;E=(i>>>5|i>>>6)&2;n=((1<>>o;p=n;q=q>>>o|0}H[b>>2]=l|(i<<2&768|i&48)<>>2&2|h>>>3&1;switch(z|0){case 0:break ha;case 3:break ia;default:break ja}}o=I[(p&7)+20804|0];w=o>>>2&7;v=p;p=o&3;l=(((-1<>>p)+(o>>>5|0)|0)+1|0;m=(z|0)==1;o=m?1:l;l=m?l:1;z=p+w|0;break ha}v=I[(p&7)+20804|0];m=v&3;o=p>>>m|0;w=I[(o&7)+20804|0];l=w&3;p=v>>>2&7;M=p+(l+m|0)|0;m=w>>>2&7;z=M+m|0;o=o>>>l|0;l=((o&(-1<>>5|0)|0)+1|0;o=(((-1<>>p)+(w>>>5|0)|0)+1|0}H[k+240>>2]=x-z;m=z&31;if((z&63)>>>0>=32){w=0;q=q>>>m|0}else{w=q>>>m|0;q=((1<>>m}H[k+232>>2]=q;H[k+236>>2]=w;p=h&240;if(p-1&p){n=P&127;q=I[c+1|0]&127;n=n>>>0>q>>>0?n:q;q=n-2|0;l=(n>>>0>=q>>>0?q:0)+l|0}m=i&240;if(m-1&m){n=I[c+1|0]&127;q=I[c+2|0]&127;q=n>>>0>q>>>0?n:q;o=(q>>>0>2?q-2|0:0)+o|0}if(!(l>>>0<=ta>>>0&o>>>0<=ta>>>0)){if(_){i=0;Ba(S,1,15856,0);break j}i=0;Ba(S,1,15856,0);break j}T=I[c+2|0];F[c+1|0]=0;F[c+2|0]=0;n=m|p>>>4;p=V+4|0;q=(p|0)<=(A|0)?255:255>>>(p-A<<1)|0;P=(r|0)>($|0)?q&85:q;if(n&(P^-1)){if(_){i=0;Ba(S,1,12194,0);break j}i=0;Ba(S,1,12194,0);break j}ka:{la:{if(h&16){n=Ma(k+192|0);x=(h<<19>>31)+l|0;H[k+208>>2]=H[k+208>>2]-x;m=H[k+204>>2];q=H[k+200>>2];z=x&31;if((x&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;x=(n&(-1<>>8&1)<>2]=x}ma:{if(h&32){n=Ma(k+192|0);x=(h<<18>>31)+l|0;H[k+208>>2]=H[k+208>>2]-x;m=H[k+204>>2];q=H[k+200>>2];z=x&31;if((x&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break ma}if(!(P&2)){break ma}H[(A<<2)+j>>2]=0}x=j+4|0;na:{oa:{if(U){n=Ma(k+192|0);z=(h<<17>>31)+l|0;H[k+208>>2]=H[k+208>>2]-z;m=H[k+204>>2];q=H[k+200>>2];U=z&31;if((z&63)>>>0>=32){w=0;q=m>>>U|0}else{w=m>>>U|0;q=((1<>>U}H[k+200>>2]=q;H[k+204>>2]=w;m=(n&(-1<>>10&1)<>2]=m}pa:{if(X){n=Ma(k+192|0);l=l-(h>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-l;m=H[k+204>>2];q=H[k+200>>2];z=l&31;if((l&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=j+8|0;qa:{ra:{if(i&16){n=Ma(k+192|0);l=(i<<19>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<>>8&1)<>2]=l}sa:{if(i&32){n=Ma(k+192|0);l=(i<<18>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break sa}if(!(P&32)){break sa}H[m+(A<<2)>>2]=0}m=j+12|0;ta:{ua:{if(i&64){n=Ma(k+192|0);l=(i<<17>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<>>10&1)<>2]=l}c=c+2|0;va:{if(i&128){n=Ma(k+192|0);h=o-(i>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-h;o=H[k+204>>2];q=H[k+200>>2];l=h&31;if((h&63)>>>0>=32){w=0;o=o>>>l|0}else{w=o>>>l|0;o=((1<>>l}H[k+200>>2]=o;H[k+204>>2]=w;i=n&(-1<>>11&1)<>2]=i+2<>>0<128){break va}H[m+(A<<2)>>2]=0}Z=Z^16;b=(V&4)+b|0;j=j+16|0;if((p|0)<(A|0)){continue}break}}wa:{if(!(R&2)|e>>>0<2){break wa}m=r&4;xa:{ya:{za:{Aa:{Ba:{if(aa){x=m?s:fa;z=0;if((A|0)<=0){break Ba}q=ha+(N(A,R-2|0)<<2)|0;while(1){i=lb(k+128|0);h=0;j=H[x>>2];if(j){h=q+(z<<2)|0;o=0;c=15;while(1){Ca:{if(!(c&j)){break Ca}n=c&286331153;if(n&j){H[h>>2]=W|H[h>>2]^((i^-1)&1)<>>1|0}if(j&n<<1){b=(A<<2)+h|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}if(j&n<<2){b=h+ma|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}if(!(j&n<<3)){break Ca}b=h+la|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}h=h+4|0;c=c<<4;o=o+1|0;if((o|0)!=8){continue}break}h=xe(j)}x=x+4|0;H[k+144>>2]=H[k+144>>2]-h;c=H[k+140>>2];b=H[k+136>>2];i=h&31;if((h&63)>>>0>=32){w=0;b=c>>>i|0}else{w=c>>>i|0;b=((1<>>i}H[k+136>>2]=b;H[k+140>>2]=w;z=z+8|0;if((A|0)>(z|0)){continue}break}}l=0;i=0;ba=m?ka:ja;h=ba;x=m?s:fa;c=x;if((A|0)>0){break za}b=!m;break Aa}ba=m?ka:ja;b=!m}if(R>>>0<=5){break wa}q=b?s:fa;if((A|0)<=0){break xa}c=b?ka:ja;break ya}while(1){b=i>>>28|0;i=H[c>>2];b=i|(b|i<<4|i>>>4);H[h>>2]=b;b=b|H[c+4>>2]<<28;H[h>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);h=h+4|0;c=c+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}if(R>>>0<6){break wa}q=m?fa:s;c=m?ja:ka}b=0;o=0;h=x;m=c;i=c;c=q;while(1){j=h+4|0;n=H[i>>2];h=H[h>>2];if(!ia){n=n|(h|(h<<4|b>>>28|h>>>4|H[j>>2]<<28))<<3&-2004318072}H[i>>2]=n&(H[c>>2]^-1);c=c+4|0;i=i+4|0;b=h;h=j;o=o+8|0;if((A|0)>(o|0)){continue}break}if((A|0)<=0){break xa}U=ha+(N(A,R-6|0)<<2)|0;T=0;b=q;while(1){j=0;c=H[m>>2];if(c){X=A-T|0;R=(T<<2)+U|0;i=0;E=0;while(1){n=i;i=Ma(k+160|0);o=E+4|0;P=(A|0)>(o+T|0)?o:X;Da:{if((P|0)<=(E|0)){h=0;break Da}M=H[b>>2]^-1;w=E<<2;z=R+w|0;h=0;o=E;p=15<>>1|0}V=v<<1;if(V&c){if(i&1){j=j|V;c=M&116<<(o<<2)|c}h=h+1|0;i=i>>>1|0}V=v<<2;if(V&c){if(i&1){j=j|V;c=M&232<<(o<<2)|c}h=h+1|0;i=i>>>1|0}V=v<<3;if(!(V&c)){break Ea}if(i&1){j=j|V;c=M&192<<(o<<2)|c}h=h+1|0;i=i>>>1|0}l=l<<4;o=o+1|0;if((P|0)>(o|0)){continue}break}if(!(j>>>w&65535)){break Da}while(1){Fa:{if(!(j&p)){break Fa}l=p&286331153;if(l&j){H[z>>2]=t|(H[z>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(l<<1&j){o=(A<<2)+z|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(l<<2&j){o=z+ma|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(!(l<<3&j)){break Fa}o=z+la|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}p=p<<4;z=z+4|0;E=E+1|0;if((P|0)>(E|0)){continue}break}}H[k+176>>2]=H[k+176>>2]-h;o=H[k+172>>2];i=H[k+168>>2];l=h&31;if((h&63)>>>0>=32){w=0;i=o>>>l|0}else{w=o>>>l|0;i=((1<>>l}H[k+168>>2]=i;H[k+172>>2]=w;i=1;E=4;if(!(n&1)){continue}break}H[m+4>>2]=H[m+4>>2]|(j>>>27&14|j>>>29|j>>>28)&(H[b+4>>2]^-1)}n=H[b>>2]|j;o=n>>>3&286331153;i=o>>>4|o<<4|o;if(T){c=ba-4|0;H[c>>2]=H[c>>2]|(H[x-4>>2]^-1)&o<<28}H[ba>>2]=H[ba>>2]|i&(H[x>>2]^-1);H[ba+4>>2]=H[ba+4>>2]|(H[x+4>>2]^-1)&n>>>31;m=m+4|0;b=b+4|0;ba=ba+4|0;x=x+4|0;T=T+8|0;if((A|0)>(T|0)){continue}break}}if(!ea){break wa}y(q,0,ea)}if((r|0)<($|0)){continue}break}}Ga:{if(e>>>0<2){break Ga}e=($&3)-1|0;Ha:{if(aa&e>>>0<2){if((A|0)<=0){break Ha}p=1<>2];if(u){h=j+(E<<2)|0;c=15;o=0;while(1){Ia:{if(!(c&u)){break Ia}m=c&286331153;if(m&u){H[h>>2]=p|H[h>>2]^((i^-1)&1)<>>1|0}if(u&m<<1){b=(A<<2)+h|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}if(u&m<<2){b=h+g|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}if(!(u&m<<3)){break Ia}b=h+n|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}h=h+4|0;c=c<<4;o=o+1|0;if((o|0)!=8){continue}break}h=xe(u)}q=q+4|0;H[k+144>>2]=H[k+144>>2]-h;c=H[k+140>>2];b=H[k+136>>2];i=h&31;if((h&63)>>>0>=32){w=0;b=c>>>i|0}else{w=c>>>i|0;b=((1<>>i}H[k+136>>2]=b;H[k+140>>2]=w;E=E+8|0;if((A|0)>(E|0)){continue}break}}if((A|0)<=0|e>>>0>1){break Ha}b=$&4;h=b?fa:s;c=b?ja:ka;l=0;i=0;while(1){b=i>>>28|0;i=H[h>>2];b=i|(b|i<<4|i>>>4);H[c>>2]=b;b=b|H[h+4>>2]<<28;H[c>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);c=c+4|0;h=h+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}}b=($|0)>6?($-($+1&3)|0)-3|0:0;if(($|0)<=(b|0)){break Ga}r=N(A,12);R=A<<3;ea=3<>>0>=3){Z=-1;if((g|0)<5){break La}if(X){break Ja}g=b&4;h=g?fa:s;i=g?ja:ka;c=0;if(!ia){c=g?s:fa;l=0;j=0;while(1){g=j>>>28|0;Z=-1;j=H[c>>2];H[i>>2]=(H[i>>2]|(j|(g|j<<4|j>>>4|H[c+4>>2]<<28))<<3&-2004318072)&(H[h>>2]^-1);h=h+4|0;i=i+4|0;c=c+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}break Ka}while(1){Z=-1;H[i>>2]=H[i>>2]&(H[h>>2]^-1);h=h+4|0;i=i+4|0;c=c+8|0;if((A|0)>(c|0)){continue}break}break Ka}Z=H[(c<<2)+20812>>2]}if(X){break Ja}}c=b&4;q=c?fa:s;g=c?ja:ka;x=c?s:fa;T=c?ka:ja;V=ha+(N(b,A)<<2)|0;p=0;while(1){j=0;c=H[g>>2]&Z;if(c){aa=A-p|0;u=V+(p<<2)|0;i=0;e=0;while(1){n=i;i=Ma(k+160|0);o=e+4|0;w=(A|0)>(o+p|0)?o:aa;Ma:{if((w|0)<=(e|0)){h=0;break Ma}E=e<<2;z=E+u|0;v=(H[q>>2]^-1)&Z;h=0;o=e;P=15<>>1|0}m=U<<1;if(m&c){if(i&1){j=j|m;c=v&116<<(o<<2)|c}h=h+1|0;i=i>>>1|0}m=U<<2;if(m&c){if(i&1){j=j|m;c=v&232<<(o<<2)|c}h=h+1|0;i=i>>>1|0}m=U<<3;if(!(m&c)){break Na}if(i&1){j=j|m;c=v&192<<(o<<2)|c}h=h+1|0;i=i>>>1|0}l=l<<4;o=o+1|0;if((w|0)>(o|0)){continue}break}if(!(j>>>E&65535)){break Ma}while(1){Oa:{if(!(j&P)){break Oa}m=P&286331153;if(m&j){H[z>>2]=ea|(H[z>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(m<<1&j){o=(A<<2)+z|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(m<<2&j){o=z+R|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(!(m<<3&j)){break Oa}o=r+z|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}P=P<<4;z=z+4|0;e=e+1|0;if((w|0)>(e|0)){continue}break}}H[k+176>>2]=H[k+176>>2]-h;o=H[k+172>>2];i=H[k+168>>2];e=h&31;if((h&63)>>>0>=32){w=0;i=o>>>e|0}else{w=o>>>e|0;i=((1<>>e}H[k+168>>2]=i;H[k+172>>2]=w;i=1;e=4;if(!(n&1)){continue}break}H[g+4>>2]=H[g+4>>2]|(j>>>27&14|j>>>29|j>>>28)&(H[q+4>>2]^-1)}n=H[q>>2]|j;o=n>>>3&286331153;i=o>>>4|o<<4|o;if(p){c=T-4|0;H[c>>2]=H[c>>2]|(H[x-4>>2]^-1)&o<<28}H[T>>2]=H[T>>2]|i&(H[x>>2]^-1);H[T+4>>2]=H[T+4>>2]|(H[x+4>>2]^-1)&n>>>31;g=g+4|0;q=q+4|0;T=T+4|0;x=x+4|0;p=p+8|0;if((A|0)>(p|0)){continue}break}}b=b+4|0;if(($|0)>(b|0)){continue}break}}i=1;if(($|0)<=0|(A|0)<=0){break j}n=A&2147483644;o=A&3;q=ca-D>>>0>4294967292;b=0;while(1){i=ha+(N(b,A)<<2)|0;h=0;Pa:{if(!q){while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;g=H[i+4>>2];c=g&2147483647;H[i+4>>2]=(g|0)<0?0-c|0:c;g=H[i+8>>2];c=g&2147483647;H[i+8>>2]=(g|0)<0?0-c|0:c;g=H[i+12>>2];c=g&2147483647;H[i+12>>2]=(g|0)<0?0-c|0:c;i=i+16|0;h=h+4|0;if((n|0)!=(h|0)){continue}break}if(!o){break Pa}}h=0;while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;i=i+4|0;h=h+1|0;if((o|0)!=(h|0)){continue}break}}i=1;b=b+1|0;if(($|0)!=(b|0)){continue}break}break j}if(!_){break w}H[k+52>>2]=H[C+24>>2];H[k+48>>2]=P;Ba(S,1,9686,k+48|0);break v}H[k+20>>2]=i;H[k+16>>2]=P;Ba(S,1,9686,k+16|0);i=0;break j}i=0}na=k+304|0;if(i){break i}break b}H[f+108>>2]=(b<<9)+22336;c=0;b=H[f+116>>2];Qa:{Ra:{m=H[C+16>>2]-H[C+8>>2]|0;e=H[C+20>>2]-H[C+12>>2]|0;g=N(m,e);Sa:{Ta:{Ua:{if(g>>>0>K[f+132>>2]){Ca(b);b=Ia(g<<2);H[f+116>>2]=b;if(!b){break Sa}H[f+132>>2]=g;break Ua}if(!b){break Ta}}g=g<<2;if(!g){break Ta}y(b,0,g)}b=H[f+120>>2];l=m+2|0;o=e+3>>>2|0;g=N(l,o+2|0);if(g>>>0<=K[f+136>>2]){z=g<<2;break Ra}Ca(b);z=g<<2;b=Ia(z);H[f+120>>2]=b;if(b){break Ra}}b=0;break Qa}H[f+136>>2]=g;if(z){y(b,0,z)}Va:{if(!l){break Va}k=l&7;n=H[f+120>>2];b=n;q=m+1|0;Wa:{if(q>>>0>=7){g=l&-8;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!k){break Wa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((k|0)!=(c|0)){continue}break}}k=l&7;b=n+(N(l,o+1|0)<<2)|0;Xa:{if(q>>>0>=7){g=l&-8;c=0;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!k){break Xa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((k|0)!=(c|0)){continue}break}}b=e&3;if(!b){break Va}k=(b|0)==1?1224736768:(b|0)==2?1207959552:1073741824;g=l&7;b=n+(N(l,o)<<2)|0;if(q>>>0>=7){c=l&-8;z=0;while(1){H[b+28>>2]=k;H[b+24>>2]=k;H[b+20>>2]=k;H[b+16>>2]=k;H[b+12>>2]=k;H[b+8>>2]=k;H[b+4>>2]=k;H[b>>2]=k;b=b+32|0;z=z+8|0;if((c|0)!=(z|0)){continue}break}if(!g){break Va}}z=0;while(1){H[b>>2]=k;b=b+4|0;z=z+1|0;if((g|0)!=(z|0)){continue}break}}H[f+128>>2]=e;H[f+124>>2]=m;b=1}if(!b){break b}z=j+H[C+28>>2]|0;if((z|0)>=31){if(!_){break h}H[Y+16>>2]=z;Ba(S,2,8716,Y+16|0);break b}Yb(f);Xa(f,18,46);Xa(f,17,3);Xa(f,0,4);if(H[C+64>>2]){break i}c=H[C+52>>2];Ya:{if(!(c>>>0<=1&(!H[f+144>>2]|(c|0)!=1))){k=c&3;b=H[C+4>>2];g=0;Za:{if(c-1>>>0>=3){c=c&-4;while(1){q=(t<<3)+b|0;g=H[q+28>>2]+(H[q+20>>2]+(H[q+12>>2]+(H[q+4>>2]+g|0)|0)|0)|0;t=t+4|0;h=h+4|0;if((c|0)!=(h|0)){continue}break}if(!k){break Za}}while(1){g=H[((t<<3)+b|0)+4>>2]+g|0;t=t+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}ia=H[f+148>>2];c=g+2|0;if(c>>>0>K[f+152>>2]){b=Ha(ia,c);if(!b){break b}H[f+148>>2]=b;b=b+g|0;F[b|0]=0;F[b+1|0]=0;H[f+152>>2]=c;ia=H[f+148>>2];if(!H[C+52>>2]){break Ya}b=H[C+4>>2]}g=0;t=0;while(1){k=t<<3;c=k+b|0;b=H[c+4>>2];if(b){B(g+ia|0,H[c>>2],b)}b=H[C+4>>2];g=H[(k+b|0)+4>>2]+g|0;t=t+1|0;if(t>>>0>2]){continue}break}break Ya}if((c|0)!=1){break i}ia=H[H[C+4>>2]>>2]}b=H[C+60>>2];if(b){Z=H[f+116>>2];H[f+116>>2]=b}if(H[C+44>>2]){P=V&8;ca=f+28|0;ha=!(V&2);la=2;while(1){k=U+ia|0;ma=H[C>>2]+N(X,24)|0;c=H[ma>>2];ea=V&(la>>>0<2&(H[C+28>>2]-4|0)>=(z|0));_a:{if(ea){H[f+20>>2]=k;b=c+k|0;H[f+24>>2]=b;G[f+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[f+24>>2]+1|0]=255;H[f+8>>2]=0;H[f>>2]=0;H[f+16>>2]=k;break _a}H[f+20>>2]=k;b=c+k|0;H[f+24>>2]=b;G[f+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[f+24>>2]+1|0]=255;H[f+104>>2]=f+28;H[f+16>>2]=k;H[f+12>>2]=0;b=c?I[k|0]<<16:16711680;H[f>>2]=b;i=1;c=k+1|0;g=I[k+1|0];$a:{if(I[k|0]==255){if(g>>>0>=144){H[f+12>>2]=1;b=b|65280;break $a}H[f+16>>2]=c;i=0;b=b+(g<<9)|0;break $a}H[f+16>>2]=c;b=b|g<<8}H[f+8>>2]=i;H[f+4>>2]=32768;H[f>>2]=b<<7}R=H[ma>>2];ab:{if(!H[ma+8>>2]|(z|0)<=0){break ab}aa=ea|ha;ba=0;while(1){bb:{cb:{db:{eb:{switch(la-1|0){default:if(!ea){break db}b=1<>>1|b;e=H[f+124>>2];d=e<<2;b=(d+H[f+120>>2]|0)+12|0;g=H[f+116>>2];l=0;c=H[f+128>>2];if(c>>>0>=4){if(!e){break bb}o=N(e,12);n=e<<3;j=0-m|0;while(1){c=0;while(1){k=b;b=H[b>>2];fb:{if(!b){break fb}if(!(!(b&495)|b&2097168)){b=H[f>>2];i=H[f+8>>2];gb:{if(i){break gb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];hb:{if(i){i=8}else{if(b>>>0>143){break hb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break gb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;ib:{if(!(b>>>i&1)){break ib}jb:{if(i){break jb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];kb:{if(i){i=8}else{if(b>>>0>143){break kb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break jb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;q=b>>>i&1;H[g>>2]=q?j:m;i=H[f+124>>2];b=k-4|0;H[b>>2]=H[b>>2]|32;H[k+4>>2]=H[k+4>>2]|8;H[k>>2]=H[k>>2]|q<<19|16;if(P){break ib}b=k+(-2-i<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;H[b>>2]=H[b>>2]|q<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072}b=H[k>>2]|2097152;H[k>>2]=b}if(!(!(b&3960)|b&16777344)){b=H[f>>2];i=H[f+8>>2];lb:{if(i){break lb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];mb:{if(i){i=8}else{if(b>>>0>143){break mb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break lb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){nb:{if(i){break nb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];ob:{if(i){i=8}else{if(b>>>0>143){break ob}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break nb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;i=b>>>i&1;H[d+g>>2]=i?j:m;b=k-4|0;H[b>>2]=H[b>>2]|256;H[k+4>>2]=H[k+4>>2]|64;b=H[k>>2]|i<<22|128}else{b=H[k>>2]}b=b|16777216;H[k>>2]=b}if(!(!(b&31680)|b&134218752)){b=H[f>>2];i=H[f+8>>2];pb:{if(i){break pb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];qb:{if(i){i=8}else{if(b>>>0>143){break qb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break pb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){rb:{if(i){break rb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];sb:{if(i){i=8}else{if(b>>>0>143){break sb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break rb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;i=b>>>i&1;H[g+n>>2]=i?j:m;b=k-4|0;H[b>>2]=H[b>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;b=H[k>>2]|i<<25|1024}else{b=H[k>>2]}b=b|134217728;H[k>>2]=b}if(!(b&253440)|b&1073750016){break fb}b=H[f>>2];i=H[f+8>>2];tb:{if(i){break tb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];ub:{if(i){i=8}else{if(b>>>0>143){break ub}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break tb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){vb:{if(i){break vb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];wb:{if(i){i=8}else{if(b>>>0>143){break wb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break vb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;q=b>>>i&1;H[g+o>>2]=q?j:m;i=H[f+124>>2];b=k-4|0;H[b>>2]=H[b>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;H[k>>2]=H[k>>2]|q<<28|8192;b=k+(i<<2)|0;H[b+4>>2]=H[b+4>>2]|4;H[b+12>>2]=H[b+12>>2]|1;H[b+8>>2]=H[b+8>>2]|q<<18|2}H[k>>2]=H[k>>2]|1073741824}g=g+4|0;b=k+4|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}g=g+o|0;b=k+12|0;l=l+4|0;c=H[f+128>>2];if(l>>>0<(c&-4)>>>0){continue}break}}if(!e|c>>>0<=l>>>0){break cb}p=0;n=0-m|0;i=c;while(1){xb:{if((i|0)==(l|0)){i=l;break xb}d=b-4|0;j=H[b>>2];t=0;while(1){o=N(t,3);k=j>>>o|0;if(!(k&2097168|!(k&495))){c=H[f>>2];h=H[f+8>>2];yb:{if(h){break yb}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];zb:{if(i){h=8}else{if(c>>>0>143){break zb}h=7}H[f>>2]=c;H[f+16>>2]=k+1;break yb}h=8;c=255}h=h-1|0;H[f+8>>2]=h;Ab:{if(!(c>>>h&1)){break Ab}q=(N(e,t)<<2)+g|0;Bb:{if(h){break Bb}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];Cb:{if(i){h=8}else{if(c>>>0>143){break Cb}h=7}H[f>>2]=c;H[f+16>>2]=k+1;break Bb}h=8;c=255}k=h-1|0;H[f+8>>2]=k;i=c>>>k&1;H[q>>2]=i?n:m;k=H[f+124>>2];H[d>>2]=H[d>>2]|32<>2]=H[b>>2]|(i<<19|16)<>2]=H[b+4>>2]|8<>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|i<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((t|0)!=3){break Ab}c=(k<<2)+b|0;H[c+4>>2]=H[c+4>>2]|4;H[c+12>>2]=H[c+12>>2]|1;H[c+8>>2]=H[c+8>>2]|i<<18|2}j=H[b>>2]|2097152<>2]=j;c=H[f+128>>2]}i=c;t=t+1|0;if(t>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;p=p+1|0;if((e|0)!=(p|0)){continue}break};break cb;case 1:m=0;x=0;Db:{Eb:{Fb:{W=H[f+124>>2];if(!((W|0)!=64|H[f+128>>2]!=64)){b=1<>>1|b;u=0-s|0;q=f+100|0;k=f+96|0;w=f+28|0;g=H[f+120>>2]+268|0;e=H[f+8>>2];b=H[f+4>>2];d=H[f>>2];i=H[f+104>>2];c=H[f+116>>2];if(V&8){break Fb}while(1){r=0;while(1){o=c;j=g;g=H[g>>2];Gb:{Hb:{Ib:{if(!g){i=H[k>>2];g=H[i>>2];b=b-g|0;Jb:{if(d>>>16>>>0>>0){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?8:12)>>2];while(1){Kb:{if(e){break Kb}i=H[f+16>>2];b=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kb}H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break Kb}H[f+16>>2]=b;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break Jb}d=d-(g<<16)|0;if(!(b&32768)){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Lb:{if(e){break Lb}i=H[f+16>>2];g=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Lb}H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break Lb}H[f+16>>2]=g;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Jb}c=H[i+4>>2]}if(!c){i=k;break Gb}c=H[q>>2];g=H[c>>2];b=b-g|0;Mb:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[q>>2]=c;while(1){Nb:{if(e){break Nb}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nb}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Nb}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=i?h:!h;break Mb}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){Ob:{if(e){break Ob}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ob}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break Ob}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!h:h;break Mb}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;Pb:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?8:12)>>2];while(1){Qb:{if(e){break Qb}i=H[f+16>>2];b=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Qb}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Qb}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break Pb}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?12:8)>>2];while(1){Rb:{if(e){break Rb}i=H[f+16>>2];g=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Rb}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break Rb}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Pb}c=H[c+4>>2]}g=0;i=q;Sb:{Tb:{Ub:{Vb:{Wb:{switch(c|n<<1){case 0:m=j-4|0;i=H[j+4>>2]>>>17&4|H[m>>2]>>>19&1;c=w+(I[i+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;Xb:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){Yb:{if(e){break Yb}n=H[f+16>>2];b=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Yb}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Yb}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=c?h:!h;break Xb}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){Zb:{if(e){break Zb}n=H[f+16>>2];g=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Zb}H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Zb}H[f+16>>2]=g;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break Xb}n=H[n+4>>2]}g=I[i+24640|0];H[o>>2]=(n|0)==(g|0)?s:u;H[m>>2]=H[m>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=j-268|0;H[c>>2]=H[c>>2]|131072;c=j-260|0;H[c>>2]=H[c>>2]|32768;c=j-264|0;i=c;v=H[c>>2];c=g^n;H[i>>2]=v|c<<31|65536;i=c<<19;t=H[f+108>>2];c=w+(I[t+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;_b:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){$b:{if(e){break $b}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break $b}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break $b}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break _b}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){ac:{if(e){break ac}n=H[f+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ac}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break ac}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break _b}c=H[n+4>>2]}g=i|16;if(!c){break Vb}break;case 1:break Wb;case 2:break Ub;case 3:break Sb;default:break Hb}}m=j-4|0;n=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;bc:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){cc:{if(e){break cc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break cc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break cc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break bc}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){dc:{if(e){break dc}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break dc}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break dc}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break bc}i=H[l+4>>2]}c=I[n+24640|0];H[o+256>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];g=(c^i)<<22|g|128}i=w+(I[(g>>>6&495)+t|0]<<2)|0;n=H[i>>2];c=H[n>>2];b=b-c|0;ec:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[n+(i?8:12)>>2];while(1){fc:{if(e){break fc}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break fc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break fc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?h:!h;break ec}d=d-(c<<16)|0;if(!(b&32768)){h=H[n+4>>2];c=b>>>0>>0;H[i>>2]=H[n+(c?12:8)>>2];while(1){gc:{if(e){break gc}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break gc}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break gc}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break ec}c=H[n+4>>2]}if(!c){break Tb}}m=j-4|0;n=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;hc:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){ic:{if(e){break ic}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ic}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ic}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break hc}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){jc:{if(e){break jc}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jc}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break jc}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break hc}i=H[l+4>>2]}c=I[n+24640|0];H[o+512>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^i)<<25|g|1024;t=H[f+108>>2]}i=w+(I[(g>>>9&495)+t|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;kc:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){lc:{if(e){break lc}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break lc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break lc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break kc}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){mc:{if(e){break mc}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mc}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break mc}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break kc}c=H[m+4>>2]}if(!c){break Hb}}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0;break Ib}nc:{if(g&2097168){break nc}i=w+(I[H[f+108>>2]+(g&495)|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;oc:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){pc:{if(e){break pc}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break pc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break pc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break oc}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){qc:{if(e){break qc}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break qc}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break qc}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break oc}c=H[m+4>>2]}if(!c){break nc}l=j-4|0;h=H[j+4>>2]>>>17&4|(H[l>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;rc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){sc:{if(e){break sc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break sc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break sc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=n?m:!m;break rc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){tc:{if(e){break tc}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break tc}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break tc}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!m:m;break rc}m=H[p+4>>2]}n=I[h+24640|0];H[o>>2]=(m|0)==(n|0)?s:u;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=j-268|0;H[c>>2]=H[c>>2]|131072;c=j-260|0;H[c>>2]=H[c>>2]|32768;c=j-264|0;v=c;M=H[c>>2];c=m^n;H[v>>2]=M|c<<31|65536;g=c<<19|g|16}uc:{if(g&16777344){break uc}h=g>>>3|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;vc:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){wc:{if(e){break wc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break wc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break wc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break vc}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){xc:{if(e){break xc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break xc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break xc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break vc}c=H[l+4>>2]}if(!c){break uc}l=j-4|0;h=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;yc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){zc:{if(e){break zc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break zc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break zc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break yc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Ac:{if(e){break Ac}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ac}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Ac}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break yc}n=H[p+4>>2]}c=I[h+24640|0];H[o+256>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;g=(c^n)<<22|g|128}Bc:{if(g&134218752){break Bc}h=g>>>6|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Cc:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Dc:{if(e){break Dc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Dc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Dc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Cc}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Ec:{if(e){break Ec}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ec}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Ec}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Cc}c=H[l+4>>2]}if(!c){break Bc}l=j-4|0;h=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Fc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){Gc:{if(e){break Gc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Gc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Gc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Fc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Hc:{if(e){break Hc}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Hc}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Hc}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Fc}n=H[p+4>>2]}c=I[h+24640|0];H[o+512>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break Hb}h=g>>>9|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Ic:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Jc:{if(e){break Jc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Jc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Jc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ic}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Kc:{if(e){break Kc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Kc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ic}c=H[l+4>>2]}if(!c){break Hb}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0}Lc:{if(d>>>16>>>0>>0){h=H[t+4>>2];n=b>>>0>>0;H[i>>2]=H[(n?8:12)+t>>2];while(1){Mc:{if(e){break Mc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Mc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Mc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?h:!h;break Lc}d=d-(c<<16)|0;if(!(b&32768)){h=H[t+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+t>>2];while(1){Nc:{if(e){break Nc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Nc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break Lc}n=H[t+4>>2]}c=I[p+24640|0];H[o+768>>2]=(n|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;H[j+260>>2]=H[j+260>>2]|4;H[j+268>>2]=H[j+268>>2]|1;c=c^n;H[j+264>>2]=H[j+264>>2]|c<<18|2;g=c<<28|g|8192}H[j>>2]=g&-1226833921}g=j+4|0;c=o+4|0;r=r+1|0;if((r|0)!=64){continue}break}g=j+12|0;c=o+772|0;n=x>>>0<60;x=x+4|0;if(n){continue}break}break Eb}b=1<>>1|b;k=H[f+120>>2];c=(k+(W<<2)|0)+12|0;g=H[f+128>>2];e=H[f+8>>2];b=H[f+4>>2];d=H[f>>2];i=H[f+104>>2];o=H[f+116>>2];if(V&8){Oc:{if(g>>>0<4){break Oc}if(W){n=f+100|0;q=f+96|0;r=N(W,12);u=W<<3;v=0-M|0;D=f+28|0;while(1){w=0;while(1){j=c;c=H[c>>2];Pc:{Qc:{Rc:{if(c){Sc:{if(c&2097168){break Sc}i=D+(I[H[f+108>>2]+(c&495)|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;Tc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break Tc}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){Uc:{if(e){break Uc}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Uc}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Uc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Tc}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){Vc:{if(e){break Vc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Vc}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Vc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Sc}p=j-4|0;h=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;Wc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break Wc}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){Xc:{if(e){break Xc}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break Xc}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break Xc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break Wc}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){Yc:{if(e){break Yc}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break Yc}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break Yc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[o>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=(g^k)<<19|c|16}Zc:{if(c&16777344){break Zc}h=c>>>3|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;_c:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break _c}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){$c:{if(e){break $c}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break $c}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break $c}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break _c}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){ad:{if(e){break ad}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break ad}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break ad}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Zc}p=j-4|0;h=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=(W<<2)+o|0;bd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break bd}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){cd:{if(e){break cd}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break cd}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break cd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break bd}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){dd:{if(e){break dd}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break dd}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break dd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(g^k)<<22|c|128}ed:{if(c&134218752){break ed}h=c>>>6|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;fd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break fd}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){gd:{if(e){break gd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break gd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break gd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break fd}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){hd:{if(e){break hd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break hd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break hd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ed}p=j-4|0;h=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=o+u|0;id:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break id}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){jd:{if(e){break jd}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break jd}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break jd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break id}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){kd:{if(e){break kd}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break kd}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break kd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024}if(c&1073750016){break Qc}h=c>>>9|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;ld:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break ld}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){md:{if(e){break md}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break md}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break md}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ld}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){nd:{if(e){break nd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break nd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break nd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Qc}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|h&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0;break Rc}k=H[q>>2];c=H[k>>2];b=b-c|0;od:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break od}i=H[k+4>>2];c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){pd:{if(e){break pd}k=H[f+16>>2];g=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=g;e=8;d=(h<<8)+d|0;break pd}if(h>>>0<=143){H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break pd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break od}i=H[k+4>>2];g=b>>>0>>0;H[q>>2]=H[k+(g?8:12)>>2];while(1){qd:{if(e){break qd}k=H[f+16>>2];b=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=b;e=8;d=(h<<8)+d|0;break qd}if(h>>>0<=143){H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break qd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=q;break Pc}g=H[n>>2];c=H[g>>2];b=b-c|0;rd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[g+4>>2];if(b&32768){break rd}h=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){sd:{if(e){break sd}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break sd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break sd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!h:h;break rd}h=H[g+4>>2];k=b>>>0>>0;g=H[(k?8:12)+g>>2];H[n>>2]=g;while(1){td:{if(e){break td}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break td}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break td}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?h:!h}c=H[g>>2];b=b-c|0;ud:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break ud}h=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){vd:{if(e){break vd}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break vd}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break vd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break ud}h=H[g+4>>2];i=g;g=b>>>0>>0;H[n>>2]=H[i+(g?8:12)>>2];while(1){wd:{if(e){break wd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break wd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break wd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?h:!h}g=i;c=0;i=n;xd:{yd:{zd:{Ad:{Bd:{switch(g|k<<1){case 0:l=j-4|0;k=H[j+4>>2]>>>17&4|H[l>>2]>>>19&1;g=D+(I[k+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Cd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Cd}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Dd:{if(e){break Dd}i=H[f+16>>2];g=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(p<<8)+d|0;break Dd}if(p>>>0<=143){H[f+16>>2]=g;d=(p<<9)+d|0;e=7;break Dd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Cd}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Ed:{if(e){break Ed}i=H[f+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ed}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ed}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=I[k+24640|0];H[o>>2]=(g|0)==(c|0)?M:v;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;k=(c^g)<<19;t=H[f+108>>2];g=D+(I[t+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Fd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Fd}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Gd:{if(e){break Gd}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Gd}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Gd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Fd}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Hd:{if(e){break Hd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Hd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Hd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=k|16;if(!g){break Ad}break;case 1:break Bd;case 2:break zd;case 3:break xd;default:break Qc}}l=j-4|0;i=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=(W<<2)+o|0;Id:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Id}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Jd:{if(e){break Jd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Jd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Jd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Id}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Kd:{if(e){break Kd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Kd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Kd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];c=(g^k)<<22|c|128}k=D+(I[(c>>>6&495)+t|0]<<2)|0;i=H[k>>2];g=H[i>>2];b=b-g|0;Ld:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[i+4>>2];if(b&32768){break Ld}h=H[i+4>>2];g=b>>>0>>0;H[k>>2]=H[i+(g?12:8)>>2];while(1){Md:{if(e){break Md}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Md}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Md}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Ld}h=H[i+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[i+(k?8:12)>>2];while(1){Nd:{if(e){break Nd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Nd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Nd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}if(!s){break yd}}l=j-4|0;i=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=o+u|0;Od:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Od}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Pd:{if(e){break Pd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Pd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Pd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Od}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Qd:{if(e){break Qd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Qd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Qd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024;t=H[f+108>>2]}i=D+(I[(c>>>9&495)+t|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;Rd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break Rd}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){Sd:{if(e){break Sd}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Sd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Sd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Rd}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){Td:{if(e){break Td}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Td}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Td}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Qc}}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0}s=o+r|0;Ud:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[t+4>>2];if(b&32768){break Ud}h=H[t+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+t>>2];while(1){Vd:{if(e){break Vd}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Vd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Vd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Ud}h=H[t+4>>2];k=b>>>0>>0;H[i>>2]=H[(k?8:12)+t>>2];while(1){Wd:{if(e){break Wd}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Wd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Wd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}g=I[T+24640|0];H[s>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;h=j+(H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|4;H[h+12>>2]=H[h+12>>2]|1;g=g^k;H[h+8>>2]=H[h+8>>2]|g<<18|2;c=g<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;w=w+1|0;if((W|0)!=(w|0)){continue}break}c=j+12|0;o=o+r|0;x=x+4|0;g=H[f+128>>2];if(x>>>0<(g&-4)>>>0){continue}break}break Oc}x=g&-4;c=(k+(x<<1)|0)+12|0}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i;if(!W|g>>>0<=x>>>0){break Db}while(1){e=0;if(H[f+128>>2]!=(x|0)){while(1){Wb(f,c,(N(e,W)<<2)+o|0,M,e,1);e=e+1|0;if(e>>>0>2]-x>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;m=m+1|0;if((W|0)!=(m|0)){continue}break}break Db}Xd:{if(g>>>0<4){break Xd}if(W){n=f+100|0;q=f+96|0;r=N(W,12);u=W<<3;v=0-M|0;D=f+28|0;while(1){w=0;while(1){j=c;c=H[c>>2];Yd:{Zd:{_d:{if(c){$d:{if(c&2097168){break $d}i=D+(I[H[f+108>>2]+(c&495)|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;ae:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break ae}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){be:{if(e){break be}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break be}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break be}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break ae}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){ce:{if(e){break ce}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break ce}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ce}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break $d}p=j-4|0;h=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;de:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break de}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){ee:{if(e){break ee}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break ee}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break ee}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break de}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){fe:{if(e){break fe}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break fe}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break fe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[o>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;h=j+(-2-H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|32768;k=g^k;H[h>>2]=H[h>>2]|k<<31|65536;g=h-4|0;H[g>>2]=H[g>>2]|131072;c=k<<19|c|16}ge:{if(c&16777344){break ge}h=c>>>3|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;he:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break he}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){ie:{if(e){break ie}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break ie}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break ie}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break he}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){je:{if(e){break je}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break je}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break je}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ge}p=j-4|0;h=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=(W<<2)+o|0;ke:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break ke}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){le:{if(e){break le}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break le}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break le}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ke}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){me:{if(e){break me}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break me}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break me}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(g^k)<<22|c|128}ne:{if(c&134218752){break ne}h=c>>>6|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;oe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break oe}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){pe:{if(e){break pe}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break pe}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break pe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break oe}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){qe:{if(e){break qe}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break qe}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break qe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ne}p=j-4|0;h=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=o+u|0;re:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break re}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){se:{if(e){break se}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break se}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break se}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break re}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){te:{if(e){break te}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break te}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break te}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024}if(c&1073750016){break Zd}h=c>>>9|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;ue:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break ue}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){ve:{if(e){break ve}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break ve}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break ve}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ue}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){we:{if(e){break we}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break we}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break we}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Zd}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|h&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0;break _d}k=H[q>>2];c=H[k>>2];b=b-c|0;xe:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break xe}i=H[k+4>>2];c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){ye:{if(e){break ye}k=H[f+16>>2];g=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=g;e=8;d=(h<<8)+d|0;break ye}if(h>>>0<=143){H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break ye}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break xe}i=H[k+4>>2];g=b>>>0>>0;H[q>>2]=H[k+(g?8:12)>>2];while(1){ze:{if(e){break ze}k=H[f+16>>2];b=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=b;e=8;d=(h<<8)+d|0;break ze}if(h>>>0<=143){H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break ze}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=q;break Yd}g=H[n>>2];c=H[g>>2];b=b-c|0;Ae:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[g+4>>2];if(b&32768){break Ae}h=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){Be:{if(e){break Be}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Be}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Be}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!h:h;break Ae}h=H[g+4>>2];k=b>>>0>>0;g=H[(k?8:12)+g>>2];H[n>>2]=g;while(1){Ce:{if(e){break Ce}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Ce}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Ce}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?h:!h}c=H[g>>2];b=b-c|0;De:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break De}h=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){Ee:{if(e){break Ee}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Ee}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Ee}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break De}h=H[g+4>>2];i=g;g=b>>>0>>0;H[n>>2]=H[i+(g?8:12)>>2];while(1){Fe:{if(e){break Fe}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Fe}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Fe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?h:!h}g=i;c=0;i=n;Ge:{He:{Ie:{Je:{Ke:{switch(g|k<<1){case 0:l=j-4|0;k=H[j+4>>2]>>>17&4|H[l>>2]>>>19&1;g=D+(I[k+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Le:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Le}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Me:{if(e){break Me}i=H[f+16>>2];g=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(p<<8)+d|0;break Me}if(p>>>0<=143){H[f+16>>2]=g;d=(p<<9)+d|0;e=7;break Me}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Le}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Ne:{if(e){break Ne}i=H[f+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ne}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ne}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=I[k+24640|0];H[o>>2]=(g|0)==(c|0)?M:v;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;k=j+(-2-H[f+124>>2]<<2)|0;H[k+4>>2]=H[k+4>>2]|32768;g=c^g;H[k>>2]=H[k>>2]|g<<31|65536;c=k-4|0;H[c>>2]=H[c>>2]|131072;k=g<<19;t=H[f+108>>2];g=D+(I[t+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Oe:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Oe}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Pe:{if(e){break Pe}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Pe}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Pe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Oe}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Qe:{if(e){break Qe}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Qe}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Qe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=k|16;if(!g){break Je}break;case 1:break Ke;case 2:break Ie;case 3:break Ge;default:break Zd}}l=j-4|0;i=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=(W<<2)+o|0;Re:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Re}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Se:{if(e){break Se}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Se}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Se}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Re}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Te:{if(e){break Te}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Te}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Te}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];c=(g^k)<<22|c|128}k=D+(I[(c>>>6&495)+t|0]<<2)|0;i=H[k>>2];g=H[i>>2];b=b-g|0;Ue:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[i+4>>2];if(b&32768){break Ue}h=H[i+4>>2];g=b>>>0>>0;H[k>>2]=H[i+(g?12:8)>>2];while(1){Ve:{if(e){break Ve}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Ve}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Ve}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Ue}h=H[i+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[i+(k?8:12)>>2];while(1){We:{if(e){break We}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break We}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break We}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}if(!s){break He}}l=j-4|0;i=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=o+u|0;Xe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Xe}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Ye:{if(e){break Ye}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Ye}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Ye}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Xe}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Ze:{if(e){break Ze}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ze}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ze}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024;t=H[f+108>>2]}i=D+(I[(c>>>9&495)+t|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;_e:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break _e}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){$e:{if(e){break $e}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break $e}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break $e}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break _e}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){af:{if(e){break af}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break af}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break af}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Zd}}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0}s=o+r|0;bf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[t+4>>2];if(b&32768){break bf}h=H[t+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+t>>2];while(1){cf:{if(e){break cf}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break cf}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break cf}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break bf}h=H[t+4>>2];k=b>>>0>>0;H[i>>2]=H[(k?8:12)+t>>2];while(1){df:{if(e){break df}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break df}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break df}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}g=I[T+24640|0];H[s>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;h=j+(H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|4;H[h+12>>2]=H[h+12>>2]|1;g=g^k;H[h+8>>2]=H[h+8>>2]|g<<18|2;c=g<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;w=w+1|0;if((W|0)!=(w|0)){continue}break}c=j+12|0;o=o+r|0;x=x+4|0;g=H[f+128>>2];if(x>>>0<(g&-4)>>>0){continue}break}break Xd}x=g&-4;c=(k+(x<<1)|0)+12|0}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i;if(!W|g>>>0<=x>>>0){break Db}while(1){e=0;if(H[f+128>>2]!=(x|0)){while(1){Wb(f,c,(N(e,W)<<2)+o|0,M,e,0);e=e+1|0;if(e>>>0>2]-x>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;m=m+1|0;if((W|0)!=(m|0)){continue}break}break Db}while(1){r=0;while(1){o=c;j=g;g=H[g>>2];ef:{ff:{gf:{if(!g){i=H[k>>2];g=H[i>>2];b=b-g|0;hf:{if(d>>>16>>>0>>0){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?8:12)>>2];while(1){jf:{if(e){break jf}i=H[f+16>>2];b=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jf}H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break jf}H[f+16>>2]=b;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break hf}d=d-(g<<16)|0;if(!(b&32768)){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){kf:{if(e){break kf}i=H[f+16>>2];g=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break kf}H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break kf}H[f+16>>2]=g;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break hf}c=H[i+4>>2]}if(!c){i=k;break ef}c=H[q>>2];g=H[c>>2];b=b-g|0;lf:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[q>>2]=c;while(1){mf:{if(e){break mf}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break mf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=i?h:!h;break lf}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){nf:{if(e){break nf}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break nf}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break nf}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!h:h;break lf}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;of:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?8:12)>>2];while(1){pf:{if(e){break pf}i=H[f+16>>2];b=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break pf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break pf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break of}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?12:8)>>2];while(1){qf:{if(e){break qf}i=H[f+16>>2];g=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break qf}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break qf}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break of}c=H[c+4>>2]}g=0;i=q;rf:{sf:{tf:{uf:{vf:{switch(c|n<<1){case 0:m=j-4|0;i=H[j+4>>2]>>>17&4|H[m>>2]>>>19&1;c=w+(I[i+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;wf:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){xf:{if(e){break xf}n=H[f+16>>2];b=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break xf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break xf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;g=c?h:!h;break wf}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){yf:{if(e){break yf}n=H[f+16>>2];g=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break yf}H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break yf}H[f+16>>2]=g;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!h:h;break wf}g=H[n+4>>2]}c=I[i+24640|0];H[o>>2]=(g|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|32;H[j+4>>2]=H[j+4>>2]|8;i=(c^g)<<19;t=H[f+108>>2];c=w+(I[t+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;zf:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){Af:{if(e){break Af}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Af}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Af}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break zf}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){Bf:{if(e){break Bf}n=H[f+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Bf}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break Bf}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break zf}c=H[n+4>>2]}g=i|16;if(!c){break uf}break;case 1:break vf;case 2:break tf;case 3:break rf;default:break ff}}m=j-4|0;n=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Cf:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){Df:{if(e){break Df}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Df}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Df}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break Cf}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Ef:{if(e){break Ef}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ef}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break Ef}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break Cf}i=H[l+4>>2]}c=I[n+24640|0];H[o+256>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];g=(c^i)<<22|g|128}i=w+(I[(g>>>6&495)+t|0]<<2)|0;n=H[i>>2];c=H[n>>2];b=b-c|0;Ff:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[n+(i?8:12)>>2];while(1){Gf:{if(e){break Gf}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Gf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Gf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?h:!h;break Ff}d=d-(c<<16)|0;if(!(b&32768)){h=H[n+4>>2];c=b>>>0>>0;H[i>>2]=H[n+(c?12:8)>>2];while(1){Hf:{if(e){break Hf}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Hf}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break Hf}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Ff}c=H[n+4>>2]}if(!c){break sf}}m=j-4|0;n=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;If:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){Jf:{if(e){break Jf}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Jf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Jf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break If}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Kf:{if(e){break Kf}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kf}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break Kf}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break If}i=H[l+4>>2]}c=I[n+24640|0];H[o+512>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^i)<<25|g|1024;t=H[f+108>>2]}i=w+(I[(g>>>9&495)+t|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Lf:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){Mf:{if(e){break Mf}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Mf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Mf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break Lf}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Nf:{if(e){break Nf}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nf}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break Nf}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Lf}c=H[m+4>>2]}if(!c){break ff}}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0;break gf}Of:{if(g&2097168){break Of}i=w+(I[H[f+108>>2]+(g&495)|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Pf:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){Qf:{if(e){break Qf}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Qf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Qf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break Pf}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Rf:{if(e){break Rf}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Rf}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break Rf}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Pf}c=H[m+4>>2]}if(!c){break Of}l=j-4|0;h=H[j+4>>2]>>>17&4|(H[l>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Sf:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){Tf:{if(e){break Tf}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Tf}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Tf}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Sf}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Uf:{if(e){break Uf}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Uf}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Uf}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Sf}n=H[p+4>>2]}c=I[h+24640|0];H[o>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;g=(c^n)<<19|g|16}Vf:{if(g&16777344){break Vf}h=g>>>3|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Wf:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Xf:{if(e){break Xf}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Xf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Xf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Wf}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Yf:{if(e){break Yf}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Yf}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Yf}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Wf}c=H[l+4>>2]}if(!c){break Vf}l=j-4|0;h=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Zf:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){_f:{if(e){break _f}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break _f}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break _f}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Zf}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){$f:{if(e){break $f}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break $f}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break $f}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Zf}n=H[p+4>>2]}c=I[h+24640|0];H[o+256>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;g=(c^n)<<22|g|128}ag:{if(g&134218752){break ag}h=g>>>6|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;bg:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){cg:{if(e){break cg}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break cg}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break cg}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break bg}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){dg:{if(e){break dg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break dg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break dg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break bg}c=H[l+4>>2]}if(!c){break ag}l=j-4|0;h=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;eg:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){fg:{if(e){break fg}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break fg}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break fg}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break eg}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){gg:{if(e){break gg}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break gg}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break gg}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break eg}n=H[p+4>>2]}c=I[h+24640|0];H[o+512>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break ff}h=g>>>9|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;hg:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){ig:{if(e){break ig}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ig}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ig}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break hg}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){jg:{if(e){break jg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break jg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break hg}c=H[l+4>>2]}if(!c){break ff}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0}kg:{if(d>>>16>>>0>>0){h=H[t+4>>2];n=b>>>0>>0;H[i>>2]=H[(n?8:12)+t>>2];while(1){lg:{if(e){break lg}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break lg}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break lg}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?h:!h;break kg}d=d-(c<<16)|0;if(!(b&32768)){h=H[t+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+t>>2];while(1){mg:{if(e){break mg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break mg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break kg}n=H[t+4>>2]}c=I[p+24640|0];H[o+768>>2]=(n|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;H[j+260>>2]=H[j+260>>2]|4;H[j+268>>2]=H[j+268>>2]|1;c=c^n;H[j+264>>2]=H[j+264>>2]|c<<18|2;g=c<<28|g|8192}H[j>>2]=g&-1226833921}g=j+4|0;c=o+4|0;r=r+1|0;if((r|0)!=64){continue}break}g=j+12|0;c=o+772|0;n=x>>>0<60;x=x+4|0;if(n){continue}break}}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i}ng:{if(!(V&32)){break ng}H[f+104>>2]=f+100;g=H[f+100>>2];b=H[g>>2];d=H[f+4>>2]-b|0;H[f+4>>2]=d;e=H[f>>2];og:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){pg:{if(d){break pg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break pg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break pg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break og}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break og}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){qg:{if(b){break qg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break qg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break qg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;rg:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){sg:{if(d){break sg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break sg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break sg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break rg}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break rg}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){tg:{if(b){break tg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break tg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break tg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;ug:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){vg:{if(d){break vg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break vg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break vg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break ug}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break ug}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){wg:{if(b){break wg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break wg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break wg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;if(e>>>16>>>0>>0){H[f+4>>2]=b;H[f+100>>2]=H[(b>>>0>d>>>0?8:12)+g>>2];d=H[f+8>>2];while(1){xg:{if(d){break xg}g=H[f+16>>2];c=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break xg}H[f+16>>2]=c;e=(k<<9)+e|0;d=7;break xg}H[f+16>>2]=c;d=8;e=(k<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}break ng}c=e-(b<<16)|0;H[f>>2]=c;if(d&32768){break ng}H[f+100>>2]=H[(b>>>0>d>>>0?12:8)+g>>2];e=H[f+8>>2];while(1){yg:{if(e){break yg}g=H[f+16>>2];b=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;c=c+65280|0;e=8;break yg}H[f+16>>2]=b;c=(k<<9)+c|0;e=7;break yg}H[f+16>>2]=b;e=8;c=(k<<8)+c|0}e=e-1|0;H[f+8>>2]=e;c=c<<1;H[f>>2]=c;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}break cb;case 0:break eb}}if(ea){r=1<>>1|0;u=H[f+124>>2];d=u<<2;b=(d+H[f+120>>2]|0)+12|0;g=H[f+116>>2];j=0;c=H[f+128>>2];if(c>>>0>=4){if(!u){break bb}h=N(u,12);n=u<<3;m=0-r|0;while(1){c=0;while(1){k=b;b=H[b>>2];zg:{if(!b){break zg}if((b&2097168)==16){b=H[f>>2];e=H[f+8>>2];Ag:{if(e){break Ag}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Bg:{if(q){e=8}else{if(b>>>0>143){break Bg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Ag}e=8;b=255}i=e-1|0;H[f+8>>2]=i;i=b>>>i&1;b=H[g>>2];H[g>>2]=((i|0)==(b>>>31|0)?m:r)+b;b=H[k>>2]|1048576;H[k>>2]=b}if((b&16777344)==128){b=H[f>>2];e=H[f+8>>2];Cg:{if(e){break Cg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Dg:{if(q){e=8}else{if(b>>>0>143){break Dg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Cg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=d+g|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);b=H[k>>2]|8388608;H[k>>2]=b}if((b&134218752)==1024){b=H[f>>2];e=H[f+8>>2];Eg:{if(e){break Eg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Fg:{if(q){e=8}else{if(b>>>0>143){break Fg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Eg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=g+n|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);b=H[k>>2]|67108864;H[k>>2]=b}if((b&1073750016)!=8192){break zg}b=H[f>>2];e=H[f+8>>2];Gg:{if(e){break Gg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Hg:{if(q){e=8}else{if(b>>>0>143){break Hg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Gg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=h+g|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);H[k>>2]=H[k>>2]|536870912}g=g+4|0;b=k+4|0;c=c+1|0;if((u|0)!=(c|0)){continue}break}g=h+g|0;b=k+12|0;j=j+4|0;c=H[f+128>>2];if(j>>>0<(c&-4)>>>0){continue}break}}if(!u|c>>>0<=j>>>0){break cb}p=0;q=0-r|0;d=c;while(1){Ig:{if((d|0)==(j|0)){d=j;break Ig}e=H[b>>2];t=0;while(1){d=N(t,3);if((2097168<>2];l=H[f+8>>2];Jg:{if(l){break Jg}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];Kg:{if(i){l=8}else{if(c>>>0>143){break Kg}l=7}H[f>>2]=c;H[f+16>>2]=k+1;break Jg}l=8;c=255}k=l-1|0;H[f+8>>2]=k;k=c>>>k&1;c=H[n>>2];H[n>>2]=((k|0)==(c>>>31|0)?q:r)+c;e=H[b>>2]|1048576<>2]=e;c=H[f+128>>2]}t=t+1|0;d=c;if(t>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;p=p+1|0;if((u|0)!=(p|0)){continue}break}break cb}k=H[f+120>>2];d=H[f+116>>2];w=H[f+124>>2];c=H[f+128>>2];if(!((w|0)!=64|(c|0)!=64)){c=k+268|0;x=0;p=1<>>1|0;m=0-p|0;t=H[f+8>>2];g=H[f+4>>2];b=H[f>>2];j=H[f+104>>2];while(1){l=0;while(1){q=d;i=c;d=H[c>>2];if(d){k=c;if((d&2097168)==16){j=ca+((d&1048576?16:d&495?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Lg:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Mg:{if(t){break Mg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Mg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Mg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Lg}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Ng:{if(t){break Ng}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Ng}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Ng}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Lg}n=H[o+4>>2]}c=H[q>>2];H[q>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|1048576}if((d&16777344)==128){j=ca+((d&8388608?16:d&3960?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Og:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Pg:{if(t){break Pg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Pg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Pg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Og}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Qg:{if(t){break Qg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Qg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Qg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Og}n=H[o+4>>2]}c=H[q+256>>2];H[q+256>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|8388608}if((d&134218752)==1024){j=ca+((d&67108864?16:d&31680?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Rg:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Sg:{if(t){break Sg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Sg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Sg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Rg}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Tg:{if(t){break Tg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Tg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Tg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Rg}n=H[o+4>>2]}c=H[q+512>>2];H[q+512>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|67108864}if((d&1073750016)==8192){j=ca+((d&536870912?16:d&253440?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Ug:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Vg:{if(t){break Vg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Vg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Vg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Ug}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Wg:{if(t){break Wg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Wg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Wg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Ug}n=H[o+4>>2]}c=H[q+768>>2];H[q+768>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|536870912}H[k>>2]=d}c=i+4|0;d=q+4|0;l=l+1|0;if((l|0)!=64){continue}break}c=i+12|0;d=q+772|0;k=x>>>0<60;x=x+4|0;if(k){continue}break}H[f+8>>2]=t;H[f+4>>2]=g;H[f>>2]=b;H[f+104>>2]=j;break cb}s=1<>>1|0;e=w<<2;h=(e+k|0)+12|0;t=H[f+8>>2];g=H[f+4>>2];b=H[f>>2];j=H[f+104>>2];o=0;Xg:{if(c>>>0<4){break Xg}if(w){p=N(w,12);n=w<<3;r=0-s|0;while(1){l=0;while(1){k=h;i=H[h>>2];if(i){if((i&2097168)==16){j=ca+((i&1048576?16:i&495?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;Yg:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break Yg}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){Zg:{if(t){break Zg}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break Zg}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break Zg}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break Yg}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){_g:{if(t){break _g}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break _g}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break _g}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}c=H[d>>2];H[d>>2]=((q|0)==(c>>>31|0)?r:s)+c;i=i|1048576}if((i&16777344)==128){j=ca+((i&8388608?16:i&3960?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;$g:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break $g}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){ah:{if(t){break ah}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break ah}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break ah}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break $g}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){bh:{if(t){break bh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break bh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break bh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+e|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|8388608}if((i&134218752)==1024){j=ca+((i&67108864?16:i&31680?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;ch:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break ch}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){dh:{if(t){break dh}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break dh}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break dh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break ch}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){eh:{if(t){break eh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break eh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break eh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+n|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|67108864}if((i&1073750016)==8192){j=ca+((i&536870912?16:i&253440?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;fh:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break fh}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){gh:{if(t){break gh}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break gh}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break gh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break fh}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){hh:{if(t){break hh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break hh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break hh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+p|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|536870912}H[k>>2]=i}h=k+4|0;d=d+4|0;l=l+1|0;if((w|0)!=(l|0)){continue}break}h=k+12|0;d=d+p|0;o=o+4|0;c=H[f+128>>2];if(o>>>0<(c&-4)>>>0){continue}break}break Xg}o=c&-4;h=(k+(o<<1)|0)+12|0}H[f+8>>2]=t;H[f+4>>2]=g;H[f>>2]=b;H[f+104>>2]=j;if(!w|c>>>0<=o>>>0){break cb}x=0;k=0-s|0;b=c;while(1){ih:{if((b|0)==(o|0)){b=o;break ih}t=H[h>>2];e=0;while(1){l=N(e,3);if((2097168<>>l|0;i=ca+((b&1048576?16:b&495?15:14)<<2)|0;H[f+104>>2]=i;q=H[i>>2];b=H[q>>2];c=H[f+4>>2]-b|0;H[f+4>>2]=c;g=H[f>>2];jh:{if(g>>>16>>>0>>0){n=H[q+4>>2];H[f+4>>2]=b;c=b>>>0>c>>>0;H[i>>2]=H[q+(c?8:12)>>2];t=H[f+8>>2];while(1){kh:{if(t){break kh}q=H[f+16>>2];i=q+1|0;m=I[q+1|0];if(I[q|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;g=g+65280|0;t=8;break kh}H[f+16>>2]=i;g=(m<<9)+g|0;t=7;break kh}H[f+16>>2]=i;t=8;g=(m<<8)+g|0}t=t-1|0;H[f+8>>2]=t;g=g<<1;H[f>>2]=g;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}c=c?n:!n;break jh}g=g-(b<<16)|0;H[f>>2]=g;if(!(c&32768)){n=H[q+4>>2];b=b>>>0>c>>>0;H[i>>2]=H[q+(b?12:8)>>2];t=H[f+8>>2];while(1){lh:{if(t){break lh}q=H[f+16>>2];i=q+1|0;m=I[q+1|0];if(I[q|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;g=g+65280|0;t=8;break lh}H[f+16>>2]=i;g=(m<<9)+g|0;t=7;break lh}H[f+16>>2]=i;t=8;g=(m<<8)+g|0}t=t-1|0;H[f+8>>2]=t;g=g<<1;H[f>>2]=g;c=c<<1;H[f+4>>2]=c;if(c>>>0<32768){continue}break}c=b?!n:n;break jh}c=H[q+4>>2]}b=H[j>>2];H[j>>2]=((c|0)==(b>>>31|0)?k:s)+b;t=H[h>>2]|1048576<>2]=t;c=H[f+128>>2]}e=e+1|0;b=c;if(e>>>0>>0){continue}break}}h=h+4|0;d=d+4|0;x=x+1|0;if((w|0)!=(x|0)){continue}break}break cb}i=0;x=0;p=0;mh:{nh:{oh:{M=H[f+124>>2];if(!((M|0)!=64|H[f+128>>2]!=64)){b=1<>>1|b;k=0-i|0;s=f+28|0;g=H[f+120>>2]+268|0;h=H[f+8>>2];c=H[f+4>>2];j=H[f>>2];l=H[f+104>>2];b=H[f+116>>2];if(V&8){break oh}while(1){p=0;while(1){q=b;n=g;g=H[g>>2];if(g){ph:{if(g&2097168){break ph}b=g&495;if(!b){break ph}l=s+(I[b+H[f+108>>2]|0]<<2)|0;o=H[l>>2];b=H[o>>2];c=c-b|0;qh:{if(j>>>16>>>0>>0){e=H[o+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[o+(d?8:12)>>2];while(1){rh:{if(h){break rh}o=H[f+16>>2];c=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break rh}H[f+16>>2]=c;j=(m<<9)+j|0;h=7;break rh}H[f+16>>2]=c;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?e:!e;break qh}j=j-(b<<16)|0;if(!(c&32768)){e=H[o+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[o+(b?12:8)>>2];while(1){sh:{if(h){break sh}o=H[f+16>>2];d=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break sh}H[f+16>>2]=d;j=(m<<9)+j|0;h=7;break sh}H[f+16>>2]=d;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!e:e;break qh}b=H[o+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>17&4|(H[u>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];th:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){uh:{if(h){break uh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break uh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break uh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?m:!m;break th}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){vh:{if(h){break vh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break vh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break vh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!m:m;break th}d=H[e+4>>2]}H[q>>2]=(o|0)==(d|0)?i:k;H[u>>2]=H[u>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n-268|0;H[b>>2]=H[b>>2]|131072;b=n-260|0;H[b>>2]=H[b>>2]|32768;b=n-264|0;u=b;e=H[b>>2];b=d^o;H[u>>2]=e|b<<31|65536;g=b<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;wh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){xh:{if(h){break xh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break xh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break xh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break wh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){yh:{if(h){break yh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break yh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break yh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break wh}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];zh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Ah:{if(h){break Ah}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Ah}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Ah}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break zh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Bh:{if(h){break Bh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Bh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Bh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break zh}b=H[e+4>>2]}H[q+256>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ch:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Dh:{if(h){break Dh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Dh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Dh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ch}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Eh:{if(h){break Eh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Eh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Eh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ch}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Fh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Gh:{if(h){break Gh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Gh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Gh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Fh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Hh:{if(h){break Hh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Hh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Hh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Fh}b=H[e+4>>2]}H[q+512>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ih:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Jh:{if(h){break Jh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Jh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Jh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ih}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Kh:{if(h){break Kh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Kh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Kh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ih}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Lh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Mh:{if(h){break Mh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Mh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Mh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Lh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Nh:{if(h){break Nh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Nh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Nh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Lh}b=H[e+4>>2]}H[q+768>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;p=p+1|0;if((p|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=x>>>0<60;x=x+4|0;if(q){continue}break}break nh}b=1<>>1|b;q=H[f+120>>2];g=(q+(M<<2)|0)+12|0;b=H[f+128>>2];h=H[f+8>>2];c=H[f+4>>2];j=H[f>>2];l=H[f+104>>2];o=H[f+116>>2];Oh:{if(V&8){Ph:{if(b>>>0<4){break Ph}if(M){w=N(M,12);u=M<<3;q=0-k|0;D=f+28|0;while(1){x=0;while(1){n=g;g=H[g>>2];if(g){Qh:{if(g&2097168){break Qh}b=g&495;if(!b){break Qh}l=D+(I[b+H[f+108>>2]|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Rh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[e+4>>2];if(c&32768){break Rh}m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Sh:{if(h){break Sh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Sh}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Sh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Rh}m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Th:{if(h){break Th}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Th}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Th}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){r=n-4|0;d=H[n+4>>2]>>>17&4|(H[r>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=D+(I[d+24384|0]<<2)|0;s=H[l>>2];b=H[s>>2];c=c-b|0;e=I[d+24640|0];Uh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;v=H[s+4>>2];if(c&32768){break Uh}m=H[s+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[s+(b?12:8)>>2];while(1){Vh:{if(h){break Vh}h=H[f+16>>2];d=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(s<<8)+j|0;break Vh}if(s>>>0<=143){H[f+16>>2]=d;j=(s<<9)+j|0;h=7;break Vh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}v=b?!m:m;break Uh}m=H[s+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[s+(d?8:12)>>2];while(1){Wh:{if(h){break Wh}h=H[f+16>>2];c=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(s<<8)+j|0;break Wh}if(s>>>0<=143){H[f+16>>2]=c;j=(s<<9)+j|0;h=7;break Wh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;v=d?m:!m}b=v;H[o>>2]=(e|0)==(b|0)?k:q;H[r>>2]=H[r>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^e)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){e=g>>>3|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Xh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Xh}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Yh:{if(h){break Yh}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Yh}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Yh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Xh}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Zh:{if(h){break Zh}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Zh}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Zh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>20&4|(H[s>>2]>>>22&1|(g>>>15&16|(g>>>19&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=(M<<2)+o|0;e=I[d+24640|0];_h:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break _h}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){$h:{if(h){break $h}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break $h}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break $h}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break _h}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){ai:{if(h){break ai}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break ai}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break ai}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^e)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){e=g>>>6|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;bi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break bi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){ci:{if(h){break ci}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break ci}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break ci}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break bi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){di:{if(h){break di}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break di}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break di}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>23&4|(H[s>>2]>>>25&1|(g>>>18&16|(g>>>22&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+u|0;e=I[d+24640|0];ei:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ei}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){fi:{if(h){break fi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break fi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break fi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break ei}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){gi:{if(h){break gi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break gi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break gi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^e)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){e=g>>>9|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;hi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break hi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){ii:{if(h){break ii}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break ii}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break ii}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break hi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){ji:{if(h){break ji}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break ji}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ji}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>26&4|(H[s>>2]>>>28&1|(g>>>21&16|(g>>>25&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+w|0;e=I[d+24640|0];ki:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ki}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){li:{if(h){break li}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break li}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break li}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break ki}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){mi:{if(h){break mi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break mi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break mi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[f+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^e;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;o=o+4|0;x=x+1|0;if((M|0)!=(x|0)){continue}break}g=n+12|0;o=o+w|0;i=i+4|0;b=H[f+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break Ph}i=b&-4;g=(q+(i<<1)|0)+12|0}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l;if(!M|b>>>0<=i>>>0){break Oh}while(1){c=(b|0)==(i|0);h=0;b=i;if(!c){while(1){Xb(f,g,(N(h,M)<<2)+o|0,k,h,H[f+124>>2]+2|0,1);h=h+1|0;b=H[f+128>>2];if(h>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;p=p+1|0;if((M|0)!=(p|0)){continue}break}break Oh}ni:{if(b>>>0<4){break ni}if(M){w=N(M,12);u=M<<3;q=0-k|0;D=f+28|0;while(1){x=0;while(1){n=g;g=H[g>>2];if(g){oi:{if(g&2097168){break oi}b=g&495;if(!b){break oi}l=D+(I[b+H[f+108>>2]|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;pi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[e+4>>2];if(c&32768){break pi}m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){qi:{if(h){break qi}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break qi}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break qi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break pi}m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){ri:{if(h){break ri}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break ri}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ri}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){r=n-4|0;d=H[n+4>>2]>>>17&4|(H[r>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=D+(I[d+24384|0]<<2)|0;s=H[l>>2];b=H[s>>2];c=c-b|0;e=I[d+24640|0];si:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[s+4>>2];if(c&32768){break si}m=H[s+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[s+(b?12:8)>>2];while(1){ti:{if(h){break ti}h=H[f+16>>2];d=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(s<<8)+j|0;break ti}if(s>>>0<=143){H[f+16>>2]=d;j=(s<<9)+j|0;h=7;break ti}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!m:m;break si}m=H[s+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[s+(d?8:12)>>2];while(1){ui:{if(h){break ui}h=H[f+16>>2];c=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(s<<8)+j|0;break ui}if(s>>>0<=143){H[f+16>>2]=c;j=(s<<9)+j|0;h=7;break ui}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?m:!m}H[o>>2]=(e|0)==(d|0)?k:q;H[r>>2]=H[r>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n+(-2-H[f+124>>2]<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;d=d^e;H[b>>2]=H[b>>2]|d<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072;g=d<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){e=g>>>3|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;vi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break vi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){wi:{if(h){break wi}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break wi}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break wi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break vi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){xi:{if(h){break xi}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break xi}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break xi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>20&4|(H[s>>2]>>>22&1|(g>>>15&16|(g>>>19&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=(M<<2)+o|0;e=I[d+24640|0];yi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break yi}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){zi:{if(h){break zi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break zi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break zi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break yi}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Ai:{if(h){break Ai}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Ai}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Ai}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^e)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){e=g>>>6|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Bi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Bi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Ci:{if(h){break Ci}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Ci}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ci}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Bi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Di:{if(h){break Di}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Di}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Di}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>23&4|(H[s>>2]>>>25&1|(g>>>18&16|(g>>>22&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+u|0;e=I[d+24640|0];Ei:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break Ei}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){Fi:{if(h){break Fi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break Fi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break Fi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ei}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Gi:{if(h){break Gi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Gi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Gi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^e)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){e=g>>>9|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Hi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Hi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Ii:{if(h){break Ii}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Ii}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ii}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Hi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Ji:{if(h){break Ji}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Ji}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Ji}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>26&4|(H[s>>2]>>>28&1|(g>>>21&16|(g>>>25&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+w|0;e=I[d+24640|0];Ki:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break Ki}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){Li:{if(h){break Li}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break Li}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break Li}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ki}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Mi:{if(h){break Mi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Mi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Mi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[f+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^e;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;o=o+4|0;x=x+1|0;if((M|0)!=(x|0)){continue}break}g=n+12|0;o=o+w|0;i=i+4|0;b=H[f+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break ni}i=b&-4;g=(q+(i<<1)|0)+12|0}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l;if(!M|b>>>0<=i>>>0){break Oh}while(1){c=(b|0)==(i|0);h=0;b=i;if(!c){while(1){Xb(f,g,(N(h,M)<<2)+o|0,k,h,H[f+124>>2]+2|0,0);h=h+1|0;b=H[f+128>>2];if(h>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;p=p+1|0;if((M|0)!=(p|0)){continue}break}}break mh}while(1){p=0;while(1){q=b;n=g;g=H[g>>2];if(g){Ni:{if(g&2097168){break Ni}b=g&495;if(!b){break Ni}l=s+(I[b+H[f+108>>2]|0]<<2)|0;o=H[l>>2];b=H[o>>2];c=c-b|0;Oi:{if(j>>>16>>>0>>0){e=H[o+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[o+(d?8:12)>>2];while(1){Pi:{if(h){break Pi}o=H[f+16>>2];c=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Pi}H[f+16>>2]=c;j=(m<<9)+j|0;h=7;break Pi}H[f+16>>2]=c;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?e:!e;break Oi}j=j-(b<<16)|0;if(!(c&32768)){e=H[o+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[o+(b?12:8)>>2];while(1){Qi:{if(h){break Qi}o=H[f+16>>2];d=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Qi}H[f+16>>2]=d;j=(m<<9)+j|0;h=7;break Qi}H[f+16>>2]=d;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!e:e;break Oi}b=H[o+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>17&4|(H[u>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Ri:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Si:{if(h){break Si}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Si}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Si}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ri}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Ti:{if(h){break Ti}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Ti}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ti}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ri}b=H[e+4>>2]}H[q>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^o)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ui:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Vi:{if(h){break Vi}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Vi}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Vi}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ui}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Wi:{if(h){break Wi}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Wi}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Wi}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ui}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Xi:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Yi:{if(h){break Yi}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Yi}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Yi}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Xi}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Zi:{if(h){break Zi}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Zi}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Zi}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Xi}b=H[e+4>>2]}H[q+256>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;_i:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){$i:{if(h){break $i}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break $i}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break $i}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break _i}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){aj:{if(h){break aj}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break aj}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break aj}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break _i}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];bj:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){cj:{if(h){break cj}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break cj}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break cj}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break bj}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){dj:{if(h){break dj}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break dj}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break dj}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break bj}b=H[e+4>>2]}H[q+512>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;ej:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){fj:{if(h){break fj}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break fj}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break fj}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break ej}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){gj:{if(h){break gj}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break gj}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break gj}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break ej}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];hj:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){ij:{if(h){break ij}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break ij}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ij}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break hj}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){jj:{if(h){break jj}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break jj}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break jj}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break hj}b=H[e+4>>2]}H[q+768>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;p=p+1|0;if((p|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=x>>>0<60;x=x+4|0;if(q){continue}break}}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l}}if(aa){break bb}Yb(f);Xa(f,18,46);Xa(f,17,3);Xa(f,0,4)}b=la+1|0;c=(b|0)==3;la=c?0:b;z=z-c|0;ba=ba+1|0;if(ba>>>0>=K[ma+8>>2]){break ab}if((z|0)>0){continue}break}}U=R+U|0;c=H[f+24>>2];b=J[f+112>>1];F[c|0]=b;F[c+1|0]=b>>>8;X=X+1|0;if(X>>>0>2]){continue}break}}kj:{if(!E){break kj}lj:{c=H[f+24>>2];g=H[f+16>>2];if(c>>>0>g+2>>>0){if(!_){break lj}g=H[f+16>>2];c=H[f+24>>2];b=H[f+20>>2];H[Y+56>>2]=c-b;H[Y+52>>2]=g-b;H[Y+48>>2]=(c-g|0)-2;Ba(S,2,15235,Y+48|0);break kj}b=H[f+12>>2];if(b>>>0<3){break kj}if(_){H[Y+80>>2]=H[f+12>>2];Ba(S,2,7107,Y+80|0);break kj}H[Y+64>>2]=b;Ba(S,2,7107,Y- -64|0);break kj}b=H[f+20>>2];H[Y+40>>2]=c-b;H[Y+36>>2]=g-b;H[Y+32>>2]=(c-g|0)-2;Ba(S,2,15235,Y+32|0)}if(!H[C+60>>2]){break i}H[f+116>>2]=Z}k=H[qa+4>>2];g=H[C+12>>2];l=H[C+8>>2]-H[qa>>2]|0;c=H[qa+16>>2];if(c&1){b=H[oa+28>>2]+N(ua,152)|0;l=(H[b-144>>2]+l|0)-H[b-152>>2]|0}i=g-k|0;if(c&2){b=H[oa+28>>2]+N(ua,152)|0;i=(H[b-140>>2]+i|0)-H[b-148>>2]|0}d=H[C+60>>2];t=d?d:H[f+116>>2];p=H[f+128>>2];u=H[f+124>>2];n=H[pa+808>>2];mj:{if(!n){break mj}b=!p|!u;if((n|0)<=30){if(b){break mj}e=0;while(1){k=(N(e,u)<<2)+t|0;b=0;while(1){g=k+(b<<2)|0;q=H[g>>2];c=q>>31;c=(c^q)-c|0;if(c>>>n|0){c=c>>>H[pa+808>>2]|0;H[g>>2]=(q|0)<0?0-c|0:c}b=b+1|0;if((u|0)!=(b|0)){continue}break}e=e+1|0;if((p|0)!=(e|0)){continue}break}break mj}if(b){break mj}b=N(p,u)<<2;if(!b){break mj}y(t,0,b)}if(d){b=N(p,u);if(H[pa+20>>2]==1){if(!b){break a}f=0;if((b|0)!=1){c=b&1;b=b&-2;g=0;while(1){k=(f<<2)+t|0;H[k>>2]=H[k>>2]/2;H[k+4>>2]=H[k+4>>2]/2;f=f+2|0;g=g+2|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}b=(f<<2)+t|0;H[b>>2]=H[b>>2]/2;break a}if(!b){break a}ga=O(L[qa+32>>2]*O(.5));g=b&3;if(b>>>0>=4){c=b&-4;b=0;while(1){L[t>>2]=ga*O(H[t>>2]);L[t+4>>2]=ga*O(H[t+4>>2]);L[t+8>>2]=ga*O(H[t+8>>2]);L[t+12>>2]=ga*O(H[t+12>>2]);t=t+16|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!g){break a}}b=0;while(1){L[t>>2]=ga*O(H[t>>2]);t=t+4|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}break a}m=wa-va|0;if(H[pa+20>>2]==1){if(!p){break a}j=(H[oa+36>>2]+(N(i,m)<<2)|0)+(l<<2)|0;o=u&-4;i=0;while(1){b=0;if(o){d=j+(N(i,m)<<2)|0;n=(N(i,u)<<2)+t|0;while(1){q=b<<2;e=q+n|0;k=H[e+4>>2];g=H[e+8>>2];c=H[e+12>>2];q=d+q|0;H[q>>2]=H[e>>2]/2;H[q+12>>2]=(c|0)/2;H[q+8>>2]=(g|0)/2;H[q+4>>2]=(k|0)/2;b=b+4|0;if(o>>>0>b>>>0){continue}break}}nj:{if(b>>>0>=u>>>0){break nj}c=b+1|0;k=j+(N(i,m)<<2)|0;g=(N(i,u)<<2)+t|0;if(u-b&1){b=b<<2;H[b+k>>2]=H[b+g>>2]/2;b=c}if((c|0)==(u|0)){break nj}while(1){c=b<<2;H[c+k>>2]=H[c+g>>2]/2;c=c+4|0;H[c+k>>2]=H[c+g>>2]/2;b=b+2|0;if((u|0)!=(b|0)){continue}break}}i=i+1|0;if((p|0)!=(i|0)){continue}break}break a}if(!p|!u){break a}ga=O(L[qa+32>>2]*O(.5));i=(H[oa+36>>2]+(N(i,m)<<2)|0)+(l<<2)|0;g=u&-4;k=u&3;h=0;c=u-1>>>0<3;while(1){b=i;f=0;oj:{if(!c){while(1){L[b>>2]=ga*O(H[t>>2]);L[b+4>>2]=ga*O(H[t+4>>2]);L[b+8>>2]=ga*O(H[t+8>>2]);L[b+12>>2]=ga*O(H[t+12>>2]);b=b+16|0;t=t+16|0;f=f+4|0;if((g|0)!=(f|0)){continue}break}if(!k){break oj}}f=0;while(1){L[b>>2]=ga*O(H[t>>2]);b=b+4|0;t=t+4|0;f=f+1|0;if((k|0)!=(f|0)){continue}break}}i=(m<<2)+i|0;h=h+1|0;if((p|0)!=(h|0)){continue}break}break a}H[Y>>2]=z;Ba(S,2,8716,Y)}H[H[d>>2]>>2]=0}Ca(a);na=Y+96|0} +function ib(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,Q=0,R=0,S=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=O(0),da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=O(0),Aa=0,Ga=0,Ka=0,La=0,Ma=0,Na=0,Pa=O(0),Ra=0,Ua=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,fb=0,gb=0,hb=0,ib=0,kb=0,lb=0,mb=0,pb=0,qb=0,rb=0,sb=0,tb=0;Aa=na-16|0;na=Aa;a:{if(!(I[a+8|0]&128)|H[a+228>>2]!=(b|0)){break a}ua=H[a+180>>2]+N(b,5644)|0;E=H[ua+5596>>2];if(!E){jb(ua);break a}g=H[a+100>>2];if(!g){g=H[a+96>>2]}q=H[g>>2];p=H[g+4>>2];k=H[g+8>>2];v=H[g+12>>2];g=H[a+60>>2];h=H[a+64>>2];i=H[ua+5600>>2];ra=na-16|0;na=ra;D=H[a+232>>2];H[D+36>>2]=b;j=H[H[D+28>>2]+76>>2];H[D+64>>2]=1;H[D+60>>2]=v;H[D+56>>2]=k;H[D+52>>2]=p;H[D+48>>2]=q;H[D+32>>2]=j+N(b,5644);Ca(H[D+68>>2]);p=0;H[D+68>>2]=0;b:{if(g){p=Ea(4,H[H[D+24>>2]+16>>2]);if(!p){break b}q=g&3;c:{if(g>>>0>=4){k=g&-4;b=0;while(1){g=h+(X<<2)|0;H[(H[g>>2]<<2)+p>>2]=1;H[(H[g+4>>2]<<2)+p>>2]=1;H[(H[g+8>>2]<<2)+p>>2]=1;H[(H[g+12>>2]<<2)+p>>2]=1;X=X+4|0;b=b+4|0;if((k|0)!=(b|0)){continue}break}if(!q){break c}}while(1){H[(H[h+(X<<2)>>2]<<2)+p>>2]=1;X=X+1|0;s=s+1|0;if((q|0)!=(s|0)){continue}break}}H[D+68>>2]=p}d:{A=H[D+24>>2];m=H[A+16>>2];e:{if(!m){break e}X=0;f:{while(1){g:{if(H[(X<<2)+p>>2]?0:p){break g}h=H[A+24>>2]+N(X,52)|0;b=H[h+4>>2];k=b-1|0;q=H[D+60>>2];v=k+q|0;g=0-!b|0;j=ve(v,q>>>0>v>>>0?g+1|0:g,b,0);h=H[h>>2];l=h-1|0;v=H[D+56>>2];s=l+v|0;q=0-!h|0;r=ve(s,s>>>0>>0?q+1|0:q,h,0);t=k;k=H[D+52>>2];v=t+k|0;k=ve(v,k>>>0>v>>>0?g+1|0:g,b,0);b=H[H[H[D+20>>2]>>2]+20>>2]+N(X,76)|0;g=H[b+20>>2]-H[b+24>>2]|0;if(g>>>0>31){break g}v=H[b+12>>2];s=H[b+8>>2];t=H[b+4>>2];V=l;l=H[D+48>>2];x=V+l|0;h=ve(x,l>>>0>x>>>0?q+1|0:q,h,0);b=h-H[b>>2]|0;h:{if((b>>>0<=h>>>0?b:0)>>>g|0){break h}b=k-t|0;if((b>>>0<=k>>>0?b:0)>>>g|0){break h}b=s-r|0;if((b>>>0<=s>>>0?b:0)>>>g|0){break h}b=v-j|0;if(!((b>>>0<=v>>>0?b:0)>>>g|0)){break g}}H[D+64>>2]=0;break f}X=X+1|0;if((m|0)!=(X|0)){continue}break}if(!H[D+64>>2]){break f}s=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(s,76)|0;g=H[b+28>>2]+N(H[b+24>>2],152)|0;h=H[g-148>>2];q=H[g-140>>2];p=H[g-152>>2];g=H[g-144>>2];k=H[D+68>>2];i:{if(H[k+(s<<2)>>2]?0:k){break i}k=q-h|0;g=g-p|0;re(k,0,g);if(!(!qa|(h|0)==(q|0))){X=0;Ba(f,1,2982,0);break b}g=N(g,k);if(g>>>0>=1073741824){X=0;Ba(f,1,2982,0);break b}g=g<<2;H[b+44>>2]=g;j:{k:{l:{h=H[b+36>>2];if(h){if(g>>>0<=K[b+48>>2]){break i}if(H[b+40>>2]){break l}}g=Ia(g);H[b+36>>2]=g;h=g;g=H[b+44>>2];if(!(g?h:1)){break k}H[b+40>>2]=1;H[b+48>>2]=g;break i}Ca(h);g=Ia(H[b+44>>2]);H[b+36>>2]=g;if(g){break j}H[b+48>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0}X=0;Ba(f,1,2982,0);break b}H[b+40>>2]=1;H[b+48>>2]=H[b+44>>2]}s=s+1|0;A=H[D+24>>2];if(s>>>0>2]){continue}break}break e}M=H[A+24>>2];W=H[H[H[D+20>>2]>>2]+20>>2];b=0;while(1){m:{if(H[(b<<2)+p>>2]?0:p){break m}g=W+N(b,76)|0;q=H[g>>2];k=M+N(b,52)|0;h=H[k>>2];l=h-1|0;v=H[D+48>>2];j=l+v|0;s=0-!h|0;v=ve(j,j>>>0>>0?s+1|0:s,h,0);q=q>>>0>v>>>0?q:v;H[g+56>>2]=q;v=H[g+4>>2];k=H[k+4>>2];r=k-1|0;t=H[D+52>>2];x=r+t|0;j=0-!k|0;t=ve(x,t>>>0>x>>>0?j+1|0:j,k,0);v=v>>>0>t>>>0?v:t;H[g+60>>2]=v;t=H[g+8>>2];V=l;l=H[D+56>>2];x=V+l|0;h=ve(x,l>>>0>x>>>0?s+1|0:s,h,0);h=h>>>0>t>>>0?t:h;H[g+64>>2]=h;s=H[g+12>>2];l=H[D+60>>2];r=r+l|0;k=ve(r,l>>>0>r>>>0?j+1|0:j,k,0);k=k>>>0>s>>>0?s:k;H[g+68>>2]=k;if(h>>>0>>0|k>>>0>>0){break d}r=H[g+20>>2];if(!r){break m}t=k-1|0;J=0-!k|0;Z=h-1|0;R=0-!h|0;x=v-1|0;S=0-!v|0;Y=q-1|0;z=0-!q|0;$=H[g+28>>2];k=0;h=0;while(1){v=$+N(k,152)|0;q=r+(k^-1)|0;g=q&31;if((q&63)>>>0>=32){l=1<>>32-g}g=t+s|0;j=l+J|0;w=g>>>0>>0?j+1|0:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+148>>2]=g;g=l+R|0;V=g+1|0;j=g;g=s+Z|0;w=g>>>0>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+144>>2]=g;g=l+S|0;V=g+1|0;j=g;g=s+x|0;w=g>>>0>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+140>>2]=g;g=l+z|0;j=s+Y|0;s=j>>>0>>0?g+1|0:g;g=q&31;if((q&63)>>>0>=32){g=s>>>g|0}else{g=((1<>>g}H[v+136>>2]=g;k=k+1|0;h=k?h:h+1|0;if(h|(k|0)!=(r|0)){continue}break}}b=b+1|0;if((m|0)!=(b|0)){continue}break}}X=0;H[ra+8>>2]=0;b=H[D+28>>2];Y=Ea(1,8);if(Y){H[Y+4>>2]=b;H[Y>>2]=A}if(!Y){break b}Z=H[H[D+20>>2]>>2];x=na-144|0;na=x;l=H[D+36>>2];b=N(l,5644);h=H[Y+4>>2];R=b+H[h+76>>2]|0;_=H[R+420>>2];k=0;q=0;t=na-32|0;na=t;J=b+H[h+76>>2]|0;$=H[J+420>>2];S=H[Y>>2];m=S;w=H[m+16>>2];v=Fa(N(w,528));n:{if(!v){break n}b=Fa(w<<2);o:{if(!b){b=v;break o}p=H[h+76>>2]+N(l,5644)|0;M=H[p+420>>2];s=M+1|0;g=Ea(s,240);p:{if(g){q:{if(s){r=H[m+16>>2];s=g;while(1){H[s+236>>2]=f;j=Ea(r,16);H[s+200>>2]=j;if(!j){break q}W=H[m+16>>2];H[s+196>>2]=W;r=0;j=0;if(W){while(1){r=H[s+200>>2]+(j<<4)|0;W=H[p+5584>>2]+N(j,1080)|0;z=Ea(H[W+4>>2],16);H[r+12>>2]=z;if(!z){break q}H[r+8>>2]=H[W+4>>2];j=j+1|0;r=H[m+16>>2];if(j>>>0>>0){continue}break}}s=s+240|0;j=(o|0)==(M|0);o=o+1|0;if(!j){continue}break}}break p}p=H[g+4>>2];if(p){Ca(p);H[g+4>>2]=0}s=g;p=0;while(1){j=H[s+200>>2];if(j){r=0;o=H[s+196>>2];if(o){while(1){W=H[j+12>>2];if(W){Ca(W);H[j+12>>2]=0;o=H[s+196>>2]}j=j+16|0;r=r+1|0;if(r>>>0>>0){continue}break}j=H[s+200>>2]}Ca(j);H[s+200>>2]=0}s=s+240|0;j=(p|0)==(M|0);p=p+1|0;if(!j){continue}break}Ca(g)}g=0}if(g){r:{if(!w){break r}j=w&7;p=v;if(w>>>0>=8){r=w&-8;while(1){s=(n<<2)+b|0;H[s+28>>2]=p+3696;H[s+24>>2]=p+3168;H[s+20>>2]=p+2640;H[s+16>>2]=p+2112;H[s+12>>2]=p+1584;H[s+8>>2]=p+1056;H[s+4>>2]=p+528;H[s>>2]=p;n=n+8|0;p=p+4224|0;k=k+8|0;if((r|0)!=(k|0)){continue}break}if(!j){break r}}while(1){H[(n<<2)+b>>2]=p;n=n+1|0;p=p+528|0;u=u+1|0;if((j|0)!=(u|0)){continue}break}}u=b;r=0;s=H[(H[h+76>>2]+N(l,5644)|0)+5584>>2];p=H[m+24>>2];b=H[h+24>>2];k=(l>>>0)/(b>>>0)|0;b=H[h+4>>2]+N(H[h+12>>2],l-N(b,k)|0)|0;n=H[m>>2];H[t+20>>2]=b>>>0>n>>>0?b:n;n=b+H[h+12>>2]|0;b=b>>>0>n>>>0?-1:n;n=H[m+8>>2];H[t+16>>2]=b>>>0>>0?b:n;b=H[h+8>>2]+N(k,H[h+16>>2])|0;k=H[m+4>>2];H[t+12>>2]=b>>>0>k>>>0?b:k;h=b+H[h+16>>2]|0;b=b>>>0>h>>>0?-1:h;h=H[m+12>>2];H[t+8>>2]=b>>>0>>0?b:h;H[t+24>>2]=0;H[t+28>>2]=0;H[t+4>>2]=2147483647;H[t>>2]=2147483647;if(H[m+16>>2]){while(1){h=u?H[u+(r<<2)>>2]:0;b=H[p+4>>2];M=b-1|0;k=H[t+8>>2];j=M+k|0;n=0-!b|0;j=ve(j,k>>>0>j>>>0?n+1|0:n,b,0);k=H[p>>2];W=k-1|0;o=H[t+16>>2];z=W+o|0;l=0-!k|0;o=ve(z,o>>>0>z>>>0?l+1|0:l,k,0);V=M;M=H[t+12>>2];z=V+M|0;n=ve(z,z>>>0>>0?n+1|0:n,b,0);b=H[t+20>>2];M=b+W|0;k=ve(M,b>>>0>M>>>0?l+1|0:l,k,0);b=H[s+4>>2];if(b>>>0>K[t+28>>2]){H[t+28>>2]=b;b=H[s+4>>2]}if(b){da=s+944|0;ka=s+812|0;ba=j-1|0;oa=0-!j|0;aa=o-1|0;la=0-!o|0;ga=n-1|0;ia=0-!n|0;C=k-1|0;ha=0-!k|0;o=0;while(1){k=o<<2;M=H[k+da>>2];W=H[k+ka>>2];n=0;if(h){H[h+4>>2]=M;H[h>>2]=W;n=h+8|0}b=b-1|0;h=W+b|0;s:{if(h>>>0>31){break s}k=H[p>>2];if(k>>>0>-1>>>h>>>0){break s}j=H[t+4>>2];h=k<>2]=h>>>0>j>>>0?j:h}h=b+M|0;t:{if(h>>>0>31){break t}k=H[p+4>>2];if(k>>>0>-1>>>h>>>0){break t}j=H[t>>2];h=k<>2]=h>>>0>j>>>0?j:h}h=0;k=b&31;if((b&63)>>>0>=32){l=1<>>32-k}ea=j;j=ba+ea|0;k=l;l=oa+k|0;A=j>>>0>>0?l+1|0:l;z=b&31;l=M&31;if((M&63)>>>0>=32){l=1<>>32-l}if((b&63)>>>0>=32){A=A>>>z|0}else{A=((1<>>z}j=V+A|0;ma=j-1|0;l=(j>>>0>>0?l+1|0:l)-!j|0;j=M&31;z=k+ia|0;V=ga+ea|0;z=V>>>0>>0?z+1|0:z;if((M&63)>>>0>=32){j=l>>>j|0}else{j=((1<>>j}l=j;j=b&31;if((b&63)>>>0>=32){j=z>>>j|0}else{j=((1<>>j}z=(j|0)!=(A|0)?l-(j>>>M|0)&-1>>>M:0;j=k+la|0;l=j+1|0;V=j;j=aa+ea|0;A=j>>>0>>0?l:V;M=b&31;l=W&31;if((W&63)>>>0>=32){l=1<>>32-l}if((b&63)>>>0>=32){A=A>>>M|0}else{A=((1<>>M}j=V+A|0;ma=j-1|0;l=(j>>>0>>0?l+1|0:l)-!j|0;j=W&31;k=k+ha|0;ea=C+ea|0;M=ea>>>0>>0?k+1|0:k;k=b&31;if((W&63)>>>0>=32){j=l>>>j|0}else{j=((1<>>j}if((b&63)>>>0>=32){k=M>>>k|0}else{k=((1<>>k}k=(k|0)!=(A|0)?j-(k>>>W|0)&-1>>>W:0;if(n){H[n+4>>2]=z;H[n>>2]=k;h=n+8|0}k=N(k,z);if(k>>>0>K[t+24>>2]){H[t+24>>2]=k}o=o+1|0;if(o>>>0>2]){continue}break}}p=p+52|0;s=s+1080|0;r=r+1|0;if(r>>>0>2]){continue}break}}M=$+1|0;r=H[t+28>>2];l=H[t+24>>2];H[g+4>>2]=0;b=H[J+8>>2]+1|0;W=N(l,w);o=N(W,r);re(b,0,o);u:{if(!qa){b=N(b,o);H[g+8>>2]=b;b=Ea(b,2);H[g+4>>2]=b;if(b){break u}}Ca(v);Ca(u);b=H[g+4>>2];if(b){Ca(b);H[g+4>>2]=0}if(!M){b=g;break o}b=0;k=g;while(1){p=H[k+200>>2];if(p){m=0;n=H[k+196>>2];if(n){while(1){h=H[p+12>>2];if(h){Ca(h);H[p+12>>2]=0;n=H[k+196>>2]}p=p+16|0;m=m+1|0;if(n>>>0>m>>>0){continue}break}p=H[k+200>>2]}Ca(p);H[k+200>>2]=0}k=k+240|0;h=(b|0)==($|0);b=b+1|0;if(!h){continue}break}b=g;break o}j=H[m+24>>2];z=H[t+20>>2];H[g+204>>2]=z;ea=H[t+12>>2];H[g+208>>2]=ea;ba=H[t+16>>2];H[g+212>>2]=ba;aa=H[t+8>>2];H[g+216>>2]=aa;H[g+12>>2]=o;H[g+16>>2]=W;H[g+20>>2]=l;q=1;H[g+24>>2]=1;if(w){k=H[g+200>>2];s=0;b=j;while(1){p=H[u+(s<<2)>>2];H[k>>2]=H[b>>2];H[k+4>>2]=H[b+4>>2];h=H[k+8>>2];v:{if(!h){break v}m=H[k+12>>2];if((h|0)!=1){ga=h&1;h=h&-2;n=0;while(1){H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2];H[m+16>>2]=H[p+16>>2];H[m+20>>2]=H[p+20>>2];H[m+24>>2]=H[p+24>>2];H[m+28>>2]=H[p+28>>2];m=m+32|0;p=p+32|0;n=n+2|0;if((h|0)!=(n|0)){continue}break}if(!ga){break v}}H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2]}b=b+52|0;k=k+16|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}if(M>>>0>1){h=g;while(1){H[h+456>>2]=aa;H[h+452>>2]=ba;H[h+448>>2]=ea;H[h+444>>2]=z;H[h+264>>2]=1;H[h+260>>2]=l;H[h+256>>2]=W;H[h+252>>2]=o;if(w){k=H[h+440>>2];s=0;b=j;while(1){p=H[u+(s<<2)>>2];H[k>>2]=H[b>>2];H[k+4>>2]=H[b+4>>2];n=H[k+8>>2];w:{if(!n){break w}m=H[k+12>>2];if((n|0)!=1){M=n&1;ga=n&-2;n=0;while(1){H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2];H[m+16>>2]=H[p+16>>2];H[m+20>>2]=H[p+20>>2];H[m+24>>2]=H[p+24>>2];H[m+28>>2]=H[p+28>>2];m=m+32|0;p=p+32|0;n=n+2|0;if((ga|0)!=(n|0)){continue}break}if(!M){break w}}H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2]}b=b+52|0;k=k+16|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}b=H[h+8>>2];H[h+244>>2]=H[h+4>>2];H[h+248>>2]=b;b=(q|0)!=($|0);h=h+240|0;q=q+1|0;if(b){continue}break}}Ca(v);Ca(u);b=H[J+420>>2];x:{if(I[J+5640|0]&4){if((b|0)==-1){break x}m=J+424|0;h=H[J+8>>2];n=0;p=g;while(1){q=H[m+36>>2];H[p+44>>2]=1;H[p+84>>2]=q;H[p+48>>2]=H[m>>2];q=H[m+4>>2];H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=q;H[p+60>>2]=H[m+12>>2];H[p+64>>2]=H[m+16>>2];q=H[m+8>>2];H[p+76>>2]=l;H[p+56>>2]=h>>>0>q>>>0?q:h;m=m+148|0;p=p+240|0;q=(b|0)==(n|0);n=n+1|0;if(!q){continue}break}break x}if((b|0)==-1){break x}h=H[J+8>>2];q=H[J+4>>2];p=g;if(b){k=b+1&-2;u=0;while(1){H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=0;H[p+44>>2]=1;H[p+48>>2]=0;H[p+84>>2]=q;H[p+60>>2]=r;H[p+324>>2]=q;H[p+76>>2]=l;H[p+56>>2]=h;H[p+308>>2]=0;H[p+312>>2]=0;H[p+292>>2]=0;H[p+284>>2]=1;H[p+288>>2]=0;H[p+300>>2]=r;H[p+296>>2]=h;H[p+316>>2]=l;H[p+64>>2]=H[p+196>>2];H[p+304>>2]=H[p+436>>2];p=p+480|0;u=u+2|0;if((k|0)!=(u|0)){continue}break}if(b&1){break x}}H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=0;H[p+44>>2]=1;H[p+48>>2]=0;H[p+84>>2]=q;H[p+60>>2]=r;H[p+76>>2]=l;H[p+56>>2]=h;H[p+64>>2]=H[p+196>>2]}q=g;break n}Ca(v)}Ca(b)}na=t+32|0;g=q;y:{z:{if(!g){break z}M=_+1|0;s=E;v=g;A:{B:{while(1){if(H[v+84>>2]==-1){break A}l=Fa(H[S+16>>2]<<2);if(!l){break A}b=H[S+16>>2]<<2;if(b){y(l,1,b)}if(Vb(v)){while(1){k=H[Z+20>>2];C:{D:{if(K[v+40>>2]>=K[R+12>>2]){break D}b=H[v+32>>2];h=N(H[v+28>>2],76)+k|0;if(b>>>0>=K[h+24>>2]){break D}h=H[h+28>>2]+N(b,152)|0;if(!H[h+24>>2]){break D}q=h+28|0;j=0;E:{while(1){p=q+N(j,36)|0;b=H[p+20>>2]+N(H[v+36>>2],40)|0;if(!xb(D,H[v+28>>2],H[v+32>>2],H[p+16>>2],H[b>>2],H[b+4>>2],H[b+8>>2],H[b+12>>2])){j=j+1|0;if(j>>>0>2]){continue}break E}break}H[l+(H[v+28>>2]<<2)>>2]=0;H[x+136>>2]=0;if(!Ub(H[Y+4>>2],H[Z+20>>2],R,v,x+140|0,s,x+136|0,i,f)){break B}j=H[v+32>>2];o=H[v+28>>2];m=H[x+136>>2];if(H[x+140>>2]){H[x+136>>2]=0;W=H[(H[Z+20>>2]+N(o,76)|0)+28>>2]+N(j,152)|0;k=H[W+24>>2];if(k){w=i-m|0;J=i+s|0;o=W+28|0;t=0;r=0;z=m+s|0;u=z;while(1){F:{if(H[o+8>>2]==H[o>>2]|H[o+12>>2]==H[o+4>>2]){break F}b=H[o+20>>2]+N(H[v+36>>2],40)|0;$=N(H[b+20>>2],H[b+16>>2]);if(!$){break F}k=H[b+24>>2];h=0;while(1){p=H[k+36>>2];if(p){G:{if(r|H[k+64>>2]){H[k+52>>2]=0;j=1;b=64;break G}j=H[k>>2];b=H[k+40>>2];H:{if(b){j=N(b,24)+j|0;if(H[j-20>>2]!=H[j-12>>2]){j=j-24|0;break H}b=b+1|0}else{b=1}H[k+40>>2]=b}b=H[j+20>>2];I:{J:{if(b>>>0>(u^-1)>>>0){break J}q=j+20|0;while(1){if(J>>>0>>0){break J}n=H[k+4>>2];r=H[k+52>>2];if((r|0)!=H[k+56>>2]){q=p}else{b=r<<1|1;n=Ha(n,b<<3);if(!n){Ba(f,1,1024,0);break B}H[k+56>>2]=b;H[k+4>>2]=n;r=H[k+52>>2];b=H[q>>2];q=H[k+36>>2]}p=(r<<3)+n|0;H[p+4>>2]=b;H[p>>2]=u;H[k+52>>2]=r+1;H[j>>2]=H[j>>2]+b;n=H[j+16>>2];r=n+H[j+4>>2]|0;H[j+4>>2]=r;p=q-n|0;H[k+36>>2]=p;H[j+8>>2]=r;u=b+u|0;r=0;if((n|0)==(q|0)){break I}H[k+40>>2]=H[k+40>>2]+1;q=j+44|0;b=H[j+44>>2];j=j+24|0;if((u^-1)>>>0>=b>>>0){continue}break}}q=H[v+28>>2];p=H[v+32>>2];n=H[v+36>>2];if(H[H[Y+4>>2]+104>>2]){H[x+120>>2]=q;H[x+116>>2]=p;H[x+112>>2]=t;H[x+108>>2]=n;H[x+104>>2]=h;H[x+100>>2]=w;H[x+96>>2]=b;Ba(f,1,14693,x+96|0);break B}H[x+88>>2]=q;H[x+84>>2]=p;H[x+80>>2]=t;H[x+76>>2]=n;H[x+72>>2]=h;H[x+68>>2]=w;H[x+64>>2]=b;Ba(f,2,14693,x- -64|0);H[k+52>>2]=0;H[k+64>>2]=1;r=1}j=H[k+40>>2];b=44}H[b+k>>2]=j}k=k+68|0;h=h+1|0;if(($|0)!=(h|0)){continue}break}k=H[W+24>>2]}o=o+36|0;t=t+1|0;if(t>>>0>>0){continue}break}j=H[v+32>>2];o=H[v+28>>2];b=r?w:u-z|0}else{b=0}m=b+m|0}h=H[S+24>>2]+N(o,52)|0;b=H[h+36>>2];H[h+36>>2]=b>>>0>>0?j:b;break C}k=H[Z+20>>2]}H[x+136>>2]=0;if(!Ub(H[Y+4>>2],k,R,v,x+140|0,s,x+136|0,i,f)){break B}o=H[v+28>>2];m=H[x+136>>2];if(!H[x+140>>2]){break C}J=H[v+32>>2];b=H[(H[Z+20>>2]+N(o,76)|0)+28>>2]+N(J,152)|0;z=H[b+24>>2];if(!z){break C}w=i-m|0;n=b+28|0;W=H[v+36>>2];j=0;r=0;K:{L:{while(1){M:{if(H[n+8>>2]==H[n>>2]|H[n+12>>2]==H[n+4>>2]){break M}b=H[n+20>>2]+N(W,40)|0;$=N(H[b+20>>2],H[b+16>>2]);if(!$){break M}p=H[b+24>>2];t=0;while(1){b=H[p+36>>2];if(b){k=H[p>>2];h=H[p+40>>2];N:{if(h){k=N(h,24)+k|0;if(H[k-20>>2]!=H[k-12>>2]){k=k-24|0;break N}h=h+1|0}else{h=1}H[p+40>>2]=h}u=H[k+20>>2];j=u+j|0;if(j>>>0>>0|j>>>0>w>>>0){break K}while(1){O:{u=H[k+16>>2];H[k+4>>2]=u+H[k+4>>2];q=b-u|0;if((b|0)==(u|0)){break O}h=h+1|0;H[p+40>>2]=h;u=H[k+44>>2];j=u+j|0;if(j>>>0>>0){break L}k=k+24|0;b=q;if(j>>>0<=w>>>0){continue}break L}break}H[p+36>>2]=q}p=p+68|0;t=t+1|0;if(($|0)!=(t|0)){continue}break}}n=n+36|0;r=r+1|0;if((z|0)!=(r|0)){continue}break}m=j+m|0;break C}H[p+36>>2]=q}if(!H[H[Y+4>>2]+104>>2]){H[x+24>>2]=o;H[x+20>>2]=J;H[x+16>>2]=r;H[x+12>>2]=W;H[x+8>>2]=t;H[x+4>>2]=w;H[x>>2]=u;Ba(f,2,14608,x);o=H[v+28>>2];m=m+w|0;break C}H[x+56>>2]=o;H[x+52>>2]=J;H[x+48>>2]=r;H[x+44>>2]=W;H[x+40>>2]=t;H[x+36>>2]=w;H[x+32>>2]=u;Ba(f,1,14608,x+32|0);break B}P:{if(!H[l+(o<<2)>>2]){break P}b=H[S+24>>2]+N(o,52)|0;if(H[b+36>>2]){break P}H[b+36>>2]=H[(H[Z+20>>2]+N(o,76)|0)+24>>2]-1}i=i-m|0;s=m+s|0;if(Vb(v)){continue}break}}Ca(l);v=v+240|0;Q=Q+1|0;if(Q>>>0<=K[R+420>>2]){continue}break}yb(g,M);H[ra+8>>2]=s-E;b=1;break y}yb(g,M);Ca(l);break z}yb(g,M)}b=0}na=x+144|0;db(Y);if(!b){break b}X=H[H[D+32>>2]+5584>>2];j=H[H[D+20>>2]>>2];C=H[j+20>>2];H[ra+12>>2]=1;s=0;b=H[D+32>>2];l=H[X+16>>2]>>>4&1&H[b+12>>2]==H[b+8>>2];A=H[j+16>>2];Q:{if(!A){break Q}while(1){b=H[D+68>>2];if(!(H[b+(s<<2)>>2]?0:b)){u=ra+12|0;A=0;b=H[C+24>>2];R:{if(!b){break R}m=H[D+44>>2];while(1){q=H[C+28>>2]+N(A,152)|0;p=H[q+24>>2];if(p){o=q+28|0;b=H[q+20>>2];v=H[q+16>>2];r=0;while(1){if(N(b,v)){n=o+N(r,36)|0;k=0;while(1){g=H[n+20>>2]+N(k,40)|0;i=xb(D,H[C+16>>2],A,H[n+16>>2],H[g>>2],H[g+4>>2],H[g+8>>2],H[g+12>>2]);h=H[g+16>>2];p=H[g+20>>2];b=N(h,p);S:{if(i){if(!b){break S}h=0;while(1){i=H[g+24>>2]+N(h,68)|0;T:{if(!xb(D,H[C+16>>2],A,H[n+16>>2],H[i+8>>2],H[i+12>>2],H[i+16>>2],H[i+20>>2])){b=H[i+60>>2];if(!b){break T}Ca(b);H[i+60>>2]=0;break T}if(!H[D+64>>2]){if(H[i+60>>2]|H[i+16>>2]==H[i+8>>2]|H[i+20>>2]==H[i+12>>2]){break T}}b=Ea(1,44);if(!b){H[ra+12>>2]=0;break R}p=H[D+64>>2];H[b+36>>2]=0;H[b+28>>2]=u;H[b+20>>2]=X;H[b+16>>2]=C;H[b+12>>2]=n;H[b+8>>2]=i;H[b+4>>2]=A;H[b>>2]=p;H[b+40>>2]=l;H[b+32>>2]=f;H[b+24>>2]=H[m+4>>2]>1;eb(m,14,b);if(!H[ra+12>>2]){break R}}h=h+1|0;if(h>>>0>2],H[g+16>>2])>>>0){continue}break}break S}if(!b){break S}v=0;while(1){b=H[g+24>>2]+N(v,68)|0;i=H[b+60>>2];if(i){Ca(i);H[b+60>>2]=0;p=H[g+20>>2];h=H[g+16>>2]}v=v+1|0;if(v>>>0>>0){continue}break}}k=k+1|0;b=H[q+20>>2];v=H[q+16>>2];if(k>>>0>>0){continue}break}p=H[q+24>>2]}r=r+1|0;if(r>>>0

>>0){continue}break}b=H[C+24>>2]}A=A+1|0;if(A>>>0>>0){continue}break}}if(!H[ra+12>>2]){break Q}A=H[j+16>>2]}X=X+1080|0;C=C+76|0;s=s+1|0;if(A>>>0>s>>>0){continue}break}}X=0;Sa(H[D+44>>2]);if(!H[ra+12>>2]){break b}U:{if(H[D+64>>2]){break U}s=H[D+24>>2];if(!H[s+16>>2]){break U}C=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(C,76)|0;g=H[b+28>>2]+N(H[(H[s+24>>2]+N(C,52)|0)+36>>2],152)|0;i=H[g+136>>2];h=H[g+144>>2];q=H[g+140>>2];g=H[g+148>>2];Ca(H[b+52>>2]);H[b+52>>2]=0;V:{p=H[D+68>>2];if((h|0)==(i|0)|(g|0)==(q|0)|(H[p+(C<<2)>>2]?0:p)){break V}g=g-q|0;i=h-i|0;re(g,0,i);if(qa){Ba(f,1,2982,0);break b}g=N(g,i);if(g>>>0>=1073741824){Ba(f,1,2982,0);break b}i=b;b=Ia(g<<2);H[i+52>>2]=b;if(b){break V}Ba(f,1,2982,0);break b}C=C+1|0;s=H[D+24>>2];if(C>>>0>2]){continue}break}}s=H[D+32>>2];v=H[H[D+20>>2]>>2];if(H[v+16>>2]){C=H[v+20>>2];s=H[s+5584>>2];A=H[H[D+24>>2]+24>>2];p=0;while(1){W:{b=H[D+68>>2];if(H[b+(p<<2)>>2]?0:b){break W}j=H[A+36>>2]+1|0;if(H[s+20>>2]==1){Y=j;b=0;_=na-32|0;na=_;X:{Y:{if(H[D+64>>2]){g=1;if((j|0)==1){break X}k=H[C+28>>2];b=k+N(H[C+24>>2],152)|0;h=H[b-144>>2];q=H[b-152>>2];if((h|0)==(q|0)){break X}n=j-1|0;b=0;m=H[D+44>>2];l=H[m+4>>2];i=k;Z:{if((j|0)!=2){j=n&1;r=n&-2;g=0;while(1){u=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+312>>2]-H[i+304>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+316>>2]-H[i+308>>2]|0;b=b>>>0>u>>>0?b:u;i=i+304|0;g=g+2|0;if((r|0)!=(g|0)){continue}break}if(!j){break Z}}g=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>g>>>0?b:g}g=0;if(b>>>0>134217727){break X}i=H[k+4>>2];u=H[k+12>>2];t=H[k>>2];E=H[k+8>>2];o=b<<5;j=ob(o);H[_+16>>2]=j;if(!j){break X}r=h-q|0;g=u-i|0;q=E-t|0;H[_>>2]=j;while(1){u=H[C+36>>2];h=g;H[_+8>>2]=g;b=q;H[_+24>>2]=b;g=H[k+156>>2];i=H[k+164>>2];q=H[k+160>>2];t=H[k+152>>2];H[_+28>>2]=(t|0)%2;q=q-t|0;H[_+20>>2]=q-b;x=(l|0)<2;g=i-g|0;_:{if(!(!x&g>>>0>1)){i=0;if(!g){break _}while(1){$b(_+16|0,u+(N(i,r)<<2)|0);i=i+1|0;if((i|0)!=(g|0)){continue}break}break _}t=g>>>0>>0?g:l;Y=t-1|0;E=(g>>>0)/(t>>>0)|0;b=0;while(1){i=Fa(36);if(!i){break Y}w=H[_+28>>2];H[i+8>>2]=H[_+24>>2];H[i+12>>2]=w;w=H[_+20>>2];H[i>>2]=H[_+16>>2];H[i+4>>2]=w;H[i+24>>2]=u;H[i+20>>2]=r;H[i+16>>2]=q;H[i+28>>2]=N(b,E);w=(b|0)==(Y|0);b=b+1|0;H[i+32>>2]=w?g:N(E,b);w=ob(o);H[i>>2]=w;if(!w){g=0;Sa(m);Ca(i);Ca(j);break X}eb(m,10,i);if((b|0)!=(t|0)){continue}break}Sa(m)}H[_+4>>2]=g-h;H[_+12>>2]=H[k+156>>2]%2;$:{if(!(!x&q>>>0>1)){b=8;i=0;if(q>>>0>=8){while(1){nb(_,u+(i<<2)|0,r,8);i=b;b=b+8|0;if(q>>>0>=b>>>0){continue}break}}if(i>>>0>=q>>>0){break $}nb(_,u+(i<<2)|0,r,q-i|0);break $}h=l>>>0>q>>>0?q:l;E=h-1|0;t=(q>>>0)/(h>>>0)|0;b=0;while(1){i=Fa(36);if(!i){break Y}x=H[_+12>>2];H[i+8>>2]=H[_+8>>2];H[i+12>>2]=x;x=H[_+4>>2];H[i>>2]=H[_>>2];H[i+4>>2]=x;H[i+24>>2]=u;H[i+20>>2]=r;H[i+16>>2]=g;H[i+28>>2]=N(b,t);x=(b|0)==(E|0);b=b+1|0;H[i+32>>2]=x?q:N(t,b);x=ob(o);H[i>>2]=x;if(!x){g=0;Sa(m);Ca(i);Ca(j);break X}eb(m,11,i);if((b|0)!=(h|0)){continue}break}Sa(m)}k=k+152|0;n=n-1|0;if(n){continue}break}g=1;Ca(j);break X}g=1;k=H[C+28>>2];ma=k+N(Y,152)|0;gb=ma-152|0;if(H[gb>>2]==H[ma-144>>2]){break X}hb=ma-148|0;if(H[hb>>2]==H[ma-140>>2]){break X}h=H[k+4>>2];q=H[k+12>>2];n=H[k>>2];j=H[k+8>>2];w=H[C+68>>2];M=H[C+64>>2];W=H[C+60>>2];J=H[C+56>>2];oa=_b(C,Y);if(!oa){g=0;break X}aa:{ba:{if((Y|0)!=1){i=k;ca:{if((Y|0)!=2){g=Y-1|0;m=g&1;l=g&-2;g=0;while(1){r=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+312>>2]-H[i+304>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+316>>2]-H[i+308>>2]|0;b=b>>>0>r>>>0?b:r;i=i+304|0;g=g+2|0;if((l|0)!=(g|0)){continue}break}if(!m){break ca}}g=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>g>>>0?b:g}if(b>>>0>=268435456){break aa}o=ob(b<<4);if(!o){break aa}da:{if(!Y){break da}u=q-h|0;m=j-n|0;ib=o+28|0;$=o+24|0;Ra=o+16|0;ha=o+4|0;sa=1;ea:while(1){b=H[k+156>>2];ja=(b|0)%2|0;g=H[k+152>>2];pa=(g|0)%2|0;Z=H[k+164>>2]-b|0;ka=Z-u|0;R=H[k+160>>2]-g|0;da=R-m|0;i=J;g=i;t=W;q=t;b=M;fa=b;h=w;n=h;j=H[C+20>>2];fa:{if((j|0)==(sa|0)){break fa}r=j-sa|0;q=0;g=0;if(i){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=i+(g^-1)|0;g=l^-1;i=b>>>0>>0?g+1|0:g;g=r&31;if((r&63)>>>0>=32){g=i>>>g|0}else{g=((1<>>g}}if(W){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=W+(i^-1)|0;i=l^-1;h=b>>>0>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){q=h>>>i|0}else{q=((1<>>i}}h=0;b=0;if(M){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=M+(i^-1)|0;i=l^-1;n=b>>>0>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){b=n>>>i|0}else{b=((1<>>i}}if(w){i=r&31;if((r&63)>>>0>=32){l=-1<>>32-i}i=w+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=r&31;if((r&63)>>>0>=32){h=n>>>h|0}else{h=((1<>>h}}fa=0;i=0;E=1<>>0>>0){i=r&31;if((r&63)>>>0>=32){l=-1<>>32-i}n=n^-1;i=n+(J-E|0)|0;j=l^-1;j=i>>>0>>0?j+1|0:j;n=r&31;if((r&63)>>>0>=32){i=j>>>n|0}else{i=((1<>>n}}if(E>>>0>>0){n=r&31;if((r&63)>>>0>=32){l=-1<>>32-n}j=j^-1;n=j+(M-E|0)|0;l=l^-1;l=j>>>0>n>>>0?l+1|0:l;j=r&31;if((r&63)>>>0>=32){fa=l>>>j|0}else{fa=((1<>>j}}n=0;t=0;if(E>>>0>>0){j=r&31;if((r&63)>>>0>=32){l=-1<>>32-j}t=t^-1;j=t+(W-E|0)|0;l=l^-1;t=j>>>0>>0?l+1|0:l;l=r&31;if((r&63)>>>0>=32){t=t>>>l|0}else{t=((1<>>l}}if(w>>>0<=E>>>0){break fa}n=r&31;if((r&63)>>>0>=32){l=-1<>>32-n}j=j^-1;n=j+(w-E|0)|0;l=l^-1;l=j>>>0>n>>>0?l+1|0:l;j=r&31;if((r&63)>>>0>=32){n=l>>>j|0}else{n=((1<>>j}}j=H[k+180>>2];l=fa-j|0;l=l>>>0<=fa>>>0?l:0;r=l+2|0;l=l>>>0>r>>>0?-1:r;la=l>>>0>>0?l:da;l=H[k+216>>2];r=b-l|0;b=b>>>0>=r>>>0?r:0;r=b+2|0;b=b>>>0>r>>>0?-1:r;ia=b>>>0>>0?b:m;b=(pa?la:ia)<<1;r=(pa?ia:la)<<1|1;va=b>>>0>r>>>0?b:r;b=va>>>0>>0;j=i-j|0;i=i>>>0>=j>>>0?j:0;j=i-2|0;r=i>>>0>=j>>>0?j:0;i=g-l|0;g=g>>>0>=i>>>0?i:0;i=g-2|0;i=g>>>0>=i>>>0?i:0;g=(pa?r:i)<<1;l=(pa?i:r)<<1|1;x=g>>>0>>0;E=H[k+184>>2];j=q-E|0;q=j>>>0<=q>>>0?j:0;j=q-2|0;q=j>>>0<=q>>>0?j:0;ea=q;S=H[k+220>>2];j=t-S|0;j=j>>>0<=t>>>0?j:0;t=j-2|0;j=j>>>0>=t>>>0?t:0;ba=j;t=h-E|0;h=h>>>0>=t>>>0?t:0;t=h+2|0;h=h>>>0>t>>>0?-1:t;E=h>>>0>>0?h:u;Q=E;h=n-S|0;h=h>>>0<=n>>>0?h:0;n=h+2|0;h=h>>>0>n>>>0?-1:n;V=h>>>0>>0?h:ka;n=V;if(ja){ea=j;ba=q;Q=n;n=E}wa=b?va:R;l=x?g:l;kb=u+V|0;lb=j+u|0;if(Z){ta=o+(i<<3)|0;b=o+(da<<3)|0;xa=b-4|0;g=(i|0)<(da|0);Ua=g?ta+4|0:xa;ya=m-1|0;Wa=(la|0)<(ya|0)?la:ya;x=0;Xa=(m|0)>1|(da|0)>0;h=pa<<2;Ya=(ha-h|0)+(r<<3)|0;_a=h+ta|0;z=(da|0)>(ia|0)?ia:da;aa=i+1|0;$a=m+la|0;La=m+r|0;ab=o+(l<<2)|0;Ma=!m&(da|0)==1;h=o+(m<<3)|0;ga=h-8|0;Ga=h-4|0;Ka=b-8|0;Na=o+(wa<<2)|0;bb=Na-4|0;cb=(o+((g?i:da)<<3)|0)-4|0;while(1){ga:{if(!(x>>>0>>0&q>>>0<=x>>>0|x>>>0>>0&x>>>0>=lb>>>0)){S=x+1|0;break ga}if(R>>>0>va>>>0){H[bb>>2]=0;H[Na>>2]=0}S=x+1|0;Oa(oa,i,x,ia,S,_a,2,0);Oa(oa,La,x,$a,S,Ya,2,0);ha:{ia:{ja:{if(!pa){if(!Xa){break ha}if((i|0)>=(ia|0)){break ia}ka:{la:{if((i|0)>0){b=H[cb>>2];break la}b=H[ha>>2];g=b;if((i|0)<0){break ka}}g=b;b=H[Ua>>2]}H[ta>>2]=H[ta>>2]-((b+g|0)+2>>2);b=aa;h=b;g=i;if((b|0)>=(z|0)){break ja}while(1){b=g;g=h;h=o+(g<<3)|0;H[h>>2]=H[h>>2]-((H[(o+(b<<3)|0)+4>>2]+H[h+4>>2]|0)+2>>2);h=g+1|0;if((z|0)!=(h|0)){continue}break}b=z;break ja}ma:{if(!Ma){b=i;if((ia|0)<=(b|0)){break ma}while(1){g=o+(b<<3)|0;h=H[g+4>>2];t=Ka;na:{oa:{if((b|0)>=0){fa=H[((b|0)<(da|0)?g:Ka)>>2];b=b+1|0;break oa}fa=H[o>>2];if((b|0)!=-1){b=b+1|0;t=o;break na}b=0}if((b|0)>=(da|0)){break na}t=o+(b<<3)|0}H[g+4>>2]=h-((H[t>>2]+fa|0)+2>>2);if((b|0)<(ia|0)){continue}break}break ma}H[o>>2]=H[o>>2]/2;break ha}b=r;if((la|0)<=(b|0)){break ha}while(1){g=o+(b<<3)|0;h=H[g>>2];pa:{if((b|0)<0){t=H[ha>>2];fa=ha;break pa}t=H[((b|0)<(m|0)?g+4|0:Ga)>>2];fa=ha;if(!b){break pa}fa=(b|0)>(m|0)?Ga:g-4|0}H[g>>2]=h+(H[fa>>2]+t>>1);b=b+1|0;if((la|0)!=(b|0)){continue}break}break ha}if((b|0)>=(ia|0)){break ia}while(1){g=o+(b<<3)|0;t=H[g>>2];qa:{ra:{if((b|0)>0){h=H[(o+(((b|0)<(da|0)?b:da)<<3)|0)-4>>2];break ra}h=H[ha>>2];fa=ha;if((b|0)<0){break qa}}fa=xa;if((b|0)>=(da|0)){break qa}fa=(o+(b<<3)|0)+4|0}H[g>>2]=t-((H[fa>>2]+h|0)+2>>2);b=b+1|0;if((ia|0)!=(b|0)){continue}break}}if((r|0)>=(la|0)){break ha}b=r;if((ya|0)>(b|0)){while(1){g=o+(b<<3)|0;b=b+1|0;H[g+4>>2]=H[g+4>>2]+(H[o+(b<<3)>>2]+H[g>>2]>>1);if((b|0)<(Wa|0)){continue}break}}if((b|0)>=(la|0)){break ha}while(1){g=ga;t=b;sa:{ta:{if((b|0)>=0){h=H[((b|0)<(m|0)?o+(b<<3)|0:g)>>2];b=b+1|0;break ta}h=H[o>>2];if((t|0)!=-1){b=t+1|0;g=o;break sa}b=0}if((m|0)<=(b|0)){break sa}g=o+(b<<3)|0}t=o+(t<<3)|0;H[t+4>>2]=H[t+4>>2]+(H[g>>2]+h>>1);if((b|0)<(la|0)){continue}break}}if(!Za(oa,l,x,wa,S,ab,1,0)){break ba}}x=S;if((Z|0)!=(x|0)){continue}break}}k=k+152|0;b=Q<<1;g=n<<1|1;b=b>>>0>g>>>0?b:g;Ua=b>>>0>>0?b:Z;Q=o+(q<<5)|0;b=o+(ka<<5)|0;va=b-4|0;g=(q|0)<(ka|0);Wa=g?Q+28|0:va;ya=b-8|0;Xa=g?Q+24|0:ya;Ga=b-12|0;Ya=g?Q+20|0:Ga;Ka=b-16|0;_a=(q|0)<0?Ra:g?Q+16|0:Ka;xa=u-1|0;$a=(V|0)<(xa|0)?V:xa;i=o+((g?q:ka)<<5)|0;La=(q|0)<=0;ab=La?Ra:i-16|0;Ma=(ka|0)>0;Na=Ma|(u|0)>1;bb=Q+(ja<<4)|0;cb=(o+(4-(ja<<2)<<2)|0)+(j<<5)|0;n=(E|0)<(ka|0)?E:ka;r=q+1|0;g=ea<<1;h=ba<<1|1;mb=g>>>0>>0?g:h;qb=o+(mb<<4)|0;rb=!u&(ka|0)==1;g=o+(u<<5)|0;S=g-20|0;z=g-24|0;ea=g-28|0;ba=g-32|0;aa=g-4|0;ga=g-8|0;da=g-12|0;la=g-16|0;ia=b-20|0;fa=b-24|0;pa=b-28|0;ta=b-32|0;sb=i-4|0;x=i-8|0;tb=i-12|0;while(1){ua:{va:{wa:{xa:{m=l;if(m>>>0>>0){b=wa-m|0;l=m+(b>>>0>=4?4:b)|0;Oa(oa,m,q,l,E,bb,1,8);Oa(oa,m,lb,l,kb,cb,1,8);if(!ja){if(!Na){break ua}if((q|0)>=(E|0)){break va}H[Q>>2]=H[Q>>2]-((H[ab>>2]+H[_a>>2]|0)+2>>2);ya:{if(!La){b=H[tb>>2];h=x;g=sb;break ya}b=H[o+20>>2];if((q|0)<0){break xa}h=$;g=ib}H[Q+4>>2]=H[Q+4>>2]-((H[Ya>>2]+b|0)+2>>2);H[Q+8>>2]=H[Q+8>>2]-((H[h>>2]+H[Xa>>2]|0)+2>>2);b=H[Wa>>2];g=H[g>>2];break wa}if(rb){H[o>>2]=H[o>>2]/2;H[o+4>>2]=H[o+4>>2]/2;H[o+8>>2]=H[o+8>>2]/2;H[o+12>>2]=H[o+12>>2]/2;break ua}g=q;if((E|0)>(g|0)){while(1){b=o+(g<<5)|0;za:{if((g|0)<0){h=H[o>>2];i=Ma|(g|0)!=-1;H[b+16>>2]=H[b+16>>2]-(((i?h:H[ta>>2])+h|0)+2>>2);h=H[ha>>2];H[b+20>>2]=H[b+20>>2]-(((i?h:H[pa>>2])+h|0)+2>>2);h=H[o+8>>2];H[b+24>>2]=H[b+24>>2]-(((i?h:H[fa>>2])+h|0)+2>>2);h=b;t=H[b+28>>2];b=H[o+12>>2];H[h+28>>2]=t-(((i?b:H[ia>>2])+b|0)+2>>2);g=g+1|0;break za}i=g+1|0;Aa:{if((i|0)<(ka|0)){g=o+(i<<5)|0;H[b+16>>2]=H[b+16>>2]-((H[b>>2]+H[g>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[g+4>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[g+8>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[g+12>>2]|0)+2>>2);break Aa}h=H[b+16>>2];if((g|0)>=(ka|0)){H[b+16>>2]=h-((H[ta>>2]<<1)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[pa>>2]<<1)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[fa>>2]<<1)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[ia>>2]<<1)+2>>2);break Aa}H[b+16>>2]=h-((H[b>>2]+H[ta>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[pa>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[fa>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[ia>>2]|0)+2>>2)}g=i}if((E|0)!=(g|0)){continue}break}}g=j;if((V|0)<=(g|0)){break ua}while(1){b=o+(g<<5)|0;Ba:{if((g|0)<0){H[b>>2]=H[b>>2]+(H[o+16>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[o+20>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[o+24>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[o+28>>2]<<1>>1);break Ba}i=H[b>>2];if(!g){h=(g|0)<(u|0);H[b>>2]=i+(H[o+16>>2]+H[(h?b+16|0:la)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[o+20>>2]+H[(h?b+20|0:da)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[o+24>>2]+H[(h?b+24|0:ga)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[o+28>>2]+H[(h?b+28|0:aa)>>2]>>1);break Ba}if((g|0)<=(u|0)){h=(g|0)<(u|0);H[b>>2]=i+(H[b-16>>2]+H[(h?b+16|0:la)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[b-12>>2]+H[(h?b+20|0:da)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[b-8>>2]+H[(h?b+24|0:ga)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[b-4>>2]+H[(h?b+28|0:aa)>>2]>>1);break Ba}H[b>>2]=i+(H[la>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[da>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[ga>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[aa>>2]<<1>>1)}g=g+1|0;if((V|0)!=(g|0)){continue}break}break ua}m=R;u=Z;sa=sa+1|0;if((Y|0)!=(sa|0)){continue ea}break da}H[Q+4>>2]=H[Q+4>>2]-((b<<1)+2>>2);H[Q+8>>2]=H[Q+8>>2]-((H[$>>2]<<1)+2>>2);b=H[ib>>2];g=b}H[Q+12>>2]=H[Q+12>>2]-((b+g|0)+2>>2);i=q;b=r;g=b;if((b|0)<(n|0)){while(1){g=o+(b<<5)|0;i=o+(i<<5)|0;H[g>>2]=H[g>>2]-((H[i+16>>2]+H[g+16>>2]|0)+2>>2);H[g+4>>2]=H[g+4>>2]-((H[i+20>>2]+H[g+20>>2]|0)+2>>2);H[g+8>>2]=H[g+8>>2]-((H[i+24>>2]+H[g+24>>2]|0)+2>>2);H[g+12>>2]=H[g+12>>2]-((H[i+28>>2]+H[g+28>>2]|0)+2>>2);i=b;b=b+1|0;if((n|0)!=(b|0)){continue}break}g=n}if((g|0)>=(E|0)){break va}while(1){b=o+(g<<5)|0;i=(g|0)<(ka|0);Ca:{if((g|0)<=0){h=H[Ra>>2];if((g|0)>=0){H[b>>2]=H[b>>2]-((h+H[(i?b+16|0:Ka)>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[o+20>>2]+H[(i?b+20|0:Ga)>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[o+24>>2]+H[(i?b+24|0:ya)>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[o+28>>2]+H[(i?b+28|0:va)>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((h<<1)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[o+20>>2]<<1)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[o+24>>2]<<1)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[o+28>>2]<<1)+2>>2);break Ca}h=o+((i?g:ka)<<5)|0;t=H[h-16>>2];if(!i){H[b>>2]=H[b>>2]-((t+H[Ka>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[Ga>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[ya>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[va>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((t+H[b+16>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[b+20>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[b+24>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[b+28>>2]|0)+2>>2)}g=g+1|0;if((E|0)!=(g|0)){continue}break}}if((j|0)>=(V|0)){break ua}g=j;if((xa|0)>(g|0)){while(1){b=o+(g<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[b+32>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[b+36>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[b+40>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[b+44>>2]+H[b+12>>2]>>1);g=g+1|0;if(($a|0)>(g|0)){continue}break}}if((g|0)>=(V|0)){break ua}while(1){b=o+(g<<5)|0;Da:{Ea:{Fa:{if((g|0)<0){i=H[o>>2];if((g|0)!=-1){break Fa}if((u|0)<=0){H[b+16>>2]=H[b+16>>2]+(i+H[ba>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[ea>>2]+H[o+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[z>>2]+H[o+8>>2]>>1);t=H[o+12>>2];i=H[S>>2];break Ea}break Fa}i=g+1|0;Ga:{if((i|0)<(u|0)){g=o+(i<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[g>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[g+4>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[g+8>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[g+12>>2]+H[b+12>>2]>>1);break Ga}if((g|0)>=(u|0)){H[b+16>>2]=H[b+16>>2]+H[ba>>2];H[b+20>>2]=H[b+20>>2]+H[ea>>2];H[b+24>>2]=H[b+24>>2]+H[z>>2];H[b+28>>2]=H[b+28>>2]+H[S>>2];break Ga}H[b+16>>2]=H[b+16>>2]+(H[ba>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[ea>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[z>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[S>>2]+H[b+12>>2]>>1)}g=i;break Da}H[b+16>>2]=i+H[b+16>>2];H[b+20>>2]=H[b+20>>2]+H[o+4>>2];H[b+24>>2]=H[b+24>>2]+H[o+8>>2];t=H[o+12>>2];i=t}H[b+28>>2]=H[b+28>>2]+(i+t>>1);g=g+1|0}if((V|0)!=(g|0)){continue}break}}if(Za(oa,m,mb,l,Ua,qb,1,4)){continue}break}break}break ba}Ca(o);g=1}b=H[ma-16>>2];i=H[gb>>2];h=H[hb>>2];q=H[ma-8>>2];Oa(oa,b-i|0,H[ma-12>>2]-h|0,q-i|0,H[ma-4>>2]-h|0,H[C+52>>2],1,q-b|0);Va(oa);break X}Va(oa);Ca(o);g=0;break X}Va(oa);g=0;break X}g=0;Sa(m);Ca(j)}na=_+32|0;if(g){break W}break b}h=0;J=na+-64|0;na=J;Ha:{Ia:{if(H[D+64>>2]){r=H[C+28>>2];i=r+N(H[C+24>>2],152)|0;k=H[i-152>>2];o=1;x=H[D+44>>2];M=H[x+4>>2];if((j|0)==1){break Ha}t=j-1|0;b=r;Ja:{if((j|0)!=2){q=t&1;n=t&-2;g=0;while(1){j=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>j>>>0?h:j;b=b+304|0;g=g+2|0;if((n|0)!=(g|0)){continue}break}if(!q){break Ja}}g=H[b+160>>2]-H[b+152>>2]|0;g=g>>>0>>0?h:g;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?g:b}o=0;if(h>>>0>134217727){break Ha}b=H[i-144>>2];g=H[r+4>>2];i=H[r+12>>2];n=H[r>>2];j=H[r+8>>2];$=h<<5;E=Ia($);H[J+32>>2]=E;if(!E){break Ha}q=i-g|0;i=j-n|0;g=M>>>1|0;ea=g>>>0<=2?2:g;u=b-k|0;aa=u<<5;ga=N(u,28);_=N(u,24);da=N(u,20);ka=u<<4;W=N(u,12);Z=u<<3;H[J>>2]=E;ba=E+32|0;b=H[C+36>>2];while(1){l=q;H[J+8>>2]=l;h=i;H[J+40>>2]=h;Y=H[r+156>>2];w=H[r+164>>2];n=H[r+160>>2];g=H[r+152>>2];H[J+56>>2]=0;H[J+52>>2]=h;H[J+48>>2]=0;R=(g|0)%2|0;H[J+44>>2]=R;i=n-g|0;j=i-h|0;H[J+60>>2]=j;H[J+36>>2]=j;S=(M|0)<2;q=w-Y|0;Ka:{if(!(!S&q>>>0>15)){o=0;k=b;if(q>>>0<8){break Ka}m=i&-2;Q=i&1;j=0;R=(n|0)==(g+1|0);while(1){g=J+32|0;zb(g,k,u,8);Ta(g);if(i){h=0;o=0;La:{if(!R){while(1){g=(h<<2)+k|0;n=E+(h<<5)|0;L[g>>2]=L[n>>2];z=u<<2;L[z+g>>2]=L[n+4>>2];L[g+Z>>2]=L[n+8>>2];L[g+W>>2]=L[n+12>>2];n=h|1;g=(n<<2)+k|0;n=E+(n<<5)|0;L[g>>2]=L[n>>2];L[g+z>>2]=L[n+4>>2];L[g+Z>>2]=L[n+8>>2];L[g+W>>2]=L[n+12>>2];h=h+2|0;o=o+2|0;if((m|0)!=(o|0)){continue}break}if(!Q){break La}}g=(h<<2)+k|0;h=E+(h<<5)|0;L[g>>2]=L[h>>2];L[g+(u<<2)>>2]=L[h+4>>2];L[g+Z>>2]=L[h+8>>2];L[g+W>>2]=L[h+12>>2]}h=0;while(1){g=(h<<2)+k|0;n=E+(h<<5)|0;L[g+ka>>2]=L[n+16>>2];L[g+da>>2]=L[n+20>>2];L[g+_>>2]=L[n+24>>2];L[g+ga>>2]=L[n+28>>2];h=h+1|0;if((i|0)!=(h|0)){continue}break}}k=k+aa|0;g=j+15|0;o=j+8|0;j=o;if(g>>>0>>0){continue}break}break Ka}g=q>>>3|0;m=g>>>0>>0?g:M;Q=(q>>>0)/(m>>>0)&-8;o=q&-8;g=0;k=b;while(1){n=Fa(48);if(!n){break Ia}z=Ia($);H[n>>2]=z;if(!z){o=0;Sa(x);Ca(n);Ca(E);break Ha}H[n+40>>2]=k;H[n+36>>2]=u;H[n+32>>2]=i;H[n+28>>2]=j;H[n+24>>2]=0;H[n+20>>2]=h;H[n+16>>2]=0;H[n+12>>2]=R;H[n+8>>2]=h;H[n+4>>2]=j;V=o-N(g,Q)|0;g=g+1|0;z=(m|0)==(g|0)?V:Q;H[n+44>>2]=z;eb(x,12,n);k=(N(u,z)<<2)+k|0;if((g|0)!=(m|0)){continue}break}Sa(x)}Ma:{if(o>>>0>=q>>>0){break Ma}h=J+32|0;g=q-o|0;zb(h,k,u,g);Ta(h);if(!i){break Ma}R=g&-4;Q=g&3;m=0;z=Y+(o-w|0)>>>0>4294967292;while(1){j=(m<<2)+k|0;o=E+(m<<5)|0;h=0;n=0;g=0;Na:{if(!z){while(1){L[j+(N(h,u)<<2)>>2]=L[o+(h<<2)>>2];g=h|1;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=h|2;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=h|3;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];h=h+4|0;n=n+4|0;if((R|0)!=(n|0)){continue}break}g=h;if(!Q){break Na}}h=0;while(1){L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=g+1|0;h=h+1|0;if((Q|0)!=(h|0)){continue}break}}m=m+1|0;if((m|0)!=(i|0)){continue}break}}n=q-l|0;H[J+4>>2]=n;g=H[r+156>>2];H[J+28>>2]=n;H[J+24>>2]=0;H[J+20>>2]=l;H[J+16>>2]=0;Q=(g|0)%2|0;H[J+12>>2]=Q;Oa:{if(!(!S&i>>>0>15)){g=b;if(i>>>0<8){break Oa}oa=q&-2;la=q&1;ia=n&-2;ha=n&1;V=l&-2;ma=l&1;h=Q<<5;R=ba-h|0;S=h+E|0;fa=N(l,u)<<2;pa=w-1|0;sa=(pa|0)==(l+Y|0);j=i;while(1){h=0;k=0;Pa:{Qa:{switch(l|0){default:while(1){m=(N(h,u)<<2)+g|0;z=H[m+28>>2];o=S+(h<<6)|0;H[o+24>>2]=H[m+24>>2];H[o+28>>2]=z;z=H[m+20>>2];H[o+16>>2]=H[m+16>>2];H[o+20>>2]=z;z=H[m+12>>2];H[o+8>>2]=H[m+8>>2];H[o+12>>2]=z;z=H[m+4>>2];H[o>>2]=H[m>>2];H[o+4>>2]=z;o=h|1;m=S+(o<<6)|0;o=(N(o,u)<<2)+g|0;z=H[o+28>>2];H[m+24>>2]=H[o+24>>2];H[m+28>>2]=z;z=H[o+20>>2];H[m+16>>2]=H[o+16>>2];H[m+20>>2]=z;z=H[o+12>>2];H[m+8>>2]=H[o+8>>2];H[m+12>>2]=z;z=H[o+4>>2];H[m>>2]=H[o>>2];H[m+4>>2]=z;h=h+2|0;k=k+2|0;if((V|0)!=(k|0)){continue}break};if(!ma){break Pa}break;case 0:break Pa;case 1:break Qa}}k=S+(h<<6)|0;h=(N(h,u)<<2)+g|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}Ra:{if((l|0)==(q|0)){break Ra}z=g+fa|0;h=0;m=0;if(!sa){while(1){k=z+(N(h,u)<<2)|0;ja=H[k+28>>2];o=R+(h<<6)|0;H[o+24>>2]=H[k+24>>2];H[o+28>>2]=ja;ja=H[k+20>>2];H[o+16>>2]=H[k+16>>2];H[o+20>>2]=ja;ja=H[k+12>>2];H[o+8>>2]=H[k+8>>2];H[o+12>>2]=ja;ja=H[k+4>>2];H[o>>2]=H[k>>2];H[o+4>>2]=ja;o=h|1;k=R+(o<<6)|0;o=z+(N(o,u)<<2)|0;ja=H[o+28>>2];H[k+24>>2]=H[o+24>>2];H[k+28>>2]=ja;ja=H[o+20>>2];H[k+16>>2]=H[o+16>>2];H[k+20>>2]=ja;ja=H[o+12>>2];H[k+8>>2]=H[o+8>>2];H[k+12>>2]=ja;ja=H[o+4>>2];H[k>>2]=H[o>>2];H[k+4>>2]=ja;h=h+2|0;m=m+2|0;if((ia|0)!=(m|0)){continue}break}if(!ha){break Ra}}k=R+(h<<6)|0;h=z+(N(h,u)<<2)|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}Ta(J);Sa:{if(!q){break Sa}h=0;k=0;if((Y|0)!=(pa|0)){while(1){m=E+(h<<5)|0;z=H[m+28>>2];o=(N(h,u)<<2)+g|0;H[o+24>>2]=H[m+24>>2];H[o+28>>2]=z;z=H[m+20>>2];H[o+16>>2]=H[m+16>>2];H[o+20>>2]=z;z=H[m+12>>2];H[o+8>>2]=H[m+8>>2];H[o+12>>2]=z;z=H[m+4>>2];H[o>>2]=H[m>>2];H[o+4>>2]=z;o=h|1;m=(N(o,u)<<2)+g|0;o=E+(o<<5)|0;z=H[o+28>>2];H[m+24>>2]=H[o+24>>2];H[m+28>>2]=z;z=H[o+20>>2];H[m+16>>2]=H[o+16>>2];H[m+20>>2]=z;z=H[o+12>>2];H[m+8>>2]=H[o+8>>2];H[m+12>>2]=z;z=H[o+4>>2];H[m>>2]=H[o>>2];H[m+4>>2]=z;h=h+2|0;k=k+2|0;if((oa|0)!=(k|0)){continue}break}if(!la){break Sa}}k=(N(h,u)<<2)+g|0;h=E+(h<<5)|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}g=g+32|0;j=j-8|0;if(j>>>0>7){continue}break}break Oa}g=i>>>3|0;k=g>>>0>>0?g:ea;m=(i>>>0)/(k>>>0)&-8;o=i&-8;j=0;g=b;while(1){h=Fa(48);if(!h){break Ia}R=Ia($);H[h>>2]=R;if(!R){o=0;Sa(x);Ca(h);Ca(E);break Ha}H[h+40>>2]=g;H[h+36>>2]=u;H[h+32>>2]=q;H[h+28>>2]=n;H[h+24>>2]=0;H[h+20>>2]=l;H[h+16>>2]=0;H[h+12>>2]=Q;H[h+8>>2]=l;H[h+4>>2]=n;V=o-N(j,m)|0;j=j+1|0;R=(k|0)==(j|0)?V:m;H[h+44>>2]=R;eb(x,13,h);g=(R<<2)+g|0;if((k|0)!=(j|0)){continue}break}Sa(x)}j=i&7;Ta:{if(!j){break Ta}Q=Q<<5;Ua:{if(!l){break Ua}m=E+Q|0;k=j<<2;h=0;if((l|0)!=1){R=l&1;S=l&-2;o=0;while(1){z=!k;if(!z){B(m+(h<<6)|0,(N(h,u)<<2)+g|0,k)}if(!z){z=h|1;B(m+(z<<6)|0,(N(u,z)<<2)+g|0,k)}h=h+2|0;o=o+2|0;if((S|0)!=(o|0)){continue}break}if(!R){break Ua}}if(!k){break Ua}B(m+(h<<6)|0,(N(h,u)<<2)+g|0,k)}Va:{if((l|0)==(q|0)){break Va}m=ba-Q|0;Q=(N(l,u)<<2)+g|0;k=j<<2;h=0;if((Y|0)!=(w+(l^-1)|0)){l=n&1;n=n&-2;o=0;while(1){R=!k;if(!R){B(m+(h<<6)|0,Q+(N(h,u)<<2)|0,k)}if(!R){R=h|1;B(m+(R<<6)|0,Q+(N(u,R)<<2)|0,k)}h=h+2|0;o=o+2|0;if((n|0)!=(o|0)){continue}break}if(!l){break Va}}if(!k){break Va}B(m+(h<<6)|0,Q+(N(h,u)<<2)|0,k)}Ta(J);if(!q){break Ta}k=j<<2;h=0;if((w|0)!=(Y+1|0)){n=q&1;j=q&-2;o=0;while(1){m=!k;if(!m){B((N(h,u)<<2)+g|0,E+(h<<5)|0,k)}if(!m){m=h|1;B((N(m,u)<<2)+g|0,E+(m<<5)|0,k)}h=h+2|0;o=o+2|0;if((j|0)!=(o|0)){continue}break}if(!n){break Ta}}if(!k){break Ta}B((N(h,u)<<2)+g|0,E+(h<<5)|0,k)}r=r+152|0;t=t-1|0;if(t){continue}break}o=1;Ca(E);break Ha}o=1;q=H[C+28>>2];Q=q+N(j,152)|0;da=Q-152|0;if(H[da>>2]==H[Q-144>>2]){break Ha}ka=Q-148|0;if(H[ka>>2]==H[Q-140>>2]){break Ha}g=H[q+4>>2];i=H[q+12>>2];k=H[q>>2];n=H[q+8>>2];t=H[C+68>>2];E=H[C+64>>2];x=H[C+60>>2];Y=H[C+56>>2];Z=_b(C,j);if(!Z){o=0;break Ha}if((j|0)==1){b=H[Q-16>>2];g=H[da>>2];i=H[ka>>2];h=H[Q-8>>2];Oa(Z,b-g|0,H[Q-12>>2]-i|0,h-g|0,H[Q-4>>2]-i|0,H[C+52>>2],1,h-b|0);Va(Z);break Ha}b=q;Wa:{if((j|0)!=2){h=j-1|0;m=h&1;l=h&-2;h=0;o=0;while(1){r=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>r>>>0?h:r;b=b+304|0;o=o+2|0;if((l|0)!=(o|0)){continue}break}if(!m){break Wa}}m=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>m>>>0?h:m;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?h:b}Xa:{if(h>>>0>=134217728){break Xa}R=Ia(h<<5);H[J+32>>2]=R;if(!R){break Xa}H[J>>2]=R;Ya:{if(j){r=i-g|0;b=n-k|0;oa=R+32|0;W=j;la=H[C+20>>2];z=1;ea=0;while(1){H[J+8>>2]=r;H[J+40>>2]=b;i=H[q+164>>2];h=H[q+160>>2];g=H[q+156>>2];k=H[q+152>>2];$=(k|0)%2|0;H[J+44>>2]=$;ia=(g|0)%2|0;H[J+12>>2]=ia;M=h-k|0;ba=M-b|0;H[J+36>>2]=ba;k=i-g|0;ha=k-r|0;H[J+4>>2]=ha;i=Y;o=i;h=x;g=h;j=E;m=j;n=t;u=n;Za:{if(!ea&(z|0)==(la|0)){break Za}w=la-z|0;g=0;o=0;if(i){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=Y+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){o=n>>>h|0}else{o=((1<>>h}}if(x){g=w&31;if((w&63)>>>0>=32){l=-1<>>32-g}g=x+(i^-1)|0;i=l^-1;h=g>>>0>>0?i+1|0:i;i=w&31;if((w&63)>>>0>=32){g=h>>>i|0}else{g=((1<>>i}}n=0;j=0;if(E){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=E+(h^-1)|0;h=l^-1;j=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){j=j>>>h|0}else{j=((1<>>h}}if(t){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=t+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){n=n>>>h|0}else{n=((1<>>h}}m=0;i=0;S=1<>>0>>0){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}h=h^-1;i=h+(Y-S|0)|0;l=l^-1;l=h>>>0>i>>>0?l+1|0:l;h=w&31;if((w&63)>>>0>=32){i=l>>>h|0}else{i=((1<>>h}}if(E>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<>>32-h}m=m^-1;h=m+(E-S|0)|0;l=l^-1;l=h>>>0>>0?l+1|0:l;m=w&31;if((w&63)>>>0>=32){m=l>>>m|0}else{m=((1<>>m}}u=0;h=0;if(x>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<>>32-h}aa=aa^-1;h=aa+(x-S|0)|0;l=l^-1;aa=h>>>0>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){h=aa>>>l|0}else{h=((1<>>l}}if(t>>>0<=S>>>0){break Za}l=w&31;if((w&63)>>>0>=32){l=-1<>>32-l}aa=u^-1;u=aa+(t-S|0)|0;l=l^-1;S=u>>>0>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){u=S>>>l|0}else{u=((1<>>l}}l=H[q+180>>2];w=m-l|0;m=m>>>0>=w>>>0?w:0;w=m+4|0;m=m>>>0>w>>>0?-1:w;ga=m>>>0>>0?m:ba;m=H[q+216>>2];w=j-m|0;j=j>>>0>=w>>>0?w:0;w=j+4|0;j=j>>>0>w>>>0?-1:w;_=b>>>0>j>>>0?j:b;j=($?ga:_)<<1;w=($?_:ga)<<1|1;j=j>>>0>w>>>0?j:w;S=j>>>0>>0;l=i-l|0;i=i>>>0>=l>>>0?l:0;l=i-4|0;ba=i>>>0>=l>>>0?l:0;i=o-m|0;i=i>>>0<=o>>>0?i:0;m=i-4|0;aa=i>>>0>=m>>>0?m:0;V=($?ba:aa)<<1;ma=($?aa:ba)<<1|1;fa=V>>>0>>0;m=H[q+184>>2];i=g-m|0;g=g>>>0>=i>>>0?i:0;i=g-4|0;i=g>>>0>=i>>>0?i:0;o=i;g=H[q+220>>2];l=h-g|0;h=h>>>0>=l>>>0?l:0;l=h-4|0;h=h>>>0>=l>>>0?l:0;l=h;m=n-m|0;n=m>>>0<=n>>>0?m:0;m=n+4|0;n=m>>>0>>0?-1:m;n=n>>>0>>0?n:r;m=n;g=u-g|0;g=g>>>0<=u>>>0?g:0;u=g+4|0;g=g>>>0>u>>>0?-1:u;w=g>>>0>>0?g:ha;u=w;if(ia){l=i;u=m;o=h;m=w}S=S?j:M;j=fa?V:ma;H[J+60>>2]=ga;H[J+56>>2]=ba;H[J+52>>2]=_;H[J+48>>2]=aa;_a:{if(k>>>0<8){b=7;g=0;break _a}g=$<<5;ha=(oa-g|0)+(ba<<6)|0;V=(g+R|0)+(aa<<6)|0;ga=b+ga|0;ma=b+ba|0;fa=r+w|0;pa=h+r|0;sa=R+(j<<5)|0;g=0;while(1){b=g|7;$a:{if(!(g>>>0>>0&b>>>0>=i>>>0|g>>>0>>0&b>>>0>=pa>>>0)){g=g+8|0;break $a}b=k-g|0;ja=b>>>0>=8?8:b;b=0;while(1){$=b+g|0;ba=$+1|0;wa=b<<2;Oa(Z,aa,$,_,ba,wa+V|0,16,0);Oa(Z,ma,$,ga,ba,ha+wa|0,16,0);b=b+1|0;if((ja|0)!=(b|0)){continue}break}Ta(J+32|0);b=g;g=g+8|0;if(!Za(Z,j,b,S,g,sa,8,1)){break Ya}}b=g|7;if(k>>>0>b>>>0){continue}break}}if(!(!(g>>>0>>0&b>>>0>=i>>>0)&(r+w>>>0<=g>>>0|h+r>>>0>b>>>0)|g>>>0>=k>>>0)){b=J+32|0;$=0;ga=k-g|0;if(ga){while(1){ba=g+$|0;aa=ba+1|0;_=H[b+16>>2];ha=$<<2;Oa(Z,_,ba,H[b+20>>2],aa,ha+((H[b>>2]+(H[b+12>>2]<<5)|0)+(_<<6)|0)|0,16,0);_=H[b+24>>2];V=H[b+8>>2];Oa(Z,_+V|0,ba,V+H[b+28>>2]|0,aa,(ha+((H[b>>2]-(H[b+12>>2]<<5)|0)+(_<<6)|0)|0)+32|0,16,0);$=$+1|0;if((ga|0)!=($|0)){continue}break}}Ta(b);if(!Za(Z,j,g,S,k,R+(j<<5)|0,8,1)){break Ya}}H[J+28>>2]=w;H[J+24>>2]=h;H[J+20>>2]=n;H[J+16>>2]=i;if(j>>>0>>0){b=m<<1;g=u<<1|1;b=b>>>0>g>>>0?b:g;g=b>>>0>>0?b:k;b=ia<<5;m=(oa-b|0)+(h<<6)|0;u=(b+R|0)+(i<<6)|0;w=r+w|0;h=h+r|0;b=o<<1;l=l<<1|1;l=b>>>0>>0?b:l;r=R+(l<<5)|0;while(1){b=S-j|0;b=(b>>>0>=8?8:b)+j|0;Oa(Z,j,i,b,n,u,1,16);Oa(Z,j,h,b,w,m,1,16);Ta(J);if(!Za(Z,j,l,b,g,r,1,8)){break Ya}j=j+8|0;if(S>>>0>j>>>0){continue}break}}q=q+152|0;b=M;r=k;z=z+1|0;ea=z?ea:ea+1|0;if(ea|(z|0)!=(W|0)){continue}break}}o=1;b=H[Q-16>>2];g=H[da>>2];i=H[ka>>2];h=H[Q-8>>2];Oa(Z,b-g|0,H[Q-12>>2]-i|0,h-g|0,H[Q-4>>2]-i|0,H[C+52>>2],1,h-b|0);Va(Z);Ca(R);break Ha}Va(Z);Ca(R);o=0;break Ha}Va(Z);o=0;break Ha}o=0;Sa(x);Ca(E)}na=J- -64|0;if(o){break W}break b}s=s+1080|0;A=A+52|0;C=C+76|0;p=p+1|0;if(p>>>0>2]){continue}break}s=H[D+32>>2];v=H[H[D+20>>2]>>2]}k=H[s+16>>2];ab:{if(H[D+68>>2]|!k){break ab}A=H[v+20>>2];g=H[A+28>>2];bb:{cb:{i=H[D+64>>2];if(i){p=H[v+16>>2];if(p>>>0<3){break bb}b=H[A+24>>2];if(!((b|0)==H[A+100>>2]&(b|0)==H[A+176>>2])){Ba(f,1,10089,0);break b}h=H[H[D+24>>2]+24>>2];q=H[h+36>>2];db:{if((q|0)!=H[h+88>>2]|(q|0)!=H[h+140>>2]){break db}h=N(b,152);b=h+g|0;b=N(H[b-140>>2]-H[b-148>>2]|0,H[b-144>>2]-H[b-152>>2]|0);g=h+H[A+104>>2]|0;if((b|0)!=(N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)){break db}g=h+H[A+180>>2]|0;if((N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}p=H[v+16>>2];if(p>>>0<3){break bb}h=H[H[D+24>>2]+24>>2];b=H[h+36>>2];eb:{if((b|0)!=H[h+88>>2]){break eb}h=H[h+140>>2];if((h|0)!=(b|0)){break eb}q=N(b,152);b=g+q|0;b=N(H[b+148>>2]-H[b+140>>2]|0,H[b+144>>2]-H[b+136>>2]|0);g=q+H[A+104>>2]|0;if((b|0)!=(N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)){break eb}g=H[A+180>>2]+N(h,152)|0;if((N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}if((k|0)==2){if(!H[s+5608>>2]){break ab}i=Fa(p<<2);if(!i){break b}n=H[v+16>>2];fb:{if(!n){break fb}gb:{hb:{if(H[D+64>>2]){p=n&3;g=0;if(n>>>0>=4){break hb}C=0;break gb}p=n&3;g=0;ib:{if(n>>>0<4){C=0;break ib}k=n&-4;C=0;h=0;while(1){q=i+(C<<2)|0;H[q>>2]=H[A+52>>2];H[q+4>>2]=H[A+128>>2];H[q+8>>2]=H[A+204>>2];H[q+12>>2]=H[A+280>>2];C=C+4|0;A=A+304|0;h=h+4|0;if((k|0)!=(h|0)){continue}break}if(!p){break fb}}while(1){H[i+(C<<2)>>2]=H[A+52>>2];C=C+1|0;A=A+76|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}break fb}k=n&-4;C=0;h=0;while(1){q=i+(C<<2)|0;H[q>>2]=H[A+36>>2];H[q+4>>2]=H[A+112>>2];H[q+8>>2]=H[A+188>>2];H[q+12>>2]=H[A+264>>2];C=C+4|0;A=A+304|0;h=h+4|0;if((k|0)!=(h|0)){continue}break}if(!p){break fb}}while(1){H[i+(C<<2)>>2]=H[A+36>>2];C=C+1|0;A=A+76|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}}h=H[s+5608>>2];g=i;k=0;s=Fa(n<<3);i=0;jb:{if(!s){break jb}if(!(!b|!n)){i=b;u=s+(n<<2)|0;r=n&-4;m=n&3;o=n-1|0;while(1){v=0;p=0;b=0;t=o>>>0<3;kb:{if(!t){while(1){b=v<<2;L[b+s>>2]=L[H[b+g>>2]>>2];q=b|4;L[q+s>>2]=L[H[g+q>>2]>>2];q=b|8;L[q+s>>2]=L[H[g+q>>2]>>2];b=b|12;L[b+s>>2]=L[H[b+g>>2]>>2];v=v+4|0;p=p+4|0;if((r|0)!=(p|0)){continue}break}b=v;if(!m){break kb}}v=0;while(1){q=b<<2;L[q+s>>2]=L[H[g+q>>2]>>2];b=b+1|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}q=0;b=h;while(1){E=q<<2;j=E+u|0;H[j>>2]=0;ca=O(0);v=0;p=0;lb:{if(!t){while(1){l=s+(v<<2)|0;ca=O(O(L[b>>2]*L[l>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+4>>2]*L[l+4>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+8>>2]*L[l+8>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+12>>2]*L[l+12>>2])+ca);L[j>>2]=ca;v=v+4|0;b=b+16|0;p=p+4|0;if((r|0)!=(p|0)){continue}break}p=v;if(!m){break lb}}v=0;while(1){ca=O(O(L[b>>2]*L[s+(p<<2)>>2])+ca);L[j>>2]=ca;p=p+1|0;b=b+4|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}v=g+E|0;p=H[v>>2];H[v>>2]=p+4;L[p>>2]=ca;q=q+1|0;if((n|0)!=(q|0)){continue}break}k=k+1|0;if((i|0)!=(k|0)){continue}break}}Ca(s);i=1}b=i;Ca(g);if(b){break ab}break b}if(H[H[s+5584>>2]+20>>2]==1){if(i){cc(H[A+36>>2],H[A+112>>2],H[A+188>>2],b);break ab}cc(H[A+52>>2],H[A+128>>2],H[A+204>>2],b);break ab}if(i){bc(H[A+36>>2],H[A+112>>2],H[A+188>>2],b);break ab}bc(H[A+52>>2],H[A+128>>2],H[A+204>>2],b);break ab}H[ra>>2]=p;Ba(f,1,10150,ra)}m=H[H[D+20>>2]>>2];if(!H[m+16>>2]){X=1;break b}l=H[D+68>>2];k=H[m+20>>2];b=H[H[D+32>>2]+5584>>2];q=H[H[D+24>>2]+24>>2];i=0;while(1){mb:{if(H[l+(i<<2)>>2]?0:l){break mb}h=H[k+28>>2];g=h+N(H[q+36>>2],152)|0;nb:{if(!H[D+64>>2]){h=H[g+148>>2]-H[g+140>>2]|0;v=H[g+144>>2]-H[g+136>>2]|0;r=0;p=52;break nb}h=h+N(H[k+24>>2],152)|0;v=H[g+8>>2]-H[g>>2]|0;r=H[h-144>>2]-(v+H[h-152>>2]|0)|0;h=H[g+12>>2]-H[g+4>>2]|0;p=36}g=H[q+24>>2];ob:{if(H[q+32>>2]){g=1<>2];if(H[b+20>>2]==1){n=v&-2;j=v&1;A=0;r=r<<2;while(1){p=0;pb:{if((v|0)!=1){while(1){g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;g=H[b+1076>>2]+H[X+4>>2]|0;H[X+4>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;X=X+8|0;p=p+2|0;if((n|0)!=(p|0)){continue}break}if(!j){break pb}}g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;X=X+4|0}X=r+X|0;A=A+1|0;if((A|0)!=(h|0)){continue}break}break mb}u=s>>31;g=0;while(1){p=0;while(1){ca=L[X>>2];j=C;qb:{if(ca>O(2147483648)){break qb}j=s;if(ca>2];j=n;za=ca;ca=O(T(ca));Pa=O(za-ca);if(!(PaO(.5)){break rb}Pa=ca;ca=O(ca*O(.5));za=O(ca-O(T(ca)))==O(0)?Pa:za}ca=za}t=n>>31;if(O(P(ca))>31)|0;j=j+n|0;n=n>>>0>j>>>0?o+1|0:o;j=j>>>0>>0&(n|0)<=(u|0)|(n|0)<(u|0)?s:j>>>0>>0&(n|0)<=0|(n|0)<0?j:C}H[X>>2]=j;X=X+4|0;p=p+1|0;if((v|0)!=(p|0)){continue}break}X=(r<<2)+X|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}k=k+76|0;b=b+1080|0;q=q+52|0;X=1;i=i+1|0;if(i>>>0>2]){continue}break}break b}X=0;Ba(f,1,3372,0)}na=ra+16|0;if(!X){jb(ua);H[a+8>>2]=H[a+8>>2]|32768;Ba(f,1,11451,0);break a}sb:{if(!c){break sb}b=0;q=H[a+232>>2];g=Rb(q,1);if(!((g|0)==-1|d>>>0>>0)){tb:{b=1;d=H[q+24>>2];if(!H[d+16>>2]){break tb}h=H[d+24>>2];k=H[H[H[q+20>>2]>>2]+20>>2];while(1){b=H[h+24>>2];i=b&7;v=b>>>3|0;d=H[k+28>>2];b=d+N(H[h+36>>2],152)|0;ub:{if(H[q+64>>2]){g=d+N(H[k+24>>2],152)|0;d=H[b+8>>2]-H[b>>2]|0;p=H[g-144>>2]-(d+H[g-152>>2]|0)|0;g=H[b+12>>2]-H[b+4>>2]|0;b=36;break ub}g=H[b+148>>2]-H[b+140>>2]|0;d=H[b+144>>2]-H[b+136>>2]|0;p=0;b=52}b=H[b+k>>2];vb:{wb:{xb:{yb:{i=v+((i|0)!=0)|0;switch(((i|0)==3?4:i)-1|0){case 0:break xb;case 1:break wb;case 3:break yb;default:break vb}}if(!g){break vb}d=d<<2;if((g|0)!=1){i=g&1;v=g&-2;g=0;while(1){s=!d;if(!s){B(c,b,d)}n=p<<2;b=n+(b+d|0)|0;c=c+d|0;if(!s){B(c,b,d)}c=c+d|0;b=n+(b+d|0)|0;g=g+2|0;if((v|0)!=(g|0)){continue}break}if(!i){break vb}}if(d){B(c,b,d)}c=c+d|0;break vb}i=!g|!d;if(H[h+32>>2]){if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;zb:{if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break zb}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;p=p<<2;while(1){d=0;Ab:{if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Ab}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=b+p|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}i=!g|!d;if(H[h+32>>2]){if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;Bb:{if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Bb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;Cb:{if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Cb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}}k=k+76|0;h=h+52|0;b=1;pb=pb+1|0;if(pb>>>0>2]+16>>2]){continue}break}}}if(!b){break a}b=H[ua+5596>>2];if(!b){break sb}Ca(b);H[ua+5596>>2]=0;H[ua+5600>>2]=0}F[a+92|0]=I[a+92|0]&254;H[a+8>>2]=H[a+8>>2]&-129;fb=1;c=Qa(e);b=H[a+8>>2];if(!(c|qa)&(b|0)==64|(b|0)==256){break a}if((Ja(e,Aa+10|0,2,f)|0)!=2){Ba(f,H[a+208>>2]?1:2,2472,0);fb=!H[a+208>>2];break a}Da(Aa+10|0,Aa+12|0,2);b=H[Aa+12>>2];if((b|0)==65424){break a}if((b|0)==65497){H[a+8>>2]=256;H[a+228>>2]=0;break a}if(!(Qa(e)|qa)){H[a+8>>2]=64;Ba(f,2,8419,0);break a}fb=0;Ba(f,1,8306,0)}na=Aa+16|0;return fb|0}function cb(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=O(0),Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,sa=0,ta=0,ua=0,va=O(0);t=na-80|0;na=t;H[t+40>>2]=65424;v=N(H[a+132>>2],H[a+128>>2]);a:{b:{c:{l=H[a+8>>2];d:{if((l|0)!=8){j=0;if((l|0)!=256){break a}H[t+40>>2]=65497;break d}if(F[a+92|0]&1){break d}Q=v&-2;V=v&1;D=t+77|0;R=t+76|0;U=t+72|0;l=65424;e:{f:{while(1){g:{h:{i:{j:{k:{l:{m:{n:{p=H[a+84>>2];if(!p){break n}n=H[a+80>>2];if(p>>>0<=n>>>0){break n}l=H[a+88>>2]+(n<<3)|0;p=H[l>>2];l=H[l+4>>2];H[a+80>>2]=n+1;if(!bb(j,p,l,k)){Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break m}Ba(k,1,4073,0);j=0;break a}if((l|0)==65427){break l}}while(1){if(!(Qa(j)|qa)){H[a+8>>2]=64;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+36|0,2);if(K[t+36>>2]<=1){Ba(k,1,6048,0);j=0;break a}o:{if(H[t+40>>2]!=32896){break o}if(Qa(j)|qa){break o}H[a+8>>2]=64;break l}m=H[a+8>>2];p:{if(!(m&16)){l=H[t+36>>2];break p}l=H[t+36>>2];n=H[a+24>>2];if(!n){break p}p=l+2|0;if(p>>>0>n>>>0){Ba(k,1,8370,0);j=0;break a}H[a+24>>2]=n-p}p=l-2|0;H[t+36>>2]=p;l=24912;A=H[t+40>>2];while(1){n=l;o=H[l>>2];if(o){l=l+12|0;if((o|0)!=(A|0)){continue}}break}if(!(m&H[n+4>>2])){Ba(k,1,5397,0);j=0;break a}q:{if(K[a+20>>2]>=p>>>0){l=H[a+16>>2];break q}l=Qa(j);m=qa;if((m|0)<0){l=1}else{l=l>>>0

>>0&(m|0)<=0}if(l){Ba(k,1,5797,0);j=0;break a}l=Ha(H[a+16>>2],H[t+36>>2]);if(!l){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(k,1,4973,0);j=0;break a}H[a+16>>2]=l;p=H[t+36>>2];H[a+20>>2]=p}l=Ja(j,l,p,k);if((l|0)!=H[t+36>>2]){Ba(k,1,2472,0);j=0;break a}n=H[n+8>>2];if(!n){Ba(k,1,11725,0);j=0;break a}if(!(ra[n|0](a,H[a+16>>2],l,k)|0)){H[t+32>>2]=H[t+40>>2];Ba(k,1,13959,t+32|0);j=0;break a}q=H[j+56>>2];m=H[t+36>>2];A=H[a+224>>2];p=H[A+40>>2];x=H[a+228>>2];r=N(x,40);l=p+r|0;z=H[l+20>>2];E=z+1|0;n=H[l+28>>2];r:{if(E>>>0<=n>>>0){l=H[l+24>>2];break r}X=O(O(n>>>0)+O(100));if(X=O(0)){n=~~X>>>0}else{n=0}H[l+28>>2]=n;l=Ha(H[l+24>>2],N(n,24));p=H[A+40>>2];n=r+p|0;if(!l){break k}H[n+24>>2]=l;z=H[n+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+4;n=(q-m|0)-4|0;H[l+8>>2]=n;H[l+12>>2]=n>>31;G[l>>1]=o;l=p+r|0;H[l+20>>2]=E;s:{if((o|0)!=65424){break s}p=H[l+16>>2];t:{if(!p){break t}o=H[l+12>>2];if(o>>>0>=K[l+4>>2]){break t}l=p+N(o,24)|0;H[l>>2]=n;H[l+4>>2]=0}l=(H[j+56>>2]-H[t+36>>2]|0)-4|0;n=H[a+48>>2];p=H[a+52>>2];if((p|0)>0){m=1}else{m=l>>>0<=n>>>0&(p|0)>=0}if(m){break s}H[a+48>>2]=l;H[a+52>>2]=0}if(I[a+92|0]&4){if((rb(j,H[a+24>>2],k)|0)!=H[a+24>>2]|qa){Ba(k,1,2472,0);j=0;break a}H[t+40>>2]=65427;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]!=65427){continue}break}}if(!(!(Qa(j)|qa)&H[a+8>>2]==64)){l=I[a+92|0];if(!(l&4)){l=N(H[a+228>>2],5644);n=H[a+180>>2];u:{v:{if(H[a+56>>2]){q=Qa(j);break v}q=H[a+24>>2];if(q>>>0<2){break u}}q=q-2|0;H[a+24>>2]=q}n=l+n|0;if(!q){break j}l=Qa(j);p=qa;if((p|0)<0){l=1}else{l=l>>>0>>0&(p|0)<=0}if(l){if(H[a+208>>2]){Ba(k,1,5842,0);j=0;break a}Ba(k,2,5842,0)}l=H[a+24>>2];if(l>>>0>=4294967294){Ba(k,1,1480,0);j=0;break a}p=H[n+5596>>2];w:{if(p){o=H[n+5600>>2];if(o>>>0>-3-l>>>0){Ba(k,1,1211,0);j=0;break a}l=Ha(p,(l+o|0)+2|0);if(l){H[n+5596>>2]=l;break j}Ca(H[n+5596>>2]);H[n+5596>>2]=0;break w}l=Fa(l+2|0);H[n+5596>>2]=l;if(l){break j}}Ba(k,1,6176,0);j=0;break a}H[a+8>>2]=8;F[a+92|0]=l&250;break i}l=H[t+40>>2];break g}Ca(H[n+24>>2]);a=H[A+40>>2]+N(x,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}m=H[j+56>>2];p=m-2|0;A=H[j+60>>2];z=A-(m>>>0<2)|0;r=H[a+224>>2];J=H[r+40>>2];M=H[a+228>>2];x=N(M,40);l=J+x|0;o=H[l+16>>2]+N(H[l+12>>2],24)|0;H[o+8>>2]=p;H[o+12>>2]=z;z=m;m=H[a+24>>2];z=z+m|0;H[o+16>>2]=z;H[o+20>>2]=m>>>0>z>>>0?A+1|0:A;m=H[a+24>>2];z=H[l+20>>2];E=z+1|0;o=H[l+28>>2];x:{if(E>>>0<=o>>>0){l=H[l+24>>2];break x}X=O(O(o>>>0)+O(100));if(X=O(0)){o=~~X>>>0}else{o=0}H[l+28>>2]=o;l=Ha(H[l+24>>2],N(o,24));J=H[r+40>>2];o=x+J|0;if(!l){break f}H[o+24>>2]=l;z=H[o+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+2;H[l+8>>2]=p;H[l+12>>2]=p>>31;G[l>>1]=65427;H[(x+J|0)+20>>2]=E;y:{if(q){q=Ja(j,H[n+5596>>2]+H[n+5600>>2]|0,H[a+24>>2],k);l=8;if((q|0)==H[a+24>>2]){break y}l=64;if((q|0)!=-1){break y}Ba(k,1,2472,0);j=0;break a}q=0;l=H[a+24>>2]?64:8}H[a+8>>2]=l;H[n+5600>>2]=H[n+5600>>2]+q;z:{if(F[a+92|0]&1){break z}l=H[a+44>>2];if(H[a+76>>2]|((l|0)<0|(l|0)!=H[a+228>>2])){break z}if(!Ab(j)){break z}n=H[a+228>>2];p=H[a+180>>2]+N(n,5644)|0;l=H[p+5592>>2];n=H[H[a+224>>2]+40>>2]+N(n,40)|0;if((l|0)!=H[n+4>>2]){break z}p=H[p+5588>>2]+1|0;if(l>>>0<=p>>>0){break z}A:{l=H[n+16>>2]+N(p,24)|0;n=H[l>>2];l=H[l+4>>2];if((n|0)==H[j+56>>2]&(l|0)==H[j+60>>2]){break A}if(bb(j,n,l,k)){break A}Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break h}Ba(k,1,4073,0);j=0;break a}l=I[a+92|0];if((l&9)!=1){break i}F[a+92|0]=l|8;p=H[a+228>>2];if(H[(H[a+180>>2]+N(p,5644)|0)+5592>>2]==1){break i}if(!Ab(j)){break i}l=H[j+60>>2];o=l;m=H[j+56>>2];if((l&m)==-1){break i}B:{while(1){l=1;n=t+70|0;if((Ja(j,n,2,k)|0)!=2){break B}Da(n,t- -64|0,2);if(H[t+64>>2]!=65424){break B}q=2472;if((Ja(j,n,2,k)|0)!=2){break c}Da(n,t+60|0,2);if(H[t+60>>2]!=10){q=6048;break c}H[t+60>>2]=8;n=Ja(j,t+70|0,8,k);if((n|0)!=H[t+60>>2]){break c}if((n|0)!=8){q=4047;break c}Da(t+70|0,t+56|0,2);Da(U,t+52|0,4);Da(R,t+48|0,1);Da(D,t+44|0,1);if((p|0)!=H[t+56>>2]){n=H[t+52>>2];if(n>>>0<14){break B}n=n-12|0;H[t+52>>2]=n;n=rb(j,n,k);if(!qa&H[t+52>>2]==(n|0)){continue}break B}break}l=H[t+48>>2]!=H[t+44>>2]}if(!nc(j,m,o,k)){break b}if(l){break i}F[a+92|0]=I[a+92|0]&238|16;C:{if(!v){break C}p=H[a+180>>2];q=0;l=0;if((v|0)!=1){while(1){n=p+N(q,5644)|0;o=H[n+5592>>2];if(o){H[n+5592>>2]=o+1}o=H[n+11236>>2];if(o){H[n+11236>>2]=o+1}q=q+2|0;l=l+2|0;if((Q|0)!=(l|0)){continue}break}if(!V){break C}}l=p+N(q,5644)|0;n=H[l+5592>>2];if(!n){break C}H[l+5592>>2]=n+1}Ba(k,2,9035,0)}if(F[a+92|0]&1){break h}if((Ja(j,H[a+16>>2],2,k)|0)!=2){if(!(!v|(v|0)!=(H[a+228>>2]+1|0))){j=H[a+180>>2];l=0;while(1){n=j+N(l,5644)|0;if(!(H[n+5588>>2]|H[n+5592>>2])){break e}l=l+1|0;if((v|0)!=(l|0)){continue}break}}Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2)}l=H[t+40>>2];if(F[a+92|0]&1){break g}if((l|0)!=65497){continue}}break}if(H[a+8>>2]==256|(l|0)!=65497){break d}H[a+8>>2]=256;H[a+228>>2]=0;break d}Ca(H[o+24>>2]);a=H[r+40>>2]+N(M,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}H[t+16>>2]=l;Ba(k,4,11004,t+16|0);H[a+228>>2]=l;H[t+40>>2]=65497;H[a+8>>2]=256}l=H[a+228>>2];j=H[a+180>>2];D:{E:{if(F[a+92|0]&1){break E}F:{G:{if(l>>>0>=v>>>0){break G}q=j+N(l,5644)|0;while(1){if(H[q+5596>>2]){break G}l=l+1|0;H[a+228>>2]=l;q=q+5644|0;if((l|0)!=(v|0)){continue}break}break F}if((l|0)!=(v|0)){break E}}H[i>>2]=0;break D}H:{I:{n=j+N(l,5644)|0;if(H[n+5172>>2]){a=6837}else{if(!(I[n+5640|0]&2)){break H}p=H[n+5160>>2];J:{if(!p){q=0;break J}o=p&3;m=H[n+5164>>2];j=0;q=0;l=0;if(p>>>0>=4){A=p&-4;p=0;while(1){v=m+(l<<3)|0;q=H[v+28>>2]+(H[v+20>>2]+(H[v+12>>2]+(H[v+4>>2]+q|0)|0)|0)|0;l=l+4|0;p=p+4|0;if((A|0)!=(p|0)){continue}break}if(!o){break J}}while(1){q=H[(m+(l<<3)|0)+4>>2]+q|0;l=l+1|0;j=j+1|0;if((o|0)!=(j|0)){continue}break}}j=Fa(q);H[n+5172>>2]=j;if(j){break I}a=4009}Ba(k,1,a,0);Ba(k,1,8059,0);j=0;break a}H[n+5180>>2]=q;q=H[n+5164>>2];j=H[n+5160>>2];if(j){p=0;l=0;while(1){v=l<<3;o=v+q|0;m=H[o>>2];if(m){j=H[o+4>>2];if(j){B(H[n+5172>>2]+p|0,m,j)}j=v+H[n+5164>>2]|0;o=H[j+4>>2];Ca(H[j>>2]);q=H[n+5164>>2];j=v+q|0;H[j>>2]=0;H[j+4>>2]=0;p=o+p|0;j=H[n+5160>>2]}l=l+1|0;if(l>>>0>>0){continue}break}}H[n+5160>>2]=0;Ca(q);H[n+5164>>2]=0;H[n+5168>>2]=H[n+5172>>2];H[n+5176>>2]=H[n+5180>>2]}l=H[a+232>>2];Y=H[l+28>>2];n=H[a+228>>2];E=H[(H[Y+76>>2]+N(n,5644)|0)+5584>>2];j=H[l+24>>2];Z=H[j+24>>2];v=H[Y+24>>2];p=(n>>>0)/(v>>>0)|0;V=H[H[l+20>>2]>>2];o=H[Y+12>>2];l=H[Y+4>>2]+N(o,n-N(p,v)|0)|0;n=H[j>>2];n=l>>>0>n>>>0?l:n;H[V>>2]=n;v=l+o|0;l=l>>>0>v>>>0?-1:v;v=H[j+8>>2];l=l>>>0>>0?l:v;H[V+8>>2]=l;K:{L:{if(!((l|0)>(n|0)&(n|0)>=0)){Ba(k,1,6682,0);break L}q=H[V+20>>2];l=p;p=H[Y+16>>2];l=H[Y+8>>2]+N(l,p)|0;n=H[j+4>>2];n=l>>>0>n>>>0?l:n;H[V+4>>2]=n;p=l+p|0;l=l>>>0>p>>>0?-1:p;j=H[j+12>>2];j=j>>>0>l>>>0?l:j;H[V+12>>2]=j;if(!((j|0)>(n|0)&(n|0)>=0)){Ba(k,1,6644,0);break L}M:{if(H[E+4>>2]){if(H[V+16>>2]){break M}j=1;break K}Ba(k,1,5358,0);break L}N:{O:{while(1){H[Z+36>>2]=0;j=H[Z>>2];n=j>>31;o=j-1|0;l=H[V>>2];p=o+l|0;m=n-!j|0;v=m+(l>>31)|0;ta=q,ua=ue(p,l>>>0>p>>>0?v+1|0:v,j,n),H[ta>>2]=ua;l=H[Z+4>>2];p=l>>31;v=l-1|0;A=H[V+4>>2];r=v+A|0;x=p-!l|0;z=x+(A>>31)|0;ta=q,ua=ue(r,r>>>0>>0?z+1|0:z,l,p),H[ta+4>>2]=ua;z=o;o=H[V+8>>2];A=z+o|0;m=(o>>31)+m|0;ta=q,ua=ue(A,o>>>0>A>>>0?m+1|0:m,j,n),H[ta+8>>2]=ua;j=H[V+12>>2];H[q+16>>2]=fa;n=x+(j>>31)|0;j=j+v|0;n=j>>>0>>0?n+1|0:n;ta=q,ua=ue(j,n,l,p),H[ta+12>>2]=ua;j=H[E+4>>2];H[q+20>>2]=j;l=H[Y+80>>2];H[q+24>>2]=j>>>0>>0?1:j-l|0;Ca(H[q+52>>2]);H[q+68>>2]=0;H[q+60>>2]=0;H[q+64>>2]=0;H[q+52>>2]=0;H[q+56>>2]=0;j=N(j,152);l=H[q+28>>2];P:{if(!l){l=Fa(j);H[q+28>>2]=l;if(!l){break L}H[q+32>>2]=j;if(!j){break P}y(l,0,j);break P}if(j>>>0<=K[q+32>>2]){break P}l=Ha(l,j);if(!l){Ba(k,1,3090,0);Ca(H[q+28>>2]);H[q+28>>2]=0;H[q+32>>2]=0;break L}H[q+28>>2]=l;n=H[q+32>>2];p=j-n|0;if(p){y(l+n|0,0,p)}H[q+32>>2]=j}j=H[q+20>>2];if(j){ha=E+944|0;ia=E+812|0;da=E+28|0;z=H[q+28>>2];_=0;while(1){n=j-1|0;l=n&31;if((n&63)>>>0>=32){l=-1<>>32-l}p=p^-1;m=H[q>>2];o=p+m|0;v=l^-1;l=v+(m>>31)|0;m=m>>>0>o>>>0?l+1|0:l;l=n&31;if((n&63)>>>0>=32){r=m>>l}else{r=((1<>>l}H[z>>2]=r;o=H[q+4>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){x=m>>o}else{x=((1<>>o}H[z+4>>2]=x;o=H[q+8>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){m=m>>o}else{m=((1<>>o}H[z+8>>2]=m;o=H[q+12>>2];l=o+p|0;A=(o>>31)+v|0;A=l>>>0>>0?A+1|0:A;o=n&31;if((n&63)>>>0>=32){A=A>>o}else{A=((1<>>o}H[z+12>>2]=A;Q=m>>31;D=_<<2;J=H[D+ia>>2];l=J&31;if((J&63)>>>0>=32){l=1<>>32-l}R=o;o=R+m|0;U=o-1|0;l=l+Q|0;o=(o>>>0>>0?l+1|0:l)-!o|0;l=J&31;if((J&63)>>>0>=32){l=o>>l}else{l=((1<>>l}R=l<>31;Q=H[D+ha>>2];l=Q&31;if((Q&63)>>>0>=32){l=-1<>>32-l}D=o^-1;o=D+A|0;l=(l^-1)+U|0;D=o>>>0>>0?l+1|0:l;l=Q&31;if((Q&63)>>>0>=32){l=D>>l}else{l=((1<>>l}l=l<>Q:0;H[z+20>>2]=o;aa=r&-1<>J:0;H[z+16>>2]=l;re(l,0,o);if(!(!l|!qa)){break O}ba=N(l,o);if(ba>>>0>=107374183){break O}D=N(ba,40);if(_){Q=Q-1|0;J=J-1|0;l=$>>31;m=l;o=l+1|0;l=$+1|0;$=((l?m:o)&1)<<31|l>>>1;l=aa>>31;m=l;o=l+1|0;l=aa+1|0;aa=((l?m:o)&1)<<31|l>>>1;l=3}else{l=1}H[z+24>>2]=l;x=z+28|0;o=j;l=j&31;if((j&63)>>>0>=32){l=1<>>32-l}ga=j;A=l;j=H[E+12>>2];R=j>>>0>>0?j:Q;j=R&31;if((R&63)>>>0>=32){l=-1<>>32-j}ja=m^-1;ka=l^-1;j=H[E+8>>2];U=j>>>0>>0?j:J;j=U&31;if((U&63)>>>0>=32){l=-1<>>32-j}la=m^-1;ma=l^-1;ea=0;while(1){Q:{if(!_){l=H[q+4>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){S=m>>l}else{S=((1<>>l}l=H[q>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){C=m>>l}else{C=((1<>>l}j=0;m=p;M=m;l=v;T=l;r=n;break Q}j=ea+1|0;r=j>>>1|0;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];m=M+r|0;l=(l^-1)+A|0;T=s>>>0>M>>>0?l+1|0:l;l=T+(r>>31)|0;r=m>>>0>>0?l+1|0:l;l=o&31;if((o&63)>>>0>=32){S=r>>l}else{S=((1<>>l}r=j&1;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];r=m+s|0;l=(l^-1)+A|0;l=m>>>0>>0?l+1|0:l;C=l+(s>>31)|0;C=r>>>0>>0?C+1|0:C;s=o&31;if((o&63)>>>0>=32){C=C>>s}else{C=((1<>>s}r=o}s=r;P=H[q+8>>2];W=P>>31;r=H[q+12>>2];H[x+4>>2]=S;H[x>>2]=C;H[x+16>>2]=j;S=(r>>31)+T|0;C=r;r=r+M|0;S=C>>>0>r>>>0?S+1|0:S;M=s&31;if((s&63)>>>0>=32){r=S>>M}else{r=((1<>>M}H[x+12>>2]=r;l=l+W|0;C=l+1|0;r=l;l=m+P|0;r=l>>>0

>>0?C:r;m=s&31;if((s&63)>>>0>=32){l=r>>m}else{l=((1<>>m}H[x+8>>2]=l;ca=1;l=H[da>>2];j=(H[Z+24>>2]+(!H[E+20>>2]|!j?0:(j|0)==3?2:1)|0)-l|0;R:{if((j|0)>=1024){ca=898846567431158e293;if(j>>>0<2047){j=j-1023|0;break R}ca=Infinity;j=(j>>>0>=3069?3069:j)-2046|0;break R}if((j|0)>-1023){break R}ca=2004168360008973e-307;if(j>>>0>4294965304){j=j+969|0;break R}ca=0;j=(j>>>0<=4294964336?-2960:j)+1938|0}oa=+H[da+4>>2]*.00048828125+1;u(0,0);u(1,j+1023<<20);ta=x,va=O(oa*(ca*+w())),L[ta+32>>2]=va;H[x+28>>2]=(l+H[E+804>>2]|0)-1;j=H[x+20>>2];S:{T:{if(!(j|!ba)){j=Fa(D);H[x+20>>2]=j;if(!j){Ba(k,1,2854,0);break L}if(D){y(j,0,D)}H[x+24>>2]=D;break T}if(D>>>0>K[x+24>>2]){j=Ha(j,D);if(!j){Ba(k,1,2854,0);Ca(H[x+20>>2]);H[x+20>>2]=0;H[x+24>>2]=0;break L}H[x+20>>2]=j;l=H[x+24>>2];m=D-l|0;if(m){y(j+l|0,0,m)}H[x+24>>2]=D}if(!ba){break S}}j=H[x+20>>2];M=0;while(1){m=H[z+16>>2];l=(M>>>0)/(m>>>0)|0;m=M-N(l,m)|0;r=(m<>2];S=(r|0)>(s|0)?r:s;H[j>>2]=S;r=(l<>2];C=(r|0)>(s|0)?r:s;H[j+4>>2]=C;m=(m+1<>2];m=(m|0)<(r|0)?m:r;H[j+8>>2]=m;l=(l+1<>2];r=(l|0)<(r|0)?l:r;H[j+12>>2]=r;l=(m>>31)+ma|0;T=l+1|0;s=l;l=m+la|0;s=m>>>0>l>>>0?T:s;S=S>>U;m=U&31;if((U&63)>>>0>=32){l=s>>m}else{l=((1<>>m}s=l-S<>U;H[j+16>>2]=s;l=(r>>31)+ka|0;T=l+1|0;m=l;l=r+ja|0;r=l>>>0>>0?T:m;C=C>>R;m=R&31;if((R&63)>>>0>=32){l=r>>m}else{l=((1<>>m}l=l-C<>R;H[j+20>>2]=l;r=N(l,s);re(r,0,68);if(qa){Ba(k,1,2935,0);break L}l=N(r,68);m=H[j+24>>2];U:{V:{if(!(m|!r)){m=Fa(l);H[j+24>>2]=m;if(!m){break L}if(!l){break V}y(m,0,l);break V}if(l>>>0<=K[j+28>>2]){break U}m=Ha(m,l);if(!m){Ca(H[j+24>>2]);H[j+24>>2]=0;H[j+28>>2]=0;Ba(k,1,2549,0);break L}H[j+24>>2]=m;s=H[j+28>>2];T=l-s|0;if(!T){break V}y(m+s|0,0,T)}H[j+28>>2]=l}l=H[j+20>>2];m=H[j+16>>2];s=H[j+32>>2];W:{if(!s){l=gc(m,l,k);break W}l=ec(s,m,l,k)}H[j+32>>2]=l;l=H[j+20>>2];m=H[j+16>>2];s=H[j+36>>2];X:{if(!s){l=gc(m,l,k);break X}l=ec(s,m,l,k)}H[j+36>>2]=l;if(r){l=0;while(1){W=H[j+16>>2];T=(l>>>0)/(W>>>0)|0;m=H[j+24>>2]+N(l,68)|0;P=H[m>>2];Y:{if(P){pa=H[m+56>>2];sa=H[m+4>>2];s=H[m+48>>2];Ca(H[m+60>>2]);H[m+48>>2]=0;H[m+52>>2]=0;H[m+64>>2]=0;H[m+56>>2]=0;H[m+60>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;H[m>>2]=P;H[m+48>>2]=s;Z:{if(!s){break Z}s=N(s,24);if(!s){break Z}y(P,0,s)}H[m+56>>2]=pa;H[m+4>>2]=sa;break Y}s=Ea(10,24);H[m>>2]=s;if(!s){break L}H[m+48>>2]=10}s=(l-N(T,W)|0)+S|0;P=s<>2];H[m+8>>2]=(P|0)>(W|0)?P:W;T=C+T|0;P=T<>2];H[m+12>>2]=(P|0)>(W|0)?P:W;s=s+1<>2];H[m+16>>2]=(s|0)<(P|0)?s:P;P=m;m=T+1<>2];H[P+20>>2]=(m|0)<(s|0)?m:s;l=l+1|0;if((r|0)!=(l|0)){continue}break}}j=j+40|0;M=M+1|0;if((M|0)!=(ba|0)){continue}break}}da=da+8|0;x=x+36|0;ea=ea+1|0;if(ea>>>0>2]){continue}break}z=z+152|0;j=n;_=_+1|0;if(_>>>0>2]){continue}break}}Z=Z+52|0;q=q+76|0;E=E+1080|0;fa=fa+1|0;if(fa>>>0>2]){continue}break}j=1;break K}Ba(k,1,2982,0);break L}Ba(k,1,2373,0)}j=0}if(!j){Ba(k,1,3668,0);j=0;break a}j=H[a+228>>2];H[t+4>>2]=N(H[a+128>>2],H[a+132>>2]);H[t>>2]=j+1;Ba(k,4,11825,t);H[b>>2]=H[a+228>>2];H[i>>2]=1;if(c){b=Rb(H[a+232>>2],0);H[c>>2]=b;j=0;if((b|0)==-1){break a}}b=H[H[H[a+232>>2]+20>>2]>>2];H[d>>2]=H[b>>2];H[e>>2]=H[b+4>>2];H[f>>2]=H[b+8>>2];H[g>>2]=H[b+12>>2];H[h>>2]=H[b+16>>2];H[a+8>>2]=H[a+8>>2]|128}j=1;break a}Ba(k,1,q,0)}Ba(k,1,3702,0);j=0}a=j;na=t+80|0;return a|0}function Vb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{switch(H[a+84>>2]){case 0:k:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break k}}Ba(H[a+236>>2],1,8491,0);break b}if(!H[a+44>>2]){k=H[a+36>>2];b=0;break i}H[a+44>>2]=0;i=H[a+68>>2];b=1;break i;case 1:l:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break l}}Ba(H[a+236>>2],1,8536,0);break b}if(!H[a+44>>2]){e=H[a+36>>2];b=0;break e}H[a+44>>2]=0;i=H[a+48>>2];b=1;break e;case 2:m:{A=H[a+52>>2];x=H[a+196>>2];if(A>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break m}}Ba(H[a+236>>2],1,8671,0);break b}if(!H[a+44>>2]){y=H[a+40>>2];break f}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;j=H[a+200>>2];while(1){O=j+(u<<4)|0;l=H[O+8>>2];if(l){q=H[O+12>>2];b=0;while(1){g=l+(b^-1)|0;d=q+(b<<4)|0;s=g+H[d>>2]|0;n:{if(s>>>0>31){break n}c=H[O>>2];if(c>>>0>-1>>>s>>>0){break n}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;o:{if(g>>>0>31){break o}c=H[O+4>>2];if(c>>>0>-1>>>g>>>0){break o}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((l|0)!=(b|0)){continue}break}}u=u+1|0;if((x|0)!=(u|0)){continue}break};if(!k|!i){break d}if(!I[a|0]){H[a+108>>2]=H[a+208>>2];H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}o=H[a+48>>2];b=1;break f;case 3:p:{A=H[a+52>>2];l=H[a+196>>2];if(A>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break p}}Ba(H[a+236>>2],1,8626,0);break b}if(!H[a+44>>2]){B=H[a+200>>2];e=H[a+28>>2];y=B+(e<<4)|0;E=H[a+40>>2];break g}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;B=H[a+200>>2];while(1){x=(p<<4)+B|0;s=H[x+8>>2];if(s){q=H[x+12>>2];b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;q:{if(j>>>0>31){break q}c=H[x>>2];if(c>>>0>-1>>>j>>>0){break q}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;r:{if(g>>>0>31){break r}c=H[x+4>>2];if(c>>>0>-1>>>g>>>0){break r}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((s|0)!=(b|0)){continue}break}}p=p+1|0;if((l|0)!=(p|0)){continue}break};if(!k|!i){break d}s:{if(I[a|0]){p=H[a+108>>2];break s}p=H[a+208>>2];H[a+108>>2]=p;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=1;break g;case 4:break j;default:break d}}t:{p=H[a+52>>2];b=H[a+196>>2];if(p>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break t}}Ba(H[a+236>>2],1,8581,0);break d}if(!H[a+44>>2]){p=H[a+28>>2];o=H[a+200>>2]+(p<<4)|0;u=H[a+40>>2];b=0;break h}H[a+28>>2]=p;H[a+44>>2]=0;b=1;break h}u:while(1){v:{w:{if(!b){k=k+1|0;break w}H[a+40>>2]=i;if(K[a+56>>2]<=i>>>0){break b}e=H[a+48>>2];b=0;break v}b=1}x:while(1){y:{z:{A:{B:{if(!b){H[a+32>>2]=e;if(K[a+60>>2]<=e>>>0){break B}H[a+28>>2]=c;b=c;o=0;break y}H[a+36>>2]=k;if(K[a+76>>2]<=k>>>0){b=H[a+28>>2];o=1;break y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],k)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break A}break a}i=H[a+40>>2]+1|0;break z}b=0;continue u}b=1;continue u}while(1){C:{D:{E:{if(!o){if(b>>>0>=q>>>0){break E}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break C}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}k=H[a+72>>2];b=1;continue x}b=b+1|0;H[a+28>>2]=b;break D}e=H[a+32>>2]+1|0;b=0;continue x}o=0;continue}o=1;continue}}}}F:while(1){G:{H:{if(!b){u=u+1|0;H[a+40>>2]=u;break H}if(p>>>0>=r>>>0){break b}H[a+228>>2]=0;H[a+232>>2]=0;o=H[a+200>>2]+(p<<4)|0;s=H[o+8>>2];if(!s){break b}q=H[o+12>>2];k=0;e=0;b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;I:{if(j>>>0>31){break I}c=H[o>>2];if(c>>>0>-1>>>j>>>0){break I}c=c<>>0>e>>>0?e:c:c;H[a+228>>2]=e}g=g+H[d+4>>2]|0;J:{if(g>>>0>31){break J}c=H[o+4>>2];if(c>>>0>-1>>>g>>>0){break J}c=c<>>0>k>>>0?k:c:c;H[a+232>>2]=k}b=b+1|0;if((s|0)!=(b|0)){continue}break}if(!e|!k){break d}K:{if(I[a|0]){k=H[a+108>>2];break K}k=H[a+208>>2];H[a+108>>2]=k;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=0;break G}b=1}L:while(1){M:{N:{O:{P:{if(!b){H[a+224>>2]=k;if(K[a+112>>2]<=k>>>0){break P}B=H[a+100>>2];b=0;break M}if(K[a+56>>2]<=u>>>0){i=H[a+32>>2];b=1;break M}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],u)|0)+N(H[a+20>>2],p)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break O}break a}p=p+1|0;H[a+28>>2]=p;break N}b=0;continue F}b=1;continue F}while(1){Q:{R:{S:{T:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break S}i=H[a+48>>2];break T}i=i+1|0}H[a+32>>2]=i;b=H[a+60>>2];d=H[o+8>>2];if((b>>>0>>0?b:d)>>>0>i>>>0){g=H[o>>2];c=g;n=d+(i^-1)|0;m=n;d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break Q}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[o+4>>2];if((b&c)!=(c|0)){break Q}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=ve(d,b,w,C);A=v-1|0;j=H[a+212>>2];l=A+j|0;d=f-!v|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,v,f);D=H[a+204>>2];j=A+D|0;b=D>>>0>j>>>0?b+1|0:b;j=ve(j,b,v,f);z=H[o+12>>2]+(i<<4)|0;M=H[z>>2];t=M+n|0;b=t&31;if((t&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break Q}h=c;P=H[z+4>>2];n=P+n|0;e=n&31;if((n&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break Q}l=H[a+224>>2];e=!!(we(l,e,b)|qa);b=n&31;if((n&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=n<>>32-e|b<>2];if((t&63)>>>0>=32){b=g<>>32-n;e=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=j<>>32-t|b<>2];if(!n|(!H[z+12>>2]|(j|0)==(x|0))){break Q}if((s|0)==(O|0)){break Q}u=H[a+68>>2];H[a+40>>2]=u;b=d;c=c+A|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,v,f)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(n,(ve(c,b,w,C)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue L}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break R}c=H[a+224>>2];b=H[a+232>>2];k=c+b-(c>>>0)%(b>>>0)|0;b=0;continue L}b=0;continue}b=1;continue}}}}U:while(1){V:{W:{if(!b){E=E+1|0;H[a+40>>2]=E;break W}H[a+224>>2]=p;if(K[a+112>>2]<=p>>>0){break b}v=H[a+100>>2];b=0;break V}b=1}X:while(1){Y:{Z:{_:{$:{if(!b){H[a+220>>2]=v;if(K[a+104>>2]<=v>>>0){break $}H[a+28>>2]=A;e=A;b=0;break Y}if(K[a+56>>2]<=E>>>0){u=H[a+32>>2];b=1;break Y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],E)|0)+N(H[a+20>>2],e)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break _}break a}c=H[a+224>>2];b=H[a+232>>2];p=c+b-(c>>>0)%(b>>>0)|0;break Z}b=0;continue U}b=1;continue U}while(1){aa:{ba:{ca:{da:{if(!b){if(e>>>0>=P>>>0){break ca}u=H[a+48>>2];H[a+32>>2]=u;y=(e<<4)+B|0;break da}u=u+1|0;H[a+32>>2]=u}b=H[a+60>>2];d=H[y+8>>2];if((b>>>0>>0?b:d)>>>0>u>>>0){g=H[y>>2];c=g;f=d+(u^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;k=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break aa}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[y+4>>2];if((b&c)!=(c|0)){break aa}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;o=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,o,b);b=h;w=H[a+208>>2];d=w+F|0;b=w>>>0>d>>>0?b+1|0:b;s=ve(d,b,o,n);C=k-1|0;j=H[a+212>>2];l=C+j|0;d=t-!k|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,k,t);L=H[a+204>>2];j=C+L|0;b=L>>>0>j>>>0?b+1|0:b;j=ve(j,b,k,t);D=H[y+12>>2]+(u<<4)|0;z=H[D>>2];m=z+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break aa}h=c;M=H[D+4>>2];f=M+f|0;r=f&31;if((f&63)>>>0>=32){b=c<>>32-r;r=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break aa}l=H[a+224>>2];r=!!(we(l,r,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-r|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[D+12>>2]|(j|0)==(x|0))){break aa}if((s|0)==(O|0)){break aa}E=H[a+68>>2];H[a+40>>2]=E;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,k,t)>>>z)-(j>>>z)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(ve(c,b,o,n)>>>M)-(s>>>M)|0)+g|0,H[S+36>>2]=T;b=1;continue X}e=e+1|0;H[a+28>>2]=e;break ba}c=H[a+220>>2];b=H[a+228>>2];v=c+b-(c>>>0)%(b>>>0)|0;b=0;continue X}b=0;continue}b=1;continue}}}}ea:while(1){fa:{ga:{if(!b){y=y+1|0;H[a+40>>2]=y;break ga}H[a+32>>2]=o;if(K[a+60>>2]<=o>>>0){break b}E=H[a+108>>2];b=0;break fa}b=1}ha:while(1){ia:{ja:{ka:{la:{if(!b){H[a+224>>2]=E;if(K[a+112>>2]<=E>>>0){break la}B=H[a+100>>2];b=0;break ia}if(K[a+56>>2]<=y>>>0){p=H[a+28>>2];b=1;break ia}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],y)|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break ka}break a}o=H[a+32>>2]+1|0;break ja}b=0;continue ea}b=1;continue ea}while(1){ma:{na:{oa:{pa:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break oa}H[a+28>>2]=A;p=A;break pa}p=p+1|0;H[a+28>>2]=p}if(p>>>0>>0){m=H[a+32>>2];e=H[a+200>>2]+(p<<4)|0;b=H[e+8>>2];if(m>>>0>=b>>>0){break ma}g=H[e>>2];c=g;f=b+(m^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break ma}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[e+4>>2];if((b&c)!=(c|0)){break ma}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=ve(d,b,w,n);C=v-1|0;j=H[a+212>>2];l=C+j|0;d=t-!v|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,v,t);D=H[a+204>>2];j=C+D|0;b=D>>>0>j>>>0?b+1|0:b;j=ve(j,b,v,t);z=H[e+12>>2]+(m<<4)|0;M=H[z>>2];m=M+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break ma}h=c;P=H[z+4>>2];f=P+f|0;e=f&31;if((f&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break ma}l=H[a+224>>2];e=!!(we(l,e,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-e|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[z+12>>2]|(j|0)==(x|0))){break ma}if((s|0)==(O|0)){break ma}y=H[a+68>>2];H[a+40>>2]=y;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,v,t)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(ve(c,b,w,n)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue ha}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break na}c=H[a+224>>2];b=H[a+232>>2];E=c+b-(c>>>0)%(b>>>0)|0;b=0;continue ha}b=0;continue}b=1;continue}}}}qa:while(1){ra:{sa:{if(!b){e=e+1|0;break sa}H[a+32>>2]=i;if(K[a+60>>2]<=i>>>0){break b}k=H[a+68>>2];b=0;break ra}b=1}ta:while(1){ua:{va:{wa:{xa:{if(!b){H[a+40>>2]=k;if(K[a+56>>2]<=k>>>0){break xa}H[a+28>>2]=c;b=c;o=0;break ua}H[a+36>>2]=e;if(K[a+76>>2]<=e>>>0){b=H[a+28>>2];o=1;break ua}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],e)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break wa}break a}i=H[a+32>>2]+1|0;break va}b=0;continue qa}b=1;continue qa}while(1){ya:{za:{Aa:{if(!o){if(b>>>0>=q>>>0){break Aa}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break ya}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}e=H[a+72>>2];b=1;continue ta}b=b+1|0;H[a+28>>2]=b;break za}k=H[a+40>>2]+1|0;b=0;continue ta}o=0;continue}o=1;continue}}}}return 0}Ba(H[a+236>>2],1,1343,0)}return 0}G[b>>1]=1;return 1}function nd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=O(0),t=0,u=0,v=0,w=O(0),x=0,z=0,A=0,C=O(0),D=O(0),E=O(0),G=0,J=0,K=0,L=0,M=0,Q=O(0),R=0,S=0,T=0;n=na-8320|0;na=n;H[n+64>>2]=0;j=2;g=H[a>>2];a:{b:{if((g|0)==176622093){break b}if((g|0)!=1375686655){if(!((g|0)!=201326592|H[a+4>>2]!=538988650)&H[a+8>>2]==176622093){break b}Y(1101);j=1;break a}j=0}g=Ea(1,96);k=0;c:{if(!g){break c}H[g+76>>2]=1;d:{e:{f:{switch(j|0){case 0:H[g+88>>2]=68;H[g+84>>2]=69;H[g+80>>2]=70;H[g+16>>2]=71;H[g+4>>2]=72;H[g+28>>2]=73;H[g+24>>2]=74;H[g+20>>2]=75;H[g>>2]=76;H[g+92>>2]=77;H[g+44>>2]=78;H[g+40>>2]=79;H[g+36>>2]=80;H[g+32>>2]=81;H[g+12>>2]=82;H[g+8>>2]=83;i=Jb();H[g+48>>2]=i;if(i){break e}break d;case 2:break f;default:break d}}H[g+88>>2]=84;H[g+84>>2]=85;H[g+80>>2]=86;H[g+16>>2]=87;H[g+4>>2]=88;H[g+92>>2]=89;H[g+44>>2]=90;H[g+40>>2]=91;H[g+36>>2]=92;H[g+32>>2]=93;H[g+28>>2]=94;H[g+24>>2]=95;H[g+20>>2]=96;H[g+12>>2]=97;H[g+8>>2]=98;H[g>>2]=99;i=Ea(1,136);g:{if(i){k=Jb();H[i>>2]=k;h:{if(!k){break h}F[i+124|0]=0;H[i+116>>2]=0;H[i+120>>2]=0;H[i+108>>2]=0;H[i+112>>2]=0;k=qb();H[i+4>>2]=k;if(!k){break h}k=qb();H[i+8>>2]=k;if(!k){break h}break g}Fc(i)}i=0}H[g+48>>2]=i;if(!i){break d}}H[g+72>>2]=1;H[g+64>>2]=1;H[g+60>>2]=0;H[g+52>>2]=0;H[g+56>>2]=0;H[g+68>>2]=1;k=g;break c}Ca(g);k=0}g=k;if(g){H[g+60>>2]=0;H[g+72>>2]=100}if(g){H[g+56>>2]=0;H[g+68>>2]=101}if(g){H[g+52>>2]=0;H[g+64>>2]=102}i=n+68|0;if(i){y(i,0,8248);H[i+8248>>2]=0;H[i+8200>>2]=-1;H[i+8204>>2]=-1}if(d){H[n+8316>>2]=H[n+8316>>2]|1}H[n+60>>2]=b;H[n+56>>2]=a;H[n+52>>2]=a;j=1;b=0;i=n+52|0;i:{if(!i){break i}a=Ea(1,72);if(a){j:{H[a+64>>2]=1048576;k=Fa(1048576);H[a+32>>2]=k;if(!k){Ca(a);a=0;break j}H[a+36>>2]=k;H[a+28>>2]=2;H[a+24>>2]=3;H[a+20>>2]=4;H[a+16>>2]=5;H[a+44>>2]=6;H[a+40>>2]=8;H[a+68>>2]=H[a+68>>2]|2}}else{a=0}if(!a){break i}if(a){H[a+4>>2]=0;H[a>>2]=i}if(a){H[a+8>>2]=H[i+8>>2];H[a+12>>2]=0}if(!(!a|!(I[a+68|0]&2))){H[a+16>>2]=64}if(a){H[a+24>>2]=66}if(a){H[a+28>>2]=67}b=a}a=n+68|0;if(!g|!a){a=0}else{k:{if(!H[g+76>>2]){Ba(g+52|0,1,9902,0);a=0;break k}ra[H[g+24>>2]](H[g+48>>2],a);a=1}}if(!a){Y(1153);fb(b);hb(g);break a}if(!b|!g){a=0}else{l:{if(!H[g+76>>2]){Ba(g+52|0,1,9983,0);a=0;break l}a=ra[H[g>>2]](b,H[g+48>>2],n- -64|0,g+52|0)|0}}if(!a){Y(1181);fb(b);hb(g);Ua(H[n+64>>2]);break a}m:{if(!f){break m}if(g){a=ra[H[g+40>>2]](H[g+48>>2],f,g+52|0)|0}else{a=0}if(a){break m}Y(1116);fb(b);hb(g);Ua(H[n+64>>2]);break a}a=H[n+64>>2];n:{if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+4>>2]](H[g+48>>2],b,a,g+52|0)|0}if(a){if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+16>>2]](H[g+48>>2],b,g+52|0)|0}if(a){break n}}Y(1316);hb(g);fb(b);Ua(H[n+64>>2]);break a}fb(b);hb(g);l=H[n+64>>2];a=H[l+28>>2];if(a){Ca(a);l=H[n+64>>2];H[l+28>>2]=0;H[l+32>>2]=0}v=H[l+16>>2];o:{p:{if(!c){if(!(!e|(v|0)!=4)){p=1;v=4;break o}q:{b=H[l+20>>2];if(!((b|0)==3|(v|0)!=3)){a=H[l+24>>2];if(H[a>>2]!=H[a+4>>2]|H[a+52>>2]==1){break q}H[l+20>>2]=3;break p}if(v>>>0>2){break q}H[l+20>>2]=2;break o}r:{switch(b-3|0){case 2:s:{t:{if(v>>>0<4){break t}b=H[l+24>>2];a=H[b>>2];if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]|(a|0)!=H[b+156>>2]){break t}a=H[b+4>>2];if((a|0)!=H[b+56>>2]|(a|0)!=H[b+108>>2]){break t}if((a|0)==H[b+160>>2]){break s}}H[n+20>>2]=1053;H[n+16>>2]=1373;Ga(26072,8179,n+16|0);break o}f=N(H[b+12>>2],H[b+8>>2]);C=O(O(1)/O((-1<>2]^-1)>>>0));D=O(O(1)/O((-1<>2]^-1)>>>0));w=O(O(1)/O((-1<>2]^-1)>>>0));Q=O(O(1)/O((-1<>2]^-1)>>>0));a=0;while(1){if((a|0)!=(f|0)){c=a<<2;g=c+H[b+148>>2]|0;i=H[g>>2];k=c+H[b+96>>2]|0;j=H[k>>2];m=c+H[b+44>>2]|0;s=O(O(1)-O(C*O(H[c+H[b+200>>2]>>2])));E=O(O(O(O(1)-O(Q*O(H[m>>2])))*O(255))*s);if(O(P(E))>2]=c;E=O(O(O(O(1)-O(w*O(j|0)))*O(255))*s);if(O(P(E))>2]=c;s=O(O(O(O(1)-O(D*O(i|0)))*O(255))*s);if(O(P(s))>2]=c;a=a+1|0;continue}break};Ca(H[b+200>>2]);a=H[l+24>>2];H[a+128>>2]=8;H[a+76>>2]=8;H[a+24>>2]=8;H[a+200>>2]=0;H[l+20>>2]=1;a=H[l+16>>2]-1|0;H[l+16>>2]=a;h=3;while(1){if(a>>>0<=h>>>0){break o}a=H[l+24>>2]+N(h,52)|0;B(a,a+52|0,52);h=h+1|0;a=H[l+16>>2];continue};case 0:break p;case 1:break r;default:break o}}b=H[l+24>>2];a=H[b>>2];u:{v:{if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]){break v}a=H[b+4>>2];if((a|0)!=H[b+56>>2]){break v}if((a|0)==H[b+108>>2]){break u}}H[n+36>>2]=1115;H[n+32>>2]=1373;Ga(26072,8221,n+32|0);break o}a=H[b+24>>2];c=-1<>2]?0:a;i=H[b+84>>2]?0:a;k=N(H[b+12>>2],H[b+8>>2]);a=0;while(1){if((a|0)!=(k|0)){f=a<<2;j=f+H[b+44>>2]|0;m=f+H[b+148>>2]|0;s=O(H[m>>2]-g|0);h=f+H[b+96>>2]|0;C=O(H[h>>2]-i|0);D=O(H[j>>2]);w=O(O(O(s*O(1.4019900560379028))+O(O(C*O(-3680000008898787e-20))+D))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;w=O(O(O(s*O(-.7141128182411194))+O(O(D*O(1.0003000497817993))+O(C*O(-.34412500262260437))))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;s=O(O(O(s*O(-7999999979801942e-21))+O(O(D*O(.9998229742050171))+O(C*O(1.7720400094985962))))+O(.5));if(O(P(s))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;a=a+1|0;continue}break}H[l+20>>2]=1;break o}v=c>>>0>v>>>0?v:c;p=1;break o}w:{x:{c=H[l+24>>2];if(H[c>>2]!=1){break x}y:{switch(H[c+52>>2]-1|0){case 1:if(H[c+104>>2]!=2){break x}if(!(H[c+4>>2]!=1|H[c+56>>2]!=2|H[c+108>>2]!=2)){b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];G=H[c+60>>2];q=H[c+8>>2];f=H[c+12>>2];c=N(q,f)<<2;g=Ia(c);i=Ia(c);k=Ia(c);if(!(!g|!i|!k)){m=-1<>2]&1;L=f-b|0;K=H[l>>2]&1;x=q-K|0;if(!b){c=k;f=i;b=g;break w}c=k;f=i;b=g;while(1){if((p|0)==(q|0)){break w}Ka(o,m,H[j>>2],0,0,b,f,c);p=p+1|0;c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;continue}}Ca(g);Ca(i);Ca(k);break o}if(H[c+4>>2]!=1|H[c+56>>2]!=1|H[c+108>>2]!=1){break x}a=H[c+24>>2];f=H[c+148>>2];b=H[c+96>>2];h=H[c+44>>2];t=H[c+60>>2];g=H[c+8>>2];x=H[c+12>>2];c=N(g,x)<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){o=-1<>2]&1;a=g-z|0;G=a&1;u=a>>>1|0;J=a&-2;a=m;j=k;c=i;while(1){if((q|0)!=(x|0)){if(z){Ka(r,o,H[h>>2],0,0,c,j,a);j=j+4|0;c=c+4|0;h=h+4|0;a=a+4|0}g=0;while(1){if(g>>>0>>0){Ka(r,o,H[h>>2],H[b>>2],H[f>>2],c,j,a);Ka(r,o,H[h+4>>2],H[b>>2],H[f>>2],c+4|0,j+4|0,a+4|0);g=g+2|0;f=f+4|0;b=b+4|0;a=a+8|0;j=j+8|0;c=c+8|0;h=h+8|0;continue}break}z:{if(!G){break z}g=H[h>>2];A:{if((t|0)==(u|0)){Ka(r,o,g,0,0,c,j,a);break A}Ka(r,o,g,H[b>>2],H[f>>2],c,j,a)}a=a+4|0;j=j+4|0;c=c+4|0;h=h+4|0;if(t>>>0<=u>>>0){break z}f=f+4|0;b=b+4|0}q=q+1|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=m;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o;case 0:break y;default:break x}}if(H[c+104>>2]!=1|H[c+4>>2]!=1|(H[c+56>>2]!=1|H[c+108>>2]!=1)){break x}b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];o=N(H[c+12>>2],H[c+8>>2]);c=o<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){q=-1<>2],H[a>>2],H[h>>2],g,b,f);c=c+1|0;f=f+4|0;b=b+4|0;g=g+4|0;h=h+4|0;a=a+4|0;j=j+4|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);H[H[l+24>>2]+148>>2]=m;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o}H[n+4>>2]=463;H[n>>2]=1373;Ga(26072,8264,n);break o}J=x>>>1|0;z=x&-2;R=L&-2;u=q<<2;while(1){if(M>>>0>>0){p=c+u|0;r=f+u|0;q=b+u|0;t=j+u|0;if(K){Ka(o,m,H[j>>2],0,0,b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);p=p+4|0;r=r+4|0;q=q+4|0;t=t+4|0;c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}A=0;while(1){if(z>>>0>A>>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);Ka(o,m,H[t+4>>2],H[a>>2],H[h>>2],q+4|0,r+4|0,p+4|0);A=A+2|0;h=h+4|0;a=a+4|0;p=p+8|0;r=r+8|0;q=q+8|0;t=t+8|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}B:{if((x|0)==(z|0)){break B}A=H[j>>2];C:{if((G|0)==(J|0)){Ka(o,m,A,0,0,b,f,c);Ka(o,m,H[t>>2],0,0,q,r,p);break C}Ka(o,m,A,H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p)}c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;if(G>>>0<=J>>>0){break B}h=h+4|0;a=a+4|0}M=M+2|0;c=c+u|0;f=f+u|0;b=b+u|0;j=j+u|0;continue}break}D:{if(!(L&1)){break D}if(K){Ka(o,m,H[j>>2],0,0,b,f,c);c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}p=0;while(1){if(p>>>0>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);p=p+2|0;h=h+4|0;a=a+4|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}if((x|0)==(z|0)){break D}j=H[j>>2];if((G|0)==(J|0)){Ka(o,m,j,0,0,b,f,c);break D}Ka(o,m,j,H[a>>2],H[h>>2],b,f,c)}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=g;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=i;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=k;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;p=0}c=H[n+64>>2];E:{if(d){break E}b=0;while(1){if((b|0)==(v|0)){break E}a=H[c+24>>2]+N(b,52)|0;d=H[a+24>>2];if((d|0)!=8){F:{if(d>>>0<=7){f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];if(H[a+32>>2]){i=1<>2];k=d>>31<<7|d>>>25;S=m,T=ue(d<<7,k,i,0),H[S>>2]=T;h=h+1|0;continue}}d=-1<>2],0,255),qa,d,0);H[i>>2]=k;h=h+1|0;continue}}d=d-8|0;f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];h=0;if(H[a+32>>2]){while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>d;h=h+1|0;continue}}while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>>d;h=h+1|0;continue}}H[a+24>>2]=8}b=b+1|0;continue}}a=H[c+24>>2];b=N(H[a+12>>2],H[a+8>>2]);G:{if(!p){if(H[c+20>>2]==2){if(H[c+16>>2]==1){ma(H[a+44>>2],b|0);break G}if(!e){break G}da(H[a+44>>2],H[a+96>>2],b|0);break G}ca(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G}H:{switch(v-1|0){case 0:ba(H[a+44>>2],b|0);break G;case 2:aa(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G;case 3:break H;default:break G}}$(H[a+44>>2],H[a+96>>2],H[a+148>>2],H[a+200>>2],b|0)}Ua(H[n+64>>2]);j=0}na=n+8320|0;return j|0}function ac(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,L=0,M=0,O=0,P=0;j=H[a>>2];a:{if(j>>>0>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0>>0|c>>>0>=e>>>0|c>>>0>=j>>>0){break a}E=(c>>>0)/K[a+12>>2]|0;s=H[a+8>>2];G=(b>>>0)/(s>>>0)|0;M=(N(s,G)-b|0)+s|0;I=(g|0)!=8;z=c;while(1){k=H[a+12>>2];j=k;j=(c|0)==(z|0)?j-((c>>>0)%(j>>>0)|0)|0:j;t=e-z|0;r=j>>>0>>0?j:t;A=r&-4;u=r&3;O=r&-8;J=r&7;x=r-1|0;P=(g|0)==2&(r|0)==1;L=N(k-j|0,s);C=(N(z-c|0,h)<<2)+f|0;F=G;t=b;while(1){j=(b|0)==(t|0)?M:s;k=d-t|0;q=j>>>0>>0?j:k;k=s-j|0;l=F<<2;j=H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2];b:{c:{d:{e:{f:{g:{if(i){h:{i:{j:{k:{if(j){l=((L<<2)+j|0)+(k<<2)|0;j=t-b|0;if((g|0)==1){break h}m=(N(g,j)<<2)+C|0;if((q|0)==1){break i}if(P){break j}if(q>>>0<=7|I){break k}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];n=j|1;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|2;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|3;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((g|0)!=1){if(!r){break b}p=q&-4;n=q&3;l=(N(t-b|0,g)<<2)+C|0;o=0;D=q-1>>>0<3;while(1){l:{if(!q){break l}m=0;j=0;k=0;if(!D){while(1){H[(N(g,j)<<2)+l>>2]=0;H[(N(j|1,g)<<2)+l>>2]=0;H[(N(j|2,g)<<2)+l>>2]=0;H[(N(j|3,g)<<2)+l>>2]=0;j=j+4|0;k=k+4|0;if((p|0)!=(k|0)){continue}break}if(!n){break l}}while(1){H[(N(g,j)<<2)+l>>2]=0;j=j+1|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}l=(h<<2)+l|0;o=o+1|0;if((r|0)!=(o|0)){continue}break}break b}if(!r){break b}l=q<<2;k=(t-b<<2)+C|0;o=0;if(x>>>0>=7){break g}break f}if(!r){break b}D=q&-4;p=q&3;n=0;v=q-1>>>0<3;break c}j=0;k=q&-4;if(k){while(1){H[(j<<3)+m>>2]=H[(j<<2)+l>>2];o=j|1;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|2;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|3;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];j=j+4|0;if(k>>>0>j>>>0){continue}break}}if(j>>>0>=q>>>0){break b}o=0;k=j;n=q-j&3;if(n){while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}if(j-q>>>0>4294967292){break b}while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];j=k+1|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+2|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+3|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];k=k+4|0;if((q|0)!=(k|0)){continue}break}break b}if(!r){break b}k=0;if(x>>>0>=3){while(1){H[m>>2]=H[l>>2];j=h<<2;m=j+m|0;p=l;l=s<<2;o=p+l|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];l=l+o|0;m=j+m|0;k=k+4|0;if((A|0)!=(k|0)){continue}break}if(!u){break b}}j=0;while(1){H[m>>2]=H[l>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)!=4){if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break e}break d}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=l;l=s<<2;k=k+l|0;n=H[k+12>>2];m=h<<2;j=m+j|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;l=l+k|0;j=j+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}m=0;while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;l=(s<<2)+l|0;j=(h<<2)+j|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}if(!j){j=Ea(1,N(H[a+8>>2],H[a+12>>2])<<2);if(!j){return 0}H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2]=j}l=((L<<2)+j|0)+(k<<2)|0;j=t-b|0;m:{n:{o:{p:{q:{r:{if((g|0)!=1){m=(N(g,j)<<2)+C|0;if((q|0)==1){break r}if(q>>>0<=7|I){break q}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];n=j|1;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|2;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|3;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)==4){break p}if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break o}break n}if(!r){break b}o=0;if(x>>>0>=3){while(1){H[l>>2]=H[m>>2];j=s<<2;l=j+l|0;k=h<<2;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}j=0;while(1){H[l>>2]=H[m>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}if(!r){break b}D=q&-4;p=q&3;n=0;break m}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;m=h<<2;j=m+j|0;n=H[j+12>>2];k=l;l=s<<2;k=k+l|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;l=l+k|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}m=0;while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;j=(h<<2)+j|0;l=(s<<2)+l|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}while(1){k=!m;if(!k){B(l,j,m)}p=j;j=h<<2;n=p+j|0;p=l;l=s<<2;p=p+l|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}j=j+n|0;l=l+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}k=0;while(1){if(m){B(l,j,m)}j=(h<<2)+j|0;l=(s<<2)+l|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){s:{if(!q){break s}k=0;j=0;o=0;if(q>>>0>=4){while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];v=j|1;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|2;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|3;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}if(!p){break s}}while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){j=!l;if(!j){y(k,0,l)}p=k;k=h<<2;m=p+k|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}k=k+m|0;o=o+8|0;if((O|0)!=(o|0)){continue}break}if(!J){break b}}j=0;while(1){if(l){y(k,0,l)}k=(h<<2)+k|0;j=j+1|0;if((J|0)!=(j|0)){continue}break}break b}while(1){k=!m;if(!k){B(j,l,m)}p=l;l=s<<2;n=p+l|0;p=j;j=h<<2;p=p+j|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}l=l+n|0;j=j+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}k=0;while(1){if(m){B(j,l,m)}l=(s<<2)+l|0;j=(h<<2)+j|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){t:{if(!q){break t}k=0;j=0;o=0;if(!v){while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];w=j|1;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|2;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|3;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}if(!p){break t}}while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}}F=F+1|0;t=q+t|0;if(t>>>0>>0){continue}break}E=E+1|0;z=r+z|0;if(z>>>0>>0){continue}break}}return 1}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!c){return 0}if(!Gb(H[a>>2],b,c,d)){Ba(d,1,6210,0);return 0}n=c;m=d;g=na-240|0;na=g;r=1;o=a;a:{if(H[H[a>>2]+60>>2]|H[a+128>>2]){break a}b:{c=H[a+116>>2];c:{if(!c){a=H[a+120>>2];break c}b=H[n+16>>2];a=H[o+120>>2];if(!(!a|!H[a+12>>2])){b=I[a+18|0]}d:{d=J[c+4>>1];if(d){c=H[c>>2];while(1){f=c+N(e,6)|0;h=J[f>>1];if(h>>>0>=b>>>0){H[g+180>>2]=b;H[g+176>>2]=h;Ba(m,1,13715,g+176|0);r=0;break a}e:{f=J[f+4>>1];if((f+1&65535)>>>0<2){break e}f=f-1|0;if(f>>>0>>0){break e}H[g+164>>2]=b;H[g+160>>2]=f;Ba(m,1,13715,g+160|0);r=0;break a}e=e+1|0;if((d|0)!=(e|0)){continue}break}break d}if(b){break b}break c}while(1){b=b-1|0;e=0;while(1){if(J[c+N(e,6)>>1]!=(b|0)){e=e+1|0;if((d|0)!=(e|0)){continue}break b}break}if(b){continue}break}}f:{if(!a){break f}c=H[a+12>>2];if(!c){break f}g:{b=I[a+18|0];h:{if(b){e=0;h=1;while(1){a=H[n+16>>2];d=J[c+(e<<2)>>1];if(a>>>0<=d>>>0){H[g+148>>2]=a;H[g+144>>2]=d;Ba(m,1,13715,g+144|0);h=0}e=e+1|0;if((b|0)!=(e|0)){continue}break}a=Ea(b,4);if(!a){break h}e=0;while(1){d=c+(e<<2)|0;f=I[d+2|0];i:{if(f>>>0>=2){H[g+68>>2]=f;H[g+64>>2]=e;Ba(m,1,12094,g- -64|0);h=0;break i}d=I[d+3|0];if(d>>>0>=b>>>0){H[g+128>>2]=d;Ba(m,1,12038,g+128|0);h=0;break i}j=(f|0)!=1;i=(d<<2)+a|0;if(!(j|!H[i>>2])){H[g+80>>2]=d;Ba(m,1,11527,g+80|0);h=0;break i}if(!(f|!d)){H[g+100>>2]=d;H[g+96>>2]=e;Ba(m,1,11901,g+96|0);h=0;break i}if(!(j|(d|0)==(e|0))){H[g+120>>2]=d;H[g+116>>2]=e;H[g+112>>2]=e;Ba(m,1,11937,g+112|0);h=0;break i}H[i>>2]=1}e=e+1|0;if((b|0)!=(e|0)){continue}break}h=!h;e=0;while(1){j:{d=e<<2;if(I[(c+d|0)+2|0]?H[d+a>>2]:1){e=e+1|0;if((b|0)!=(e|0)){continue}if(h&1){break j}if(H[n+16>>2]!=1){break g}e=0;while(1){if(H[(e<<2)+a>>2]){e=e+1|0;if((b|0)!=(e|0)){continue}break g}break}d=0;Ba(m,2,9253,0);f=b&3;e=0;if(b>>>0>=4){h=b&252;b=0;while(1){j=c+(e<<2)|0;F[j+3|0]=e;F[j+2|0]=1;j=e|1;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;j=e|2;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;j=e|3;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;e=e+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}if(!f){break g}}while(1){b=c+(e<<2)|0;F[b+3|0]=e;F[b+2|0]=1;e=e+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}break g}H[g+48>>2]=e;h=1;Ba(m,1,11101,g+48|0);e=e+1|0;if((b|0)!=(e|0)){continue}}break}Ca(a);r=0;break a}a=Ea(b,4);if(a){break g}}r=0;Ba(m,1,12285,0);break a}Ca(a)}a=H[o+120>>2];k:{if(!a){break k}l=H[a+12>>2];if(!l){Ca(H[a+4>>2]);Ca(H[H[o+120>>2]+8>>2]);Ca(H[H[o+120>>2]>>2]);a=H[o+120>>2];b=H[a+12>>2];if(b){Ca(b);a=H[o+120>>2]}Ca(a);H[o+120>>2]=0;break k}j=H[n+24>>2];l:{c=I[a+18|0];m:{if(c){u=H[a>>2];h=H[a+4>>2];i=H[a+8>>2];e=0;n:{while(1){if(H[(j+N(J[l+(e<<2)>>1],52)|0)+44>>2]){e=e+1|0;if((c|0)!=(e|0)){continue}break n}break}H[g+32>>2]=e;Ba(m,1,13877,g+32|0);r=0;break a}f=Fa(N(c,52));if(!f){break m}d=0;while(1){a=l+(d<<2)|0;e=J[a>>1];b=N(I[a+2|0]?I[a+3|0]:d,52)+f|0;a=j+N(e,52)|0;H[b+48>>2]=H[a+48>>2];e=H[a+44>>2];H[b+40>>2]=H[a+40>>2];H[b+44>>2]=e;e=H[a+36>>2];H[b+32>>2]=H[a+32>>2];H[b+36>>2]=e;e=H[a+28>>2];H[b+24>>2]=H[a+24>>2];H[b+28>>2]=e;e=H[a+20>>2];H[b+16>>2]=H[a+16>>2];H[b+20>>2]=e;e=H[a+12>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=e;e=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=e;b=N(d,52)+f|0;a=Ia(N(H[a+8>>2],H[a+12>>2])<<2);H[b+44>>2]=a;if(!a){if(d){a=d&65535;while(1){Ca(H[(N(a,52)+f|0)-8>>2]);a=a-1|0;if(a){continue}break}}Ca(f);r=0;Ba(m,1,13825,0);break a}H[b+24>>2]=I[d+i|0];H[b+32>>2]=I[d+h|0];d=d+1|0;if((c|0)!=(d|0)){continue}break}h=J[H[o+120>>2]+16>>1]-1|0;while(1){a=N(q,52)+f|0;d=N(H[a+12>>2],H[a+8>>2]);b=l+(q<<2)|0;e=H[(j+N(J[b>>1],52)|0)+44>>2];o:{if(!I[b+2|0]){if(!d){break o}i=H[a+44>>2];p=d&3;a=0;b=0;if(d>>>0>=4){t=d&-4;k=0;while(1){d=b<<2;H[d+i>>2]=H[d+e>>2];s=d|4;H[s+i>>2]=H[e+s>>2];s=d|8;H[s+i>>2]=H[e+s>>2];d=d|12;H[d+i>>2]=H[d+e>>2];b=b+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!p){break o}}while(1){d=b<<2;H[d+i>>2]=H[d+e>>2];b=b+1|0;a=a+1|0;if((p|0)!=(a|0)){continue}break}break o}if(!d){break o}b=I[b+3|0];a=(b<<2)+u|0;i=H[(N(b,52)+f|0)+44>>2];b=0;if((d|0)!=1){t=d&1;s=d&-2;d=0;while(1){k=b<<2;p=H[k+e>>2];H[i+k>>2]=H[a+(N(c,(p|0)>=0?(h|0)>(p|0)?p:h:0)<<2)>>2];k=k|4;p=H[k+e>>2];H[i+k>>2]=H[a+(N(c,(p|0)>=0?(h|0)>(p|0)?p:h:0)<<2)>>2];b=b+2|0;d=d+2|0;if((s|0)!=(d|0)){continue}break}if(!t){break o}}d=b<<2;b=H[d+e>>2];H[d+i>>2]=H[a+(N(c,(b|0)>=0?(b|0)<(h|0)?b:h:0)<<2)>>2]}q=q+1|0;if((c|0)!=(q|0)){continue}break}break l}f=Fa(N(c,52));if(f){break l}}r=0;Ba(m,1,13825,0);break a}a=H[n+16>>2];if(a){e=0;while(1){b=H[(j+N(e,52)|0)+44>>2];if(b){Ca(b)}e=e+1|0;if((a|0)!=(e|0)){continue}break}}Ca(j);H[n+16>>2]=c;H[n+24>>2]=f}e=H[o+116>>2];if(!e){break a}h=H[e>>2];i=J[e+4>>1];if(i){e=0;p=i-2&65535;d=1;while(1){a=H[n+16>>2];q=N(e,6)+h|0;b=J[q>>1];p:{if(a>>>0<=b>>>0){H[g+20>>2]=a;H[g+16>>2]=b;Ba(m,2,7334,g+16|0);break p}c=J[q+4>>1];if((c+1&65535)>>>0<=1){G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[q+2>>1];break p}c=c-1|0;j=c&65535;if(j>>>0>=a>>>0){H[g+4>>2]=a;H[g>>2]=j;Ba(m,2,7293,g);break p}q:{if(J[q+2>>1]|(b|0)==(j|0)){break q}f=H[n+24>>2];a=f+N(b,52)|0;H[g+232>>2]=H[a+48>>2];l=H[a+44>>2];H[g+224>>2]=H[a+40>>2];H[g+228>>2]=l;l=H[a+36>>2];H[g+216>>2]=H[a+32>>2];H[g+220>>2]=l;l=H[a+28>>2];H[g+208>>2]=H[a+24>>2];H[g+212>>2]=l;l=H[a+20>>2];H[g+200>>2]=H[a+16>>2];H[g+204>>2]=l;l=H[a+12>>2];H[g+192>>2]=H[a+8>>2];H[g+196>>2]=l;l=H[a+4>>2];H[g+184>>2]=H[a>>2];H[g+188>>2]=l;l=N(j,52);f=l+f|0;H[a+48>>2]=H[f+48>>2];k=H[f+44>>2];H[a+40>>2]=H[f+40>>2];H[a+44>>2]=k;k=H[f+36>>2];H[a+32>>2]=H[f+32>>2];H[a+36>>2]=k;k=H[f+28>>2];H[a+24>>2]=H[f+24>>2];H[a+28>>2]=k;k=H[f+20>>2];H[a+16>>2]=H[f+16>>2];H[a+20>>2]=k;k=H[f+12>>2];H[a+8>>2]=H[f+8>>2];H[a+12>>2]=k;k=H[f+4>>2];H[a>>2]=H[f>>2];H[a+4>>2]=k;a=l+H[n+24>>2]|0;H[a+48>>2]=H[g+232>>2];f=H[g+228>>2];H[a+40>>2]=H[g+224>>2];H[a+44>>2]=f;f=H[g+220>>2];H[a+32>>2]=H[g+216>>2];H[a+36>>2]=f;f=H[g+212>>2];H[a+24>>2]=H[g+208>>2];H[a+28>>2]=f;f=H[g+204>>2];H[a+16>>2]=H[g+200>>2];H[a+20>>2]=f;f=H[g+196>>2];H[a+8>>2]=H[g+192>>2];H[a+12>>2]=f;f=H[g+188>>2];H[a>>2]=H[g+184>>2];H[a+4>>2]=f;if(i>>>0<=e+1>>>0){break q}f=d;if(!(e-i&1)){a=c;f=N(d,6)+h|0;l=J[f>>1];r:{if((l|0)!=(b|0)){a=b;if((l|0)!=(j|0)){break r}}G[f>>1]=a}f=d+1|0}if((p|0)==(e&65535)){break q}while(1){a=c;l=N(f,6)+h|0;k=J[l>>1];s:{if((k|0)!=(b|0)){a=b;if((k|0)!=(j|0)){break s}}G[l>>1]=a}a=c;k=J[l+6>>1];t:{if((k|0)!=(b|0)){a=b;if((k|0)!=(j|0)){break t}}G[l+6>>1]=a}f=f+2|0;if((i|0)!=(f&65535)){continue}break}}G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[q+2>>1]}d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}e=H[o+116>>2];h=H[e>>2]}if(h){Ca(h);e=H[o+116>>2]}Ca(e);H[o+116>>2]=0;break a}r=0;Ba(m,1,9499,0)}na=g+240|0;return r|0}function Tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0),p=0;k=na-48|0;na=k;H[a+8>>2]=1;a:{b:{d=k+40|0;c:{if((Ja(b,d,2,c)|0)!=2){break c}Da(d,k+44|0,2);if(H[k+44>>2]!=65359){break c}H[a+8>>2]=2;d=H[b+56>>2];e=d-2|0;d=H[b+60>>2]-(d>>>0<2)|0;g=H[a+224>>2];H[g>>2]=e;H[g+4>>2]=d;H[k+16>>2]=e;H[k+20>>2]=d;Ba(c,4,12769,k+16|0);f=H[a+224>>2];j=H[f>>2];e=H[f+24>>2];d=e+1|0;g=H[f+32>>2];if(d>>>0<=g>>>0){g=H[f+28>>2];break b}o=O(O(g>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;g=Ha(H[f+28>>2],N(d,24));if(g){H[f+28>>2]=g;e=H[f+24>>2];d=e+1|0;break b}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;Ba(c,1,3899,0)}Ba(c,1,15656,0);a=0;break a}e=N(e,24)+g|0;H[e+16>>2]=2;H[e+8>>2]=j;H[e+12>>2]=j>>31;G[e>>1]=65359;H[f+24>>2]=d;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+40|0,2);d:{e:{g=H[k+40>>2];if((g|0)!=65424){while(1){e=24912;if(g>>>0<=65279){H[k>>2]=g;Ba(c,1,2268,k);a=0;break a}while(1){d=e;f=H[d>>2];if(f){e=d+12|0;if((f|0)!=(g|0)){continue}}break}f:{g:{if(f){break g}h=2;Ba(c,2,3847,0);e=2472;h:{i:{if((Ja(b,H[a+16>>2],2,c)|0)!=2){break i}while(1){Da(H[a+16>>2],k+44|0,2);f=24912;g=H[k+44>>2];if(g>>>0>=65280){while(1){d=f;i=H[d>>2];if(i){f=d+12|0;if((g|0)!=(i|0)){continue}}break}if(!(H[d+4>>2]&H[a+8>>2])){e=5397;break i}if(i){if((i|0)==65424){H[k+40>>2]=65424;break f}j=H[b+56>>2];f=H[a+224>>2];g=H[f+24>>2];e=g+1|0;d=H[f+32>>2];if(e>>>0<=d>>>0){d=H[f+28>>2];break h}o=O(O(d>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;d=Ha(H[f+28>>2],N(d,24));if(d){H[f+28>>2]=d;g=H[f+24>>2];e=g+1|0;break h}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;e=3899;break i}h=h+2|0}if((Ja(b,H[a+16>>2],2,c)|0)==2){continue}break}}Ba(c,1,e,0);Ba(c,1,9847,0);a=0;break a}d=N(g,24)+d|0;H[d+16>>2]=h;g=j-h|0;H[d+8>>2]=g;H[d+12>>2]=g>>31;G[d>>1]=0;H[f+24>>2]=e;H[k+40>>2]=i;g=24912;if((i|0)==65424){break f}while(1){d=g;f=H[d>>2];if(!f){break g}g=d+12|0;if((f|0)!=(i|0)){continue}break}}if(!(H[d+4>>2]&H[a+8>>2])){Ba(c,1,5397,0);a=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+36|0,2);e=H[k+36>>2];if(e>>>0<=1){Ba(c,1,6074,0);a=0;break a}e=e-2|0;H[k+36>>2]=e;g=H[a+16>>2];if(K[a+20>>2]>>0){g=Ha(g,e);if(!g){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(c,1,4973,0);a=0;break a}H[a+16>>2]=g;e=H[k+36>>2];H[a+20>>2]=e}e=Ja(b,g,e,c);if((e|0)!=H[k+36>>2]){Ba(c,1,2472,0);a=0;break a}if(!(ra[H[d+8>>2]](a,H[a+16>>2],e,c)|0)){Ba(c,1,2490,0);a=0;break a}j=H[b+56>>2];i=H[k+36>>2];d=H[a+224>>2];g=H[d+24>>2];h=g+1|0;e=H[d+32>>2];j:{if(h>>>0<=e>>>0){e=H[d+28>>2];break j}o=O(O(e>>>0)+O(100));if(o=O(0)){e=~~o>>>0}else{e=0}H[d+32>>2]=e;e=Ha(H[d+28>>2],N(e,24));if(!e){break d}H[d+28>>2]=e;g=H[d+24>>2];h=g+1|0}e=N(g,24)+e|0;H[e+16>>2]=i+4;g=(j-i|0)-4|0;H[e+8>>2]=g;H[e+12>>2]=g>>31;G[e>>1]=f;H[d+24>>2]=h;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}m=(f|0)==65372?1:m;l=(f|0)==65362?1:l;n=(f|0)==65361?1:n;Da(H[a+16>>2],k+40|0,2);g=H[k+40>>2];if((g|0)!=65424){continue}}break}if(n){break e}}Ba(c,1,4785,0);a=0;break a}if(!l){Ba(c,1,4831,0);a=0;break a}if(!m){Ba(c,1,4877,0);a=0;break a}d=0;e=0;h=0;j=na-16|0;na=j;m=1;k:{if(!(F[a+212|0]&1)){break k}l:{f=H[a+136>>2];if(!f){break l}m:{while(1){g=H[a+140>>2]+(h<<3)|0;l=H[g>>2];if(l){i=H[g+4>>2];g=d-i|0;g=d>>>0>=g>>>0?g:0;if(d>>>0>>0){f=i-d|0;l=d+l|0;while(1){if(f>>>0<4){d=5671;break m}Da(l,j+12|0,4);d=H[j+12>>2];if((d^-1)>>>0>>0){d=5645;break m}i=f-4|0;n=i>>>0>>0;g=n?d-i|0:g;e=d+e|0;f=i-d|0;l=((n?0:d)+l|0)+4|0;if(d>>>0>>0){continue}break}f=H[a+136>>2]}d=g}h=h+1|0;if(h>>>0>>0){continue}break}if(!d){break l}m=0;Ba(c,1,3067,0);break k}m=0;Ba(c,1,d,0);break k}d=Fa(e);H[a+160>>2]=d;if(!d){m=0;Ba(c,1,4337,0);break k}H[a+148>>2]=e;h=H[a+140>>2];n:{f=H[a+136>>2];if(f){e=0;d=0;g=0;while(1){l=g<<3;n=l+h|0;i=H[n>>2];if(i){h=H[a+160>>2]+d|0;f=H[n+4>>2];o:{if(f>>>0<=e>>>0){if(f){B(h,i,f)}d=d+f|0;e=e-f|0;break o}if(e){B(h,i,e)}d=d+e|0;h=f-e|0;e=e+i|0;while(1){if(h>>>0<4){break n}Da(e,j+8|0,4);e=e+4|0;i=H[a+160>>2]+d|0;f=h-4|0;h=H[j+8>>2];if(f>>>0>>0){if(f){B(i,e,f)}d=d+f|0;e=H[j+8>>2]-f|0;break o}if(h){B(i,e,h)}h=H[j+8>>2];d=h+d|0;e=e+h|0;h=f-h|0;if(h){continue}break}e=0}Ca(H[l+H[a+140>>2]>>2]);h=H[a+140>>2];f=l+h|0;H[f>>2]=0;H[f+4>>2]=0;f=H[a+136>>2]}g=g+1|0;if(g>>>0>>0){continue}break}e=H[a+148>>2];d=H[a+160>>2]}H[a+168>>2]=e;H[a+144>>2]=d;H[a+136>>2]=0;Ca(h);H[a+140>>2]=0;break k}m=0;Ba(c,1,5671,0)}na=j+16|0;if(!m){Ba(c,1,8085,0);a=0;break a}Ba(c,4,11754,0);d=H[a+224>>2];e=H[b+56>>2];e=e-2|0;H[d+8>>2]=e;H[d+12>>2]=0;b=0;h=0;i=na-16|0;na=i;g=H[a+68>>2];p:{if(!g){H[a+76>>2]=1;break p}if(H[a+76>>2]){break p}d=H[a+72>>2];j=H[a+224>>2];e=H[j+40>>2];q:{if((g|0)!=1){m=g&1;l=g&-2;while(1){n=(b<<3)+d|0;p=J[n>>1];f=e+N(p,40)|0;H[f>>2]=p;H[f+8>>2]=H[f+8>>2]+1;n=J[n+8>>1];f=e+N(n,40)|0;H[f>>2]=n;H[f+8>>2]=H[f+8>>2]+1;b=b+2|0;h=h+2|0;if((l|0)!=(h|0)){continue}break}if(!m){break q}}f=J[(b<<3)+d>>1];b=e+N(f,40)|0;H[b>>2]=f;H[b+8>>2]=H[b+8>>2]+1}f=H[j+36>>2];r:{if(f){b=0;while(1){if(!H[(e+N(b,40)|0)+8>>2]){H[i>>2]=b;Ba(c,1,9304,i);break r}b=b+1|0;if((f|0)!=(b|0)){continue}break}}f=H[j+8>>2];b=H[j+12>>2];e=0;while(1){s:{l=e<<3;m=H[H[a+224>>2]+40>>2]+N(J[l+d>>1],40)|0;h=H[m+16>>2];if(!h){h=Ea(H[m+8>>2],24);H[m+16>>2]=h;if(!h){break s}g=H[a+68>>2];d=H[a+72>>2]}p=h;h=H[m+4>>2];j=p+N(h,24)|0;H[j>>2]=f;H[j+4>>2]=b;l=H[(d+l|0)+4>>2];f=l+f|0;H[j+16>>2]=f;b=f>>>0>>0?b+1|0:b;H[j+20>>2]=b;H[m+4>>2]=h+1;e=e+1|0;if(g>>>0>e>>>0){continue}break p}break}Ba(c,1,6882,0)}H[a+76>>2]=1;if(!H[a+68>>2]){break p}d=H[H[a+224>>2]+40>>2];b=0;while(1){c=N(J[H[a+72>>2]+(b<<3)>>1],40);d=c+d|0;H[d+8>>2]=0;Ca(H[d+16>>2]);d=H[H[a+224>>2]+40>>2];H[(c+d|0)+16>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}}na=i+16|0;H[a+8>>2]=8;a=1;break a}Ca(H[d+28>>2]);H[d+32>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;Ba(c,1,3899,0);a=0}na=k+48|0;return a|0}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=na-160|0;na=f;a:{if(c>>>0<=35){c=0;Ba(d,1,6095,0);break a}j=H[a+96>>2];c=c-36|0;h=(c>>>0)/3|0;if((N(h,3)|0)!=(c|0)){c=0;Ba(d,1,6095,0);break a}c=f+156|0;Da(b,c,2);G[a+104>>1]=H[f+156>>2];Da(b+2|0,j+8|0,4);Da(b+6|0,j+12|0,4);Da(b+10|0,j,4);Da(b+14|0,j+4|0,4);Da(b+18|0,a+116|0,4);Da(b+22|0,a+120|0,4);Da(b+26|0,a+108|0,4);Da(b+30|0,a+112|0,4);Da(b+34|0,c,2);b:{c:{d:{c=H[f+156>>2];if(c>>>0<=16384){H[j+16>>2]=c;if((c|0)!=(h|0)){H[f+132>>2]=h;H[f+128>>2]=c;Ba(d,1,14980,f+128|0);c=0;break a}c=H[j+4>>2];g=H[j+12>>2];l=H[j+8>>2];e=H[j>>2];if(!(c>>>0>>0&l>>>0>e>>>0)){H[f+120>>2]=g-c;H[f+124>>2]=0-(c>>>0>g>>>0);H[f+112>>2]=l-e;H[f+116>>2]=0-(e>>>0>l>>>0);Ba(d,1,14542,f+112|0);c=0;break a}i=H[a+116>>2];k=H[a+120>>2];if(!(k?i:0)){H[f+4>>2]=k;H[f>>2]=i;Ba(d,1,15094,f);c=0;break a}e:{n=H[a+108>>2];f:{if(n>>>0>e>>>0){break f}i=i+n|0;if(e>>>0>=(i>>>0>>0?-1:i)>>>0){break f}i=H[a+112>>2];if(i>>>0>c>>>0){break f}k=i+k|0;if(c>>>0<(i>>>0>k>>>0?-1:k)>>>0){break e}}c=0;Ba(d,1,2792,0);break a}g:{if(H[a+248>>2]){break g}i=H[a+240>>2];if(!i){break g}k=H[a+244>>2];if(!k){break g}e=l-e|0;c=g-c|0;if((e|0)==(i|0)&(c|0)==(k|0)){break g}H[f+108>>2]=c;H[f+104>>2]=e;H[f+100>>2]=k;H[f+96>>2]=i;Ba(d,1,14006,f+96|0);c=0;break a}e=Ea(h,52);H[j+24>>2]=e;if(!e){break d}h:{if(!H[j+16>>2]){break h}c=f+152|0;Da(b+36|0,c,1);h=H[f+152>>2];k=h>>>7|0;H[e+32>>2]=k;n=(h&127)+1|0;H[e+24>>2]=n;l=H[a+248>>2];Da(b+37|0,c,1);H[e>>2]=H[f+152>>2];Da(b+38|0,c,1);g=H[f+152>>2];H[e+4>>2]=g;c=0;i=H[e>>2];if(i-256>>>0<4294967041){h=0;break b}h=0;if(g-256>>>0<4294967041){break b}g=H[e+24>>2];if(g>>>0>31){break c}H[e+36>>2]=0;H[e+40>>2]=H[a+184>>2];h=1;if(K[j+16>>2]<=1){break h}k=l?0:k;l=l?0:n;b=b+39|0;while(1){Da(b,f+152|0,1);i=H[f+152>>2];g=i>>>7|0;H[e+84>>2]=g;i=(i&127)+1|0;H[e+76>>2]=i;if(!(H[a+248>>2]|(I[a+212|0]&4|(i|0)==(l|0)&(g|0)==(k|0)))){H[f+84>>2]=g;H[f+80>>2]=i;H[f+76>>2]=h;H[f+72>>2]=k;H[f+68>>2]=l;H[f+64>>2]=h;Ba(d,2,14778,f- -64|0)}g=f+152|0;Da(b+1|0,g,1);H[e+52>>2]=H[f+152>>2];Da(b+2|0,g,1);g=H[f+152>>2];H[e+56>>2]=g;i=H[e+52>>2];if(i-256>>>0<4294967041|g-256>>>0<=4294967040){break b}g=H[e+76>>2];if(g>>>0>=32){break c}b=b+3|0;H[e+88>>2]=0;H[e+92>>2]=H[a+184>>2];e=e+52|0;h=h+1|0;if(h>>>0>2]){continue}break}}c=0;h=H[a+116>>2];if(!h){break a}g=H[a+120>>2];if(!g){break a}l=0-!h|0;e=l;p=H[a+108>>2];k=H[j+8>>2]-p|0;i=h-1|0;b=k+i|0;e=k>>>0>b>>>0?e+1|0:e;b=ve(b,e,h,0);H[a+128>>2]=b;n=0-!g|0;e=n;q=H[a+112>>2];o=H[j+12>>2]-q|0;m=o;k=g-1|0;o=o+k|0;e=m>>>0>o>>>0?e+1|0:e;e=ve(o,e,g,0);H[a+132>>2]=e;i:{if(!(!b|!e)){if(b>>>0<=65535/(e>>>0)>>>0){break i}}H[f+20>>2]=e;H[f+16>>2]=b;Ba(d,1,14120,f+16|0);break a}o=N(b,e);j:{if(I[a+92|0]&2){H[a+28>>2]=(H[a+28>>2]-p>>>0)/(h>>>0);H[a+32>>2]=(H[a+32>>2]-q>>>0)/(g>>>0);e=l;b=H[a+36>>2]-p|0;m=b;b=b+i|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=ve(b,e,h,0),H[v+36>>2]=w;e=n;b=H[a+40>>2]-q|0;m=b;b=b+k|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=ve(b,e,g,0),H[v+40>>2]=w;break j}H[a+40>>2]=e;H[a+36>>2]=b;H[a+28>>2]=0;H[a+32>>2]=0}b=Ea(o,5644);H[a+180>>2]=b;if(!b){Ba(d,1,3935,0);break a}b=Ea(H[j+16>>2],1080);H[H[a+12>>2]+5584>>2]=b;if(!H[H[a+12>>2]+5584>>2]){Ba(d,1,3935,0);break a}b=Ea(10,20);H[H[a+12>>2]+5616>>2]=b;b=H[a+12>>2];if(!H[b+5616>>2]){Ba(d,1,3935,0);break a}H[b+5624>>2]=10;b=Ea(10,20);H[H[a+12>>2]+5628>>2]=b;b=H[a+12>>2];if(!H[b+5628>>2]){Ba(d,1,3935,0);break a}H[b+5636>>2]=10;e=H[j+16>>2];k:{if(!e){break k}h=H[j+24>>2];b=0;if((e|0)!=1){g=e&1;l=e&-2;e=0;while(1){i=h+N(b,52)|0;if(!H[i+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}i=b|1;k=h+N(i,52)|0;if(!H[k+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(i,1080)|0)+1076>>2]=1<>2]-1}b=b+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}if(!g){break k}}e=h+N(b,52)|0;if(H[e+32>>2]){break k}H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}if(o){b=H[a+180>>2];e=0;while(1){h=Ea(H[j+16>>2],1080);H[b+5584>>2]=h;if(!h){Ba(d,1,3935,0);break a}b=b+5644|0;e=e+1|0;if(o>>>0>e>>>0){continue}break}}b=N(H[a+132>>2],H[a+128>>2]);H[H[a+224>>2]+36>>2]=b;b=Ea(b,40);d=H[a+224>>2];H[d+40>>2]=b;e=0;l:{if(!b){break l}e=1;if(!H[d+36>>2]){break l}d=0;while(1){m:{e=0;g=N(d,40);b=g+b|0;H[b+20>>2]=0;H[b+28>>2]=100;h=Ea(100,24);l=H[a+224>>2];b=H[l+40>>2];H[(g+b|0)+24>>2]=h;if(!h){break m}e=1;d=d+1|0;if(d>>>0>2]){continue}}break}}if(!e){break a}H[a+8>>2]=4;r=H[j+16>>2];if(r){b=H[a+112>>2];d=H[a+120>>2];c=b+N(d,H[a+132>>2]-1|0)|0;d=c+d|0;c=c>>>0>d>>>0?-1:d;d=H[j+12>>2];c=c>>>0>>0?c:d;l=c-1|0;k=0-!c|0;c=H[a+108>>2];d=H[a+116>>2];a=c+N(d,H[a+128>>2]-1|0)|0;d=a+d|0;a=a>>>0>d>>>0?-1:d;d=H[j+8>>2];a=a>>>0>>0?a:d;i=a-1|0;n=0-!a|0;a=H[j+4>>2];b=a>>>0>>0?b:a;o=b-1|0;p=0-!b|0;a=H[j>>2];b=a>>>0>>0?c:a;q=b-1|0;u=0-!b|0;a=H[j+24>>2];b=0;while(1){e=p;d=H[a+4>>2];c=d+o|0;j=ve(c,c>>>0>>0?e+1|0:e,d,0);H[a+20>>2]=j;e=u;h=H[a>>2];c=h+q|0;s=ve(c,c>>>0>>0?e+1|0:e,h,0);H[a+16>>2]=s;c=H[a+40>>2];g=c&31;if((c&63)>>>0>=32){e=-1<>>32-g}g=m^-1;e=e^-1;m=e;e=k;t=d+l|0;e=t>>>0>>0?e+1|0:e;e=ve(t,e,d,0)-j|0;d=m;j=e;e=e+g|0;d=j>>>0>e>>>0?d+1|0:d;j=e;e=c&31;if((c&63)>>>0>=32){d=d>>>e|0}else{d=((1<>>e}H[a+12>>2]=d;e=n;d=h+i|0;e=d>>>0>>0?e+1|0:e;d=ve(d,e,h,0)-s|0;e=m;d=d+g|0;e=d>>>0>>0?e+1|0:e;h=d;d=c&31;if((c&63)>>>0>=32){c=e>>>d|0}else{c=((1<>>d}H[a+8>>2]=c;a=a+52|0;b=b+1|0;if((r|0)!=(b|0)){continue}break}}c=1;break a}H[f+144>>2]=c;Ba(d,1,7932,f+144|0);c=0;break a}c=0;H[j+16>>2]=0;Ba(d,1,3935,0);break a}H[f+52>>2]=g;H[f+48>>2]=h;Ba(d,1,15402,f+48|0);break a}H[f+40>>2]=g;H[f+36>>2]=i;H[f+32>>2]=h;Ba(d,1,14340,f+32|0)}na=f+160|0;return c|0}function fd(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,w=0,y=0,z=0,A=0,B=0,C=0;n=na-560|0;na=n;H[n+44>>2]=0;x(+b);i=s(1)|0;s(0)|0;a:{if((i|0)<0){r=1;y=1082;b=-b;x(+b);i=s(1)|0;s(0)|0;break a}if(e&2048){r=1;y=1085;break a}r=e&1;y=r?1088:1083;A=!r}b:{if((i&2146435072)==2146435072){d=r+3|0;Na(a,32,c,d,e&-65537);La(a,y,r);f=f&32;La(a,b!=b?f?1207:1435:f?1312:1476,3);Na(a,32,c,d,e^8192);l=(c|0)>(d|0)?c:d;break b}v=n+16|0;c:{d:{e:{b=pc(b,n+44|0);b=b+b;if(b!=0){g=H[n+44>>2];H[n+44>>2]=g-1;t=f|32;if((t|0)!=97){break e}break c}t=f|32;if((t|0)==97){break c}m=H[n+44>>2];break d}m=g-29|0;H[n+44>>2]=m;b=b*268435456}k=(d|0)<0?6:d;p=(n+48|0)+((m|0)>=0?288:0)|0;h=p;while(1){d=b<4294967295&b>=0?~~b>>>0:0;H[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((m|0)<=0){i=m;g=h;j=p;break f}j=p;i=m;while(1){z=i>>>0>=29?29:i;g=h-4|0;g:{if(j>>>0>g>>>0){break g}d=0;i=0;while(1){w=H[g>>2];o=z&31;if((z&63)>>>0>=32){l=w<>>32-o;w=w<>>0>o>>>0?i+1|0:i;d=ve(o,l,1e9,0);i=qa;B=g,C=o+re(d,i,-1e9)|0,H[B>>2]=C;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!l&o>>>0<1e9){break g}j=j-4|0;H[j>>2]=d}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!H[h>>2]){continue}}break}i=H[n+44>>2]-z|0;H[n+44>>2]=i;h=g;if((i|0)>0){continue}break}}if((i|0)<0){u=((k+25>>>0)/9|0)+1|0;l=(t|0)==102;while(1){d=0-i|0;d=d>>>0>=9?9:d;h:{if(g>>>0<=j>>>0){h=H[j>>2]?0:4;break h}o=1e9>>>d|0;z=-1<>2];H[h>>2]=w+(i>>>d|0);i=N(o,i&z);h=h+4|0;if(h>>>0>>0){continue}break}h=H[j>>2]?0:4;if(!i){break h}H[g>>2]=i;g=g+4|0}i=d+H[n+44>>2]|0;H[n+44>>2]=i;j=h+j|0;d=l?p:j;g=g-d>>2>(u|0)?d+(u<<2)|0:g;if((i|0)<0){continue}break}}i=0;i:{if(g>>>0<=j>>>0){break i}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break i}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=(k-((t|0)!=102?i:0)|0)-((t|0)==103&(k|0)!=0)|0;if((d|0)<(N(g-p>>2,9)-9|0)){h=(n+48|0)+((m|0)<0?-4092:-3804)|0;d=d+9216|0;m=(d|0)/9|0;l=h+(m<<2)|0;h=10;d=d+N(m,-9)|0;if((d|0)<=7){while(1){h=N(h,10);d=d+1|0;if((d|0)!=8){continue}break}}m=H[l>>2];u=(m>>>0)/(h>>>0)|0;d=N(u,h);o=l+4|0;j:{if((d|0)==(m|0)&(o|0)==(g|0)){break j}m=m-d|0;k:{if(!(u&1)){b=9007199254740992;if(!(F[l-4|0]&1)|((h|0)!=1e9|j>>>0>=l>>>0)){break k}}b=9007199254740994}q=(g|0)==(o|0)?1:1.5;o=h>>>1|0;q=m>>>0>>0?.5:(o|0)==(m|0)?q:1.5;if(!(I[y|0]!=45|A)){q=-q;b=-b}H[l>>2]=d;if(b+q==b){break j}d=d+h|0;H[l>>2]=d;if(d>>>0>=1e9){while(1){H[l>>2]=0;l=l-4|0;if(l>>>0>>0){j=j-4|0;H[j>>2]=0}d=H[l>>2]+1|0;H[l>>2]=d;if(d>>>0>999999999){continue}break}}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break j}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=l+4|0;g=d>>>0>>0?d:g}while(1){h=g;m=g>>>0<=j>>>0;if(!m){g=g-4|0;if(!H[g>>2]){continue}}break}l:{if((t|0)!=103){d=e&8;break l}d=k?k:1;g=(d|0)>(i|0)&(i|0)>-5;k=(g?i^-1:-1)+d|0;f=(g?-1:-2)+f|0;d=e&8;if(d){break l}g=-9;m:{if(m){break m}l=H[h-4>>2];if(!l){break m}d=10;g=0;if((l>>>0)%10|0){break m}while(1){m=g;g=g+1|0;d=N(d,10);if(!((l>>>0)%(d>>>0)|0)){continue}break}g=m^-1}m=N(h-p>>2,9);if((f&-33)==70){d=0;g=(g+m|0)-9|0;g=(g|0)>0?g:0;k=(g|0)>(k|0)?k:g;break l}d=0;g=((i+m|0)+g|0)-9|0;g=(g|0)>0?g:0;k=(g|0)>(k|0)?k:g}l=-1;t=d|k;if(((t?2147483645:2147483646)|0)<(k|0)){break b}m=(((t|0)!=0)+k|0)+1|0;o=f&-33;n:{if((o|0)==70){if((m^2147483647)<(i|0)){break b}g=(i|0)>0?i:0;break n}g=i>>31;g=$a((g^i)-g|0,0,v);if((v-g|0)<=1){while(1){g=g-1|0;F[g|0]=48;if((v-g|0)<2){continue}break}}u=g-2|0;F[u|0]=f;F[g-1|0]=(i|0)<0?45:43;g=v-u|0;if((g|0)>(m^2147483647)){break b}}f=g+m|0;if((f|0)>(r^2147483647)){break b}f=f+r|0;Na(a,32,c,f,e);La(a,y,r);Na(a,48,c,f,e^65536);o:{p:{q:{if((o|0)==70){d=n+16|9;i=j>>>0>p>>>0?p:j;j=i;while(1){g=$a(H[j>>2],0,d);r:{if((i|0)!=(j|0)){if(n+16>>>0>=g>>>0){break r}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break r}if((d|0)!=(g|0)){break r}g=g-1|0;F[g|0]=48}La(a,g,d-g|0);j=j+4|0;if(p>>>0>=j>>>0){continue}break}if(t){La(a,1684,1)}if((k|0)<=0|h>>>0<=j>>>0){break q}while(1){g=$a(H[j>>2],0,d);if(g>>>0>n+16>>>0){while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}}La(a,g,(k|0)>=9?9:k);g=k-9|0;j=j+4|0;if(h>>>0<=j>>>0){break p}i=(k|0)>9;k=g;if(i){continue}break}break p}s:{if((k|0)<0){break s}p=h>>>0>j>>>0?h:j+4|0;i=n+16|9;h=j;while(1){g=$a(H[h>>2],0,i);if((i|0)==(g|0)){g=g-1|0;F[g|0]=48}t:{if((h|0)!=(j|0)){if(n+16>>>0>=g>>>0){break t}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break t}La(a,g,1);g=g+1|0;if(!(d|k)){break t}La(a,1684,1)}m=g;g=i-g|0;La(a,m,(g|0)<(k|0)?g:k);k=k-g|0;h=h+4|0;if(p>>>0<=h>>>0){break s}if((k|0)>=0){continue}break}}Na(a,48,k+18|0,18,0);La(a,u,v-u|0);break o}g=k}Na(a,48,g+9|0,9,0)}Na(a,32,c,f,e^8192);l=(c|0)>(f|0)?c:f;break b}j=(f<<26>>31&9)+y|0;u:{if(d>>>0>11){break u}g=12-d|0;q=16;while(1){q=q*16;g=g-1|0;if(g){continue}break}if(I[j|0]==45){b=-(q+(-b-q));break u}b=b+q-q}h=H[n+44>>2];g=h>>31;g=$a((g^h)-g|0,0,v);if((v|0)==(g|0)){g=g-1|0;F[g|0]=48;h=H[n+44>>2]}k=f&32;i=g-2|0;F[i|0]=f+15;F[g-1|0]=(h|0)<0?45:43;g=!(e&8)&(d|0)<=0;h=n+16|0;while(1){f=h;p=P(b)<2147483647?~~b:-2147483648;F[h|0]=k|I[p+26048|0];b=(b-+(p|0))*16;h=h+1|0;if(!(g&b==0|(h-(n+16|0)|0)!=1)){F[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}l=-1;g=v-i|0;if((2147483643-(g+r|0)|0)<(d|0)){break b}f=h;h=n+16|0;f=f-h|0;k=d?(f-2|0)<(d|0)?d+2|0:f:f;p=r|2;d=k+(p+g|0)|0;Na(a,32,c,d,e);La(a,j,p);Na(a,48,c,d,e^65536);La(a,h,f);Na(a,48,k-f|0,0,0);La(a,i,g);Na(a,32,c,d,e^8192);l=(c|0)>(d|0)?c:d}na=n+560|0;return l|0}function sc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=na+-64|0;na=j;H[j+60>>2]=b;z=j+41|0;A=j+39|0;t=j+40|0;a:{b:{c:{d:{e:while(1){h=0;f:while(1){k=b;if((o^2147483647)<(h|0)){break d}o=h+o|0;g:{h:{i:{j:{h=b;i=I[h|0];if(i){while(1){k:{b=i&255;l:{if(!b){b=h;break l}if((b|0)!=37){break k}i=h;while(1){if(I[i+1|0]!=37){b=i;break l}h=h+1|0;n=I[i+2|0];b=i+2|0;i=b;if((n|0)==37){continue}break}}h=h-k|0;y=o^2147483647;if((h|0)>(y|0)){break d}if(a){La(a,k,h)}if(h){continue f}H[j+60>>2]=b;h=b+1|0;q=-1;i=F[b+1|0]-48|0;if(!(I[b+2|0]!=36|i>>>0>9)){w=1;q=i;h=b+3|0}H[j+60>>2]=h;l=0;i=F[h|0];b=i-32|0;m:{if(b>>>0>31){n=h;break m}n=h;b=1<>2]=n;l=b|l;i=F[h+1|0];b=i-32|0;if(b>>>0>=32){break m}h=n;b=1<>>0>9)){p:{if(!a){H[(b<<2)+e>>2]=10;b=0;break p}b=H[(b<<3)+d>>2]}p=b;b=n+3|0;i=1;break o}if(w){break j}b=n+1|0;if(!a){H[j+60>>2]=b;w=0;p=0;break n}h=H[c>>2];H[c>>2]=h+4;p=H[h>>2];i=0}w=i;H[j+60>>2]=b;if((p|0)>=0){break n}p=0-p|0;l=l|8192;break n}p=rc(j+60|0);if((p|0)<0){break d}b=H[j+60>>2]}h=0;m=-1;u=0;q:{if(I[b|0]!=46){break q}if(I[b+1|0]==42){i=F[b+2|0]-48|0;r:{if(!(I[b+3|0]!=36|i>>>0>9)){b=b+4|0;s:{if(!a){H[(i<<2)+e>>2]=10;m=0;break s}m=H[(i<<3)+d>>2]}break r}if(w){break j}b=b+2|0;m=0;if(!a){break r}i=H[c>>2];H[c>>2]=i+4;m=H[i>>2]}H[j+60>>2]=b;u=(m|0)>=0;break q}H[j+60>>2]=b+1;m=rc(j+60|0);b=H[j+60>>2];u=1}while(1){x=h;n=28;r=b;i=F[b|0];if(i-123>>>0<4294967238){break c}b=b+1|0;h=I[(i+N(h,58)|0)+25519|0];if((h-1&255)>>>0<8){continue}break}H[j+60>>2]=b;t:{if((h|0)!=27){if(!h){break c}if((q|0)>=0){if(!a){H[(q<<2)+e>>2]=h;continue e}h=(q<<3)+d|0;i=H[h+4>>2];H[j+48>>2]=H[h>>2];H[j+52>>2]=i;break t}if(!a){break g}qc(j+48|0,h,c,g);break t}if((q|0)>=0){break c}h=0;if(!a){continue f}}if(I[a|0]&32){break b}i=l&-65537;l=l&8192?i:l;q=0;v=1072;n=t;u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{r=I[r|0];h=r<<24>>24;h=x?(r&15)==3?h&-45:h:h;switch(h-88|0){case 0:case 32:break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break h;case 9:case 13:case 14:case 15:break u;case 11:break B;case 12:case 17:break E;case 22:break I;case 23:break F;case 24:break H;case 27:break A;case 29:break J;default:break K}}L:{switch(h-65|0){case 1:case 3:break h;case 0:case 4:case 5:case 6:break u;case 2:break z;default:break L}}if((h|0)==83){break y}break h}i=H[j+48>>2];r=H[j+52>>2];v=1072;break D}h=0;M:{switch(x|0){case 0:H[H[j+48>>2]>>2]=o;continue f;case 1:H[H[j+48>>2]>>2]=o;continue f;case 2:k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f;case 3:G[H[j+48>>2]>>1]=o;continue f;case 4:F[H[j+48>>2]]=o;continue f;case 6:H[H[j+48>>2]>>2]=o;continue f;case 7:break M;default:continue f}}k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f}m=m>>>0<=8?8:m;l=l|8;h=120}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){x=h&32;while(1){b=b-1|0;F[b|0]=x|I[(s&15)+26048|0];s=(k&15)<<28|s>>>4;k=k>>>4|0;if(s|k){continue}break}}k=b;if(!(l&8)|!(i|r)){break C}v=(h>>>4|0)+1072|0;q=2;break C}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){while(1){b=b-1|0;F[b|0]=s&7|48;s=(k&7)<<29|s>>>3;k=k>>>3|0;if(s|k){continue}break}}k=b;if(!(l&8)){break C}b=z-b|0;m=(b|0)<(m|0)?m:b;break C}i=H[j+48>>2];b=H[j+52>>2];r=b;if((b|0)<0){h=0-(b+((i|0)!=0)|0)|0;r=h;i=0-i|0;H[j+48>>2]=i;H[j+52>>2]=h;q=1;v=1072;break D}if(l&2048){q=1;v=1073;break D}q=l&1;v=q?1074:1072}k=$a(i,r,t)}if((m|0)<0&u){break d}l=u?l&-65537:l;if(!((i|r)!=0|m)){k=t;m=0;break h}b=!(i|r)+(t-k|0)|0;m=(b|0)<(m|0)?m:b;break h}h=I[j+48|0];break i}h=m>>>0>=2147483647?2147483647:m;l=h;n=(h|0)!=0;b=H[j+48>>2];k=b?b:1686;b=k;N:{O:{P:{Q:{if(!(b&3)|!h){break Q}while(1){if(!I[b|0]){break P}l=l-1|0;n=(l|0)!=0;b=b+1|0;if(!(b&3)){break Q}if(l){continue}break}}if(!n){break O}if(!(!I[b|0]|l>>>0<4)){while(1){n=H[b>>2];if(((16843008-n|n)&-2139062144)!=-2139062144){break P}b=b+4|0;l=l-4|0;if(l>>>0>3){continue}break}}if(!l){break O}}while(1){if(!I[b|0]){break N}b=b+1|0;l=l-1|0;if(l){continue}break}}b=0}b=b?b-k|0:h;n=b+k|0;if((m|0)>=0){l=i;m=b;break h}l=i;m=b;if(I[n|0]){break d}break h}h=H[j+48>>2];if(h|H[j+52>>2]){break x}h=0;break i}if(m){i=H[j+48>>2];break w}h=0;Na(a,32,p,0,l);break v}H[j+12>>2]=0;H[j+8>>2]=h;i=j+8|0;H[j+48>>2]=i;m=-1}h=0;while(1){R:{k=H[i>>2];if(!k){break R}k=oc(j+4|0,k);if((k|0)<0){break b}if(k>>>0>m-h>>>0){break R}i=i+4|0;h=h+k|0;if(m>>>0>h>>>0){continue}}break}n=61;if((h|0)<0){break c}Na(a,32,p,h,l);if(!h){h=0;break v}n=0;i=H[j+48>>2];while(1){k=H[i>>2];if(!k){break v}m=j+4|0;k=oc(m,k);n=k+n|0;if(n>>>0>h>>>0){break v}La(a,m,k);i=i+4|0;if(h>>>0>n>>>0){continue}break}}Na(a,32,p,h,l^8192);h=(h|0)<(p|0)?p:h;continue f}if((m|0)<0&u){break d}n=61;h=ra[f|0](a,M[j+48>>3],p,m,l,h)|0;if((h|0)>=0){continue f}break c}i=I[h+1|0];h=h+1|0;continue}}if(a){break a}if(!w){break g}h=1;while(1){a=H[(h<<2)+e>>2];if(a){qc((h<<3)+d|0,a,c,g);o=1;h=h+1|0;if((h|0)!=10){continue}break a}break}if(h>>>0>=10){o=1;break a}while(1){if(H[(h<<2)+e>>2]){break j}o=1;h=h+1|0;if((h|0)!=10){continue}break}break a}n=28;break c}F[j+39|0]=h;m=1;k=A;l=i}i=n-k|0;m=(i|0)<(m|0)?m:i;if((m|0)>(q^2147483647)){break d}n=61;b=m+q|0;h=(b|0)<(p|0)?p:b;if(y>>>0>>0){break c}Na(a,32,h,b,l);La(a,v,q);Na(a,48,h,b,l^65536);Na(a,48,m,i,0);La(a,k,i);Na(a,32,h,b,l^8192);b=H[j+60>>2];continue}break}break}o=0;break a}n=61}H[6597]=n}o=-1}na=j- -64|0;return o}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=na-80|0;na=i;H[i+76>>2]=1;a:{b:{if(H[a+128>>2]!=1|H[a+132>>2]!=1|(H[a+108>>2]|H[a+112>>2])){break b}j=H[a+100>>2];if(H[j>>2]|H[j+4>>2]|(H[j+8>>2]!=H[a+116>>2]|H[j+12>>2]!=H[a+120>>2])){break b}if(!cb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}c:{d:{if(!H[i+76>>2]){break d}if(!ib(a,H[i+72>>2],0,0,b,c)){break d}b=H[a+100>>2];if(H[b+16>>2]){break c}d=1;break a}Ba(c,1,8776,0);break a}e=H[b+24>>2];while(1){b=N(g,52);Ca(H[(b+e|0)+44>>2]);c=H[a+100>>2];e=H[c+24>>2];j=b+e|0;m=H[a+232>>2];d=H[H[H[m+20>>2]>>2]+20>>2]+N(g,76)|0;H[j+44>>2]=H[d+36>>2];H[j+36>>2]=H[(b+H[H[m+24>>2]+24>>2]|0)+36>>2];H[d+36>>2]=0;d=1;g=g+1|0;if(g>>>0>2]){continue}break}break a}H[a+80>>2]=0;H[a+84>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;e:{if(!(H[a+28>>2]|H[a+32>>2]|H[a+36>>2]!=H[a+128>>2])){j=2;if(H[a+40>>2]==H[a+132>>2]){break e}}j=2;if(H[a+76>>2]){break e}if(!Ab(b)){break e}q=H[a+128>>2];j=N(q,H[a+132>>2]);if(j){h=H[H[a+224>>2]+40>>2];f:{g:{if((j|0)==1){j=0;break g}k=j&1;n=j&-2;j=0;while(1){d=h+N(g,40)|0;f=H[d+4>>2];if(f){l=(H[d+16>>2]+N(f,24)|0)-8|0;f=H[l>>2];o=f;p=f>>>0>j>>>0;f=H[l+4>>2];l=p&(f|0)>=(m|0)|(f|0)>(m|0);j=l?o:j;m=l?f:m}f=H[d+44>>2];if(f){f=(H[d+56>>2]+N(f,24)|0)-8|0;d=H[f>>2];o=d;l=d>>>0>j>>>0;d=H[f+4>>2];f=l&(d|0)>=(m|0)|(d|0)>(m|0);j=f?o:j;m=f?d:m}g=g+2|0;e=e+2|0;if((n|0)!=(e|0)){continue}break}if(!k){break f}}d=h+N(g,40)|0;h=H[d+4>>2];if(!h){break f}h=(H[d+16>>2]+N(h,24)|0)-8|0;d=H[h>>2];f=d;k=d>>>0>j>>>0;d=H[h+4>>2];h=k&(d|0)>=(m|0)|(d|0)>(m|0);j=h?f:j;m=h?d:m}j=j+2|0;m=j>>>0<2?m+1|0:m}else{j=2;m=0}g=0;k=H[a+32>>2];p=H[a+40>>2];h:{if(k>>>0>=p>>>0){break h}h=H[a+28>>2];f=H[a+36>>2];if(h>>>0>=f>>>0){break h}n=f-h&3;s=H[H[a+224>>2]+40>>2];t=h-f>>>0>4294967292;while(1){l=s+N(N(k,q),40)|0;d=h;e=0;if(n){while(1){g=H[(l+N(d,40)|0)+4>>2]+g|0;d=d+1|0;e=e+1|0;if((n|0)!=(e|0)){continue}break}}if(!t){while(1){e=l+N(d,40)|0;g=H[e+124>>2]+(H[e+84>>2]+(H[e+44>>2]+(H[e+4>>2]+g|0)|0)|0)|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}k=k+1|0;if((p|0)!=(k|0)){continue}break}}f=Fa(g<<3);H[a+88>>2]=f;if(!g|!f){break e}g=0;d=H[a+40>>2];n=H[a+32>>2];i:{if(d>>>0<=n>>>0){break i}e=H[a+36>>2];if(e>>>0<=K[a+28>>2]){break i}while(1){f=H[a+28>>2];if(e>>>0>f>>>0){s=H[H[a+224>>2]+40>>2]+N(N(H[a+128>>2],n),40)|0;while(1){h=s+N(f,40)|0;d=H[h+4>>2];if(d){q=d&3;p=H[h+16>>2];h=0;j:{k:{if(d>>>0<4){d=0;break k}t=d&-4;d=0;k=0;while(1){e=p+N(d,24)|0;r=H[e+4>>2];l=g<<3;o=l+H[a+88>>2]|0;H[o>>2]=H[e>>2];H[o+4>>2]=r;r=H[e+28>>2];o=l+H[a+88>>2]|0;H[o+8>>2]=H[e+24>>2];H[o+12>>2]=r;r=H[e+52>>2];o=l+H[a+88>>2]|0;H[o+16>>2]=H[e+48>>2];H[o+20>>2]=r;o=H[e+76>>2];l=l+H[a+88>>2]|0;H[l+24>>2]=H[e+72>>2];H[l+28>>2]=o;d=d+4|0;g=g+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!q){break j}}while(1){k=p+N(d,24)|0;l=H[k+4>>2];e=H[a+88>>2]+(g<<3)|0;H[e>>2]=H[k>>2];H[e+4>>2]=l;d=d+1|0;g=g+1|0;h=h+1|0;if((q|0)!=(h|0)){continue}break}}e=H[a+36>>2]}f=f+1|0;if(e>>>0>f>>>0){continue}break}d=H[a+40>>2]}n=n+1|0;if(n>>>0>>0){continue}break}f=H[a+88>>2]}H[a+84>>2]=g;e=na-208|0;na=e;H[e+8>>2]=1;H[e+12>>2]=0;h=g<<3;l:{if(!h){break l}H[e+16>>2]=8;H[e+20>>2]=8;d=2;while(1){g=(e+16|0)+(d<<2)|0;k=H[g-4>>2]+(H[g-8>>2]+8|0)|0;H[g>>2]=k;d=d+1|0;if(h>>>0>k>>>0){continue}break}d=h-8|0;m:{if((d|0)<=0){g=0;h=1;d=1;k=0;break m}g=d+f|0;h=1;d=1;while(1){n:{if((h&3)==3){Bb(f,d,e+16|0);ub(e+8|0,2);d=d+2|0;break n}n=e+16|0;k=d-1|0;o:{if(K[n+(k<<2)>>2]>=g-f>>>0){tb(f,h,H[e+12>>2],d,0,n);break o}Bb(f,d,e+16|0)}if((d|0)==1){sb(e+8|0,1);d=0;break n}sb(e+8|0,k);d=1}h=H[e+8>>2]|1;H[e+8>>2]=h;f=f+8|0;if(g>>>0>f>>>0){continue}break}g=H[e+12>>2];k=(g|0)!=0}tb(f,h,g,d,0,e+16|0);h=H[e+8>>2];if(!(k|((d|0)!=1|(h|0)!=1))){break l}while(1){p:{if((d|0)<=1){h=wc(h,g);ub(e+8|0,h);d=d+h|0;break p}g=e+8|0;sb(g,2);H[e+8>>2]=H[e+8>>2]^7;ub(g,1);n=f-8|0;k=e+16|0;h=d-2|0;tb(n-H[k+(h<<2)>>2]|0,H[e+8>>2],H[e+12>>2],d-1|0,1,k);sb(g,1);d=H[e+8>>2]|1;H[e+8>>2]=d;tb(n,d,H[e+12>>2],h,1,k);d=h}f=f-8|0;g=H[e+12>>2];h=H[e+8>>2];if(g|((d|0)!=1|(h|0)!=1)){continue}break}}na=e+208|0}d=H[a+128>>2];e=0;q:{while(1){r:{if(!(!H[H[a+180>>2]+5596>>2]|((d|0)!=1|H[a+132>>2]!=1))){H[i+72>>2]=0;H[a+228>>2]=0;H[a+8>>2]=H[a+8>>2]|128;d=0;break r}d=0;if(!cb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}if(!H[i+76>>2]){break q}d=H[i+72>>2]}h=d+1|0;f=ib(a,d,0,0,b,c);g=N(H[a+128>>2],H[a+132>>2]);if(!f){H[i+4>>2]=g;H[i>>2]=h;Ba(c,1,7537,i);d=0;break a}H[i+36>>2]=g;H[i+32>>2]=h;Ba(c,4,11795,i+32|0);if(!Hc(H[a+232>>2],H[H[a+100>>2]+24>>2])){d=0;break a}s:{if(!(H[a+128>>2]!=1|H[a+132>>2]!=1)){g=H[a+100>>2];f=H[a+96>>2];if(H[g>>2]!=H[f>>2]|H[g+4>>2]!=H[f+4>>2]|(H[g+8>>2]!=H[f+8>>2]|H[g+12>>2]!=H[f+12>>2])){break s}}d=H[a+180>>2]+N(d,5644)|0;g=H[d+5596>>2];if(!g){break s}Ca(g);H[d+5596>>2]=0;H[d+5600>>2]=0}H[i+16>>2]=h;Ba(c,4,16601,i+16|0);if(!(Qa(b)|qa)&H[a+8>>2]==64){break q}e=e+1|0;d=H[a+128>>2];if((e|0)==(N(d,H[a+132>>2])|0)){break q}h=H[a+84>>2];if(!h|(h|0)!=H[a+80>>2]){continue}break}nc(b,j,m,c)}d=Gc(a,c)}na=i+80|0;return d|0}function Ya(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=H[a+32>>2];a:{if(d){break a}b:{h=H[a+16>>2];if((h|0)>=6){b=H[a+8>>2];f=H[a+12>>2];d=h;break b}b=H[a+20>>2];c:{d:{if((b|0)>=5){c=H[a>>2];d=H[c>>2];H[a>>2]=c+4;g=b-4|0;break d}if((b|0)<=0){d=-1;break c}c=H[a>>2];e:{if((b|0)==1){e=-1;b=0;break e}d=0;f:{g:{if((b|0)==2){e=-1;i=b;break g}f=b-1|0;k=f&1;j=f&-2;e=-1;i=b;while(1){f=c;H[a>>2]=c+1;l=I[c|0];c=c+2|0;H[a>>2]=c;H[a+20>>2]=i-1;f=I[f+1|0];i=i-2|0;H[a+20>>2]=i;e=((255<>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<>2]=c+1;d=(255<>2]=g}b=H[a+24>>2];c=d>>>24|0;H[a+24>>2]=(c|0)==255;g=d>>>16&255;k=(g|0)==255;f=d&255;e=(f|0)==255;j=b+e|0;b=d>>>8&255;i=(b|0)==255;j=k+(j+i|0)|0;d=(h-j|0)+32|0;H[a+16>>2]=d;l=H[a+12>>2];b=c|(g|(b|f<<(e?7:8))<<(i?7:8))<<(k?7:8);f=(j-h|0)+32|0;c=f&31;if((f&63)>>>0>=32){i=b<>>32-c;g=b<>2];c=i|l;f=c;H[a+8>>2]=b;H[a+12>>2]=c;if((d|0)>=6){break b}d=0;break a}e=H[a+28>>2];i=H[(e<<2)+20752>>2];h:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break h}g=b;h=63-i|0;c=h&31;if((h&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<>>32-h|f<>2]=g;H[a+12>>2]=b;i=H[a+44>>2]|c>>31;j=H[a+40>>2]&-64|c;H[a+40>>2]=j;H[a+44>>2]=i;if((d|0)<6){d=1;break a}b=H[(e<<2)+20752>>2];i:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break i}k=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){k=f>>>c|0}else{k=((1<>>c}c=(k&(-1<>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=k;H[a+12>>2]=b;b=c>>31<<7|c>>>25|i;h=b;j=j&-8065|c<<7;H[a+40>>2]=j;H[a+44>>2]=b;if((d|0)<6){d=2;break a}b=H[(e<<2)+20752>>2];j:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break j}g=k;i=63-b|0;c=i&31;if((i&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<>>32-g|f<>2]=g;f=i;H[a+12>>2]=f;b=c>>31<<14|c>>>18|h;i=b;k=j&-1032193|c<<14;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=3;break a}b=H[(e<<2)+20752>>2];k:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break k}j=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=g;H[a+12>>2]=b;b=c>>31<<21|c>>>11|i;j=b;k=k&-132120577|c<<21;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=4;break a}b=H[(e<<2)+20752>>2];l:{if((f|0)<0){c=(-1<=11?11:e)+1|0;d=d-1|0;break l}h=g;i=63-b|0;c=i&31;if((i&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}c=(i&(-1<>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<>>32-e|f<>2]=g;f=b;H[a+12>>2]=b;b=j&-4|(c>>31<<28|c>>>4);j=b;k=k&268435455|c<<28;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=5;break a}b=H[(h<<2)+20752>>2];m:{if((f|0)<0){e=(-1<=11?11:h)+1|0;i=d-1|0;break m}i=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}e=(i&(-1<>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<>>32-c|f<>2]=g;H[a+12>>2]=b;b=j&-505|e<<3;l=b;H[a+40>>2]=k;H[a+44>>2]=b;d=6;if((i|0)<6){break a}b=H[(h<<2)+20752>>2];n:{if((c|0)<0){e=(-1<=11?11:h)+1|0;d=i-1|0;break n}d=g;e=63-b|0;f=e&31;if((e&63)>>>0>=32){f=c>>>f|0}else{f=((1<>>f}e=(f&(-1<>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<>>32-f|c<>2]=g;f=i;H[a+12>>2]=f;i=k;b=l&-64513|e<<10;k=b;H[a+40>>2]=i;H[a+44>>2]=b;if((d|0)<6){d=7;break a}b=H[(h<<2)+20752>>2];o:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:h)+1|0;break o}j=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<>>32-e|f<>2]=g;H[a+12>>2]=b;H[a+40>>2]=i;H[a+44>>2]=k&-8257537|c<<17;d=8}H[a+32>>2]=d-1;f=H[a+44>>2];b=f>>>7|0;c=H[a+40>>2];H[a+40>>2]=(f&127)<<25|c>>>7;H[a+44>>2]=b;return c&127}function Ub(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;p=na-32|0;na=p;H[p+24>>2]=f;r=H[(N(H[d+28>>2],76)+b|0)+28>>2]+N(H[d+32>>2],152)|0;a:{if(!(H[d+40>>2]|!H[r+24>>2])){k=r+28|0;while(1){b:{if(Qb(k)){break b}b=H[d+36>>2];if(b>>>0>=K[k+24>>2]/40>>>0){Ba(i,1,2836,0);break a}b=H[k+20>>2]+N(b,40)|0;fc(H[b+32>>2]);fc(H[b+36>>2]);o=N(H[b+20>>2],H[b+16>>2]);if(!o){break b}q=o&7;b=H[b+24>>2];if(o>>>0>=8){o=o&-8;j=0;while(1){H[b+516>>2]=0;H[b+520>>2]=0;H[b+448>>2]=0;H[b+452>>2]=0;H[b+380>>2]=0;H[b+384>>2]=0;H[b+312>>2]=0;H[b+316>>2]=0;H[b+244>>2]=0;H[b+248>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;b=b+544|0;j=j+8|0;if((o|0)!=(j|0)){continue}break}if(!q){break b}}j=0;while(1){H[b+40>>2]=0;H[b+44>>2]=0;b=b+68|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}k=k+36|0;n=n+1|0;if(n>>>0>2]){continue}break}}q=f;c:{if(!(I[c|0]&2)){break c}if(h>>>0<=5){Ba(i,2,4196,0);break c}if(!(I[f|0]==255&I[f+1|0]==145)){Ba(i,2,4238,0);break c}q=f+6|0;H[p+24>>2]=q}l=Fa(20);if(!l){break a}d:{if(F[a+108|0]&1){q=H[a+40>>2];o=a+44|0;h=a+40|0;break d}if(I[c+5640|0]&2){q=H[c+5168>>2];o=c+5180|0;h=c+5168|0;break d}H[p+28>>2]=(f+h|0)-q;o=p+28|0;h=p+24|0}a=H[o>>2];H[l+12>>2]=0;H[l+16>>2]=0;H[l+8>>2]=q;H[l>>2]=q;H[l+4>>2]=a+q;if(!Ra(l,1)){hc(l);a=ic(l);db(l);a=a+q|0;b=H[h>>2];d=H[o>>2];if(I[c|0]&4){if(b+(d-a|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[a|0]==255&I[a+1|0]==146)){Ba(i,1,4401,0);break a}a=a+2|0}a=a-b|0;H[o>>2]=d-a;H[h>>2]=a+b;H[e>>2]=0;H[g>>2]=H[p+24>>2]-f;x=1;break a}if(H[r+24>>2]){t=r+28|0;while(1){a=H[d+36>>2];b=H[t+20>>2];e:{if(Qb(t)){break e}u=b+N(a,40)|0;z=N(H[u+20>>2],H[u+16>>2]);if(!z){break e}k=H[u+24>>2];v=0;while(1){f:{g:{if(!H[k+40>>2]){a=dc(l,H[u+32>>2],v,H[d+40>>2]+1|0);break g}a=Ra(l,1)}if(!a){H[k+36>>2]=0;break f}if(!H[k+40>>2]){b=0;while(1){a=b;b=b+1|0;if(!dc(l,H[u+36>>2],v,a)){continue}break}b=H[t+28>>2];H[k+32>>2]=3;H[k+24>>2]=b;H[k+28>>2]=(b-a|0)+1}a=1;h:{if(!Ra(l,1)){break h}a=2;if(!Ra(l,1)){break h}a=Ra(l,2);if((a|0)!=3){a=a+3|0;break h}a=Ra(l,5);if((a|0)!=31){a=a+6|0;break h}a=Ra(l,7)+37|0}H[k+36>>2]=a;b=0;while(1){a=b;b=b+1|0;if(Ra(l,1)){continue}break}H[k+32>>2]=a+H[k+32>>2];i:{a=H[k+40>>2];j:{k:{if(!a){a=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];if(!H[k+48>>2]){b=Ha(H[k>>2],240);if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=10}j=H[k>>2];kb(j);b=a&4?1:a&1?10:109;a=0;break k}b=H[k>>2];n=a-1|0;j=b+N(n,24)|0;if(H[j+4>>2]!=H[j+12>>2]){break j}n=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];j=H[k+48>>2];if(j>>>0>>0){j=j+10|0;b=Ha(b,N(j,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=j;b=H[k>>2]}j=N(a,24)+b|0;kb(j);b=1;l:{if(n&4){break l}b=109;if(!(n&1)){break l}b=H[j-12>>2];b=(b|0)==1?2:(b|0)==10?2:1}}n=a;H[j+12>>2]=b}a=H[k+36>>2];if(I[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16|0]&64){while(1){m=N(n,24);s=n?a:1;H[(m+H[k>>2]|0)+16>>2]=s;w=H[k+32>>2];j=0;b=a;if(s>>>0>=2){while(1){j=j+1|0;s=b>>>0>3;b=b>>>1|0;if(s){continue}break}}b=j+w|0;if(b>>>0>=33){H[p+16>>2]=b;Ba(i,1,15535,p+16|0);break i}j=Ra(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;kb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}while(1){m=N(n,24);j=m+H[k>>2]|0;b=H[j+12>>2]-H[j+4>>2]|0;b=(a|0)>(b|0)?b:a;H[j+16>>2]=b;s=H[k+32>>2];j=0;if(b>>>0>=2){while(1){j=j+1|0;w=b>>>0>3;b=b>>>1|0;if(w){continue}break}}b=j+s|0;if(b>>>0>=33){H[p>>2]=b;Ba(i,1,15535,p);break i}j=Ra(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;kb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}db(l);break a}k=k+68|0;v=v+1|0;if((z|0)!=(v|0)){continue}break}}t=t+36|0;A=A+1|0;if(A>>>0>2]){continue}break}}if(!hc(l)){db(l);break a}a=ic(l);db(l);b=a+q|0;a=H[h>>2];if(I[c|0]&4){if(a+(H[o>>2]-b|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[b|0]==255&I[b+1|0]==146)){Ba(i,1,4401,0);break a}b=b+2|0}if((a|0)==(b|0)){break a}H[o>>2]=H[o>>2]+(a-b|0);H[h>>2]=b;x=1;H[e>>2]=1;H[g>>2]=H[p+24>>2]-f}na=p+32|0;return x}function Gb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;a:{if(!c){break a}b:{e=H[a+184>>2];if(!e){break b}f=H[a+96>>2];if(!f|!H[f+16>>2]|(e|0)!=H[H[f+24>>2]+40>>2]){break b}f=H[c+16>>2];if(!f){break b}n=H[c+24>>2];if(H[n+40>>2]|H[n+44>>2]){break b}i=f&7;c:{if(f>>>0>=8){p=f&-8;while(1){f=N(h,52)+n|0;H[f+404>>2]=e;H[f+352>>2]=e;H[f+300>>2]=e;H[f+248>>2]=e;H[f+196>>2]=e;H[f+144>>2]=e;H[f+92>>2]=e;H[f+40>>2]=e;h=h+8|0;g=g+8|0;if((g|0)!=(p|0)){continue}break}if(!i){break c}}while(1){H[(N(h,52)+n|0)+40>>2]=e;h=h+1|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}e=0;p=0;n=na-32|0;na=n;v=H[c+16>>2];d:{if(!v){e=1;break d}h=H[c>>2];f=h>>31;q=f;e:{if((f|0)<0){break e}i=H[c+4>>2];f=i>>31;m=f;if((f|0)<0){break e}g=H[c+8>>2];f=g>>31;s=f;if((f|0)<0){break e}j=H[c+12>>2];r=j>>31;if((r|0)<0){break e}f=H[c+24>>2];y=h-1|0;w=q-!h|0;z=i-1|0;x=m-!i|0;A=g-1|0;B=s-!g|0;C=j-1|0;D=r-!j|0;while(1){e=H[f>>2];h=e+y|0;i=e>>>0>h>>>0?w+1|0:w;j=ve(h,i,e,0);H[f+16>>2]=j;i=H[f+4>>2];h=i+z|0;g=i>>>0>h>>>0?x+1|0:x;r=ve(h,g,i,0);H[f+20>>2]=r;h=H[f+40>>2];g=h&31;if((h&63)>>>0>=32){q=1<>>32-g}s=m-1|0;g=q-!m|0;u=g;t=e>>31;l=t+B|0;o=l+1|0;g=l;l=e+A|0;g=ue(l,l>>>0>>0?o:g,e,t);e=u+(g>>31)|0;o=e+1|0;l=e;e=g+s|0;t=g>>>0>e>>>0?o:l;g=h&31;l=(j>>31)+u|0;E=l+1|0;o=l;l=j+s|0;j=j>>>0>l>>>0?E:o;if((h&63)>>>0>=32){g=t>>g}else{g=((1<>>g}e=h&31;if((h&63)>>>0>=32){e=j>>e}else{e=((1<>>e}e=g-e|0;if((e|0)<0){H[n+4>>2]=e;H[n>>2]=p;Ba(d,1,13510,n);e=0;break d}H[f+8>>2]=e;e=i>>31;g=e+D|0;o=g+1|0;l=g;g=i+C|0;j=g>>>0>>0?o:l;i=ue(g,j,i,e);e=(i>>31)+u|0;g=e+1|0;l=e;e=i+s|0;g=i>>>0>e>>>0?g:l;i=h&31;j=q+(r>>31)|0;o=j+1|0;l=j;j=m+r|0;q=j>>>0>>0?o:l;m=j-1|0;if((h&63)>>>0>=32){l=g>>i}else{l=((1<>>i}i=q-!j|0;e=h&31;if((h&63)>>>0>=32){m=i>>e}else{m=((1<>>e}e=l-m|0;if((e|0)<0){H[n+20>>2]=e;H[n+16>>2]=p;Ba(d,1,13579,n+16|0);e=0;break d}H[f+12>>2]=e;f=f+52|0;e=1;p=p+1|0;if((v|0)!=(p|0)){continue}break}break d}Ba(d,1,6720,0)}na=n+32|0;if(e){break b}return 0}e=H[a+100>>2];if(!e){e=Eb();H[a+100>>2]=e;if(!e){break a}}Ec(c,e);if(!Wa(H[a+216>>2],22,d)){break a}h=H[a+216>>2];f=H[h>>2];e=H[h+8>>2];f:{if(f){k=1;g:{if((f|0)!=1){n=f&1;i=f&-2;f=0;while(1){m=0;h:{if(!k){break h}m=0;if(!(ra[H[e>>2]](a,b,d)|0)){break h}m=(ra[H[e+4>>2]](a,b,d)|0)!=0}k=m;e=e+8|0;f=f+2|0;if((i|0)!=(f|0)){continue}break}if(!n){break g}}if(!k){k=0;break g}k=(ra[H[e>>2]](a,b,d)|0)!=0}Pa(h);if(k){break f}Ua(H[a+96>>2]);H[a+96>>2]=0;return 0}Pa(h)}f=0;b=0;d=0;i:{j:{k:{e=H[a+60>>2];if(!e){if(H[c+16>>2]){break k}k=1;break i}h=Fa(N(e,52));if(!h){break j}e=0;if(H[c+16>>2]){b=H[c+24>>2];while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[c+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;e=H[c+16>>2];if(d>>>0>>0){continue}break}}if(H[a+60>>2]){d=H[H[a+100>>2]+24>>2];e=0;while(1){b=h+N(e,52)|0;f=N(H[H[a+64>>2]+(e<<2)>>2],52);d=f+d|0;H[b+48>>2]=H[d+48>>2];k=H[d+44>>2];H[b+40>>2]=H[d+40>>2];H[b+44>>2]=k;k=H[d+36>>2];H[b+32>>2]=H[d+32>>2];H[b+36>>2]=k;k=H[d+28>>2];H[b+24>>2]=H[d+24>>2];H[b+28>>2]=k;k=H[d+20>>2];H[b+16>>2]=H[d+16>>2];H[b+20>>2]=k;k=H[d+12>>2];H[b+8>>2]=H[d+8>>2];H[b+12>>2]=k;k=H[d+4>>2];H[b>>2]=H[d>>2];H[b+4>>2]=k;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[b+36>>2]=H[f+36>>2];H[b+44>>2]=H[f+44>>2];H[f+44>>2]=0;e=e+1|0;f=H[a+60>>2];if(e>>>0>>0){continue}break}e=H[c+16>>2]}if(e){b=H[H[a+100>>2]+24>>2];d=0;while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[H[a+100>>2]+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;if(d>>>0>2]){continue}break}f=H[a+60>>2]}H[c+16>>2]=f;Ca(H[c+24>>2]);H[c+24>>2]=h;k=1;break i}e=H[c+24>>2];d=H[H[a+100>>2]+24>>2];while(1){f=N(b,52);e=f+e|0;H[e+36>>2]=H[(d+f|0)+36>>2];Ca(H[e+44>>2]);e=H[c+24>>2];m=f+e|0;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[m+44>>2]=H[f+44>>2];H[f+44>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}k=1;break i}Ua(H[a+96>>2]);H[a+96>>2]=0;k=0}}return k|0}function zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=(c<<2)+b|0;e=H[a>>2];f=H[a+12>>2]<<5;i=e+f|0;l=e-f|0;e=H[a+16>>2];k=H[a+28>>2];h=H[a+20>>2];m=H[a+8>>2];a:{b:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=h>>>0){break a}c:{switch(d-1|0){case 1:f=e+1|0;if(h-e&1){j=i+(e<<6)|0;e=(e<<2)+b|0;L[j>>2]=L[e>>2];L[j+4>>2]=L[e+(c<<2)>>2];e=f}if((f|0)==(h|0)){break a}while(1){f=i+(e<<6)|0;j=(e<<2)+b|0;L[f>>2]=L[j>>2];g=f;f=c<<2;L[g+4>>2]=L[f+j>>2];j=e+1|0;g=i+(j<<6)|0;j=(j<<2)+b|0;L[g>>2]=L[j>>2];L[g+4>>2]=L[f+j>>2];e=e+2|0;if((h|0)!=(e|0)){continue}break};break a;case 0:break c;default:break b}}f=e;g=h-e&3;if(g){j=0;while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];f=f+1|0;j=j+1|0;if((g|0)!=(j|0)){continue}break}}if(e-h>>>0>4294967292){break a}while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];e=f+1|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+2|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+3|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];f=f+4|0;if((h|0)!=(f|0)){continue}break}break a}if(e>>>0>=h>>>0){break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];g=c+g<<2;L[f+20>>2]=L[g+b>>2];g=g+j|0;L[f+24>>2]=L[g>>2];L[f+28>>2]=L[g+(c<<2)>>2];e=e+1|0;if((h|0)!=(e|0)){continue}break}break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];d:{if((d|0)==3){break d}g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];if((d|0)==4){break d}g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];if((d|0)==5){break d}g=c+g|0;L[f+20>>2]=L[(g<<2)+b>>2];if((d|0)==6){break d}g=j+(g<<2)|0;L[f+24>>2]=L[g>>2];if((d|0)==7){break d}L[f+28>>2]=L[g+(c<<2)>>2]}e=e+1|0;if((h|0)!=(e|0)){continue}break}}b=(m<<2)+b|0;f=b+(c<<2)|0;e=H[a+24>>2];i=l+32|0;e:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=k>>>0){break e}f:{switch(d-1|0){case 1:a=e+1|0;if(k-e&1){d=i+(e<<6)|0;e=b+(e<<2)|0;L[d>>2]=L[e>>2];L[d+4>>2]=L[e+(c<<2)>>2];e=a}if((a|0)==(k|0)){break e}while(1){a=i+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];f=a;a=c<<2;L[f+4>>2]=L[a+d>>2];d=e+1|0;f=i+(d<<6)|0;d=b+(d<<2)|0;L[f>>2]=L[d>>2];L[f+4>>2]=L[a+d>>2];e=e+2|0;if((k|0)!=(e|0)){continue}break};break e;case 0:c=e;a=k-e&3;if(a){f=0;while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];c=c+1|0;f=f+1|0;if((a|0)!=(f|0)){continue}break}}if(e-k>>>0>4294967292){break e}while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];a=c+1|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+2|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+3|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];c=c+4|0;if((k|0)!=(c|0)){continue}break};break e;default:break f}}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];h=c+e|0;L[a+4>>2]=L[b+(h<<2)>>2];h=c+h|0;L[a+8>>2]=L[b+(h<<2)>>2];g:{if((d|0)==3){break g}h=c+h|0;L[a+12>>2]=L[b+(h<<2)>>2];if((d|0)==4){break g}h=c+h|0;L[a+16>>2]=L[b+(h<<2)>>2];if((d|0)==5){break g}h=c+h|0;L[a+20>>2]=L[b+(h<<2)>>2];if((d|0)==6){break g}h=f+(h<<2)|0;L[a+24>>2]=L[h>>2];if((d|0)==7){break g}L[a+28>>2]=L[h+(c<<2)>>2]}e=e+1|0;if((k|0)!=(e|0)){continue}break}break e}if(e>>>0>=k>>>0){break e}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];d=c+e|0;L[a+4>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+8>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+12>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+16>>2]=L[b+(d<<2)>>2];d=c+d<<2;L[a+20>>2]=L[d+b>>2];d=d+f|0;L[a+24>>2]=L[d>>2];L[a+28>>2]=L[d+(c<<2)>>2];e=e+1|0;if((k|0)!=(e|0)){continue}break}}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-176|0;na=f;a:{if(b&384){Ac(5943,11,c);break a}b:{if(!(b&1)){break b}g=H[a+96>>2];if(!g){break b}d=na-80|0;na=d;Ac(1792,13,c);F[d+79|0]=0;F[d+78|0]=9;e=H[g+4>>2];H[d+68>>2]=H[g>>2];H[d+72>>2]=e;e=d+78|0;H[d+64>>2]=e;Ga(c,7520,d- -64|0);i=H[g+12>>2];H[d+52>>2]=H[g+8>>2];H[d+56>>2]=i;H[d+48>>2]=e;Ga(c,7503,d+48|0);H[d+36>>2]=H[g+16>>2];H[d+32>>2]=e;Ga(c,7277,d+32|0);if(!(!H[g+24>>2]|!H[g+16>>2])){while(1){l=d+78|0;H[d+16>>2]=l;H[d+20>>2]=j;Ga(c,1824,d+16|0);i=H[g+24>>2];e=na-48|0;na=e;F[e+46|0]=9;F[e+47|0]=0;F[e+45|0]=9;i=N(j,52)+i|0;k=H[i+4>>2];H[e+36>>2]=H[i>>2];H[e+40>>2]=k;k=e+45|0;H[e+32>>2]=k;Ga(c,7209,e+32|0);H[e+20>>2]=H[i+24>>2];H[e+16>>2]=k;Ga(c,7455,e+16|0);H[e+4>>2]=H[i+32>>2];H[e>>2]=k;Ga(c,7428,e);na=e+48|0;H[d>>2]=l;Ga(c,1702,d);j=j+1|0;if(j>>>0>2]){continue}break}}Ac(1710,2,c);na=d+80|0}if(!(!(b&2)|!H[a+96>>2])){Ac(1931,36,c);d=H[a+112>>2];H[f+160>>2]=H[a+108>>2];H[f+164>>2]=d;Ga(c,2425,f+160|0);d=H[a+120>>2];H[f+144>>2]=H[a+116>>2];H[f+148>>2]=d;Ga(c,2391,f+144|0);d=H[a+132>>2];H[f+128>>2]=H[a+128>>2];H[f+132>>2]=d;Ga(c,2409,f+128|0);Hb(H[a+12>>2],H[H[a+96>>2]+16>>2],c);Ac(1710,2,c)}c:{if(!(b&8)|!H[a+96>>2]){break c}e=N(H[a+128>>2],H[a+132>>2]);if(!e){break c}d=H[a+180>>2];while(1){Hb(d,H[H[a+96>>2]+16>>2],c);d=d+5644|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}if(!(b&16)){break a}a=H[a+224>>2];Ac(1893,37,c);b=H[a>>2];d=H[a+4>>2];e=H[a+12>>2];H[f+120>>2]=H[a+8>>2];H[f+124>>2]=e;H[f+112>>2]=b;H[f+116>>2]=d;Ga(c,5730,f+112|0);Ac(1875,17,c);if(!(!H[a+28>>2]|!H[a+24>>2])){d=0;while(1){b=H[a+28>>2]+N(d,24)|0;e=J[b>>1];h=H[b+8>>2];g=H[b+12>>2];H[f+96>>2]=H[b+16>>2];H[f+88>>2]=h;H[f+92>>2]=g;H[f+80>>2]=e;Ga(c,7397,f+80|0);d=d+1|0;if(d>>>0>2]){continue}break}}Ac(1708,4,c);e=H[a+40>>2];d:{if(!e){break d}g=H[a+36>>2];if(!g){break d}h=0;d=0;while(1){b=e+N(d,40)|0;j=H[b+4>>2];e:{if(!j){break e}b=H[b+16>>2];if(!b){break e}i=H[b>>2];k=H[b+4>>2];if((k|0)<0){i=1}else{i=!i&(k|0)<=0}if(i|(H[b+8>>2]|H[b+12>>2])){break e}if(xc(1439)){break d}}h=h+j|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}if(!h){break d}Ac(1858,16,c);if(H[a+36>>2]){h=H[a+40>>2];g=0;while(1){b=N(g,40);j=H[(b+h|0)+4>>2];H[f+68>>2]=j;H[f+64>>2]=g;Ga(c,7467,f- -64|0);h=H[a+40>>2];f:{if(!j){break f}d=0;if(!H[(b+h|0)+16>>2]){break f}while(1){e=H[(b+H[a+40>>2]|0)+16>>2]+N(d,24)|0;h=H[e>>2];i=H[e+4>>2];k=H[e+8>>2];l=H[e+12>>2];m=H[e+20>>2];H[f+56>>2]=H[e+16>>2];H[f+60>>2]=m;H[f+48>>2]=k;H[f+52>>2]=l;H[f+40>>2]=h;H[f+44>>2]=i;H[f+32>>2]=d;Ga(c,10938,f+32|0);d=d+1|0;if((j|0)!=(d|0)){continue}break}h=H[a+40>>2]}e=b+h|0;g:{if(!H[e+24>>2]){break g}d=0;if(!H[e+20>>2]){break g}while(1){e=H[(b+h|0)+24>>2]+N(d,24)|0;h=J[e>>1];j=H[e+8>>2];i=H[e+12>>2];H[f+16>>2]=H[e+16>>2];H[f+8>>2]=j;H[f+12>>2]=i;H[f>>2]=h;Ga(c,7397,f);d=d+1|0;h=H[a+40>>2];if(d>>>0>2]){continue}break}}g=g+1|0;if(g>>>0>2]){continue}break}}Ac(1708,4,c)}Ac(1710,2,c)}na=f+176|0}function oe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-128|0;na=e;H[e+120>>2]=0;a:{if((c|0)!=8){Ba(d,1,4047,0);Ba(d,1,4047,0);break a}Da(b,a+228|0,2);Da(b+2|0,e+124|0,4);Da(b+6|0,e+116|0,1);Da(b+7|0,e+120|0,1);c=H[a+228>>2];i=H[a+128>>2];if(c>>>0>=N(i,H[a+132>>2])>>>0){H[e+112>>2]=c;Ba(d,1,7843,e+112|0);break a}f=H[a+180>>2]+N(c,5644)|0;h=(c>>>0)/(i>>>0)|0;b=H[e+116>>2];b:{g=H[a+44>>2];if((g|0)>=0&(c|0)!=(g|0)){break b}g=H[f+5588>>2]+1|0;if((g|0)==(b|0)){break b}H[e+104>>2]=g;H[e+100>>2]=b;H[e+96>>2]=c;Ba(d,1,7867,e+96|0);f=0;break a}H[f+5588>>2]=b;c:{b=H[e+124>>2];if(b-1>>>0<=12){if((b|0)!=12){break c}H[e+64>>2]=12;Ba(d,2,11864,e- -64|0);b=H[e+124>>2]}if(!b){Ba(d,4,10695,0);H[a+56>>2]=1}d:{e:{f:{g:{b=H[f+5592>>2];if(b){g=H[e+116>>2];if(g>>>0>>0){break g}H[e+52>>2]=b;H[e+48>>2]=g;Ba(d,1,5150,e+48|0);H[a+56>>2]=1;f=0;break a}g=H[e+120>>2];if(g){break f}break d}g=H[e+120>>2];if(!g){break e}}b=(I[a+92|0]>>>4&1)+g|0;H[e+120>>2]=b;g=H[e+116>>2];j=H[f+5592>>2];if(g>>>0>j-1>>>0){H[e+20>>2]=j;H[e+16>>2]=g;Ba(d,1,5051,e+16|0);H[a+56>>2]=1;f=0;break a}if(b>>>0<=g>>>0){H[e+36>>2]=b;H[e+32>>2]=g;Ba(d,1,5250,e+32|0);H[a+56>>2]=1;f=0;break a}H[f+5592>>2]=b}if((H[e+116>>2]+1|0)!=(b|0)){break d}F[a+92|0]=I[a+92|0]|1}b=H[e+124>>2];H[a+8>>2]=16;H[a+24>>2]=H[a+56>>2]?0:b-12|0;f=H[a+44>>2];h:{if((f|0)==-1){f=4;b=c-N(h,i)|0;if(!(b>>>0>2]|b>>>0>=K[a+36>>2]|h>>>0>2])){f=h>>>0>=K[a+40>>2]?4:0}F[a+92|0]=I[a+92|0]&251|f;b=H[a+228>>2];break h}b=H[a+228>>2];F[a+92|0]=I[a+92|0]&251|((f|0)!=(b|0)?4:0)}c=H[H[a+224>>2]+40>>2]+N(b,40)|0;H[c>>2]=b;H[c+12>>2]=H[e+116>>2];f=H[e+120>>2];if(!H[a+76>>2]){if(K[c+4>>2]>=f>>>0){f=1;break a}H[e>>2]=b;Ba(d,2,1612,e);H[a+76>>2]=1;f=H[e+120>>2]}c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;if(f){H[h+4>>2]=f;b=H[e+120>>2];H[h+8>>2]=b;c=H[h+16>>2];if(!c){b=Ea(b,24);H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=b;if(b){f=1;break a}f=0;Ba(d,1,6947,0);break a}b=Ha(c,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;f=1;break a}i:{g=H[h+16>>2];if(g){break i}H[h+8>>2]=10;g=Ea(10,24);c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;H[h+16>>2]=g;if(g){break i}f=0;H[h+8>>2]=0;Ba(d,1,6947,0);break a}f=1;b=N(b,40)+c|0;c=H[e+116>>2];if(K[b+8>>2]>c>>>0){break a}h=b;b=c+1|0;H[h+8>>2]=b;b=Ha(g,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;a=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;H[a+8>>2]=0;H[a+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;break a}H[e+80>>2]=b;Ba(d,1,12133,e+80|0);f=0}na=e+128|0;return f|0}function nb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=H[a+8>>2];e=f+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2|(d|0)<=0){break a}q=e&2147483644;m=e&3;r=e&1;s=f+1|0;g=H[a>>2];o=g+(e<<2)|0;t=e-4>>>1|0;a=e-1|0;u=g+(a<<2)|0;v=N(c,f)<<2;l=e>>>0<4;w=N(a>>>1|0,c)<<2;while(1){f=H[b+v>>2];e=H[b>>2]-(f+1>>1)|0;h=0;a=0;if(!l){while(1){j=a+1|0;x=H[(N(j,c)<<2)+b>>2];i=H[(N(a+s|0,c)<<2)+b>>2];p=g+(h<<2)|0;H[p>>2]=e;k=e;e=x-((f+i|0)+2>>2)|0;H[p+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);f=i;a=j;if(k){continue}break}}H[g+(h<<2)>>2]=e;if(r){a=H[b+w>>2]-(f+1>>1)|0;H[u>>2]=a;e=a+e>>1;a=-8}else{a=-4}H[a+o>>2]=e+f;f=0;a=0;h=0;e=0;b:{if(!l){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break b}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}break a}c:{switch(e-1|0){case 0:if((d|0)<=0){break a}a=d&3;if(d>>>0>=4){d=d&2147483644;c=0;while(1){H[b>>2]=H[b>>2]/2;H[b+4>>2]=H[b+4>>2]/2;H[b+8>>2]=H[b+8>>2]/2;H[b+12>>2]=H[b+12>>2]/2;b=b+16|0;c=c+4|0;if((d|0)!=(c|0)){continue}break}if(!a){break a}}c=0;while(1){H[b>>2]=H[b>>2]/2;b=b+4|0;c=c+1|0;if((a|0)!=(c|0)){continue}break};break a;case 1:if((d|0)<=0){break a}a=H[a>>2];e=0;f=N(c,f)<<2;while(1){i=b+f|0;j=H[b>>2]-(H[i>>2]+1>>1)|0;H[a+4>>2]=j;i=j+H[i>>2]|0;H[a>>2]=i;H[b>>2]=i;H[(c<<2)+b>>2]=H[a+4>>2];b=b+4|0;e=e+1|0;if((e|0)!=(d|0)){continue}break};break a;default:break c}}if((e|0)<3|(d|0)<=0){break a}q=e&2147483644;m=e&3;g=H[a>>2];r=(g+(e<<2)|0)-4|0;a=e-2|0;s=g+(a<<2)|0;o=e&1;i=!o;t=((e-i|0)-4>>>1|0)+1|0;u=N(c,f)<<2;v=a-i>>>0<2;w=N((e>>>1|0)-1|0,c)<<2;x=e-1>>>0<3;while(1){l=b+u|0;f=H[l+(c<<2)>>2];a=H[l>>2];e=H[b>>2]-((f+a|0)+2>>2)|0;H[g>>2]=e+a;h=1;a=1;if(!v){while(1){p=H[(N(a,c)<<2)+b>>2];j=a+1|0;i=H[l+(N(j,c)<<2)>>2];y=g+(h<<2)|0;H[y>>2]=e;k=e;e=p-((f+i|0)+2>>2)|0;H[y+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);a=j;f=i;if(k){continue}break}}H[g+(h<<2)>>2]=e;d:{if(!o){a=H[b+w>>2]-(f+1>>1)|0;H[s>>2]=(e+a>>1)+f;break d}a=e+f|0}H[r>>2]=a;f=0;a=0;h=0;e=0;e:{if(!x){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break e}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}}}function Xb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{n=N(e,3);h=H[b>>2]>>>n|0;if(h&2097168){break a}h=h&495;if(!h){break a}o=a+28|0;l=o+(I[h+H[a+108>>2]|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];i=H[k>>2];h=H[a+4>>2]-i|0;H[a+4>>2]=h;j=H[a>>2];b:{if(j>>>16>>>0>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[l>>2]=H[k+(h?8:12)>>2];k=h?m:!m;h=H[a+8>>2];while(1){c:{if(h){break c}h=H[a+16>>2];m=h+1|0;l=I[h+1|0];if(I[h|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break c}H[a+16>>2]=m;j=(l<<9)+j|0;h=7;break c}H[a+16>>2]=m;h=8;j=(l<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}h=i;break b}j=j-(i<<16)|0;H[a>>2]=j;if(!(h&32768)){m=H[k+4>>2];i=h>>>0>>0;H[l>>2]=H[k+(i?12:8)>>2];k=i?!m:m;i=H[a+8>>2];while(1){d:{if(i){break d}i=H[a+16>>2];m=i+1|0;l=I[i+1|0];if(I[i|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break d}H[a+16>>2]=m;j=(l<<9)+j|0;i=7;break d}H[a+16>>2]=m;i=8;j=(l<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break b}k=H[k+4>>2]}e:{if(!k){break e}p=b-4|0;i=H[b>>2];k=H[b+4>>2]>>>n+17&4|(H[p>>2]>>>n+19&1|(i>>>n+16&64|i>>>n&170|i>>>(e?n+12|0:14)&16));m=o+(I[k+24384|0]<<2)|0;H[a+104>>2]=m;l=H[m>>2];i=H[l>>2];h=h-i|0;H[a+4>>2]=h;o=I[k+24640|0];f:{if(j>>>16>>>0>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[m>>2]=H[l+(h?8:12)>>2];l=h?k:!k;h=H[a+8>>2];while(1){g:{if(h){break g}h=H[a+16>>2];m=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break g}H[a+16>>2]=m;j=(k<<9)+j|0;h=7;break g}H[a+16>>2]=m;h=8;j=(k<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}break f}k=j-(i<<16)|0;H[a>>2]=k;if(!(h&32768)){j=H[l+4>>2];i=h>>>0>>0;H[m>>2]=H[l+(i?12:8)>>2];l=i?!j:j;j=H[a+8>>2];while(1){h:{if(j){break h}j=H[a+16>>2];m=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;k=k+65280|0;j=8;break h}H[a+16>>2]=m;k=(i<<9)+k|0;j=7;break h}H[a+16>>2]=m;j=8;k=(i<<8)+k|0}j=j-1|0;H[a+8>>2]=j;k=k<<1;H[a>>2]=k;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break f}l=H[l+4>>2]}H[c>>2]=(l|0)==(o|0)?d:0-d|0;H[p>>2]=H[p>>2]|32<>2]=H[b>>2]|(c<<19|16)<>2]=H[b+4>>2]|8<>2]=H[a+4>>2]|32768;H[a>>2]=H[a>>2]|c<<31|65536;a=a-4|0;H[a>>2]=H[a>>2]|131072}if((e|0)!=3){break e}a=(f<<2)+b|0;H[a+4>>2]=H[a+4>>2]|1;H[a>>2]=H[a>>2]|c<<18|2;a=a-4|0;H[a>>2]=H[a>>2]|4}H[b>>2]=H[b>>2]|2097152<>2]>>>m|0;if(g&2097168){break a}n=a+28|0;k=n+(I[H[a+108>>2]+(g&495)|0]<<2)|0;H[a+104>>2]=k;j=H[k>>2];h=H[j>>2];g=H[a+4>>2]-h|0;H[a+4>>2]=g;i=H[a>>2];b:{if(i>>>16>>>0>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[k>>2]=H[j+(g?8:12)>>2];j=g?l:!l;g=H[a+8>>2];while(1){c:{if(g){break c}g=H[a+16>>2];l=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break c}H[a+16>>2]=l;i=(k<<9)+i|0;g=7;break c}H[a+16>>2]=l;g=8;i=(k<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}g=h;break b}i=i-(h<<16)|0;H[a>>2]=i;if(!(g&32768)){l=H[j+4>>2];h=g>>>0>>0;H[k>>2]=H[j+(h?12:8)>>2];j=h?!l:l;h=H[a+8>>2];while(1){d:{if(h){break d}h=H[a+16>>2];l=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;h=8;break d}H[a+16>>2]=l;i=(k<<9)+i|0;h=7;break d}H[a+16>>2]=l;h=8;i=(k<<8)+i|0}h=h-1|0;H[a+8>>2]=h;i=i<<1;H[a>>2]=i;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break b}j=H[j+4>>2]}if(!j){break a}j=n;n=b-4|0;h=H[b>>2];o=H[b+4>>2]>>>m+17&4|(H[n>>2]>>>m+19&1|(h>>>m+16&64|h>>>m&170|h>>>(e?m+12|0:14)&16));l=j+(I[o+24384|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];h=H[k>>2];g=g-h|0;H[a+4>>2]=g;e:{if(i>>>16>>>0>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[l>>2]=H[k+(g?8:12)>>2];k=g?j:!j;g=H[a+8>>2];while(1){f:{if(g){break f}g=H[a+16>>2];l=g+1|0;j=I[g+1|0];if(I[g|0]==255){if(j>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break f}H[a+16>>2]=l;i=(j<<9)+i|0;g=7;break f}H[a+16>>2]=l;g=8;i=(j<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break e}j=i-(h<<16)|0;H[a>>2]=j;if(!(g&32768)){i=H[k+4>>2];h=g>>>0>>0;H[l>>2]=H[k+(h?12:8)>>2];k=h?!i:i;i=H[a+8>>2];while(1){g:{if(i){break g}i=H[a+16>>2];l=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break g}H[a+16>>2]=l;j=(h<<9)+j|0;i=7;break g}H[a+16>>2]=l;i=8;j=(h<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break e}k=H[k+4>>2]}g=c;c=I[o+24640|0];H[g>>2]=(c|0)==(k|0)?d:0-d|0;H[n>>2]=H[n>>2]|32<>2]=H[b>>2]|(d<<19|16)<>2]=H[b+4>>2]|8<>2]<<2)+b|0;H[c+4>>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|d<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((e|0)!=3){break a}a=(H[a+124>>2]<<2)+b|0;H[a+4>>2]=H[a+4>>2]|4;H[a+12>>2]=H[a+12>>2]|1;H[a+8>>2]=H[a+8>>2]|d<<18|2}}function Kd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=na-112|0;na=e;j=1024;a:{b:{h=Ea(1,1024);if(h){l=e+92|0;k=e+108|0;while(1){c:{d:{d=e+104|0;e:{if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+88|0,4);Da(k,l,4);f=8;f:{g:{h:{i:{switch(H[e+88>>2]){case 0:d=Qa(b);g=qa;if((g|0)<0){g=1}else{g=d>>>0<4294967288&(g|0)<=0}if(g){break h}Ba(c,1,8449,0);break e;case 1:break i;default:break f}}d=e+104|0;if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+100|0,4);if(!H[e+100>>2]){break g}Ba(c,1,8449,0);break e}H[e+88>>2]=d+8;break f}Da(k,e+88|0,4);f=16}d=H[e+92>>2];if((d|0)==1785737827){b=H[a+100>>2];if(b&4){H[a+100>>2]=b|8;break e}Ba(c,1,5702,0);Ca(h);a=0;break a}i=H[e+88>>2];if(!i){Ba(c,1,3268,0);Ca(h);a=0;break a}if(f>>>0>i>>>0){H[e+4>>2]=d;H[e>>2]=i;Ba(c,1,13933,e);break b}j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if((d|0)<=1668246641){if((d|0)==1651532643){break r}if((d|0)==1667523942){break p}if((d|0)!=1668112752){break s}g=25296;break n}if((d|0)<=1783635999){if((d|0)==1668246642){break o}g=25264;if((d|0)==1768449138){break n}if((d|0)!=1718909296){break s}g=25240;break l}if((d|0)==1885564018){break q}if((d|0)==1783636e3){break m}g=25248;if((d|0)==1785737832){break l}}d=H[a+100>>2];if(d&1){break j}Ba(c,1,2062,0);Ca(h);a=0;break a}g=25280;break n}g=25288;break n}g=25304;break n}g=25272}H[e+76>>2]=d&255;H[e+64>>2]=d>>>24;H[e+72>>2]=d>>>8&255;H[e+68>>2]=d>>>16&255;Ba(c,2,2011,e- -64|0);f=i-f|0;if(I[a+100|0]&4){break k}d=H[e+92>>2];H[e+48>>2]=d>>>24;H[e+60>>2]=d&255;H[e+52>>2]=d>>>16&255;H[e+56>>2]=d>>>8&255;Ba(c,2,6771,e+48|0);H[a+100>>2]=H[a+100>>2]|2147483647;d=rb(b,f,c);if(!qa&(d|0)==(f|0)){continue}Ba(c,1,3748,0);Ca(h);a=0;break a}g=25232}f=i-f|0}d=f;f=Qa(b);i=qa;if((i|0)<0){f=1}else{f=(i|0)<=0&d>>>0>f>>>0}if(f){f=H[e+88>>2];a=H[e+92>>2];m=e,n=Qa(b),H[m+40>>2]=n;H[e+36>>2]=d;H[e+32>>2]=a&255;H[e+20>>2]=a>>>24;H[e+16>>2]=f;H[e+28>>2]=a>>>8&255;H[e+24>>2]=a>>>16&255;Ba(c,1,15680,e+16|0);break b}if(d>>>0<=j>>>0){f=h;break c}j=d;f=Ha(h,d);if(f){break c}Ca(h);Ba(c,1,2193,0);a=0;break a}if(!(d&2)){Ba(c,1,2132,0);Ca(h);a=0;break a}H[a+100>>2]=d|2147483647;d=i-f|0;f=rb(b,d,c);if(!qa&(d|0)==(f|0)){continue}if(!(I[a+100|0]&8)){break d}Ba(c,2,3748,0)}Ca(h);a=1;break a}Ba(c,1,3748,0);Ca(h);a=0;break a}if((Ja(b,f,d,c)|0)!=(d|0)){Ba(c,1,3798,0);Ca(f);a=0;break a}h=f;if(ra[H[g+4>>2]](a,f,d,c)|0){continue}break}Ca(f);a=0;break a}Ba(c,1,4923,0);a=0;break a}Ca(h);a=0}na=e+112|0;return a|0}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=na-16|0;na=f;if(H[a+8>>2]==16){i=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{i=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4721,0);a=0;break a}Da(b,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}if(c>>>0<=6){Ba(d,1,4721,0);a=0;break a}Da(b+2|0,f+8|0,1);e=H[i+5628>>2];h=H[i+5632>>2];b:{c:{if(!h){break c}j=H[f+8>>2];a=e;while(1){if((j|0)!=H[a>>2]){a=a+20|0;g=g+1|0;if((h|0)!=(g|0)){continue}break c}break}j=0;if((g|0)!=(h|0)){break b}}if(H[i+5636>>2]==(h|0)){a=h+10|0;H[i+5636>>2]=a;a=Ha(e,N(a,20));if(!a){Ca(H[i+5628>>2]);H[i+5636>>2]=0;H[i+5628>>2]=0;H[i+5632>>2]=0;Ba(d,1,4747,0);a=0;break a}H[i+5628>>2]=a;e=H[i+5632>>2];j=N(H[i+5636>>2]-e|0,20);if(j){y(a+N(e,20)|0,0,j)}h=H[i+5632>>2];e=H[i+5628>>2]}a=e+N(h,20)|0;j=1}H[a>>2]=H[f+8>>2];Da(b+3|0,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}Da(b+5|0,f+4|0,2);e=H[f+4>>2];if(e>>>0>=2){Ba(d,2,3130,0);a=1;break a}h=c-7|0;if(e){c=b+7|0;while(1){if(h>>>0<=2){Ba(d,1,4721,0);a=0;break a}Da(c,f+12|0,1);if(H[f+12>>2]!=1){Ba(d,2,5579,0);a=1;break a}Da(c+1|0,f,2);e=H[f>>2];b=e&32767;H[a+4>>2]=b;h=h-3|0;e=(e>>>15|0)+1|0;k=N(e,b)+2|0;if(h>>>0>>0){Ba(d,1,4721,0);a=0;break a}c=c+3|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f,2);e=H[f>>2];b=e&32767;H[f>>2]=b;if((b|0)!=H[a+4>>2]){Ba(d,2,3306,0);a=1;break a}e=(e>>>15|0)+1|0;l=N(e,b)+3|0;k=h-k|0;if(l>>>0>k>>>0){Ba(d,1,4721,0);a=0;break a}c=c+2|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f+12|0,3);e=H[f+12>>2];H[a+8>>2]=0;H[a+12>>2]=0;F[a+16|0]=!(e&65536)|I[a+16|0]&254;h=e&255;H[f+8>>2]=h;d:{if(!h){break d}m=H[i+5620>>2];if(m){g=H[i+5616>>2];b=0;while(1){if((h|0)==H[g+8>>2]){H[a+8>>2]=g;break d}g=g+20|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}e=e>>>8&255;H[f+8>>2]=e;e:{if(!e){break e}h=H[i+5620>>2];if(h){g=H[i+5616>>2];b=0;while(1){if((e|0)==H[g+8>>2]){H[a+12>>2]=g;break e}g=g+20|0;b=b+1|0;if((h|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}h=k-l|0;c=c+3|0;n=n+1|0;if(n>>>0>2]){continue}break}}if(h){Ba(d,1,4721,0);a=0;break a}a=1;if(!j){break a}H[i+5632>>2]=H[i+5632>>2]+1;a=1}na=f+16|0;return a|0}function _c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(K[a+44>>2]>=8){i=H[a+40>>2];l=8;while(1){k=H[a+12>>2]<<5;e=H[a>>2];g=H[a+36>>2];b=H[a+16>>2];h=H[a+20>>2];a:{if(b>>>0>=h>>>0){break a}j=e+k|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=(N(b,g)<<2)+i|0;f=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=f;f=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=f;f=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=f;f=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=f;b=d}if((d|0)==(h|0)){break a}while(1){d=(N(b,g)<<2)+i|0;f=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;d=b+1|0;c=j+(d<<6)|0;d=(N(d,g)<<2)+i|0;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b=H[a+24>>2];h=H[a+28>>2];b:{if(b>>>0>=h>>>0){break b}j=(e-k|0)+32|0;k=(N(g,H[a+8>>2])<<2)+i|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=k+(N(b,g)<<2)|0;e=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=e;e=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=e;e=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=e;e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;b=d}if((d|0)==(h|0)){break b}while(1){d=k+(N(b,g)<<2)|0;e=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;d=b+1|0;c=j+(d<<6)|0;d=k+(N(d,g)<<2)|0;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;b=b+2|0;if((h|0)!=(b|0)){continue}break}}Ta(a);b=0;if(H[a+32>>2]){while(1){d=H[a>>2]+(b<<5)|0;c=H[d+28>>2];g=(N(H[a+36>>2],b)<<2)+i|0;H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;c=H[d+4>>2];H[g>>2]=H[d>>2];H[g+4>>2]=c;b=b+1|0;if(b>>>0>2]){continue}break}}i=i+32|0;l=l+8|0;if(l>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;b=H[b>>2]+7&-8;H[d>>2]=b+16;o=a;f=H[b>>2];a=H[b+4>>2];d=H[b+8>>2];c=H[b+12>>2];p=c;h=na-32|0;na=h;b=c&65535;e=c;c=d;d=e>>>16&32767;g=d;a:{if(d-15361>>>0<=2045){b=b<<4|c>>>28;d=c<<4|a>>>28;e=g-15360|0;a=a&268435455;b:{if((a|0)==134217728&(f|0)!=0|a>>>0>134217728){c=b;d=d+1|0;b=d?c:c+1|0;break b}if(f|(a|0)!=134217728){break b}a=d;d=d+(d&1)|0;b=a>>>0>d>>>0?b+1|0:b}c=b>>>0>1048575;f=c?0:d;a=c?0:b;b=0;c=c+e|0;b=c>>>0>>0?1:b;break a}if(!(!(c|f|(a|b))|((d|0)!=32767|(k|0)!=0))){e=b<<4|c>>>28;f=c<<4|a>>>28;a=e|524288;c=2047;b=0;break a}if(g>>>0>17406){f=0;a=0;c=2047;b=0;break a}e=!(d|k);l=e?15360:15361;k=l-g|0;if((k|0)>112){f=0;a=0;c=0;b=0;break a}d=c;b=e?b:b|65536;if((g|0)!=(l|0)){m=f;c=a;i=d;e=b;l=128-k|0;c:{if(l&64){g=f;e=l+-64|0;c=e&31;if((e&63)>>>0>=32){e=f<>>32-c|a<>>0>=32){g=i<>>32-j|e<>>0>=32){e=0;i=c>>>i|0}else{e=c>>>i|0;i=((1<>>i}i=n|i;e=e|g;n=m;j=l&31;if((l&63)>>>0>=32){g=m<>>32-j|c<>2]=m;H[h+20>>2]=c;H[h+24>>2]=i;H[h+28>>2]=e;m=(H[h+16>>2]|H[h+24>>2]|(H[h+20>>2]|H[h+28>>2]))!=0}d:{if(k&64){c=d;f=k+-64|0;a=f&31;if((f&63)>>>0>=32){e=0;f=b>>>a|0}else{e=b>>>a|0;f=((1<>>a}a=e;d=0;b=0;break d}if(!k){break d}g=d;c=64-k|0;e=c&31;if((c&63)>>>0>=32){c=d<>>32-e|b<>>0>=32){g=0;a=a>>>f|0}else{g=a>>>f|0;a=((1<>>f}f=i|a;a=c|g;e=d;d=k&31;if((k&63)>>>0>=32){c=0;d=b>>>d|0}else{c=b>>>d|0;d=((1<>>d}b=c}H[h>>2]=f;H[h+4>>2]=a;H[h+8>>2]=d;H[h+12>>2]=b;a=H[h+8>>2];d=H[h+4>>2];f=a<<4|d>>>28;a=H[h+12>>2]<<4|a>>>28;c=d&268435455;b=H[h>>2]|m;e:{if((c|0)==134217728&(b|0)!=0|c>>>0>134217728){f=f+1|0;a=f?a:a+1|0;break e}if(b|(c|0)!=134217728){break e}b=a;a=f;f=f+(f&1)|0;a=a>>>0>f>>>0?b+1|0:b}c=a>>>0>1048575;a=c?a^1048576:a;b=0}na=h+32|0;u(0,f|0);u(1,a|(p&-2147483648|c<<20));q=o,r=+w(),M[q>>3]=r}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;q=H[a+24>>2];if(!H[q+16>>2]){return 1}r=H[q+24>>2];o=H[H[H[a+20>>2]>>2]+20>>2];while(1){d=H[r+36>>2];H[b+36>>2]=d;f=H[o+28>>2];c=f+N(d,152)|0;t=H[a+64>>2];a:{if(t){d=f+N(H[o+24>>2],152)|0;p=H[d-144>>2]-H[d-152>>2]|0;f=c+12|0;e=c+4|0;d=H[c+8>>2];g=H[c>>2];c=36;break a}f=c+148|0;e=c+140|0;d=H[c+144>>2];g=H[c+136>>2];p=d-g|0;c=52}u=H[c+o>>2];b:{c:{if(!u){break c}k=H[e>>2];l=H[f>>2];f=d-g|0;e=H[b+40>>2];c=e&31;if((e&63)>>>0>=32){c=-1<>>32-c}m=h^-1;j=H[b+20>>2];h=m+j|0;i=c^-1;c=i;j=h>>>0>>0?c+1|0:c;c=e&31;if((e&63)>>>0>=32){h=j>>>c|0}else{h=((1<>>c}c=H[b+16>>2];j=c+m|0;m=c>>>0>j>>>0?i+1|0:i;i=e&31;c=H[b+8>>2];if((e&63)>>>0>=32){i=m>>>i|0}else{i=((1<>>i}e=c+i|0;d:{if(g>>>0>i>>>0){m=g-i|0;i=0;if(e>>>0>=d>>>0){j=0;d=f;break d}d=e-g|0;j=f-d|0;break d}i=i-g|0;if(e>>>0>=d>>>0){d=f-i|0;m=0;j=0;break d}j=d-e|0;m=0;d=c}f=l-k|0;e=H[b+12>>2];g=e+h|0;e:{if(h>>>0>>0){s=k-h|0;h=0;n=0;if(g>>>0>=l>>>0){break e}n=f;f=g-k|0;n=n-f|0;break e}h=h-k|0;if(g>>>0>=l>>>0){f=f-h|0;s=0;n=0;break e}s=0;f=e;n=l-g|0}k=n;g=0;if((h|i|(j|k)|(d|f))<0){break b}k=N(h,p)+i|0;l=H[b+44>>2];h=N(c,s)+m|0;f:{g:{if(!(k|l|(h|(c|0)!=(p|0))|(c|0)!=(d|0))){if((e|0)!=(f|0)){break g}d=(t?36:52)+o|0;H[b+44>>2]=H[d>>2];H[d>>2]=0;break c}if(l){break f}}re(e,0,c);if(qa|!e){break b}c=N(c,e);if(c>>>0>1073741823){break b}c=Ia(c<<2);H[b+44>>2]=c;if(!c){break b}e=H[b+8>>2];g=H[b+12>>2];if((e|0)==(d|0)&(g|0)==(f|0)){break f}e=N(e,g)<<2;if(!e){break f}y(c,0,e)}if(!f){break c}d=d<<2;g=H[b+44>>2]+(h<<2)|0;c=(k<<2)+u|0;if((f|0)!=1){k=f&1;l=f&2147483646;f=0;while(1){h=!d;if(!h){B(g,c,d)}i=p<<2;c=i+c|0;e=(H[b+8>>2]<<2)+g|0;if(!h){B(e,c,d)}c=c+i|0;g=e+(H[b+8>>2]<<2)|0;f=f+2|0;if((l|0)!=(f|0)){continue}break}if(!k){break c}}if(!d){break c}B(g,c,d)}o=o+76|0;r=r+52|0;b=b+52|0;g=1;v=v+1|0;if(v>>>0>2]){continue}}break}return g}function wb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(a){a:{if(H[a>>2]){b=H[a+12>>2];if(b){jb(b);Ca(H[a+12>>2]);H[a+12>>2]=0}b=H[a+16>>2];if(b){Ca(b);H[a+16>>2]=0;H[a+20>>2]=0}Ca(H[a+64>>2]);H[a+60>>2]=0;H[a+64>>2]=0;Ca(H[a+72>>2]);H[a+72>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;break a}b=H[a+44>>2];if(b){Ca(b);H[a+44>>2]=0}b=H[a+32>>2];if(b){Ca(b);H[a+32>>2]=0;H[a+36>>2]=0}b=H[a+52>>2];if(!b){break a}Ca(b);H[a+52>>2]=0;H[a+56>>2]=0}Tb(H[a+232>>2]);b=H[a+180>>2];if(b){e=N(H[a+128>>2],H[a+132>>2]);if(e){while(1){jb(b);b=b+5644|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}b=H[a+180>>2]}Ca(b);H[a+180>>2]=0}b=H[a+140>>2];if(b){c=H[a+136>>2];if(c){b=0;while(1){e=H[H[a+140>>2]+(b<<3)>>2];if(e){Ca(e);c=H[a+136>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+140>>2]}H[a+136>>2]=0;Ca(b);H[a+140>>2]=0}Ca(H[a+160>>2]);H[a+144>>2]=0;H[a+160>>2]=0;Ca(H[a+124>>2]);H[a+124>>2]=0;if(!(I[a+212|0]&2)){Ca(H[a+192>>2])}y(a+104|0,0,112);pb(H[a+216>>2]);H[a+216>>2]=0;pb(H[a+220>>2]);H[a+216>>2]=0;d=H[a+224>>2];if(d){b=H[d+28>>2];if(b){Ca(b);H[d+28>>2]=0}c=H[d+40>>2];if(c){if(H[d+36>>2]){while(1){e=N(g,40);b=H[(e+c|0)+36>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+36>>2]=0}b=H[(c+e|0)+16>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+16>>2]=0}b=H[(c+e|0)+24>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+24>>2]=0}g=g+1|0;if(g>>>0>2]){continue}break}}Ca(c);H[d+40>>2]=0}Ca(d)}H[a+224>>2]=0;Ua(H[a+96>>2]);H[a+96>>2]=0;Ua(H[a+100>>2]);H[a+100>>2]=0;f=H[a+236>>2];if(f){b:{if(!H[f+8>>2]){break b}if(H[f+12>>2]){H[f+40>>2]=0;while(1){if(H[f+24>>2]>0){continue}break}}H[f+16>>2]=1;Ca(H[f>>2]);c=H[f+28>>2];if(!c){break b}while(1){b=H[c+4>>2];Ca(c);H[f+28>>2]=b;c=b;if(b){continue}break}}d=H[f+36>>2];if(d){g=H[d+4>>2];if((g|0)>0){b=0;while(1){e=H[d>>2]+N(b,12)|0;c=H[e+8>>2];if(c){ra[c|0](H[e+4>>2]);g=H[d+4>>2]}b=b+1|0;if((g|0)>(b|0)){continue}break}}Ca(H[d>>2]);Ca(d)}Ca(f)}H[a+236>>2]=0;Ca(a)}}function ec(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=na-256|0;na=k;a:{if(!a){a=0;break a}if(!(H[a>>2]==(b|0)&H[a+4>>2]==(c|0))){H[a+4>>2]=c;H[a>>2]=b;H[k>>2]=c;H[k+128>>2]=b;e=c;g=b;while(1){o=h;h=h+1|0;j=h<<2;l=(e+1|0)/2|0;H[j+k>>2]=l;n=j+(k+128|0)|0;j=(g+1|0)/2|0;H[n>>2]=j;i=N(e,g);f=i+f|0;e=l;g=j;if(i>>>0>1){continue}break}H[a+8>>2]=f;b:{c:{d:{if(!f){b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0;break d}f=f<<4;if(f>>>0<=K[a+16>>2]){break b}b=Ha(H[a+12>>2],f);if(b){break c}Ba(d,1,6451,0);b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0}Ca(a);a=0;break a}H[a+12>>2]=b;c=H[a+16>>2];d=f-c|0;if(d){y(b+c|0,0,d)}H[a+16>>2]=f;c=H[a+4>>2];b=H[a>>2]}g=H[a+12>>2];if(o){l=0;e=(N(b,c)<<4)+g|0;f=e;while(1){b=l<<2;h=H[b+k>>2];e:{if((h|0)<=0){break e}j=h-1|0;d=0;f:{g:{b=H[b+(k+128|0)>>2];if((b|0)<=0){i=h&3;if(h>>>0>=4){break g}h=0;break f}while(1){c=f;f=b;while(1){h:{H[g>>2]=e;if((f|0)==1){g=g+16|0;e=e+16|0;break h}H[g+16>>2]=e;e=e+16|0;g=g+32|0;i=(f|0)>2;f=f-2|0;if(i){continue}}break}i=((d|0)==(j|0)|d)&1;f=i?e:c+(b<<4)|0;e=i?e:c;d=d+1|0;if((h|0)!=(d|0)){continue}break}break e}m=h&2147483644;h=0;c=0;while(1){n=(h|0)==(j|0);h=h+4|0;e=n?e:f;f=e;c=c+4|0;if((m|0)!=(c|0)){continue}break}if(i){break f}break e}while(1){c=f;m=((h|0)==(j|0)|h)&1;f=m?e:c+(b<<4)|0;e=m?e:c;h=h+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}l=l+1|0;if((o|0)!=(l|0)){continue}break}}H[g>>2]=0}b=H[a+8>>2];if(!b){break a}c=b&3;e=H[a+12>>2];if(b>>>0>=4){b=b&-4;g=0;while(1){H[e+60>>2]=0;H[e+52>>2]=999;H[e+56>>2]=0;H[e+44>>2]=0;H[e+36>>2]=999;H[e+40>>2]=0;H[e+28>>2]=0;H[e+20>>2]=999;H[e+24>>2]=0;H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e- -64|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}g=0;while(1){H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e+16|0;g=g+1|0;if((c|0)!=(g|0)){continue}break}}na=k+256|0;return a}function Xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=na-16|0;na=g;if(H[a+8>>2]==16){h=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{h=H[a+12>>2]}a:{if(!c){Ba(d,1,4259,0);break a}i=H[a+96>>2];e=1;Da(b,g+8|0,1);f=H[g+8>>2];if(f>>>0>=2){Ba(d,2,9792,0);break a}if((f+1|0)!=(c|0)){e=0;Ba(d,2,4259,0);break a}c=H[i+16>>2];b:{if(!c){break b}d=c&7;e=H[h+5584>>2];if(c>>>0>=8){i=c&-8;c=0;while(1){H[e+8636>>2]=0;H[e+7556>>2]=0;H[e+6476>>2]=0;H[e+5396>>2]=0;H[e+4316>>2]=0;H[e+3236>>2]=0;H[e+2156>>2]=0;H[e+1076>>2]=0;e=e+8640|0;c=c+8|0;if((i|0)!=(c|0)){continue}break}if(!d){break b}}c=0;while(1){H[e+1076>>2]=0;e=e+1080|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}c=H[h+5608>>2];if(c){Ca(c);H[h+5608>>2]=0;f=H[g+8>>2]}if(!f){e=1;break a}i=0;while(1){b=b+1|0;Da(b,g+12|0,1);c:{if(!H[h+5632>>2]){break c}d=H[h+5628>>2];if(H[d>>2]!=H[g+12>>2]){break c}f=H[d+4>>2];j=H[a+96>>2];if((f|0)!=H[j+16>>2]){break c}c=H[d+8>>2];if(c){e=0;f=N(f,f);if(H[c+16>>2]!=(N(f,H[(H[c>>2]<<2)+24896>>2])|0)){break a}k=Fa(f<<2);H[h+5608>>2]=k;if(!k){break a}ra[H[(H[c>>2]<<2)+25200>>2]](H[c+12>>2],k,f)}c=H[d+12>>2];if(!c){break c}e=0;d=H[j+16>>2];if(H[c+16>>2]!=(N(d,H[(H[c>>2]<<2)+24896>>2])|0)){break a}f=Fa(d<<2);if(!f){break a}ra[H[(H[c>>2]<<2)+25216>>2]](H[c+12>>2],f,d);c=H[j+16>>2];d:{if(!c){break d}j=c&7;e=H[h+5584>>2];e:{if(c>>>0<8){c=f;break e}k=c&-8;d=0;c=f;while(1){H[e+1076>>2]=H[c>>2];H[e+2156>>2]=H[c+4>>2];H[e+3236>>2]=H[c+8>>2];H[e+4316>>2]=H[c+12>>2];H[e+5396>>2]=H[c+16>>2];H[e+6476>>2]=H[c+20>>2];H[e+7556>>2]=H[c+24>>2];H[e+8636>>2]=H[c+28>>2];e=e+8640|0;c=c+32|0;d=d+8|0;if((k|0)!=(d|0)){continue}break}if(!j){break d}}d=0;while(1){H[e+1076>>2]=H[c>>2];e=e+1080|0;c=c+4|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}Ca(f)}e=1;i=i+1|0;if(i>>>0>2]){continue}break}}na=g+16|0;return e|0}function xb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=H[H[a+24>>2]+24>>2]+N(b,52)|0;l=H[m+4>>2];k=l-1|0;o=H[a+60>>2];j=k+o|0;p=0-!l|0;i=p;r=H[H[H[a+20>>2]>>2]+20>>2]+N(b,76)|0;n=H[r+12>>2];i=ve(j,j>>>0>>0?i+1|0:i,l,0);q=i>>>0>n>>>0?n:i;j=H[m>>2];m=j-1|0;s=H[a+56>>2];n=m+s|0;o=0-!j|0;i=o;t=H[r+8>>2];i=ve(n,n>>>0>>0?i+1|0:i,j,0);n=i>>>0>t>>>0?t:i;i=p;t=H[r+4>>2];s=H[a+52>>2];k=s+k|0;i=ve(k,k>>>0>>0?i+1|0:i,l,0);k=i>>>0>>0?t:i;i=o;p=H[r>>2];l=m;m=H[a+48>>2];l=l+m|0;i=ve(l,l>>>0>>0?i+1|0:i,j,0);i=i>>>0

>>0?p:i;l=0;p=H[(H[H[a+32>>2]+5584>>2]+N(b,1080)|0)+20>>2];c=H[r+20>>2]+(c?0-c|0:-1)|0;a:{if(!c){a=n;l=i;b=k;break a}m=c-1|0;j=(d&1)<>>0>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<>>a}}a=0;b=0;d=d>>>1<>>0>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<>>32-b;b=-1<>>0>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<>>b}}if(j>>>0>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<>>32-d;d=-1<>>0>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<>>d}}c=(p|0)==1?2:3;d=c+a|0;d=(a>>>0>d>>>0?-1:d)>>>0>e>>>0;a=c+q|0;d=d&(a>>>0>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0>>0}function lb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=H[a+16>>2];if(g>>>0>=32){return H[a+8>>2]}b=H[a+20>>2];a:{if((b|0)>=4){d=H[a>>2];c=H[d-3>>2];e=b-4|0;H[a+20>>2]=e;H[a>>2]=d-4;break a}if((b|0)<=0){e=b;break a}f=H[a>>2];d=24;b:{if((b|0)==1){break b}l=b&1;k=b&2147483646;while(1){h=f-1|0;H[a>>2]=h;i=I[f|0];f=f-2|0;H[a>>2]=f;H[a+20>>2]=b-1;h=I[h|0];b=b-2|0;H[a+20>>2]=b;c=i<>2]=f-1;f=I[f|0];H[a+20>>2]=b-1;c=f<>2];k=c&255;H[a+24>>2]=k>>>0>143;b=b?(c&2130706432)==2130706432?7:8:8;h=b+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;i=h+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;l=i+(g+(d>>>0<=143?8:(c&127)==127?7:8)|0)|0;H[a+16>>2]=l;j=H[a+12>>2];b=f<>>24|d<>>0>=32){d=b<>>32-c;b=b<>2];b=d|j;h=b;H[a+8>>2]=g;H[a+12>>2]=b;if(l>>>0<=31){c:{if((e|0)>=4){b=H[a>>2];c=H[b-3>>2];H[a+20>>2]=e-4;H[a>>2]=b-4;break c}if((e|0)<=0){c=0;break c}b=H[a>>2];d:{if((e|0)==1){d=24;c=0;break d}i=e&1;j=e&2147483646;d=24;c=0;f=0;while(1){m=b-1|0;H[a>>2]=m;n=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=e-1;m=I[m|0];e=e-2|0;H[a+20>>2]=e;c=n<>2]=b-1;b=I[b|0];H[a+20>>2]=e-1;c=b<>2]=e>>>0>143;k=k>>>0<=143?8:(c&2130706432)==2130706432?7:8;i=k+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;j=i+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;H[a+16>>2]=j+(l+(d>>>0<=143?8:(c&127)==127?7:8)|0);b=a;a=f<>>24|d<>>0>=32){c=a<>>32-e;a=a<>2]=g;H[b+12>>2]=c|h}return g}function Sc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=H[a+96>>2];l=N(H[a+128>>2],H[a+132>>2]);a:{if(l){b=H[j+16>>2];m=N(b,1080);k=N(b,b)<<2;e=H[a+12>>2];b=H[a+180>>2];while(1){n=H[b+5584>>2];B(b,e,5644);H[b+5608>>2]=0;H[b+5588>>2]=-1;H[b+5168>>2]=0;H[b+5636>>2]=0;H[b+5616>>2]=0;H[b+5624>>2]=0;H[b+5628>>2]=0;H[b+5584>>2]=n;F[b+5640|0]=I[b+5640|0]&252;b:{if(!H[e+5608>>2]){break b}d=Fa(k);H[b+5608>>2]=d;if(!d){return 0}if(!k){break b}B(d,H[e+5608>>2],k)}d=N(H[e+5624>>2],20);f=Fa(d);H[b+5616>>2]=f;i=0;if(!f){break a}if(d){B(f,H[e+5616>>2],d)}g=H[e+5620>>2];if(g){d=H[e+5616>>2];f=H[b+5616>>2];h=0;while(1){if(H[d+12>>2]){g=Fa(H[d+16>>2]);H[f+12>>2]=g;if(!g){return 0}o=H[d+16>>2];if(o){B(g,H[d+12>>2],o)}g=H[e+5620>>2]}H[b+5624>>2]=H[b+5624>>2]+1;f=f+20|0;d=d+20|0;h=h+1|0;if(h>>>0>>0){continue}break}}d=N(H[e+5636>>2],20);f=Fa(d);H[b+5628>>2]=f;if(!f){break a}if(d){B(f,H[e+5628>>2],d)}i=H[e+5636>>2];H[b+5636>>2]=i;if(i){d=H[e+5628>>2];f=H[b+5628>>2];h=0;while(1){g=H[d+8>>2];if(g){H[f+8>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}g=H[d+12>>2];if(g){H[f+12>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}f=f+20|0;d=d+20|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(m){B(n,H[e+5584>>2],m)}b=b+5644|0;p=p+1|0;if((p|0)!=(l|0)){continue}break}}i=1;e=Ea(1,72);b=0;c:{if(!e){break c}F[e+40|0]=I[e+40|0]&254|1;d=Ea(1,4);H[e+20>>2]=d;b=e;if(d){break c}Ca(b);b=0}H[a+232>>2]=b;if(!b){return 0}f=H[a+236>>2];e=0;H[b+28>>2]=a+104;H[b+24>>2]=j;d=Ea(1,848);H[H[b+20>>2]>>2]=d;d:{if(!d){break d}d=Ea(H[j+16>>2],76);h=H[H[b+20>>2]>>2];H[h+20>>2]=d;if(!d){break d}H[h+16>>2]=H[j+16>>2];e=H[a+188>>2];H[b+44>>2]=f;H[b>>2]=e;e=1}if(e){break a}Tb(H[a+232>>2]);i=0;H[a+232>>2]=0;Ba(c,1,3668,0)}return i|0}function pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=na-80|0;na=e;H[e+76>>2]=1;j=H[a+44>>2];d=H[H[a+224>>2]+40>>2];a:{b:{if(!d|!H[d+16>>2]){break b}c:{d=d+N(j,40)|0;if(!H[d+4>>2]){d=H[a+52>>2];f=H[a+48>>2]+2|0;d=f>>>0<2?d+1|0:d;if(bb(b,f,d,c)){break c}d=0;Ba(c,1,5440,0);break a}d=H[d+16>>2];if(!bb(b,H[d>>2],H[d+4>>2],c)){Ba(c,1,5440,0);d=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);d=0;break a}Da(H[a+16>>2],e+72|0,2);if(H[e+72>>2]==65424){break c}Ba(c,1,4073,0);d=0;break a}if(H[a+8>>2]!=256){break b}H[a+8>>2]=8}f=N(H[a+132>>2],H[a+128>>2]);d:{if(!f){break d}i=f&7;h=H[a+180>>2];d=0;if(f>>>0>=8){k=f&-8;while(1){f=h+N(g,5644)|0;H[f+45096>>2]=-1;H[f+39452>>2]=-1;H[f+33808>>2]=-1;H[f+28164>>2]=-1;H[f+22520>>2]=-1;H[f+16876>>2]=-1;H[f+11232>>2]=-1;H[f+5588>>2]=-1;g=g+8|0;l=l+8|0;if((k|0)!=(l|0)){continue}break}if(!i){break d}}while(1){H[(h+N(g,5644)|0)+5588>>2]=-1;g=g+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}d=0;if(!cb(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){break a}i=j+1|0;while(1){e:{if(!H[e+76>>2]){break e}f=H[e+72>>2];if(!ib(a,f,0,0,b,c)){break a}h=H[a+128>>2];k=H[a+132>>2];g=f+1|0;H[e+32>>2]=g;H[e+36>>2]=N(h,k);Ba(c,4,11795,e+32|0);if(!Hc(H[a+232>>2],H[H[a+100>>2]+24>>2])){break a}d=H[a+180>>2]+N(f,5644)|0;h=H[d+5596>>2];if(h){Ca(h);H[d+5596>>2]=0;H[d+5600>>2]=0}H[e+16>>2]=g;Ba(c,4,16601,e+16|0);if((f|0)==(j|0)){d=H[a+224>>2];f=H[d+8>>2];d=H[d+12>>2];f=f+2|0;d=f>>>0<2?d+1|0:d;if(bb(b,f,d,c)){break e}d=0;Ba(c,1,5440,0);break a}H[e+4>>2]=i;H[e>>2]=g;Ba(c,2,13648,e);d=0;if(cb(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){continue}break a}break}d=Gc(a,c)}na=e+80|0;return d|0}function Ma(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=H[a+16>>2];if(h>>>0>=32){return H[a+8>>2]}c=H[a+24>>2];a:{if((c|0)>=4){b=H[a>>2];d=H[b>>2];e=c-4|0;H[a+24>>2]=e;H[a>>2]=b+4;break a}d=H[a+28>>2]?-1:0;if((c|0)<=0){e=c;break a}b=H[a>>2];if((c|0)!=1){j=c&1;i=c&2147483646;while(1){e=b;H[a>>2]=b+1;k=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=c-1;e=I[e+1|0];c=c-2|0;H[a+24>>2]=c;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=c-1;d=(255<>2];i=d>>>24|0;H[a+20>>2]=(i|0)==255;c=d>>>16&255;f=d>>>8&255;b=b?7:8;d=d&255;g=b+((d|0)==255?7:8)|0;k=((f|0)==255?7:8)+g|0;j=(h+((c|0)==255?7:8)|0)+k|0;H[a+16>>2]=j;l=H[a+12>>2];b=d|(f<>>0>=32){d=b<>>32-c;b=b<>2];b=d|l;k=b;H[a+8>>2]=h;H[a+12>>2]=b;if(j>>>0<=31){b:{if((e|0)>=4){b=H[a>>2];d=H[b>>2];H[a+24>>2]=e-4;H[a>>2]=b+4;break b}f=0;d=H[a+28>>2]?-1:0;if((e|0)<=0){break b}b=H[a>>2];if((e|0)!=1){l=e&1;m=e&2147483646;g=0;while(1){c=b;H[a>>2]=b+1;n=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=e-1;c=I[c+1|0];e=e-2|0;H[a+24>>2]=e;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=e-1;d=(255<>>24|0;H[a+20>>2]=(e|0)==255;c=d>>>16&255;f=d>>>8&255;g=(i|0)==255?7:8;d=d&255;i=g+((d|0)==255?7:8)|0;l=((f|0)==255?7:8)+i|0;H[a+16>>2]=(((c|0)==255?7:8)+j|0)+l;b=a;a=d|(f<>>0>=32){c=a<>>32-e;a=a<>2]=h;H[b+12>>2]=c|k}return h}function Lc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;h=na-32|0;na=h;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(K[d>>2]<=4){a=0;Ba(e,1,2607,0);break a}f=H[f+5584>>2]+N(b,1080)|0;Da(c,f+4|0,1);g=H[f+4>>2]+1|0;H[f+4>>2]=g;if(g>>>0>=34){H[h+4>>2]=33;H[h>>2]=g;Ba(e,1,7635,h);a=0;break a}j=H[a+184>>2];if(j>>>0>=g>>>0){H[h+24>>2]=g;H[h+20>>2]=j;H[h+16>>2]=b;Ba(e,1,16423,h+16|0);H[a+8>>2]=H[a+8>>2]|32768;a=0;break a}Da(c+1|0,f+8|0,1);H[f+8>>2]=H[f+8>>2]+2;Da(c+2|0,f+12|0,1);a=H[f+12>>2]+2|0;H[f+12>>2]=a;b=H[f+8>>2];if(!(!(b>>>0>10|a>>>0>10)&a+b>>>0<13)){a=0;Ba(e,1,5468,0);break a}Da(c+3|0,f+16|0,1);if(I[f+16|0]&128){a=0;Ba(e,1,6564,0);break a}Da(c+4|0,f+20|0,1);if(K[f+20>>2]>=2){a=0;Ba(e,1,6499,0);break a}b=H[d>>2]-5|0;H[d>>2]=b;a=1;g=H[f+4>>2];if(!(F[f|0]&1)){if(!g){break a}j=g&3;d=f+944|0;e=f+812|0;b=0;c=0;if(g>>>0>=4){k=g&-4;g=0;while(1){f=c<<2;H[f+e>>2]=15;H[d+f>>2]=15;i=f|4;H[i+e>>2]=15;H[d+i>>2]=15;i=f|8;H[i+e>>2]=15;H[d+i>>2]=15;f=f|12;H[f+e>>2]=15;H[d+f>>2]=15;c=c+4|0;g=g+4|0;if((k|0)!=(g|0)){continue}break}if(!j){break a}}while(1){a=c<<2;H[a+e>>2]=15;H[a+d>>2]=15;a=1;c=c+1|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}break a}if(b>>>0>=g>>>0){b:{if(!g){g=0;break b}Da(c+5|0,h+28|0,1);a=H[h+28>>2];H[f+944>>2]=a>>>4;H[f+812>>2]=a&15;g=H[f+4>>2];if(g>>>0>=2){j=f+944|0;k=f+812|0;a=c+6|0;c=1;while(1){Da(a,h+28|0,1);c:{b=H[h+28>>2];if(b>>>0>=16){g=b&15;if(g){break c}}a=0;Ba(e,1,6025,0);break a}i=c<<2;H[i+k>>2]=g;H[j+i>>2]=b>>>4;a=a+1|0;c=c+1|0;g=H[f+4>>2];if(c>>>0>>0){continue}break}}b=H[d>>2]}H[d>>2]=b-g;a=1;break a}a=0;Ba(e,1,2607,0)}na=h+32|0;return a}function gc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=na-256|0;na=j;g=Ea(1,20);a:{if(!g){Ba(c,1,6413,0);g=0;break a}H[g+4>>2]=b;H[g>>2]=a;H[j>>2]=b;H[j+128>>2]=a;while(1){p=h;h=h+1|0;e=h<<2;d=(b+1|0)/2|0;H[e+j>>2]=d;i=e+(j+128|0)|0;e=(a+1|0)/2|0;H[i>>2]=e;i=N(a,b);f=i+f|0;b=d;a=e;if(i>>>0>1){continue}break}H[g+8>>2]=f;if(!f){Ca(g);g=0;break a}d=Ea(f,16);H[g+12>>2]=d;if(!d){Ba(c,1,3564,0);Ca(g);g=0;break a}l=H[g+8>>2];H[g+16>>2]=l<<4;a=d;if(p){f=(N(H[g+4>>2],H[g>>2])<<4)+d|0;b=f;while(1){c=n<<2;e=H[c+j>>2];b:{if((e|0)<=0){break b}o=e-1|0;i=0;c:{d:{c=H[c+(j+128|0)>>2];if((c|0)<=0){k=e&3;if(e>>>0>=4){break d}h=0;break c}while(1){h=f;f=c;while(1){e:{H[a>>2]=b;if((f|0)==1){a=a+16|0;b=b+16|0;break e}H[a+16>>2]=b;b=b+16|0;a=a+32|0;k=(f|0)>2;f=f-2|0;if(k){continue}}break}k=((i|0)==(o|0)|i)&1;f=k?b:h+(c<<4)|0;b=k?b:h;i=i+1|0;if((e|0)!=(i|0)){continue}break}break b}m=e&2147483644;h=0;e=0;while(1){q=(h|0)==(o|0);h=h+4|0;f=q?b:f;b=f;e=e+4|0;if((m|0)!=(e|0)){continue}break}if(k){break c}break b}while(1){e=f;m=((h|0)==(o|0)|h)&1;f=m?b:e+(c<<4)|0;b=m?b:e;h=h+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}n=n+1|0;if((n|0)!=(p|0)){continue}break}}H[a>>2]=0;f:{if(!l){break f}a=l&3;if(l>>>0>=4){c=l&-4;b=0;while(1){H[d+60>>2]=0;H[d+52>>2]=999;H[d+56>>2]=0;H[d+44>>2]=0;H[d+36>>2]=999;H[d+40>>2]=0;H[d+28>>2]=0;H[d+20>>2]=999;H[d+24>>2]=0;H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d- -64|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!a){break f}}b=0;while(1){H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d+16|0;b=b+1|0;if((a|0)!=(b|0)){continue}break}}}na=j+256|0;return g}function Zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=b;H[a+16>>2]=0;H[a+20>>2]=0;H[a+28>>2]=d;h=c-1|0;H[a+24>>2]=h;n=b&3;a:{if((c|0)<=0){e=b;b=d;break a}e=b+1|0;H[a>>2]=e;b=I[b|0]}g=b;i=8;H[a+16>>2]=8;j=(g|0)==255;H[a+20>>2]=j;H[a+8>>2]=g;H[a+12>>2]=0;b:{if((n|0)==3){break b}k=c-2|0;H[a+24>>2]=k;c:{if((c|0)<2){b=e;e=d;break c}b=e+1|0;H[a>>2]=b;e=I[e|0]}j=(e|0)==255;H[a+20>>2]=j;i=(g|0)==255?15:16;H[a+16>>2]=i;g=g|e<<8;H[a+8>>2]=g;H[a+12>>2]=0;if((n|0)==2){e=b;c=h;h=k;break b}o=c-3|0;H[a+24>>2]=o;d:{if((c|0)<3){f=b;b=d;break d}f=b+1|0;H[a>>2]=f;b=I[b|0]}j=(b|0)==255;H[a+20>>2]=j;l=((e|0)==255?7:8)+i|0;H[a+16>>2]=l;e=i&31;if((i&63)>>>0>=32){m=b<>>32-e;e=b<>2]=g;H[a+12>>2]=m;if((n|0)==1){e=f;i=l;c=k;h=o;break b}h=c-4|0;H[a+24>>2]=h;e:{if((c|0)<4){e=f;c=d;break e}e=f+1|0;H[a>>2]=e;c=I[f|0]}j=(c|0)==255;H[a+20>>2]=j;i=l+((b|0)==255?7:8)|0;H[a+16>>2]=i;b=l&31;if((l&63)>>>0>=32){f=c<>>32-b;b=c<>2]=g;H[a+12>>2]=b;c=o}f:{if((c|0)>=5){d=H[e>>2];H[a+24>>2]=c-5;H[a>>2]=e+4;break f}b=0;d=d?-1:0;if((c|0)<2){break f}while(1){c=e+1|0;H[a>>2]=c;e=I[e|0];f=h-1|0;H[a+24>>2]=f;d=(255<>>0>1;e=c;h=f;if(k){continue}break}}b=d>>>24|0;H[a+20>>2]=(b|0)==255;c=d>>>16&255;e=d>>>8&255;h=j?7:8;d=d&255;f=h+((d|0)==255?7:8)|0;k=((e|0)==255?7:8)+f|0;H[a+16>>2]=(((c|0)==255?7:8)+i|0)+k;b=d|(e<>>0>=32){d=a<>>32-b;a=a<>2]=a|g;H[c+12>>2]=d|m}function Ha(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!b){return 0}a:{if(!a){a=gb(8,b);break a}if(!b){Ca(a);a=0;break a}b:{if(b>>>0>4294967239){break b}h=b>>>0<=8?8:b+3&-4;d=h+8|0;j=a-4|0;f=j;e=H[f>>2];b=e+f|0;c=H[b>>2];c:{d:{e:{if((c|0)!=H[(b+c|0)-4>>2]){c=c+e|0;if(c>>>0>=d+16>>>0){e=H[b+4>>2];b=H[b+8>>2];H[e+8>>2]=b;H[b+4>>2]=e;b=d+f|0;c=c-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;e=H[b>>2]-8|0;f:{if(e>>>0<=127){g=(e>>>3|0)-1|0;break f}c=Q(e);g=((e>>>29-c^4)-(c<<2)|0)+110|0;if(e>>>0<=4095){break f}c=((e>>>30-c^2)-(c<<1)|0)+71|0;g=c>>>0>=63?63:c}c=g;e=c<<4;H[b+4>>2]=e+26400;e=e+26408|0;H[b+8>>2]=H[e>>2];H[e>>2]=b;H[H[b+8>>2]+4>>2]=b;e=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b}H[6858]=g|H[6858];H[6859]=c|e;H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;c=1;break c}if(c>>>0>>0){break e}d=H[b+4>>2];b=H[b+8>>2];H[d+8>>2]=b;H[b+4>>2]=d;H[f>>2]=c;H[(f+(c&-4)|0)-4>>2]=c;c=1;break c}if(e>>>0>=d+16>>>0){H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;b=d+f|0;c=e-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;d=H[b>>2]-8|0;g:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break g}f=Q(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break g}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;H[b+4>>2]=d+26400;d=d+26408|0;H[b+8>>2]=H[d>>2];H[d>>2]=b;H[H[b+8>>2]+4>>2]=b;d=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b;b=e}H[6858]=b|H[6858];H[6859]=c|d;c=1;break c}c=1;if(d>>>0<=e>>>0){break d}}c=0}}if(c){break a}b=gb(8,h);if(!b){break b}i=H[j>>2]-8|0;ab(b,a,h>>>0>>0?h:i);Ca(a);i=b}a=i}return a}function ne(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=na-16|0;na=f;H[f+12>>2]=c;k=H[a+96>>2];if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}F[e+5640|0]=I[e+5640|0]|1;a:{if(c>>>0<=4){c=0;Ba(d,1,4565,0);break a}Da(b,e,1);if(K[e>>2]>=8){c=0;Ba(d,1,4531,0);break a}Da(b+1|0,f+8|0,1);c=H[f+8>>2];H[e+4>>2]=c;if((c|0)>=5){Ba(d,1,4490,0);H[e+4>>2]=-1}Da(b+2|0,e+8|0,2);g=H[e+8>>2];if(g-65536>>>0<=4294901760){H[f>>2]=g;Ba(d,1,8111,f);c=0;break a}c=H[a+188>>2];H[e+12>>2]=c?c:g;Da(b+4|0,e+16|0,1);if(K[e+16>>2]>=2){c=0;Ba(d,1,5536,0);break a}g=b+5|0;H[f+12>>2]=H[f+12>>2]-5;c=H[k+16>>2];b:{if(!c){break b}k=c&7;h=H[e>>2]&1;e=H[e+5584>>2];b=0;if(c>>>0>=8){c=c&-8;while(1){i=e+N(b,1080)|0;H[i+7560>>2]=h;H[i+6480>>2]=h;H[i+5400>>2]=h;H[i+4320>>2]=h;H[i+3240>>2]=h;H[i+2160>>2]=h;H[i+1080>>2]=h;H[i>>2]=h;b=b+8|0;j=j+8|0;if((c|0)!=(j|0)){continue}break}if(!k){break b}}while(1){H[e+N(b,1080)>>2]=h;b=b+1|0;l=l+1|0;if((k|0)!=(l|0)){continue}break}}c=0;if(!Lc(a,0,g,f+12|0,d)){Ba(d,1,4565,0);break a}if(H[f+12>>2]){Ba(d,1,4565,0);break a}if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}if(K[H[a+96>>2]+16>>2]>=2){b=H[b+5584>>2];g=H[b+4>>2]<<2;l=b+944|0;e=b+812|0;j=1;c=b;while(1){H[c+1084>>2]=H[b+4>>2];H[c+1088>>2]=H[b+8>>2];H[c+1092>>2]=H[b+12>>2];H[c+1096>>2]=H[b+16>>2];H[c+1100>>2]=H[b+20>>2];d=!g;if(!d){B(c+1892|0,e,g)}if(!d){B(c+2024|0,l,g)}c=c+1080|0;j=j+1|0;if(j>>>0>2]+16>>2]){continue}break}}c=1}na=f+16|0;return c|0}function gb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=a>>>0<=8?8:a;k=j+48|0;a:{b:{while(1){if(a-1&a|b>>>0>4294967239){break b}c=H[6859];e=c;h=H[6858];b=b>>>0<=8?8:b+3&-4;c:{if(b>>>0<=127){i=(b>>>3|0)-1|0;break c}d=Q(b);i=((b>>>29-d^4)-(d<<2)|0)+110|0;if(b>>>0<=4095){break c}d=((b>>>30-d^2)-(d<<1)|0)+71|0;i=d>>>0>=63?63:d}g=i;f=g&31;if((g&63)>>>0>=32){d=0;c=c>>>f|0}else{d=c>>>f|0;c=((1<>>f}if(c|d){while(1){f=d;d:{if(f|c){e=f-1|0;i=e+1|0;d=e;e=c-1|0;h=(e|0)!=-1?i:d;d=Q(f^h);d=(d|0)==32?Q(c^e)+32|0:d;e=63-d|0;qa=0-(d>>>0>63)|0;break d}qa=0;e=64}h=e;e=h&31;if((h&63)>>>0>=32){d=0;i=f>>>e|0}else{d=f>>>e|0;i=((1<>>e}g=g+h|0;c=g<<4;f=H[c+26408>>2];e=c+26400|0;e:{if((f|0)!=(e|0)){c=Cb(f,j,b);if(c){break a}c=H[f+4>>2];h=H[f+8>>2];H[c+8>>2]=h;H[h+4>>2]=c;H[f+8>>2]=e;H[f+4>>2]=H[e+4>>2];H[e+4>>2]=f;H[H[f+4>>2]+8>>2]=f;g=g+1|0;c=(d&1)<<31|i>>>1;d=d>>>1|0;break e}c=H[6859];l=27432,m=H[6858]&ye(-2,-1,g),H[l>>2]=m;H[6859]=qa&c;c=i^1}if(c|d){continue}break}h=H[6858];e=H[6859]}d=Q(e);f=63-((d|0)==32?Q(h)+32|0:d)|0;f:{if(!(e|h)){g=0;break f}c=f<<4;g=H[c+26408>>2];if(!e&h>>>0<1073741824){break f}d=98;e=c+26400|0;if((e|0)==(g|0)){break f}while(1){c=Cb(g,j,b);if(c){break a}g=H[g+8>>2];if((e|0)==(g|0)){break f}c=d;d=c-1|0;if(c){continue}break}}d=a>>>0>8;a=j;if(zc((d?k:48)+b|0)){continue}break}if(!g){break b}a=(f<<4)+26400|0;if((a|0)==(g|0)){break b}while(1){c=Cb(g,j,b);if(c){break a}g=H[g+8>>2];if((a|0)!=(g|0)){continue}break}}c=0}return c}function ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+48>>2];if(e>>>0>=b>>>0){H[a+48>>2]=e-b;H[a+36>>2]=H[a+36>>2]+b;e=c+H[a+60>>2]|0;d=b+H[a+56>>2]|0;e=d>>>0>>0?e+1|0:e;H[a+56>>2]=d;H[a+60>>2]=e;qa=c;return b|0}if(I[a+68|0]&4){H[a+48>>2]=0;H[a+36>>2]=e+H[a+36>>2];g=H[a+60>>2];c=H[a+56>>2];b=c+e|0;H[a+56>>2]=b;H[a+60>>2]=b>>>0>>0?g+1|0:g;qa=e?0:-1;return(e?e:-1)|0}if(e){H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];h=b;f=e;b=b-e|0;c=c-(e>>>0>h>>>0)|0}a:{if((c|0)>0){h=1}else{h=!!b&(c|0)>=0}if(h){while(1){h=H[a+12>>2];e=c+g|0;i=b+f|0;e=H[a+60>>2]+(i>>>0>>0?e+1|0:e)|0;j=i;i=i+H[a+56>>2]|0;e=j>>>0>i>>>0?e+1|0:e;if((e|0)==(h|0)&i>>>0>K[a+8>>2]|e>>>0>h>>>0){Ba(d,4,15630,0);H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;d=H[a+8>>2];f=d-c|0;e=H[a+12>>2];g=e-((c>>>0>d>>>0)+b|0)|0;h=ra[H[a+28>>2]](d,e,H[a>>2])|0;i=H[a+68>>2];if(h){H[a+56>>2]=d;H[a+60>>2]=e}H[a+68>>2]=i|4;a=(c|0)==(d|0)&(b|0)==(e|0);b=a?-1:f;break a}e=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((e&i)==-1){Ba(d,4,15630,0);H[a+68>>2]=H[a+68>>2]|4;e=g+H[a+60>>2]|0;b=f+H[a+56>>2]|0;e=b>>>0>>0?e+1|0:e;H[a+56>>2]=b;H[a+60>>2]=e;a=!(g|f);b=a?-1:f;break a}g=g+i|0;f=e+f|0;g=f>>>0>>0?g+1|0:g;h=b;b=b-e|0;c=c-((e>>>0>h>>>0)+i|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;qa=g;return f|0}qa=a?-1:g;return b|0}function yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-80|0;na=e;a:{if(c>>>0<=2){Ba(d,1,14478,0);break a}if(I[a+124|0]){Ba(d,4,11193,0);g=1;break a}g=1;Da(b,a+40|0,1);Da(b+1|0,a+52|0,1);Da(b+2|0,a+44|0,1);f=b+3|0;b:{c:{d:{e:{f:{h=H[a+40>>2];switch(h-1|0){case 0:break f;case 1:break e;default:break d}}if(c>>>0<=6){H[e+16>>2]=c;Ba(d,1,15155,e+16|0);g=0;break a}if(!((c|0)==7|H[a+48>>2]==14)){H[e+48>>2]=c;Ba(d,2,15155,e+48|0)}Da(f,a+48|0,4);if(H[a+48>>2]!=14){break b}f=Fa(36);if(!f){g=0;Ba(d,1,7993,0);break a}H[f>>2]=14;H[e+64>>2]=0;H[e+56>>2]=0;H[e+72>>2]=0;H[e+60>>2]=0;H[e+68>>2]=0;H[e+76>>2]=0;g=4470064;H[e+52>>2]=4470064;H[f+4>>2]=1145390592;g:{if((c|0)!=7){if((c|0)==35){Da(b+7|0,e+76|0,4);Da(b+11|0,e+72|0,4);Da(b+15|0,e+68|0,4);Da(b+19|0,e- -64|0,4);Da(b+23|0,e+60|0,4);Da(b+27|0,e+56|0,4);Da(b+31|0,e+52|0,4);H[f+4>>2]=0;g=H[e+52>>2];c=H[e+56>>2];d=H[e+64>>2];i=H[e+68>>2];j=H[e+76>>2];h=H[e+72>>2];b=H[e+60>>2];break g}H[e+32>>2]=c;Ba(d,2,15191,e+32|0)}c=0;d=0;h=0;b=0}H[f+24>>2]=b;H[f+16>>2]=i;H[f+8>>2]=j;H[f+32>>2]=g;H[f+28>>2]=c;H[f+20>>2]=d;H[f+12>>2]=h;H[a+112>>2]=0;H[a+108>>2]=f;break b}b=c-3|0;H[a+112>>2]=b;d=Ea(1,b);H[a+108>>2]=d;if(!d){break c}if((c|0)<=3){break b}c=0;while(1){Da(f,e+76|0,1);F[H[a+108>>2]+c|0]=H[e+76>>2];f=f+1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}break b}if(h>>>0<3){break a}H[e>>2]=h;Ba(d,4,15950,e);break a}g=0;H[a+112>>2]=0;break a}g=1;F[a+124|0]=1}na=e+80|0;return g|0}function Ja(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;h=H[a+48>>2];if(h>>>0>=c>>>0){if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c}if(I[a+68|0]&4){if(h){B(b,H[a+36>>2],h)}b=H[a+48>>2];H[a+48>>2]=0;H[a+36>>2]=b+H[a+36>>2];g=H[a+60>>2];c=b;b=H[a+56>>2]+b|0;g=c>>>0>b>>>0?g+1|0:g;H[a+56>>2]=b;H[a+60>>2]=g;return h?h:-1}a:{if(h){if(h){B(b,H[a+36>>2],h)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];H[a+48>>2]=0;f=H[a+60>>2];g=H[a+56>>2]+e|0;f=g>>>0>>0?f+1|0:f;H[a+56>>2]=g;H[a+60>>2]=f;c=c-e|0;b=b+e|0;break a}i=H[a+32>>2];H[a+36>>2]=i}b:{while(1){c:{e=H[a>>2];f=H[a+16>>2];g=H[a+64>>2];d:{if(g>>>0>c>>>0){f=ra[f|0](i,g,e)|0;H[a+48>>2]=f;if((f|0)==-1){break b}if(c>>>0>f>>>0){if(f){B(b,H[a+36>>2],f)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];break d}if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c+h|0}e=ra[f|0](b,c,e)|0;H[a+48>>2]=e;if((e|0)==-1){break b}if(c>>>0<=e>>>0){break c}i=H[a+32>>2];H[a+36>>2]=i;f=e}H[a+48>>2]=0;g=H[a+60>>2];j=H[a+56>>2]+e|0;g=j>>>0>>0?g+1|0:g;H[a+56>>2]=j;H[a+60>>2]=g;b=b+e|0;c=c-e|0;h=f+h|0;continue}break}H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=H[a+60>>2];b=H[a+56>>2]+e|0;f=b>>>0>>0?f+1|0:f;H[a+56>>2]=b;H[a+60>>2]=f;return e+h|0}Ba(d,4,15630,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|4;return h?h:-1}function Ta(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if(!H[a+12>>2]){k=1;if(H[a+4>>2]>0|H[a+8>>2]>1){break b}break a}e=1;if(H[a+8>>2]>0){break b}if(H[a+4>>2]<2){break a}}b=H[a>>2];f=b+(e<<5)|0;g=H[a+16>>2];h=H[a+20>>2];if(g>>>0>>0){d=g;while(1){c=(d<<6)+f|0;L[c>>2]=L[c>>2]*O(1.2301740646362305);L[c+4>>2]=L[c+4>>2]*O(1.2301740646362305);L[c+8>>2]=L[c+8>>2]*O(1.2301740646362305);L[c+12>>2]=L[c+12>>2]*O(1.2301740646362305);L[c+16>>2]=L[c+16>>2]*O(1.2301740646362305);L[c+20>>2]=L[c+20>>2]*O(1.2301740646362305);L[c+24>>2]=L[c+24>>2]*O(1.2301740646362305);L[c+28>>2]=L[c+28>>2]*O(1.2301740646362305);d=d+1|0;if((h|0)!=(d|0)){continue}break}}i=b+(k<<5)|0;j=H[a+28>>2];c=H[a+24>>2];if(j>>>0>c>>>0){d=c;while(1){b=(d<<6)+i|0;L[b>>2]=L[b>>2]*O(1.625732421875);L[b+4>>2]=L[b+4>>2]*O(1.625732421875);L[b+8>>2]=L[b+8>>2]*O(1.625732421875);L[b+12>>2]=L[b+12>>2]*O(1.625732421875);L[b+16>>2]=L[b+16>>2]*O(1.625732421875);L[b+20>>2]=L[b+20>>2]*O(1.625732421875);L[b+24>>2]=L[b+24>>2]*O(1.625732421875);L[b+28>>2]=L[b+28>>2]*O(1.625732421875);d=d+1|0;if((j|0)!=(d|0)){continue}break}}b=f+32|0;d=H[a+8>>2];a=H[a+4>>2];e=a-e|0;e=(d|0)<(e|0)?d:e;mb(i,b,g,h,e,O(-.4435068666934967));l=i+32|0;d=d-k|0;a=(a|0)<(d|0)?a:d;mb(f,l,c,j,a,O(-.8829110860824585));mb(i,b,g,h,e,O(.05298011749982834));mb(f,l,c,j,a,O(1.5861343145370483))}}function _b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=H[a+28>>2]+N(b,152)|0;c=H[e-144>>2]-H[e-152>>2]|0;d=H[e-140>>2]-H[e-148>>2]|0;f=d>>>0>=64?64:d;g=c>>>0>=64?64:c;a:{if(!(!c|!d|(!g|!f)|g>>>0>4294967295/(f>>>0)>>>2>>>0)){e=Ea(1,28);H[e+12>>2]=f;H[e+8>>2]=g;H[e+4>>2]=d;H[e>>2]=c;j=d;d=d+f|0;i=j>>>0>d>>>0;d=ve(d-1|0,i-!d|0,f,0);H[e+20>>2]=d;j=c;c=c+g|0;f=j>>>0>c>>>0;c=ve(c-1|0,f-!c|0,g,0);H[e+16>>2]=c;re(d,0,c);b:{if(qa){break b}c=Ea(4,N(c,d));H[e+24>>2]=c;if(!c){break b}break a}Ca(e)}e=0}if(!e){return 0}c:{if(b){while(1){q=N(p,152);g=q+H[a+28>>2]|0;c=H[g+24>>2];if(c){j=g+28|0;d=H[g+20>>2];f=H[g+16>>2];n=0;while(1){if(N(d,f)){i=N(n,36)+j|0;o=0;while(1){k=H[i+20>>2]+N(o,40)|0;c=H[k+20>>2];h=H[k+16>>2];if(N(c,h)){f=0;while(1){l=H[k+24>>2]+N(f,68)|0;r=H[l+60>>2];if(r){h=H[l+8>>2];d=h-H[i>>2]|0;m=H[i+16>>2];if(m&1){c=H[a+28>>2]+q|0;d=(H[c-144>>2]+d|0)-H[c-152>>2]|0}s=H[l+12>>2];c=s-H[i+4>>2]|0;if(m&2){m=H[a+28>>2]+q|0;c=(c+H[m-140>>2]|0)-H[m-148>>2]|0}h=H[l+16>>2]-h|0;if(!Za(e,d,c,d+h|0,(H[l+20>>2]-s|0)+c|0,r,1,h)){break c}h=H[k+16>>2];c=H[k+20>>2]}f=f+1|0;if(f>>>0>>0){continue}break}f=H[g+16>>2];d=H[g+20>>2]}o=o+1|0;if(o>>>0>>0){continue}break}c=H[g+24>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}p=p+1|0;if((p|0)!=(b|0)){continue}break}}return e}Va(e);return 0}function $d(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=na-16|0;na=h;if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4132,0);a=0;break a}Da(b,h+12|0,2);b:{if(H[h+12>>2]){Ba(d,2,3608,0);break b}if(c>>>0<=6){Ba(d,1,4132,0);a=0;break a}Da(b+2|0,h+12|0,2);g=H[e+5616>>2];k=I[h+12|0];f=H[e+5620>>2];c:{d:{if(!f){break d}a=g;while(1){if(H[a+8>>2]!=(k|0)){a=a+20|0;i=i+1|0;if((i|0)!=(f|0)){continue}break d}break}if((f|0)!=(i|0)){break c}}if(H[e+5624>>2]==(f|0)){a=f+10|0;H[e+5624>>2]=a;a=Ha(g,N(a,20));g=H[e+5616>>2];if(!a){Ca(g);H[e+5624>>2]=0;H[e+5616>>2]=0;H[e+5620>>2]=0;Ba(d,1,4158,0);a=0;break a}e:{if((a|0)==(g|0)){break e}l=H[e+5632>>2];if(!l){break e}m=H[e+5628>>2];i=0;while(1){f=N(i,20)+m|0;j=H[f+8>>2];if(j){H[f+8>>2]=a+(j-g|0)}j=H[f+12>>2];if(j){H[f+12>>2]=a+(j-g|0)}i=i+1|0;if((l|0)!=(i|0)){continue}break}}H[e+5616>>2]=a;g=H[e+5620>>2];f=N(H[e+5624>>2]-g|0,20);if(f){y(a+N(g,20)|0,0,f)}f=H[e+5620>>2];g=H[e+5616>>2]}H[e+5620>>2]=f+1;a=N(f,20)+g|0}e=H[a+12>>2];if(e){Ca(e);H[a+12>>2]=0;H[a+16>>2]=0}H[a+8>>2]=k;e=H[h+12>>2];H[a>>2]=e>>>10&3;H[a+4>>2]=e>>>8&3;Da(b+4|0,h+12|0,2);if(H[h+12>>2]){Ba(d,2,3023,0);break b}c=c-6|0;e=Fa(c);H[a+12>>2]=e;if(!e){Ba(d,1,4132,0);a=0;break a}if(c){B(e,b+6|0,c)}H[a+16>>2]=c}a=1}na=h+16|0;return a|0}function Tb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(a){b=H[a+20>>2];if(b){g=H[b>>2];if(g){d=H[g+20>>2];if(H[g+16>>2]){i=F[a+40|0]&1?16:17;while(1){c=H[d+28>>2];if(c){b=H[d+32>>2];l=(b>>>0)/152|0;j=0;if(b>>>0>=152){while(1){b=H[c+48>>2];if(b){f=H[c+52>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+48>>2]}Ca(b);H[c+48>>2]=0}b=H[c+84>>2];if(b){f=H[c+88>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+84>>2]}Ca(b);H[c+84>>2]=0}b=H[c+120>>2];if(b){f=H[c+124>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+120>>2]}Ca(b);H[c+120>>2]=0}c=c+152|0;j=j+1|0;if((l|0)!=(j|0)){continue}break}c=H[d+28>>2]}Ca(c);H[d+28>>2]=0}a:{if(!H[d+40>>2]){break a}b=H[d+36>>2];if(!b){break a}Ca(b);H[d+44>>2]=0;H[d+48>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0}Ca(H[d+52>>2]);d=d+76|0;k=k+1|0;if(k>>>0>2]){continue}break}d=H[g+20>>2]}Ca(d);H[g+20>>2]=0;Ca(H[H[a+20>>2]>>2]);b=H[a+20>>2];H[b>>2]=0}Ca(b);H[a+20>>2]=0}Ca(H[a+68>>2]);Ca(a)}}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+24>>2];j=H[e+16>>2];if(!j){return 0}f=H[e+24>>2];e=H[H[H[a+20>>2]>>2]+20>>2];a:{b:{if(!b){b=0;while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}b=0;if(!H[a+64>>2]){while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-4>>2];g=H[a-8>>2]-H[a-16>>2]|0;a=H[a-12>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}}return a}return-1}function $b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=H[a+8>>2];e=c+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2){break a}h=(c<<2)+b|0;d=H[h>>2];c=H[b>>2]-(d+1>>1)|0;i=H[a>>2];if(e>>>0>=4){k=(e-4>>>1|0)+1|0;a=1;while(1){f=d;d=a<<2;m=H[d+b>>2];d=H[d+h>>2];j=c;l=i+(g<<2)|0;H[l>>2]=c;c=m-((d+f|0)+2>>2)|0;H[l+4>>2]=f+(j+c>>1);g=g+2|0;f=(a|0)!=(k|0);a=a+1|0;if(f){continue}break}}H[i+(g<<2)>>2]=c;if(e&1){f=e-1|0;a=H[(f<<1)+b>>2]-(d+1>>1)|0;H[i+(f<<2)>>2]=a;c=a+c>>1;j=-8}else{j=-4}a=e<<2;H[j+(a+i|0)>>2]=c+d;if(!a){break a}B(b,i,a);return}b:{switch(e-1|0){case 0:H[b>>2]=H[b>>2]/2;return;case 1:a=H[a>>2];c=(c<<2)+b|0;d=H[b>>2]-(H[c>>2]+1>>1)|0;H[a+4>>2]=d;H[a>>2]=d+H[c>>2];c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;return;default:break b}}if((e|0)<3){break a}h=H[a>>2];k=(c<<2)+b|0;d=H[k+4>>2];a=H[k>>2];c=H[b>>2]-((d+a|0)+2>>2)|0;H[h>>2]=c+a;g=1;m=e-2|0;l=e&1;a=!l;if(m-a>>>0>=2){o=((e-a|0)-4>>>1|0)+1|0;a=1;while(1){f=d;p=H[(a<<2)+b>>2];j=a+1|0;d=H[k+(j<<2)>>2];i=c;n=h+(g<<2)|0;H[n>>2]=c;c=p-((d+f|0)+2>>2)|0;H[n+4>>2]=f+(i+c>>1);g=g+2|0;f=(a|0)!=(o|0);a=j;if(f){continue}break}}H[h+(g<<2)>>2]=c;c:{if(!l){g=H[((e<<1)+b|0)-4>>2]-(d+1>>1)|0;H[h+(m<<2)>>2]=(g+c>>1)+d;break c}g=c+d|0}a=e<<2;H[(a+h|0)-4>>2]=g;if(!a){break a}B(b,h,a)}}function Hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=na-256|0;na=d;if(a){Ac(1806,17,c);H[d+240>>2]=H[a>>2];Ga(c,2348,d+240|0);H[d+224>>2]=H[a+4>>2];Ga(c,2361,d+224|0);H[d+208>>2]=H[a+8>>2];Ga(c,7260,d+208|0);H[d+192>>2]=H[a+16>>2];Ga(c,2319,d+192|0);if((b|0)>0){while(1){e=H[a+5584>>2];H[d+176>>2]=h;Ga(c,1844,d+176|0);e=e+N(h,1080)|0;H[d+160>>2]=H[e>>2];Ga(c,2347,d+160|0);H[d+144>>2]=H[e+4>>2];Ga(c,7374,d+144|0);H[d+128>>2]=H[e+8>>2];Ga(c,7162,d+128|0);H[d+112>>2]=H[e+12>>2];Ga(c,7178,d+112|0);H[d+96>>2]=H[e+16>>2];Ga(c,2330,d+96|0);H[d+80>>2]=H[e+20>>2];Ga(c,7440,d+80|0);Ac(1567,23,c);if(H[e+4>>2]){i=e+944|0;j=e+812|0;f=0;while(1){g=f<<2;k=H[j+g>>2];H[d+68>>2]=H[i+g>>2];H[d+64>>2]=k;Ga(c,1693,d- -64|0);f=f+1|0;if(f>>>0>2]){continue}break}}Bc(c);H[d+48>>2]=H[e+24>>2];Ga(c,7194,d+48|0);H[d+32>>2]=H[e+804>>2];Ga(c,7243,d+32|0);i=1;Ac(1591,20,c);a:{if(H[e+24>>2]!=1){f=H[e+4>>2];if((f|0)<=0){break a}i=N(f,3)-2|0}j=e+28|0;f=0;while(1){g=j+(f<<3)|0;l=d,m=ye(H[g>>2],H[g+4>>2],32),H[l+16>>2]=m;H[d+20>>2]=qa;Ga(c,1693,d+16|0);f=f+1|0;if((i|0)!=(f|0)){continue}break}}Bc(c);H[d>>2]=H[e+808>>2];Ga(c,7226,d);Ac(1707,5,c);h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ac(1708,4,c)}na=d+256|0}function se(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}if(!d){break i}e=Q(d)-Q(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;oa=a-N(b,c)|0;pa=0;qa=0;return b}if(!a){break g}if(!d){break f}f=d-1|0;if(f&d){break f}oa=a;pa=e&f;a=e>>>te(d)|0;qa=0;return a}f=c-1|0;if(!(f&c)){break e}k=(Q(c)+33|0)-Q(e)|0;g=0-k|0;break c}k=e+1|0;g=63-e|0;break c}oa=0;a=(e>>>0)/(d>>>0)|0;pa=e-N(a,d)|0;qa=0;return a}e=Q(d)-Q(e)|0;if(e>>>0<31){break d}break b}oa=a&f;pa=0;if((c|0)==1){break a}c=te(c);d=c&31;if((c&63)>>>0>=32){e=0;a=b>>>d|0}else{e=b>>>d|0;a=((1<>>d}qa=e;return a}k=e+1|0;g=63-e|0}f=a;e=k&63;h=e&31;if((e&63)>>>0>=32){e=0;f=b>>>h|0}else{e=b>>>h|0;f=((1<>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<>>32-i|b<>>31;f=f<<1|b>>>31;l=e;i=g-(e+(f>>>0>h>>>0)|0)|0;m=i>>31;j=m;e=f;i=c&j;f=e-i|0;e=l-((d&j)+(e>>>0>>0)|0)|0;j=b<<1|a>>>31;a=n|a<<1;b=j|o;l=m&1;n=l;k=k-1|0;if(k){continue}break}}oa=f;pa=e;j=b<<1|a>>>31;a=l|a<<1;qa=j|o;return a}oa=a;pa=b;a=0;b=0}qa=b;return a}function Kc(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=na-16|0;na=h;if(H[a+8>>2]==16){a=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{a=H[a+12>>2]}f=H[d>>2];a:{if(!f){d=0;Ba(e,1,2642,0);break a}a=H[a+5584>>2];H[d>>2]=f-1;Da(c,h+12|0,1);g=N(b,1080)+a|0;a=H[h+12>>2];H[g+804>>2]=a>>>5;b=a&31;H[g+24>>2]=b;a=c+1|0;b:{c:{d:{e:{f:{switch(b|0){case 0:f=H[d>>2];break e;case 1:break d;default:break f}}f=H[d>>2]>>>1|0}if(f>>>0>=98){H[h+4>>2]=97;H[h+8>>2]=97;H[h>>2]=f;Ba(e,2,16056,h);b=H[g+24>>2]}if(b){b=f;if(b){break d}a=0;break c}if(f){b=g+28|0;c=0;while(1){Da(a,h+12|0,1);if(c>>>0<=96){e=H[h+12>>2];i=b+(c<<3)|0;H[i+4>>2]=0;H[i>>2]=e>>>3}a=a+1|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}a=H[d>>2];if(a>>>0>>0){d=0;break a}a=a-f|0;break b}e=g+28|0;c=0;while(1){Da(a,h+12|0,2);if(c>>>0<=96){f=e+(c<<3)|0;i=H[h+12>>2];H[f+4>>2]=i&2047;H[f>>2]=i>>>11}a=a+2|0;c=c+1|0;if((c|0)!=(b|0)){continue}break}a=b<<1}b=H[d>>2];if(a>>>0>b>>>0){d=0;break a}a=b-a|0}H[d>>2]=a;d=1;if(H[g+24>>2]!=1){break a}f=g+28|0;c=H[g+32>>2];e=H[g+28>>2];a=1;while(1){b=f+(a<<3)|0;H[b+12>>2]=c;H[b+4>>2]=c;g=e-((a>>>0)/3|0)|0;H[b+8>>2]=(g|0)>0?g:0;g=b;b=e-((a-1>>>0)/3|0)|0;H[g>>2]=(b|0)>0?b:0;a=a+2|0;if((a|0)!=97){continue}break}}na=h+16|0;return d}function fe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=na-32|0;na=f;g=1;a:{if(c>>>0<=1){g=0;Ba(d,1,10062,0);break a}if(H[a+76>>2]){break a}Da(b,f+28|0,1);Da(b+1|0,f+24|0,1);e=H[f+24>>2];i=e>>>4&3;if((i|0)==3){H[a+76>>2]=1;Ba(d,2,11558,0);break a}c=c-2|0;j=(e>>>5&2)+2|0;h=i+j|0;e=(c>>>0)/(h>>>0)|0;if((c|0)!=(N(e,h)|0)){H[a+76>>2]=1;Ba(d,2,11139,0);break a}if(c>>>0>>0){break a}b:{c=H[a+68>>2];if(c>>>0<=(e^-1)>>>0){c=c+e|0;if(c>>>0<536870912){break b}}H[a+76>>2]=1;Ba(d,2,9400,0);break a}h=Ha(H[a+72>>2],c<<3);if(!h){H[a+76>>2]=1;Ba(d,2,9443,0);break a}c=b+2|0;H[a+72>>2]=h;c:{if(i){k=e>>>0<=1?1:e;e=0;while(1){Da(c,f+20|0,i);b=H[f+20>>2];if(b>>>0>=N(H[a+132>>2],H[a+128>>2])>>>0){break c}b=c+i|0;Da(b,f+16|0,j);c=H[a+68>>2];g=h+(c<<3)|0;G[g>>1]=H[f+20>>2];H[g+4>>2]=H[f+16>>2];g=1;H[a+68>>2]=c+1;c=b+j|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}break a}i=e>>>0<=1?1:e;b=H[a+68>>2];e=0;while(1){H[f+20>>2]=b;if(N(H[a+132>>2],H[a+128>>2])>>>0<=b>>>0){break c}Da(c,f+16|0,j);k=H[a+68>>2];g=h+(k<<3)|0;G[g>>1]=b;H[g+4>>2]=H[f+16>>2];g=1;b=k+1|0;H[a+68>>2]=b;c=c+j|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}break a}H[a+76>>2]=1;H[f>>2]=b;Ba(d,2,7799,f)}na=f+32|0;return g|0}function Ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=na-16|0;na=h;a:{if(!(I[a+100|0]&2)){Ba(d,1,11356,0);a=0;break a}H[a+104>>2]=0;b:{c:{d:{if(c){while(1){if(c>>>0<=7){Ba(d,1,3403,0);break b}g=h+12|0;Da(b,g,4);e=H[h+12>>2];Da(b+4|0,g,4);f=8;g=H[h+12>>2];e:{f:{g:{switch(e|0){case 1:if(c>>>0<16){e=3443;break c}Da(b+8|0,h+8|0,4);if(H[h+8>>2]){e=8449;break c}Da(b+12|0,h+12|0,4);e=H[h+12>>2];if(e){break f}e=3268;break c;case 0:break g;default:break e}}Ba(d,1,3268,0);break b}f=16}if(e>>>0>>0){Ba(d,1,9148,0);break b}if(c>>>0>>0){Ba(d,1,9076,0);a=0;break a}h:{i:{j=b+f|0;k=e-f|0;j:{k:{l:{m:{if((g|0)<=1668246641){if((g|0)==1651532643){break m}if((g|0)==1667523942){break k}if((g|0)!=1668112752){break i}f=25296;break j}if((g|0)==1885564018){break l}f=25264;if((g|0)==1768449138){break j}if((g|0)!=1668246642){break i}f=25272;break j}f=25280;break j}f=25288;break j}f=25304}if(ra[H[f+4>>2]](a,j,k,d)|0){break h}a=0;break a}H[a+104>>2]=H[a+104>>2]|2147483647}i=(g|0)==1768449138?1:i;b=b+e|0;c=c-e|0;if(c){continue}break}if(i){break d}}Ba(d,1,8976,0);a=0;break a}F[a+132|0]=1;H[a+100>>2]=H[a+100>>2]|4;a=1;break a}Ba(d,1,e,0)}Ba(d,1,1968,0);a=0}na=h+16|0;return a|0}function Jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(!Wa(H[b+8>>2],54,d)){break a}i=H[b+4>>2];f=H[i>>2];e=H[i+8>>2];b:{if(f){g=1;c:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;d:{if(!g){break d}h=0;if(!(ra[H[e>>2]](b,a,d)|0)){break d}h=(ra[H[e+4>>2]](b,a,d)|0)!=0}g=h;e=e+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break c}}if(!g){g=0;break c}g=(ra[H[e>>2]](b,a,d)|0)!=0}Pa(i);if(g){break b}break a}Pa(i)}i=H[b+8>>2];f=H[i>>2];e=H[i+8>>2];e:{if(f){g=1;f:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;g:{if(!g){break g}h=0;if(!(ra[H[e>>2]](b,a,d)|0)){break g}h=(ra[H[e+4>>2]](b,a,d)|0)!=0}g=h;e=e+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break f}}if(!g){g=0;break f}g=(ra[H[e>>2]](b,a,d)|0)!=0}Pa(i);if(!g){break a}break e}Pa(i)}if(!I[b+132|0]){Ba(d,1,11696,0);return 0}if(!I[b+133|0]){Ba(d,1,11667,0);return 0}l=Mb(a,H[b>>2],c,d);if(!c|!l){break a}a=H[c>>2];if(!a){break a}e=1;h:{i:{switch(H[b+48>>2]-12|0){case 5:e=2;break h;case 6:e=3;break h;case 12:e=4;break h;case 0:e=5;break h;case 4:break h;default:break i}}e=-1}H[a+20>>2]=e;c=H[b+108>>2];if(!c){break a}H[a+28>>2]=c;H[a+32>>2]=H[b+112>>2];H[b+108>>2]=0}return l|0}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=Eb();H[b+96>>2]=e;a:{b:{if(!e){break b}c:{if(Wa(H[b+220>>2],18,d)){if(Wa(H[b+220>>2],19,d)){break c}}break a}i=H[b+220>>2];f=H[i>>2];g=H[i+8>>2];d:{if(f){e=1;e:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;f:{if(!e){break f}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break f}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break e}}if(!e){e=0;break e}e=(ra[H[g>>2]](b,a,d)|0)!=0}Pa(i);if(e){break d}break a}Pa(i)}g:{if(Wa(H[b+216>>2],20,d)){if(Wa(H[b+216>>2],21,d)){break g}}break a}i=H[b+216>>2];f=H[i>>2];g=H[i+8>>2];h:{if(f){e=1;i:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;j:{if(!e){break j}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break j}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break i}}if(!e){e=0;break i}e=(ra[H[g>>2]](b,a,d)|0)!=0}Pa(i);if(e){break h}break a}Pa(i)}a=Eb();H[c>>2]=a;if(!a){break b}Ec(H[b+96>>2],a);l=1}return l|0}Ua(H[b+96>>2]);H[b+96>>2]=0;return 0}function zc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=H[6516];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=sa()<<16>>>0){break b}if(ga(a|0)|0){break b}}H[6597]=48;b=-1;break a}H[6516]=a}d=b;if((d|0)!=-1){a=d+c|0;H[a-4>>2]=16;f=a-16|0;H[f>>2]=16;b=H[6856];if(b){e=H[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=H[d-4>>2]&-2;g=d-e|0;h=H[g-4>>2];H[b+8>>2]=a;b=h&-2;a=g-b|0;if(H[(a+H[a>>2]|0)-4>>2]&1){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;H[a>>2]=b;break c}a=d-16|0;break d}H[d>>2]=16;H[d+8>>2]=a;H[d+4>>2]=b;H[d+12>>2]=16;H[6856]=d;a=d+16|0}b=f-a|0;H[a>>2]=b}H[((b&-4)+a|0)-4>>2]=b|1;c=H[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=Q(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[a+4>>2]=c+26400;c=c+26408|0;H[a+8>>2]=H[c>>2];H[c>>2]=a;H[H[a+8>>2]+4>>2]=a;c=H[6859];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}H[6858]=e|H[6858];H[6859]=b|c}return(d|0)!=-1}function Ec(a,b){var c=0,d=0,e=0,f=0,g=0;H[b>>2]=H[a>>2];H[b+4>>2]=H[a+4>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=H[a+12>>2];c=H[b+24>>2];if(c){d=H[b+16>>2];if(d){c=0;while(1){f=H[(H[b+24>>2]+N(c,52)|0)+44>>2];if(f){Ca(f);d=H[b+16>>2]}c=c+1|0;if(d>>>0>c>>>0){continue}break}c=H[b+24>>2]}Ca(c);H[b+24>>2]=0}c=H[a+16>>2];H[b+16>>2]=c;c=Fa(N(c,52));H[b+24>>2]=c;if(c){if(H[b+16>>2]){f=0;while(1){g=N(f,52);d=g+c|0;c=H[a+24>>2]+g|0;H[d+48>>2]=H[c+48>>2];e=H[c+44>>2];H[d+40>>2]=H[c+40>>2];H[d+44>>2]=e;e=H[c+36>>2];H[d+32>>2]=H[c+32>>2];H[d+36>>2]=e;e=H[c+28>>2];H[d+24>>2]=H[c+24>>2];H[d+28>>2]=e;e=H[c+20>>2];H[d+16>>2]=H[c+16>>2];H[d+20>>2]=e;e=H[c+12>>2];H[d+8>>2]=H[c+8>>2];H[d+12>>2]=e;e=H[c+4>>2];H[d>>2]=H[c>>2];H[d+4>>2]=e;c=H[b+24>>2];H[(g+c|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}}H[b+20>>2]=H[a+20>>2];c=H[a+32>>2];H[b+32>>2]=c;a:{if(c){c=Fa(c);H[b+28>>2]=c;if(!c){H[b+28>>2]=0;H[b+32>>2]=0;return}b=H[a+32>>2];if(!b){break a}B(c,H[a+28>>2],b);return}H[b+28>>2]=0}return}H[b+16>>2]=0;H[b+24>>2]=0}function mb(a,b,c,d,e,f){var g=0,h=O(0),i=0,j=O(0);g=(c<<6)+b|0;b=c?g+-64|0:a;i=d>>>0>>0?d:e;if(i>>>0>c>>>0){h=L[b>>2];while(1){a=b;b=g;g=b-32|0;j=h;h=L[b>>2];L[g>>2]=O(O(j+h)*f)+L[g>>2];g=b-28|0;L[g>>2]=O(O(L[a+4>>2]+L[b+4>>2])*f)+L[g>>2];g=b-24|0;L[g>>2]=O(O(L[a+8>>2]+L[b+8>>2])*f)+L[g>>2];g=b-20|0;L[g>>2]=O(O(L[a+12>>2]+L[b+12>>2])*f)+L[g>>2];g=b-16|0;L[g>>2]=O(O(L[a+16>>2]+L[b+16>>2])*f)+L[g>>2];g=b-12|0;L[g>>2]=O(O(L[a+20>>2]+L[b+20>>2])*f)+L[g>>2];g=b-8|0;L[g>>2]=O(O(L[a+24>>2]+L[b+24>>2])*f)+L[g>>2];g=b-4|0;L[g>>2]=O(O(L[a+28>>2]+L[b+28>>2])*f)+L[g>>2];g=b- -64|0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0>e>>>0){a=g-32|0;f=O(f+f);L[a>>2]=O(L[b>>2]*f)+L[a>>2];a=g-28|0;L[a>>2]=O(L[b+4>>2]*f)+L[a>>2];a=g-24|0;L[a>>2]=O(L[b+8>>2]*f)+L[a>>2];a=g-20|0;L[a>>2]=O(L[b+12>>2]*f)+L[a>>2];a=g-16|0;L[a>>2]=O(L[b+16>>2]*f)+L[a>>2];a=g-12|0;L[a>>2]=O(L[b+20>>2]*f)+L[a>>2];a=g-8|0;L[a>>2]=O(L[b+24>>2]*f)+L[a>>2];a=g-4|0;L[a>>2]=O(L[b+28>>2]*f)+L[a>>2]}}function $c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if(K[a+44>>2]>=8){e=H[a+36>>2];n=e<<5;o=N(e,28);p=N(e,24);q=N(e,20);r=e<<4;i=N(e,12);j=e<<3;g=H[a+40>>2];k=8;while(1){zb(a,g,H[a+36>>2],8);Ta(a);h=H[a+32>>2];if(h){f=H[a>>2];b=0;a:{if((h|0)!=1){s=h&1;t=h&-2;l=0;while(1){c=(b<<2)+g|0;d=f+(b<<5)|0;L[c>>2]=L[d>>2];m=e<<2;L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];d=b|1;c=(d<<2)+g|0;d=f+(d<<5)|0;L[c>>2]=L[d>>2];L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];b=b+2|0;l=l+2|0;if((t|0)!=(l|0)){continue}break}if(!s){break a}}c=(b<<2)+g|0;b=f+(b<<5)|0;L[c>>2]=L[b>>2];L[c+(e<<2)>>2]=L[b+4>>2];L[c+j>>2]=L[b+8>>2];L[c+i>>2]=L[b+12>>2]}d=H[a>>2];b=0;while(1){f=(b<<2)+g|0;c=d+(b<<5)|0;L[f+r>>2]=L[c+16>>2];L[f+q>>2]=L[c+20>>2];L[f+p>>2]=L[c+24>>2];L[f+o>>2]=L[c+28>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}}g=g+n|0;k=k+8|0;if(k>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-16|0;na=f;a:{if(H[a+120>>2]|c>>>0<3){break a}Da(b,f+12|0,2);k=J[f+12>>1];if(k-1025>>>0<=4294966271){H[f>>2]=k;Ba(d,1,3526,f);break a}Da(b+2|0,f+12|0,1);i=J[f+12>>1];if(!i){Ba(d,1,3174,0);break a}if(i+3>>>0>c>>>0){break a}h=Fa(N(i,k)<<2);if(!h){break a}j=Fa(i);if(!j){Ca(h);break a}l=Fa(i);if(!l){Ca(h);Ca(j);break a}g=Fa(20);if(!g){Ca(h);Ca(j);Ca(l);break a}d=b+3|0;H[g+8>>2]=j;H[g+4>>2]=l;G[g+16>>1]=k;H[g>>2]=h;m=H[f+12>>2];H[g+12>>2]=0;F[g+18|0]=m;H[a+120>>2]=g;while(1){Da(d,f+12|0,1);F[e+j|0]=(I[f+12|0]&127)+1;F[e+l|0]=(H[f+12>>2]&128)>>>7;d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}g=0;while(1){e=0;a=0;while(1){e=I[e+j|0]+7>>>3|0;e=e>>>0>=4?4:e;if((e+(d-b|0)|0)>(c|0)){e=0;break a}Da(d,f+12|0,e);H[h>>2]=H[f+12>>2];h=h+4|0;d=d+e|0;a=a+1|0;e=a&65535;if(i>>>0>e>>>0){continue}break}e=1;g=g+1|0;if((g&65535)>>>0>>0){continue}break}}na=f+16|0;return e|0}function od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=-1;e=-1;if(!(I[a+68|0]&8)){f=H[a+32>>2];H[a+36>>2]=f;a:{b:{c:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break c}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+36>>2]=f;if(!!b&(c|0)>=0|(c|0)>0){break b}f=0;e=0;break a}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|8;qa=-1;return-1}f=0;e=0;while(1){g=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((g&h)==-1){Ba(d,4,15589,0);H[a+68>>2]=H[a+68>>2]|8;b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;a=!(e|f);b=a?-1:f;qa=a?-1:e;return b|0}e=e+i|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;h=b;b=b-g|0;c=c-(i+(g>>>0>h>>>0)|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b}qa=e;return f|0}function xc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a;a:{if(b&3){while(1){c=I[b|0];if(!c|(c|0)==61){break a}b=b+1|0;if(b&3){continue}break}}b:{c:{d=H[b>>2];if(((d|16843008-d)&-2139062144)!=-2139062144){break c}while(1){c=d^1027423549;if(((16843008-c|c)&-2139062144)!=-2139062144){break c}d=H[b+4>>2];c=b+4|0;b=c;if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}break b}c=b}while(1){b=c;d=I[b|0];if(!d){break a}c=b+1|0;if((d|0)!=61){continue}break}}if((a|0)==(b|0)){return 0}g=b-a|0;d:{if(I[g+a|0]){break d}f=H[6860];if(!f){break d}b=H[f>>2];if(!b){break d}while(1){e:{d=a;c=b;h=g;e=0;f:{if(!g){break f}e=I[d|0];if(e){g:{while(1){i=I[c|0];if((i|0)!=(e|0)|!i){break g}h=h-1|0;if(!h){break g}c=c+1|0;e=I[d+1|0];d=d+1|0;if(e){continue}break}e=0}}else{e=0}e=e-I[c|0]|0}if(!e){b=b+g|0;if(I[b|0]==61){break e}}b=H[f+4>>2];f=f+4|0;if(b){continue}break d}break}j=b+1|0}return j}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,3983,0);a=0;break a}if(F[a+212|0]&1){Ba(d,1,12668,0);a=0;break a}a=H[a+180>>2]+N(H[a+228>>2],5644)|0;F[a+5640|0]=I[a+5640|0]|2;Da(b,g+12|0,1);e=H[a+5164>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+5164>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[a+5160>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4009,0);a=0;break a}H[a+5164>>2]=f;h=H[a+5160>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+5160>>2]=e;e=H[a+5164>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7063,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+5164>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function Cb(a,b,c){var d=0,e=0,f=0,g=0;e=a+4|0;d=(e+b|0)-1&0-b;b=H[a>>2];if(d+c>>>0<=(b+a|0)-4>>>0){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(H[a-4>>2]&-2)|0;e=d+H[f>>2]|0;H[f>>2]=e;H[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;b=b-d|0;H[a>>2]=b}a:{if(c+24>>>0<=b>>>0){e=a+c|0;b=(b-c|0)-8|0;H[e+8>>2]=b;g=e+8|0;H[(g+(b&-4)|0)-4>>2]=b|1;d=H[e+8>>2]-8|0;b:{if(d>>>0<=127){b=(d>>>3|0)-1|0;break b}f=Q(d);b=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}b=((d>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}d=b<<4;H[e+12>>2]=d+26400;d=d+26408|0;H[e+16>>2]=H[d>>2];H[d>>2]=g;H[H[e+16>>2]+4>>2]=g;d=H[6858];f=H[6859];e=b&31;if((b&63)>>>0>=32){b=1<>>32-e}H[6858]=g|d;H[6859]=b|f;b=c+8|0;H[a>>2]=b;c=(b&-4)+a|0;break a}c=a+b|0}H[c-4>>2]=b;a=a+4|0}else{a=0}return a}function he(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-16|0;na=g;i=H[H[a+96>>2]+16>>2];h=i>>>0<257?1:2;e=(h<<1)+5|0;f=(c>>>0)/(e>>>0)|0;a:{if(!((N(e,f)|0)==(c|0)&c>>>0>=e>>>0)){Ba(d,1,4643,0);a=0;break a}if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a=0;c=I[e+5640|0];a=c&4?H[e+420>>2]+1|0:a;f=f+a|0;if(f>>>0>=32){H[g>>2]=f;Ba(d,1,7781,g);a=0;break a}F[e+5640|0]=c|4;if(a>>>0>>0){c=(e+N(a,148)|0)+424|0;while(1){Da(b,c,1);b=b+1|0;Da(b,c+4|0,h);b=b+h|0;Da(b,c+8|0,2);d=H[c+8>>2];j=H[e+8>>2];H[c+8>>2]=d>>>0>>0?d:j;Da(b+2|0,c+12|0,1);b=b+3|0;Da(b,c+16|0,h);b=b+h|0;Da(b,g+12|0,1);H[c+36>>2]=H[g+12>>2];d=H[c+16>>2];H[c+16>>2]=d>>>0>>0?d:i;c=c+148|0;b=b+1|0;a=a+1|0;if((f|0)!=(a|0)){continue}break}}H[e+420>>2]=f-1;a=1}na=g+16|0;return a|0}function jb(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}b=H[a+5164>>2];if(b){c=H[a+5160>>2];if(c){b=0;while(1){d=H[H[a+5164>>2]+(b<<3)>>2];if(d){Ca(d);c=H[a+5160>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+5164>>2]}H[a+5160>>2]=0;Ca(b);H[a+5164>>2]=0}b=H[a+5172>>2];if(b){Ca(b);H[a+5172>>2]=0}b=H[a+5584>>2];if(b){Ca(b);H[a+5584>>2]=0}b=H[a+5612>>2];if(b){Ca(b);H[a+5612>>2]=0}b=H[a+5608>>2];if(b){Ca(b);H[a+5608>>2]=0}b=H[a+5628>>2];if(b){Ca(b);H[a+5636>>2]=0;H[a+5628>>2]=0;H[a+5632>>2]=0}b=H[a+5616>>2];if(b){e=H[a+5620>>2];if(e){c=0;while(1){d=H[b+12>>2];if(d){Ca(d);H[b+12>>2]=0;e=H[a+5620>>2]}b=b+20|0;c=c+1|0;if(e>>>0>c>>>0){continue}break}b=H[a+5616>>2]}Ca(b);H[a+5616>>2]=0}b=H[a+5604>>2];if(b){Ca(b);H[a+5604>>2]=0}b=H[a+5596>>2];if(!b){break a}Ca(b);H[a+5596>>2]=0;H[a+5600>>2]=0}}function zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-32|0;na=e;a:{if(H[a+72>>2]){Ba(d,2,7015,0);c=1;break a}if((c|0)!=14){c=0;Ba(d,1,14445,0);break a}Da(b,a+16|0,4);Da(b+4|0,a+12|0,4);Da(b+8|0,a+20|0,2);f=H[a+12>>2];b:{g=H[a+16>>2];c=H[a+20>>2];c:{if(!g){break c}c=H[a+20>>2];if(!f){break c}if(c){break b}c=0}H[e+8>>2]=c;H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14289,e);c=0;break a}if(c>>>0>=16385){c=0;Ba(d,1,14203,0);break a}c=Ea(c,12);H[a+72>>2]=c;if(!c){c=0;Ba(d,1,14240,0);break a}c=1;Da(b+10|0,a+24|0,1);Da(b+11|0,a+28|0,1);f=H[a+28>>2];if((f|0)!=7){H[e+16>>2]=f;Ba(d,4,16272,e+16|0)}Da(b+12|0,a+32|0,1);Da(b+13|0,a+36|0,1);b=H[a>>2];F[b+212|0]=I[b+212|0]&251|(H[a+24>>2]==255?4:0);b=H[a>>2];H[b+240>>2]=H[a+12>>2];H[b+244>>2]=H[a+16>>2];F[a+133|0]=1}na=e+32|0;return c|0}function qc(a,b,c,d){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:ra[d|0](a,c);default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function ce(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,4311,0);a=0;break a}F[a+212|0]=I[a+212|0]|1;Da(b,g+12|0,1);e=H[a+140>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+140>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[a+136>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4337,0);a=0;break a}H[a+140>>2]=f;h=H[a+136>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+136>>2]=e;e=H[a+140>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7085,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+140>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function cd(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a<<3;i=c+28640|0;d=M[c+28672>>3];if(d!=0){e=M[i>>3];g=S(e,b);b=g-e;if(b<0x10000000000000000&b>=0){f=~~b>>>0;if(P(b)>=1){c=~~(b>0?R(T(b*2.3283064365386963e-10),4294967295):U((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}}else{c=0}if(d<0x10000000000000000&d>=0){j=~~d>>>0;if(P(d)>=1){h=~~(d>0?R(T(d*2.3283064365386963e-10),4294967295):U((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0}else{h=0}}else{h=0}c=ve(f,c,j,h);f=qa;c=c+1|0;f=c?f:f+1|0;e=(+(c>>>0)+ +(f>>>0)*4294967296)*d+e;g=e-g}M[i>>3]=e;fa(a|0,+g)|0;c=(a|0)==2?27:(a|0)==1?26:14;a=c-1|0;a:{if(H[6892]>>>a&1){H[6894]=H[6894]|1<>2];if(a){ra[a|0](c)}}}function jd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=na-32|0;na=d;e=H[a+28>>2];H[d+16>>2]=e;f=H[a+20>>2];H[d+28>>2]=c;H[d+24>>2]=b;b=f-e|0;H[d+20>>2]=b;f=b+c|0;i=2;b=d+16|0;a:{while(1){b:{c:{d:{if(!yc(Z(H[a+60>>2],b|0,i|0,d+12|0)|0)){g=H[d+12>>2];if((g|0)==(f|0)){break d}if((g|0)>=0){break c}break b}if((f|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}h=H[b+4>>2];j=h>>>0>>0;e=(j?8:0)+b|0;h=g-(j?h:0)|0;H[e>>2]=h+H[e>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;f=f-g|0;i=i-j|0;b=e;continue}break}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[b+4>>2]|0}na=d+32|0;return a|0}function Ca(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=H[b>>2];c=f;d=b;e=H[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=H[d+4>>2];e=H[d+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=a+f|0}a=b+f|0;b=H[a>>2];if((b|0)!=H[(a+b|0)-4>>2]){f=H[a+4>>2];a=H[a+8>>2];H[f+8>>2]=a;H[a+4>>2]=f;c=b+c|0}H[d>>2]=c;H[((c&-4)+d|0)-4>>2]=c|1;b=H[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=Q(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;H[d+4>>2]=b+26400;b=b+26408|0;H[d+8>>2]=H[b>>2];H[b>>2]=d;H[H[d+8>>2]+4>>2]=d;b=H[6858];c=H[6859];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}H[6858]=e|b;H[6859]=a|c}}function td(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{if(H[a+116>>2]){break a}if(c>>>0<=1){Ba(d,1,8882,0);break a}Da(b,e+12|0,2);f=H[e+12>>2];h=f&65535;if(!h){Ba(d,1,8915,0);break a}if(N(h,6)+2>>>0>c>>>0){Ba(d,1,8882,0);break a}d=Fa(N(f,6));if(!d){break a}c=Fa(8);H[a+116>>2]=c;if(!c){Ca(d);break a}H[c>>2]=d;f=c;c=J[e+12>>1];G[f+4>>1]=c;if(!c){g=1;break a}c=0;while(1){g=e+12|0;Da(b+2|0,g,2);f=d+N(c,6)|0;G[f>>1]=H[e+12>>2];Da(b+4|0,g,2);G[f+2>>1]=H[e+12>>2];b=b+6|0;Da(b,g,2);G[f+4>>1]=H[e+12>>2];g=1;c=c+1|0;if(c>>>0>2]+4>>1]){continue}break}}na=e+16|0;return g|0}function Lb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-32|0;na=g;f=H[a+96>>2];a:{if(!f){Ba(d,1,13752,0);e=0;break a}f=Ea(4,H[f+16>>2]);e=0;if(!f){break a}if(b){j=H[a+96>>2];while(1){b:{e=H[(h<<2)+c>>2];c:{if(e>>>0>=K[j+16>>2]){H[g+16>>2]=e;Ba(d,1,2443,g+16|0);break c}i=f+(e<<2)|0;if(!H[i>>2]){break b}H[g>>2]=e;Ba(d,1,3487,g)}Ca(f);e=0;break a}H[i>>2]=1;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(f);Ca(H[a+64>>2]);d:{if(b){d=b<<2;e=Fa(d);H[a+64>>2]=e;if(!e){H[a+60>>2]=0;e=0;break a}if(!d){break d}B(e,c,d);break d}H[a+64>>2]=0}H[a+60>>2]=b;e=1}na=g+32|0;return e|0}function Fc(a){a=a|0;var b=0,c=0;if(a){wb(H[a>>2]);H[a>>2]=0;b=H[a+72>>2];if(b){Ca(b);H[a+72>>2]=0}b=H[a+68>>2];if(b){Ca(b);H[a+68>>2]=0}b=H[a+108>>2];if(b){Ca(b);H[a+108>>2]=0}b=H[a+116>>2];if(b){c=H[b>>2];if(c){Ca(c);b=H[a+116>>2];H[b>>2]=0}Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){c=H[b+12>>2];if(c){Ca(c);b=H[a+120>>2];H[b+12>>2]=0}c=H[b+4>>2];if(c){Ca(c);b=H[a+120>>2];H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);b=H[a+120>>2];H[b+8>>2]=0}c=H[b>>2];if(c){Ca(c);b=H[a+120>>2];H[b>>2]=0}Ca(b);H[a+120>>2]=0}b=H[a+4>>2];if(b){pb(b);H[a+4>>2]=0}b=H[a+8>>2];if(b){pb(b);H[a+8>>2]=0}Ca(a)}}function Jb(){var a=0,b=0,c=0;a:{a=Ea(1,256);if(a){H[a>>2]=1;H[a+208>>2]=1;F[a+212|0]=I[a+212|0]|6;b=Ea(1,5644);H[a+12>>2]=b;if(!b){break a}b=Ea(1,1e3);H[a+16>>2]=b;if(!b){break a}H[a+48>>2]=0;H[a+52>>2]=0;H[a+44>>2]=-1;H[a+20>>2]=1e3;b:{c=Ea(1,48);if(c){H[c+24>>2]=0;H[c+32>>2]=100;b=Ea(100,24);H[c+28>>2]=b;if(b){break b}Ca(c)}H[a+224>>2]=0;break a}H[c+40>>2]=0;H[a+224>>2]=c;b=qb();H[a+220>>2]=b;if(!b){break a}b=qb();H[a+216>>2]=b;if(!b){break a}c:{if(!xc(1419)){break c}}b=jc();H[a+236>>2]=b;if(!b){b=jc();H[a+236>>2]=b;if(!b){break a}}}else{a=0}return a}wb(a);return 0}function tb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;g=na-240|0;na=g;H[g+236>>2]=c;H[g+232>>2]=b;H[g>>2]=a;l=!e;a:{b:{c:{d:{if((b|0)!=1){h=a;i=1;break d}h=a;i=1;if(c){break d}e=a;break c}while(1){j=(d<<2)+f|0;e=h-H[j>>2]|0;if((Ic(e,a)|0)<=0){e=h;break c}k=l^-1;l=1;e:{if(!((k|(d|0)<2)&1)){j=H[j-8>>2];k=h-8|0;if((Ic(k,e)|0)>=0){break e}if((Ic(k-j|0,e)|0)>=0){break e}}H[(i<<2)+g>>2]=e;b=wc(b,c);ub(g+232|0,b);i=i+1|0;d=b+d|0;h=e;c=H[g+236>>2];b=H[g+232>>2];if(c|(b|0)!=1){continue}break b}break}e=h;break b}if(!l){break a}}vc(g,i);Bb(e,d,f)}na=g+240|0}function me(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;if(H[a+8>>2]==16){g=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{g=H[a+12>>2]}h=H[a+96>>2];f=K[h+16>>2]<257?1:2;a:{if(f>>>0>=c>>>0){c=0;Ba(d,1,4669,0);break a}H[e+12>>2]=(f^-1)+c;Da(b,e+8|0,f);i=H[e+8>>2];if(i>>>0>=K[h+16>>2]){c=0;Ba(d,1,14067,0);break a}c=1;b=b+f|0;Da(b,H[g+5584>>2]+N(i,1080)|0,1);if(!Lc(a,H[e+8>>2],b+1|0,e+12|0,d)){c=0;Ba(d,1,4669,0);break a}if(!H[e+12>>2]){break a}c=0;Ba(d,1,4669,0)}na=e+16|0;return c|0}function Gc(a,b){var c=0,d=0,e=0,f=0,g=0;f=na-32|0;na=f;c=H[a+60>>2];a:{b:{if(c){g=1;while(1){e=H[H[a+64>>2]+(d<<2)>>2];if(!H[(H[H[a+100>>2]+24>>2]+N(e,52)|0)+44>>2]){H[f+16>>2]=e;Ba(b,2,7604,f+16|0);g=0;c=H[a+60>>2]}d=d+1|0;if(c>>>0>d>>>0){continue}break}break b}g=1;c=H[a+100>>2];e=1;if(!H[c+16>>2]){break a}while(1){if(!H[(H[c+24>>2]+N(d,52)|0)+44>>2]){H[f>>2]=d;Ba(b,2,7604,f);g=0;c=H[a+100>>2]}d=d+1|0;if(d>>>0>2]){continue}break}}e=1;if(g){break a}Ba(b,1,2897,0);e=0}na=f+32|0;return e}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=na-16|0;na=f;e=H[a+120>>2];a:{if(!e){Ba(d,1,8836,0);c=0;break a}if(H[e+12>>2]){Ba(d,1,11598,0);c=0;break a}e=I[e+18|0];g=e<<2;if(g>>>0>c>>>0){Ba(d,1,8803,0);c=0;break a}g=Fa(g);c=0;if(!g){break a}if(e){d=0;while(1){c=f+12|0;Da(b,c,2);h=g+(d<<2)|0;G[h>>1]=H[f+12>>2];Da(b+2|0,c,1);F[h+2|0]=H[f+12>>2];Da(b+3|0,c,1);F[h+3|0]=H[f+12>>2];b=b+4|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}}H[H[a+120>>2]+12>>2]=g;c=1}na=f+16|0;return c|0}function Zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];a:{if((g+2|0)!=(c|0)){Ba(d,1,4617,0);break a}Da(b,e+12|0,2);if(H[e+12>>2]!=(g|0)){Ba(d,1,4617,0);break a}if(!g){f=1;break a}c=b+2|0;a=H[H[a+96>>2]+24>>2];b=0;while(1){Da(c,e+8|0,1);f=H[e+8>>2];h=f&127;i=h+1|0;H[a+24>>2]=i;H[a+32>>2]=f>>>7&1;if(h>>>0>=31){H[e+4>>2]=i;H[e>>2]=b;Ba(d,1,15402,e);f=0;break a}a=a+52|0;f=1;c=c+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}na=e+16|0;return f|0}function tc(a,b,c,d,e){var f=0,g=0;f=na-208|0;na=f;H[f+204>>2]=c;c=f+160|0;y(c,0,40);H[f+200>>2]=H[f+204>>2];if((sc(0,b,f+200|0,f+80|0,c,d,e)|0)>=0){c=H[a>>2];H[a>>2]=c&-33;a:{b:{c:{if(!H[a+48>>2]){H[a+48>>2]=80;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;g=H[a+44>>2];H[a+44>>2]=f;break c}if(H[a+16>>2]){break b}}if(Db(a)){break a}}sc(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(g){ra[H[a+36>>2]](a,0,0)|0;H[a+48>>2]=0;H[a+44>>2]=g;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0}H[a>>2]=H[a>>2]|c&32}na=f+208|0}function je(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{b:{h=e+8|0;c:{if(K[H[a+96>>2]+16>>2]<=256){if(c){f=-1;g=1;break c}Ba(d,1,4695,0);a=0;break a}if(c>>>0<=1){break b}f=-2;g=2}Da(b,h,g);H[e+12>>2]=c+f;c=H[e+8>>2];f=H[H[a+96>>2]+16>>2];if(c>>>0>=f>>>0){H[e+4>>2]=f;H[e>>2]=c;Ba(d,1,7712,e);a=0;break a}if(!Kc(a,c,b+g|0,e+12|0,d)){Ba(d,1,4695,0);a=0;break a}a=1;if(!H[e+12>>2]){break a}Ba(d,1,4695,0);a=0;break a}Ba(d,1,4695,0);a=0}na=e+16|0;return a|0}function Ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=H[a+32>>2];H[a+36>>2]=f;a:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break a}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+48>>2]=0;H[a+36>>2]=f;if(!(ra[H[a+28>>2]](b,c,H[a>>2])|0)){H[a+68>>2]=H[a+68>>2]|8;return 0}H[a+56>>2]=b;H[a+60>>2]=c;return 1}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+68>>2]=H[a+68>>2]|8;return 0}function Ba(a,b,c,d){var e=0,f=0;e=na-528|0;na=e;a:{if(!a){break a}b:{c:{switch(b-1|0){case 0:b=a+12|0;break b;case 1:b=a+16|0;a=a+4|0;break b;case 3:break c;default:break a}}b=a+20|0;a=a+8|0}b=H[b>>2];if(!b|!c){break a}f=H[a>>2];y(e,0,512);H[e+524>>2]=d;a=na-160|0;na=a;H[a+148>>2]=e;H[a+152>>2]=511;y(a,0,144);H[a+76>>2]=-1;H[a+36>>2]=105;H[a+80>>2]=-1;H[a+44>>2]=a+159;H[a+84>>2]=a+148;F[e|0]=0;tc(a,c,d,103,104);na=a+160|0;F[e+511|0]=0;ra[b|0](e,f)}na=e+528|0}function fc(a){var b=0,c=0,d=0;a:{if(!a){break a}b=H[a+8>>2];if(!b){break a}c=b&3;a=H[a+12>>2];if(b>>>0>=4){d=b&-4;b=0;while(1){H[a+60>>2]=0;H[a+52>>2]=999;H[a+56>>2]=0;H[a+44>>2]=0;H[a+36>>2]=999;H[a+40>>2]=0;H[a+28>>2]=0;H[a+20>>2]=999;H[a+24>>2]=0;H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a- -64|0;b=b+4|0;if((d|0)!=(b|0)){continue}break}if(!c){break a}}b=0;while(1){H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a+16|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}}}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(H[a+100>>2]!=1){Ba(d,1,11401,0);return 0}a:{if(c>>>0<=7){break a}Da(b,a+56|0,4);Da(b+4|0,a+60|0,4);if(c&3){break a}c=c-8|0;e=c>>>2|0;H[a+64>>2]=e;b:{if(!c){break b}c=Ea(e,4);H[a+68>>2]=c;if(!c){Ba(d,1,2235,0);return 0}if(!H[a+64>>2]){break b}d=b+8|0;c=0;while(1){Da(d,H[a+68>>2]+(c<<2)|0,4);d=d+4|0;c=c+1|0;if(c>>>0>2]){continue}break}}H[a+100>>2]=H[a+100>>2]|2;return 1}Ba(d,1,5955,0);return 0}function ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;H[e+12>>2]=c;a:{if(!(!Kc(a,0,b,e+12|0,d)|H[e+12>>2])){if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}f=1;if(K[H[a+96>>2]+16>>2]<2){break a}c=H[b+5584>>2];g=c+28|0;b=1;d=c;while(1){H[d+1104>>2]=H[c+24>>2];H[d+1884>>2]=H[c+804>>2];B(d+1108|0,g,776);d=d+1080|0;b=b+1|0;if(b>>>0>2]+16>>2]){continue}break}break a}Ba(d,1,4591,0)}na=e+16|0;return f|0}function dc(a,b,c,d){var e=0,f=0,g=0;f=na-128|0;na=f;e=f;b=H[b+12>>2]+(c<<4)|0;c=H[b>>2];if(c){while(1){H[e>>2]=b;e=e+4|0;b=c;c=H[c>>2];if(c){continue}break}}while(1){c=H[b+8>>2];if((g|0)>(c|0)){H[b+8>>2]=g;c=g}a:{if((c|0)>=(d|0)){break a}while(1){if(H[b+4>>2]<=(c|0)){break a}b:{if(Ra(a,1)){H[b+4>>2]=c;break b}c=c+1|0}if((c|0)<(d|0)){continue}break}}H[b+8>>2]=c;if((e|0)!=(f|0)){e=e-4|0;b=H[e>>2];g=c;continue}break}na=f+128|0;return H[b+4>>2]<(d|0)}function Ld(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{if(!Wa(H[a+8>>2],54,c)){break a}h=H[a+8>>2];d=H[h>>2];f=H[h+8>>2];b:{if(d){e=1;c:{if((d|0)!=1){j=d&1;d=d&-2;while(1){g=0;d:{if(!e){break d}g=0;if(!(ra[H[f>>2]](a,b,c)|0)){break d}g=(ra[H[f+4>>2]](a,b,c)|0)!=0}e=g;f=f+8|0;i=i+2|0;if((d|0)!=(i|0)){continue}break}if(!j){break c}}if(!e){e=0;break c}e=(ra[H[f>>2]](a,b,c)|0)!=0}Pa(h);if(!e){break a}break b}Pa(h)}k=1}return k|0}function le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];f=g>>>0<257?1:2;a:{if((f+2|0)!=(c|0)){a=0;Ba(d,1,4285,0);break a}if(H[a+8>>2]==16){c=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{c=H[a+12>>2]}Da(b,e+12|0,f);a=1;b=b+f|0;Da(b,e+8|0,1);f=H[e+12>>2];if(f>>>0>=g>>>0){H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14923,e);a=0;break a}Da(b+1|0,(H[c+5584>>2]+N(f,1080)|0)+808|0,1)}na=e+16|0;return a|0}function qe(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+26400|0;H[b+26404>>2]=c;H[b+26408>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}zc(48);a=na-16|0;na=a;a:{if(la(a+12|0,a+8|0)|0){break a}b=vb((H[a+12>>2]<<2)+4|0);H[6860]=b;if(!b){break a}b=vb(H[a+8>>2]);if(b){c=H[6860];H[c+(H[a+12>>2]<<2)>>2]=0;if(!(ka(c|0,b|0)|0)){break a}}H[6860]=0}na=a+16|0;H[6875]=8192;H[6873]=94240;H[6867]=42;H[6874]=65536}function ye(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0}else{d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0}else{c=b>>>d|0;a=((1<>>d}a=a|g;qa=c|f;return a} +function eb(a,b,c){var d=0;if(!H[a+12>>2]){ra[b|0](c,H[a+36>>2]);return}d=Fa(8);a:{if(!d){break a}H[d+4>>2]=c;H[d>>2]=b;b=Fa(8);if(!b){Ca(d);return}H[b>>2]=d;c=N(H[a+4>>2],100);H[a+40>>2]=c;while(1){if((c|0)>2]){continue}break}H[b+4>>2]=H[a+20>>2];H[a+20>>2]=b;H[a+24>>2]=H[a+24>>2]+1;b=H[a+28>>2];if(!b){break a}H[H[b>>2]+8>>2]=0;H[a+28>>2]=H[b+4>>2];H[a+32>>2]=H[a+32>>2]-1;Ca(b)}}function Mc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;H[a+184>>2]=b;d=H[a+96>>2];a:{if(!d){break a}f=H[d+24>>2];if(!f){break a}e=H[a+12>>2];if(!e|!H[e+5584>>2]){break a}e=H[d+16>>2];if(!e){return 1}d=0;while(1){if(K[(H[H[a+12>>2]+5584>>2]+N(d,1080)|0)+4>>2]<=b>>>0){Ba(c,1,9177,0);return 0}H[(N(d,52)+f|0)+40>>2]=b;g=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}return g|0}function Ac(a,b,c){var d=0,e=0,f=0;a:{d=H[c+16>>2];if(!d){if(Db(c)){break a}d=H[c+16>>2]}e=H[c+20>>2];if(d-e>>>0>>0){ra[H[c+36>>2]](c,a,b)|0;return}b:{c:{if(!b|H[c+80>>2]<0){break c}d=b;while(1){f=a+d|0;if(I[f-1|0]!=10){d=d-1|0;if(d){continue}break c}break}if(ra[H[c+36>>2]](c,a,d)>>>0>>0){break a}b=b-d|0;e=H[c+20>>2];break b}f=a}ab(e,f,b);H[c+20>>2]=H[c+20>>2]+b}}function Bc(a){var b=0,c=0;b=H[a+76>>2];if(!((b|0)>=0&(!b|H[6867]!=(b&1073741823)))){a:{if(H[a+80>>2]==10){break a}b=H[a+20>>2];if((b|0)==H[a+16>>2]){break a}H[a+20>>2]=b+1;F[b|0]=10;return}Cc(a);return}b=a+76|0;c=H[b>>2];H[b>>2]=c?c:1073741823;b:{c:{if(H[a+80>>2]==10){break c}c=H[a+20>>2];if((c|0)==H[a+16>>2]){break c}H[a+20>>2]=c+1;F[c|0]=10;break b}Cc(a)}H[b>>2]=0}function Ka(a,b,c,d,e,f,g,h){var i=0,j=0;i=+O(e-a|0);j=i*1.402;if(P(j)<2147483647){e=~~j}else{e=-2147483648}e=e+c|0;H[f>>2]=(e|0)>=0?(b|0)>(e|0)?e:b:0;j=+O(d-a|0);i=j*.344+i*.714;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=c-a|0;H[g>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0;i=j*1.772;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=a+c|0;H[h>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0}function yb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(a){c=H[a+4>>2];if(c){Ca(c);H[a+4>>2]=0}if(b){c=a;while(1){d=H[c+200>>2];if(d){e=0;f=H[c+196>>2];if(f){while(1){g=H[d+12>>2];if(g){Ca(g);H[d+12>>2]=0;f=H[c+196>>2]}d=d+16|0;e=e+1|0;if(e>>>0>>0){continue}break}d=H[c+200>>2]}Ca(d);H[c+200>>2]=0}c=c+240|0;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(a)}}function dd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[a+84>>2];f=H[e>>2];d=H[e+4>>2];h=H[a+28>>2];g=H[a+20>>2]-h|0;g=d>>>0>>0?d:g;if(g){ab(f,h,g);f=g+H[e>>2]|0;H[e>>2]=f;d=H[e+4>>2]-g|0;H[e+4>>2]=d}d=c>>>0>d>>>0?d:c;if(d){ab(f,b,d);f=d+H[e>>2]|0;H[e>>2]=f;H[e+4>>2]=H[e+4>>2]-d}F[f|0]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;return c|0}function rd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[c+8>>2];d=e>>>0<=1?1:e;f=H[c+4>>2];g=f-H[c>>2]|0;while(1){h=d;d=d<<1;if(h-g>>>0>>0){continue}break}if((e|0)!=(h|0)){d=Fa(h);if(!d){return-1}e=H[c>>2];if(e){if(g){B(d,e,g)}Ca(H[c>>2])}H[c+8>>2]=h;H[c>>2]=d;f=d+g|0;H[c+4>>2]=f}if(b){B(f,a,b)}H[c+4>>2]=H[c+4>>2]+b;return b|0}function Yb(a){H[a+100>>2]=20832;H[a+96>>2]=20832;H[a+92>>2]=20832;H[a+88>>2]=20832;H[a+84>>2]=20832;H[a+80>>2]=20832;H[a+76>>2]=20832;H[a+72>>2]=20832;H[a+68>>2]=20832;H[a+64>>2]=20832;H[a+60>>2]=20832;H[a+56>>2]=20832;H[a+52>>2]=20832;H[a+48>>2]=20832;H[a+44>>2]=20832;H[a+40>>2]=20832;H[a+36>>2]=20832;H[a+32>>2]=20832;H[a+28>>2]=20832}function Ra(a,b){var c=0,d=0,e=0,f=0;if((b|0)<=0){return 0}c=H[a+12>>2];d=H[a+16>>2];while(1){e=b;a:{if(d){break a}c=c<<8&65280;H[a+12>>2]=c;d=(c|0)==65280?7:8;H[a+16>>2]=d;b=H[a+8>>2];if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;c=I[b|0]|c;H[a+12>>2]=c}d=d-1|0;H[a+16>>2]=d;b=e-1|0;f=(c>>>d&1)<>>0>1){continue}break}return f}function xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=na-16|0;na=f;e=H[a+24>>2];if((e|0)!=255){H[f>>2]=e;Ba(d,2,2678,f)}a:{b:{if(H[a+20>>2]==(c|0)){if(c){break b}e=1;break a}e=0;Ba(d,1,14510,0);break a}c=0;while(1){e=1;Da(b,(H[a+72>>2]+N(c,12)|0)+8|0,1);b=b+1|0;c=c+1|0;if(c>>>0>2]){continue}break}}na=f+16|0;return e|0}function Da(a,b,c){var d=0,e=0;H[b>>2]=0;a:{if(!c){break a}d=c&3;b=b+c|0;if(c>>>0>=4){e=c&-4;c=0;while(1){F[b-1|0]=I[a|0];F[b-2|0]=I[a+1|0];F[b-3|0]=I[a+2|0];b=b-4|0;F[b|0]=I[a+3|0];a=a+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}if(!d){break a}}c=0;while(1){b=b-1|0;F[b|0]=I[a|0];a=a+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;a:{if(!c){Ba(d,1,4106,0);a=0;break a}Da(b,e+12|0,1);f=c-1|0;a=1;if(!f){break a}a=0;c=0;while(1){b=b+1|0;Da(b,e+8|0,1);g=H[e+8>>2];c=g<<24>>31&(g&127|c)<<7;a=a+1|0;if((f|0)!=(a|0)){continue}break}a=1;if(!c){break a}Ba(d,1,4106,0);a=0}na=e+16|0;return a|0}function bc(a,b,c,d){var e=0,f=0,g=O(0),h=0,i=O(0),j=0,k=O(0);if(d){while(1){e=f<<2;h=e+b|0;i=L[h>>2];j=a+e|0;g=L[j>>2];e=c+e|0;k=L[e>>2];L[j>>2]=O(k*O(1.4019999504089355))+g;L[h>>2]=O(g+O(i*O(-.3441300094127655)))+O(k*O(-.714139997959137));L[e>>2]=g+O(i*O(1.7719999551773071));f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function Bb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=na-240|0;na=f;H[f>>2]=a;g=1;a:{if((b|0)<2){break a}d=a;while(1){d=d-8|0;h=b-2|0;e=d-H[(h<<2)+c>>2]|0;if((Ic(a,e)|0)>=0){if((Ic(a,d)|0)>=0){break a}}i=e;e=(Ic(e,d)|0)>=0;d=e?i:d;H[(g<<2)+f>>2]=d;g=g+1|0;b=e?b-1|0:h;if((b|0)>1){continue}break}}vc(f,g);na=f+240|0}function vc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=8;f=na-256|0;na=f;if((b|0)>=2){h=(b<<2)+a|0;H[h>>2]=f;while(1){e=c>>>0>=256?256:c;ab(H[h>>2],H[a>>2],e);d=0;while(1){g=(d<<2)+a|0;d=d+1|0;ab(H[g>>2],H[(d<<2)+a>>2],e);H[g>>2]=H[g>>2]+e;if((b|0)!=(d|0)){continue}break}c=c-e|0;if(c){continue}break}}na=f+256|0}function Wc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/52|0;if(c>>>0>=52){while(1){c=H[b>>2];if(c){Ca(c-1|0);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);H[b+8>>2]=0}b=b+52|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function Xc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/68|0;if(c>>>0>=68){while(1){c=H[b>>2];if(c){Ca(c);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}Ca(H[b+60>>2]);H[b+60>>2]=0;b=b+68|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function ad(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a+32>>2];b=H[a+28>>2];d=b+8|0;if(c>>>0>=d>>>0){while(1){nb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],8);c=H[a+32>>2];b=d;d=b+8|0;if(c>>>0>=d>>>0){continue}break}}if(b>>>0>>0){nb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],c-b|0)}Ca(H[a>>2]);Ca(a)}function Cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a:{if(H[a+100>>2]){Ba(d,1,11302,0);a=0;break a}if((c|0)!=4){Ba(d,1,5991,0);a=0;break a}Da(b,e+12|0,4);if(H[e+12>>2]!=218793738){Ba(d,1,5007,0);a=0;break a}H[a+100>>2]=H[a+100>>2]|1;a=1}na=e+16|0;return a|0}function Wa(a,b,c){var d=0,e=0;a:{d=H[a>>2];e=H[a+4>>2];b:{if((d|0)!=(e|0)){e=H[a+8>>2];break b}d=e+10|0;H[a+4>>2]=d;e=Ha(H[a+8>>2],d<<2);if(!e){break a}H[a+8>>2]=e;d=H[a>>2]}H[(d<<2)+e>>2]=b;H[a>>2]=d+1;return 1}Ca(H[a+8>>2]);H[a>>2]=0;H[a+4>>2]=0;Ba(c,1,6123,0);return 0}function $a(a,b,c){var d=0,e=0,f=0,g=0;if((b|0)==1|b>>>0>1){while(1){d=a;e=b;c=c-1|0;a=ve(a,b,10,0);b=qa;f=c,g=re(a,b,246)+d|48,F[f|0]=g;if(e>>>0>9){continue}break}}if(a|b){while(1){c=c-1|0;b=(a>>>0)/10|0;F[c|0]=N(b,246)+a|48;d=a>>>0>9;a=b;if(d){continue}break}}return c}function Cc(a){var b=0,c=0,d=0;c=na-16|0;na=c;F[c+15|0]=10;b=H[a+16>>2];a:{if(!b){if(Db(a)){break a}b=H[a+16>>2]}d=b;b=H[a+20>>2];if(!((d|0)==(b|0)|H[a+80>>2]==10)){H[a+20>>2]=b+1;F[b|0]=10;break a}if((ra[H[a+36>>2]](a,c+15|0,1)|0)!=1){break a}}na=c+16|0}function rc(a){var b=0,c=0,d=0,e=0,f=0;d=H[a>>2];b=F[d|0]-48|0;if(b>>>0>9){return 0}while(1){e=-1;if(c>>>0<=214748364){c=N(c,10);e=(c^2147483647)>>>0>>0?-1:c+b|0}b=d+1|0;H[a>>2]=b;f=F[d+1|0];c=e;d=b;b=f-48|0;if(b>>>0<10){continue}break}return c} +function pc(a,b){var c=0,d=0,e=0;x(+a);d=s(1)|0;e=s(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=pc(a*0x10000000000000000,b);c=H[b>>2]+-64|0}H[b>>2]=c;return a}H[b>>2]=c-1022;u(0,e|0);u(1,d&-2146435073|1071644672);a=+w()}return a}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=0,g=0;d=na-16|0;na=d;if(c){while(1){Nc(a,d+12|0);e=L[d+12>>2];if(O(P(e))>2]=f;b=b+4|0;a=a+4|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function Ua(a){var b=0,c=0,d=0;if(a){b=H[a+24>>2];if(b){c=H[a+16>>2];if(c){b=0;while(1){d=H[(H[a+24>>2]+N(b,52)|0)+44>>2];if(d){Ca(d);c=H[a+16>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+24>>2]}Ca(b)}b=H[a+28>>2];if(b){Ca(b)}Ca(a)}}function Pd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=na-16|0;na=d;if(c){while(1){Kb(a,d+8|0);e=M[d+8>>3];if(P(e)<2147483647){f=~~e}else{f=-2147483648}H[b>>2]=f;b=b+4|0;a=a+8|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=H[c+4>>2];e=H[c>>2]+H[c+8>>2]|0;if((d|0)==(e|0)){qa=-1;return-1}H[c+4>>2]=a+d;f=a;c=e-d|0;d=c;e=a>>>0>>0;a=c>>31;c=e&(a|0)>=(b|0)|(a|0)>(b|0);d=c?f:d;qa=c?b:a;return d|0}function ue(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=ve(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;qa=(g^qa)-((a>>>0>>0)+g|0)|0;return b}function Va(a){var b=0,c=0,d=0,e=0;if(a){b=H[a+20>>2];c=H[a+16>>2];if(N(b,c)){while(1){e=H[H[a+24>>2]+(d<<2)>>2];if(e){Ca(e);c=H[a+16>>2];b=H[a+20>>2]}d=d+1|0;if(d>>>0>>0){continue}break}}Ca(H[a+24>>2]);Ca(a)}}function cc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(d){while(1){e=f<<2;g=e+a|0;h=c+e|0;i=H[h>>2];j=b+e|0;k=H[j>>2];e=H[g>>2]-(i+k>>2)|0;H[g>>2]=e+i;H[j>>2]=e;H[h>>2]=e+k;f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function bb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];e=ra[H[a+28>>2]](b,c,H[a>>2])|0;d=H[a+68>>2];if(!e){H[a+68>>2]=d|4;return 0}H[a+56>>2]=b;H[a+60>>2]=c;H[a+68>>2]=d&-5;return 1}function Na(a,b,c,d,e){var f=0;f=na-256|0;na=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;Dc(f,b,c?d:256);if(!c){while(1){La(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}La(a,f,d)}na=f+256|0}function re(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=N(e,d);f=c&65535;a=a&65535;g=N(f,a);d=(g>>>16|0)+N(d,f)|0;a=(d&65535)+N(a,e)|0;qa=h+N(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Db(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function hc(a){var b=0,c=0;a:{if(I[a+12|0]==255){H[a+12>>2]=65280;H[a+16>>2]=7;b=H[a+8>>2];c=0;if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;H[a+12>>2]=I[b|0]|65280}H[a+16>>2]=0;c=1}return c}function sd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=H[c+4>>2];d=H[c>>2]+H[c+8>>2]|0;if((e|0)==(d|0)){return-1}d=d-e|0;b=b>>>0>d>>>0?d:b;if(b){B(a,e,b)}H[c+4>>2]=b+H[c+4>>2];return b|0}function Ud(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Nc(a,d+12|0);L[b>>2]=L[d+12>>2];b=b+4|0;a=a+4|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function Td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Kb(a,d+8|0);L[b>>2]=M[d+8>>3];b=b+4|0;a=a+8|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function bd(a,b){a=a|0;b=b|0;b=H[a+28>>2];if(b>>>0>2]){while(1){$b(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function Ic(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a>>2];d=H[b>>2];a=H[a+4>>2];b=H[b+4>>2];return(c>>>0>d>>>0&(a|0)>=(b|0)|(a|0)>(b|0))-(c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0))|0}function kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a=yc(ea(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0);na=e+16|0;qa=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function mc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);L[b>>2]=K[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function lc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);H[b>>2]=H[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function Kb(a,b){F[b+7|0]=I[a|0];F[b+6|0]=I[a+1|0];F[b+5|0]=I[a+2|0];F[b+4|0]=I[a+3|0];F[b+3|0]=I[a+4|0];F[b+2|0]=I[a+5|0];F[b+1|0]=I[a+6|0];F[b|0]=I[a+7|0]}function Qa(a){var b=0,c=0,d=0,e=0;b=H[a+12>>2];e=b;c=H[a+8>>2];if(!(b|c)){qa=0;return 0}d=H[a+56>>2];b=c-d|0;qa=e-(H[a+60>>2]+(c>>>0>>0)|0)|0;return b}function kc(a,b){var c=0;c=na-16|0;na=c;if(a){if(b&3){a=28}else{a=gb(b,a);H[c+12>>2]=a;a=a?0:48}a=a?0:H[c+12>>2]}else{a=0}na=c+16|0;return a}function Yc(a){a=a|0;var b=0;if(a){b=H[a+116>>2];if(b){Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){Ca(b);H[a+120>>2]=0}Ca(H[a+148>>2]);Ca(a)}} +function sb(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=H[a>>2];c=a+4|0;break a}b=b-32|0;c=a}c=H[c>>2];H[a>>2]=d<>2]=c<>>32-b}function ub(a,b){var c=0,d=0;c=H[a+4>>2];a:{if(b>>>0<=31){d=H[a>>2];break a}b=b-32|0;d=c;c=0}H[a+4>>2]=c>>>b;H[a>>2]=c<<32-b|d>>>b}function ae(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(H[H[a+96>>2]+16>>2]<<2!=(c|0)){Ba(d,1,4464,0);a=0}else{a=1}return a|0}function jc(){var a=0,b=0;a=Ea(1,44);a:{if(a){H[a+16>>2]=0;b=Ea(1,8);H[a+36>>2]=b;if(b){break a}Ca(a)}a=0}return a}function Pb(a,b){a=a|0;b=b|0;if(!(!a|!b)){H[a+188>>2]=H[b+4>>2];H[a+184>>2]=H[b>>2];H[a+248>>2]=H[b+8248>>2]&2}}function qb(){var a=0,b=0;a=Ea(1,12);if(a){H[a+4>>2]=10;b=Ea(10,4);H[a+8>>2]=b;if(b){return a}Ca(a)}return 0}function Id(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;D()}function fb(a){var b=0;if(a){b=H[a+4>>2];if(b){ra[b|0](H[a>>2])}Ca(H[a+32>>2]);H[a+32>>2]=0;Ca(a)}}function Ob(a,b){a=a|0;b=b|0;a:{if(!a){break a}H[a+208>>2]=b;if(!b){break a}F[a+92|0]=I[a+92|0]|8}}function pd(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c+8>>2];H[c+4>>2]=H[c>>2]+(a>>>0>b>>>0?b:a);return 1}function ee(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(c){a=1}else{Ba(d,1,4375,0);a=0}return a|0}function oc(a,b){if(!((b&-128)==57216|b>>>0<=127)){H[6597]=25;return-1}F[a|0]=b;return 1}function kb(a){H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+4>>2]=0}function Uc(a,b,c){a=a|0;b=b|0;c=c|0;return!H[a+8>>2]&(H[a+216>>2]!=0&H[a+220>>2]!=0)}function Sa(a){if(H[a+12>>2]){H[a+40>>2]=0;while(1){if(H[a+24>>2]>0){continue}break}}}function Nc(a,b){F[b+3|0]=I[a|0];F[b+2|0]=I[a+1|0];F[b+1|0]=I[a+2|0];F[b|0]=I[a+3|0]}function hb(a){if(a){ra[H[(H[a+76>>2]?20:16)+a>>2]](H[a+48>>2]);H[a+48>>2]=0;Ca(a)}}function Nd(a,b){a=a|0;b=b|0;Pb(H[a>>2],b);F[a+124|0]=0;H[a+128>>2]=H[b+8248>>2]&1}function Ea(a,b){if(!a|!b){a=0}else{b=N(a,b);a=gb(8,b);if(a){Dc(a,0,b)}}return a}function Ga(a,b,c){var d=0;d=na-16|0;na=d;H[d+12>>2]=c;tc(a,b,c,0,0);na=d+16|0}function xe(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function _a(a){var b=0;if(a){b=H[a+12>>2];if(b){Ca(b);H[a+12>>2]=0}Ca(a)}}function Rc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;D()}function Gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Lb(H[a>>2],b,c,d)|0}function Hd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;D()}function wc(a,b){a=uc(a-1|0);if(!a){a=uc(b);a=a?a|32:0}return a}function Qb(a){return H[a+12>>2]==H[a+4>>2]|H[a+8>>2]==H[a>>2]}function Dd(a,b,c){a=a|0;b=b|0;c=c|0;return Mc(H[a>>2],b,c)|0}function uc(a){var b=0,c=0,d=0;return b=te(a),c=0,d=a,d?b:c}function pb(a){var b=0;if(a){b=H[a+8>>2];if(b){Ca(b)}Ca(a)}}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qa=0;return 0}function Za(a,b,c,d,e,f,g,h){return ac(a,b,c,d,e,f,g,h,0)}function Oc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;D()}function nc(a,b,c,d){return ra[H[a+44>>2]](a,b,c,d)|0}function Xa(a,b,c){H[((b<<2)+a|0)+28>>2]=(c<<5)+20832}function Fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 1}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;Ib(H[a>>2],b,c)}function te(a){if(a){return 31-Q(a-1^a)|0}return 32}function rb(a,b,c){return ra[H[a+40>>2]](a,b,0,c)|0}function _d(a,b,c){a=a|0;b=b|0;c=c|0;qa=-1;return-1}function Oa(a,b,c,d,e,f,g,h){ac(a,b,c,d,e,f,g,h,1)}function yc(a){if(!a){return 0}H[6597]=a;return-1}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;mc(a,b,c,2)}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;mc(a,b,c,4)}function Sd(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,c,2)}function Rd(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,c,4)}function we(a,b,c){se(a,0,b,c);qa=pa;return oa}function La(a,b,c){if(!(I[a|0]&32)){Ac(b,c,a)}}function ie(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Jc(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function ve(a,b,c,d){a=se(a,b,c,d);return a}function Fa(a){if(!a){return 0}return vb(a)}function Md(a,b){a=a|0;b=b|0;Ob(H[a>>2],b)}function Dc(a,b,c){if(c){y(a,b<<24>>24,c)}}function ic(a){return H[a+8>>2]-H[a>>2]|0}function hd(a){a=a|0;ia();ha(a+128|0);D()}function vb(a){a=a|0;return gb(8,a)|0}function md(a,b){a=a|0;b=b|0;_(a|0)}function ld(a,b){a=a|0;b=b|0;Y(a|0)}function Ab(a){return H[a+28>>2]!=2}function ab(a,b,c){if(c){B(a,b,c)}}function Vc(a,b){a=a|0;b=b|0;D()}function ob(a){return kc(a,32)}function Ia(a){return kc(a,16)}function id(a){a=a|0;ja();D()}function Eb(){return Ea(1,36)}function Sb(a,b){a=a|0;b=b|0}function db(a){if(a){Ca(a)}}function Qc(a){a=a|0;D()}function Pa(a){H[a>>2]=0} +// EMSCRIPTEN_END_FUNCS +a=I;m(n);var ra=[null,Sb,ie,_d,Jc,Jc,bb,Ed,ud,od,bd,ad,$c,_c,Zc,Yc,Xc,Wc,Nb,Uc,Tc,Sc,Pc,Ic,pe,oe,ne,me,le,ke,je,he,ge,fe,ee,de,ce,be,ae,Fb,$d,Zd,Fb,Fb,Yd,Xd,Wd,Vd,Ud,Td,Sd,Rd,Qd,Pd,Kd,Cd,Bd,Ad,zd,yd,xd,wd,vd,td,sd,rd,qd,pd,Qc,Qc,Ib,Nb,Gb,Ob,Pb,wb,Mb,Vc,Lb,Mc,Oc,Rc,ib,cb,Qc,Qc,Fd,Ld,Od,Vc,Gd,Dd,Oc,Rc,Md,Nd,Fc,Hd,Id,Jd,Sb,md,ld,fd,ed,dd,hd,id,Qc,jd,kd,Qc,gd];function sa(){return E.byteLength>>16}function xa(ya){ya=ya|0;var ta=sa()|0;var ua=ta+ya|0;if(ta{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(heapOrArray.buffer?heapOrArray.subarray(idx,endPtr):new Uint8Array(heapOrArray.slice(idx,endPtr)))};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return"";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jp2_decode,__emscripten_timeout,dynCall_iji,dynCall_jji,dynCall_iiji,dynCall_jiji,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["t"];_free=Module["_free"]=wasmExports["u"];_jp2_decode=Module["_jp2_decode"]=wasmExports["v"];__emscripten_timeout=wasmExports["w"];dynCall_iji=wasmExports["dynCall_iji"];dynCall_jji=wasmExports["dynCall_jji"];dynCall_iiji=wasmExports["dynCall_iiji"];dynCall_jiji=wasmExports["dynCall_jiji"];memory=wasmMemory=wasmExports["r"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={n:__abort_js,m:__emscripten_runtime_keepalive_clear,j:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,k:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,i:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,l:_proc_exit,g:_rgb_to_rgba,a:_storeErrorMessage};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default OpenJPEG; diff --git a/frontend/public/pdfjs-wasm/qcms_bg.wasm b/frontend/public/pdfjs-wasm/qcms_bg.wasm new file mode 100644 index 0000000..ea1d07b Binary files /dev/null and b/frontend/public/pdfjs-wasm/qcms_bg.wasm differ diff --git a/frontend/public/pdfjs-wasm/quickjs-eval.js b/frontend/public/pdfjs-wasm/quickjs-eval.js new file mode 100644 index 0000000..f087fb2 --- /dev/null +++ b/frontend/public/pdfjs-wasm/quickjs-eval.js @@ -0,0 +1,16 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function QuickJS(moduleArg={}){var moduleRtn;var e=moduleArg,aa=import.meta.url,h="",m;try{h=(new URL(".",aa)).href}catch{}m=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);};var q=console.error.bind(console),r,t=!1,u,v,w,x=!1;function y(){var a=z.buffer;A=new Int8Array(a);new Int16Array(a);B=new Uint8Array(a);new Uint16Array(a);C=new Int32Array(a);D=new Uint32Array(a);new Float32Array(a);new Float64Array(a);new BigInt64Array(a);new BigUint64Array(a)} +function E(a){e.onAbort?.(a);a=`Aborted(${a})`;q(a);t=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");w?.(a);throw a;}var F;async function ba(a){if(!r)try{var b=await m(a);return new Uint8Array(b)}catch{}if(a==F&&r)a=new Uint8Array(r);else throw"both async and sync fetching of the wasm failed";return a}async function ca(a,b){try{var c=await ba(a);return await WebAssembly.instantiate(c,b)}catch(d){q(`failed to asynchronously prepare wasm: ${d}`),E(d)}} +async function da(a){var b=F;if(!r)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){q(`wasm streaming compile failed: ${d}`),q("falling back to ArrayBuffer instantiation")}return ca(b,a)}class G{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var C,A,D,B,H=a=>{for(;a.length>0;)a.shift()(e)},I=[],J=[],ea=()=>{var a=e.preRun.shift();J.push(a)},K=!0,L=0,fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],M={},N=a=>{if(!(a instanceof G||a=="unwind"))throw a;},O=a=>{u=a;K||L>0||(e.onExit?.(a),t=!0);throw new G(a);},ia=a=>{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||L>0))try{u=a=u,O(a)}catch(b){N(b)}}},P=(a,b,c)=>{var d=B;if(c>0){c=b+c-1;for(var g=0;g= +c)break;d[b++]=f}else if(f<=2047){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(f<=65535){if(b+2>=c)break;d[b++]=224|f>>12;d[b++]=128|f>>6&63;d[b++]=128|f&63}else{if(b+3>=c)break;d[b++]=240|f>>18;d[b++]=128|f>>12&63;d[b++]=128|f>>6&63;d[b++]=128|f&63;g++}}d[b]=0}},ja=new TextDecoder,Q=a=>{if(a){for(var b=a,c=B,d=b+void 0;c[b]&&!(b>=d);)++b;a=ja.decode(B.subarray(a,b))}else a="";return a},R=a=>{for(var b=0,c=0;c=55296&&d<=57343? +(b+=4,++c):b+=3}return b},T=a=>{var b=R(a)+1,c=S(b);c&&P(a,c,b);return c};function U(){}var la=(a,b,c,d)=>{var g={string:k=>{var n=0;if(k!==null&&k!==void 0&&k!==0){n=R(k)+1;var X=V(n);P(k,X,n);n=X}return n},array:k=>{var n=V(k.length);A.set(k,n);return n}};a=e["_"+a];var f=[],p=0;if(d)for(var l=0;l{a=Q(a);b=b!==null?JSON.parse(Q(b)):[];try{let d=e.externalCall(a,b);return d?T(d):null}catch(d){return e.HEAPU8[c]=1,T(d.message)}};e.noExitRuntime&&(K=e.noExitRuntime);e.printErr&&(q=e.printErr);e.wasmBinary&&(r=e.wasmBinary);if(e.preInit)for(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();e.ccall=la;e.cwrap=(a,b,c,d)=>{var g=!c||c.every(f=>f==="number"||f==="boolean");return b!=="string"&&g&&!d?e["_"+a]:(...f)=>la(a,b,c,f,d)}; +e.stringToNewUTF8=T; +var S,ma,ka,V,W,z,na={e:()=>E(""),a:()=>{K=!1;L=0},b:function(a,b){a=a<-9007199254740992||a>9007199254740992?NaN:Number(a);a=new Date(a*1E3);C[b>>2]=a.getSeconds();C[b+4>>2]=a.getMinutes();C[b+8>>2]=a.getHours();C[b+12>>2]=a.getDate();C[b+16>>2]=a.getMonth();C[b+20>>2]=a.getFullYear()-1900;C[b+24>>2]=a.getDay();var c=a.getFullYear();C[b+28>>2]=(c%4!==0||c%100===0&&c%400!==0?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(a.getTimezoneOffset()*60);c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset(); +var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();C[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},i:(a,b)=>{M[a]&&(clearTimeout(M[a].id),delete M[a]);if(!b)return 0;var c=setTimeout(()=>{delete M[a];ia(()=>ma(a,performance.now()))},b);M[a]={id:c,A:b};return 0},c:(a,b,c,d)=>{var g=(new Date).getFullYear(),f=(new Date(g,0,1)).getTimezoneOffset();g=(new Date(g,6,1)).getTimezoneOffset();D[a>>2]=Math.max(f,g)*60;C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${p>=0?"-":"+"}${String(Math.floor(l/ +60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);gDate.now(),j:a=>{var b=B.length;a>>>=0;if(a>2147483648)return!1;for(var c=1;c<=4;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,Math.ceil(Math.max(a,d)/65536)*65536)-z.buffer.byteLength+65535)/65536|0;try{z.grow(d);y();var g=1; +break a}catch(f){}g=void 0}if(g)return!0}return!1},m:function(a){a=Q(a);window.console.log(a)},h:function(a){a=Q(a);return Date.parse(a)},l:function(a,b,c,d){a=Q(a);b=Q(b);c=Q(c);c=`Quickjs -- ${a}: ${b}\n${c}`;d!==0?window.alert(c):window.console.error(c)},k:O},Z; +Z=await (async function(){function a(c){c=Z=c.exports;e._evalInSandbox=c.p;e._nukeSandbox=c.q;e._init=c.r;e._commFun=c.s;e._dumpMemoryUse=c.t;S=c.u;e._free=c.v;ma=c.w;ka=c.x;V=c.y;W=c.z;z=c.n;y();return Z}var b={a:na};if(e.instantiateWasm)return new Promise(c=>{e.instantiateWasm(b,(d,g)=>{c(a(d,g))})});F??=e.locateFile?e.locateFile?e.locateFile("quickjs-eval.wasm",h):h+"quickjs-eval.wasm":(new URL("quickjs-eval.wasm",import.meta.url)).href;return function(c){return a(c.instance)}(await da(b))}()); +(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)ea();H(J);e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1);a()},1)):a()})();x?moduleRtn=e:moduleRtn=new Promise((a,b)=>{v=a;w=b}); +;return moduleRtn}export default QuickJS; diff --git a/frontend/public/pdfjs-wasm/quickjs-eval.wasm b/frontend/public/pdfjs-wasm/quickjs-eval.wasm new file mode 100644 index 0000000..42980e9 Binary files /dev/null and b/frontend/public/pdfjs-wasm/quickjs-eval.wasm differ diff --git a/frontend/scripts/copy-pdfjs-wasm.mjs b/frontend/scripts/copy-pdfjs-wasm.mjs new file mode 100644 index 0000000..af0f164 --- /dev/null +++ b/frontend/scripts/copy-pdfjs-wasm.mjs @@ -0,0 +1,34 @@ +/** + * pdf.js 解码 JBIG2 / JPEG2000 扫描页时会在 worker 里按 wasmUrl 取 wasm 运行时, + * 这个目录不由打包器管理,所以每次 dev/build 前把 node_modules 里的文件同步到 public。 + */ +import { + copyFileSync, + existsSync, + mkdirSync, + readdirSync, + readFileSync, +} from "node:fs"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const frontend = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const from = join(frontend, "node_modules/pdfjs-dist/wasm"); +const to = join(frontend, "public/pdfjs-wasm"); + +mkdirSync(to, { recursive: true }); +const files = readdirSync(from).filter((name) => !name.startsWith("LICENSE")); +let copied = 0; +for (const name of files) { + const source = join(from, name); + const dest = join(to, name); + // 内容没变就不重写:dev server 在跑时改 public 里的同名文件会触发整页刷新并弹覆盖层 + if (existsSync(dest) && readFileSync(dest).equals(readFileSync(source))) continue; + copyFileSync(source, dest); + copied += 1; +} +console.log( + copied + ? `[pdfjs-wasm] 已同步 ${copied}/${files.length} 个文件 -> public/pdfjs-wasm` + : "[pdfjs-wasm] public/pdfjs-wasm 已是最新", +); diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..ff16261 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,387 @@ +import { useEffect, useState } from "react"; +import type { ReactElement, ReactNode } from "react"; +import { App as AntdApp, ConfigProvider } from "antd"; +import enUS from "antd/locale/en_US"; +import zhCN from "antd/locale/zh_CN"; +import Layout, { + defaultViewForRole, + isAllowedView, +} from "./components/Layout"; +import type { ViewId } from "./nav"; +import { buildTheme } from "./theme"; +import { PrefsProvider, usePrefs } from "./prefs"; +import { clearAuth, readAuth, saveAuth } from "./api/client"; +import Login from "./pages/Login"; +import Dashboard from "./pages/Dashboard"; +import KnowledgeMap from "./pages/KnowledgeMap"; +import ChapterTest from "./pages/ChapterTest"; +import Errors from "./pages/Errors"; +import Records from "./pages/Records"; +import Resources from "./pages/Resources"; +import Daily from "./pages/Daily"; +import UsersManage from "./pages/UsersManage"; +import CatalogManage from "./pages/CatalogManage"; +import CourseManage from "./pages/CourseManage"; +import QuestionBank from "./pages/QuestionBank"; +import LlmSettings from "./pages/LlmSettings"; +import KnowledgeGraph from "./pages/KnowledgeGraph"; +import Settings from "./pages/Settings"; +import EbookReader from "./pages/EbookReader"; + +interface AuthState { + token: string; + role: string; + display_name: string; +} + +/** 当前视图持久化:刷新后停在本页,不再回到默认首页。 */ +const VIEW_KEY = "nex_math_view"; + +function readStoredView(): ViewId | null { + try { + return localStorage.getItem(VIEW_KEY) as ViewId | null; + } catch { + return null; + } +} + +function rememberView(view: ViewId) { + try { + localStorage.setItem(VIEW_KEY, view); + } catch { + // 隐私模式下写入失败时忽略 + } +} + +/** + * 阅读器打开的是哪本书、要不要定位到某一页:与视图一起持久化, + * 刷新后能续读同一本,章节跳转的定位也还在。 + */ +const READER_KEY = "nex_math_reader"; + +interface ReaderTarget { + id: number; + /** 章节定位页;0 表示按上次进度续读 */ + page: number; +} + +function readStoredReader(): ReaderTarget | null { + try { + const raw = localStorage.getItem(READER_KEY); + if (!raw) return null; + // 早期版本只存教材 id,兼容读取 + if (!raw.startsWith("{")) { + const legacy = Number(raw); + return Number.isInteger(legacy) && legacy > 0 ? { id: legacy, page: 0 } : null; + } + const parsed = JSON.parse(raw) as Partial; + const id = Number(parsed.id); + if (!Number.isInteger(id) || id <= 0) return null; + const page = Number(parsed.page); + return { id, page: Number.isFinite(page) && page > 0 ? page : 0 }; + } catch { + return null; + } +} + +function rememberReader(target: ReaderTarget | null) { + try { + if (target) localStorage.setItem(READER_KEY, JSON.stringify(target)); + else localStorage.removeItem(READER_KEY); + } catch { + // 同上 + } +} + +interface PageContext { + questionBankPreset?: { textbook_id?: number; chapter_id?: number } | null; + testChapterId?: number | null; + /** 从总览分布图例带进来的掌握度档,为空表示不筛选 */ + masteryBand: string | null; + /** 阅读器打开的教材 id,为空表示没有可用的阅读目标 */ + readerId: number | null; + /** 打开时定位的页码,为空表示按上次进度续读 */ + readerPage: number | null; + /** 打开电子书;page 为章节定位(PDF 页码 / EPUB 节序号),不传则续读上次进度 */ + openReader: (textbookId: number, page?: number) => void; + exitReader: () => void; + /** 总览里点分布图例 / 「查看知识地图」:带着档位进知识地图 */ + openKnowledgeMap: (band: string | null) => void; +} + +function pageFor( + view: ViewId, + navigate: (view: ViewId) => void, + ctx: PageContext, + auth: AuthState, + setAuth: (updater: (current: AuthState | null) => AuthState) => void, + setReloadTick: (updater: (current: number) => number) => void, + openChapterQuestions: (textbookId: number, chapterId: number) => void, + startChapterTest: (chapterId: number) => void, +): ReactElement { + switch (view) { + case "settings": + return ( + { + setAuth((current) => { + const next = { ...(current as AuthState), display_name: displayName }; + saveAuth(next); + return next; + }); + }} + onDataImported={() => setReloadTick((value) => value + 1)} + /> + ); + case "knowledge": + return ( + + ); + case "test": + return ( + + ); + case "errors": + return ; + case "records": + return ; + case "daily": + return ( + + ); + case "resources": + return ( + + ); + case "users": + return ; + case "catalog": + return ( + + ); + case "courses": + return ; + case "reader": + if (ctx.readerId === null) + return ( + + ); + return ( + + ); + case "bank": + return ( + + ); + case "llm": + return ; + case "graph": + return ; + case "dashboard": + return ( + + ); + } + return ( + + ); +} + +/** antd 全局上下文:界面语言与明暗主题随偏好实时切换。 */ +function Providers({ children }: { children: ReactNode }) { + const { mode, lang } = usePrefs(); + return ( + + {children} + + ); +} + +function Root() { + const [auth, setAuth] = useState(() => { + const stored = readAuth(); + return stored + ? { + token: stored.token, + role: stored.role, + display_name: stored.display_name, + } + : null; + }); + const [view, setView] = useState(() => { + const stored = readAuth(); + const role = stored?.role ?? "student"; + const last = readStoredView(); + // 越权、已下线,或只剩阅读器却没有书,都回默认首页 + if (last === "reader" && !readStoredReader()) return defaultViewForRole(role); + return last && isAllowedView(last, role) ? last : defaultViewForRole(role); + }); + const [questionBankPreset, setQuestionBankPreset] = useState< + { textbook_id?: number; chapter_id?: number } | null + >(null); + const [testChapterId, setTestChapterId] = useState(null); + const [masteryBand, setMasteryBand] = useState(null); + const [reader, setReader] = useState(readStoredReader); + // 导入学习档案后自增,用于重挂页面以刷新全部数据 + const [reloadTick, setReloadTick] = useState(0); + + useEffect(() => { + if (auth) rememberView(view); + }, [auth, view]); + + useEffect(() => { + const onExpired = () => { + setAuth(null); + setReader(null); + setView(defaultViewForRole("student")); + }; + window.addEventListener("auth:expired", onExpired); + return () => window.removeEventListener("auth:expired", onExpired); + }, []); + + function handleLogin(next: AuthState) { + saveAuth(next); + setAuth(next); + setReader(null); + rememberReader(null); + setView(defaultViewForRole(next.role)); + } + + function navigate(viewId: ViewId) { + if (viewId !== "bank") setQuestionBankPreset(null); + if (viewId !== "test") setTestChapterId(null); + if (viewId !== "knowledge") setMasteryBand(null); + if (viewId !== "reader") { + setReader(null); + rememberReader(null); + } + setView(viewId); + } + + function openReader(textbookId: number, page = 0) { + const target = { id: textbookId, page: page > 0 ? Math.round(page) : 0 }; + setReader(target); + rememberReader(target); + setView("reader"); + } + + function exitReader() { + setReader(null); + rememberReader(null); + setView(auth?.role === "admin" ? "catalog" : "resources"); + } + + function openChapterQuestions(textbookId: number, chapterId: number) { + setQuestionBankPreset({ textbook_id: textbookId, chapter_id: chapterId }); + setView("bank"); + } + + function openKnowledgeMap(band: string | null) { + setMasteryBand(band); + setView("knowledge"); + } + + function openChapterTest(chapterId: number) { + setTestChapterId(chapterId); + setView("test"); + } + + function handleLogout() { + clearAuth(); + setAuth(null); + } + + if (!auth) { + return ( + + + + ); + } + + // 角色不可见的视图兜底回首页,避免直接访问越权页面出现空面板 + const safeView = isAllowedView(view, auth.role) ? view : defaultViewForRole(auth.role); + + return ( + + +

+ + + ); +} + +export default function App() { + return ( + + + + ); +} diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts new file mode 100644 index 0000000..9e8d3c8 --- /dev/null +++ b/frontend/src/api/client.ts @@ -0,0 +1,429 @@ +import type { + Analytics, + AnswerPayload, + AuthResult, + ChapterItem, + ChaptersGeneratePayload, + ChaptersGenerateResult, + DailyInfo, + EbookProgress, + EbookProgressPayload, + ErrorEntry, + GeneratePayload, + LlmChannel, + LlmChannelCreatePayload, + LlmChannelUpdatePayload, + LlmSettings, + LlmTaskResult, + Overview, + PracticeSession, + QuestionBankItem, + QuestionUpdatePayload, + RecordDetail, + RecordItem, + SubmitResult, + Course, + CourseCreatePayload, + CourseUpdatePayload, + Textbook, + TextbookCreatePayload, + TextbookUpdatePayload, + UserCreatePayload, + UserInfo, + UserUpdatePayload, + KnowledgePoint, + KnowledgeDetail, + KnowledgeGraphData, + KnowledgeGraphEdge, + KnowledgeGraphNode, + KnowledgeResourceLink, + KnowledgeNodeCreatePayload, + KnowledgeNodeUpdatePayload, + KnowledgeRelationPayload, +} from "../types"; +import { backendText, tr } from "../i18n"; + +/** 上传电子书的响应:后端解析出的篇幅用于立刻刷新卡片信息。 */ +export interface EbookUploadResult { + id: number; + ebook_format: string; + ebook_name: string; + ebook_size: number; + ebook_pages: number; +} + +const AUTH_KEY = "nex_math_auth"; + +export interface StoredAuth { + token: string; + role: string; + display_name: string; +} + +export function readAuth(): StoredAuth | null { + try { + const raw = localStorage.getItem(AUTH_KEY); + return raw ? (JSON.parse(raw) as StoredAuth) : null; + } catch { + return null; + } +} + +export function saveAuth(auth: StoredAuth): void { + localStorage.setItem(AUTH_KEY, JSON.stringify(auth)); +} + +export function clearAuth(): void { + localStorage.removeItem(AUTH_KEY); +} + +async function request(path: string, init?: RequestInit): Promise { + const auth = readAuth(); + const headers = new Headers(init?.headers); + if (auth?.token) headers.set("Authorization", `Bearer ${auth.token}`); + if (init?.body && !headers.has("Content-Type")) { + headers.set("Content-Type", "application/json"); + } + const res = await fetch(path, { ...init, headers }); + if (res.status === 401 && !path.includes("/auth/login")) { + clearAuth(); + window.dispatchEvent(new Event("auth:expired")); + } + if (!res.ok) { + let detail = tr("api.requestFailed", { status: res.status }); + try { + const body = await res.json(); + if (body.detail) detail = backendText(String(body.detail)); + } catch { + // 保留默认错误信息 + } + throw new Error(detail); + } + return res.json() as Promise; +} + +/** 上传电子书用 XHR:要进度回调,且不能给 FormData 设 JSON Content-Type。 */ +function upload( + path: string, + file: File, + onProgress?: (percent: number) => void, +): Promise { + return new Promise((resolve, reject) => { + const auth = readAuth(); + const form = new FormData(); + form.append("file", file); + const xhr = new XMLHttpRequest(); + xhr.open("POST", path); + if (auth?.token) xhr.setRequestHeader("Authorization", `Bearer ${auth.token}`); + xhr.upload.onprogress = (event) => { + if (event.lengthComputable && onProgress) { + onProgress(Math.round((event.loaded / event.total) * 100)); + } + }; + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + try { + resolve(JSON.parse(xhr.responseText) as T); + } catch { + reject(new Error(tr("api.uploadFailed"))); + } + return; + } + if (xhr.status === 401) { + clearAuth(); + window.dispatchEvent(new Event("auth:expired")); + } + let detail = tr("api.uploadFailedStatus", { status: xhr.status }); + try { + const body = JSON.parse(xhr.responseText); + if (body.detail) detail = backendText(String(body.detail)); + } catch { + // 保留默认错误信息 + } + reject(new Error(detail)); + }; + xhr.onerror = () => reject(new Error(tr("api.networkError"))); + xhr.send(form); + }); +} + +export const api = { + login: (username: string, password: string) => + request("/api/auth/login", { + method: "POST", + body: JSON.stringify({ username, password }), + }), + me: () => request("/api/auth/me"), + changePassword: (old_password: string, new_password: string) => + request<{ message: string }>("/api/auth/change-password", { + method: "POST", + body: JSON.stringify({ old_password, new_password }), + }), + updateProfile: (display_name: string) => + request("/api/auth/profile", { + method: "PUT", + body: JSON.stringify({ display_name }), + }), + + users: () => request("/api/users"), + createUser: (payload: UserCreatePayload) => + request("/api/users", { method: "POST", body: JSON.stringify(payload) }), + updateUser: (id: number, payload: UserUpdatePayload) => + request(`/api/users/${id}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + resetPassword: (id: number, password: string) => + request<{ message: string }>(`/api/users/${id}/reset-password`, { + method: "POST", + body: JSON.stringify({ password }), + }), + roles: () => request<{ id: number; code: string; name: string }[]>("/api/users/roles"), + resetLearning: () => + request<{ message: string }>("/api/users/reset-learning", { + method: "POST", + }), + + overview: () => request("/api/overview"), + knowledge: () => request("/api/knowledge"), + errors: () => request("/api/errors"), + records: () => request("/api/records"), + daily: () => request("/api/daily"), + completeDaily: (chapterId: number, rating: string) => + request("/api/daily/complete", { + method: "POST", + body: JSON.stringify({ chapter_id: chapterId, rating }), + }), + /** 不传 userId 时取本人;管理员可传 userId 查看指定用户的学习分析。 */ + analytics: (userId?: number) => + request( + userId === undefined + ? "/api/analytics" + : `/api/analytics?user_id=${userId}`, + ), + recordDetail: (id: number) => request(`/api/records/${id}`), + knowledgeDetail: (id: number) => + request(`/api/knowledge/detail/${id}`), + + chapterTest: (chapterId: number, variant: number, limit = 5) => + request( + `/api/practice/chapter/${chapterId}?limit=${limit}&variant=${variant}`, + ), + submit: ( + mode: string, + answers: AnswerPayload[], + chapterId?: number | null, + ) => + request("/api/practice/submit", { + method: "POST", + body: JSON.stringify({ mode, chapter_id: chapterId, answers }), + }), + + exportArchive: async (): Promise => { + const auth = readAuth(); + const headers = new Headers(); + if (auth?.token) headers.set("Authorization", `Bearer ${auth.token}`); + const res = await fetch("/api/archive/export", { headers }); + if (!res.ok) throw new Error(tr("api.exportFailed")); + return res.blob(); + }, + importArchive: (payload: unknown) => + request<{ message: string }>("/api/archive/import", { + method: "POST", + body: JSON.stringify(payload), + }), + + textbooks: () => request("/api/textbooks"), + createTextbook: (payload: TextbookCreatePayload) => + request("/api/textbooks", { + method: "POST", + body: JSON.stringify(payload), + }), + updateTextbook: (id: number, payload: TextbookUpdatePayload) => + request(`/api/textbooks/${id}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + deleteTextbook: (id: number) => + request<{ deleted: number }>(`/api/textbooks/${id}`, { method: "DELETE" }), + + /** 在线课程与教材分表:只有名称 / 开课方 / 链接 / 学段。 */ + courses: () => request("/api/courses"), + createCourse: (payload: CourseCreatePayload) => + request("/api/courses", { + method: "POST", + body: JSON.stringify(payload), + }), + updateCourse: (id: number, payload: CourseUpdatePayload) => + request(`/api/courses/${id}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + deleteCourse: (id: number) => + request<{ deleted: number }>(`/api/courses/${id}`, { method: "DELETE" }), + ebookFileUrl: (textbookId: number, file: string) => + `/api/textbooks/${textbookId}/ebook/file/${encodeURIComponent(file)}`, + uploadEbook: ( + textbookId: number, + file: File, + onProgress?: (percent: number) => void, + ) => + upload( + `/api/textbooks/${textbookId}/ebook`, + file, + onProgress, + ), + deleteEbook: (textbookId: number) => + request<{ deleted: number }>(`/api/textbooks/${textbookId}/ebook`, { + method: "DELETE", + }), + ebookProgressList: () => request("/api/ebooks/progress"), + saveEbookProgress: (textbookId: number, payload: EbookProgressPayload) => + request(`/api/ebooks/${textbookId}/progress`, { + method: "PUT", + body: JSON.stringify(payload), + }), + createChapter: (textbookId: number, name: string, summary: string) => + request(`/api/textbooks/${textbookId}/chapters`, { + method: "POST", + body: JSON.stringify({ name, summary }), + }), + deleteChapter: (chapterId: number) => + request<{ deleted: number }>(`/api/textbooks/chapters/${chapterId}`, { + method: "DELETE", + }), + updateChapter: ( + chapterId: number, + payload: { + name: string; + summary: string; + /** 电子书定位;PDF 填页码,EPUB 填分节序号 */ + ebook_page?: number; + knowledge_names?: string[]; + knowledge_ids?: number[]; + }, + ) => + request(`/api/textbooks/chapters/${chapterId}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + generateChapters: ( + textbookId: number, + payload: ChaptersGeneratePayload, + ) => + request( + `/api/textbooks/${textbookId}/chapters/generate`, + { + method: "POST", + body: JSON.stringify(payload), + }, + ), + updateQuestion: (id: number, payload: QuestionUpdatePayload) => + request(`/api/question-bank/questions/${id}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + bankQuestions: (params: { + textbook_id?: number; + chapter_id?: number; + }) => { + const search = new URLSearchParams(); + if (params.textbook_id) search.set("textbook_id", String(params.textbook_id)); + if (params.chapter_id) search.set("chapter_id", String(params.chapter_id)); + const query = search.toString(); + return request( + `/api/question-bank/questions${query ? `?${query}` : ""}`, + ); + }, + deleteQuestion: (id: number) => + request<{ deleted: number }>(`/api/question-bank/questions/${id}`, { + method: "DELETE", + }), + generateQuestions: (payload: GeneratePayload) => + request("/api/question-bank/generate", { + method: "POST", + body: JSON.stringify(payload), + }), + + llmSettings: () => request("/api/llm/settings"), + createLlmTask: (kind: string, params: Record) => + request("/api/llm/tasks", { + method: "POST", + body: JSON.stringify({ kind, params }), + }), + getLlmTask: (id: number) => + request(`/api/llm/tasks/${id}`), + knowledgeGraph: () => + request("/api/knowledge/graph"), + createKnowledgeNode: (payload: KnowledgeNodeCreatePayload) => + request("/api/knowledge/nodes", { + method: "POST", + body: JSON.stringify(payload), + }), + updateKnowledgeNode: ( + id: number, + payload: KnowledgeNodeUpdatePayload, + ) => + request(`/api/knowledge/nodes/${id}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + deleteKnowledgeNode: (id: number) => + request<{ deleted: number }>(`/api/knowledge/nodes/${id}`, { + method: "DELETE", + }), + addKnowledgeRelation: (payload: KnowledgeRelationPayload) => + request("/api/knowledge/relations", { + method: "POST", + body: JSON.stringify(payload), + }), + removeKnowledgeRelation: ( + source: number, + target: number, + relationType: string, + ) => + request<{ deleted: number }>( + `/api/knowledge/relations?source_id=${source}&target_id=${target}&relation_type=${encodeURIComponent(relationType)}`, + { method: "DELETE" }, + ), + addKnowledgeResource: ( + nodeId: number, + payload: { + kind?: string; + title?: string; + url?: string; + textbook_id?: number | null; + course_id?: number | null; + }, + ) => + request(`/api/knowledge/nodes/${nodeId}/resources`, { + method: "POST", + body: JSON.stringify(payload), + }), + removeKnowledgeResource: (resourceId: number) => + request<{ deleted: number }>(`/api/knowledge/resources/${resourceId}`, { + method: "DELETE", + }), + createLlmChannel: (payload: LlmChannelCreatePayload) => + request("/api/llm/channels", { + method: "POST", + body: JSON.stringify(payload), + }), + updateLlmChannel: (id: number, payload: LlmChannelUpdatePayload) => + request(`/api/llm/channels/${id}`, { + method: "PUT", + body: JSON.stringify(payload), + }), + deleteLlmChannel: (id: number) => + request<{ deleted: number }>(`/api/llm/channels/${id}`, { + method: "DELETE", + }), + setDefaultLlmChannel: (id: number) => + request(`/api/llm/channels/${id}/default`, { + method: "PUT", + }), + testLlmChannel: (id: number) => + request<{ ok: boolean; message: string }>(`/api/llm/channels/${id}/test`, { + method: "POST", + }), +}; diff --git a/frontend/src/components/AnalyticsPanel.tsx b/frontend/src/components/AnalyticsPanel.tsx new file mode 100644 index 0000000..afdcc4f --- /dev/null +++ b/frontend/src/components/AnalyticsPanel.tsx @@ -0,0 +1,75 @@ +/** + * 学习分析视图:指标 + 知识点诊断。 + * 学生不再单独占一个菜单项,改由管理员在「用户管理」里按账号查看; + * 逻辑与后端 /api/analytics 一致,只是多传一个 user_id。 + */ +import { Tag } from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { api } from "../api/client"; +import { AsyncState } from "./Async"; +import { useApi } from "./useApi"; +import { DataTable, EmptyState, MetricGrid, Panel, metricIcon } from "./ui"; +import { masteryActionColor, masteryTagColor } from "../theme"; +import type { DiagnosisItem } from "../types"; +import { useT } from "../prefs"; +import { enumLabel } from "../i18n"; +import type { TFn } from "../i18n"; + +function buildColumns(t: TFn): ColumnsType { + return [ + { title: t("analytics.knowledge"), dataIndex: "name" }, + { + title: t("analytics.mastery"), + dataIndex: "mastery", + width: 120, + sorter: (a, b) => a.mastery - b.mastery, + render: (value: number) => {value}%, + }, + { title: t("analytics.errorCount"), dataIndex: "error_count", width: 110, align: "center" }, + { + title: t("analytics.action"), + dataIndex: "action", + width: 140, + render: (value: string) => ( + {enumLabel(t, value)} + ), + }, + ]; +} + +export default function AnalyticsPanel({ userId }: { userId?: number }) { + const t = useT(); + const { data, loading, error, reload } = useApi( + () => api.analytics(userId), + [userId], + ); + + return ( +
+ + {data && ( + <> + ({ + title: enumLabel(t, metric.label), + value: enumLabel(t, metric.value), + ...metricIcon(metric.label), + }))} + /> + + {data.diagnosis.length === 0 ? ( + + ) : ( + + rowKey="name" + columns={buildColumns(t)} + dataSource={data.diagnosis} + /> + )} + + + )} +
+ ); +} diff --git a/frontend/src/components/Async.tsx b/frontend/src/components/Async.tsx new file mode 100644 index 0000000..5caf525 --- /dev/null +++ b/frontend/src/components/Async.tsx @@ -0,0 +1,46 @@ +import { Alert, Button, Skeleton } from "antd"; +import { useT } from "../prefs"; + +interface AsyncStateProps { + loading: boolean; + error?: string | null; + onRetry?: () => void; + /** 局部加载(如表格展开区)用少量骨架行 */ + compact?: boolean; +} + +export function AsyncState({ loading, error, onRetry, compact }: AsyncStateProps) { + const t = useT(); + if (loading) { + if (compact) { + return ( +
+ +
+ ); + } + return ( +
+ +
+ ); + } + if (error) { + return ( + + {t("common.retry")} + + ) : undefined + } + /> + ); + } + return null; +} diff --git a/frontend/src/components/HeaderControls.tsx b/frontend/src/components/HeaderControls.tsx new file mode 100644 index 0000000..d315eda --- /dev/null +++ b/frontend/src/components/HeaderControls.tsx @@ -0,0 +1,45 @@ +/** + * 顶栏右侧的偏好入口:明暗模式(图标按钮)+ 界面语言(分段控件)。 + * 登录页与主界面共用,保证任何时候都能切换;不放悬浮提示。 + */ +import { MoonOutlined, SunOutlined } from "@ant-design/icons"; +import { Button, Segmented } from "antd"; +import { usePrefs, useT } from "../prefs"; +import type { Lang } from "../i18n"; + +export default function HeaderControls() { + const { mode, lang, toggleMode, setLang } = usePrefs(); + const t = useT(); + const dark = mode === "dark"; + const modeLabel = dark ? t("theme.toLight") : t("theme.toDark"); + + return ( +
+
+ ); +} diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx new file mode 100644 index 0000000..4d2fb59 --- /dev/null +++ b/frontend/src/components/Layout.tsx @@ -0,0 +1,406 @@ +/** + * 应用外壳有两层 header,职责分开: + * · 主页面顶栏:平台名(侧栏收拢或移动端时才出现)+ 语言 / 明暗模式,不放功能按钮; + * 只有移动端在这里额外放一个菜单入口(没有常驻侧栏,只能从这里唤出抽屉)。 + * · 侧栏菜单头部:展开时右对齐放收拢按钮,收拢后 logo 悬停变成展开按钮。 + * · 功能页面 header:位于内容区顶部,标题 + 描述 + 该功能的主操作按钮(页面用 HeaderActions 挂到右侧), + * 模块面板不再重复页面标题,也不显示数量统计(数量看分页)。 + * 落地页与满屏视图除外(见 NO_PAGE_HEADER)。 + */ +import { createContext, useEffect, useState, useContext } from "react"; +import type { ReactNode } from "react"; +import { createPortal } from "react-dom"; +import { + LogoutOutlined, + SettingOutlined, + UserOutlined, +} from "@ant-design/icons"; +import { + Avatar, + Button, + Drawer, + Dropdown, + Grid, + Layout as AntLayout, + Menu, + Tooltip, + Typography, +} from "antd"; +import { + NAV_META, + defaultViewForRole, + isAllowedView, + menuForRole, + sectionForView, +} from "../nav"; +import type { ViewId } from "../nav"; +import { brand, layout } from "../theme"; +import { useT } from "../prefs"; +import HeaderControls from "./HeaderControls"; + +export type { ViewId }; +export { defaultViewForRole, isAllowedView }; + +/** + * 不渲染功能页头的视图:阅读器是满屏视图;学习总览是登录后的落地页, + * 左侧菜单已经标明所在位置,指标卡本身就是标题,再来一条页头只是重复。 + */ +const NO_PAGE_HEADER: ViewId[] = ["reader", "dashboard"]; + +/** 顶栏上给页面主操作预留的挂载点。 */ +const HeaderSlotContext = createContext(null); + +/** + * 功能页面的主操作:把按钮渲染到本页 header 标题右侧,页面头只有一处。 + * 页面自己不再在模块面板标题里重复标题 + 放按钮。 + */ +export function HeaderActions({ children }: { children: ReactNode }) { + const slot = useContext(HeaderSlotContext); + return slot ? createPortal(children, slot) : null; +} + +interface LayoutProps { + view: ViewId; + role: string; + displayName: string; + children: ReactNode; + onNavigate: (view: ViewId) => void; + onLogout: () => void; +} + +/** + * 收拢入口图标:一个侧栏面板的抽象图形(与参考稿同一造型)。 + * 展开=左栏实心 + 箭头朝左(点击收拢),收拢=左栏留空 + 箭头朝右(点击展开), + * 两种状态一眼能分辨,也不会和正文里的「返回」箭头混淆。 + */ +function PanelGlyph({ open }: { open: boolean }) { + return ( + + ); +} + +const COLLAPSE_KEY = "nex_math_sider_collapsed"; + +function readCollapsed(): boolean { + try { + return localStorage.getItem(COLLAPSE_KEY) === "1"; + } catch { + return false; + } +} + +interface SiderContentProps { + view: ViewId; + role: string; + displayName: string; + collapsed: boolean; + onNavigate: (view: ViewId) => void; + onLogout: () => void; + /** 收拢侧栏;移动端抽屉不传,菜单头部也就不画收拢按钮 */ + onToggle?: () => void; +} + +/** + * 侧边栏主体:桌面 Sider 与移动端 Drawer 共用同一份内容。 + * 账号入口在侧栏底部,顶栏不再放用户信息。 + */ +function SiderContent({ + view, + role, + displayName, + collapsed, + onNavigate, + onLogout, + onToggle, +}: SiderContentProps) { + const t = useT(); + const isAdmin = role === "admin"; + + const userMenu = { + items: [ + { + key: "profile", + icon: , + label: isAdmin ? t("account.settings") : t("account.personal"), + }, + { type: "divider" as const }, + { key: "logout", icon: , label: t("account.logout") }, + ], + onClick: ({ key }: { key: string }) => { + if (key === "profile") onNavigate("settings"); + else if (key === "logout") onLogout(); + }, + }; + + return ( +
+
+ {collapsed ? ( + /* 收拢后只剩 logo,鼠标悬停时原地换成展开按钮,不额外占位 */ + + + +
+ +
+ onNavigate(key as ViewId)} + style={{ background: "transparent", borderInlineEnd: "none" }} + /> +
+ +
+ +
+ + } + /> + + {!collapsed && ( + <> +
+
{displayName}
+
+ {isAdmin ? t("role.admin") : t("role.student")} +
+
+ + + )} +
+
+
+
+ ); +} + +export default function Layout({ + view, + role, + displayName, + children, + onNavigate, + onLogout, +}: LayoutProps) { + const t = useT(); + const screens = Grid.useBreakpoint(); + // md 以下视为移动端:侧边栏改为覆盖式抽屉,不再挤压内容区 + const isMobile = screens.md === false; + const [collapsed, setCollapsed] = useState(readCollapsed); + const [mobileOpen, setMobileOpen] = useState(false); + // 功能页面主操作的挂载点,由 HeaderActions 通过 portal 写入 + const [headerSlot, setHeaderSlot] = useState(null); + + useEffect(() => { + try { + localStorage.setItem(COLLAPSE_KEY, collapsed ? "1" : "0"); + } catch { + // 隐私模式下写入失败时忽略 + } + }, [collapsed]); + + useEffect(() => { + // 视口回到桌面时收起移动端抽屉,避免状态串场 + if (!isMobile) setMobileOpen(false); + }, [isMobile]); + + const meta = NAV_META[view]; + + function navigate(viewId: ViewId) { + onNavigate(viewId); + setMobileOpen(false); + } + + const toggleMenu = () => { + if (isMobile) setMobileOpen((open) => !open); + else setCollapsed((value) => !value); + }; + + // 菜单展开时入口表示「收拢」,收拢时入口表示「展开」 + const menuOpen = isMobile ? mobileOpen : !collapsed; + const toggleTip = menuOpen + ? isMobile + ? t("header.closeMenu") + : t("header.collapse") + : t("header.expand"); + + return ( + + + {!isMobile && ( + + setCollapsed(!collapsed)} + /> + + )} + + {isMobile && ( + setMobileOpen(false)} + size={layout.siderExpanded} + closable={false} + className="app-sider-drawer" + styles={{ body: { padding: 0, overflow: "hidden" } }} + > + + + )} + + + + {isMobile && ( + <> + + + ); + })} + + ); +} + +interface OptionListProps { + options: string[]; + /** 用户所选下标;null / undefined 表示未作答 */ + selected?: number | null; + correctIndex?: number | null; + /** 传 false 时不标注正确答案(用于答题过程中) */ + revealCorrect?: boolean; +} + +/** + * 回看选项列表(错题本 / 练习记录 / 题库预览): + * 正确项绿色底、错选项红色底,右侧带状态图标,与答题行同一套语义。 + */ +export function OptionList({ + options, + selected, + correctIndex, + revealCorrect = true, +}: OptionListProps) { + const t = useT(); + return ( + + {options.map((option, index) => { + const isSelected = selected !== null && selected === index; + const isCorrect = correctIndex === index; + const showCorrect = revealCorrect && isCorrect; + const showWrong = isSelected && !isCorrect; + return ( +
+ {optionLetter(index)}. + + + + {isSelected && ( + + {t("options.yourAnswer")} + + )} + {showCorrect && ( + + {t("options.correctAnswer")} + + )} + {showCorrect && ( + + )} + {showWrong && ( + + )} +
+ ); + })} +
+ ); +} diff --git a/frontend/src/components/PracticeResult.tsx b/frontend/src/components/PracticeResult.tsx new file mode 100644 index 0000000..ef79636 --- /dev/null +++ b/frontend/src/components/PracticeResult.tsx @@ -0,0 +1,77 @@ +import { + CheckCircleOutlined, + CloseCircleOutlined, + DashboardOutlined, + ReloadOutlined, +} from "@ant-design/icons"; +import { Alert, Button, Flex, Space, Tag } from "antd"; +import type { PracticeSession, SubmitResult } from "../types"; +import RichText from "./RichText"; +import { DataRow, DataRows, Panel, SectionTitle } from "./ui"; +import { status, tagColor } from "../theme"; +import { useT } from "../prefs"; + +interface PracticeResultProps { + session: PracticeSession; + result: SubmitResult; + onRestart: () => void; + onExit: () => void; +} + +export function PracticeResult({ + session, + result, + onRestart, + onExit, +}: PracticeResultProps) { + const t = useT(); + const reviews = result.per_question.map((item) => ({ + ...item, + question: session.questions.find((q) => q.id === item.question_id), + })); + + return ( + + +
+ {t("result.review")} +
+ + {reviews.map((review, index) => ( + + ) : ( + + ) + } + title={ + + {review.question && } + + {review.correct ? t("result.correct") : t("result.wrong")} + + + } + description={} + /> + ))} + + + + + +
+ ); +} diff --git a/frontend/src/components/QuestionDetail.tsx b/frontend/src/components/QuestionDetail.tsx new file mode 100644 index 0000000..d06d028 --- /dev/null +++ b/frontend/src/components/QuestionDetail.tsx @@ -0,0 +1,73 @@ +import { Alert, Space, Typography } from "antd"; +import RichText from "./RichText"; +import { OptionList } from "./Options"; +import { SectionTitle } from "./ui"; +import { useT } from "../prefs"; + +interface QuestionDetailProps { + stem?: string | null; + options?: string[] | null; + selected?: number | null; + correctIndex?: number | null; + explanation?: string | null; + /** 旧数据没有题目明细时给出的提示 */ + legacyHint?: string; + /** 是否标注正确答案 */ + revealCorrect?: boolean; + /** 题干已在别处展示时(如题库表格行)可关闭重复渲染 */ + showStem?: boolean; +} + +/** 题目明细:错题本 / 练习记录 / 题库预览共用同一排版。 */ +export function QuestionDetail({ + stem, + options, + selected, + correctIndex, + explanation, + legacyHint, + revealCorrect = true, + showStem = true, +}: QuestionDetailProps) { + const t = useT(); + if (!stem) { + return ( + + ); + } + return ( + + {showStem && ( +
+ {t("question.stem")} + +
+ )} + {options && options.length > 0 && ( +
+ {t("question.options")} + +
+ )} + {explanation && ( +
+ {t("question.analysis")} + + + +
+ )} +
+ ); +} diff --git a/frontend/src/components/QuestionFlow.tsx b/frontend/src/components/QuestionFlow.tsx new file mode 100644 index 0000000..5119646 --- /dev/null +++ b/frontend/src/components/QuestionFlow.tsx @@ -0,0 +1,117 @@ +import { useState } from "react"; +import { Button, Flex, Progress, Space, Tag, Typography } from "antd"; +import { api } from "../api/client"; +import type { PracticeSession, SubmitResult } from "../types"; +import { Panel, useUi } from "./ui"; +import { OptionPicker } from "./Options"; +import { PracticeResult } from "./PracticeResult"; +import RichText from "./RichText"; +import { tagColor } from "../theme"; +import { useT } from "../prefs"; + +interface QuestionFlowProps { + session: PracticeSession; + onRestart: () => void; + onExit: () => void; +} + +export default function QuestionFlow({ + session, + onRestart, + onExit, +}: QuestionFlowProps) { + const { message } = useUi(); + const t = useT(); + const [index, setIndex] = useState(0); + const [answers, setAnswers] = useState<(number | undefined)[]>( + session.questions.map(() => undefined), + ); + const [submitting, setSubmitting] = useState(false); + const [result, setResult] = useState(null); + + const total = session.questions.length; + const question = session.questions[index]; + const progress = total ? Math.round((index / total) * 100) : 0; + + if (result) { + return ( + + ); + } + + function choose(optionIndex: number) { + setAnswers((prev) => { + const next = prev.slice(); + next[index] = optionIndex; + return next; + }); + } + + async function finish() { + if (answers.some((value) => value === undefined)) { + message.warning(t("flow.unfinished")); + return; + } + setSubmitting(true); + try { + const payload = session.questions.map((q, i) => ({ + question_id: q.id, + selected: answers[i] as number, + })); + setResult( + await api.submit(session.mode, payload, session.chapter_id), + ); + } catch (err) { + message.error(err instanceof Error ? err.message : t("flow.submitFailed")); + } finally { + setSubmitting(false); + } + } + + if (!question) return null; + + const isLast = index === total - 1; + return ( + + + {session.title} + + {t("flow.progressPrefix")} {index + 1} / {total}{" "} + {t("flow.progressSuffix")} + + + +
+ +
+ + + + {!isLast ? ( + + ) : ( + + )} + +
+ ); +} diff --git a/frontend/src/components/RichText.tsx b/frontend/src/components/RichText.tsx new file mode 100644 index 0000000..58bbc30 --- /dev/null +++ b/frontend/src/components/RichText.tsx @@ -0,0 +1,96 @@ +import type { ReactNode } from "react"; +import katex from "katex"; +import { status } from "../theme"; +import "katex/dist/katex.min.css"; + +/** + * 富文本渲染:支持行内/独立 LaTeX 公式与 Markdown 插图。 + * + * 支持的公式写法: + * $...$ / $$...$$ / \(...\) / \[...\] + * 支持的插图写法: + * ![图注](图片地址) + */ + +const TOKEN_RE = + /\$\$([\s\S]+?)\$\$|\\\[([\s\S]+?)\\\]|\$([^$\n]+?)\$|\\\(([\s\S]+?)\\\)|!\[([^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g; + +function renderMath(source: string, displayMode: boolean): string { + try { + return katex.renderToString(source, { + displayMode, + throwOnError: false, + strict: false, + output: "html", + }); + } catch { + return `${source}`; + } +} + +interface RichTextProps { + content: ReactNode; + className?: string; + /** 列表/表格里的紧凑模式:插图只作预览,限制高度以免行高失控 */ + compact?: boolean; +} + +export default function RichText({ content, className, compact }: RichTextProps) { + const text = String(content ?? ""); + const parts: ReactNode[] = []; + let lastIndex = 0; + let key = 0; + TOKEN_RE.lastIndex = 0; + + let match: RegExpExecArray | null; + while ((match = TOKEN_RE.exec(text)) !== null) { + if (match.index > lastIndex) { + parts.push(text.slice(lastIndex, match.index)); + } + const imageSource = match[6]; + if (imageSource) { + parts.push( + {match[5], + ); + } else { + const formula = match[1] ?? match[2] ?? match[3] ?? match[4] ?? ""; + const displayMode = Boolean(match[1] || match[2]); + const html = renderMath(formula, displayMode); + if (displayMode) { + parts.push( +
, + ); + } else { + parts.push( + , + ); + } + } + lastIndex = match.index + match[0].length; + } + + if (lastIndex < text.length) { + parts.push(text.slice(lastIndex)); + } + return {parts}; +} diff --git a/frontend/src/components/ui.tsx b/frontend/src/components/ui.tsx new file mode 100644 index 0000000..8d62185 --- /dev/null +++ b/frontend/src/components/ui.tsx @@ -0,0 +1,528 @@ +/** + * 统一控件层:页面骨架、面板、表格、行内操作、指标卡、表单栅格。 + * 页面只关心内容,尺寸/间距/空状态/分页由这里统一。 + */ +import type { CSSProperties, ReactNode } from "react"; +import { + App, + Button, + Card, + Drawer, + Empty, + Flex, + Form, + Popconfirm, + Space, + Statistic, + Table, + Tag, + Tooltip, + Typography, +} from "antd"; +import type { TableProps } from "antd"; +import type { FormInstance, Rule } from "antd/es/form"; +import { + BookOutlined, + CheckCircleOutlined, + ClockCircleOutlined, + ExclamationCircleOutlined, + FlagOutlined, + ThunderboltOutlined, + WarningOutlined, +} from "@ant-design/icons"; +import { tagColor } from "../theme"; +import { getLang, makeT } from "../i18n"; +import { useT } from "../prefs"; + +/** 校验规则等脱离渲染时的文案:按当前语言即时取词。 */ +const tr: ReturnType = (key, params) => makeT(getLang())(key, params); + +/** antd 静态 message/Modal 不吃主题上下文,统一改用 App 实例。 */ +export function useUi() { + const { message, modal } = App.useApp(); + return { message, modal }; +} + +/** 页面纵向骨架:统一 16px 间距。 */ +export function Page({ children }: { children: ReactNode }) { + return
{children}
; +} + +interface PanelProps { + title?: ReactNode; + extra?: ReactNode; + children: ReactNode; + /** 小号面板用于卡片内的次级分组 */ + muted?: boolean; + className?: string; +} + +/** 内容面板:统一标题层级、内边距与圆角。 */ +export function Panel({ title, extra, children, muted, className }: PanelProps) { + return ( + + {children} + + ); +} + +/** + * 面板上方工具条:只放筛选控件与提示语。 + * 主操作按钮一律放在功能页面 header 右侧,数量统计交给分页条,工具条不再承载按钮。 + */ +export function Toolbar({ filters }: { filters?: ReactNode }) { + return
{filters}
; +} + +/** 面板内的小节标题。 */ +export function SectionTitle({ + icon, + children, + extra, +}: { + icon?: ReactNode; + children: ReactNode; + extra?: ReactNode; +}) { + return ( + + {icon} + {children} + {extra} + + ); +} + +/** 次要从属文本。 */ +export function SubText({ + children, + as = "div", +}: { + children: ReactNode; + as?: "div" | "span"; +}) { + return as === "span" ? ( + {children} + ) : ( +
{children}
+ ); +} + +export interface MetricItemView { + title: string; + value: number | string; + suffix?: string; + icon?: ReactNode; + /** 图标色调:默认品牌紫,可切绿 / 橙与状态语义一致 */ + tone?: MetricTone; +} + +/** 指标卡图标的语义色调,与状态色保持一致。 */ +export type MetricTone = "brand" | "success" | "warning"; + +/** + * 指标图标按标签文案匹配:总览与分析读不同的接口, + * 但同一个指标必须长一样,所以映射放在控件层共用。 + */ +export function metricIcon(label: string): { + icon: ReactNode; + tone: MetricTone; +} { + if (label.includes("正确率") || label.includes("得分")) { + return { icon: , tone: "success" }; + } + if (label.includes("薄弱") || label.includes("错题") || label.includes("干预")) { + return { icon: , tone: "warning" }; + } + if (label.includes("阶段") || label.includes("任务")) { + return { icon: , tone: "brand" }; + } + if (label.includes("天数") || label.includes("连续")) { + return { icon: , tone: "brand" }; + } + if (label.includes("最近")) { + return { icon: , tone: "brand" }; + } + if (label.includes("知识点") || label.includes("题目")) { + return { icon: , tone: "brand" }; + } + return { icon: , tone: "brand" }; +} + +interface MetricGridProps { + items: MetricItemView[]; + columns?: number; +} + +/** 指标卡栅格:xs 两列,md 四列;带可选的语义色图标。 */ +export function MetricGrid({ items, columns = 4 }: MetricGridProps) { + return ( + + {items.map((item) => ( +
+ + + {item.icon && ( + + {item.icon} + + )} + + + +
+ ))} +
+ ); +} + +export type RowAction = + | { + kind?: "button"; + key: string; + label: string; + icon?: ReactNode; + danger?: boolean; + disabled?: boolean; + loading?: boolean; + tooltip?: string; + onClick: () => void; + } + | { + kind: "confirm"; + key: string; + label: string; + icon?: ReactNode; + danger?: boolean; + disabled?: boolean; + tooltip?: string; + title: string; + description?: ReactNode; + onConfirm: () => void; + }; + +/** + * 表格行内操作:统一为小号文字按钮 + 图标,避免 size / 排列各写一套。 + * 需要二次确认的用 kind="confirm",由 Popconfirm 承载。 + */ +export function RowActions({ actions }: { actions: RowAction[] }) { + return ( + + {actions.map((action) => { + const button = ( + + ); + const withTooltip = action.tooltip ? ( + {button} + ) : ( + button + ); + if (action.kind === "confirm") { + return ( + } + onConfirm={action.onConfirm} + > + {withTooltip} + + ); + } + return {withTooltip}; + })} + + ); +} + +interface DataTableProps extends TableProps { + /** 传 false 关闭分页;默认超过 10 条自动分页 */ + pagination?: TableProps["pagination"]; +} + +/** + * 统一表格:中号密度、滚动横向、空状态与分页文案一致。 + * 分页常驻并显示总条数——面板标题因此不必再挂数量徽标。 + */ +export function DataTable({ + pagination, + size = "middle", + ...rest +}: DataTableProps) { + const t = useT(); + const autoPagination = pagination === undefined; + return ( + + size={size} + scroll={{ x: "max-content" }} + locale={{ emptyText: }} + {...rest} + pagination={ + autoPagination + ? { + pageSize: 10, + hideOnSinglePage: false, + showSizeChanger: true, + showTotal: (total) => t("common.totalRows", { n: total }), + } + : pagination + } + /> + ); +} + +/** 表单里的等宽两列(替代 Space.Compact 误用)。 */ +export function FormRow({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} + +export const halfItem: { style: CSSProperties } = { + style: { flex: "1 1 260px", minWidth: 220 }, +}; + +export const rules = { + required: (label: string): Rule[] => [ + { required: true, whitespace: true, message: tr("common.enterField", { field: label }) }, + ], + min: (label: string, min: number): Rule[] => [ + { required: true, message: tr("common.enterField", { field: label }) }, + { min, message: tr("common.fieldMin", { field: label, min }) }, + ], +}; + +/** 表单底部按钮区。 */ +export function FormFooter({ + onSubmit, + submitText, + loading, + extra, +}: { + onSubmit: () => void; + submitText?: string; + loading?: boolean; + extra?: ReactNode; +}) { + const t = useT(); + return ( + + + {extra} + + ); +} + +/** 知识点标签组:多个页面共用同一颜色与排列。 */ +export function KnowledgeTags({ + names, + fallback, +}: { + names?: string[] | null; + fallback?: string; +}) { + const t = useT(); + const list = names && names.length > 0 ? names : [fallback ?? t("common.chapterFallback")]; + return ( + + {list.map((name) => ( + + {name} + + ))} + + ); +} + +/** + * 数量徽标:只用于列表行内的单项数量(例如某章的题目数)。 + * 面板标题不挂数量:列表数量由分页的「共 N 条」承担。 + */ +export function CountTag({ + value, + label, + tone = "info", +}: { + value: number; + label: string; + tone?: keyof typeof tagColor; +}) { + return ( + + {value} {label} + + ); +} + +/** + * 通用数据行:抽屉里的章节列表、结果回看、任务步骤等“轻量列表”统一用它, + * 替代 antd v6 已弃用的 List;分隔线 / 间距 / 悬停行为全站一致。 + */ +export function DataRow({ + title, + description, + extra, + actions, + avatar, + onClick, +}: { + title: ReactNode; + description?: ReactNode; + extra?: ReactNode; + actions?: ReactNode; + avatar?: ReactNode; + onClick?: () => void; +}) { + return ( +
+ + {avatar} +
+ +
{title}
+ {extra} +
+ {description &&
{description}
} +
+ {actions &&
{actions}
} +
+
+ ); +} + +/** DataRow 的容器:负责整体分隔线节奏。 */ +export function DataRows({ children }: { children: ReactNode }) { + return
{children}
; +} + +interface EditorDrawerProps { + title: ReactNode; + open: boolean; + onClose: () => void; + form: FormInstance; + onFinish: (values: Record) => void; + children: ReactNode; + loading?: boolean; + submitText?: string; + /** 表单项上方的上下文说明(编辑对象、注意事项) */ + intro?: ReactNode; + width?: number; +} + +/** + * 新增/编辑统一容器:一律从右侧滑出,标题、表单、吸底按钮同一套布局, + * 避免同类操作在不同页面一会儿用居中弹窗、一会儿用左侧抽屉。 + */ +export function EditorDrawer({ + title, + open, + onClose, + form, + onFinish, + children, + loading, + submitText, + intro, + width = 560, +}: EditorDrawerProps) { + const t = useT(); + return ( + + + + + } + > + {intro && ( +
+ {intro} +
+ )} +
+ {children} +
+
+ ); +} + +/** 统一空状态:简单图标 + 一句话说明 + 可选操作按钮。 */ +export function EmptyState({ + description, + action, + compact, +}: { + description: ReactNode; + action?: ReactNode; + compact?: boolean; +}) { + return ( + + {action} + + ); +} + +/** 提示型说明条,统一字号与颜色。 */ +export function Hint({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} diff --git a/frontend/src/components/useApi.ts b/frontend/src/components/useApi.ts new file mode 100644 index 0000000..3effe99 --- /dev/null +++ b/frontend/src/components/useApi.ts @@ -0,0 +1,43 @@ +import { useEffect, useRef, useState } from "react"; + +interface ApiState { + data: T | null; + error: string | null; + loading: boolean; + reload: () => void; +} + +export function useApi( + load: () => Promise, + deps: unknown[] = [], +): ApiState { + const [data, setData] = useState(null); + const [error, setError] = useState(null); + const [version, setVersion] = useState(0); + const loaderRef = useRef(load); + loaderRef.current = load; + + useEffect(() => { + let alive = true; + setData(null); + setError(null); + loaderRef + .current() + .then((value) => { + if (alive) setData(value); + }) + .catch((err: unknown) => { + if (alive) setError(err instanceof Error ? err.message : String(err)); + }); + return () => { + alive = false; + }; + }, [version, ...deps]); + + return { + data, + error, + loading: data === null && error === null, + reload: () => setVersion((v) => v + 1), + }; +} diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts new file mode 100644 index 0000000..f06531d --- /dev/null +++ b/frontend/src/i18n.ts @@ -0,0 +1,1630 @@ +/** + * 轻量文案层:语言由 PrefsProvider 决定,页面通过 useT() 取文案。 + * 框架层(导航 / 顶栏 / 公共控件 / 登录 / 资源页)已词条化; + * 教材、题目、知识点等来自后端的数据保持原文,不做假翻译。 + */ +export type Lang = "zh" | "en"; + +const zh = { + "app.name": "数学学习系统", + "app.tagline": "盖尔范德思维训练 · 个性化学习与题库管理", + + "section.learning": "学习", + "section.resources": "学习资源", + "section.content": "内容与题库", + "section.system": "系统管理", + "section.account": "账号", + + "nav.dashboard": "学习总览", + "nav.dashboard.description": "掌握度、练习进度与下一步建议", + "nav.knowledge": "知识地图", + "nav.knowledge.description": "逐个查看知识点掌握情况,可按掌握度筛选", + "nav.test": "章节测试", + "nav.test.description": "任选章节组题,即时批改并回看解析", + "nav.errors": "错题本", + "nav.errors.description": "做错的题目与逐题诊断,可随时回看", + "nav.records": "练习记录", + "nav.records.description": "历次训练的正确率与逐题明细", + "nav.daily": "今日任务", + "nav.daily.description": "系统推荐的今日章节与学习反馈", + "nav.resources": "教材 / 课程", + "nav.resources.description": "教材章节目录与在线课程入口", + "nav.reader": "电子书阅读器", + "nav.reader.description": "在线阅读教材电子书,自动记录阅读位置", + "nav.settings": "个人设置", + "nav.settings.description": "昵称与登录密码", + "nav.users": "用户管理", + "nav.users.description": "账号、角色与学习数据维护", + "nav.catalog": "教材管理", + "nav.catalog.description": "维护教材信息、章节目录与电子版", + "nav.courses": "在线课程管理", + "nav.courses.description": "维护视频课程链接与适用学段", + "nav.bank": "题库管理", + "nav.bank.description": "题目维护与大模型按章节生成", + "nav.llm": "模型配置", + "nav.llm.description": "多通道模型服务与默认生成通道", + "nav.graph": "知识图谱管理", + "nav.graph.description": "知识点、关系与教材课程关联", + + "role.admin": "管理员", + "role.student": "学生", + + "account.settings": "账号设置", + "account.personal": "个人设置", + "account.logout": "退出登录", + "account.menu": "账号菜单", + + "header.collapse": "收拢菜单", + "header.expand": "展开菜单", + "header.closeMenu": "关闭菜单", + "header.collapseAria": "收拢导航菜单", + "header.expandAria": "展开导航菜单", + "theme.toDark": "切换到深色模式", + "theme.toLight": "切换到浅色模式", + "lang.label": "语言", + + "common.noData": "暂无数据", + "common.total": "共 {n} 项", + "common.totalRows": "共 {n} 条", + "common.save": "保存", + "common.cancel": "取消", + "common.create": "创建", + "common.chapterFallback": "章节综合", + "common.enterField": "请输入{field}", + "common.fieldMin": "{field}至少 {min} 位", + + "login.username": "用户名", + "login.password": "密码", + "login.submit": "登录", + "login.success": "登录成功", + "login.failed": "登录失败", + "login.passwordPlaceholder": "请输入密码", + "login.hint": "演示账号:admin / admin123(管理员),student / student123(学生)", + + "resources.textbook": "教材", + "resources.course": "课程", + "resources.author": "作者", + "resources.publisher": "出版社", + "resources.edition": "版次", + "resources.provider": "开课方", + "resources.grade": "适用学段", + "resources.chapterOf": "{name} · 章节目录", + "resources.chapters": "章节目录", + "resources.questionCount": "{n} 道题", + "resources.chapterCount": "{n} 章", + "resources.startTest": "开始本章测试", + "resources.noChapters": "该教材还没有章节", + "resources.emptyBooks": "还没有教材,管理员可在“教材管理”中添加", + "resources.emptyCourses": "还没有在线课程 / 视频资源", + "resources.openCourse": "打开课程", + "resources.readOnline": "在线阅读", + "resources.readProgress": "已读 {n}%", + + "reader.exit": "返回", + "reader.loading": "正在打开电子书…", + "reader.failed": "电子书打开失败", + "reader.notEbook": "该资源还没有可阅读的电子书", + "reader.page": "第 {page} / {total} 页", + "reader.prev": "上一页", + "reader.next": "下一页", + "reader.fitWidth": "适配宽度", + "reader.zoomIn": "放大", + "reader.zoomOut": "缩小", + "reader.fontSmaller": "减小字号", + "reader.fontLarger": "增大字号", + "reader.toc": "目录", + "reader.noToc": "该电子书没有目录", + "reader.section": "第 {page} / {total} 节", + + // 电子书定位:教材章节与电子书页码/节序号的对应关系 + "ebook.read": "读教材", + "ebook.open": "打开电子书", + "ebook.openAt": "打开到第 {page} 页", + "ebook.page": "电子书定位", + "ebook.pageAt": "第 {page} 页", + "ebook.pageHint": "PDF 填页码,EPUB 填节序号,0 表示不定位", + "ebook.pageSaved": "已保存电子书定位", + "ebook.pageSaveFailed": "保存电子书定位失败", + "reader.keysHint": "← → 翻页", + + "common.loadFailed": "加载失败", + "common.retry": "重试", + "options.yourAnswer": "你的回答", + "options.correctAnswer": "正确答案", + "flow.progressPrefix": "第", + "flow.progressSuffix": "题", + "flow.prev": "上一题", + "flow.next": "下一题", + "flow.submit": "提交测试", + "flow.unfinished": "还有题目未作答,请返回完成后再提交", + "flow.submitFailed": "提交失败", + "question.legacy": "该条记录来自旧版本,没有保存题目明细;新的作答记录会自动带逐题详情。", + "question.stem": "题干", + "question.options": "选项", + "question.analysis": "解析", + "result.score": "本次得分:{score} / {total}", + "result.summary": "正确率 {accuracy}%。系统已更新你的知识掌握度与错题本。", + "result.review": "题目回看", + "result.correct": "正确", + "result.wrong": "错误", + "result.retry": "再测一次", + "result.back": "返回总览", + "analytics.knowledge": "知识点", + "analytics.mastery": "掌握度", + "analytics.errorCount": "错题数", + "analytics.action": "建议动作", + "analytics.diagnosis": "知识点诊断", + "analytics.diagnosisEmpty": "还没有练习数据,完成章节测试后这里会出现知识点诊断", + "api.requestFailed": "请求失败({status})", + "api.uploadFailed": "上传失败", + "api.uploadFailedStatus": "上传失败({status})", + "api.networkError": "网络错误,上传失败", + "api.exportFailed": "导出失败", + + "common.edit": "编辑", + "common.delete": "删除", + "common.actions": "操作", + "common.name": "名称", + "common.grade": "适用学段", + "common.description": "简介", + "common.provider": "开课方", + "common.msgSaved": "已保存修改", + "common.msgSaveFailed": "保存失败", + "common.msgDeleted": "已删除", + "common.msgDeleteFailed": "删除失败", + "common.confirmDelete": "删除“{name}”?", + "courses.add": "新增课程", + "courses.editTitle": "编辑课程 · {name}", + "courses.name": "课程名称", + "courses.url": "课程链接", + "courses.urlTooltip": "视频课程或课程主页地址,学生端点击后在新窗口打开", + "courses.intro": "在线课程只维护视频/课程链接,不上传电子版;电子版文件请在教材管理中维护。", + "courses.providerExample": "例如:Khan Academy", + "courses.gradeExample": "例如:高中 / 大学", + "courses.deleteHint": "已关联到知识点的该课程记录会一并移除。", + "courses.msgCreated": "已新增课程", + + "users.created": "用户已创建,学习档案已自动初始化", + "users.msgCreateFailed": "创建失败", + "users.msgResetFailed": "重置失败", + "users.msgOpFailed": "操作失败", + "users.msgEnabled": "账号已启用", + "users.msgDisabled": "账号已停用", + "users.msgRoleAdmin": "已调整为管理员", + "users.msgRoleStudent": "已调整为普通用户", + "users.wipeTitle": "清空所有学习过程数据?", + "users.wipeContent": "会删除全部用户的答题记录、错题、掌握度与每日反馈,题库和教材保留。该操作不可撤销。", + "users.wipeOk": "确认清空", + "users.username": "用户名", + "users.displayName": "显示名", + "users.role": "角色", + "users.status": "状态", + "users.enabled": "启用", + "users.disabled": "停用", + "users.setStudent": "设为学生", + "users.setAdmin": "设为管理员", + "users.noSelfDemote": "不能降低自己的管理员权限", + "users.resetPassword": "重置密码", + "users.analytics": "学习分析", + "users.noLearningData": "管理员账号不参与学习,没有学习数据", + "users.hint": "停用账号后该账号无法登录,历史数据保留;学习分析按账号查看该学生的掌握度诊断。", + "users.create": "新建用户", + "users.wipe": "清空学习数据", + "users.createIntro": "新建的账号默认是学生;管理员拥有全部管理权限,但本身不产生学习数据。", + "users.usernameExample": "字母、数字或下划线", + "users.displayNameExample": "选填,默认同用户名", + "users.initialPassword": "初始密码", + "users.resetTitle": "重置 {name} 的密码", + "users.resetIntro": "重置后该账号需用新密码登录,已保存的阅读进度与练习记录不受影响。", + "users.newPassword": "新密码", + "settings.oldPasswordRequired": "修改密码需要填写原密码", + "settings.newPasswordRequired": "修改密码需要填写新密码", + "settings.passwordTooShort": "新密码至少 6 位", + "settings.passwordMismatch": "两次输入的新密码不一致", + "settings.nicknameRequired": "昵称不能为空", + "settings.saved": "个人设置已保存", + "settings.msgFailed": "修改失败", + "settings.exportFilename": "我的数学学习档案.json", + "settings.exported": "学习档案已导出", + "settings.importFailed": "导入失败", + "settings.accountPanel": "账号信息", + "settings.nickname": "用户昵称", + "settings.nicknameExample": "登录信息中显示的昵称", + "settings.changePassword": "修改密码(可选)", + "settings.oldPassword": "原密码", + "settings.confirmPassword": "确认新密码", + "settings.save": "保存设置", + "settings.profilePanel": "学习档案", + "settings.profileHint": "导出会把当前账号的掌握度、练习记录、错题本与每日完成状态保存为 JSON 文件;导入是恢复式操作,会用档案内容替换当前学习数据。", + "settings.export": "导出档案", + "settings.import": "导入档案", + "settings.importWarning": "导入会覆盖当前学习数据,建议先导出备份。", + + "records.correct": "回答正确", + "records.incorrect": "回答错误", + "records.colTime": "时间", + "records.colTraining": "训练", + "records.colTotal": "题量", + "records.colCorrect": "正确", + "records.colRate": "正确率", + "records.wrongN": "错 {n} 题", + "records.allCorrect": "全对", + "records.expandHint": "展开任意记录可查看逐题明细", + "records.empty": "还没有练习记录,从一次章节测试开始", + "records.detailPending": "逐题明细尚未加载完成。", + "errors.colRound": "轮次 / 题号", + "errors.colQuestion": "题目", + "errors.colKnowledge": "知识点", + "errors.colDiagnosis": "诊断", + "errors.colStatus": "状态", + "errors.colDate": "日期", + "errors.legacyNoDetail": "旧版无明细", + "errors.empty": "还没有错题,保持状态,或去做一轮章节测试", + "errors.legacyHint": "该条错题来自旧版本,没有保存题目明细;新提交的错误答案会自动带逐题详情。", + "daily.ratingExplain": "还需要讲解", + "daily.ratingMostly": "基本掌握", + "daily.ratingFully": "已经完全掌握", + "daily.ratingSaved": "今日章节反馈已保存", + "daily.submitFailed": "提交失败", + "daily.taskDone": "今日任务已完成", + "daily.recommended": "今日推荐章节", + "daily.streak": "连续 {n} 天", + "daily.completedToday": "今日已完成", + "daily.notCompletedToday": "今日未完成", + "daily.yourRating": "你的章节反馈:{rating}", + "daily.confirmed": "已确认", + "daily.startTest": "先做本章测试", + "daily.submitFeedback": "完成并提交章节反馈", + "daily.empty": "还没有可练习的章节,请先在教材课程/题库管理中补充题目。", + "daily.ratingGroupLabel": "本章掌握度自评", + "daily.ratingExplainDesc": "概念和例题都需要再讲一遍", + "daily.ratingMostlyDesc": "多数会做,个别步骤还不稳", + "daily.ratingFullyDesc": "能独立做对,可以进入下一章", + "daily.stepLearn": "学习本章", + "daily.stepTest": "本章测试", + "daily.stepFeedback": "提交反馈", + "daily.submitHint": "提交后今日任务标记完成,之后仍可继续做本章测试。", + "daily.confirmTitle": "确认完成今日任务?", + "daily.confirmDesc": "{chapter} · 自评:{rating}", + "daily.confirmOk": "确认提交", + "daily.doneAt": "完成于 {time}", + "daily.streakUp": "连续学习 {from} → {to} 天", + "daily.milestone": "已连续 {n} 天学习,这份坚持比一次分数更重要。", + "daily.editRating": "修改今日自评", + "daily.saveRating": "保存修改", + "daily.nextStep": "下一步", + "daily.retest": "再做本章测试", + "daily.openMap": "查看知识地图", + "chapterTest.selectChapterRequired": "请选择章节", + "chapterTest.title": "选择测试章节", + "chapterTest.reshuffle": "换一套", + "chapterTest.textbookPlaceholder": "选择教材", + "chapterTest.chapterPlaceholder": "选择章节", + "chapterTest.noQuestions": "本章暂无题目,请先在题库管理生成", + "chapterTest.fewQuestions": "本章仅有 {n} 题,已全部组入", + "chapterTest.logic": "组题逻辑:薄弱知识点优先 → 近期错题优先 → 已做过题目降权 → 轮换扰动,“换一套”不会重复同一批题。", + "dashboard.courseName": "函数和图像(盖尔范德丛书)", + "dashboard.currentCourse": "当前课程:《{course}》", + "dashboard.nextTask": "下一步任务", + "dashboard.masterySummary": "掌握度概览", + "dashboard.masteryAvg": "平均掌握度 · {n} 个知识点", + "dashboard.weakest": "最需要加强的知识点", + "dashboard.openMap": "查看知识地图", + "dashboard.startTest": "开始章节测试", + "dashboard.viewDaily": "查看今日任务", + "reader.sessionExpired": "登录已过期,请重新登录", + "reader.downloadFailed": "电子书下载失败({status})", + "reader.pdfFailed": "PDF 打开失败", + "reader.epubFailed": "EPUB 打开失败", + + "knowledge.relContainsOut": "下辖知识点", + "knowledge.relContainsIn": "所属分类", + "knowledge.relPrereqIn": "先修知识点", + "knowledge.relPrereqOut": "后续知识点", + "knowledge.relRelated": "相关知识点", + "knowledge.masteryTitle": "知识点掌握度", + "knowledge.bandAll": "全部", + "knowledge.emptyBand": "该档暂无知识点", + "knowledge.hint": "点击任意知识点查看定义、关联知识点与教材章节", + "knowledge.empty": "还没有掌握度数据,完成一次章节测试后会按知识图谱记录掌握度", + "knowledge.detailTitle": "知识点详情", + "knowledge.detailTitleNamed": "{name} · 知识点详情", + "knowledge.domainTag": "{domain}数学", + "knowledge.definition": "定义", + "knowledge.noDefinition": "(暂无定义,可在“知识图谱管理”中补充该知识点的描述)", + "knowledge.mastery": "掌握度", + "knowledge.chapterCount": "覆盖章节", + "knowledge.questionCount": "关联题目", + "knowledge.noRelated": "暂无关联知识点", + "knowledge.chaptersSection": "关联教材章节", + "knowledge.noChapters": "暂无章节引用该知识点", + "knowledge.questionsN": "{n} 道题", + "knowledge.testChapter": "本章测试", + "knowledge.resourcesSection": "关联视频 / 在线课程", + "knowledge.noResources": "暂无关联视频;管理员可在“知识图谱管理”中为知识点添加课程资源", + "llm.unnamed": "未命名通道", + "llm.msgSaved": "通道“{name}”已保存", + "llm.msgCreated": "通道“{name}”已创建", + "llm.msgSaveFailed": "保存失败", + "llm.msgTestFailed": "测试失败", + "llm.msgDefault": "已将“{name}”设为默认通道", + "llm.msgDefaultFailed": "设置失败", + "llm.msgDeleted": "通道已删除", + "llm.name": "通道名称", + "llm.defaultTag": "默认", + "llm.providerModel": "服务商 / 模型", + "llm.temperatureShort": "温度", + "llm.keySaved": "已保存", + "llm.keyMissing": "未配置", + "llm.setDefault": "设为默认", + "llm.alreadyDefault": "当前已是默认通道", + "llm.test": "测试", + "llm.deleteTitle": "删除模型通道“{name}”?", + "llm.deleteHint": "删除后历史题目不受影响,但生成新题将无法使用该通道。", + "common.refresh": "刷新", + "llm.add": "新增通道", + "llm.hintTitle": "多通道模型配置", + "llm.hintPrefix": "每个通道独立保存服务商、Base URL、模型、API Key 与温度;通道名称建议为“服务商 · 模型”。题库自动生成默认使用", + "llm.hintDefaultWord": "“默认”", + "llm.hintSuffix": "通道,也可在“题库管理 → 生成新题”时临时切换。API Key 仅保存在本地数据库,回显只显示末四位。", + "llm.empty": "还没有模型通道", + "llm.editTitle": "编辑模型通道 · {name}", + "llm.createTitle": "新增模型通道", + "llm.nameTooltip": "建议格式:服务商 · 模型", + "llm.namePlaceholder": "例如:阿里千问(百炼) · qwen-plus", + "llm.baseUrlField": "服务地址", + "llm.model": "模型名称", + "llm.apiKeyKeep": "API Key(留空保持不变)", + "llm.apiKey": "API Key", + "llm.apiKeyHint": "已保存 {preview},留空则不修改", + "llm.apiKeyClear": "清空此通道已保存的 API Key", + "llm.temperature": "温度(0–2)", + "llm.maxTokens": "单次输出上限 tokens", + "llm.maxTokensTooltip": "留空使用系统默认:普通题 1600,带图题 3000", + "llm.autoPlaceholder": "留空自动", + "llm.willSave": "将保存为:{provider} · {model}", + + "graph.nodeTitle": "{name}(章 {chapters} · 题 {questions})", + "graph.domainElementary": "初等数学", + "graph.domainAdvanced": "高等数学", + "graph.domainPlaceholder": "选择知识领域", + "graph.allCategories": "全部(完整图谱)", + "graph.add": "新增知识点", + "graph.addRelation": "添加关系", + "graph.detailTitle": "{name} · 详情", + "graph.fieldDomain": "领域", + "graph.fieldCategory": "分类", + "graph.fieldUsage": "引用", + "graph.usage": "{chapters} 个章节 / {questions} 道题", + "graph.fieldDescription": "描述", + "graph.childrenSection": "包含的子知识点", + "graph.none": "无", + "graph.prereqSection": "前置要求(学习本点前先掌握)", + "graph.followersSection": "被作为前置(后续可学)", + "graph.coursePlaceholder": "选择课程/视频", + "graph.coursePlaceholderEmpty": "暂无在线课程", + "graph.link": "关联", + "graph.editTitle": "编辑知识点 · {name}", + "graph.createTitle": "新增知识点", + "graph.categoryPlaceholder": "例如:函数与图像", + "graph.relationTitle": "添加知识点关系", + "graph.relationIntro": "起点与终点的方向由关系类型决定:「前置」表示起点是终点的基础,「包含」表示起点包含终点。", + "graph.source": "起点(前置/父知识点)", + "graph.sourceRequired": "起点知识点", + "graph.target": "终点(后继/子知识点)", + "graph.targetRequired": "终点知识点", + "graph.relationField": "关系类型", + "graph.uncategorized": "未分类", + "graph.relContains": "包含", + "graph.relPrereq": "前置", + "graph.relRelated": "相关", + "graph.msgUpdated": "知识点已更新", + "graph.msgCreated": "知识点已新增", + "graph.deleteTitle": "删除“{name}”?", + "graph.deleteHint": "已被章节/题目引用的节点不允许删除。", + "graph.msgRelationAdded": "关系已添加", + "graph.deleteRelationTitle": "删除该关系?", + "graph.msgRelationDeleted": "关系已删除", + "graph.pickCourseFirst": "请先选择要关联的课程/视频", + "graph.msgLinked": "已关联资源", + "graph.msgLinkFailed": "关联失败", + "graph.unlinkTitle": "解除该资源关联?", + "graph.msgUnlinked": "已解除关联", + "graph.msgUnlinkFailed": "解除失败", + + "bank.colQuestion": "题目", + "bank.colSource": "来源 / 章节", + "bank.generated": "AI 生成", + "bank.builtin": "内置题目", + "bank.noChapter": "未挂章节", + "bank.colDifficulty": "难度", + "bank.colUsage": "使用状态", + "bank.usedN": "已使用 {n} 次", + "bank.unused": "未使用", + "bank.deleteBlocked": "已被使用,不能删除,只能编辑", + "bank.deleteTitle": "删除这道题?", + "bank.allTextbooks": "全部教材/课程", + "bank.allChapters": "全部章节", + "bank.generate": "按章节生成新题", + "bank.hintPrefix": "生成的题目会经 JSON 校验后入库并按章节归入题库;模型设置在", + "bank.hintLink": "模型配置", + "bank.hintSuffix": "。", + "bank.taskTitle": "生成任务 #{id}", + "bank.emptyFiltered": "当前筛选条件下没有题目,换个章节或清除筛选", + "bank.empty": "题库还是空的,先按章节生成新题", + "bank.editTitle": "编辑题目 #{id}", + "bank.editIntro": "该题已有作答记录,修改内容不会影响历史记录。", + "bank.stem": "题干", + "bank.stemPlaceholder": "支持 $LaTeX$ 与 ![图注](图片地址)", + "bank.optionsNeeded": "需要 4 个非空且不重复的选项", + "bank.option": "选项 {letter}", + "bank.optionPlaceholder": "支持 $LaTeX$ 与图片", + "bank.correct": "正确选项", + "bank.difficultyBasic": "基础", + "bank.difficultyMedium": "中等", + "bank.difficultyHard": "提高", + "bank.knowledgeMulti": "知识点(从知识图谱选择,可多选)", + "bank.knowledgeRequired": "请至少选择一个知识点", + "bank.knowledgePlaceholder": "与章节编辑使用同一知识图谱库", + "bank.explanation": "解析", + "bank.generateIntro": "选好教材章节后由大模型生成,生成结果会先进入待审核列表。", + "bank.stepTextbook": "1. 选择教材", + "bank.textbookField": "教材", + "bank.textbookFirst": "请先选择教材", + "bank.stepChapter": "2. 选择章节", + "bank.chapterField": "章节", + "bank.chapterAfterTextbook": "选择教材后再选择章节", + "bank.count": "数量", + "bank.knowledgeOptional": "知识点(可选,可多选)", + "bank.knowledgeOptionalTooltip": "与章节编辑共用知识图谱节点;可多选", + "bank.pickChapterKnowledge": "请选择该章节知识点", + "bank.noChapterKnowledge": "该章节暂未从知识图谱配置知识点", + "bank.channel": "模型通道", + "bank.channelTooltip": "默认使用模型配置中的默认通道", + "bank.channelLoading": "正在读取模型通道…", + "bank.channelPlaceholder": "使用默认通道(可切换)", + "bank.defaultSuffix": "(默认)", + "bank.needFigure": "需要配图(AI 根据题目自动生成图像,无需指定图片资源)", + "bank.instructions": "出题说明(可选)", + "bank.instructionsTooltip": "可补充对题干、难度或图像内容的额外要求", + "bank.instructionsPlaceholder": "例如:图形要清晰标注坐标轴与关键点", + "bank.msgGenerateFailed": "生成失败", + "bank.msgUpdated": "题目 {id} 已更新", + + "bank.generateStart": "开始生成", + + "catalog.msgCreated": "已新增教材", + "catalog.ebookPicked": "已选择电子版,保存教材后自动上传", + "catalog.ebookUpdatedPages": "电子版已更新,共 {pages} 页", + "catalog.ebookUpdated": "电子版已更新", + "catalog.ebookDeleted": "电子版已删除", + "catalog.chapterNameRequired": "请先输入章节名称", + "catalog.msgChapterAdded": "章节已添加", + "catalog.msgAddFailed": "添加失败", + "catalog.msgChapterSaved": "章节已保存", + "catalog.msgChapterDeleted": "章节已删除", + "catalog.colChapters": "章节数", + "catalog.colEbook": "电子版", + "catalog.pagesN": "{n} 页", + "catalog.pagesUnknown": "篇幅未知", + "catalog.ebookNone": "未上传", + "catalog.actChapters": "章节", + "catalog.actRead": "阅读", + "catalog.deleteBlocked": "该书下有题目,不能删除,只能修改", + "catalog.deleteTitle": "删除“{name}”?", + "catalog.deleteHint": "将同时删除该书全部章节,已挂章节的题目会解除关联但题目保留。", + "catalog.add": "新增教材", + "catalog.editTitle": "编辑教材 · {name}", + "catalog.ebookUrl": "电子教材链接", + "catalog.ebookUrlTooltip": "电子教材的官方页面或在线阅读地址;有电子版文件时以文件为准", + "catalog.uploadedOn": "{date} 上传", + "catalog.pendingUpload": "待上传:{name}", + "catalog.noEbook": "还没有电子版文件", + "catalog.replaceEbook": "替换电子版", + "catalog.openReader": "打开阅读", + "catalog.deleteEbookTitle": "删除该书的电子版文件?", + "catalog.deleteEbookHint": "教材与章节保留,只移除已上传的文件。", + "catalog.deleteEbook": "删除电子版", + "catalog.chapterDrawer": "{name} · 章节管理", + "catalog.addChapter": "添加章节", + "catalog.chapterName": "章节名称", + "catalog.chapterNamePlaceholder": "例如:第1章 例子", + "catalog.chapterSummary": "章节内容提示", + "catalog.chapterSummaryPlaceholder": "用于模型生成题目时参考", + "catalog.aiToc": "AI 整理章节", + "catalog.aiTocTitle": "AI 整理章节 · {name}", + "catalog.emptyChapters": "还没有章节,可在上方手动添加,或用 AI 整理目录", + "catalog.questionUnit": "题", + "catalog.actBank": "题库", + "catalog.chapterDeleteBlocked": "该章节下有题目,不能删除,只能编辑", + "catalog.chapterDeleteTitle": "删除该章节?", + "catalog.chapterDeleteHint": "删除章节后,关联题目将解除章节绑定", + "catalog.chapterEditTitle": "编辑章节 · {name}", + "catalog.chapterSummaryPlaceholder2": "描述本章内容,供题库生成时参考", + "catalog.chapterKnowledge": "本章知识点(从知识图谱选择,可多选)", + "catalog.chapterKnowledgeTooltip": "与全局知识图谱节点关联,生成新题时按这些节点出题", + "catalog.chapterKnowledgePlaceholder": "从知识图谱中选择知识点", + "catalog.tocData": "目录参考数据", + "catalog.tocDataPlaceholder": "例如:\n- 译者序\n- 前言\n- 引言\n- 第1章 例子\n...", + "catalog.tocDataRequired": "目录数据", + "catalog.tocDataTooltip": "把你在 AI 对话中得到的该书章节目录粘贴到这里", + "catalog.tocDataStart": "开始整理", + + "catalog.uploadEbook": "上传电子版", + /* 后端固定枚举文案:这些是界面标签而非用户数据(书名、知识点名等仍保持原样) */ + "be.metricTotal": "累计题目", + "be.metricAccuracy": "累计正确率", + "be.metricWeakPoints": "薄弱知识点", + "be.metricStage": "当前阶段", + "be.metricHistoryAccuracy": "历史正确率", + "be.metricLastAttempt": "最近一次", + "be.metricErrorCount": "错题数量", + "be.metricNeedIntervention": "需重点干预", + "be.stageL2": "L2 基础应用", + "be.statusMastered": "已掌握", + "be.statusMostly": "基本掌握", + "be.statusNeedsWork": "待加强", + "be.statusFocus": "重点", + "be.actionPriority": "优先强化", + "be.actionKeepPractice": "继续练习", + "be.actionKeepReview": "保持复习", + "be.statusNotLearned": "未学习", + "be.statusToReview": "待复习", + + /* ---------- 界面补充 · 后端固定取值 · 后端动态文案(zh 为后端原文,英文界面按键重渲染) ---------- */ + "lang.zh": "中", + "lang.en": "EN", + "role.nameAdmin": "管理员", + "role.nameStudent": "普通用户", + "provider.openai": "OpenAI", + "provider.deepseek": "DeepSeek", + "provider.qwen": "阿里千问(百炼)", + "provider.openaiCompatible": "OpenAI 兼容(自定义)", + "api.needLogin": "请先登录", + "api.sessionExpired": "登录已失效", + "api.userUnavailable": "用户不可用", + "api.noPermission": "没有权限执行该操作", + "api.badCredentials": "用户名或密码错误", + "api.accountDisabled": "账号已被停用", + "api.noRoleAssigned": "账号未分配角色", + "api.oldPasswordWrong": "原密码不正确", + "api.passwordChanged": "密码已更新,下次登录请使用新密码。", + "api.nicknameRequired": "昵称不能为空", + "api.usernameTaken": "用户名已存在", + "api.roleUnsupported": "不支持的角色", + "api.cannotDisableSelf": "不能停用自己的账号", + "api.cannotRemoveAdminSelf": "不能移除自己的管理员角色", + "api.userNotFound": "用户不存在", + "api.roleNotFound": "角色不存在", + "api.passwordReset": "已重置 {username} 的密码。", + "api.learningDataCleared": "所有学习过程数据已清空,可从新的章节任务重新开始", + "api.textbookNameTaken": "同名教材已存在", + "api.textbookNotFound": "教材不存在", + "api.textbookHasQuestions": "该书下还有 {count} 道题目,不能删除教材,只能修改", + "api.chapterNotFound": "章节不存在", + "api.chapterHasQuestions": "该章节下有 {count} 道题目,不能删除,只能修改章节", + "api.chaptersAdded": "已新增 {count} 个章节", + "api.chaptersAddedSkipped": "已新增 {count} 个章节,跳过重复章节 {skipped} 个", + "api.chaptersWithNote": "{note}:已新增 {count} 个章节", + "api.chaptersWithNoteSkipped": "{note}:已新增 {count} 个章节,跳过重复章节 {skipped} 个", + "api.chaptersAiDone": "AI 整理完成:已新增 {count} 个章节并关联知识图谱", + "api.chaptersAiDoneSkipped": "AI 整理完成:已新增 {count} 个章节并关联知识图谱,跳过重复 {skipped} 个", + "api.tocByIsbn": "已按 ISBN 查询到的正式章节名生成摘要", + "api.tocByMeta": "已结合书名 / ISBN / 作者信息自动获取章节", + "api.generateFailed": "生成失败:{exc}", + "api.organizeFailed": "整理失败:{exc}", + "api.courseNameTaken": "同名课程已存在", + "api.courseNotFound": "课程不存在", + "api.courseUrlRequired": "请填写课程链接", + "api.ebookEmptyFile": "上传的文件是空的", + "api.ebookFormatUnsupported": "只支持 PDF 与 EPUB 两种格式", + "api.ebookFormatMismatch": "文件内容与扩展名不符,请上传真实的 PDF / EPUB 文件", + "api.ebookTooLarge": "电子书超过 500MB 上限", + "api.ebookNotUploaded": "该书还没有上传电子书", + "api.ebookFileMissing": "电子书文件不存在", + "api.knowledgeNotFound": "知识点不存在", + "api.knowledgeNameTaken": "知识点名称已存在", + "api.knowledgeInUse": "该知识点已关联 {count} 个章节/题目,不能删除;可改名或先解除引用", + "api.relationSelf": "不能连接到自身", + "api.relationNotFound": "关系不存在", + "api.relationExists": "该关系已存在", + "api.relationTypeInvalid": "关系类型仅支持 包含/前置/相关", + "api.resourceEmpty": "资源标题与链接不能为空", + "api.resourceLinkNotFound": "资源链接不存在", + "api.resourceLinked": "该资源已关联到本知识点", + "api.questionNotFound": "题目不存在", + "api.questionPartlyMissing": "部分题目不存在", + "api.questionInUse": "该题目已被使用 {count} 次,不能删除;只能编辑题目内容", + "api.optionsInvalid": "选项必须是 4 个非空且不重复的内容", + "api.knowledgeRequired": "请至少选择一个知识点", + "api.knowledgePartlyMissing": "部分所选知识点不存在,请刷新知识图谱后重试", + "api.resourceOwnerNotFound": "教材/课程不存在", + "api.modeUnknown": "未知的练习模式", + "api.chapterIdRequired": "章节测试需要指定 chapter_id", + "api.duplicateSubmission": "同一道题提交了多次", + "api.questionChapterMismatch": "提交的题目不属于所选章节,请重新开始测试", + "api.recordNotFound": "练习记录不存在", + "api.analyticsForbidden": "没有权限查看该用户的学习分析", + "api.channelNotFound": "模型通道不存在", + "api.channelNameTaken": "通道名称已存在,请换一个名称", + "api.channelMissing": "指定的模型通道不存在", + "api.channelNone": "尚未配置任何模型通道", + "api.channelNoDefaultCatalog": "尚未配置模型通道,请先在“模型配置”新增并设为默认", + "api.channelNoDefaultBank": "尚未配置模型通道,请先到“模型配置”新增并设为默认", + "api.channelIncomplete": "模型通道未完整配置,请先补全并测试", + "api.channelNoApiKey": "通道尚未保存 API Key,请先配置", + "api.channelIncompleteShort": "通道缺少 Base URL 或模型名称,请先补全", + "api.providerUnsupported": "不支持的模型服务商", + "api.taskTypeUnsupported": "不支持的任务类型", + "api.taskNotFound": "任务不存在", + "api.testFailed": "测试失败:{exc}", + "api.testOk": "连接成功,模型已回复:“{reply}”", + "api.taskStarted": "任务已开始,正在调用模型…", + "api.taskGenerating": "正在生成题目并解析结构…", + "api.taskGenerated": "成功生成 {count} 道题", + "api.taskToc": "正在生成章节目录…", + "api.taskTocAi": "正在解析目录素材并关联知识图谱…", + "api.archiveImported": "学习档案导入成功。", + "api.archiveDateformat": "日期格式应为 YYYY-MM-DD", + "api.archiveNoKnowledge": "档案中缺少 knowledge 字段", + "api.archiveKnowledgeItem": "knowledge 项缺少 name 或 mastery", + "api.archiveRecordError": "记录格式错误:{exc}", + "api.archiveErrorFormat2": "错题格式错误:{exc}", + "api.archiveItemFormat": "第 {index} 题明细格式不正确", + "api.archiveItemMissing": "第 {index} 题明细缺少题干或选项", + "api.archiveItemCorrect": "第 {index} 题明细 correct_index 不是数字", + "api.archiveItemSelected": "第 {index} 题明细 selected 不是数字", + "api.archiveRecordFields": "练习记录需要 4 个字段", + "api.archiveRecordFormat": "练习记录格式不正确", + "api.archiveErrorFields": "错题需要 3 个字段", + "api.archiveErrorFormat": "错题格式不正确", + /* 学习建议 / 今日推荐(后端 recommendation 服务生成的固定文案) */ + "api.planNotice": "系统根据已有答题记录,将“{focus}”设为当前强化重点。", + "api.planFocusDefault": "当前知识点", + "api.planStepFocus": "① 重点强化 {names}:巩固定义 → 点的对应 → 图像性质判断。", + "api.planStepExtra": "② {name}:从表达式判断图像性质,补做针对性小题。", + "api.planStepChapterTest": "② 再完成一次章节测试,检验本轮掌握情况。", + "api.planStepSpacedReview": "③ 间隔复习:在后续测试中穿插旧知识,防止遗忘。", + "api.planStepKeepPace": "① 保持当前节奏,进入下一章节的学习。", + "api.planStepWeeklyTest": "② 每周做一次章节测试,维持各知识点掌握度。", + "api.planStepClearErrors": "③ 错题清零后开始新主题,建立更完整的知识地图。", + "api.dailyReasonDone": "今日章节已完成", + "api.dailyReasonUnstarted": "你还没有练习过这一章,建议从本章开始建立基础", + "api.dailyReasonWeak": "该章知识点掌握度较低,需要优先强化", + "api.errorDiagnosisFallback": "需要复习该知识点", + /* 模型调用 / 生成任务的失败原因(后端抛出的固定文本) */ + "api.llmConfigIncomplete": "请先完整填写模型配置(地址、API Key、模型名)。", + "api.llmConnectFailed": "无法连接模型服务:{exc}", + "api.llmHttpError": "模型服务返回 {status}:{detail}", + "api.llmNoVisibleText": "模型没有返回可见文本(finish_reason={reason})。若模型启用了推理模式,请提高 max_tokens 或缩短提示。", + "api.llmBadMessage": "模型返回格式不符合 Chat Completions 规范", + "api.llmRefused": "模型拒绝回答:{refusal}", + "api.llmApiKeyMissing": "尚未配置大模型 API Key,请先到“模型配置”页面保存并测试", + "api.jsonMissing": "模型没有返回 JSON,请重试或调整模型", + "api.jsonInvalid": "模型返回的 JSON 格式不正确,请重试或调整模型", + "api.jsonInvalidDetail": "模型返回的 JSON 格式不正确({msg},位置 {pos}),请重试或调整模型", + "api.jsonRetryExhausted": "模型连续 3 次未返回合法 JSON,最后一次:{error}", + "api.modelNoChapters": "模型返回内容中没有 chapters 列表", + "api.organizeNoChapters": "整理结果中没有 chapters 列表", + "api.modelChapterBadItem": "模型返回的章节格式不正确", + "api.modelChapterNameEmpty": "模型返回的章节名称为空", + "api.modelChapterNotInToc": "模型返回的章节“{name}”不在 ISBN 查询到的正式目录中,请重试", + "api.modelStemEmpty": "模型返回的题干为空", + "api.modelOptionCount": "选项必须是 4 个非空选项,实际为 {count} 个", + "api.modelOptionDuplicated": "选项存在重复", + "api.modelCorrectNotNumber": "correct_index 必须是数字", + "api.modelCorrectOutOfRange": "correct_index 超出选项范围", + "api.modelNoQuestions": "模型返回内容中没有 questions 列表", + "api.modelFigureFailed": "模型未能生成本题有效配图,请尝试减少题量或更换模型通道", + "api.modelSvgFailed": "模型未能为本题生成有效 SVG,请更换模型通道或关闭配图", + "api.taskKindUnsupported": "不支持的任务类型:{kind}", + "api.knowledgeSomeMissing": "部分知识点不存在", + "api.ebookFileInvalid": "{name} 不是有效的 {format} 文件", +} as const; + +export type MsgKey = keyof typeof zh; + +const en: Record = { + "app.name": "Math Learning", + "app.tagline": "Gelfand-style thinking training · personalized learning & question bank", + + "section.learning": "Learning", + "section.resources": "Resources", + "section.content": "Content & Bank", + "section.system": "Administration", + "section.account": "Account", + + "nav.dashboard": "Overview", + "nav.dashboard.description": "Mastery, progress and next steps", + "nav.knowledge": "Knowledge map", + "nav.knowledge.description": "Browse mastery for every knowledge point, filterable by level", + "nav.test": "Chapter test", + "nav.test.description": "Build a set from any chapter and review explanations", + "nav.errors": "Mistakes", + "nav.errors.description": "Wrong answers with per-question diagnosis", + "nav.records": "Practice log", + "nav.records.description": "Accuracy and details of every session", + "nav.daily": "Today", + "nav.daily.description": "Recommended chapters and feedback for today", + "nav.resources": "Textbooks / Courses", + "nav.resources.description": "Textbook chapters and online course links", + "nav.reader": "E-book reader", + "nav.reader.description": "Read textbook e-books online, position saved automatically", + "nav.settings": "Settings", + "nav.settings.description": "Display name and password", + "nav.users": "Users", + "nav.users.description": "Accounts, roles and learning data", + "nav.catalog": "Textbooks", + "nav.catalog.description": "Maintain textbooks, chapters and e-book files", + "nav.courses": "Courses", + "nav.courses.description": "Maintain video course links and grade levels", + "nav.bank": "Question bank", + "nav.bank.description": "Maintain questions and generate them by chapter", + "nav.llm": "Model config", + "nav.llm.description": "Model channels and the default generation channel", + "nav.graph": "Knowledge graph", + "nav.graph.description": "Knowledge points, relations and course links", + + "role.admin": "Admin", + "role.student": "Student", + + "account.settings": "Account settings", + "account.personal": "Personal settings", + "account.logout": "Sign out", + "account.menu": "Account menu", + + "header.collapse": "Collapse menu", + "header.expand": "Expand menu", + "header.closeMenu": "Close menu", + "header.collapseAria": "Collapse navigation", + "header.expandAria": "Expand navigation", + "theme.toDark": "Switch to dark mode", + "theme.toLight": "Switch to light mode", + "lang.label": "Language", + + "common.noData": "No data", + "common.total": "{n} items", + "common.totalRows": "{n} rows", + "common.save": "Save", + "common.cancel": "Cancel", + "common.create": "Create", + "common.chapterFallback": "Full chapter", + "common.enterField": "Enter {field}", + "common.fieldMin": "{field} must be at least {min} characters", + + "login.username": "Username", + "login.password": "Password", + "login.submit": "Sign in", + "login.success": "Signed in", + "login.failed": "Sign-in failed", + "login.passwordPlaceholder": "Enter your password", + "login.hint": "Demo accounts: admin / admin123 (admin), student / student123 (student)", + + "resources.textbook": "Textbooks", + "resources.course": "Courses", + "resources.author": "Author", + "resources.publisher": "Publisher", + "resources.edition": "Edition", + "resources.provider": "Provider", + "resources.grade": "Level", + "resources.chapterOf": "{name} · Chapters", + "resources.chapters": "Chapters", + "resources.questionCount": "{n} questions", + "resources.chapterCount": "{n} chapters", + "resources.startTest": "Test this chapter", + "resources.noChapters": "This textbook has no chapters yet", + "resources.emptyBooks": "No textbooks yet — add them in “Textbooks”", + "resources.emptyCourses": "No online courses or videos yet", + "resources.openCourse": "Open course", + "resources.readOnline": "Read online", + "resources.readProgress": "{n}% read", + + "reader.exit": "Back", + "reader.loading": "Opening the e-book…", + "reader.failed": "Failed to open the e-book", + "reader.notEbook": "No e-book is available for this resource", + "reader.page": "Page {page} of {total}", + "reader.prev": "Previous page", + "reader.next": "Next page", + "reader.fitWidth": "Fit width", + "reader.zoomIn": "Zoom in", + "reader.zoomOut": "Zoom out", + "reader.fontSmaller": "Smaller text", + "reader.fontLarger": "Larger text", + "reader.toc": "Contents", + "reader.noToc": "This e-book has no table of contents", + "reader.section": "Section {page} of {total}", + + "ebook.read": "Read the book", + "ebook.open": "Open ebook", + "ebook.openAt": "Open at p.{page}", + "ebook.page": "Ebook location", + "ebook.pageAt": "p. {page}", + "ebook.pageHint": "Page number for PDF, section index for EPUB; 0 means no jump", + "ebook.pageSaved": "Ebook location saved", + "ebook.pageSaveFailed": "Failed to save the ebook location", + "reader.keysHint": "Use ← → to turn pages", + "common.loadFailed": "Failed to load", + "common.retry": "Retry", + "options.yourAnswer": "Your answer", + "options.correctAnswer": "Correct answer", + "flow.progressPrefix": "Question", + "flow.progressSuffix": "", + "flow.prev": "Previous", + "flow.next": "Next", + "flow.submit": "Submit test", + "flow.unfinished": "Some questions are still unanswered. Go back and finish them before submitting.", + "flow.submitFailed": "Submission failed", + "question.legacy": "This record predates per-question details. New attempts store them automatically.", + "question.stem": "Question", + "question.options": "Options", + "question.analysis": "Explanation", + "result.score": "Score: {score} / {total}", + "result.summary": "Accuracy {accuracy}%. Your mastery and mistake notebook have been updated.", + "result.review": "Question review", + "result.correct": "Correct", + "result.wrong": "Wrong", + "result.retry": "Test again", + "result.back": "Back to overview", + "analytics.knowledge": "Knowledge point", + "analytics.mastery": "Mastery", + "analytics.errorCount": "Mistakes", + "analytics.action": "Suggested action", + "analytics.diagnosis": "Knowledge diagnosis", + "analytics.diagnosisEmpty": "No practice data yet. Finish a chapter test and the diagnosis shows up here.", + "api.requestFailed": "Request failed ({status})", + "api.uploadFailed": "Upload failed", + "api.uploadFailedStatus": "Upload failed ({status})", + "api.networkError": "Network error. Upload failed.", + "api.exportFailed": "Export failed", + "common.edit": "Edit", + "common.delete": "Delete", + "common.actions": "Actions", + "common.name": "Name", + "common.grade": "Grade level", + "common.description": "Description", + "common.provider": "Provider", + "common.msgSaved": "Changes saved", + "common.msgSaveFailed": "Failed to save", + "common.msgDeleted": "Deleted", + "common.msgDeleteFailed": "Failed to delete", + "common.confirmDelete": "Delete “{name}”?", + "courses.add": "New course", + "courses.editTitle": "Edit course · {name}", + "courses.name": "Course name", + "courses.url": "Course link", + "courses.urlTooltip": "Address of the video or course page. It opens in a new tab for students.", + "courses.intro": "Online courses only keep video/course links. Upload e-book files under Textbooks.", + "courses.providerExample": "e.g. Khan Academy", + "courses.gradeExample": "e.g. High school / College", + "courses.deleteHint": "Links from knowledge points to this course are removed as well.", + "courses.msgCreated": "Course created", + "users.created": "User created. A learning profile was initialised.", + "users.msgCreateFailed": "Failed to create", + "users.msgResetFailed": "Failed to reset", + "users.msgOpFailed": "Operation failed", + "users.msgEnabled": "Account enabled", + "users.msgDisabled": "Account disabled", + "users.msgRoleAdmin": "Promoted to admin", + "users.msgRoleStudent": "Changed to student", + "users.wipeTitle": "Clear all learning activity?", + "users.wipeContent": "Deletes every answer record, mistake, mastery score and daily feedback for all users. Questions and textbooks are kept. This cannot be undone.", + "users.wipeOk": "Clear everything", + "users.username": "Username", + "users.displayName": "Display name", + "users.role": "Role", + "users.status": "Status", + "users.enabled": "Active", + "users.disabled": "Disabled", + "users.setStudent": "Make student", + "users.setAdmin": "Make admin", + "users.noSelfDemote": "You can't remove your own admin role", + "users.resetPassword": "Reset password", + "users.analytics": "Learning analytics", + "users.noLearningData": "Admin accounts don't produce learning data", + "users.hint": "A disabled account can't sign in, but its history is kept. Learning analytics opens a student's mastery diagnosis per account.", + "users.create": "New user", + "users.wipe": "Clear learning data", + "users.createIntro": "New accounts are students by default. Admins have every management permission but produce no learning data.", + "users.usernameExample": "Letters, numbers or underscores", + "users.displayNameExample": "Optional, defaults to the username", + "users.initialPassword": "Initial password", + "users.resetTitle": "Reset password for {name}", + "users.resetIntro": "The account must sign in with the new password. Reading progress and practice records are unaffected.", + "users.newPassword": "New password", + "settings.oldPasswordRequired": "Enter your current password to change it", + "settings.newPasswordRequired": "Enter a new password to change it", + "settings.passwordTooShort": "The new password needs at least 6 characters", + "settings.passwordMismatch": "The two new passwords don't match", + "settings.nicknameRequired": "Nickname can't be empty", + "settings.saved": "Settings saved", + "settings.msgFailed": "Failed to update", + "settings.exportFilename": "my-math-profile.json", + "settings.exported": "Learning profile exported", + "settings.importFailed": "Failed to import", + "settings.accountPanel": "Account", + "settings.nickname": "Nickname", + "settings.nicknameExample": "Nickname shown after sign-in", + "settings.changePassword": "Change password (optional)", + "settings.oldPassword": "Current password", + "settings.confirmPassword": "Confirm new password", + "settings.save": "Save settings", + "settings.profilePanel": "Learning profile", + "settings.profileHint": "Export saves this account's mastery, practice records, mistake notebook and daily status as JSON. Import restores data by replacing what is there now with the file.", + "settings.export": "Export profile", + "settings.import": "Import profile", + "settings.importWarning": "Importing overwrites current learning data — export a backup first.", + "records.correct": "Correct", + "records.incorrect": "Incorrect", + "records.colTime": "Date", + "records.colTraining": "Session", + "records.colTotal": "Questions", + "records.colCorrect": "Correct", + "records.colRate": "Accuracy", + "records.wrongN": "{n} wrong", + "records.allCorrect": "All correct", + "records.expandHint": "Expand any record for per-question details", + "records.empty": "No practice log yet — start with a chapter test", + "records.detailPending": "Per-question details are still loading.", + "errors.colRound": "Round / No.", + "errors.colQuestion": "Question", + "errors.colKnowledge": "Knowledge", + "errors.colDiagnosis": "Diagnosis", + "errors.colStatus": "Status", + "errors.colDate": "Date", + "errors.legacyNoDetail": "Legacy · no details", + "errors.empty": "No mistakes yet — keep it up, or run a chapter test", + "errors.legacyHint": "This entry comes from an older version without stored question details; newly submitted wrong answers carry per-question details.", + "daily.ratingExplain": "Needs another explanation", + "daily.ratingMostly": "Mostly understood", + "daily.ratingFully": "Fully understood", + "daily.ratingSaved": "Today's chapter feedback saved", + "daily.submitFailed": "Submit failed", + "daily.taskDone": "Today's task is done", + "daily.recommended": "Today's recommended chapter", + "daily.streak": "{n}-day streak", + "daily.completedToday": "Completed today", + "daily.notCompletedToday": "Not completed today", + "daily.yourRating": "Your chapter feedback: {rating}", + "daily.confirmed": "Confirmed", + "daily.startTest": "Take the chapter test first", + "daily.submitFeedback": "Complete and submit feedback", + "daily.empty": "No chapters available for practice yet. Add questions in Textbooks or Question Bank first.", + "daily.ratingGroupLabel": "Your mastery check", + "daily.ratingExplainDesc": "Concepts and examples both need another pass", + "daily.ratingMostlyDesc": "Mostly solvable, a few steps still shaky", + "daily.ratingFullyDesc": "Solved independently, ready for the next chapter", + "daily.stepLearn": "Study", + "daily.stepTest": "Chapter test", + "daily.stepFeedback": "Submit feedback", + "daily.submitHint": "Submitting marks today's task done; you can still take the chapter test afterwards.", + "daily.confirmTitle": "Complete today's task?", + "daily.confirmDesc": "{chapter} · Feedback: {rating}", + "daily.confirmOk": "Submit", + "daily.doneAt": "Completed at {time}", + "daily.streakUp": "Streak {from} → {to} days", + "daily.milestone": "{n} days in a row — that consistency matters more than one score.", + "daily.editRating": "Edit today's feedback", + "daily.saveRating": "Save changes", + "daily.nextStep": "Next", + "daily.retest": "Take this chapter's test again", + "daily.openMap": "Open knowledge map", + "chapterTest.selectChapterRequired": "Please select a chapter", + "chapterTest.title": "Choose a chapter to test", + "chapterTest.reshuffle": "Reshuffle", + "chapterTest.textbookPlaceholder": "Select textbook", + "chapterTest.chapterPlaceholder": "Select chapter", + "chapterTest.noQuestions": "No questions in this chapter yet — generate them in Question Bank", + "chapterTest.fewQuestions": "Only {n} questions in this chapter, all included", + "chapterTest.logic": "Question mix: weak knowledge points first → recent mistakes first → answered questions down-weighted → rotation, so “Reshuffle” never repeats the same set.", + "dashboard.courseName": "Functions and Graphs (Gelfand Series)", + "dashboard.currentCourse": "Current course: {course}", + "dashboard.nextTask": "Next task", + "dashboard.masterySummary": "Mastery overview", + "dashboard.masteryAvg": "Average mastery · {n} points", + "dashboard.weakest": "Points that need the most work", + "dashboard.openMap": "Open knowledge map", + "dashboard.startTest": "Start chapter test", + "dashboard.viewDaily": "View today's task", + "reader.sessionExpired": "Session expired, please sign in again", + "reader.downloadFailed": "E-book download failed ({status})", + "reader.pdfFailed": "Failed to open the PDF", + "reader.epubFailed": "Failed to open the EPUB", + "knowledge.relContainsOut": "Child knowledge points", + "knowledge.relContainsIn": "Parent category", + "knowledge.relPrereqIn": "Prerequisite points", + "knowledge.relPrereqOut": "Follow-up points", + "knowledge.relRelated": "Related knowledge points", + "knowledge.masteryTitle": "Mastery by knowledge point", + "knowledge.bandAll": "All", + "knowledge.emptyBand": "No knowledge points in this band", + "knowledge.hint": "Click any knowledge point for its definition, links and textbook chapters", + "knowledge.empty": "No mastery data yet — finish a chapter test and it will be tracked on the knowledge graph", + "knowledge.detailTitle": "Knowledge point", + "knowledge.detailTitleNamed": "{name} · Knowledge point", + "knowledge.domainTag": "{domain}", + "knowledge.definition": "Definition", + "knowledge.noDefinition": "(No definition yet — add a description in Knowledge graph.)", + "knowledge.mastery": "Mastery", + "knowledge.chapterCount": "Chapters covered", + "knowledge.questionCount": "Linked questions", + "knowledge.noRelated": "No related knowledge points", + "knowledge.chaptersSection": "Linked textbook chapters", + "knowledge.noChapters": "No chapters reference this knowledge point", + "knowledge.questionsN": "{n} questions", + "knowledge.testChapter": "Test this chapter", + "knowledge.resourcesSection": "Linked videos / online courses", + "knowledge.noResources": "No linked videos — admins can add course resources to a knowledge point in Knowledge graph", + "llm.unnamed": "Unnamed channel", + "llm.msgSaved": "Channel “{name}” saved", + "llm.msgCreated": "Channel “{name}” created", + "llm.msgSaveFailed": "Save failed", + "llm.msgTestFailed": "Test failed", + "llm.msgDefault": "“{name}” is now the default channel", + "llm.msgDefaultFailed": "Update failed", + "llm.msgDeleted": "Channel deleted", + "llm.name": "Channel name", + "llm.defaultTag": "Default", + "llm.providerModel": "Provider / Model", + "llm.temperatureShort": "Temp", + "llm.keySaved": "Saved", + "llm.keyMissing": "Not set", + "llm.setDefault": "Set as default", + "llm.alreadyDefault": "Already the default channel", + "llm.test": "Test", + "llm.deleteTitle": "Delete model channel “{name}”?", + "llm.deleteHint": "Existing questions are unaffected, but new questions can no longer use this channel.", + "common.refresh": "Refresh", + "llm.add": "New channel", + "llm.hintTitle": "Multi-channel model setup", + "llm.hintPrefix": "Each channel stores its own provider, Base URL, model, API key and temperature; name it “Provider · Model”. Question generation uses the ", + "llm.hintDefaultWord": "default", + "llm.hintSuffix": " channel unless you switch it in Question Bank → Generate new questions. API keys are stored in the local database only, and only the last four characters are echoed back.", + "llm.empty": "No model channels yet", + "llm.editTitle": "Edit model channel · {name}", + "llm.createTitle": "New model channel", + "llm.nameTooltip": "Suggested format: Provider · Model", + "llm.namePlaceholder": "e.g. Alibaba Qwen (Bailian) · qwen-plus", + "llm.baseUrlField": "Base URL", + "llm.model": "Model name", + "llm.apiKeyKeep": "API Key (leave blank to keep)", + "llm.apiKey": "API Key", + "llm.apiKeyHint": "Stored {preview} — leave blank to keep it", + "llm.apiKeyClear": "Clear the stored API key for this channel", + "llm.temperature": "Temperature (0–2)", + "llm.maxTokens": "Max output tokens per call", + "llm.maxTokensTooltip": "Leave blank for system defaults: 1600 for text, 3000 for image questions", + "llm.autoPlaceholder": "Auto if blank", + "llm.willSave": "Will be saved as: {provider} · {model}", + "graph.nodeTitle": "{name} (ch {chapters} · q {questions})", + "graph.domainElementary": "Elementary mathematics", + "graph.domainAdvanced": "Advanced mathematics", + "graph.domainPlaceholder": "Select a domain", + "graph.allCategories": "All (full graph)", + "graph.add": "New knowledge point", + "graph.addRelation": "Add relation", + "graph.detailTitle": "{name} · Details", + "graph.fieldDomain": "Domain", + "graph.fieldCategory": "Category", + "graph.fieldUsage": "Used by", + "graph.usage": "{chapters} chapters / {questions} questions", + "graph.fieldDescription": "Description", + "graph.childrenSection": "Contained knowledge points", + "graph.none": "None", + "graph.prereqSection": "Prerequisites (master these first)", + "graph.followersSection": "Prerequisite for (learn these next)", + "graph.coursePlaceholder": "Select a course / video", + "graph.coursePlaceholderEmpty": "No online courses yet", + "graph.link": "Link", + "graph.editTitle": "Edit knowledge point · {name}", + "graph.createTitle": "New knowledge point", + "graph.categoryPlaceholder": "e.g. Functions and graphs", + "graph.relationTitle": "Add knowledge relation", + "graph.relationIntro": "Direction depends on the relation type: “Prerequisite” means the source is the foundation of the target; “Contains” means the source includes the target.", + "graph.source": "Source (prerequisite / parent)", + "graph.sourceRequired": "source knowledge point", + "graph.target": "Target (successor / child)", + "graph.targetRequired": "target knowledge point", + "graph.relationField": "Relation type", + "graph.uncategorized": "Uncategorized", + "graph.relContains": "Contains", + "graph.relPrereq": "Prerequisite", + "graph.relRelated": "Related", + "graph.msgUpdated": "Knowledge point updated", + "graph.msgCreated": "Knowledge point created", + "graph.deleteTitle": "Delete “{name}”?", + "graph.deleteHint": "Nodes referenced by chapters or questions cannot be deleted.", + "graph.msgRelationAdded": "Relation added", + "graph.deleteRelationTitle": "Delete this relation?", + "graph.msgRelationDeleted": "Relation deleted", + "graph.pickCourseFirst": "Select a course or video to link first", + "graph.msgLinked": "Resource linked", + "graph.msgLinkFailed": "Link failed", + "graph.unlinkTitle": "Remove this resource link?", + "graph.msgUnlinked": "Link removed", + "graph.msgUnlinkFailed": "Unlink failed", + "bank.colQuestion": "Question", + "bank.colSource": "Source / Chapter", + "bank.generated": "AI-generated", + "bank.builtin": "Built-in", + "bank.noChapter": "No chapter", + "bank.colDifficulty": "Difficulty", + "bank.colUsage": "Usage", + "bank.usedN": "Used {n} times", + "bank.unused": "Unused", + "bank.deleteBlocked": "Used questions cannot be deleted, only edited", + "bank.deleteTitle": "Delete this question?", + "bank.allTextbooks": "All textbooks / courses", + "bank.allChapters": "All chapters", + "bank.generate": "Generate by chapter", + "bank.hintPrefix": "Generated questions are validated as JSON, stored, and filed by chapter. Model settings are in ", + "bank.hintLink": "Model channels", + "bank.hintSuffix": ".", + "bank.taskTitle": "Generation task #{id}", + "bank.emptyFiltered": "No questions match the current filter — try another chapter or clear it", + "bank.empty": "The bank is empty — generate questions by chapter first", + "bank.editTitle": "Edit question #{id}", + "bank.editIntro": "This question already has attempts; edits will not change past records.", + "bank.stem": "Stem", + "bank.stemPlaceholder": "Supports $LaTeX$ and ![caption](image url)", + "bank.optionsNeeded": "Provide 4 non-empty, distinct options", + "bank.option": "Option {letter}", + "bank.optionPlaceholder": "Supports $LaTeX$ and images", + "bank.correct": "Correct option", + "bank.difficultyBasic": "Basic", + "bank.difficultyMedium": "Intermediate", + "bank.difficultyHard": "Advanced", + "bank.knowledgeMulti": "Knowledge points (multi-select from the graph)", + "bank.knowledgeRequired": "Select at least one knowledge point", + "bank.knowledgePlaceholder": "Same knowledge graph as chapter editing", + "bank.explanation": "Explanation", + "bank.generateIntro": "Pick a textbook chapter and the model writes questions; results start in the review queue.", + "bank.stepTextbook": "1. Select textbook", + "bank.textbookField": "textbook", + "bank.textbookFirst": "Select a textbook first", + "bank.stepChapter": "2. Select chapter", + "bank.chapterField": "chapter", + "bank.chapterAfterTextbook": "Choose the textbook first", + "bank.count": "Count", + "bank.knowledgeOptional": "Knowledge points (optional, multi-select)", + "bank.knowledgeOptionalTooltip": "Shares knowledge-graph nodes with chapter editing; multi-select allowed", + "bank.pickChapterKnowledge": "Select knowledge points for this chapter", + "bank.noChapterKnowledge": "This chapter has no knowledge points configured yet", + "bank.channel": "Model channel", + "bank.channelTooltip": "Uses the default channel unless you change it", + "bank.channelLoading": "Loading model channels…", + "bank.channelPlaceholder": "Use the default channel (switchable)", + "bank.defaultSuffix": " (default)", + "bank.needFigure": "Needs a figure (the model generates the image, no asset required)", + "bank.instructions": "Extra instructions (optional)", + "bank.instructionsTooltip": "Optionally add requirements for the stem, difficulty or figure", + "bank.instructionsPlaceholder": "e.g. Label the axes and key points clearly", + "bank.msgGenerateFailed": "Generation failed", + "bank.msgUpdated": "Question {id} updated", + "bank.generateStart": "Generate", + "catalog.msgCreated": "Textbook created", + "catalog.ebookPicked": "E-book selected — it uploads once the textbook is saved", + "catalog.ebookUpdatedPages": "E-book updated — {pages} pages", + "catalog.ebookUpdated": "E-book updated", + "catalog.ebookDeleted": "E-book file deleted", + "catalog.chapterNameRequired": "Enter a chapter name first", + "catalog.msgChapterAdded": "Chapter added", + "catalog.msgAddFailed": "Add failed", + "catalog.msgChapterSaved": "Chapter saved", + "catalog.msgChapterDeleted": "Chapter deleted", + "catalog.colChapters": "Chapters", + "catalog.colEbook": "E-book", + "catalog.pagesN": "{n} pages", + "catalog.pagesUnknown": "Length unknown", + "catalog.ebookNone": "Not uploaded", + "catalog.actChapters": "Chapters", + "catalog.actRead": "Read", + "catalog.deleteBlocked": "Textbooks with questions cannot be deleted, only edited", + "catalog.deleteTitle": "Delete “{name}”?", + "catalog.deleteHint": "This also deletes every chapter of the book; linked questions are kept but unbound.", + "catalog.add": "New textbook", + "catalog.editTitle": "Edit textbook · {name}", + "catalog.ebookUrl": "E-book link", + "catalog.ebookUrlTooltip": "Official page or online reading URL; an uploaded file takes precedence", + "catalog.uploadedOn": "uploaded on {date}", + "catalog.pendingUpload": "Pending upload: {name}", + "catalog.noEbook": "No e-book file yet", + "catalog.replaceEbook": "Replace e-book", + "catalog.openReader": "Open reader", + "catalog.deleteEbookTitle": "Delete this e-book file?", + "catalog.deleteEbookHint": "The textbook and chapters stay; only the uploaded file is removed.", + "catalog.deleteEbook": "Delete e-book", + "catalog.chapterDrawer": "{name} · Chapters", + "catalog.addChapter": "Add chapter", + "catalog.chapterName": "Chapter name", + "catalog.chapterNamePlaceholder": "e.g. Chapter 1 Examples", + "catalog.chapterSummary": "Chapter summary", + "catalog.chapterSummaryPlaceholder": "Used as context when the model writes questions", + "catalog.aiToc": "AI outline", + "catalog.aiTocTitle": "AI outline · {name}", + "catalog.emptyChapters": "No chapters yet — add them above, or build the outline with AI", + "catalog.questionUnit": "questions", + "catalog.actBank": "Question bank", + "catalog.chapterDeleteBlocked": "Chapters with questions cannot be deleted, only edited", + "catalog.chapterDeleteTitle": "Delete this chapter?", + "catalog.chapterDeleteHint": "Linked questions are kept but lose their chapter binding.", + "catalog.chapterEditTitle": "Edit chapter · {name}", + "catalog.chapterSummaryPlaceholder2": "Describe this chapter; used when generating questions", + "catalog.chapterKnowledge": "Knowledge points (multi-select from the graph)", + "catalog.chapterKnowledgeTooltip": "Bound to knowledge-graph nodes; generated questions follow them", + "catalog.chapterKnowledgePlaceholder": "Pick knowledge points from the graph", + "catalog.tocData": "Outline source data", + "catalog.tocDataPlaceholder": "For example:\n- Translator preface\n- Preface\n- Introduction\n- Chapter 1 Examples\n...", + "catalog.tocDataRequired": "outline data", + "catalog.tocDataTooltip": "Paste the chapter outline you obtained from an AI chat", + "catalog.tocDataStart": "Build outline", + "catalog.uploadEbook": "Upload e-book", + "be.metricTotal": "Questions Answered", + "be.metricAccuracy": "Overall Accuracy", + "be.metricWeakPoints": "Weak Points", + "be.metricStage": "Current Stage", + "be.metricHistoryAccuracy": "Historical Accuracy", + "be.metricLastAttempt": "Last Attempt", + "be.metricErrorCount": "Mistakes", + "be.metricNeedIntervention": "Needs Attention", + "be.stageL2": "L2 Application", + "be.statusMastered": "Mastered", + "be.statusMostly": "Mostly Mastered", + "be.statusNeedsWork": "Needs Work", + "be.statusFocus": "Priority", + "be.actionPriority": "Prioritize", + "be.actionKeepPractice": "Keep Practicing", + "be.actionKeepReview": "Keep Reviewing", + "be.statusNotLearned": "Not Started", + "be.statusToReview": "To Review", + + "lang.zh": "中", + "lang.en": "EN", + "role.nameAdmin": "Admin", + "role.nameStudent": "User", + "provider.openai": "OpenAI", + "provider.deepseek": "DeepSeek", + "provider.qwen": "Qwen (Model Studio)", + "provider.openaiCompatible": "OpenAI-compatible (custom)", + "api.needLogin": "Please sign in first.", + "api.sessionExpired": "Your session has expired. Please sign in again.", + "api.userUnavailable": "This account is unavailable.", + "api.noPermission": "You don't have permission for this action.", + "api.badCredentials": "Incorrect username or password.", + "api.accountDisabled": "This account has been disabled.", + "api.noRoleAssigned": "This account has no role assigned.", + "api.oldPasswordWrong": "Your current password is incorrect.", + "api.passwordChanged": "Password updated. Use it the next time you sign in.", + "api.nicknameRequired": "Nickname is required.", + "api.usernameTaken": "That username already exists.", + "api.roleUnsupported": "Unsupported role.", + "api.cannotDisableSelf": "You cannot disable your own account.", + "api.cannotRemoveAdminSelf": "You cannot remove your own admin role.", + "api.userNotFound": "User not found.", + "api.roleNotFound": "Role not found.", + "api.passwordReset": "Password reset for {username}.", + "api.learningDataCleared": "All learning activity has been cleared. Start again from a new chapter task.", + "api.textbookNameTaken": "A textbook with this name already exists.", + "api.textbookNotFound": "Textbook not found.", + "api.textbookHasQuestions": "This textbook still has {count} questions, so it can be edited but not deleted.", + "api.chapterNotFound": "Chapter not found.", + "api.chapterHasQuestions": "This chapter has {count} questions, so it can be edited but not deleted.", + "api.chaptersAdded": "Added {count} chapters.", + "api.chaptersAddedSkipped": "Added {count} chapters, skipped {skipped} duplicates.", + "api.chaptersWithNote": "{note}: added {count} chapters.", + "api.chaptersWithNoteSkipped": "{note}: added {count} chapters, skipped {skipped} duplicates.", + "api.chaptersAiDone": "AI cleanup done: added {count} chapters and linked them to the knowledge graph.", + "api.chaptersAiDoneSkipped": "AI cleanup done: added {count} chapters and linked them to the graph, skipped {skipped} duplicates.", + "api.tocByIsbn": "Summaries generated from the official chapter names found by ISBN.", + "api.tocByMeta": "Chapters fetched automatically from the title, ISBN and authors.", + "api.generateFailed": "Generation failed: {exc}", + "api.organizeFailed": "Cleanup failed: {exc}", + "api.courseNameTaken": "A course with this name already exists.", + "api.courseNotFound": "Course not found.", + "api.courseUrlRequired": "Please provide the course link.", + "api.ebookEmptyFile": "The uploaded file is empty.", + "api.ebookFormatUnsupported": "Only PDF and EPUB files are supported.", + "api.ebookFormatMismatch": "The file content does not match its extension. Upload a real PDF or EPUB file.", + "api.ebookTooLarge": "The e-book exceeds the 500MB limit.", + "api.ebookNotUploaded": "This textbook has no e-book yet.", + "api.ebookFileMissing": "The e-book file does not exist.", + "api.knowledgeNotFound": "Knowledge point not found.", + "api.knowledgeNameTaken": "A knowledge point with this name already exists.", + "api.knowledgeInUse": "This knowledge point is linked to {count} chapters/questions; rename it or remove the links first.", + "api.relationSelf": "A knowledge point cannot be linked to itself.", + "api.relationNotFound": "Relation not found.", + "api.relationExists": "This relation already exists.", + "api.relationTypeInvalid": "Relation type must be containment, prerequisite or related.", + "api.resourceEmpty": "Resource title and link are required.", + "api.resourceLinkNotFound": "Resource link not found.", + "api.resourceLinked": "This resource is already linked to the knowledge point.", + "api.questionNotFound": "Question not found.", + "api.questionPartlyMissing": "Some questions no longer exist.", + "api.questionInUse": "This question has been used {count} times, so it can be edited but not deleted.", + "api.optionsInvalid": "Provide 4 non-empty, distinct options.", + "api.knowledgeRequired": "Select at least one knowledge point.", + "api.knowledgePartlyMissing": "Some selected knowledge points no longer exist. Refresh the graph and try again.", + "api.resourceOwnerNotFound": "Textbook or course not found.", + "api.modeUnknown": "Unknown practice mode.", + "api.chapterIdRequired": "A chapter test needs a chapter id.", + "api.duplicateSubmission": "The same question was submitted more than once.", + "api.questionChapterMismatch": "The submitted questions do not belong to the selected chapter. Restart the test.", + "api.recordNotFound": "Practice record not found.", + "api.analyticsForbidden": "You cannot view this user's learning analytics.", + "api.channelNotFound": "Model channel not found.", + "api.channelNameTaken": "That channel name is taken. Pick another one.", + "api.channelMissing": "The selected model channel does not exist.", + "api.channelNone": "No model channel has been configured yet.", + "api.channelNoDefaultCatalog": "No model channel is configured. Add one in Model Settings and set it as default.", + "api.channelNoDefaultBank": "No model channel is configured. Add one in Model Settings and set it as default.", + "api.channelIncomplete": "The model channel is not fully configured. Complete it and run a test first.", + "api.channelNoApiKey": "This channel has no saved API key. Configure it first.", + "api.channelIncompleteShort": "The channel is missing a Base URL or model name. Complete it first.", + "api.providerUnsupported": "Unsupported model provider.", + "api.taskTypeUnsupported": "Unsupported task type.", + "api.taskNotFound": "Task not found.", + "api.testFailed": "Test failed: {exc}", + "api.testOk": "Connected. The model replied: “{reply}”", + "api.taskStarted": "Task started, calling the model…", + "api.taskGenerating": "Generating questions and parsing them…", + "api.taskGenerated": "Generated {count} questions.", + "api.taskToc": "Generating the chapter outline…", + "api.taskTocAi": "Parsing the outline and linking it to the knowledge graph…", + "api.archiveImported": "Learning archive imported.", + "api.archiveDateformat": "Date format must be YYYY-MM-DD.", + "api.archiveNoKnowledge": "The archive is missing its knowledge field.", + "api.archiveKnowledgeItem": "A knowledge entry is missing name or mastery.", + "api.archiveRecordError": "Record format error: {exc}", + "api.archiveErrorFormat2": "Mistake format error: {exc}", + "api.archiveItemFormat": "Question detail #{index} is malformed.", + "api.archiveItemMissing": "Question detail #{index} is missing its stem or options.", + "api.archiveItemCorrect": "Question detail #{index} has a non-numeric correct_index.", + "api.archiveItemSelected": "Question detail #{index} has a non-numeric selected.", + "api.archiveRecordFields": "A practice record needs 4 fields.", + "api.archiveRecordFormat": "The practice record is malformed.", + "api.archiveErrorFields": "A mistake entry needs 3 fields.", + "api.archiveErrorFormat": "The mistake entry is malformed.", + "api.planNotice": "Based on your answer history, “{focus}” is now the current focus for reinforcement.", + "api.planFocusDefault": "the current knowledge point", + "api.planStepFocus": "① Reinforce {names}: solidify definitions -> match points -> judge graph properties.", + "api.planStepExtra": "② {name}: read graph properties off the expression and do targeted drills.", + "api.planStepChapterTest": "② Take another chapter test to check this round of mastery.", + "api.planStepSpacedReview": "③ Spaced review: mix earlier knowledge into later tests to prevent forgetting.", + "api.planStepKeepPace": "① Keep your current pace and move on to the next chapter.", + "api.planStepWeeklyTest": "② Do one chapter test every week to keep all knowledge points steady.", + "api.planStepClearErrors": "③ Once your mistakes are cleared, start a new topic to complete the knowledge map.", + "api.dailyReasonDone": "Today's chapter is already done", + "api.dailyReasonUnstarted": "You have not practised this chapter yet, so it is a good place to build the basics", + "api.dailyReasonWeak": "Mastery of this chapter's knowledge points is low, so it needs priority reinforcement", + "api.errorDiagnosisFallback": "This knowledge point needs review", + "api.llmConfigIncomplete": "Please complete the model configuration (base URL, API key, model name) first.", + "api.llmConnectFailed": "Cannot reach the model service: {exc}", + "api.llmHttpError": "Model service returned {status}: {detail}", + "api.llmNoVisibleText": "The model returned no visible text (finish_reason={reason}). If reasoning mode is on, raise max_tokens or shorten the prompt.", + "api.llmBadMessage": "The model response does not follow the Chat Completions format", + "api.llmRefused": "The model refused to answer: {refusal}", + "api.llmApiKeyMissing": "No model API key is configured yet. Save and test one on the Model settings page first", + "api.jsonMissing": "The model returned no JSON. Retry or switch the model", + "api.jsonInvalid": "The JSON returned by the model is malformed. Retry or switch the model", + "api.jsonInvalidDetail": "The JSON returned by the model is malformed ({msg}, position {pos}). Retry or switch the model", + "api.jsonRetryExhausted": "The model failed to return valid JSON 3 times, last error: {error}", + "api.modelNoChapters": "The model response has no chapters list", + "api.organizeNoChapters": "The organized result has no chapters list", + "api.modelChapterBadItem": "The chapter format returned by the model is invalid", + "api.modelChapterNameEmpty": "The model returned an empty chapter name", + "api.modelChapterNotInToc": "The chapter “{name}” returned by the model is not in the official table of contents found by ISBN. Please retry", + "api.modelStemEmpty": "The model returned an empty question stem", + "api.modelOptionCount": "There must be 4 non-empty options, got {count}", + "api.modelOptionDuplicated": "The options contain duplicates", + "api.modelCorrectNotNumber": "correct_index must be a number", + "api.modelCorrectOutOfRange": "correct_index is outside the option range", + "api.modelNoQuestions": "The model response has no questions list", + "api.modelFigureFailed": "The model could not produce a valid figure for this question. Try fewer questions or another channel", + "api.modelSvgFailed": "The model could not generate a valid SVG for this question. Switch channel or turn figures off", + "api.taskKindUnsupported": "Unsupported task type: {kind}", + "api.knowledgeSomeMissing": "Some knowledge points do not exist", + "api.ebookFileInvalid": "{name} is not a valid {format} file", +}; + +let currentLang: Lang = "zh"; + +/** 供无法使用 Hook 的模块(如 rules 的校验文案)读取当前语言。 */ +export function getLang(): Lang { + return currentLang; +} + +/** 模块级取文案:语言跟随 PrefsProvider,切换语言后立即生效。 */ +export function tr(key: MsgKey, params?: Record): string { + return makeT(currentLang)(key, params); +} + +/** 由 PrefsProvider 写入,保证模块级文案与界面语言一致。 */ +export function setGlobalLang(lang: Lang): void { + currentLang = lang; +} + +export type TFn = (key: MsgKey, params?: Record) => string; + + +/** + * 后端下发的固定枚举文案(指标标题、掌握度状态、建议动作)→ 当前语言。 + * 只覆盖后端写死的标签;数据本身(书名、章节、知识点名、题目正文)原样显示。 + */ +const BACKEND_ENUM: Record = { + 累计题目: "be.metricTotal", + 累计正确率: "be.metricAccuracy", + 薄弱知识点: "be.metricWeakPoints", + 当前阶段: "be.metricStage", + 历史正确率: "be.metricHistoryAccuracy", + 最近一次: "be.metricLastAttempt", + 错题数量: "be.metricErrorCount", + 需重点干预: "be.metricNeedIntervention", + "L2 基础应用": "be.stageL2", + 已掌握: "be.statusMastered", + 基本掌握: "be.statusMostly", + 待加强: "be.statusNeedsWork", + 重点: "be.statusFocus", + 优先强化: "be.actionPriority", + 继续练习: "be.actionKeepPractice", + 保持复习: "be.actionKeepReview", + 未学习: "be.statusNotLearned", + 待复习: "be.statusToReview", + // 学段、关联类型(表单提交值与后端字段同名) + 初等: "graph.domainElementary", + 高等: "graph.domainAdvanced", + 包含: "graph.relContains", + 前置: "graph.relPrereq", + 相关: "graph.relRelated", +}; + +export function enumLabel(t: TFn, raw: string | number): string { + const key = BACKEND_ENUM[String(raw)]; + return key ? t(key) : String(raw); +} + +export function makeT(lang: Lang): TFn { + return (key, params) => { + let text: string = (lang === "en" ? en[key] : zh[key]) ?? zh[key]; + if (params) { + for (const [name, value] of Object.entries(params)) { + text = text.split(`{${name}}`).join(String(value)); + } + } + return text; + }; +} + +/* ------------------------------------------------- 后端固定取值 / 动态文案 */ + +/** + * 后端字段里的固定取值(学段、关系类型、自评档位)。 + * 取值本身要原样提交回后端,界面只翻译展示标签,所以映射集中在这里。 + */ +export const DOMAIN_VALUES = ["初等", "高等"] as const; +export const RELATION_VALUES = ["包含", "前置", "相关"] as const; +export const RATING_VALUES = ["再次讲解", "基本掌握", "完全掌握"] as const; + +const RATING_LABEL: Record = { + 再次讲解: "daily.ratingExplain", + 基本掌握: "daily.ratingMostly", + 完全掌握: "daily.ratingFully", +}; + +/** 关联类型 + 方向 → 「包含它的知识点」这类说明文案(知识地图用)。 */ +const RELATED_LABEL: Record = { + "包含:out": "knowledge.relContainsOut", + "包含:in": "knowledge.relContainsIn", + "前置:in": "knowledge.relPrereqIn", + "前置:out": "knowledge.relPrereqOut", + "相关:out": "knowledge.relRelated", + "相关:in": "knowledge.relRelated", +}; + +/** 模型服务商标识 → 展示名(后端下发的是中文标签,按 id 重新取词)。 */ +const PROVIDER_LABEL: Record = { + openai: "provider.openai", + deepseek: "provider.deepseek", + qwen: "provider.qwen", + openai_compatible: "provider.openaiCompatible", +}; + +/** 角色代码 → 展示名(roles 表里存的是中文角色名,按 code 重新取词)。 */ +const ROLE_LABEL: Record = { + admin: "role.nameAdmin", + student: "role.nameStudent", +}; + +/** 自评档位文案。 */ +export function ratingLabel(t: TFn, value: string): string { + const key = RATING_LABEL[value]; + return key ? t(key) : value; +} + +/** 自评档位的补充说明:自评卡片用它解释每一档的含义。 */ +const RATING_DESC: Record = { + 再次讲解: "daily.ratingExplainDesc", + 基本掌握: "daily.ratingMostlyDesc", + 完全掌握: "daily.ratingFullyDesc", +}; + +/** 自评档位说明文案。 */ +export function ratingDescLabel(t: TFn, value: string): string { + const key = RATING_DESC[value]; + return key ? t(key) : ""; +} + +/** 关联类型 + 方向文案。 */ +export function relationDirectionLabel( + t: TFn, + relationType: string, + direction: string, +): string { + const key = RELATED_LABEL[`${relationType}:${direction}`]; + return key ? t(key) : relationType; +} + +/** 服务商展示名,未知标识回落后端标签。 */ +export function providerLabel(t: TFn, provider: string, fallback?: string): string { + const key = PROVIDER_LABEL[provider]; + return key ? t(key) : fallback || provider; +} + +/** 角色展示名,未知代码回落后端角色名。 */ +export function roleLabel(t: TFn, code: string, fallback?: string): string { + const key = ROLE_LABEL[code]; + return key ? t(key) : fallback || code; +} + +/** Select / TreeSelect 用的固定取值选项。 */ +export function enumOptions( + t: TFn, + values: readonly T[], +): Array<{ value: T; label: string }> { + return values.map((value) => ({ value, label: enumLabel(t, value) })); +} + +/** + * 后端动态文案(错误 detail、任务与操作结果里的 message): + * 后端固定输出中文,中文界面原样显示;英文界面按 zh 原文反查词条并重渲染参数。 + * 表里的词条都以 api. 开头,zh 值就是后端原文,{name} 是占位符。 + */ +type BackendTemplate = { key: MsgKey; names: string[]; re: RegExp }; + +const BACKEND_MESSAGES: BackendTemplate[] = (Object.keys(zh) as MsgKey[]) + .filter((key) => key.startsWith("api.")) + .map((key) => { + const names: string[] = []; + const source = zh[key] + .replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + .replace(/\\\{(\w+)\\\}/g, (_match, name: string) => { + names.push(name); + return "([\\s\\S]*?)"; + }); + return { key, names, re: new RegExp(`^${source}$`) }; + }); + +const BACKEND_EXACT = new Map( + BACKEND_MESSAGES.filter((item) => item.names.length === 0).map((item) => [ + zh[item.key], + item.key, + ]), +); + +/** 后端文案 → 当前语言;没登记过的原文原样返回。 */ +export function backendText(raw: string): string { + if (currentLang === "zh" || !raw) return raw; + const exact = BACKEND_EXACT.get(raw); + if (exact) return makeT(currentLang)(exact); + for (const item of BACKEND_MESSAGES) { + if (item.names.length === 0) continue; + const matched = raw.match(item.re); + if (!matched) continue; + const params: Record = {}; + item.names.forEach((name, index) => { + // 嵌套文案(如「测试失败:无法连接模型服务:…」)的参数同样反查翻译 + params[name] = backendText(matched[index + 1]); + }); + return makeT(currentLang)(item.key, params); + } + return raw; +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..693ac2e --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App"; +import "./styles.css"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/frontend/src/nav.tsx b/frontend/src/nav.tsx new file mode 100644 index 0000000..c14b356 --- /dev/null +++ b/frontend/src/nav.tsx @@ -0,0 +1,194 @@ +/** + * 导航唯一注册表:菜单、页面标题、页面说明、顶栏面包屑都来自这里, + * 避免同一个页面名在 Layout / 各页面标题里重复维护。 + * 名称存的是 i18n key,渲染时由调用方用 t() 解析。 + */ +import type { ReactNode } from "react"; +import type { MenuProps } from "antd"; +import type { MsgKey, TFn } from "./i18n"; +import { + ApartmentOutlined, + AppstoreOutlined, + BookOutlined, + DashboardOutlined, + DatabaseOutlined, + ExperimentOutlined, + FieldTimeOutlined, + FileTextOutlined, + PlayCircleOutlined, + ReadOutlined, + RobotOutlined, + SettingOutlined, + TeamOutlined, + ThunderboltOutlined, + WarningOutlined, +} from "@ant-design/icons"; + +export type ViewId = + | "dashboard" + | "knowledge" + | "test" + | "errors" + | "records" + | "daily" + | "resources" + | "reader" + | "settings" + | "users" + | "catalog" + | "courses" + | "bank" + | "llm" + | "graph"; + +interface NavMeta { + title: MsgKey; + /** 顶栏标题下方的一句话说明 */ + description: MsgKey; + icon: ReactNode; +} + +export const NAV_META: Record = { + dashboard: { + title: "nav.dashboard", + description: "nav.dashboard.description", + icon: , + }, + knowledge: { + title: "nav.knowledge", + description: "nav.knowledge.description", + icon: , + }, + test: { + title: "nav.test", + description: "nav.test.description", + icon: , + }, + errors: { + title: "nav.errors", + description: "nav.errors.description", + icon: , + }, + records: { + title: "nav.records", + description: "nav.records.description", + icon: , + }, + daily: { + title: "nav.daily", + description: "nav.daily.description", + icon: , + }, + resources: { + title: "nav.resources", + description: "nav.resources.description", + icon: , + }, + reader: { + title: "nav.reader", + description: "nav.reader.description", + icon: , + }, + settings: { + title: "nav.settings", + description: "nav.settings.description", + icon: , + }, + users: { + title: "nav.users", + description: "nav.users.description", + icon: , + }, + catalog: { + title: "nav.catalog", + description: "nav.catalog.description", + icon: , + }, + courses: { + title: "nav.courses", + description: "nav.courses.description", + icon: , + }, + bank: { + title: "nav.bank", + description: "nav.bank.description", + icon: , + }, + llm: { + title: "nav.llm", + description: "nav.llm.description", + icon: , + }, + graph: { + title: "nav.graph", + description: "nav.graph.description", + icon: , + }, +}; + +const LEARNING_SECTIONS: Array<{ label: MsgKey; items: ViewId[] }> = [ + { label: "section.learning", items: ["dashboard", "daily", "knowledge", "test", "errors", "records"] }, + { label: "section.resources", items: ["resources"] }, +]; + +const ADMIN_SECTIONS: Array<{ label: MsgKey; items: ViewId[] }> = [ + { label: "section.content", items: ["catalog", "courses", "bank", "graph"] }, + { label: "section.system", items: ["users", "llm"] }, +]; + +const SETTINGS_SECTION: MsgKey = "section.account"; + +/** 顶栏面包屑用的分区名(学习 / 内容与题库 / 系统管理 / 账号…)。 */ +export function sectionForView(view: ViewId, role: string, t: TFn): string { + if (view === "settings") return t(SETTINGS_SECTION); + const hit = sectionsForRole(role).find((section) => + section.items.includes(view), + ); + return hit ? t(hit.label) : ""; +} + +/** antd Menu 的 items 类型。 */ +export type MenuItems = NonNullable; + +function sectionsForRole(role: string) { + return role === "admin" ? ADMIN_SECTIONS : LEARNING_SECTIONS; +} + +function navItem(id: ViewId, t: TFn) { + return { key: id, icon: NAV_META[id].icon, label: t(NAV_META[id].title) }; +} + +/** + * 侧边栏菜单:管理员只暴露管理功能,学生只暴露学习功能。 + * 展开态按功能分组;收拢态摊平成一列图标(antd 收起时无法渲染分组标题), + * 组与组之间用分隔线保持同样的分组语义,悬停图标即出现文字提示。 + */ +export function menuForRole(role: string, collapsed: boolean, t: TFn): MenuItems { + const sections = sectionsForRole(role); + if (collapsed) { + const items: MenuItems = []; + sections.forEach((section, index) => { + if (index > 0) items.push({ type: "divider" as const }); + section.items.forEach((id) => items.push(navItem(id, t))); + }); + return items; + } + return sections.map((section) => ({ + type: "group" as const, + label: t(section.label), + children: section.items.map((id) => navItem(id, t)), + })); +} + +/** 当前角色可访问的视图,用于路由兜底。 */ +export function isAllowedView(view: ViewId, role: string): boolean { + // 阅读器不在菜单里,由「在线阅读」进入,两种角色都需要能打开 + if (view === "settings" || view === "reader") return true; + return sectionsForRole(role).some((section) => + section.items.includes(view), + ); +} + +export function defaultViewForRole(role: string): ViewId { + return role === "admin" ? "users" : "dashboard"; +} diff --git a/frontend/src/pages/CatalogManage.tsx b/frontend/src/pages/CatalogManage.tsx new file mode 100644 index 0000000..aabd7fd --- /dev/null +++ b/frontend/src/pages/CatalogManage.tsx @@ -0,0 +1,895 @@ +import { useMemo, useRef, useState } from "react"; +import { + Button, + Drawer, + Flex, + Form, + Input, + InputNumber, + Popconfirm, + Progress, + Select, + Tag, + TreeSelect, + Typography, + Upload, +} from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { + DatabaseOutlined, + DeleteOutlined, + EditOutlined, + PlusOutlined, + ReadOutlined, + RobotOutlined, + UploadOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { HeaderActions } from "../components/Layout"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { + CountTag, + DataRow, + DataRows, + DataTable, + EditorDrawer, + EmptyState, + FormRow, + KnowledgeTags, + Page, + Panel, + RowActions, + SubText, + halfItem, + rules, + useUi, +} from "../components/ui"; +import { DOMAIN_VALUES, backendText, enumLabel } from "../i18n"; +import { useT } from "../prefs"; +import { tagColor } from "../theme"; +import type { RowAction } from "../components/ui"; +import type { + ChapterItem, + LlmTaskResult, + Textbook, + TextbookCreatePayload, +} from "../types"; + +interface CatalogManageProps { + onOpenQuestions?: (textbookId: number, chapterId: number) => void; + /** 打开内置阅读器在线阅读电子书,page 为章节定位 */ + onReadOnline?: (textbookId: number, page?: number) => void; +} + +/** 文件大小展示:电子书通常几 MB 到几十 MB。 */ +function formatSize(bytes: number) { + if (!bytes) return "—"; + const mb = bytes / 1024 / 1024; + return mb >= 1 ? `${mb.toFixed(1)} MB` : `${Math.max(1, Math.round(bytes / 1024))} KB`; +} + +/** 后端存的是 naive UTC ISO,列表只取到分钟。 */ +function formatDate(value: string | null) { + return value ? value.slice(0, 16).replace("T", " ") : "—"; +} + +export default function CatalogManage({ + onOpenQuestions, + onReadOnline, +}: CatalogManageProps) { + const t = useT(); + const { message } = useUi(); + const { data, loading, error, reload } = useApi(api.textbooks); + const llmState = useApi(api.llmSettings); + const graphState = useApi(api.knowledgeGraph); + const knowledgeTree = useMemo(() => { + const graphNodes = graphState.data?.nodes ?? []; + return DOMAIN_VALUES.map((domain) => ({ + title: enumLabel(t, domain), + value: `domain-${domain}`, + selectable: false, + children: Array.from( + new Set( + graphNodes + .filter((node) => node.domain === domain) + .map((node) => node.category || t("graph.uncategorized")), + ), + ).map((category) => ({ + title: category, + value: `category-${domain}-${category}`, + selectable: false, + children: graphNodes + .filter( + (node) => + node.domain === domain && + (node.category || t("graph.uncategorized")) === category, + ) + .map((node) => ({ + title: t("graph.nodeTitle", { + name: node.name, + chapters: node.chapter_count, + questions: node.question_count, + }), + value: node.id, + })), + })), + })); + }, [graphState.data, t]); + const [open, setOpen] = useState(false); + const [editing, setEditing] = useState(null); + const [drawerBook, setDrawerBook] = useState(null); + const [chapterName, setChapterName] = useState(""); + const [chapterSummary, setChapterSummary] = useState(""); + const [chapterEditOpen, setChapterEditOpen] = useState(false); + const [editingChapter, setEditingChapter] = useState(null); + const [genOpen, setGenOpen] = useState(false); + const [genTask, setGenTask] = useState(null); + const activeChapterTaskRef = useRef(null); + const [pendingFile, setPendingFile] = useState(null); + /** 章节电子书定位的输入草稿:失焦或回车才写库,避免逐位发请求 */ + const [pageDraft, setPageDraft] = useState>({}); + const [uploadPercent, setUploadPercent] = useState(null); + const [busy, setBusy] = useState(false); + const [form] = Form.useForm(); + const [chapterForm] = Form.useForm(); + const [genForm] = Form.useForm(); + + /** 编辑面板打开期间列表可能已刷新(上传/删除电子版),取最新的一行。 */ + const liveBook = data?.find((item) => item.id === editing?.id) ?? editing; + + function openCreate() { + setEditing(null); + setPendingFile(null); + form.resetFields(); + setOpen(true); + } + + function openEdit(book: Textbook) { + setEditing(book); + setPendingFile(null); + form.setFieldsValue({ + name: book.name, + author: book.author, + publisher: book.publisher, + isbn: book.isbn, + edition: book.edition, + grade: book.grade, + link: book.link, + description: book.description, + }); + setOpen(true); + } + + async function handleSubmit(values: TextbookCreatePayload) { + setBusy(true); + try { + if (editing) { + await api.updateTextbook(editing.id, values); + message.success(t("common.msgSaved")); + } else { + const created = await api.createTextbook(values); + if (pendingFile) { + await api.uploadEbook(created.id, pendingFile); + } + message.success(t("catalog.msgCreated")); + } + setPendingFile(null); + setOpen(false); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgSaveFailed")); + } finally { + setBusy(false); + } + } + + async function removeBook(book: Textbook) { + try { + await api.deleteTextbook(book.id); + message.success(t("common.msgDeleted")); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgDeleteFailed")); + } + } + + /** 上传与替换合并为同一入口:已有电子版时覆盖旧文件。 */ + async function uploadOrPick(file: File) { + if (!editing) { + setPendingFile(file); + message.info(t("catalog.ebookPicked")); + return; + } + setUploadPercent(0); + try { + const result = await api.uploadEbook(editing.id, file, setUploadPercent); + message.success( + result.ebook_pages + ? t("catalog.ebookUpdatedPages", { pages: result.ebook_pages }) + : t("catalog.ebookUpdated"), + ); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("api.uploadFailed")); + } finally { + setUploadPercent(null); + } + } + + async function removeEbook(book: Textbook) { + try { + await api.deleteEbook(book.id); + message.success(t("catalog.ebookDeleted")); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgDeleteFailed")); + } + } + + async function addChapter() { + if (!drawerBook || !chapterName.trim()) { + message.warning(t("catalog.chapterNameRequired")); + return; + } + try { + await api.createChapter( + drawerBook.id, + chapterName.trim(), + chapterSummary.trim(), + ); + message.success(t("catalog.msgChapterAdded")); + setChapterName(""); + setChapterSummary(""); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("catalog.msgAddFailed")); + } + } + + function openEditChapter(chapter: ChapterItem) { + setEditingChapter(chapter); + chapterForm.setFieldsValue({ + name: chapter.name, + summary: chapter.summary, + knowledge_ids: chapter.knowledge_ids ?? [], + }); + setChapterEditOpen(true); + } + + async function saveChapter(values: { + name: string; + summary?: string; + knowledge_names?: string[]; + knowledge_ids?: number[]; + }) { + if (!editingChapter) return; + setBusy(true); + try { + await api.updateChapter(editingChapter.id, { + name: values.name.trim(), + summary: values.summary?.trim() ?? "", + knowledge_ids: values.knowledge_ids ?? [], + }); + message.success(t("catalog.msgChapterSaved")); + setChapterEditOpen(false); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgSaveFailed")); + } finally { + setBusy(false); + } + } + + /** 只写电子书定位,其余字段原样带上,避免被覆盖成空值。 */ + async function saveChapterPage(chapter: ChapterItem, page: number) { + if (page === chapter.ebook_page) return; + try { + await api.updateChapter(chapter.id, { + name: chapter.name, + summary: chapter.summary, + ebook_page: page, + knowledge_ids: chapter.knowledge_ids ?? [], + }); + message.success(t("ebook.pageSaved")); + setPageDraft((current) => { + const next = { ...current }; + delete next[chapter.id]; + return next; + }); + reload(); + } catch (err) { + message.error( + err instanceof Error ? err.message : t("ebook.pageSaveFailed"), + ); + } + } + + async function deleteChapter(chapter: ChapterItem) { + try { + await api.deleteChapter(chapter.id); + message.success(t("catalog.msgChapterDeleted")); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgDeleteFailed")); + } + } + + function openOrganizeChapters() { + activeChapterTaskRef.current = null; + setGenTask(null); + genForm.resetFields(); + const defaultChannel = llmState.data?.channels.find( + (channel) => channel.is_default, + ); + genForm.setFieldsValue({ channel_id: defaultChannel?.id }); + setGenOpen(true); + } + + async function handleOrganizeChapters(values: { + channel_id?: number; + reference_text: string; + }) { + if (!drawerBook) return; + setBusy(true); + try { + const task = await api.createLlmTask("organize_chapters", { + textbook_id: drawerBook.id, + channel_id: values.channel_id ?? null, + reference_text: values.reference_text, + }); + activeChapterTaskRef.current = task.id; + setGenTask(task); + setBusy(false); + await pollChapterTask(task.id); + } catch (err) { + message.error(err instanceof Error ? err.message : t("bank.msgGenerateFailed")); + } finally { + setBusy(false); + } + } + + async function pollChapterTask(taskId: number) { + if (activeChapterTaskRef.current !== taskId) return; + for (let index = 0; index < 240; index += 1) { + const next = await api.getLlmTask(taskId); + if (activeChapterTaskRef.current !== taskId) return; + setGenTask(next); + if (next.status === "success" || next.status === "failed") { + activeChapterTaskRef.current = null; + if (next.status === "success") { + message.success(backendText(next.message)); + setGenOpen(false); + reload(); + } else { + message.error(backendText(next.message)); + } + break; + } + await new Promise((resolve) => setTimeout(resolve, 1500)); + } + } + + const columns: ColumnsType = [ + { + title: t("common.name"), + dataIndex: "name", + render: (value: string, book) => ( + <> + {value} + {(book.edition || book.grade) && ( + {[book.edition, book.grade].filter(Boolean).join(" · ")} + )} + + ), + }, + { + title: t("resources.author"), + dataIndex: "author", + width: 200, + ellipsis: true, + render: (value: string) => value || "—", + }, + { + title: t("resources.publisher"), + dataIndex: "publisher", + width: 120, + ellipsis: true, + render: (value: string) => value || "—", + }, + { + title: "ISBN", + dataIndex: "isbn", + width: 132, + render: (value: string) => (value ? {value} : "—"), + }, + { + title: t("catalog.colChapters"), + key: "chapters", + width: 72, + align: "center", + render: (_, book) => book.chapters.length, + }, + { + title: t("catalog.colEbook"), + key: "ebook", + width: 120, + render: (_, book) => + book.ebook_format ? ( + <> + {book.ebook_format.toUpperCase()} + + {book.ebook_pages + ? t("catalog.pagesN", { n: book.ebook_pages }) + : t("catalog.pagesUnknown")}{" "} + · {formatSize(book.ebook_size)} + + + ) : ( + {t("catalog.ebookNone")} + ), + }, + { + title: t("common.actions"), + key: "action", + width: 320, + fixed: "right", + render: (_, book) => { + const locked = book.chapters.some( + (chapter) => chapter.question_count > 0, + ); + const actions: RowAction[] = [ + { + key: "chapters", + label: t("catalog.actChapters"), + icon: , + onClick: () => { + setDrawerBook(book); + reload(); + }, + }, + ]; + if (book.ebook_format && onReadOnline) { + actions.push({ + key: "read", + label: t("catalog.actRead"), + icon: , + onClick: () => onReadOnline(book.id), + }); + } + actions.push({ + key: "edit", + label: t("common.edit"), + icon: , + onClick: () => openEdit(book), + }); + actions.push( + locked + ? { + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + disabled: true, + tooltip: t("catalog.deleteBlocked"), + onClick: () => undefined, + } + : { + kind: "confirm", + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + title: t("catalog.deleteTitle", { name: book.name }), + description: + t("catalog.deleteHint"), + onConfirm: () => removeBook(book), + }, + ); + return ; + }, + }, + ]; + + const drawerLiveBook = + data?.find((item) => item.id === drawerBook?.id) ?? drawerBook; + const chapters = drawerLiveBook?.chapters ?? []; + /** 没有电子版时定位填了也没用,输入框直接禁用 */ + const drawerHasEbook = Boolean(drawerLiveBook?.ebook_format); + const ebookFormat = liveBook?.ebook_format; + + return ( + <> + + + + + + {data && ( + + rowKey="id" + columns={columns} + dataSource={data} + scroll={{ x: 1280 }} + /> + )} + + + setOpen(false)} + form={form} + onFinish={(values) => void handleSubmit(values as never)} + loading={busy} + submitText={editing ? t("common.save") : t("common.create")} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ebookFormat.toUpperCase()} + + ) : null + } + > + {liveBook?.ebook_file ? ( + + {formatSize(liveBook.ebook_size)} + {liveBook.ebook_pages + ? ` · ${t("catalog.pagesN", { n: liveBook.ebook_pages })}` + : ""} + {" · "} + {t("catalog.uploadedOn", { + date: formatDate(liveBook.ebook_uploaded_at), + })} + + } + /> + ) : ( + + {pendingFile ? t("catalog.pendingUpload", { name: pendingFile.name }) : t("catalog.noEbook")} + + )} + {uploadPercent !== null && ( + + )} + + { + void uploadOrPick(file); + return Upload.LIST_IGNORE; + }} + > + + + {liveBook?.ebook_file && onReadOnline && ( + + )} + {liveBook?.ebook_file && ( + removeEbook(liveBook)} + > + + + )} + + + + + setDrawerBook(null)} + placement="right" + size={640} + > + + +
+ + setChapterName(event.target.value)} + /> + + + setChapterSummary(event.target.value)} + /> + + +
+
+ + } onClick={openOrganizeChapters}> + {t("catalog.aiToc")} + + } + > + {chapters.length === 0 ? ( + + ) : ( + + {chapters.map((chapter) => ( + {chapter.name}} + extra={ + 0 ? "info" : "neutral"} + /> + } + description={ + <> + {chapter.summary || "—"} + + {t("ebook.page")} + + setPageDraft((current) => ({ + ...current, + [chapter.id]: value ?? 0, + })) + } + onBlur={() => + void saveChapterPage( + chapter, + pageDraft[chapter.id] ?? chapter.ebook_page, + ) + } + onPressEnter={() => + void saveChapterPage( + chapter, + pageDraft[chapter.id] ?? chapter.ebook_page, + ) + } + /> + {(chapter.knowledge_names ?? []).length > 0 && ( + + )} + + + } + actions={ + , + onClick: () => + onOpenQuestions(chapter.textbook_id, chapter.id), + }, + ] + : []), + ...(drawerHasEbook && onReadOnline + ? [ + { + key: "read", + label: + chapter.ebook_page > 0 + ? t("ebook.openAt", { + page: chapter.ebook_page, + }) + : t("ebook.open"), + icon: , + onClick: () => + onReadOnline( + chapter.textbook_id, + chapter.ebook_page || undefined, + ), + }, + ] + : []), + { + key: "edit", + label: t("common.edit"), + icon: , + onClick: () => openEditChapter(chapter), + }, + chapter.question_count > 0 + ? { + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + disabled: true, + tooltip: t("catalog.chapterDeleteBlocked"), + onClick: () => undefined, + } + : { + kind: "confirm" as const, + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + title: t("catalog.chapterDeleteTitle"), + description: t("catalog.chapterDeleteHint"), + onConfirm: () => deleteChapter(chapter), + }, + ]} + /> + } + /> + ))} + + )} + +
+
+ + setChapterEditOpen(false)} + form={chapterForm} + onFinish={(values) => void saveChapter(values as never)} + loading={busy} + > + + + + + + + + + + + + { + activeChapterTaskRef.current = null; + setGenOpen(false); + }} + form={genForm} + onFinish={(values) => void handleOrganizeChapters(values as never)} + loading={busy} + submitText={t("catalog.tocDataStart")} + > + + ({ + value: book.id, + label: book.name, + }))} + /> + + + + + + + + + + + + + + + + + + + ); +} diff --git a/frontend/src/pages/Daily.tsx b/frontend/src/pages/Daily.tsx new file mode 100644 index 0000000..466c371 --- /dev/null +++ b/frontend/src/pages/Daily.tsx @@ -0,0 +1,382 @@ +import { useState } from "react"; +import { + Alert, + Button, + Flex, + Popconfirm, + Space, + Steps, + Tag, + Typography, +} from "antd"; +import { + AppstoreOutlined, + BookOutlined, + CheckCircleFilled, + CheckCircleOutlined, + EditOutlined, + PlayCircleOutlined, + QuestionCircleOutlined, + ThunderboltOutlined, + TrophyOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { + KnowledgeTags, + Page, + Panel, + SectionTitle, + SubText, + useUi, +} from "../components/ui"; +import { + RATING_VALUES, + backendText, + ratingDescLabel, + ratingLabel, +} from "../i18n"; +import { useT } from "../prefs"; +import { tagColor } from "../theme"; +import type { DailyInfo } from "../types"; +import type { ViewId } from "../nav"; + +// value 是提交给后端的取值(中文),标签与说明按界面语言取词 +const ratingIcon = [ + , + , + , +]; + +/** 值得单独鼓励的连续天数节点 */ +const MILESTONES = new Set([3, 7, 14, 30, 60, 100]); + +/** 掌握度自评卡片:三档并列,选中态即时反馈,取代原来的小按钮组。 */ +function RatingCards({ + value, + disabled, + onChange, +}: { + value: string; + disabled?: boolean; + onChange: (value: string) => void; +}) { + const t = useT(); + return ( +
+ {RATING_VALUES.map((item, index) => ( + + ))} +
+ ); +} + +interface DailyProps { + onStartTest: (chapterId: number) => void; + /** 打开今日章节对应的电子书 */ + onReadOnline?: (textbookId: number, page?: number) => void; + /** 完成后的下一步引导:跳去知识地图 */ + onNavigate: (view: ViewId) => void; +} + +export default function Daily({ onStartTest, onReadOnline, onNavigate }: DailyProps) { + const t = useT(); + + const { message } = useUi(); + const { data, loading, error, reload } = useApi(api.daily); + const [rating, setRating] = useState(RATING_VALUES[1]); + const [draft, setDraft] = useState(RATING_VALUES[1]); + const [editing, setEditing] = useState(false); + const [busy, setBusy] = useState(false); + const [submitError, setSubmitError] = useState(null); + /** 提交结果直接用作页面数据:整页 reload 会让完成态闪回骨架屏,反馈就断了 */ + const [submitted, setSubmitted] = useState(null); + /** 后端不存完成时刻,时刻与提交前的连续天数只在本页用于反馈 */ + const [doneInfo, setDoneInfo] = useState<{ time: string; from: number } | null>( + null, + ); + /** 本页内是否点开过电子书 / 测试,用于推进步骤条 */ + const [opened, setOpened] = useState({ ebook: false, test: false }); + + const task = submitted ?? data; + const canRead = Boolean(task?.has_ebook && task.textbook_id); + + function startTest() { + if (!task?.chapter_id) return; + setOpened((current) => ({ ...current, test: true })); + onStartTest(task.chapter_id); + } + + function readEbook() { + if (!task?.textbook_id) return; + setOpened((current) => ({ ...current, ebook: true })); + onReadOnline?.(task.textbook_id as number, task.ebook_page || undefined); + } + + async function submit(value: string, isEdit: boolean) { + if (!task?.chapter_id) return; + setBusy(true); + setSubmitError(null); + try { + const result = await api.completeDaily(task.chapter_id, value); + setSubmitted(result); + setRating(value); + setDoneInfo({ + from: isEdit ? result.streak : (task.streak ?? 0), + time: new Date().toLocaleTimeString(), + }); + setEditing(false); + message.success(t("daily.ratingSaved")); + } catch (err) { + setSubmitError(err instanceof Error ? err.message : String(err)); + } finally { + setBusy(false); + } + } + + // 步骤条:没有电子书入口时第一步视为已满足,不会出现走不下去的节点 + const readDone = opened.ebook || !canRead; + const step = task?.completed + ? 3 + : opened.test + ? 2 + : readDone + ? 1 + : 0; + + return ( + + + {task && ( + + + + + {t("daily.streak", { n: task.streak })} + + + {task.completed + ? t("daily.completedToday") + : t("daily.notCompletedToday")} + + + {!task.chapter_name ? ( + + ) : ( + <> + + {task.completed ? ( + <> +
+ + + + {task.book_name} · {task.chapter_name} + + + + {ratingLabel(t, task.rating ?? "") || t("daily.confirmed")} + + {doneInfo && ( + + {t("daily.doneAt", { time: doneInfo.time })} + + )} + {doneInfo && task.streak > doneInfo.from && ( + + {t("daily.streakUp", { + from: doneInfo.from, + to: task.streak, + })} + + )} + + {MILESTONES.has(task.streak) && ( + + {t("daily.milestone", { n: task.streak })} + + )} + +
+ + {editing ? ( + <> + {t("daily.ratingGroupLabel")} + setDraft(value)} + /> + + + + + + ) : ( + + + {t("daily.yourRating", { + rating: + ratingLabel(t, task.rating ?? "") || t("daily.confirmed"), + })} + + + + )} +
+ {t("daily.nextStep")} + + + {canRead && ( + + )} + + +
+ + ) : ( + <> + + {task.book_name} · {task.chapter_name} + + + {backendText(task.reason ?? "")} + + + + {canRead && ( + + )} + + + {t("daily.ratingGroupLabel")} + setRating(value)} + /> + {submitError && ( + submit(rating, false)} + > + {t("common.retry")} + + } + /> + )} +
+ + {t("daily.confirmDesc", { + chapter: `${task.book_name} · ${task.chapter_name}`, + rating: ratingLabel(t, rating), + })} +
+ } + okText={t("daily.confirmOk")} + cancelText={t("common.cancel")} + onConfirm={() => submit(rating, false)} + > + + + {t("daily.submitHint")} +
+ + )} + + )} + + + )} + + ); +} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx new file mode 100644 index 0000000..4706670 --- /dev/null +++ b/frontend/src/pages/Dashboard.tsx @@ -0,0 +1,228 @@ +import { + AppstoreOutlined, + ArrowRightOutlined, + BookOutlined, +} from "@ant-design/icons"; +import { + Alert, + Button, + Col, + Flex, + Progress, + Row, + Space, + Tag, +} from "antd"; +import { api } from "../api/client"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { + DataRow, + DataRows, + EmptyState, + Hint, + MetricGrid, + Page, + Panel, + SectionTitle, + metricIcon, +} from "../components/ui"; +import { backendText, enumLabel } from "../i18n"; +import { useT } from "../prefs"; +import type { ViewId } from "../nav"; +import { + MASTERY_BANDS, + masteryBandColor, + masteryProgressColor, + masteryStatusColor, + tagColor, +} from "../theme"; +import type { KnowledgePoint } from "../types"; + +interface DashboardProps { + onNavigate: (view: ViewId) => void; + /** 打开知识地图:band 为空表示看全部,否则直接定位到该掌握度档 */ + onOpenKnowledgeMap: (band: string | null) => void; +} + +/** + * 掌握度概览只回答「整体如何、先补哪几个」:一个平均值、一条四档分布、三个最薄弱的点。 + * 逐个知识点的明细与筛选交给知识地图,两页不再各放一份一模一样的进度列表。 + */ +function MasterySummary({ + knowledge, + onOpenKnowledgeMap, +}: { + knowledge: KnowledgePoint[]; + onOpenKnowledgeMap: (band: string | null) => void; +}) { + const t = useT(); + const average = Math.round( + knowledge.reduce((sum, item) => sum + item.mastery, 0) / knowledge.length, + ); + const bands = MASTERY_BANDS.map((band) => ({ + band, + count: knowledge.filter((item) => item.status === band).length, + })); + const weakest = [...knowledge] + .sort((a, b) => a.mastery - b.mastery) + .slice(0, 3); + + return ( + + + + + {t("dashboard.masteryAvg", { n: knowledge.length })} + +
+
+ {bands + .filter(({ count }) => count > 0) + .map(({ band, count }) => ( + + ))} +
+ {/* 图例即入口:点某一档,去知识地图只看这一档的知识点 */} + + {bands.map(({ band, count }) => ( + 0 ? masteryStatusColor(band) : undefined} + style={{ + marginInlineEnd: 0, + cursor: count > 0 ? "pointer" : "default", + }} + onClick={() => count > 0 && onOpenKnowledgeMap(band)} + > + {enumLabel(t, band)} {count} + + ))} + +
+
+ +
+ {t("dashboard.weakest")} + + {weakest.map((item) => ( + + {item.mastery}% + + {enumLabel(t, item.status)} + + + } + /> + ))} + +
+ + +
+ ); +} + +export default function Dashboard({ + onNavigate, + onOpenKnowledgeMap, +}: DashboardProps) { + const t = useT(); + + const { data, loading, error, reload } = useApi(api.overview); + + return ( + + + {data && ( + <> + } + title={ + <> + + {t("dashboard.currentCourse", { + course: t("dashboard.courseName"), + })} + {" "} + {backendText(data.plan.notice)} + + } + /> + ({ + title: enumLabel(t, metric.label), + value: enumLabel(t, metric.value), + ...metricIcon(metric.label), + }))} + /> + + + + {data.knowledge.length > 0 ? ( + + ) : ( + + )} + + + + + + {data.plan.steps.map((step, index) => ( + + {index + 1} + + } + title={backendText(step).replace(/^[①②③]\s*/, "")} + /> + ))} + + + + + + + + + + )} + + ); +} diff --git a/frontend/src/pages/EbookReader.tsx b/frontend/src/pages/EbookReader.tsx new file mode 100644 index 0000000..65bda4f --- /dev/null +++ b/frontend/src/pages/EbookReader.tsx @@ -0,0 +1,919 @@ +/** + * 电子书阅读器。 + * PDF:pdf.js + 虚拟滚动,只渲染可视区附近的页面,文件按 Range 分段取, + * 打开大文件不必先下载完整文件。 + * EPUB:epub.js 分页渲染,带目录侧栏与字号调节,下载过程显示字节进度。 + * 两种格式都防抖保存阅读位置,重进自动续读。 + */ +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import type { ReactNode } from "react"; +import { + Button, + Divider, + Drawer, + Progress, + Spin, + Tag, + Typography, +} from "antd"; +import { + ArrowLeftOutlined, + ColumnWidthOutlined, + LeftOutlined, + UnorderedListOutlined, + RightOutlined, + ZoomInOutlined, + ZoomOutOutlined, +} from "@ant-design/icons"; +import * as pdfjs from "pdfjs-dist"; +import type { PDFDocumentProxy, RenderTask } from "pdfjs-dist"; +import pdfWorkerUrl from "pdfjs-dist/build/pdf.worker.min.mjs?url"; +import ePub from "epubjs"; +import type { Book, NavItem, Rendition } from "epubjs"; +import { api, clearAuth, readAuth } from "../api/client"; +import { tr } from "../i18n"; +import { EmptyState } from "../components/ui"; +import { usePrefs, useT } from "../prefs"; +import type { EbookProgress, EbookProgressPayload, Textbook } from "../types"; + +pdfjs.GlobalWorkerOptions.workerSrc = pdfWorkerUrl; + +/** + * 阅读器需要的最小信息:文件地址、上次的阅读位置与章节定位目标。 + * startPage 来自章节的电子书定位:PDF 是页码,EPUB 是分节序号,都从 1 开始。 + */ +interface EbookTarget { + url: string; + format: "pdf" | "epub"; + saved: EbookProgress | null; + startPage?: number; +} + +interface ViewerState { + status: "loading" | "ready" | "error"; + error: string; + controls: ReactNode; + body: ReactNode; + /** 加载中的遮罩内容,缺省为通用转圈 */ + overlay?: ReactNode; + percent: number; + caption: string; +} + +const idle: ViewerState = { + status: "loading", + error: "", + controls: null, + body: null, + overlay: null, + percent: 0, + caption: "", +}; + +function authHeaders(): Record { + const token = readAuth()?.token; + return token ? { Authorization: `Bearer ${token}` } : {}; +} + +/** 带字节进度的下载:EPUB 需要完整 ArrayBuffer 才能交给 epub.js 解包。 */ +async function fetchBuffer(url: string, onProgress: (percent: number) => void) { + const res = await fetch(url, { headers: authHeaders() }); + if (res.status === 401) { + clearAuth(); + window.dispatchEvent(new Event("auth:expired")); + throw new Error(tr("reader.sessionExpired")); + } + if (!res.ok) throw new Error(tr("reader.downloadFailed", { status: res.status })); + const total = Number(res.headers.get("content-length") || 0); + if (!res.body || !total) return res.arrayBuffer(); + const reader = res.body.getReader(); + const chunks: Uint8Array[] = []; + let received = 0; + for (;;) { + const { done, value } = await reader.read(); + if (done) break; + if (value) { + chunks.push(value); + received += value.length; + onProgress(Math.min(99, Math.round((received / total) * 100))); + } + } + const bytes = new Uint8Array(received); + let offset = 0; + for (const chunk of chunks) { + bytes.set(chunk, offset); + offset += chunk.length; + } + onProgress(100); + return bytes.buffer; +} + +/* ------------------------------------------------------- 键盘翻页(统一) */ + +/** 焦点在输入控件里时不抢方向键,否则会破坏输入框/下拉框的键盘操作。 */ +function isTypingTarget(target: EventTarget | null) { + const el = target as HTMLElement | null; + if (!el || !el.tagName) return false; + return ( + el.isContentEditable === true || + ["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName) + ); +} + +/** 命中左右键返回翻页方向,其余按键返回 null。 */ +function arrowDelta(event: KeyboardEvent): number | null { + if (event.defaultPrevented) return null; + if (event.metaKey || event.ctrlKey || event.altKey) return null; + if (isTypingTarget(event.target)) return null; + if (event.key === "ArrowLeft") return -1; + if (event.key === "ArrowRight") return 1; + return null; +} + +/** + * PDF 与 EPUB 共用同一套左右键翻页:主文档的按键在 window 上接, + * EPUB 正文在 iframe 内(按键不会冒泡上来)另外接 epub.js 转发的事件。 + */ +function useArrowPaging(enabled: boolean, turn: (delta: number) => void) { + const turnRef = useRef(turn); + turnRef.current = turn; + useEffect(() => { + if (!enabled) return undefined; + const onKey = (event: KeyboardEvent) => { + const delta = arrowDelta(event); + if (delta === null) return; + // 不拦掉浏览器默认的方向键行为,滚动会和翻页打架 + event.preventDefault(); + turnRef.current(delta); + }; + window.addEventListener("keydown", onKey); + return () => window.removeEventListener("keydown", onKey); + }, [enabled]); +} + +/* ------------------------------------------------------------------ PDF */ + +interface PdfPageProps { + doc: PDFDocumentProxy; + pageNumber: number; + width: number; + onRatio: (pageNumber: number, ratio: number) => void; +} + +/** 单页画布:进入可视窗口才挂载,离开即取消渲染,这是加载与渲染优化的关键。 */ +function PdfPage({ doc, pageNumber, width, onRatio }: PdfPageProps) { + const canvasRef = useRef(null); + + useEffect(() => { + const dpr = Math.min(window.devicePixelRatio || 1, 2); + let disposed = false; + let renderTask: RenderTask | null = null; + + doc + .getPage(pageNumber) + .then(async (page) => { + if (disposed) return; + const base = page.getViewport({ scale: 1 }); + onRatio(pageNumber, base.height / base.width); + const viewport = page.getViewport({ scale: (width / base.width) * dpr }); + const canvas = canvasRef.current; + if (!canvas) return; + canvas.width = Math.floor(viewport.width); + canvas.height = Math.floor(viewport.height); + canvas.style.width = `${Math.floor(viewport.width / dpr)}px`; + canvas.style.height = `${Math.floor(viewport.height / dpr)}px`; + renderTask = page.render({ canvas, viewport }); + try { + await renderTask.promise; + } catch { + // 快速滚动时渲染会被取消,忽略 + } + }) + .catch(() => undefined); + + return () => { + disposed = true; + renderTask?.cancel(); + }; + }, [doc, pageNumber, width, onRatio]); + + return ; +} + +const PAGE_GAP = 16; + +function usePdfViewer( + enabled: boolean, + target: EbookTarget | null, + onSave: (payload: EbookProgressPayload) => void, +): ViewerState { + const t = useT(); + const scrollRef = useRef(null); + /** 待恢复的页码:-1 表示还没开始,0 表示定位已完成 */ + const restoreRef = useRef(-1); + const [doc, setDoc] = useState(null); + const [error, setError] = useState(""); + const [zoom, setZoom] = useState(1); + const [viewportWidth, setViewportWidth] = useState(0); + const [ratios, setRatios] = useState([]); + /** 每页真实宽高比已从 PDF 元数据取到,可以按准确位置恢复 */ + const [sized, setSized] = useState(false); + const [range, setRange] = useState({ from: 1, to: 6 }); + const [page, setPage] = useState(1); + const url = target?.url ?? ""; + + useEffect(() => { + if (!enabled || !url) return undefined; + const task = pdfjs.getDocument({ + url, + httpHeaders: authHeaders(), + // 分段取文件:整文件流式下载会先拖完整本书, + // 关掉它之后每页数据按 Range 分片请求,大文件首屏只用下载可见部分 + rangeChunkSize: 256 * 1024, + disableAutoFetch: true, + disableStream: true, + // 扫描版教材的图片是 JBIG2 / JPEG2000,解码器要在 worker 里按这个地址取 wasm + wasmUrl: "/pdfjs-wasm/", + }); + let disposed = false; + task.promise + .then((loaded) => { + // 已卸载时不再持有文档,task.destroy() 会一并释放 + if (!disposed) setDoc(loaded); + }) + .catch((err: unknown) => { + if (!disposed) setError(err instanceof Error ? err.message : tr("reader.pdfFailed")); + }); + return () => { + disposed = true; + setDoc(null); + void task.destroy(); + }; + }, [enabled, url]); + + // 逐页取真实宽高比:用估算值定位,几十页累下来会偏好几页 + useEffect(() => { + if (!doc) return undefined; + let cancelled = false; + void Promise.all( + Array.from({ length: doc.numPages }, (_, index) => + doc + .getPage(index + 1) + .then((proxy) => proxy.getViewport({ scale: 1 })) + .catch(() => null), + ), + ).then((viewports) => { + if (cancelled) return; + setRatios((current) => { + const next = [...current]; + viewports.forEach((viewport, index) => { + if (viewport && next[index] === undefined) { + next[index] = viewport.height / viewport.width; + } + }); + return next; + }); + setSized(true); + }); + return () => { + cancelled = true; + }; + }, [doc]); + + // 缩放与页面高度都以滚动容器宽度为基准 + useEffect(() => { + const el = scrollRef.current; + if (!enabled || !el) return undefined; + const observer = new ResizeObserver(() => setViewportWidth(el.clientWidth)); + observer.observe(el); + setViewportWidth(el.clientWidth); + return () => observer.disconnect(); + }, [enabled]); + + const numPages = doc?.numPages ?? 0; + const pageWidth = Math.max(240, Math.round((viewportWidth - 48) * zoom)); + const guessRatio = ratios.find((value) => value > 0) ?? 1.414; + + // 累计每页顶部位置;未测量的页用已知宽高比占位 + const offsets = useMemo(() => { + const list = new Array(numPages + 1); + list[0] = 0; + for (let index = 1; index <= numPages; index += 1) { + const ratio = ratios[index - 1] ?? guessRatio; + list[index] = list[index - 1] + pageWidth * ratio + PAGE_GAP; + } + return list; + }, [numPages, pageWidth, ratios, guessRatio]); + + const onRatio = useCallback((pageNumber: number, ratio: number) => { + setRatios((current) => { + if (current[pageNumber - 1] === ratio) return current; + const next = [...current]; + next[pageNumber - 1] = ratio; + return next; + }); + }, []); + + const measure = useCallback(() => { + const el = scrollRef.current; + if (!el || !numPages) return; + const top = el.scrollTop; + const bottom = top + el.clientHeight; + const pad = el.clientHeight * 1.5; + let from = numPages; + let to = 1; + let current = numPages; + let found = false; + for (let index = 1; index <= numPages; index += 1) { + const height = offsets[index] - offsets[index - 1] - PAGE_GAP; + if (!found && offsets[index - 1] + height > top + 24) { + current = index; + found = true; + } + if (offsets[index - 1] + height >= top - pad && offsets[index - 1] <= bottom + pad) { + if (index < from) from = index; + if (index > to) to = index; + } + } + setRange((prev) => (prev.from === from && prev.to === to ? prev : { from, to })); + setPage(current); + }, [numPages, offsets]); + + useEffect(() => { + if (!doc) return; + // 真实页高就绪后才能一次滚到位,在此之前只测位置不动滚动条 + if (sized && restoreRef.current === -1) { + // 章节定位是用户主动点的跳转,优先级高于上次阅读进度 + const want = Math.min( + Math.max(target?.startPage ?? target?.saved?.page ?? 1, 1), + doc.numPages, + ); + restoreRef.current = want; + // 此时 offsets 已经是准的,一次滚到目标页顶边即可,之后不再介入 + if (want > 1 && scrollRef.current) scrollRef.current.scrollTop = offsets[want - 1]; + restoreRef.current = 0; + } + measure(); + }, [doc, sized, offsets, measure, target]); + + useEffect(() => { + if (!doc || !numPages) return; + onSave({ + locator: "", + page, + total: numPages, + position: page / numPages, + }); + }, [doc, numPages, page, onSave]); + + const scrollToPage = useCallback( + (next: number) => { + const el = scrollRef.current; + if (!el || !numPages) return; + const clamped = Math.min(Math.max(next, 1), numPages); + el.scrollTo({ top: offsets[clamped - 1], behavior: "smooth" }); + }, + [numPages, offsets], + ); + + useArrowPaging(enabled && Boolean(doc), (delta) => + scrollToPage(page + delta), + ); + + if (!enabled) return idle; + if (error) return { ...idle, status: "error", error }; + + const stripWidth = Math.max(pageWidth, viewportWidth); + const pages: ReactNode[] = []; + if (doc) { + for (let index = 1; index <= numPages; index += 1) { + const active = index >= range.from && index <= range.to; + pages.push( +
+ {active ? ( + + ) : null} +
, + ); + } + } + + return { + status: doc ? "ready" : "loading", + error: "", + controls: ( + <> + + + + + ))} + + )} + + + ), + percent: state.percent, + caption: + ready && displayed + ? t("reader.section", { page: state.index, total: state.total }) + : "", + }; +} + +/* ----------------------------------------------------------------- 外壳 */ + +interface EbookReaderProps { + textbookId: number; + /** 章节定位:打开后直接跳到第几页 / 第几节,不传则续读上次进度 */ + page?: number; + onExit: () => void; +} + +export default function EbookReader({ + textbookId, + page, + onExit, +}: EbookReaderProps) { + const t = useT(); + const { mode } = usePrefs(); + const [book, setBook] = useState(null); + const [loadError, setLoadError] = useState(""); + + useEffect(() => { + let disposed = false; + api + .textbooks() + .then((list) => { + if (!disposed) { + setBook(list.find((item) => item.id === textbookId) ?? null); + } + }) + .catch((err: unknown) => { + if (!disposed) { + setLoadError(err instanceof Error ? err.message : tr("common.loadFailed")); + } + }); + return () => { + disposed = true; + }; + }, [textbookId]); + + // 防抖写回进度;切后台或离开页面时立即补存一次 + const pendingRef = useRef(null); + const timerRef = useRef(null); + const flush = useCallback(() => { + if (timerRef.current) { + window.clearTimeout(timerRef.current); + timerRef.current = null; + } + const payload = pendingRef.current; + if (!payload) return; + pendingRef.current = null; + void api.saveEbookProgress(textbookId, payload).catch(() => undefined); + }, [textbookId]); + + const save = useCallback( + (payload: EbookProgressPayload) => { + pendingRef.current = payload; + if (timerRef.current) window.clearTimeout(timerRef.current); + timerRef.current = window.setTimeout(flush, 1500); + }, + [flush], + ); + + useEffect(() => { + const onHide = () => flush(); + window.addEventListener("pagehide", onHide); + document.addEventListener("visibilitychange", onHide); + return () => { + window.removeEventListener("pagehide", onHide); + document.removeEventListener("visibilitychange", onHide); + flush(); + }; + }, [flush]); + + const target: EbookTarget | null = useMemo(() => { + if (!book?.ebook_file || !book.ebook_format) return null; + return { + url: api.ebookFileUrl(book.id, book.ebook_file), + format: book.ebook_format, + saved: book.ebook_progress ?? null, + startPage: page && page > 0 ? page : undefined, + }; + }, [book, page]); + + const pdf = usePdfViewer(target?.format === "pdf", target, save); + const epub = useEpubViewer(target?.format === "epub", target, mode, save); + const viewer = target?.format === "epub" ? epub : pdf; + + if (loadError || (book && !target)) { + return ( +
+
+ +
+
+ +
+
+ ); + } + + return ( +
+
+
+ + + + {book?.name ?? ""} + + {book?.ebook_format ? ( + {book.ebook_format.toUpperCase()} + ) : null} +
+
{viewer.controls}
+
+ +
+ {viewer.body} + {viewer.status === "loading" && ( +
+ {viewer.overlay ?? ( +
+ + {t("reader.loading")} +
+ )} +
+ )} + {viewer.status === "error" && ( +
+ +
+ )} +
+ +
+ {viewer.caption} + + {Math.round(viewer.percent * 100)}% + {t("reader.keysHint")} +
+
+ ); +} diff --git a/frontend/src/pages/Errors.tsx b/frontend/src/pages/Errors.tsx new file mode 100644 index 0000000..be1434a --- /dev/null +++ b/frontend/src/pages/Errors.tsx @@ -0,0 +1,101 @@ +import { Tag } from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { api } from "../api/client"; +import { AsyncState } from "../components/Async"; +import { QuestionDetail } from "../components/QuestionDetail"; +import RichText from "../components/RichText"; +import { useApi } from "../components/useApi"; +import { + DataTable, + EmptyState, + KnowledgeTags, + Panel, + SubText, +} from "../components/ui"; +import { backendText, enumLabel } from "../i18n"; +import { useT } from "../prefs"; +import { tagColor } from "../theme"; +import type { ErrorEntry } from "../types"; + +export default function Errors() { + const t = useT(); + + const { data, loading, error, reload } = useApi(api.errors); + + const columns: ColumnsType = [ + { + title: t("errors.colRound"), + dataIndex: "source_label", + width: 170, + render: (value: string) => {value}, + }, + { + title: t("errors.colQuestion"), + key: "stem", + render: (_, entry) => + entry.stem ? ( + + ) : ( + {t("errors.legacyNoDetail")} + ), + }, + { + title: t("errors.colKnowledge"), + key: "knowledge", + render: (_, entry) => ( + 0 + ? entry.knowledge_names + : [entry.knowledge_name] + } + /> + ), + }, + { + title: t("errors.colDiagnosis"), + dataIndex: "diagnosis", + width: 160, + render: (value: string) => backendText(value), + }, + { + title: t("errors.colStatus"), + dataIndex: "status", + width: 100, + render: (value: string) => ( + {enumLabel(t, value)} + ), + }, + { title: t("errors.colDate"), dataIndex: "created_on", width: 120 }, + ]; + + return ( + + + {data && ( + + rowKey="id" + columns={columns} + dataSource={data} + locale={{ + emptyText: ( + + ), + }} + expandable={{ + expandedRowRender: (entry) => ( + + ), + }} + /> + )} + + ); +} diff --git a/frontend/src/pages/KnowledgeGraph.tsx b/frontend/src/pages/KnowledgeGraph.tsx new file mode 100644 index 0000000..5707187 --- /dev/null +++ b/frontend/src/pages/KnowledgeGraph.tsx @@ -0,0 +1,641 @@ +import { useEffect, useMemo, useState } from "react"; +import { + Button, + Descriptions, + Flex, + Form, + Input, + Select, + Space, + Tag, + Tree, +} from "antd"; +import type { TreeDataNode } from "antd"; +import { + DeleteOutlined, + EditOutlined, + PlusOutlined, + ShareAltOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { HeaderActions } from "../components/Layout"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { + EditorDrawer, + FormRow, + Hint, + Panel, + RowActions, + SectionTitle, + Toolbar, + halfItem, + rules, + useUi, +} from "../components/ui"; +import { DOMAIN_VALUES, RELATION_VALUES, enumOptions, tr } from "../i18n"; +import { useT } from "../prefs"; +import { tagColor } from "../theme"; +import type { + KnowledgeGraphEdge, + KnowledgeGraphNode, +} from "../types"; + +function buildTreeData( + nodes: KnowledgeGraphNode[], + edges: KnowledgeGraphEdge[], + rootIds: number[], +): TreeDataNode[] { + const nodeMap = new Map(nodes.map((node) => [node.id, node])); + const children = new Map(); + edges.forEach((edge) => { + if (edge.relation_type === "包含") { + const list = children.get(edge.source) ?? []; + list.push(edge.target); + children.set(edge.source, list); + } + }); + + function convert(id: number): TreeDataNode | null { + const node = nodeMap.get(id); + if (!node) return null; + const kids = (children.get(id) ?? []) + .map(convert) + .filter((item): item is TreeDataNode => Boolean(item)); + return { + key: String(id), + title: tr("graph.nodeTitle", { + name: node.name, + chapters: node.chapter_count, + questions: node.question_count, + }), + children: kids.length ? kids : undefined, + }; + } + + return rootIds.map(convert).filter((item): item is TreeDataNode => Boolean(item)); +} + +export default function KnowledgeGraph() { + const t = useT(); + + const { message, modal } = useUi(); + const { data, loading, error, reload } = useApi(api.knowledgeGraph); + const coursesState = useApi(api.courses); + const [domain, setDomain] = useState("初等"); + const [categoryId, setCategoryId] = useState(0); + const [selected, setSelected] = useState(null); + const [editOpen, setEditOpen] = useState(false); + const [editing, setEditing] = useState(null); + const [relationOpen, setRelationOpen] = useState(false); + const [courseId, setCourseId] = useState(); + const [form] = Form.useForm(); + const [relationForm] = Form.useForm(); + + const courses = coursesState.data ?? []; + + // 资源/引用变更后,用最新的图谱数据刷新详情面板 + useEffect(() => { + if (!selected || !data) return; + const fresh = data.nodes.find((node) => node.id === selected.id); + if (fresh && fresh !== selected) setSelected(fresh); + }, [data, selected]); + + const nodes = useMemo( + () => (data?.nodes ?? []).filter((node) => node.domain === domain), + [data, domain], + ); + const domainRoot = nodes.find( + (node) => node.name === (domain === "初等" ? "初等数学" : "高等数学"), + ); + const categoryRoots = useMemo( + () => + (data?.edges ?? []) + .filter( + (edge) => + edge.relation_type === "包含" && + edge.source === domainRoot?.id, + ) + .map((edge) => nodes.find((node) => node.id === edge.target)) + .filter((node): node is KnowledgeGraphNode => Boolean(node)), + [data, nodes, domainRoot], + ); + + const subNodes = useMemo( + () => { + if (categoryId === 0) return nodes; + const children = new Map(); + (data?.edges ?? []).forEach((edge) => { + if (edge.relation_type === "包含") { + const list = children.get(edge.source) ?? []; + list.push(edge.target); + children.set(edge.source, list); + } + }); + const ids = new Set([categoryId]); + const queue = [categoryId]; + while (queue.length) { + const current = queue.shift()!; + (children.get(current) ?? []).forEach((id) => { + if (!ids.has(id)) { + ids.add(id); + queue.push(id); + } + }); + } + return nodes.filter((node) => ids.has(node.id)); + }, + [categoryId, data, nodes], + ); + const subNodeIds = new Set(subNodes.map((node) => node.id)); + const roots = subNodes + .filter( + (node) => + !(data?.edges ?? []).some( + (edge) => + edge.relation_type === "包含" && + edge.target === node.id && + subNodeIds.has(edge.source), + ), + ) + .map((node) => node.id); + + const treeData = useMemo( + () => buildTreeData(subNodes, data?.edges ?? [], roots), + [subNodes, data, roots], + ); + const expandedRootKeys = roots.map(String); + const nodeById = new Map(nodes.map((node) => [node.id, node])); + + function openCreate() { + setEditing(null); + form.resetFields(); + const defaultCategory = + categoryRoots.find((node) => node.id === categoryId)?.name ?? ""; + form.setFieldsValue({ + domain, + category: defaultCategory, + description: "", + }); + setEditOpen(true); + } + + function openEdit(node: KnowledgeGraphNode) { + setEditing(node); + form.setFieldsValue({ + name: node.name, + domain: node.domain, + category: node.category, + description: node.description, + }); + setEditOpen(true); + } + + async function saveNode(values: { + name: string; + domain: string; + category: string; + description: string; + }) { + try { + if (editing) { + await api.updateKnowledgeNode(editing.id, { + name: values.name.trim(), + domain: values.domain, + category: values.category, + description: values.description.trim(), + }); + message.success(t("graph.msgUpdated")); + } else { + await api.createKnowledgeNode({ + name: values.name.trim(), + domain: values.domain, + category: values.category.trim(), + description: values.description.trim(), + }); + message.success(t("graph.msgCreated")); + } + setEditOpen(false); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgSaveFailed")); + } + } + + function removeNode(node: KnowledgeGraphNode) { + modal.confirm({ + title: t("graph.deleteTitle", { name: node.name }), + content: t("graph.deleteHint"), + okButtonProps: { danger: true }, + onOk: async () => { + try { + await api.deleteKnowledgeNode(node.id); + message.success(t("common.msgDeleted")); + setSelected(null); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgDeleteFailed")); + } + }, + }); + } + + async function saveRelation(values: { + source_id: number; + target_id: number; + relation_type: string; + }) { + try { + await api.addKnowledgeRelation({ + source_id: values.source_id, + target_id: values.target_id, + relation_type: values.relation_type, + }); + message.success(t("graph.msgRelationAdded")); + setRelationOpen(false); + relationForm.resetFields(); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgSaveFailed")); + } + } + + function removeRelation(edge: KnowledgeGraphEdge) { + modal.confirm({ + title: t("graph.deleteRelationTitle"), + onOk: async () => { + try { + await api.removeKnowledgeRelation( + edge.source, + edge.target, + edge.relation_type, + ); + message.success(t("graph.msgRelationDeleted")); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgDeleteFailed")); + } + }, + }); + } + + async function addResource(node: KnowledgeGraphNode) { + if (!courseId) { + message.warning(t("graph.pickCourseFirst")); + return; + } + try { + await api.addKnowledgeResource(node.id, { + kind: "video", + course_id: courseId, + }); + message.success(t("graph.msgLinked")); + setCourseId(undefined); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("graph.msgLinkFailed")); + } + } + + function removeResource(resourceId: number) { + modal.confirm({ + title: t("graph.unlinkTitle"), + onOk: async () => { + try { + await api.removeKnowledgeResource(resourceId); + message.success(t("graph.msgUnlinked")); + reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("graph.msgUnlinkFailed")); + } + }, + }); + } + + return ( + + + + + + + + { + setCategoryId(value); + setSelected(null); + }} + options={[ + { value: 0, label: t("graph.allCategories") }, + ...categoryRoots.map((node) => ({ + value: node.id, + label: node.name, + })), + ]} + /> + + } + /> + + {data && ( +
+ { + const id = Number(keys[0]); + const node = data?.nodes.find((item) => item.id === id); + if (node) setSelected(node); + }} + /> +
+ )} +
+ + {selected && ( + , + onClick: () => openEdit(selected), + }, + { + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + onClick: () => removeNode(selected), + }, + ]} + /> + } + > + + +
+ {t("graph.childrenSection")} + + {(data?.edges ?? []) + .filter( + (edge) => + edge.relation_type === "包含" && + edge.source === selected.id, + ) + .map((edge) => { + const target = nodeById.get(edge.target); + return ( + { + event.preventDefault(); + removeRelation(edge); + }} + > + {target?.name ?? edge.target} + + ); + })} + {!( + data?.edges ?? [] + ).some( + (edge) => + edge.relation_type === "包含" && + edge.source === selected.id, + ) && {t("graph.none")}} + +
+
+ {t("graph.prereqSection")} + + {(data?.edges ?? []) + .filter( + (edge) => + edge.relation_type === "前置" && + edge.target === selected.id, + ) + .map((edge) => { + const source = nodeById.get(edge.source); + return ( + { + event.preventDefault(); + removeRelation(edge); + }} + > + {source?.name ?? edge.source} + + ); + })} + {!( + data?.edges ?? [] + ).some( + (edge) => + edge.relation_type === "前置" && + edge.target === selected.id, + ) && {t("graph.none")}} + +
+
+ {t("graph.followersSection")} + + {(data?.edges ?? []) + .filter( + (edge) => + edge.relation_type === "前置" && + edge.source === selected.id, + ) + .map((edge) => { + const target = nodeById.get(edge.target); + return ( + { + event.preventDefault(); + removeRelation(edge); + }} + > + {target?.name ?? edge.target} + + ); + })} + {!( + data?.edges ?? [] + ).some( + (edge) => + edge.relation_type === "前置" && + edge.source === selected.id, + ) && {t("graph.none")}} + +
+
+ {t("knowledge.resourcesSection")} + + {(selected.resources ?? []).map((resource) => ( + { + event.preventDefault(); + removeResource(resource.id); + }} + > + {resource.title || resource.url} + + ))} + {(selected.resources ?? []).length === 0 && {t("graph.none")}} + + + + + + + + + + + + + + + setRelationOpen(false)} + form={relationForm} + onFinish={(values) => void saveRelation(values as never)} + intro={t("graph.relationIntro")} + > + + ({ + value: node.id, + label: `${node.category || t("graph.uncategorized")} · ${node.name}`, + }))} + /> + + + + + + } placeholder="https://api.openai.com/v1" /> + + + + + + + + {editing && ( + + {t("llm.apiKeyClear")} + + )} + + + + + + + {editing && ( + } + title={t("llm.willSave", { + provider: editing.provider_label, + model: editing.model, + })} + /> + )} + + + ); +} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx new file mode 100644 index 0000000..f18b969 --- /dev/null +++ b/frontend/src/pages/Login.tsx @@ -0,0 +1,94 @@ +import { LockOutlined, UserOutlined } from "@ant-design/icons"; +import { Alert, Button, Card, Form, Input, Typography } from "antd"; +import { useState } from "react"; +import { api } from "../api/client"; +import { rules, useUi } from "../components/ui"; +import HeaderControls from "../components/HeaderControls"; +import { useT } from "../prefs"; + +interface LoginProps { + onSuccess: (auth: { + token: string; + role: string; + display_name: string; + }) => void; +} + +export default function Login({ onSuccess }: LoginProps) { + const t = useT(); + const { message } = useUi(); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(""); + + async function handleSubmit(values: { username: string; password: string }) { + setLoading(true); + setError(""); + try { + const result = await api.login(values.username, values.password); + onSuccess({ + token: result.access_token, + role: result.role, + display_name: result.display_name, + }); + message.success(t("login.success")); + } catch (err) { + setError(err instanceof Error ? err.message : t("login.failed")); + } finally { + setLoading(false); + } + } + + return ( +
+ + +
+ ∑ + + {t("app.name")} + + {t("app.tagline")} +
+ {error && ( + + )} +
+ + } + placeholder="admin / student" + autoFocus + /> + + + } + placeholder={t("login.passwordPlaceholder")} + /> + + +
+
+ + {t("login.hint")} + +
+
+
+ ); +} diff --git a/frontend/src/pages/QuestionBank.tsx b/frontend/src/pages/QuestionBank.tsx new file mode 100644 index 0000000..457ea51 --- /dev/null +++ b/frontend/src/pages/QuestionBank.tsx @@ -0,0 +1,738 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import { + Alert, + Button, + Checkbox, + Form, + Input, + InputNumber, + Progress, + Select, + Space, + Tag, + TreeSelect, + Typography, +} from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { + DeleteOutlined, + EditOutlined, + RobotOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { HeaderActions } from "../components/Layout"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { QuestionDetail } from "../components/QuestionDetail"; +import { + DataTable, + EditorDrawer, + EmptyState, + KnowledgeTags, + Panel, + RowActions, + SectionTitle, + SubText, + Toolbar, + rules, + useUi, +} from "../components/ui"; +import type { ViewId } from "../components/Layout"; +import type { QuestionBankItem } from "../types"; +import type { LlmTaskResult } from "../types"; +import RichText from "../components/RichText"; +import { DOMAIN_VALUES, backendText, enumLabel } from "../i18n"; +import { useT } from "../prefs"; +import { tagColor } from "../theme"; + +interface QuestionBankProps { + onNavigate: (view: ViewId) => void; + preset?: { textbook_id?: number; chapter_id?: number } | null; +} + +export default function QuestionBank({ onNavigate, preset }: QuestionBankProps) { + const t = useT(); + + const { message } = useUi(); + const textbooksState = useApi(api.textbooks); + const textbooks = textbooksState.data ?? []; + const [filterTextbookId, setFilterTextbookId] = useState( + () => preset?.textbook_id, + ); + const [filterChapterId, setFilterChapterId] = useState( + () => preset?.chapter_id, + ); + const [genOpen, setGenOpen] = useState(false); + const [genBusy, setGenBusy] = useState(false); + const [genTextbookId, setGenTextbookId] = useState(); + const [genChapterId, setGenChapterId] = useState(); + const [editOpen, setEditOpen] = useState(false); + const [editBusy, setEditBusy] = useState(false); + const [editItem, setEditItem] = useState(null); + const [activeTask, setActiveTask] = useState(null); + const activeTaskRef = useRef(null); + const [genForm] = Form.useForm(); + const [editForm] = Form.useForm(); + + const filterChapters = + textbooks.find((item) => item.id === filterTextbookId)?.chapters ?? []; + + const listState = useApi( + () => + api.bankQuestions({ + textbook_id: filterTextbookId, + chapter_id: filterChapterId, + }), + [filterTextbookId, filterChapterId], + ); + const llmState = useApi(api.llmSettings); + const graphState = useApi(api.knowledgeGraph); + + useEffect(() => { + if (preset?.textbook_id) { + setFilterTextbookId(preset.textbook_id); + setFilterChapterId(preset.chapter_id); + } + }, [preset?.textbook_id, preset?.chapter_id]); + + useEffect(() => { + if (!genOpen || !llmState.data) return; + const defaultChannel = llmState.data.channels.find((channel) => channel.is_default); + if (defaultChannel && genForm.getFieldValue("channel_id") === undefined) { + genForm.setFieldValue("channel_id", defaultChannel.id); + } + }, [genOpen, llmState.data, genForm]); + + function openGenerate() { + activeTaskRef.current = null; + genForm.resetFields(); + setGenTextbookId(filterTextbookId); + setGenChapterId(filterChapterId); + if (filterTextbookId) { + const presetBook = textbooks.find( + (book) => book.id === filterTextbookId, + ); + const presetChapter = presetBook?.chapters.find( + (chapter) => chapter.id === filterChapterId, + ); + genForm.setFieldsValue({ + textbook_id: filterTextbookId, + chapter_id: filterChapterId, + knowledge_ids: presetChapter?.knowledge_ids ?? [], + }); + } + setGenOpen(true); + } + + function handleFilterTextbookChange(textbookId?: number) { + setFilterTextbookId(textbookId); + setFilterChapterId(undefined); + } + + function handleGenTextbookChange(textbookId: number) { + setGenTextbookId(textbookId); + setGenChapterId(undefined); + genForm.setFieldValue("chapter_id", undefined); + } + + function handleGenChapterChange(chapterId: number) { + setGenChapterId(chapterId); + const chapter = genTextbook?.chapters.find((item) => item.id === chapterId); + genForm.setFieldsValue({ + chapter_id: chapterId, + knowledge_ids: chapter?.knowledge_ids ?? [], + }); + } + + const genTextbook = textbooks.find((book) => book.id === genTextbookId); + const genChapter = genTextbook?.chapters.find( + (chapter) => chapter.id === genChapterId, + ); + + const graphNodes = graphState.data?.nodes ?? []; + const chapterGraphNodes = graphNodes.filter( + (node) => (genChapter?.knowledge_ids ?? []).includes(node.id), + ); + const knowledgeTree = useMemo(() => { + return DOMAIN_VALUES.map((domain) => ({ + title: enumLabel(t, domain), + value: `domain-${domain}`, + selectable: false, + children: Array.from( + new Set( + graphNodes + .filter((node) => node.domain === domain) + .map((node) => node.category || t("graph.uncategorized")), + ), + ).map((category) => ({ + title: category, + value: `category-${domain}-${category}`, + selectable: false, + children: graphNodes + .filter( + (node) => + node.domain === domain && + (node.category || t("graph.uncategorized")) === category, + ) + .map((node) => ({ + title: node.name, + value: node.id, + })), + })), + })); + }, [graphNodes, t]); + + async function handleGenerate(values: { + textbook_id?: number; + chapter_id: number; + count: number; + difficulty: number; + knowledge_ids?: number[]; + channel_id?: number; + instructions?: string; + need_figure?: boolean; + }) { + setGenBusy(true); + try { + const task = await api.createLlmTask("generate_questions", { + chapter_id: values.chapter_id, + count: values.count, + difficulty: values.difficulty, + knowledge_names: [], + knowledge_ids: values.knowledge_ids ?? [], + instructions: values.instructions ?? "", + channel_id: values.channel_id ?? null, + need_figure: Boolean(values.need_figure), + }); + activeTaskRef.current = task.id; + setGenOpen(false); + genForm.resetFields(); + setActiveTask(task); + void pollTask(task.id); + } catch (err) { + message.error(err instanceof Error ? err.message : t("bank.msgGenerateFailed")); + } finally { + setGenBusy(false); + } + } + + async function pollTask(taskId: number) { + if (activeTaskRef.current !== taskId) return; + for (let index = 0; index < 240; index += 1) { + const next = await api.getLlmTask(taskId); + if (activeTaskRef.current !== taskId) return; + setActiveTask(next); + if (next.status === "success" || next.status === "failed") { + activeTaskRef.current = null; + if (next.status === "success") { + message.success(backendText(next.message)); + listState.reload(); + } else { + message.error(backendText(next.message)); + } + break; + } + await new Promise((resolve) => setTimeout(resolve, 1500)); + } + } + + async function remove(item: QuestionBankItem) { + try { + await api.deleteQuestion(item.id); + message.success(t("common.msgDeleted")); + listState.reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgDeleteFailed")); + } + } + + function openEdit(item: QuestionBankItem) { + setEditItem(item); + const legacyNames = new Set(item.knowledge_names?.length + ? item.knowledge_names + : [item.knowledge_name]); + const knowledgeIds = + item.knowledge_ids?.length + ? item.knowledge_ids + : graphNodes + .filter((node) => legacyNames.has(node.name)) + .map((node) => node.id); + editForm.setFieldsValue({ + stem: item.stem, + options: item.options, + correct_index: item.correct_index, + knowledge_ids: knowledgeIds, + explanation: item.explanation, + difficulty: item.difficulty, + }); + setEditOpen(true); + } + + async function handleSaveEdit(values: { + stem: string; + options: string[]; + correct_index: number; + knowledge_ids: number[]; + explanation: string; + difficulty: number; + }) { + if (!editItem) return; + setEditBusy(true); + try { + const updated = await api.updateQuestion(editItem.id, { + stem: values.stem.trim(), + options: values.options.map((option) => option.trim()), + correct_index: values.correct_index, + knowledge_name: + graphNodes.find((node) => node.id === values.knowledge_ids[0]) + // 提交给后端的知识点名称,保持中文 + ?.name ?? "章节综合", + knowledge_names: [], + knowledge_ids: values.knowledge_ids, + explanation: values.explanation.trim(), + difficulty: values.difficulty, + chapter_id: editItem.chapter_id ?? null, + }); + message.success(t("bank.msgUpdated", { id: updated.id })); + setEditOpen(false); + listState.reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("common.msgSaveFailed")); + } finally { + setEditBusy(false); + } + } + + const columns: ColumnsType = [ + { title: "ID", dataIndex: "id", width: 70 }, + { + title: t("bank.colQuestion"), + dataIndex: "stem", + render: (value: string) => ( + + + + ), + }, + { + title: t("analytics.knowledge"), + dataIndex: "knowledge_name", + width: 220, + render: (_value: string, item) => ( + 0 + ? item.knowledge_names + : [item.knowledge_name] + } + /> + ), + }, + { + title: t("bank.colSource"), + key: "origin", + width: 120, + render: (_, item) => ( + + + {item.is_generated ? t("bank.generated") : t("bank.builtin")} + + {item.chapter_name || t("bank.noChapter")} + + ), + }, + { + title: t("bank.colDifficulty"), + dataIndex: "difficulty", + width: 90, + render: (value: number) => ( + {"★".repeat(value)} + ), + }, + { + title: t("bank.colUsage"), + dataIndex: "used_count", + width: 130, + render: (value: number) => + (value ?? 0) > 0 ? ( + {t("bank.usedN", { n: value })} + ) : ( + {t("bank.unused")} + ), + }, + { + title: t("common.actions"), + key: "action", + width: 140, + fixed: "right", + render: (_, item) => { + const used = (item.used_count ?? 0) > 0; + return ( + , + onClick: () => openEdit(item), + }, + used + ? { + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + disabled: true, + tooltip: t("bank.deleteBlocked"), + onClick: () => undefined, + } + : { + kind: "confirm" as const, + key: "delete", + label: t("common.delete"), + icon: , + danger: true, + title: t("bank.deleteTitle"), + description: , + onConfirm: () => remove(item), + }, + ]} + /> + ); + }, + }, + ]; + + return ( + <> + + + + + + ({ + value: chapter.id, + label: chapter.name, + }))} + /> + + } + /> + + {t("bank.hintPrefix")} + onNavigate("llm")}> + {t("bank.hintLink")} + + {t("bank.hintSuffix")} + + } + /> + + {activeTask && ( +
+ {t("bank.taskTitle", { id: activeTask.id })} + + {backendText(activeTask.message)} +
+ )} + + {listState.data && ( + + rowKey="id" + columns={columns} + scroll={{ x: 1240 }} + dataSource={listState.data} + locale={{ + emptyText: ( + + ), + }} + expandable={{ + expandedRowRender: (item) => ( + + ), + }} + /> + )} +
+ + setEditOpen(false)} + form={editForm} + onFinish={(values) => void handleSaveEdit(values as never)} + loading={editBusy} + intro={(editItem?.used_count ?? 0) > 0 + ? t("bank.editIntro") + : undefined} + > + + + + { + if ( + !options || + options.length !== 4 || + options.some((option) => !option?.trim()) || + new Set(options.map((option) => option.trim())).size !== 4 + ) { + throw new Error(t("bank.optionsNeeded")); + } + }, + }, + ]} + > + {(fields) => ( + + {fields.map((field, index) => ( + + + + ))} + + )} + + + + + + + + + + + + + + + setGenOpen(false)} + form={genForm} + onFinish={(values) => void handleGenerate(values as never)} + loading={genBusy} + submitText={t("bank.generateStart")} + intro={t("bank.generateIntro")} + > + + ({ + value: chapter.id, + label: chapter.name, + }))} + /> + + + + + + + ({ + value: channel.id, + label: `${channel.name}${channel.is_default ? t("bank.defaultSuffix") : ""}`, + }))} + /> + + + + {t("bank.needFigure")} + + + + + + + + ); +} diff --git a/frontend/src/pages/Records.tsx b/frontend/src/pages/Records.tsx new file mode 100644 index 0000000..74b7ada --- /dev/null +++ b/frontend/src/pages/Records.tsx @@ -0,0 +1,167 @@ +import { useState } from "react"; +import { Alert, Button, Progress, Space, Tag } from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { api } from "../api/client"; +import { AsyncState } from "../components/Async"; +import { QuestionDetail } from "../components/QuestionDetail"; +import { useApi } from "../components/useApi"; +import { + DataTable, + EmptyState, + Hint, + KnowledgeTags, + Panel, + SubText, + Toolbar, +} from "../components/ui"; +import { useT } from "../prefs"; +import { tagColor } from "../theme"; +import type { AttemptItemDetail, RecordDetail, RecordItem } from "../types"; + +function ItemView({ item }: { item: AttemptItemDetail }) { + const t = useT(); + + return ( + + + + {item.correct ? t("records.correct") : t("records.incorrect")} + + + + + + ); +} + +export default function Records() { + const t = useT(); + + const { data, loading, error, reload } = useApi(api.records); + const [details, setDetails] = useState>({}); + const [loadingId, setLoadingId] = useState(null); + const [detailErrors, setDetailErrors] = useState>({}); + + async function loadDetail(record: RecordItem) { + if (details[record.id] || loadingId !== null) return; + setLoadingId(record.id); + setDetailErrors((prev) => { + const next = { ...prev }; + delete next[record.id]; + return next; + }); + try { + const detail = await api.recordDetail(record.id); + setDetails((prev) => ({ ...prev, [record.id]: detail })); + } catch (err) { + setDetailErrors((prev) => ({ + ...prev, + [record.id]: t("common.loadFailed"), + })); + } finally { + setLoadingId(null); + } + } + + const columns: ColumnsType = [ + { title: t("records.colTime"), dataIndex: "happened_on", width: 130 }, + { title: t("records.colTraining"), dataIndex: "title" }, + { title: t("records.colTotal"), dataIndex: "total", width: 90, align: "center" }, + { title: t("records.colCorrect"), dataIndex: "correct", width: 90, align: "center" }, + { + title: t("records.colRate"), + key: "accuracy", + width: 240, + render: (_: unknown, record) => { + const percent = record.total + ? Math.round((record.correct / record.total) * 100) + : 0; + return ( + + + {record.total - record.correct > 0 ? ( + {t("records.wrongN", { n: record.total - record.correct })} + ) : ( + {t("records.allCorrect")} + )} + + ); + }, + }, + ]; + + return ( + + {t("records.expandHint")}} /> + + {data && ( + + rowKey="id" + columns={columns} + dataSource={data} + locale={{ + emptyText: ( + + ), + }} + expandable={{ + onExpand: (expanded, record) => { + if (expanded) void loadDetail(record); + }, + expandedRowRender: (record) => { + if (loadingId === record.id) { + return ; + } + if (detailErrors[record.id]) { + return ( + void loadDetail(record)} + > + {t("common.retry")} + + } + /> + ); + } + const detail = details[record.id]; + if (!detail) { + return {t("records.detailPending")}; + } + return ( + + {detail.items.map((item) => ( + + ))} + + ); + }, + }} + /> + )} + + ); +} diff --git a/frontend/src/pages/Resources.tsx b/frontend/src/pages/Resources.tsx new file mode 100644 index 0000000..398cd2d --- /dev/null +++ b/frontend/src/pages/Resources.tsx @@ -0,0 +1,376 @@ +/** + * 学习资源页:左侧「教材 / 课程」竖向切换 + 等高卡片 + 分页。 + * 卡片高度固定,内容多的章节目录裁剪淡出,完整目录在详情抽屉里。 + */ +import { useState } from "react"; +import type { ReactNode } from "react"; +import { + Button, + Card, + Col, + Descriptions, + Divider, + Drawer, + Flex, + Grid, + Pagination, + Space, + Row, + Tabs, + Tag, + Typography, +} from "antd"; +import { + BookOutlined, + LinkOutlined, + PlayCircleOutlined, + ReadOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { + EmptyState, + KnowledgeTags, + Page, + Panel, + SubText, +} from "../components/ui"; +import { tagColor } from "../theme"; +import { useT } from "../prefs"; +import type { MsgKey } from "../i18n"; +import type { ChapterItem, Course, Textbook } from "../types"; + +interface ResourcesProps { + onStartChapterTest?: (chapterId: number) => void; + /** 打开内置阅读器在线阅读电子书,page 为章节定位 */ + onReadOnline?: (textbookId: number, page?: number) => void; +} + +/** 卡片底部的在线阅读入口:已读过的书顺带显示进度。 */ +function ReadOnlineAction({ + item, + onReadOnline, +}: { + item: Textbook; + onReadOnline?: (textbookId: number, page?: number) => void; +}) { + const t = useT(); + if (!item.ebook_format || !onReadOnline) return null; + const percent = Math.round((item.ebook_progress?.position ?? 0) * 100); + return ( + + + {percent > 0 && ( + {t("resources.readProgress", { n: percent })} + )} + + ); +} + +/** 卡片列表 + 分页:教材与课程共用,列表非空即显示分页信息。 */ +function CardGrid({ + items, + pageSize, + emptyText, + render, +}: { + items: T[]; + pageSize: number; + emptyText: string; + render: (item: T) => ReactNode; +}) { + const t = useT(); + const [page, setPage] = useState(1); + const pageCount = Math.max(1, Math.ceil(items.length / pageSize)); + const current = Math.min(page, pageCount); + const visible = items.slice((current - 1) * pageSize, current * pageSize); + + return ( + <> + {items.length === 0 ? ( + + ) : ( + + {visible.map(render)} + + )} + {items.length > 0 && ( + + t("common.total", { n: total })} + onChange={setPage} + /> + + )} + + ); +} + +/** + * 章节目录预览:只显示前两条,其余合并成 +N,完整目录在详情抽屉里。 + * 定宽单行,卡片底部才不会被内容撑出参差不齐的高度。 + */ +function ChapterTags({ chapters }: { chapters: ChapterItem[] }) { + if (chapters.length === 0) return null; + return ( +
+ {chapters.slice(0, 2).map((chapter) => ( + + {chapter.name} + + ))} + {chapters.length > 2 && ( + +{chapters.length - 2} + )} +
+ ); +} + +/** Tab 标签:图标 + 名称,不放统计数字,且不折行。 */ +function tabLabel(icon: ReactNode, text: string) { + return ( + + {icon} + {text} + + ); +} + +export default function Resources({ + onStartChapterTest, + onReadOnline, +}: ResourcesProps) { + const t = useT(); + const screens = Grid.useBreakpoint(); + const bookState = useApi(api.textbooks); + const courseState = useApi(api.courses); + const [detailBook, setDetailBook] = useState(null); + const books = bookState.data ?? []; + const courses = courseState.data ?? []; + const loading = bookState.loading || courseState.loading; + const error = bookState.error ?? courseState.error; + + function reload() { + bookState.reload(); + courseState.reload(); + } + + /* 卡片等高靠固定高度,两列时列宽至少要能装下元信息,所以 1200px 以下改单列。 */ + function BookCard(item: Textbook): ReactNode { + return ( + + ISBN {item.isbn} + ) : null + } + onClick={() => setDetailBook(item)} + > + +
+ {item.description} +
+
+
+ + {item.chapters.length > 0 ? ( + + ) : ( + {t("resources.noChapters")} + )} +
+ + + + ); + } + + function CourseCard(item: Course): ReactNode { + return ( + + {item.grade} : null} + > + +
+ {item.description} +
+
+ + {t("resources.openCourse")} + + + + ); + } + + const tabs: Array<{ key: string; icon: ReactNode; labelKey: MsgKey; node: ReactNode }> = [ + { + key: "textbook", + icon: , + labelKey: "resources.textbook", + node: ( + + ), + }, + { + key: "course", + icon: , + labelKey: "resources.course", + node: ( + + ), + }, + ]; + + return ( + + + {bookState.data && courseState.data && ( + ({ + key: tab.key, + label: tabLabel(tab.icon, t(tab.labelKey)), + children: tab.node, + }))} + /> + )} + + setDetailBook(null)} + placement="right" + footer={null} + size={760} + > + {detailBook && ( + + {detailBook.chapters.length === 0 ? ( + + + + ) : ( + detailBook.chapters.map((chapter) => ( + 0)) && ( + + {detailBook.ebook_format && onReadOnline && ( + + )} + {onStartChapterTest && chapter.question_count > 0 && ( + + )} + + ) + } + > + + {t("resources.questionCount", { n: chapter.question_count })} + {chapter.summary ? ` · ${chapter.summary}` : ""} + +
+ +
+
+ )) + )} +
+ )} +
+
+ ); +} diff --git a/frontend/src/pages/Settings.tsx b/frontend/src/pages/Settings.tsx new file mode 100644 index 0000000..ef6c244 --- /dev/null +++ b/frontend/src/pages/Settings.tsx @@ -0,0 +1,212 @@ +import { useRef, useState } from "react"; +import type { ChangeEvent } from "react"; +import { Alert, Button, Divider, Form, Input, Space } from "antd"; +import { + DownloadOutlined, + LockOutlined, + UploadOutlined, + UserOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { backendText } from "../i18n"; +import { FormFooter, Hint, Page, Panel, rules, useUi } from "../components/ui"; +import { useT } from "../prefs"; + +interface SettingsProps { + role: string; + displayName: string; + onDisplayNameChange?: (displayName: string) => void; + onDataImported: () => void; +} + +export default function Settings({ + role, + displayName, + onDisplayNameChange, + onDataImported, +}: SettingsProps) { + const t = useT(); + const { message } = useUi(); + const fileRef = useRef(null); + const [busy, setBusy] = useState(false); + const [form] = Form.useForm(); + + async function handleSave(values: { + display_name: string; + old_password?: string; + new_password?: string; + confirm_password?: string; + }) { + const oldPassword = values.old_password?.trim() ?? ""; + const newPassword = values.new_password?.trim() ?? ""; + const confirmPassword = values.confirm_password?.trim() ?? ""; + const name = values.display_name.trim(); + if (oldPassword || newPassword || confirmPassword) { + if (!oldPassword) { + message.warning(t("settings.oldPasswordRequired")); + return; + } + if (!newPassword) { + message.warning(t("settings.newPasswordRequired")); + return; + } + if (newPassword.length < 6) { + message.warning(t("settings.passwordTooShort")); + return; + } + if (newPassword !== confirmPassword) { + message.warning(t("settings.passwordMismatch")); + return; + } + } + if (!name) { + message.warning(t("settings.nicknameRequired")); + return; + } + setBusy(true); + try { + if (oldPassword && newPassword) { + const result = await api.changePassword(oldPassword, newPassword); + message.success(backendText(result.message)); + } + await api.updateProfile(name); + onDisplayNameChange?.(name); + message.success(t("settings.saved")); + form.setFieldsValue({ + old_password: "", + new_password: "", + confirm_password: "", + }); + } catch (err) { + message.error(err instanceof Error ? err.message : t("settings.msgFailed")); + } finally { + setBusy(false); + } + } + + async function handleExport() { + try { + const blob = await api.exportArchive(); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = t("settings.exportFilename"); + link.click(); + URL.revokeObjectURL(url); + message.success(t("settings.exported")); + } catch { + message.error(t("api.exportFailed")); + } + } + + async function handleImport(event: ChangeEvent) { + const file = event.target.files?.[0]; + event.target.value = ""; + if (!file) return; + try { + const payload = JSON.parse(await file.text()); + const result = await api.importArchive(payload); + message.success(backendText(result.message)); + onDataImported(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("settings.importFailed")); + } + } + + const isAdmin = role === "admin"; + + return ( + + +
+ + } + placeholder={t("settings.nicknameExample")} + /> + + + + {t("settings.changePassword")} + + + } + autoComplete="current-password" + /> + + + } + autoComplete="new-password" + /> + + ({ + validator(_rule, value: string) { + const next = getFieldValue("new_password")?.trim() ?? ""; + const current = value?.trim() ?? ""; + if (!current && !next) return Promise.resolve(); + if (current === next) return Promise.resolve(); + return Promise.reject(new Error(t("settings.passwordMismatch"))); + }, + }), + ]} + > + } + autoComplete="new-password" + /> + + form.submit()} submitText={t("settings.save")} loading={busy} /> + +
+ + {!isAdmin && ( + + {t("settings.profileHint")} + + + + + + + + )} +
+ ); +} + diff --git a/frontend/src/pages/UsersManage.tsx b/frontend/src/pages/UsersManage.tsx new file mode 100644 index 0000000..05275f2 --- /dev/null +++ b/frontend/src/pages/UsersManage.tsx @@ -0,0 +1,283 @@ +import { useState } from "react"; +import { + Button, + Drawer, + Form, + Input, + Select, + Switch, + Tag, +} from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { + ClearOutlined, + KeyOutlined, + LineChartOutlined, + PlusOutlined, + SwapOutlined, +} from "@ant-design/icons"; +import { api } from "../api/client"; +import { HeaderActions } from "../components/Layout"; +import AnalyticsPanel from "../components/AnalyticsPanel"; +import { AsyncState } from "../components/Async"; +import { useApi } from "../components/useApi"; +import { + DataTable, + EditorDrawer, + Hint, + Panel, + RowActions, + Toolbar, + rules, + useUi, +} from "../components/ui"; +import { backendText, roleLabel } from "../i18n"; +import { tagColor } from "../theme"; +import type { UserInfo } from "../types"; +import { useT } from "../prefs"; + +export default function UsersManage() { + const t = useT(); + const { message, modal } = useUi(); + const usersState = useApi(api.users); + const rolesState = useApi(api.roles); + const meState = useApi(api.me); + const [createOpen, setCreateOpen] = useState(false); + const [resetTarget, setResetTarget] = useState(null); + const [analyticsTarget, setAnalyticsTarget] = useState(null); + const [busy, setBusy] = useState(false); + const [form] = Form.useForm(); + const [resetForm] = Form.useForm(); + + const loading = + usersState.loading || rolesState.loading || meState.loading; + const error = usersState.error || rolesState.error || meState.error; + function reloadAll() { + usersState.reload(); + rolesState.reload(); + meState.reload(); + } + + async function handleCreate(values: { + username: string; + display_name: string; + password: string; + role_code: string; + }) { + setBusy(true); + try { + await api.createUser({ + ...values, + display_name: values.display_name || values.username, + }); + message.success(t("users.created")); + setCreateOpen(false); + form.resetFields(); + usersState.reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("users.msgCreateFailed")); + } finally { + setBusy(false); + } + } + + async function handleReset(values: { password: string }) { + if (!resetTarget) return; + setBusy(true); + try { + const result = await api.resetPassword(resetTarget.id, values.password); + message.success(backendText(result.message)); + setResetTarget(null); + resetForm.resetFields(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("users.msgResetFailed")); + } finally { + setBusy(false); + } + } + + async function toggleActive(user: UserInfo, active: boolean) { + try { + await api.updateUser(user.id, { active }); + message.success(active ? t("users.msgEnabled") : t("users.msgDisabled")); + usersState.reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("users.msgOpFailed")); + usersState.reload(); + } + } + + async function toggleRole(user: UserInfo) { + const next = user.roles[0]?.code === "admin" ? "student" : "admin"; + try { + await api.updateUser(user.id, { role_code: next }); + message.success(next === "admin" ? t("users.msgRoleAdmin") : t("users.msgRoleStudent")); + usersState.reload(); + } catch (err) { + message.error(err instanceof Error ? err.message : t("users.msgOpFailed")); + } + } + + function confirmResetLearning() { + modal.confirm({ + title: t("users.wipeTitle"), + content: + t("users.wipeContent"), + okText: t("users.wipeOk"), + okButtonProps: { danger: true }, + onOk: async () => { + const result = await api.resetLearning(); + message.success(backendText(result.message)); + reloadAll(); + }, + }); + } + + const columns: ColumnsType = [ + { title: "ID", dataIndex: "id", width: 70 }, + { title: t("users.username"), dataIndex: "username", render: (value: string) => {value} }, + { title: t("users.displayName"), dataIndex: "display_name" }, + { + title: t("users.role"), + key: "role", + width: 110, + render: (_, user) => ( + + {user.roles[0] ? roleLabel(t, user.roles[0].code, user.roles[0].name) : "—"} + + ), + }, + { + title: t("users.status"), + dataIndex: "active", + width: 110, + render: (active: boolean, user) => ( + toggleActive(user, checked)} + /> + ), + }, + { + title: t("common.actions"), + key: "action", + width: 320, + fixed: "right", + render: (_, user) => { + const isAdminUser = user.roles[0]?.code === "admin"; + const isSelfAdmin = + user.username === meState.data?.username && isAdminUser; + return ( + , + disabled: isSelfAdmin, + tooltip: isSelfAdmin ? t("users.noSelfDemote") : undefined, + onClick: () => toggleRole(user), + }, + { + key: "reset", + label: t("users.resetPassword"), + icon: , + onClick: () => setResetTarget(user), + }, + { + key: "analytics", + label: t("users.analytics"), + icon: , + disabled: isAdminUser, + tooltip: isAdminUser ? t("users.noLearningData") : undefined, + onClick: () => setAnalyticsTarget(user), + }, + ]} + /> + ); + }, + }, + ]; + + return ( + + + + + + {t("users.hint")}} /> + + {usersState.data && ( + + rowKey="id" + columns={columns} + dataSource={usersState.data} + /> + )} + + setCreateOpen(false)} + form={form} + onFinish={(values) => void handleCreate(values as never)} + loading={busy} + submitText={t("common.create")} + intro={t("users.createIntro")} + > + + + + + + + + + + +