From d82a242c466469da1b8b8de796019973724874c8 Mon Sep 17 00:00:00 2001 From: nisconder <2129048448@qq.com> Date: Wed, 28 Oct 2026 11:56:35 +0800 Subject: [PATCH 1/7] Add full-source LaTeX and PostScript project workspace --- .github/workflows/build.yml | 2 +- README.en.md | 147 ++------ README.md | 169 +++------ index.html | 258 ++++++++----- main.js | 6 + project-archive.js | 238 ++++++++++++ project-model.js | 340 +++++++++++++++++ tests/project-archive.test.mjs | 198 ++++++++++ tests/project-model.test.mjs | 201 ++++++++++ tests/workspace-controller.test.mjs | 237 ++++++++++++ tests/workspace-markup.test.mjs | 75 ++++ tests/workspace-ui-flow.test.mjs | 495 ++++++++++++++++++++++++ workspace.css | 187 +++++++++ workspace.js | 567 ++++++++++++++++++++++++++++ 14 files changed, 2792 insertions(+), 328 deletions(-) create mode 100644 project-archive.js create mode 100644 project-model.js create mode 100644 tests/project-archive.test.mjs create mode 100644 tests/project-model.test.mjs create mode 100644 tests/workspace-controller.test.mjs create mode 100644 tests/workspace-markup.test.mjs create mode 100644 tests/workspace-ui-flow.test.mjs create mode 100644 workspace.css create mode 100644 workspace.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 60dfb4d..4587162 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,7 @@ jobs: $tag = $env:GITHUB_REF_NAME $name = "VisualLaTeX-$tag" New-Item -ItemType Directory -Path $name -Force | Out-Null - Copy-Item index.html, style.css, main.js, LICENSE, README.md, README.en.md -Destination $name + Copy-Item index.html, style.css, workspace.css, main.js, workspace.js, project-model.js, project-archive.js, LICENSE, README.md, README.en.md -Destination $name Copy-Item screenshots -Destination $name -Recurse Copy-Item tests -Destination $name -Recurse Compress-Archive -Path $name -DestinationPath "$name.zip" diff --git a/README.en.md b/README.en.md index ad91ac8..24943a2 100644 --- a/README.en.md +++ b/README.en.md @@ -1,142 +1,61 @@ -
+# VisualLaTeX Studio -# VisualLaTeX +**An offline project editor for LaTeX and PostScript.** -**Import · Tweak · Export — an offline LaTeX light editor that preserves original source** +This workspace edition extends [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) with full source editing, multiple files, references, bibliography entries and ZIP projects. It has no runtime dependencies or build step. -[![Version](https://img.shields.io/badge/Version-v2.0.3-6f42c1)](https://github.com/Escap1ng/VisualLaTeX/releases) -[![License](https://img.shields.io/badge/License-Apache_2.0-0366d6)](./LICENSE) -[![CI](https://github.com/Escap1ng/VisualLaTeX/actions/workflows/ci.yml/badge.svg)](https://github.com/Escap1ng/VisualLaTeX/actions/workflows/ci.yml) -[![Online Demo](https://img.shields.io/badge/Online_Demo-GitHub_Pages-00b4d8)](https://Escap1ng.github.io/VisualLaTeX/) -[![Dependencies](https://img.shields.io/badge/Dependencies-none-959da5)](https://github.com/Escap1ng/VisualLaTeX/actions/workflows/build.yml) +## Start -[中文](README.md) · **English** +Unpack the source archive and open `index.html`. The sample project contains `main.tex`, `references.bib` and `drawing.ps`. -
+- Add individual files, open a project folder, or import a ZIP project. +- Edit any text file in source mode, including preambles, macros, references and incomplete source. +- Complete LaTeX documents can switch to the visual editor. Fragments, BibTeX, PostScript and EPS text remain directly editable source. +- Download one file or export the entire project as ZIP, including binary resources and changes in inactive files. ---- - -
- -![VisualLaTeX editor screenshot](screenshots/editor.png) - -
- -## Why This Exists - -It's the night before the deadline, and your advisor only asked you to "change a few sentences and reword a title" — yet the moment you open the `.tex` file, a wall of backslashes and braces stares back at you. Overleaf is great, but it is designed for people who write code. You just want a small, safe change. - -**VisualLaTeX was built for exactly that:** - -| Scenario | Traditional Code Editor | VisualLaTeX | -|:---|:---|:---| -| Small-edit efficiency | Manually locate structures in source | WYSIWYG, click and edit | -| Risk of breakage | Easy to corrupt commands & environments | Complex structures locked verbatim | -| Learning curve | Requires LaTeX fluency | If you can use Word, you're set | - -## Core Workflow - -**Import `.tex` → light visual edits → export `.tex`** - -Unedited source blocks retain their original comments, whitespace, and line endings. Edited regions are regenerated as LaTeX. Structures that cannot be safely converted stay in editable source blocks, fully offline. +Opening a folder or project replaces the current workspace after confirmation. Adding individual files preserves existing files and assigns new names to duplicates. Renaming a path does not rewrite source references automatically. ## Features -| Feature | Details | -|:---|:---| -| One-click import | Open a local `.tex`; sections, paragraphs, lists, formulas, and images become visual elements | -| Split-pane view | Visual editor on the left, live LaTeX source preview on the right | -| Basic formatting | Three heading levels, bold, italic, center, ordered/unordered lists | -| Formula input | 30+ symbols; `$...$`, `$$...$$`, `\(...\)`, and `\[...\]`; double-click visual formulas to edit | -| Verbatim blocks | Tables, bibliographies, code listings shown as-is, editable, never lost on export | -| Command protection | `\cite`, `\ref`, and other reference commands preserved verbatim | -| Image insertion | Enter a path to generate the `figure` float environment | -| One-click export | Copy source or download `.tex`, reusing the imported file name | -| Auto-save | Drafts cached together with the preamble; content survives page refresh | - -## Quick Start - -**Zero install · zero dependencies · zero build** — clone and double-click to run offline: - -```bash -git clone https://github.com/Escap1ng/VisualLaTeX.git -``` +| Feature | Support | +| --- | --- | +| Source files | TeX, LaTeX, STY, CLS, BIB, PS, EPS and UTF-8 text with custom extensions | +| Project management | Create, rename, delete, select main file and preserve relative paths | +| References | Navigate labels, citation locations and BibTeX entries; insert cite/ref/label and add entries | +| Find and replace | Current-file search, wrap-around, replace one/all and case sensitivity | +| History | Independent per-file undo/redo for source and visual changes | +| PostScript | PS/text EPS source, page/procedure outline, templates, UTF-8 and Latin-1 | +| Resources | Preserve original binary bytes, including binary EPS | +| Archives | Read stored/deflated ZIP and export standard ZIP without packages | +| Drafts | Atomic local project snapshots and legacy single-file migration | -Then double-click `index.html`. That's it. +Double-click a protected visual command to locate its editable source; double-click a formula to edit it. Unsupported visual structures remain editable raw TeX. New `main.tex` files have a document template; other TeX files start empty for use as fragments. -You can also use the [online demo](https://Escap1ng.github.io/VisualLaTeX/) (auto-deployed by GitHub Actions). +Shortcuts: Ctrl/Cmd+S saves locally, Ctrl/Cmd+F opens find/replace, Ctrl/Cmd+Z undoes, Ctrl/Cmd+Shift+Z or Ctrl+Y redoes, Tab inserts two spaces. The encoding button explicitly switches UTF-8/Latin-1; unencodable characters are rejected rather than replaced. -## Project Structure +## Limits -``` -VisualLaTeX/ -├── index.html # Main page (layout, toolbar) -├── style.css # Global styles -├── main.js # Editor core, .tex parsing, DOM↔LaTeX conversion -├── tests/ # Zero-dependency smoke and import/export/editing regression checks -├── .github/ # GitHub Actions workflows (CI / release / Pages) -├── README.md # Docs (Chinese) -└── README.en.md # Docs (English) -``` +Projects allow 500 files and 50 MB of expanded content; ZIP input allows 100 MB. Encrypted, multi-disk and ZIP64 archives are unsupported. Browser storage quotas may be smaller; export ZIP backups for larger projects. Undo history is session-local. -## Continuous Integration +Project name, main file and active file are stored in the ZIP comment without reserving or replacing any user filename. Third-party repacking may remove these settings; project source and resources can still be imported. -Automation is powered by GitHub Actions: +The editor **does not execute or render TeX/PostScript and does not compile PDF**. Use an existing TeX/Ghostscript toolchain with the exported files. It does not expand TeX macros or provide full syntax diagnostics. Source mode remains available when visual editing is unsupported. -| Workflow | Trigger | Purpose | -|:---|:---|:---| -| CI | push or PR to `main` or `dev` | Syntax, asset integrity, and import/export/editing regression tests | -| Build & Release | push `v*` version tag | Package and release only after checks pass on that commit | -| Deploy to GitHub Pages | push to `main` | Deploy the [online demo](https://Escap1ng.github.io/VisualLaTeX/) only after checks pass on that commit | +## Development -Run locally with Node.js 22+; no npm packages are needed: +Node.js 22+, no npm installation: ```bash node --check main.js +node --check workspace.js node tests/smoke.mjs node --test ``` -Regression checks cover HTML injection, source round trips, local edits, formulas, images, escaping, and draft recovery. DOM checks use a minimal model; they do not replace real browser interaction or TeX compilation tests. - -## Recommended Workflow - -Import the `.tex` you want to touch up → make visual text and structure adjustments → export and download → drop it back into your project and compile. - -
-Known Limitations - -1. Built on `contenteditable`; complex editing behavior still needs validation in individual browsers -2. No visual table editing (tables are edited as source inside verbatim blocks) -3. Complex/nested environments, multiple images, custom list labels, and `equation` environments use editable source blocks; TeX macros are not expanded -4. This is a light editing tool; for large-scale rewrites, use a code editor - -
- -
-Version History +Tests exercise actual functions and UI event handlers with a minimal DOM model, not a browser engine or TeX/PS compiler. CI checks `main`/`dev`; publishing and deployment wait for checks. -- **v2.0.3**: fixed import data loss and HTML injection — the `.tex` parser now reads commands, environments, math and verbatim blocks, so untouched source blocks are preserved byte for byte; added `\(...\)` and `\[...\]` delimiters plus `\verb` and `\lstinline` support; double-click a visual formula to edit it; drafts are saved atomically with a version marker and flushed when the page is hidden, and legacy drafts are sanitized before restore; added 70 `node --test` regression tests -- **v2.0.2**: mobile and narrow-viewport adaptation — one panel per screen with bottom tabs switching between the editor and LaTeX code, toolbar collapsed into a single horizontally scrollable row with >=44px touch targets, `min-height:0` fix so the code preview is no longer clipped off-screen, `100dvh` and 16px inputs so iOS no longer zooms the page on focus; LaTeX conversion and export logic unchanged -- **v2.0.1**: maintenance release, main.js unchanged; license moved from MIT to Apache-2.0; UI restyled with design tokens and a warm-white academic theme, toolbar buttons switched to plain text; added CI checks and automatic GitHub Pages demo deployment -- **v2.0.0**: repositioned as a general offline LaTeX light editor; added .tex import; verbatim preservation of unsupported structures for lossless round-trips; fixed preamble not being cached with drafts and formulas losing user edits -- **v1.1.0**: visual editor + formula assistant for math-modeling papers (removed in v2.0.0) -- **v1.0.0**: initial release - -
- -## Contributing - -Issue reports and Pull Requests are welcome via the [Issue tracker](https://github.com/Escap1ng/VisualLaTeX/issues). +`workspace.js` coordinates the UI, `project-model.js` owns canonical source/history/indexes, and `project-archive.js` handles ZIP. The original `main.js` remains the visual LaTeX conversion core. ## License -[Apache License 2.0](./LICENSE) © Escap1ng - ---- - -
- -**If this tool saved you an hour, consider leaving a Star** - -
+[Apache-2.0](LICENSE). Based on the original project by Escap1ng. diff --git a/README.md b/README.md index 6edadc3..abaae27 100644 --- a/README.md +++ b/README.md @@ -1,142 +1,85 @@ -
+# VisualLaTeX Studio -# VisualLaTeX +**LaTeX 与 PostScript 的离线项目编辑器。** -**导入 · 轻改 · 导出 —— 保留原文的离线 LaTeX 轻编辑器** +这是基于 [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) 的独立工作区版本,在原有无损导入修复之上,加入完整源码、多文件项目、参考文献与 ZIP 管理。运行时零依赖,无需安装或联网。 -[![Version](https://img.shields.io/badge/Version-v2.0.3-6f42c1)](https://github.com/Escap1ng/VisualLaTeX/releases) -[![License](https://img.shields.io/badge/License-Apache_2.0-0366d6)](./LICENSE) -[![CI](https://github.com/Escap1ng/VisualLaTeX/actions/workflows/ci.yml/badge.svg)](https://github.com/Escap1ng/VisualLaTeX/actions/workflows/ci.yml) -[![Online Demo](https://img.shields.io/badge/Online_Demo-GitHub_Pages-00b4d8)](https://Escap1ng.github.io/VisualLaTeX/) -[![Dependencies](https://img.shields.io/badge/Dependencies-none-959da5)](https://github.com/Escap1ng/VisualLaTeX/actions/workflows/build.yml) +**所有文本文件都能直接编辑。** 导言区、宏定义、`\cite`、`\ref`、`\label`、BibTeX 条目以及 PostScript 程序不再受可视化解析能力限制。未完成的源码也可以保存和导出。 -**中文** · [English](README.en.md) +## 开始使用 -
+下载并解压源码包,双击 `index.html`。默认项目包含 `main.tex`、`references.bib` 和 `drawing.ps`。 ---- +1. 用「添加文件」加入文件,或用「打开文件夹」「打开项目」导入目录/ZIP。 +2. 从左侧选择文件,在源码区直接修改。`main.tex` 等完整 LaTeX 文档还可切换到「可视化」。 +3. 用「下载文件」导出当前文件,或用「导出 ZIP」保存整个项目及资源。 -
+打开文件夹或项目包会在确认后替换当前项目;添加文件会保留已有文件,并自动为重名文件另起名称。源码中已有的 `\input`、图片路径和引用键不会因重命名文件而自动重写。 -![VisualLaTeX 编辑器界面](screenshots/editor.png) +## 编辑能力 -
+| 功能 | 支持范围 | +| --- | --- | +| 完整源码 | `.tex`、`.latex`、`.sty`、`.cls`、`.bib`、`.ps`、`.eps` 及自定义扩展名的 UTF-8 文本文件 | +| 多文件工作区 | 新建、重命名、删除、设定主文件;保留相对目录结构 | +| 源码/可视化 | 切换时同步内容;不完整 TeX、片段、BibTeX 和 PostScript 始终可用源码模式 | +| 引用与文献 | 定位标签、引用位置和 BibTeX 条目;插入 `\cite` / `\ref` / `\label`,新增文献条目 | +| 查找替换 | 当前文件查找、循环查找、单次替换、全部替换、区分大小写 | +| 撤销重做 | 每个文件独立历史,支持源码和可视化编辑;同一输入过程合并成一步 | +| PostScript | `.ps` / 文本 `.eps` 源码编辑、页面/过程导航、示例文件、UTF-8 与 Latin-1 编码 | +| 图片等资源 | 二进制文件按原始字节保存;二进制 EPS 保留为资源,可单独下载 | +| 项目 ZIP | 导入 stored/deflate ZIP,导出标准 ZIP;包含未打开文件的编辑及原始资源 | +| 本机草稿 | 整个项目单次保存;失败时显示状态;兼容旧版单文档草稿迁移 | -## 为什么需要它 +在可视化中双击引用命令会定位到源码,直接修改完整命令。双击公式可使用公式编辑窗口。LaTeX 章节、基础格式、列表、公式和简单图片保留可视化支持;复杂结构以可编辑原文块呈现。 -论文截稿前夜,导师只让你"改几句话、换个标题"——可一打开 `.tex`,满屏反斜杠和花括号扑面而来。Overleaf 很强,但它为写代码的人设计;你只想安全地小改一下。 +新建 `main.tex` 会生成完整文档;其他 `.tex` 文件默认留空,适合 `\input` 的章节片段。新建 `.ps` / `.eps` 会提供对应模板。 -**VisualLaTeX 就是为此而生:** +## 快捷键 -| 场景 | 传统代码编辑器 | VisualLaTeX | -|:---|:---|:---| -| 小改动效率 | 在源码中手动定位结构 | 所见即所得,直接点改 | -| 误改风险 | 容易碰坏命令与环境 | 未编辑的源码块保留原文,复杂结构使用原文块 | -| 上手成本 | 需熟悉 LaTeX 语法 | 会用 Word 就会用 | +| 快捷键 | 操作 | +| --- | --- | +| Ctrl/Cmd + S | 保存本机项目草稿 | +| Ctrl/Cmd + F | 当前文件查找替换 | +| Ctrl/Cmd + Z | 撤销 | +| Ctrl/Cmd + Shift + Z / Ctrl + Y | 重做 | +| Tab | 在源码中插入两个空格 | -## 核心工作流 +底栏的编码按钮可显式切换 UTF-8 / Latin-1。Latin-1 不能表达的字符不会被静默替换;需要输入这些字符时先切换编码。 -**导入 `.tex` → 可视化轻改 → 导出 `.tex`** +## 数据与边界 -未编辑的源码块按原文保留,包括注释、空白与换行;编辑过的区段重新生成 LaTeX。无法安全转换的结构以可编辑原文块保留,全程离线。 +- 项目最多 500 个文件、展开后 50 MB;ZIP 包最多 100 MB。加密、分卷和 ZIP64 包暂不支持。 +- 浏览器自动保存容量由浏览器决定,可能小于项目导入上限。大项目请使用「导出 ZIP」备份;撤销历史仅保留在当前会话。 +- UTF-8 BOM、原始换行和未编辑的 LaTeX 源码块会被保留。可视化改动的区段会重新生成 LaTeX。 +- ZIP 中的项目名称、主文件和当前文件记录在 ZIP 注释中,不占用或覆盖用户文件名;第三方重新打包可能移除这些设置,但源码和资源仍可导入。 +- 本版本负责编辑与项目管理,**不执行 TeX 或 PostScript 程序,也不编译/渲染 PDF、PS**。将导出的项目交给现有 TeX / Ghostscript 工具链处理。 +- 不支持 TeX 宏展开或完整语法诊断。可视化能力不足时,完整源码仍可编辑。 -## 功能一览 +## 开发与验证 -| 功能 | 说明 | -|:---|:---| -| 一键导入 | 打开本地 `.tex`,章节、段落、列表、公式、图片自动转为可视化元素 | -| 双栏同屏 | 左侧可视化编辑,右侧 LaTeX 源码实时预览 | -| 基础排版 | 三级标题、加粗、斜体、居中、有序/无序列表 | -| 公式输入 | 30+ 符号快捷面板,支持 `$...$`、`$$...$$`、`\(...\)`、`\[...\]`;双击已有可视化公式可修改 | -| 原样保留块 | 表格、参考文献、代码清单等复杂结构原文展示、可编辑、导出不丢失 | -| 命令保护 | `\cite`、`\ref` 等引用命令原样保留,绝不被转义破坏 | -| 图片插入 | 填写路径自动生成 `figure` 浮动环境 | -| 一键导出 | 复制源码或下载 `.tex`,自动沿用导入文件名 | -| 自动缓存 | 草稿连同导言区一起保存,刷新页面内容不丢失 | - -## 快速开始 - -**零安装 · 零依赖 · 零构建**,克隆后双击即可离线运行: - -```bash -git clone https://github.com/Escap1ng/VisualLaTeX.git -``` - -然后双击 `index.html`。就这样。 - -也可以直接使用[在线预览版](https://Escap1ng.github.io/VisualLaTeX/)(由 GitHub Actions 自动部署)。 - -## 项目结构 - -``` -VisualLaTeX/ -├── index.html # 主页面(布局、工具栏) -├── style.css # 全局样式 -├── main.js # 编辑器核心、.tex 解析、DOM↔LaTeX 转换 -├── tests/ # 零依赖冒烟检查与导入/导出/编辑回归测试 -├── .github/ # GitHub Actions 工作流(CI / 自动发布 / Pages 部署) -├── README.md # 项目说明(中文) -└── README.en.md # 项目说明(English) -``` - -## 持续集成 - -项目使用 GitHub Actions 实现自动化检查与发布: - -| 工作流 | 触发时机 | 作用 | -|:---|:---|:---| -| CI | 推送 `main`、`dev` / 针对这两个分支的 PR | JS 语法、资源完整性及导入/导出/编辑回归测试 | -| Build & Release | 推送 `v*` 版本标签 | 同一提交检查通过后打包并上传 GitHub Release | -| Deploy to GitHub Pages | 推送 `main` | 同一提交检查通过后部署[在线预览版](https://Escap1ng.github.io/VisualLaTeX/) | - -本地验证(Node.js 22+,无需安装 npm 包): +Node.js 22+,无需安装 npm 包: ```bash node --check main.js +node --check workspace.js node tests/smoke.mjs node --test ``` -回归测试覆盖 HTML 注入防护、源码往返、局部编辑、公式、图片、转义字符及草稿恢复。DOM 测试使用最小模型,不替代真实浏览器交互或 TeX 编译验证。 +测试覆盖源码往返、HTML 注入、草稿迁移、多文件历史、引用索引、PostScript/资源字节、ZIP 完整性以及实际界面事件。DOM 测试使用最小模型,不代表真实浏览器布局或 TeX/PS 编译验证。 -## 推荐工作流 +CI 检查 `main` / `dev` 的推送与 PR;部署和发布都在检查通过后执行。 -导入要修改的 `.tex` → 可视化完成文字与结构调整 → 导出下载 → 放回原项目编译。 - -
-已知限制 - -1. 基于 `contenteditable`,不同浏览器的复杂编辑行为仍需实际验证 -2. 不支持可视化表格编辑(表格以原样保留块形式编辑源码) -3. 复杂/嵌套环境、多图、带自定义标签的列表及 `equation` 环境以原文块编辑;不执行 TeX 宏展开 -4. 定位是轻量修改工具,大规模重写建议直接使用代码编辑器 - -
- -
-版本历史 - -- **v2.0.3**:修复导入丢内容与 HTML 注入——重写 `.tex` 解析,按命令、环境、数学、逐字块读取,未编辑的源码块逐字节保留;新增 `\(...\)`、`\[...\]` 定界符与 `\verb`、`\lstinline` 支持;双击已有公式可编辑;草稿按版本原子保存并在离开页面时落盘,旧草稿恢复前先清洗;新增 `node --test` 回归测试 70 例 -- **v2.0.2**:手机端与窄屏适配——一屏一个面板,底部 tab 在编辑区与 LaTeX 代码间切换;工具栏收成单行横向滑动,触控目标 ≥44px;补 `min-height:0` 修复代码预览被裁出屏幕;改用 `100dvh` 与 16px 输入框,iOS 聚焦不再放大整页;LaTeX 转换与导出逻辑未改动 -- **v2.0.1**:维护版本,main.js 未作修改;许可证由 MIT 改为 Apache-2.0;界面改用 design tokens 与学术暖白主题,工具栏按钮改为纯文本;新增 CI 检查与 GitHub Pages 在线演示的自动部署 -- **v2.0.0**:去垂直化改造,转型为通用离线 LaTeX 轻编辑器;新增 .tex 导入;未支持结构原样保留,实现往返保真;修复导言区不随草稿缓存、公式误改丢数据等问题 -- **v1.1.0**:可视化编辑器 + 数模公式助手(已被 v2.0.0 移除) -- **v1.0.0**:首个版本 - -
- -## 参与贡献 - -欢迎提交 [Issue](https://github.com/Escap1ng/VisualLaTeX/issues) 或 Pull Request。 - -## 开源协议 - -[Apache License 2.0](./LICENSE) © Escap1ng - ---- - -
+``` +index.html / workspace.css 工作台界面 +workspace.js 文件、编辑模式、查找替换与导入导出协调 +project-model.js 源码、项目状态、历史、引用索引 +project-archive.js 无依赖 ZIP 读写 +main.js / style.css LaTeX 解析、转换及可视化编辑核心 +tests/ 零依赖回归测试 +``` -**如果这个工具帮你省下了一小时,欢迎点一个 Star** +## 许可 -
+沿用 [Apache-2.0](LICENSE)。原项目由 Escap1ng 开发,本分支在其基础上扩展。 diff --git a/index.html b/index.html index d25ff0c..f6f6fdf 100644 --- a/index.html +++ b/index.html @@ -3,135 +3,193 @@ - VisualLaTeX - 离线 LaTeX 轻编辑器 + VisualLaTeX Studio · LaTeX 与 PostScript 工作台 + - +
- -
-

VisualLaTeX · 离线 LaTeX 轻编辑器

-

导入 .tex 文件,可视化轻量修改,右侧实时生成 LaTeX 代码,全程离线运行

-
- - -
- - - - -
- - - - - -
- - - - -
- - - - - -
- - - - - -
- - - -
- - - +
+
+

VisualLaTeX Studio

+ TeX PS +
+
+ + +
+
+ + + +
+
+ + - -
- -
-
可视化编辑区
-
-

欢迎使用 VisualLaTeX

-

这是一个纯前端、零依赖、完全离线的 LaTeX 轻编辑器,适合对已有论文做快速小修改。

+
+ + +
+
+
+ LaTeX + main.tex +
+
+ + +
+
-

三步上手

-
    -
  1. 点击工具栏的「导入 .tex」,选择本地的 LaTeX 文件
  2. -
  3. 在左侧修改文字、标题与列表,双击已有公式可打开编辑
  4. -
  5. 点击「下载文件」导出修改后的 .tex,或复制代码到剪贴板
  6. -
+ -

公式示例

-

行内公式示例:$E=mc^2$

+
+ + +
-
$$\int_{a}^{b} f(x) \, dx = F(b) - F(a)$$
+ -

小提示

-

表格、参考文献、代码清单等复杂结构会以灰色「原样保留块」展示,可以直接编辑其中文本,导出时原样输出,不会丢失内容。修改内容会自动保存为草稿。

+ -
- -
-
LaTeX 代码预览
-
-
+ + + +
- -
- - -
+
+ 就绪 + 项目自动保存 +
+
- -
-
-
- 就绪 -
-
- 草稿自动保存 -
-
+ + + + + + - +
+ diff --git a/main.js b/main.js index a7d23de..8adec58 100644 --- a/main.js +++ b/main.js @@ -230,13 +230,14 @@ function insertBlockFormula() { } // 插入图片 -function insertImage() { - saveEditorSelection(); - const imagePath = prompt('请输入图片路径(LaTeX 中使用的路径):', 'example-image.png'); +function insertImage(options) { + const supplied = options && typeof options.imagePath === 'string'; + if (!supplied) saveEditorSelection(); + const imagePath = supplied ? options.imagePath : prompt('请输入图片路径(LaTeX 中使用的路径):', 'example-image.png'); if (!imagePath) return; - const caption = prompt('请输入图片标题:', '图片标题'); + const caption = supplied ? options.caption : prompt('请输入图片标题:', '图片标题'); if (caption === null) return; - const label = prompt('请输入图片标签(用于引用):', 'fig:example'); + const label = supplied ? options.label : prompt('请输入图片标签(用于引用):', 'fig:example'); if (label === null) return; const img = document.createElement('img'); diff --git a/pdf-preview.mjs b/pdf-preview.mjs new file mode 100644 index 0000000..dc73ddd --- /dev/null +++ b/pdf-preview.mjs @@ -0,0 +1,97 @@ +import {lstat, mkdtemp, readFile, rm, writeFile} from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import {CompilationError, runProcess} from './compiler.mjs'; + +export const PREVIEW_LIMITS = Object.freeze({maxPages: 100, width: 1200, height: 1600, maxImageBytes: 8 * 1024 * 1024}); +const PNG_HEADER = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]); + +function validatePdf(pdf) { + if (!Buffer.isBuffer(pdf) || pdf.length > 80 * 1024 * 1024 || pdf.subarray(0, 5).toString() !== '%PDF-') { + throw new CompilationError('无法预览无效或过大的 PDF', 'PREVIEW_INVALID_PDF'); + } +} + +async function withPdf(pdf, options, action) { + validatePdf(pdf); + const {engine, signal, runner = runProcess, timeoutMs = 20000} = options; + if (!engine?.available || !engine.executable) throw new CompilationError('未安装 Ghostscript,仍可导出 PDF', 'PREVIEW_ENGINE_MISSING'); + if (signal?.aborted) throw new CompilationError('预览已取消', 'PREVIEW_CANCELLED'); + const temporaryParent = path.resolve(options.temporaryParent || os.tmpdir()); + const directory = await mkdtemp(path.join(temporaryParent, 'visuallatex-preview-')); + const input = path.join(directory, 'document.pdf'); + const output = path.join(directory, 'page.png'); + const controller = new AbortController(); + const cancel = () => controller.abort(new CompilationError('预览已取消', 'PREVIEW_CANCELLED')); + signal?.addEventListener('abort', cancel, {once: true}); + if (signal?.aborted) cancel(); + const timer = setTimeout(() => controller.abort(new CompilationError('预览生成超时;仍可导出 PDF', 'PREVIEW_TIMEOUT')), + Math.max(1, Math.min(timeoutMs, 20000))); + const portable = value => value.replace(/\\/g, '/'); + const env = {...process.env, TMPDIR: directory, TEMP: directory, TMP: directory}; + delete env.GS_OPTIONS; + const run = async args => { + if (controller.signal.aborted) throw controller.signal.reason; + const result = await runner(engine.executable, ['-q', '-dSAFER', '-dBATCH', '-dNOPAUSE', + '--permit-file-read=' + portable(input), '--permit-file-write=' + portable(output), ...args], + {cwd: directory, env, signal: controller.signal, input, output}); + if (controller.signal.aborted) throw controller.signal.reason; + if (result.code !== 0) throw new CompilationError('无法生成页面预览;仍可导出 PDF', 'PREVIEW_FAILED', result.log || ''); + return result; + }; + try { + await writeFile(input, pdf, {flag: 'wx'}); + return await action({input: portable(input), output: portable(output), run}); + } catch (problem) { + if (controller.signal.aborted) throw controller.signal.reason; + throw problem; + } finally { + clearTimeout(timer); + signal?.removeEventListener('abort', cancel); + if (path.dirname(directory) === temporaryParent && path.basename(directory).startsWith('visuallatex-preview-')) { + await rm(directory, {recursive: true, force: true, maxRetries: 3}); + } + } +} + +export async function getPdfPreviewInfo(pdf, options = {}) { + if (!options.engine?.available || !options.engine.executable) { + return {available: false, reason: '未安装 Ghostscript,无法显示图片预览;仍可导出 PDF。'}; + } + return withPdf(pdf, options, async ({input, run}) => { + // Pass the filename as a Ghostscript string option, never interpolate it + // into executable PostScript. Only the fixed counting program is run. + const result = await run(['-dNODISPLAY', '-sPDFFile=' + input, '-c', + 'PDFFile (r) file runpdfbegin (VISUALLATEX_PAGE_COUNT:) print pdfpagecount = runpdfend quit']); + const counts = [...String(result.log || '').matchAll(/^VISUALLATEX_PAGE_COUNT:(\d+)\s*$/gm)]; + const pageCount = Number(counts.at(-1)?.[1]); + if (!Number.isSafeInteger(pageCount) || pageCount < 1 || pageCount > 1_000_000) { + throw new CompilationError('无法读取 PDF 页数;仍可导出 PDF', 'PREVIEW_INVALID_PAGE_COUNT'); + } + const {maxPages, width, height} = PREVIEW_LIMITS; + return {available: true, pageCount, maxPages, width, height}; + }); +} + +export async function renderPdfPreviewPage(pdf, page, options = {}) { + const {maxPages, width, height, maxImageBytes} = PREVIEW_LIMITS; + if (!Number.isSafeInteger(page) || page < 1 || page > maxPages || !Number.isSafeInteger(options.pageCount) || page > options.pageCount) { + throw new CompilationError('预览页码超出范围(最多预览前 100 页)', 'PREVIEW_PAGE_RANGE'); + } + return withPdf(pdf, options, async ({input, output, run}) => { + await run(['-sDEVICE=png16m', '-r120', '-g' + width + 'x' + height, '-dFIXEDMEDIA', '-dPDFFitPage', + '-dNumRenderingThreads=1', '-dMaxBitmap=20000000', '-dBufferSpace=20000000', + '-dTextAlphaBits=4', '-dGraphicsAlphaBits=4', '-dFirstPage=' + page, '-dLastPage=' + page, + '-sOutputFile=' + output, '-f', input]); + const info = await lstat(output); + if (!info.isFile() || info.isSymbolicLink() || info.size > maxImageBytes) { + throw new CompilationError('预览图超过大小限制', 'PREVIEW_OUTPUT_TOO_LARGE'); + } + const png = await readFile(output); + if (png.length < 24 || !png.subarray(0, 8).equals(PNG_HEADER) || png.subarray(12, 16).toString() !== 'IHDR' || + png.readUInt32BE(16) !== width || png.readUInt32BE(20) !== height) { + throw new CompilationError('引擎未生成有效尺寸的 PNG 预览', 'PREVIEW_INVALID_IMAGE'); + } + return png; + }); +} diff --git a/preview.css b/preview.css index 5a33e96..d4f385a 100644 --- a/preview.css +++ b/preview.css @@ -20,6 +20,13 @@ .preview-stale { margin: 0; padding: 7px 12px; font-size: 11px; line-height: 1.7; background: #fff3d8; color: #795719; } .pdf-proof { flex: 1; display: flex; min-height: 100px; position: relative; } .pdf-proof iframe { width: 100%; flex: 1; border: 0; background: #dde3ec; } +.preview-page-controls { display: flex; flex: 0 0 auto; align-items: center; justify-content: center; gap: 12px; padding: 7px 10px; background: #f7f9fc; border-bottom: 1px solid var(--border); } +.preview-page-controls span { color: var(--text-secondary); font: 11px var(--editor-font); } +.preview-page-controls button { min-height: 28px; padding: 4px 9px; font-size: 11px; } +.page-preview-status { flex: 0 0 auto; margin: 0; padding: 7px 12px; color: var(--text-secondary); background: #f4f7fb; font-size: 11px; line-height: 1.7; overflow-wrap: anywhere; } +.workspace-app .retry-preview { flex: 0 0 auto; margin: 0; min-height: 30px; border: none; border-radius: 0; background: #f4f7fb; color: var(--accent); font-size: 11px; text-decoration: underline; } +.pdf-page-view { flex: 1; min-width: 0; min-height: 0; overflow: auto; padding: 14px; } +.pdf-page-view img { display: block; width: 100%; height: auto; margin: 0 auto; background: white; box-shadow: 0 2px 10px #26395420; } .pdf-empty { align-self: center; margin: auto; max-width: 280px; padding: 32px 20px; color: var(--text-secondary); text-align: center; font-size: 12px; line-height: 1.9; } .pdf-empty strong { display: block; margin-bottom: 7px; color: var(--text); font-size: 15px; font-weight: 500; } .pdf-open { display: block; flex: 0 0 auto; padding: 6px 12px; background: var(--surface-soft); color: var(--accent); font-size: 10px; text-decoration: underline; } diff --git a/preview.js b/preview.js index d7c972a..cd875fb 100644 --- a/preview.js +++ b/preview.js @@ -44,6 +44,10 @@ this.jobId = null; this.abort = null; this.disposed = false; + this.preview = {state: 'empty', message: '', url: null, key: null, targetKey: null, page: 0, pageCount: 0, maxPages: 100}; + this.previewGeneration = 0; + this.previewAbort = null; + this.previewTask = Promise.resolve(false); } get busy() { return this.phase === 'running'; } emit() { if (!this.disposed) this.onChange(this); } @@ -86,7 +90,7 @@ fresh(request) { return Boolean(this.result && this.result.key === requestKey(request)); } async deleteJob(id) { if (!id || !this.token) return; - try { await this.fetch('/api/jobs/' + encodeURIComponent(id), {method: 'DELETE', headers: this.headers(), credentials: 'same-origin'}); } + try { await this.fetch('/api/jobs/' + encodeURIComponent(id), {method: 'DELETE', headers: this.headers(), credentials: 'same-origin', keepalive: true}); } catch (_) { /* Server timeout/cleanup still bounds an unreachable job. */ } } async cancel() { @@ -95,6 +99,7 @@ this.abort?.abort(); this.abort = null; this.jobId = null; + this.stopPreview(); if (this.busy) { this.phase = 'cancelled'; this.message = '已取消本次编译。'; } this.emit(); await this.deleteJob(id); @@ -103,10 +108,93 @@ this.cancel(); if (this.result) this.urls.revokeObjectURL(this.result.url); this.result = null; + this.releasePreview(); this.stale = false; this.log = ''; this.emit(); } + stopPreview() { + this.previewGeneration++; + this.previewAbort?.abort(); + this.previewAbort = null; + if (this.preview.state === 'loading') { + this.preview.state = this.preview.url ? 'ready' : 'empty'; + this.preview.message = this.preview.url ? '' : '页面预览已暂停,可重新编译或导出 PDF。'; + } + } + releasePreview() { + this.stopPreview(); + if (this.preview.url) this.urls.revokeObjectURL(this.preview.url); + this.preview = {state: 'empty', message: '', url: null, key: null, targetKey: null, page: 0, pageCount: 0, maxPages: 100}; + } + previewSession(result) { + this.stopPreview(); + const generation = this.previewGeneration; + const abort = new AbortController(); + this.previewAbort = abort; + return {abort, current: () => !this.disposed && this.result === result && generation === this.previewGeneration}; + } + async previewResponse(url, signal) { + for (let attempt = 0; ; attempt++) { + const response = await this.fetch(url, {headers: this.headers(), credentials: 'same-origin', cache: 'no-store', signal}); + if (response.ok) return response; + let body; + try { body = await response.json(); } catch (_) { body = {}; } + if (response.status === 409 && body.code === 'PREVIEW_BUSY' && attempt < 2) { + await this.sleep(400, signal); continue; + } + throw new Error(body.error || '页面预览暂时不可用;仍可导出 PDF。'); + } + } + async loadPreview(result = this.result) { + if (!result?.jobId || this.disposed) return false; + const session = this.previewSession(result); + Object.assign(this.preview, {state: 'loading', message: 'PDF 已生成,正在准备页面预览…', targetKey: result.key, pageCount: 0}); + this.emit(); + try { + const response = await this.previewResponse('/api/jobs/' + encodeURIComponent(result.jobId) + '/preview', session.abort.signal); + const metadata = await response.json(); + if (!session.current()) return false; + if (!metadata.available) { + this.preview.state = 'unavailable'; + this.preview.message = (metadata.reason || '未安装 Ghostscript,无法生成页面图片。') + ' 可使用浏览器原生预览或导出 PDF。'; + this.emit(); return false; + } + if (!Number.isSafeInteger(metadata.pageCount) || metadata.pageCount < 1) throw new Error('无法读取 PDF 页数;仍可导出 PDF。'); + this.preview.pageCount = metadata.pageCount; + this.preview.maxPages = Math.min(100, Number.isSafeInteger(metadata.maxPages) && metadata.maxPages > 0 ? metadata.maxPages : 100); + return await this.loadPage(1); + } catch (error) { + if (!session.current()) return false; + this.preview.state = 'failed'; + this.preview.message = '页面预览失败:' + error.message + ' PDF 仍可导出。'; + this.emit(); return false; + } finally { if (session.current()) this.previewAbort = null; } + } + async loadPage(page) { + const result = this.result; + if (!result || this.preview.targetKey !== result.key || !Number.isSafeInteger(page) || page < 1 || + page > Math.min(this.preview.pageCount, this.preview.maxPages) || this.disposed) return false; + const session = this.previewSession(result); + this.preview.state = 'loading'; + this.preview.message = '正在加载第 ' + page + ' 页…'; + this.emit(); + try { + const response = await this.previewResponse('/api/jobs/' + encodeURIComponent(result.jobId) + '/preview/' + page, session.abort.signal); + const blob = await response.blob(); + if (!session.current()) return false; + if (!blob.size || (blob.type && !/^image\/png(?:;|$)/i.test(blob.type))) throw new Error('服务未返回有效页面图片。'); + const url = this.urls.createObjectURL(new Blob([blob], {type: 'image/png'})); + if (this.preview.url) this.urls.revokeObjectURL(this.preview.url); + Object.assign(this.preview, {state: 'ready', message: '', url, key: result.key, page}); + this.emit(); return true; + } catch (error) { + if (!session.current()) return false; + this.preview.state = 'failed'; + this.preview.message = '页面加载失败:' + error.message + ' 可重试或导出 PDF。'; + this.emit(); return false; + } finally { if (session.current()) this.previewAbort = null; } + } async compile() { if (this.busy || this.disposed) return false; let request; @@ -119,6 +207,7 @@ : '未找到 Ghostscript。安装后重启本机服务以渲染 PS/EPS。'); } catch (error) { this.phase = 'failed'; this.message = error.message; this.emit(); return false; } const generation = ++this.generation; + this.stopPreview(); const snapshot = requestKey(request); const abort = new AbortController(); this.abort = abort; @@ -163,11 +252,13 @@ if (blob.size === 0) throw new Error('编译器没有生成 PDF 内容。'); const url = this.urls.createObjectURL(new Blob([blob], {type: 'application/pdf'})); if (this.result) this.urls.revokeObjectURL(this.result.url); - this.result = {url, key: snapshot, mainPath: request.mainPath, engine: progress.engine || '', size: blob.size}; + this.result = {url, key: snapshot, jobId: job.id, mainPath: request.mainPath, engine: progress.engine || '', size: blob.size}; this.stale = false; this.phase = 'succeeded'; this.message = request.mainPath + ' · PDF 已更新'; - this.emit(); return true; + this.emit(); + this.previewTask = this.loadPreview(this.result); + return true; } if (progress.state !== 'running') throw new Error('无法识别编译任务状态。'); if (Date.now() - started > this.maxWait) throw new Error('编译等待超时,请检查日志或重试。'); @@ -204,14 +295,17 @@ this.cancel(); if (this.result) this.urls.revokeObjectURL(this.result.url); this.result = null; + this.releasePreview(); } } function initCompilation(app) { const $ = id => document.getElementById(id); let lastModel = app.model; + let lastMainPath = app.model.mainPath; let targetList = ''; let shownUrl = null; + let shownPageUrl = null; const preview = $('pdfPreviewPane'); function showPreview(show = true) { preview.hidden = !show; @@ -221,7 +315,8 @@ function targets() { const files = app.model.list().filter(kindForFile); const signature = JSON.stringify(files.map(file => file.path)); - if (signature !== targetList || app.model !== lastModel) { + const mainChanged = app.model.mainPath !== lastMainPath; + if (signature !== targetList || app.model !== lastModel || mainChanged) { const old = app.model === lastModel ? $('compileTarget').value : null; $('compileTarget').replaceChildren(); for (const file of files) { @@ -229,14 +324,17 @@ option.value = file.path; option.textContent = file.path; $('compileTarget').appendChild(option); } - $('compileTarget').value = files.some(file => file.path === old) ? old + $('compileTarget').value = mainChanged && files.some(file => file.path === app.model.mainPath) ? app.model.mainPath + : files.some(file => file.path === old) ? old : files.some(file => file.path === app.model.mainPath) ? app.model.mainPath : files[0]?.path || ''; targetList = signature; + lastMainPath = app.model.mainPath; } } const controller = new CompilationController({ getRequest() { app.sync(); + targets(); const mainPath = $('compileTarget').value; const file = app.model.get(mainPath); return {project: JSON.parse(app.model.serialize()), kind: kindForFile(file), mainPath}; @@ -263,8 +361,30 @@ $('previewStale').hidden = !controller.stale; $('previewStale').textContent = '当前显示上一次结果;请重新编译以反映最新源码。'; $('pdfEmpty').hidden = Boolean(controller.result); - $('pdfFrame').hidden = !controller.result; + const page = controller.preview; + const showingImage = Boolean(page.url && controller.result && (page.key === controller.result.key || page.state === 'loading')); + $('pdfPageView').hidden = !showingImage; + $('pdfFrame').hidden = !controller.result || showingImage || page.state === 'loading'; + $('pagePreviewStatus').hidden = !controller.result || !page.message; + $('pagePreviewStatus').textContent = page.message; + const knownPages = Boolean(controller.result && page.targetKey === controller.result.key && page.pageCount); + $('previewPageControls').hidden = !knownPages; + const currentPage = page.key === controller.result?.key ? page.page : 0; + const limit = Math.min(page.pageCount, page.maxPages); + $('previewPageNumber').textContent = (currentPage || '—') + ' / ' + page.pageCount + (page.pageCount > page.maxPages ? '(预览前 ' + page.maxPages + ' 页)' : ''); + $('btnPreviousPage').disabled = page.state === 'loading' || currentPage <= 1; + $('btnNextPage').disabled = page.state === 'loading' || !currentPage || currentPage >= limit; + $('btnRetryPage').hidden = !controller.result || !['failed', 'unavailable', 'empty'].includes(page.state); + $('previewStale').hidden = !controller.stale && !(showingImage && page.key !== controller.result.key); + $('previewStale').textContent = showingImage && page.key !== controller.result.key + ? '当前仍显示上一次编译的页面,正在加载新结果。' : '当前显示上一次结果;请重新编译以反映最新源码。'; $('pdfOpen').hidden = !controller.result; + if (page.url !== shownPageUrl) { + shownPageUrl = page.url; + if (shownPageUrl) $('pdfPageImage').src = shownPageUrl; + else $('pdfPageImage').removeAttribute('src'); + } + $('pdfPageImage').alt = 'PDF 第 ' + (page.page || 1) + ' 页'; if (controller.result?.url !== shownUrl) { shownUrl = controller.result?.url || null; if (shownUrl) { $('pdfFrame').src = shownUrl; $('pdfOpen').href = shownUrl; } @@ -283,18 +403,40 @@ render(); }; $('compileTarget').addEventListener('change', () => { controller.markChanged(); render(); }); + $('setMainFile').addEventListener('click', () => { + targets(); + // An explicit "set main file" action also wins when this file was + // already main but the preview dropdown was manually set elsewhere. + if (kindForFile(app.model.get(app.model.mainPath))) $('compileTarget').value = app.model.mainPath; + controller.markChanged(); render(); + }); $('btnTogglePreview').addEventListener('click', () => showPreview(preview.hidden)); $('btnClosePreview').addEventListener('click', () => showPreview(false)); $('btnCompile').addEventListener('click', () => { showPreview(); controller.compile(); }); $('btnCancelCompile').addEventListener('click', () => controller.cancel()); $('btnExportPdf').addEventListener('click', () => { showPreview(); controller.exportPdf(); }); $('btnCompilerRetry').addEventListener('click', () => controller.connect()); + $('btnPreviousPage').addEventListener('click', () => { controller.previewTask = controller.loadPage(controller.preview.page - 1); }); + $('btnNextPage').addEventListener('click', () => { controller.previewTask = controller.loadPage(controller.preview.page + 1); }); + $('btnRetryPage').addEventListener('click', () => { controller.previewTask = controller.loadPreview(); }); document.addEventListener('keydown', event => { if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') { event.preventDefault(); showPreview(); controller.compile(); } }); - window.addEventListener('pagehide', () => controller.destroy()); + window.addEventListener('pagehide', event => { + if (event.persisted) controller.cancel(); + else controller.destroy(); + }); + window.addEventListener('pageshow', event => { + if (!event.persisted) return; + targets(); controller.markChanged(); + controller.connect().then(connected => { + if (connected && controller.result && (!controller.preview.url || controller.preview.key !== controller.result.key)) { + controller.previewTask = controller.loadPreview(); + } + }); + }); app.compilation = controller; render(); controller.connect(); diff --git a/server.mjs b/server.mjs index 82d7375..905fec9 100644 --- a/server.mjs +++ b/server.mjs @@ -4,6 +4,7 @@ import {readFile} from 'node:fs/promises'; import {dirname, join, resolve} from 'node:path'; import {fileURLToPath} from 'node:url'; import {compileProject, discoverEngines} from './compiler.mjs'; +import {getPdfPreviewInfo, renderPdfPreviewPage} from './pdf-preview.mjs'; const ROOT = dirname(fileURLToPath(import.meta.url)); const MAX_BODY_BYTES = 80 * 1024 * 1024; @@ -52,12 +53,14 @@ function readJson(req, limit) { export function createWorkspaceServer({ compiler = compileProject, enginesProvider = discoverEngines, root = ROOT, token = randomBytes(32).toString('hex'), maxBodyBytes = MAX_BODY_BYTES, - jobTTL = 10 * 60_000, maxJobs = 8, now = Date.now + jobTTL = 10 * 60_000, maxJobs = 8, now = Date.now, + previewInfo = getPdfPreviewInfo, previewRenderer = renderPdfPreviewPage } = {}) { const jobs = new Map(); const tokenBytes = Buffer.from(token); let enginePromise; let enginesAt = 0; + let previewActive = null; const getEngines = () => { if (!enginePromise || now() - enginesAt > 30_000) { enginesAt = now(); @@ -65,8 +68,29 @@ export function createWorkspaceServer({ } return enginePromise; }; + function discard(job) { + if (previewActive?.job === job) previewActive.controller.abort(); + jobs.delete(job.id); + } function sweep() { - for (const [id, job] of jobs) if (!job.active && now() - job.finishedAt >= jobTTL) jobs.delete(id); + for (const job of jobs.values()) if (!job.active && now() - job.finishedAt >= jobTTL) discard(job); + } + async function previewOperation(job, res, operation) { + if (previewActive) throw error('已有页面预览正在生成,请稍后重试。', 409, 'PREVIEW_BUSY'); + const active = {job, controller: new AbortController()}; + previewActive = active; + const disconnected = () => { if (!res.writableEnded) active.controller.abort(); }; + res.once('close', disconnected); + try { + const engines = await getEngines(); + if (active.controller.signal.aborted) throw error('预览已取消。', 409, 'PREVIEW_CANCELLED'); + const value = await operation({engine: engines.postscript, signal: active.controller.signal}); + if (active.controller.signal.aborted || jobs.get(job.id) !== job) throw error('编译结果已过期,请重新编译。', 404, 'JOB_NOT_FOUND'); + return value; + } finally { + res.removeListener('close', disconnected); + if (previewActive === active) previewActive = null; + } } function authorised(req) { const supplied = Buffer.from(String(req.headers['x-visuallatex-token'] || '')); @@ -112,7 +136,7 @@ export function createWorkspaceServer({ while (jobs.size >= maxJobs) { const oldest = [...jobs.values()].find(job => !job.active); if (!oldest) throw error('编译服务繁忙。', 409, 'COMPILER_BUSY'); - jobs.delete(oldest.id); + discard(oldest); } const job = {id: randomUUID(), state: 'running', active: true, log: '', mainPath: payload.mainPath, controller: new AbortController(), startedAt: now(), finishedAt: null}; @@ -139,10 +163,11 @@ export function createWorkspaceServer({ }).finally(() => { job.active = false; job.finishedAt = now(); }); return; } - const match = /^\/api\/jobs\/([0-9a-f-]+)(\/pdf)?$/.exec(path); + const match = /^\/api\/jobs\/([0-9a-f-]+)(\/pdf|\/preview(?:\/([0-9]+))?)?$/.exec(path); const job = match && jobs.get(match[1]); if (!job) throw error('编译结果不存在或已过期,请重新编译。', 404, 'JOB_NOT_FOUND'); if (req.method === 'DELETE' && !match[2]) { + if (previewActive?.job === job) previewActive.controller.abort(); if (job.active) { job.state = 'cancelled'; job.controller.abort(); } @@ -150,11 +175,28 @@ export function createWorkspaceServer({ return; } if (req.method !== 'GET') throw error('不支持的操作。', 405); - if (match[2]) { + if (match[2] === '/pdf') { if (job.state !== 'succeeded') throw error('PDF 尚未生成。', 409, 'PDF_NOT_READY'); res.writeHead(200, {'Content-Type': 'application/pdf', 'Content-Length': job.pdf.length, 'Content-Disposition': 'inline; filename="preview.pdf"'}); res.end(job.pdf); + } else if (match[2]?.startsWith('/preview')) { + if (job.state !== 'succeeded') throw error('PDF 尚未生成。', 409, 'PDF_NOT_READY'); + const info = job.previewInfo || await previewOperation(job, res, options => previewInfo(job.pdf, options)); + if (info.available) job.previewInfo = info; + if (!match[3]) { json(200, info); return; } + if (!info.available) throw error(info.reason || '没有可用的预览引擎,仍可下载 PDF。', 503, 'PREVIEW_ENGINE_MISSING'); + const page = Number(match[3]); + if (!Number.isSafeInteger(page) || page < 1 || page > Math.min(info.pageCount, info.maxPages)) { + throw error('预览页码超出范围(最多预览前 100 页)。', 400, 'PREVIEW_PAGE_RANGE'); + } + const png = job.previewCache?.page === page ? job.previewCache.png + : await previewOperation(job, res, options => previewRenderer(job.pdf, page, {...options, pageCount: info.pageCount})); + job.previewCache = {page, png}; + if (res.destroyed || res.writableEnded) return; + res.writeHead(200, {'Content-Type': 'image/png', 'Content-Length': png.length, + 'X-Preview-Page': String(page), 'X-Preview-Page-Count': String(info.pageCount)}); + res.end(png); } else json(200, {id: job.id, state: job.state, log: job.log, error: job.error, code: job.code, engine: job.engine, mainPath: job.mainPath, ...(job.state === 'succeeded' ? {pdfUrl: '/api/jobs/' + job.id + '/pdf'} : {})}); @@ -175,6 +217,12 @@ export function createWorkspaceServer({ server.headersTimeout = 10_000; const timer = setInterval(sweep, 30_000); timer.unref(); + const close = server.close.bind(server); + server.close = callback => { + previewActive?.controller.abort(); + for (const job of jobs.values()) if (job.active) { job.state = 'cancelled'; job.controller.abort(); } + return close(callback); + }; server.on('close', () => { clearInterval(timer); for (const job of jobs.values()) if (job.active) { job.state = 'cancelled'; job.controller.abort(); } diff --git a/tests/browser-acceptance.md b/tests/browser-acceptance.md new file mode 100644 index 0000000..36dce7e --- /dev/null +++ b/tests/browser-acceptance.md @@ -0,0 +1,18 @@ +# 真实浏览器验收清单 + +使用单独的测试项目和本机 `node server.mjs`,先导出需要保留的旧项目。常规 `node --test` 不替代这里的真实浏览器与工具链验证。 + +1. **完整编辑**:修改项目名称,立即切换文件、编辑,再刷新。名称和源码应恢复。新建 `sections/method.tex`,输入章节与 `\label`;新建/重命名弹窗的确认与取消都应工作,即使宿主不支持原生 `prompt`。 +2. **查找与历史**:替换章节中的一句话,撤销后恢复原文,重做后恢复新文。切换其他文件不应混用历史。 +3. **多文件与引用**:主文档用 `\input{sections/method}`、`\ref` 和 `\cite`,参考文献写入 `.bib`。切换可视化再返回源码,导言区和引用命令应保留。 +4. **主文件**:选择 `.ps` 并设为主文件,编译目标应同步;手动更改编译目标后,普通编辑不应重置目标。对原主文件再次点击「设为主文件」仍应切回该文件。 +5. **LaTeX 编译与下载**:编译主文档,检查实际页面文字、中文、编号和文献。导出 PDF 后用 PDF 阅读工具确认页数与文本,不能只检查 HTTP 成功状态。 +6. **修改后导出**:先编译成功,再修改章节文本。预览应显示旧结果提示;直接点击「导出 PDF」应先重新编译,下载文件须包含新文本。 +7. **PostScript**:输入两页 PS,分别绘制矩形和圆形并写入不同页标题。渲染后使用下一页和上一页,页码、图片与标题均须一致;导出 PDF 必须包含两页。 +8. **错误与取消**:缺少 `\input` 文件时应显示编译错误与日志,源码仍可改;输入 `%!PS\n{} loop` 后取消,随后恢复有效源码应能再次编译。失败或取消时,上次结果必须标明过期。 +9. **项目往返**:导出 ZIP,临时修改项目名,再打开刚导出的 ZIP 并确认替换。核对文件、路径、源码、项目名和主文件均恢复。 +10. **布局与生命周期**:在桌面双栏和窄屏中检查编辑/预览切换;刷新、离开页面再返回后,编辑和编译应继续工作。查看控制台是否存在未处理异常。 + +PDF 图片预览依赖 Ghostscript,不依赖浏览器内置 PDF 插件。还需分别测试缺失 Ghostscript 的提示和 PDF 导出、服务不可用、图片渲染失败/重试;这些边界也有自动回归测试。 + +本次验收环境:Windows、Chromium 内嵌浏览器、Tectonic 0.17.0、Ghostscript 10.08.0。中文样例使用 `ctex` 的 `fontset=windows`。这不代表已覆盖 Safari、Firefox、移动设备或真实 XeLaTeX 发行版。 diff --git a/tests/editor-regression.test.mjs b/tests/editor-regression.test.mjs index 7238ed5..db88623 100644 --- a/tests/editor-regression.test.mjs +++ b/tests/editor-regression.test.mjs @@ -129,6 +129,26 @@ test('an external selection is never deleted or used for insertion', () => { assert.equal(f.ids.editorArea.childNodes[0].tagName, 'IMG'); }); +test('image parameters from an asynchronous dialog restore the saved editor selection without native prompts', () => { + const f = fixture(); + const original = new f.Element('p'); + original.textContent = 'Original text'; + f.ids.editorArea.appendChild(original); + f.selection.addRange(new f.Range(f.ids.editorArea, 0)); + f.context.saveEditorSelection(); + f.selection.removeAllRanges(); + const outside = new f.Element('input'); + const externalRange = new f.Range(outside); + f.selection.addRange(externalRange); + f.context.insertImage({imagePath: 'figure.png', caption: 'Caption', label: 'fig:async'}); + assert.equal(f.calls.prompts, 0); + assert.equal(f.calls.saves, 1); + assert.equal(externalRange.deleted, false); + assert.equal(f.ids.editorArea.childNodes[0].tagName, 'IMG'); + assert.equal(f.ids.editorArea.childNodes[0].getAttribute('data-caption'), 'Caption'); + assert.ok(f.ids.editorArea.childNodes.includes(original)); +}); + test('cancelling the image path immediately stops the interaction', () => { const f = fixture(); f.prompts.push(null); diff --git a/tests/pdf-preview.test.mjs b/tests/pdf-preview.test.mjs new file mode 100644 index 0000000..5c40f20 --- /dev/null +++ b/tests/pdf-preview.test.mjs @@ -0,0 +1,78 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {mkdtemp, readdir, rm, writeFile} from 'node:fs/promises'; +import path from 'node:path'; +import os from 'node:os'; +import {getPdfPreviewInfo, renderPdfPreviewPage, PREVIEW_LIMITS} from '../pdf-preview.mjs'; + +const pdf = Buffer.from('%PDF-1.7\nfixture\n%%EOF'); +const engine = {available: true, executable: '/configured/gs'}; +const png = Buffer.alloc(24); +Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]).copy(png); +png.write('IHDR', 12); png.writeUInt32BE(1200, 16); png.writeUInt32BE(1600, 20); +async function directory(t) { + const folder = await mkdtemp(path.join(os.tmpdir(), 'visual-preview-test-')); + t.after(() => rm(folder, {recursive: true, force: true})); + return folder; +} + +test('preview metadata counts pages with a fixed program and cleans the staged PDF', async t => { + const temporaryParent = await directory(t); + const info = await getPdfPreviewInfo(pdf, {engine, temporaryParent, runner: async (_, args, options) => { + assert.ok(args.includes('-dSAFER')); + assert.ok(args.includes('-dNODISPLAY')); + assert.ok(args.some(arg => arg.startsWith('-sPDFFile='))); + assert.equal(args.at(-1), 'PDFFile (r) file runpdfbegin (VISUALLATEX_PAGE_COUNT:) print pdfpagecount = runpdfend quit'); + assert.equal(options.env.GS_OPTIONS, undefined); + return {code: 0, log: 'VISUALLATEX_PAGE_COUNT:2\n'}; + }}); + assert.deepEqual(info, {available: true, pageCount: 2, maxPages: 100, width: 1200, height: 1600}); + assert.deepEqual(await readdir(temporaryParent), []); +}); + +test('one PDF page is rendered on a fixed pixel canvas without clipping the original page', async t => { + const temporaryParent = await directory(t); + const result = await renderPdfPreviewPage(pdf, 2, {engine, pageCount: 2, temporaryParent, runner: async (_, args, options) => { + for (const flag of ['-dSAFER', '-sDEVICE=png16m', '-g1200x1600', '-dFIXEDMEDIA', '-dPDFFitPage', '-dFirstPage=2', '-dLastPage=2']) assert.ok(args.includes(flag)); + assert.ok(!args.includes('-dNOSAFER')); + await writeFile(options.output, png); return {code: 0}; + }}); + assert.deepEqual(result, png); + assert.deepEqual(await readdir(temporaryParent), []); +}); + +test('missing engines, invalid input and page limits do not run a preview process', async t => { + const temporaryParent = await directory(t); + let calls = 0; + const options = {engine, temporaryParent, pageCount: 1000, runner: async () => { calls++; }}; + assert.equal((await getPdfPreviewInfo(pdf)).available, false); + for (const page of [0, -1, 1.5, 101, NaN]) await assert.rejects(renderPdfPreviewPage(pdf, page, options), {code: 'PREVIEW_PAGE_RANGE'}); + await assert.rejects(renderPdfPreviewPage(Buffer.from('not pdf'), 1, options), {code: 'PREVIEW_INVALID_PDF'}); + assert.equal(calls, 0); + assert.deepEqual(await readdir(temporaryParent), []); +}); + +test('invalid page counts, engine errors and malformed or oversized images are rejected and cleaned', async t => { + const temporaryParent = await directory(t); + await assert.rejects(getPdfPreviewInfo(pdf, {engine, temporaryParent, runner: async () => ({code: 0, log: 'Not a count'})}), {code: 'PREVIEW_INVALID_PAGE_COUNT'}); + await assert.rejects(getPdfPreviewInfo(pdf, {engine, temporaryParent, runner: async () => ({code: 1, log: 'invalid PDF'})}), {code: 'PREVIEW_FAILED'}); + for (const bytes of [Buffer.from('not PNG'), Buffer.alloc(PREVIEW_LIMITS.maxImageBytes + 1)]) { + await assert.rejects(renderPdfPreviewPage(pdf, 1, {engine, pageCount: 1, temporaryParent, + runner: async (_, __, options) => { await writeFile(options.output, bytes); return {code: 0}; }})); + } + assert.deepEqual(await readdir(temporaryParent), []); +}); + +test('timeout and cancellation stop preview generation and remove all temporary files', async t => { + const temporaryParent = await directory(t); + for (const mode of ['timeout', 'cancel']) { + const controller = new AbortController(); + const pending = getPdfPreviewInfo(pdf, {engine, temporaryParent, signal: controller.signal, timeoutMs: mode === 'timeout' ? 20 : 2000, + runner: (_, __, {signal}) => new Promise((_, reject) => { + signal.addEventListener('abort', () => reject(signal.reason), {once: true}); + if (mode === 'cancel') controller.abort(); + })}); + await assert.rejects(pending, {code: mode === 'timeout' ? 'PREVIEW_TIMEOUT' : 'PREVIEW_CANCELLED'}); + assert.deepEqual(await readdir(temporaryParent), []); + } +}); diff --git a/tests/preview.test.mjs b/tests/preview.test.mjs index 3edc789..9bf036c 100644 --- a/tests/preview.test.mjs +++ b/tests/preview.test.mjs @@ -29,6 +29,7 @@ function fixture(options = {}) { if (url === '/api/compile') return json({id: 'job-' + ++job}, 202); if (init.method === 'DELETE') return json({state: 'cancelled'}); if (url.endsWith('/pdf')) return pdf(); + if (url.endsWith('/preview')) return json({available: false, reason: 'Ghostscript not configured'}); if (url.startsWith('/api/jobs/')) return json({state: controls.status, log: controls.log, error: controls.error, engine: 'Tectonic', pdfUrl: url + '/pdf'}); throw new Error('Unexpected request ' + url); }; @@ -255,7 +256,7 @@ test('preview markup has every production control, accessible labels and initial assert.doesNotMatch(code, /\.innerHTML\s*=/, 'compiler logs and source names must stay inert text'); }); -test('workspace integration binds target selection, compilation, PDF display and project replacement', async () => { +async function workspaceFixture(options = {}) { const ids = new Map(); function element(id = '') { const events = new Map(), attributes = new Map(); @@ -277,7 +278,7 @@ test('workspace integration binds target selection, compilation, PDF display and document.createElement = () => element(); document.body = element(); const window = element(); - const f = fixture({context: {document, window}}); + const f = fixture({...options, context: {document, window}}); const project = structuredClone(f.request.project); const model = { mainPath: project.mainPath, @@ -289,6 +290,12 @@ test('workspace integration binds target selection, compilation, PDF display and const app = {model, sync() { syncs++; }, onChange() { renders++; }}; const controller = f.context.initCompilation(app); while (!controller.token) await new Promise(resolve => setImmediate(resolve)); + return {...f, ids, window, project, model, app, controller, syncCount: () => syncs, renderCount: () => renders}; +} + +test('workspace integration binds target selection, compilation, PDF display and project replacement', async () => { + const f = await workspaceFixture(); + const {ids, window, project, model, app, controller} = f; assert.equal(ids.get('compileTarget').value, 'main.tex'); assert.equal(ids.get('compileTarget').children.length, 2); assert.equal(ids.get('btnCompile').disabled, false); @@ -298,7 +305,7 @@ test('workspace integration binds target selection, compilation, PDF display and assert.equal(ids.get('compilerStatus').textContent, 'Ghostscript'); ids.get('btnCompile').emit('click'); while (controller.busy) await new Promise(resolve => setImmediate(resolve)); - assert.ok(syncs > 0); + assert.ok(f.syncCount() > 0); assert.equal(controller.phase, 'succeeded'); assert.equal(ids.get('pdfPreviewPane').hidden, false); assert.equal(ids.get('pdfFrame').src, 'blob:fixture/1'); @@ -307,13 +314,155 @@ test('workspace integration binds target selection, compilation, PDF display and const submitted = JSON.parse(f.calls.find(call => call.url === '/api/compile').init.body); assert.equal(submitted.kind, 'postscript'); assert.equal(submitted.mainPath, 'figure.eps'); + app.onChange(); + assert.equal(ids.get('compileTarget').value, 'figure.eps', 'ordinary edits preserve the selected compile target'); + ids.get('setMainFile').emit('click'); + assert.equal(ids.get('compileTarget').value, 'main.tex', 'explicitly setting the existing main file wins over a manual preview target'); + model.mainPath = 'figure.eps'; + ids.get('setMainFile').emit('click'); + model.mainPath = 'main.tex'; + ids.get('setMainFile').emit('click'); + assert.equal(ids.get('compileTarget').value, 'main.tex', 'setting a different main file updates the compile target immediately'); + ids.get('compileTarget').value = 'figure.eps'; + window.emit('pagehide', {persisted: true}); + assert.equal(controller.disposed, false); + assert.equal(controller.result.url, 'blob:fixture/1'); + window.emit('pageshow', {persisted: true}); + await new Promise(resolve => setImmediate(resolve)); + assert.equal(controller.disposed, false); + assert.equal(ids.get('btnCompile').disabled, false); project.files[1].base64 = 'changed'; app.onChange(); - assert.equal(renders, 1); + assert.equal(f.renderCount(), 2); assert.equal(ids.get('previewStale').hidden, false); app.model = {...model}; app.onChange(); assert.equal(controller.result, null); assert.equal(ids.get('pdfFrame').hidden, true); assert.deepEqual(f.revoked, ['blob:fixture/1']); + assert.equal(await controller.compile(), true, 'BFCache restoration keeps the controller able to compile'); + window.emit('pagehide', {persisted: false}); + assert.equal(controller.disposed, true); +}); + +test('BFCache resumes the new PDF page when a previous image remains during an interrupted render', async () => { + const pending = deferred(), started = deferred(), resumed = deferred(); + let secondPageRequests = 0; + const f = await workspaceFixture({route: async url => { + if (url.endsWith('/preview')) return json({available: true, pageCount: 1, maxPages: 100}); + if (url === '/api/jobs/job-1/preview/1') return {ok: true, blob: async () => new Blob(['first'], {type: 'image/png'})}; + if (url === '/api/jobs/job-2/preview/1') { + if (++secondPageRequests === 1) { started.resolve(); return pending.promise; } + resumed.resolve(); + return {ok: true, blob: async () => new Blob(['second'], {type: 'image/png'})}; + } + }}); + await f.controller.compile(); await f.controller.previewTask; + const previousImage = f.controller.preview.url; + f.project.files[0].text += '\nUpdated source'; f.app.onChange(); + await f.controller.compile(); + await started.promise; + const interrupted = f.controller.previewTask; + assert.equal(f.controller.preview.url, previousImage); + assert.notEqual(f.controller.preview.key, f.controller.result.key); + f.window.emit('pagehide', {persisted: true}); + f.window.emit('pageshow', {persisted: true}); + await resumed.promise; + assert.equal(await f.controller.previewTask, true); + assert.equal(f.controller.preview.key, f.controller.result.key); + assert.notEqual(f.controller.preview.url, previousImage); + assert.equal(f.ids.get('pdfPageView').hidden, false); + assert.equal(f.ids.get('pdfFrame').hidden, true); + assert.ok(f.revoked.includes(previousImage)); + const currentImage = f.controller.preview.url; + pending.resolve({ok: true, blob: async () => new Blob(['late'], {type: 'image/png'})}); + assert.equal(await interrupted, false); + assert.equal(f.controller.preview.url, currentImage); +}); + +test('page images load independently of PDF export and pagination replaces only the image URL', async () => { + const imageResponse = deferred(), imageStarted = deferred(); + const f = fixture({route: async url => { + if (url.endsWith('/preview')) return json({available: true, pageCount: 3, maxPages: 100}); + if (url.endsWith('/preview/1')) { imageStarted.resolve(); return imageResponse.promise; } + if (url.endsWith('/preview/2')) return {ok: true, blob: async () => new Blob(['png2'], {type: 'image/png'})}; + }}); + await f.controller.connect(); + assert.equal(await f.controller.compile(), true); + await imageStarted.promise; + assert.equal(f.controller.preview.state, 'loading'); + assert.equal(await f.controller.exportPdf(), true, 'PDF download does not wait for image rendering'); + assert.deepEqual(f.downloads, [{url: 'blob:fixture/1', name: 'main.pdf'}]); + imageResponse.resolve({ok: true, blob: async () => new Blob(['png1'], {type: 'image/png'})}); + assert.equal(await f.controller.previewTask, true); + assert.equal(f.controller.preview.url, 'blob:fixture/2'); + assert.equal(f.controller.preview.page, 1); + assert.equal(f.controller.preview.pageCount, 3); + assert.equal(await f.controller.loadPage(2), true); + assert.equal(f.controller.preview.page, 2); + assert.equal(f.controller.preview.url, 'blob:fixture/3'); + assert.deepEqual(f.revoked, ['blob:fixture/2']); + assert.equal(f.controller.result.url, 'blob:fixture/1'); + for (const call of f.calls.filter(call => call.url.includes('/preview'))) assert.equal(call.init.headers['X-VisualLaTeX-Token'], 'test-token'); + f.controller.destroy(); + assert.deepEqual(f.revoked, ['blob:fixture/2', 'blob:fixture/1', 'blob:fixture/3']); +}); + +test('missing Ghostscript falls back without invalidating a successful downloadable PDF', async () => { + const f = fixture(); + await f.controller.connect(); await f.controller.compile(); + assert.equal(await f.controller.previewTask, false); + assert.equal(f.controller.phase, 'succeeded'); + assert.equal(f.controller.preview.state, 'unavailable'); + assert.match(f.controller.preview.message, /原生预览|导出 PDF/); + assert.equal(await f.controller.exportPdf(), true); +}); + +test('a delayed page from a previous project cannot create an image after the project is cleared', async () => { + const page = deferred(), started = deferred(); + const f = fixture({route: async url => { + if (url.endsWith('/preview')) return json({available: true, pageCount: 1, maxPages: 100}); + if (url.endsWith('/preview/1')) { started.resolve(); return page.promise; } + }}); + await f.controller.connect(); await f.controller.compile(); + await started.promise; + const rendering = f.controller.previewTask; + f.controller.clear(); + page.resolve({ok: true, blob: async () => new Blob(['late'], {type: 'image/png'})}); + assert.equal(await rendering, false); + assert.equal(f.controller.preview.url, null); + assert.equal(f.created.length, 1, 'only the old PDF URL was created'); + assert.deepEqual(f.revoked, ['blob:fixture/1']); +}); + +test('failed recompilation preserves the last page image with stale source status', async () => { + const f = fixture({route: async url => { + if (url.endsWith('/preview')) return json({available: true, pageCount: 1}); + if (url.endsWith('/preview/1')) return {ok: true, blob: async () => new Blob(['png'], {type: 'image/png'})}; + }}); + await f.controller.connect(); await f.controller.compile(); await f.controller.previewTask; + f.request.project.files[0].text += '\\invalid'; + f.controller.markChanged(); + f.controls.status = 'failed'; + assert.equal(await f.controller.compile(), false); + assert.equal(f.controller.preview.url, 'blob:fixture/2'); + assert.equal(f.controller.stale, true); + assert.equal(f.controller.result.url, 'blob:fixture/1'); +}); + +test('busy page rendering retries within a bounded budget and pages above the preview cap are not fetched', async () => { + let attempts = 0; + const f = fixture({route: async url => { + if (url.endsWith('/preview')) return json({available: true, pageCount: 180, maxPages: 100}); + if (url.endsWith('/preview/1')) { + if (++attempts < 3) return json({code: 'PREVIEW_BUSY', error: 'Please retry'}, 409); + return {ok: true, blob: async () => new Blob(['png'], {type: 'image/png'})}; + } + }}); + await f.controller.connect(); await f.controller.compile(); + assert.equal(await f.controller.previewTask, true); + assert.equal(attempts, 3); + assert.equal(await f.controller.loadPage(101), false); + assert.equal(f.calls.some(call => call.url.endsWith('/preview/101')), false); + assert.equal(await f.controller.exportPdf(), true); }); diff --git a/tests/server.test.mjs b/tests/server.test.mjs index e731d9a..efb3a89 100644 --- a/tests/server.test.mjs +++ b/tests/server.test.mjs @@ -122,3 +122,83 @@ test('expired results are removed and invalid engine output is rejected', async const bad = await (await invalid.compile()).json(); assert.equal((await invalid.completed(bad.id)).code, 'INVALID_PDF'); }); + +test('authenticated preview metadata and PNG pages are cached without delaying PDF downloads', async t => { + let metadataCalls = 0; + const pages = []; + const f = await fixture(t, { + previewInfo: async () => { metadataCalls++; return {available: true, pageCount: 103, maxPages: 100, width: 1200, height: 1600}; }, + previewRenderer: async (_, page) => { pages.push(page); return Buffer.from('PNG page ' + page); } + }); + const {id} = await (await f.compile()).json(); await f.completed(id); + const route = '/api/jobs/' + id + '/preview'; + assert.equal((await fetch(f.url + route)).status, 403); + const info = await (await f.call(route)).json(); + assert.equal(info.pageCount, 103); + for (const page of [1, 1, 2, 1]) { + const response = await f.call(route + '/' + page); + assert.equal(response.headers.get('content-type'), 'image/png'); + assert.equal(response.headers.get('x-preview-page-count'), '103'); + assert.equal(await response.text(), 'PNG page ' + page); + } + assert.equal(metadataCalls, 1); + assert.deepEqual(pages, [1, 2, 1], 'only the current page is cached'); + assert.equal((await f.call(route + '/101')).status, 400); + assert.equal((await f.call(route + '/0')).status, 400); + assert.equal((await f.call('/api/jobs/' + id + '/pdf')).status, 200); +}); + +test('missing preview engine keeps the complete PDF downloadable', async t => { + const f = await fixture(t, {previewInfo: async () => ({available: false, reason: 'Ghostscript unavailable'})}); + const {id} = await (await f.compile()).json(); await f.completed(id); + const route = '/api/jobs/' + id; + assert.equal((await (await f.call(route + '/preview')).json()).available, false); + assert.equal((await f.call(route + '/preview/1')).status, 503); + assert.deepEqual(Buffer.from(await (await f.call(route + '/pdf')).arrayBuffer()), PDF); +}); + +test('only one page renderer runs, while cancellation leaves the successful PDF intact', async t => { + let started; + const rendering = new Promise(resolve => { started = resolve; }); + const f = await fixture(t, { + previewInfo: async () => ({available: true, pageCount: 2, maxPages: 100}), + previewRenderer: (_, __, {signal}) => new Promise((_, reject) => { + signal.addEventListener('abort', () => reject(Object.assign(new Error('cancelled'), {code: 'PREVIEW_CANCELLED'})), {once: true}); + started(); + }) + }); + const {id} = await (await f.compile()).json(); await f.completed(id); + const route = '/api/jobs/' + id; + await f.call(route + '/preview'); + const pending = f.call(route + '/preview/1'); await rendering; + assert.equal((await f.call(route + '/preview/2')).status, 409); + assert.equal((await f.call(route + '/pdf')).status, 200); + await f.call(route, {method: 'DELETE'}); + assert.equal((await (await pending).json()).code, 'PREVIEW_CANCELLED'); + assert.equal((await f.completed(id)).state, 'succeeded'); +}); + +test('expired jobs and server shutdown cancel active preview renderers', async t => { + for (const mode of ['expire', 'close']) { + let clock = 1; + let started; + let aborted = false; + const rendering = new Promise(resolve => { started = resolve; }); + const f = await fixture(t, {now: () => clock, jobTTL: 10, + previewInfo: async () => ({available: true, pageCount: 1, maxPages: 100}), + previewRenderer: (_, __, {signal}) => new Promise((_, reject) => { + signal.addEventListener('abort', () => { aborted = true; reject(new Error('cancelled')); }, {once: true}); + started(); + }) + }); + const {id} = await (await f.compile()).json(); await f.completed(id); + const route = '/api/jobs/' + id; + const pending = f.call(route + '/preview/1'); await rendering; + if (mode === 'expire') { + clock = 20; + assert.equal((await f.call(route)).status, 404); + } else f.server.close(); + await pending; + assert.equal(aborted, true, mode); + } +}); diff --git a/tests/workspace-ui-flow.test.mjs b/tests/workspace-ui-flow.test.mjs index 808d2f5..6baf7dd 100644 --- a/tests/workspace-ui-flow.test.mjs +++ b/tests/workspace-ui-flow.test.mjs @@ -11,7 +11,7 @@ const markup = fs.readFileSync(new URL('../index.html', import.meta.url), 'utf8' const sources = ['main.js', 'project-model.js', 'project-archive.js', 'workspace.js'] .map(name => [name, fs.readFileSync(new URL('../' + name, import.meta.url), 'utf8')]); -async function fixture({denyStorage = false, initialStorage = []} = {}) { +async function fixture({denyStorage = false, denyDialogs = false, initialStorage = []} = {}) { const root = new Element('fixture-root'); root.innerHTML = markup; const storage = new Map(initialStorage); @@ -27,10 +27,14 @@ async function fixture({denyStorage = false, initialStorage = []} = {}) { if (!target._events.has(type)) target._events.set(type, []); target._events.get(type).push(listener); }; + target.removeEventListener = (type, listener) => { + target._events.set(type, (target._events.get(type) || []).filter(item => item !== listener)); + }; }; async function emit(target, type, properties = {}) { - const event = {type, target, defaultPrevented: false, - preventDefault() { this.defaultPrevented = true; }, ...properties}; + const event = {type, target, defaultPrevented: false, propagationStopped: false, + preventDefault() { this.defaultPrevented = true; }, + stopPropagation() { this.propagationStopped = true; }, ...properties}; for (const listener of target._events?.get(type) || []) await listener(event); return event; } @@ -110,7 +114,9 @@ async function fixture({denyStorage = false, initialStorage = []} = {}) { TextEncoder, TextDecoder, Uint8Array, ArrayBuffer, DataView, atob, btoa, Blob, DecompressionStream, ReadableStream, Date, console, localStorage: {getItem: key => storage.get(key) ?? null, setItem: (key, value) => storage.set(key, String(value)), removeItem: key => storage.delete(key)}, - prompt: () => prompts.shift() ?? null, confirm: () => true, alert: message => alerts.push(message), + prompt: () => { if (denyDialogs) throw new Error('prompt() is not supported.'); return prompts.shift() ?? null; }, + confirm: () => { if (denyDialogs) throw new Error('confirm() is not supported.'); return true; }, + alert: message => alerts.push(message), setTimeout: callback => { const id = ++timer; tasks.set(id, callback); return id; }, clearTimeout: id => tasks.delete(id), navigator: {clipboard: {writeText: async () => {}}}, @@ -145,6 +151,159 @@ test('actual workspace startup binds the real markup in source mode', async () = assert.deepEqual(f.alerts, []); }); +test('project name input persists before blur and survives editor renders, file changes and reload', async () => { + const f = await fixture(); + f.node('projectName').focus(); + await f.input('projectName', '浏览器验收项目'); + assert.equal(f.app.model.name, '浏览器验收项目'); + assert.equal(f.node('saveState').textContent, '待保存'); + f.node('projectName').setSelectionRange(2, 4); + f.app.onChange(); + assert.equal(f.node('projectName').value, '浏览器验收项目'); + assert.equal(f.node('projectName').selectionStart, 2); + assert.equal(f.node('projectName').selectionEnd, 4); + f.node('sourceArea').focus(); + await f.input('sourceArea', 'Edited source after renaming'); + f.app.switchFile('drawing.ps'); + await f.flushTimers(); + assert.equal(f.node('projectName').value, '浏览器验收项目'); + const restored = await fixture({initialStorage: [...f.storage]}); + assert.equal(restored.app.model.name, '浏览器验收项目'); + assert.equal(restored.node('projectName').value, '浏览器验收项目'); + assert.equal(restored.app.model.get('main.tex').text, 'Edited source after renaming'); +}); + +test('project name editing keeps draft whitespace until change and shows names from replacement projects', async () => { + const f = await fixture(); + f.node('projectName').focus(); + await f.input('projectName', ' Draft name '); + f.app.onChange(); + assert.equal(f.node('projectName').value, ' Draft name '); + assert.equal(f.app.model.name, 'Draft name'); + await f.emit(f.node('projectName'), 'change'); + assert.equal(f.node('projectName').value, 'Draft name'); + await f.input('projectName', ''); + f.app.onChange(); + assert.equal(f.node('projectName').value, ''); + await f.emit(f.node('projectName'), 'change'); + assert.equal(f.node('projectName').value, '未命名项目'); + const replacement = f.context.defaultWorkspace(); + replacement.name = 'Replacement project'; + f.app.replaceProject(replacement); + assert.equal(f.node('projectName').value, 'Replacement project'); +}); + +test('unsupported native prompts fall back to accessible input and create a real project file', async () => { + const f = await fixture({denyDialogs: true}); + f.node('newFile').focus(); + const creating = f.click('newFile'); + await Promise.resolve(); + assert.equal(f.node('workspaceDialog').hidden, false); + assert.equal(f.document.activeElement, f.node('workspaceDialogInput')); + assert.equal(f.node('workspaceDialogInput').value, 'untitled.tex'); + assert.equal(f.document.querySelector('.container').getAttribute('inert'), ''); + f.node('workspaceDialogInput').value = 'sections/browser.tex'; + const entered = await f.emit(f.node('workspaceDialog'), 'keydown', {key: 'Enter', target: f.node('workspaceDialogInput')}); + await creating; + assert.equal(entered.defaultPrevented, true); + assert.equal(entered.propagationStopped, true); + assert.equal(f.app.model.activePath, 'sections/browser.tex'); + assert.equal(f.node('workspaceDialog').hidden, true); + assert.equal(f.document.querySelector('.container').getAttribute('inert'), null); + assert.equal(f.document.activeElement, f.node('newFile')); + assert.ok(JSON.parse(f.storage.get('visuallatex_workspace_v1')).files.some(file => file.path === 'sections/browser.tex')); +}); + +test('fallback prompts preserve source selection and reference commands through confirmation and cancellation', async () => { + const f = await fixture({denyDialogs: true}); + await f.input('sourceArea', 'before after'); + f.node('sourceArea').setSelectionRange(7, 7); + const inserting = f.click('btnInsertCitation'); + await Promise.resolve(); + f.node('workspaceDialogInput').value = 'browser2026'; + await f.click('workspaceDialogAccept'); + await inserting; + assert.equal(f.app.model.get().text, String.raw`before \cite{browser2026}after`); + const original = f.app.model.serialize(); + const renaming = f.click('renameFile'); + await Promise.resolve(); + f.node('workspaceDialogInput').value = 'discarded.tex'; + await f.emit(f.node('workspaceDialog'), 'keydown', {key: 'Escape'}); + await renaming; + assert.equal(f.app.model.serialize(), original); +}); + +test('fallback confirmations require an explicit answer before destructive workspace changes', async () => { + const f = await fixture({denyDialogs: true}); + const original = f.app.model.serialize(); + const cancelling = f.click('deleteFile'); + await Promise.resolve(); + assert.equal(f.node('workspaceDialogInput').hidden, true); + assert.equal(f.document.activeElement, f.node('workspaceDialogCancel')); + assert.equal(f.app.model.serialize(), original); + await f.click('workspaceDialogCancel'); + await cancelling; + assert.equal(f.app.model.serialize(), original); + const deleting = f.click('deleteFile'); + await Promise.resolve(); + await f.click('workspaceDialogAccept'); + await deleting; + assert.equal(f.app.model.get('main.tex'), null); + assert.equal(f.node('workspaceDialog').hidden, true); +}); + +test('fallback dialog escapes text, traps focus, ignores IME Enter and cleans up between queued prompts', async () => { + const f = await fixture({denyDialogs: true}); + const first = f.context.workspacePrompt('', ''); + const second = f.context.workspaceConfirm('Second answer'); + await Promise.resolve(); + assert.equal(f.node('workspaceDialogMessage').textContent, ''); + assert.equal(f.node('workspaceDialogMessage').querySelector('img'), null); + assert.equal(f.node('workspaceDialogInput').value, ''); + await f.emit(f.node('workspaceDialog'), 'keydown', {key: 'Enter', target: f.node('workspaceDialogInput'), isComposing: true}); + assert.equal(f.node('workspaceDialog').hidden, false); + await f.emit(f.node('workspaceDialog'), 'keydown', {key: 'Tab', shiftKey: true}); + assert.equal(f.document.activeElement, f.node('workspaceDialogAccept')); + await f.emit(f.node('workspaceDialog'), 'keydown', {key: 'Tab'}); + assert.equal(f.document.activeElement, f.node('workspaceDialogInput')); + await f.click('workspaceDialogCancel'); + assert.equal(await first, null); + await Promise.resolve(); + assert.equal(f.node('workspaceDialogMessage').textContent, 'Second answer'); + assert.equal(f.node('workspaceDialogAccept')._events.get('click').length, 1); + await f.click('workspaceDialogAccept'); + assert.equal(await second, true); + assert.equal(f.node('workspaceDialogAccept')._events.get('click').length, 0); +}); + +test('visual image insertion gathers all fallback answers and stops cleanly on cancellation', async () => { + const f = await fixture({denyDialogs: true}); + await f.click('modeVisual'); + const images = []; + f.context.insertImage = image => images.push(image); + const inserting = f.click('btnImage'); + await new Promise(setImmediate); + for (const [label, value] of [['图片路径', 'figures/chart.png'], ['图片标题', 'Caption'], ['图片标签', 'fig:browser']]) { + assert.equal(f.node('workspaceDialog').hidden, false); + assert.ok(f.node('workspaceDialogMessage').textContent.includes(label)); + f.node('workspaceDialogInput').value = value; + await f.click('workspaceDialogAccept'); + await new Promise(setImmediate); + } + await inserting; + assert.equal(images.length, 1); + assert.deepEqual({...images[0]}, {imagePath: 'figures/chart.png', caption: 'Caption', label: 'fig:browser'}); + const cancelling = f.click('btnImage'); + await new Promise(setImmediate); + f.node('workspaceDialogInput').value = 'ignored.png'; + await f.click('workspaceDialogAccept'); + await new Promise(setImmediate); + await f.click('workspaceDialogCancel'); + await cancelling; + assert.equal(images.length, 1); + assert.equal(f.node('workspaceDialog').hidden, true); +}); + test('source and visual mode buttons synchronize edits through actual handlers', async () => { const f = await fixture(); const tex = '\\documentclass{article}\r\n\\begin{document}\r\nOriginal paragraph.\r\n\\end{document}\r\n'; diff --git a/workspace.css b/workspace.css index ac1424e..e0dd736 100644 --- a/workspace.css +++ b/workspace.css @@ -182,6 +182,14 @@ .project-actions button { min-height: 32px; font-size: 11px; } .workspace-toolbar.toolbar button { min-height: 32px; } } +.workspace-dialog-overlay { position: fixed; inset: 0; z-index: 1000; display: grid; place-items: center; padding: 20px; background: #14273880; } +.workspace-dialog { width: min(480px, 100%); padding: 24px; border-radius: 12px; background: #fff; color: #203447; box-shadow: 0 20px 70px #10202e40; } +.workspace-dialog h2 { margin: 0 0 16px; font-size: 18px; } +.workspace-dialog label { display: block; margin-bottom: 12px; line-height: 1.6; overflow-wrap: anywhere; } +.workspace-dialog input { box-sizing: border-box; width: 100%; min-height: 42px; padding: 9px 11px; border: 1px solid #91a3b1; border-radius: 6px; font: inherit; font-size: 16px; } +.workspace-dialog-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 22px; } +.workspace-dialog-actions button { min-height: 40px; padding: 8px 20px; border: 1px solid #91a3b1; border-radius: 6px; background: #fff; color: inherit; cursor: pointer; } +#workspaceDialogAccept { background: #245d78; color: #fff; border-color: #245d78; } @media (prefers-reduced-motion: reduce) { .workspace-app *, .workspace-app *::before, .workspace-app *::after { transition: none !important; animation: none !important; scroll-behavior: auto !important; } } diff --git a/workspace.js b/workspace.js index 4d7ee49..8ea7ba4 100644 --- a/workspace.js +++ b/workspace.js @@ -1,6 +1,74 @@ /* Source-first LaTeX / PostScript workspace. Classic script: runs offline without a build. */ const WORKSPACE_KEY = 'visuallatex_workspace_v1'; +// Embedded browsers may throw instead of showing native JavaScript dialogs. +// Queue the fallback so every request receives its own explicit answer. +let workspaceDialogQueue = Promise.resolve(); +function workspaceDialog(kind, message, defaultValue = '') { + try { + const native = globalThis[kind]; + if (typeof native === 'function') { + const answer = native.call(globalThis, message, defaultValue); + if (kind === 'prompt' ? answer === null || typeof answer === 'string' : typeof answer === 'boolean') { + return Promise.resolve(answer); + } + } + } catch (_) { /* Use the accessible in-page dialog below. */ } + const request = workspaceDialogQueue.then(() => new Promise(resolve => { + const $ = id => document.getElementById(id); + const overlay = $('workspaceDialog'); + const input = $('workspaceDialogInput'); + const accept = $('workspaceDialogAccept'); + const cancel = $('workspaceDialogCancel'); + const previousFocus = document.activeElement; + const background = Array.from(document.body.childNodes).filter(node => node.nodeType === 1 && node !== overlay); + const wasInert = background.map(node => node.getAttribute('inert') !== null); + const asking = kind === 'prompt'; + $('workspaceDialogTitle').textContent = asking ? '输入内容' : '确认操作'; + $('workspaceDialogMessage').textContent = message; + input.value = defaultValue; + input.hidden = !asking; + overlay.hidden = false; + background.forEach(node => node.setAttribute('inert', '')); + let finished = false; + function finish(answer) { + if (finished) return; + finished = true; + overlay.hidden = true; + accept.removeEventListener('click', approve); + cancel.removeEventListener('click', dismiss); + overlay.removeEventListener('keydown', keyboard); + background.forEach((node, index) => { if (!wasInert[index]) node.removeAttribute('inert'); }); + previousFocus?.focus(); + resolve(answer); + } + function approve() { finish(asking ? input.value : true); } + function dismiss() { finish(asking ? null : false); } + function keyboard(event) { + // Do not let workspace shortcuts act behind an open modal. + event.stopPropagation(); + if (event.key === 'Escape') { event.preventDefault(); dismiss(); } + else if (event.key === 'Enter' && event.target === input && !event.isComposing) { + event.preventDefault(); approve(); + } else if (event.key === 'Tab') { + const controls = asking ? [input, cancel, accept] : [cancel, accept]; + const current = controls.indexOf(document.activeElement); + const next = (current + (event.shiftKey ? -1 : 1) + controls.length) % controls.length; + event.preventDefault(); controls[next].focus(); + } + } + accept.addEventListener('click', approve); + cancel.addEventListener('click', dismiss); + overlay.addEventListener('keydown', keyboard); + (asking ? input : cancel).focus(); + if (asking) input.select(); + })); + workspaceDialogQueue = request.catch(() => {}); + return request; +} +function workspacePrompt(message, defaultValue = '') { return workspaceDialog('prompt', message, defaultValue); } +function workspaceConfirm(message) { return workspaceDialog('confirm', message); } + function workspaceTemplate(path) { if (/\.eps$/i.test(path)) return '%!PS-Adobe-3.0 EPSF-3.0\n%%BoundingBox: 0 0 300 180\n%%EndComments\n/Helvetica findfont 18 scalefont setfont\n30 90 moveto (Hello, EPS) show\n%%EOF\n'; if (/\.ps$/i.test(path)) return '%!PS-Adobe-3.0\n%%Title: Untitled\n%%Pages: 1\n%%BoundingBox: 0 0 595 842\n%%EndComments\n%%Page: 1 1\n/Helvetica findfont 24 scalefont setfont\n72 720 moveto (Hello, PostScript) show\nshowpage\n%%EOF\n'; @@ -214,6 +282,7 @@ function initWorkspace() { app.recoveryBlocked = blocked; let saveTimer; let panelTimer; + let renderedProject = app.model; const safely = action => async event => { try { await action(event); } catch (error) { notify(error.message); } @@ -290,7 +359,10 @@ function initWorkspace() { const language = file ? ProjectModel.language(file.path) : 'text'; $('currentPath').textContent = file ? file.path : '选择或新建文件'; $('languageBadge').textContent = file && file.kind === 'binary' ? '资源' : {latex: 'LaTeX', bibtex: 'BibTeX', postscript: 'PostScript', text: '文本'}[language]; - $('projectName').value = app.model.name; + // An editor render can happen before a name input loses focus and emits + // change. Preserve its in-progress text and selection until that commit. + if (document.activeElement !== $('projectName') || renderedProject !== app.model) $('projectName').value = app.model.name; + renderedProject = app.model; $('sourcePanel').hidden = !text || app.mode !== 'source'; $('visualPanel').hidden = !text || app.mode !== 'visual'; $('assetPanel').hidden = Boolean(text); @@ -339,15 +411,19 @@ function initWorkspace() { bind('btnRedo', () => app.history('redo')); bind('btnFiles', () => $('btnFiles').setAttribute('aria-expanded', String(document.body.classList.toggle('files-open')))); bind('btnOutline', () => $('btnOutline').setAttribute('aria-expanded', String(document.body.classList.toggle('outline-open')))); - bind('btnEncoding', () => { + bind('btnEncoding', async () => { const file = app.model.get(); if (!file || file.kind !== 'text') return; - const encoding = prompt('文件编码:utf-8 或 latin1(转换会影响导出的字节编码)', file.encoding); + const encoding = await workspacePrompt('文件编码:utf-8 或 latin1(转换会影响导出的字节编码)', file.encoding); if (!encoding || encoding === file.encoding) return; if (file.encoding !== 'latin1') app.sync(); app.model.setEncoding(file.path, encoding.trim().toLowerCase()); app.changed(false); app.persist(); }); - $('projectName').addEventListener('change', safely(() => { app.model.name = $('projectName').value.trim() || '未命名项目'; app.persist(); })); + function updateProjectName() { app.model.name = $('projectName').value.trim() || '未命名项目'; } + $('projectName').addEventListener('input', safely(() => { updateProjectName(); scheduleSave(); })); + $('projectName').addEventListener('change', safely(() => { + updateProjectName(); $('projectName').value = app.model.name; app.persist(); + })); for (const [id, visual, before, after] of [ ['btnH1', () => insertHeading(1), '\\section{', '}'], ['btnH2', () => insertHeading(2), '\\subsection{', '}'], @@ -357,9 +433,18 @@ function initWorkspace() { ['btnOl', insertOrderedList, '\\begin{enumerate}\n \\item ', '\n\\end{enumerate}'], ['btnInlineFormula', insertInlineFormula, '$', '$'], ['btnBlockFormula', insertBlockFormula, '\\[\n', '\n\\]'] ]) bind(id, () => { if (app.mode === 'visual') visual(); else wrap(before, after); }); - bind('btnImage', () => { - if (app.mode === 'visual') { insertImage(); return; } - const path = prompt('图片路径(相对于主文件)', 'figures/example.eps'); + bind('btnImage', async () => { + if (app.mode === 'visual') { + saveEditorSelection(); + const imagePath = await workspacePrompt('请输入图片路径(LaTeX 中使用的路径):', 'example-image.png'); + if (!imagePath) return; + const caption = await workspacePrompt('请输入图片标题:', '图片标题'); + if (caption === null) return; + const label = await workspacePrompt('请输入图片标签(用于引用):', 'fig:example'); + if (label !== null) insertImage({imagePath, caption, label}); + return; + } + const path = await workspacePrompt('图片路径(相对于主文件)', 'figures/example.eps'); if (path) sourceEdit('\\includegraphics[width=0.6\\textwidth]{' + path + '}'); }); editorArea.addEventListener('dblclick', safely(event => { @@ -375,19 +460,19 @@ function initWorkspace() { notify(offset >= 0 ? '已定位到完整源码,可直接修改该命令。' : '已打开完整源码,可使用查找定位该命令。'); })); - function insertReference(kind) { + async function insertReference(kind) { app.setMode('source'); const refs = app.model.references(); const first = kind === 'cite' ? refs.bibliography[0] : refs.labels[0]; - const key = prompt(kind === 'cite' ? '文献键,可用逗号分隔多个键' : '标签名称', first ? first.key : kind === 'label' ? 'sec:new' : ''); + const key = await workspacePrompt(kind === 'cite' ? '文献键,可用逗号分隔多个键' : '标签名称', first ? first.key : kind === 'label' ? 'sec:new' : ''); if (key) sourceEdit('\\' + kind + '{' + key + '}'); } bind('btnInsertCitation', () => insertReference('cite')); bind('btnInsertReference', () => insertReference('ref')); bind('btnInsertLabel', () => insertReference('label')); - bind('btnAddBibEntry', () => { + bind('btnAddBibEntry', async () => { app.sync(); - const key = prompt('新文献的 BibTeX 键', 'reference2026'); + const key = await workspacePrompt('新文献的 BibTeX 键', 'reference2026'); if (!key) return; if (!/^[^\s{},=]+$/.test(key)) throw new Error('文献键不能包含空白、花括号、逗号或等号'); if (app.model.references().bibliography.some(item => item.key === key)) throw new Error('该文献键已存在'); @@ -399,27 +484,27 @@ function initWorkspace() { sourceEdit('\n@article{' + key + ',\n author = {},\n title = {},\n journal = {},\n year = {}\n}\n', end, end); }); - bind('newFile', () => { + bind('newFile', async () => { app.sync(); - const path = prompt('文件路径,例如 sections/method.tex、references.bib 或 drawing.ps', 'untitled.tex'); + const path = await workspacePrompt('文件路径,例如 sections/method.tex、references.bib 或 drawing.ps', 'untitled.tex'); if (!path) return; const file = app.model.add({path, kind: 'text', text: workspaceTemplate(path), encoding: 'utf-8'}); // add() selects the first file in an empty project. Do not sync the old // empty editor into that newly created template. app.model.activePath = file.path; app.mode = 'source'; app.show(); app.persist(); }); - bind('renameFile', () => { + bind('renameFile', async () => { app.sync(); const file = app.model.get(); if (!file) return; - const path = prompt('新的文件路径(已有源码中的路径引用不会自动更名)', file.path); + const path = await workspacePrompt('新的文件路径(已有源码中的路径引用不会自动更名)', file.path); if (path && path !== file.path) { const renamed = app.model.rename(file.path, path); app.switchFile(renamed.path); } }); - bind('deleteFile', () => { - const file = app.model.get(); if (!file || !confirm('删除项目文件 ' + file.path + '?请先导出需要保留的内容。')) return; + bind('deleteFile', async () => { + const file = app.model.get(); if (!file || !await workspaceConfirm('删除项目文件 ' + file.path + '?请先导出需要保留的内容。')) return; app.model.remove(file.path); app.mode = 'source'; app.show(); app.persist(); }); bind('setMainFile', () => { app.sync(); app.model.mainPath = app.model.activePath; app.persist(); panels(); notify('已设为项目主文件'); }); - bind('btnNewProject', () => { if (confirm('新建项目会替换本机当前草稿,请先导出备份。继续?')) app.replaceProject(defaultWorkspace()); }); + bind('btnNewProject', async () => { if (await workspaceConfirm('新建项目会替换本机当前草稿,请先导出备份。继续?')) app.replaceProject(defaultWorkspace()); }); function download(bytes, name, type = 'application/octet-stream') { const url = URL.createObjectURL(new Blob([bytes], {type})); @@ -483,7 +568,7 @@ function initWorkspace() { const main = entries.find(file => file.kind === 'text' && file.path === 'main.tex') || entries.find(file => file.kind === 'text' && /\.(tex|ps|eps)$/i.test(file.path)) || entries.find(file => file.kind === 'text'); const first = main || entries[0]; const candidate = new ProjectModel({name: files[0].webkitRelativePath.split('/')[0], files: entries, activePath: first.path, mainPath: main ? main.path : null}); - if (confirm('用这个文件夹替换当前项目?请确认已导出需要保留的内容。')) app.replaceProject(candidate); + if (await workspaceConfirm('用这个文件夹替换当前项目?请确认已导出需要保留的内容。')) app.replaceProject(candidate); })); $('importProject').addEventListener('change', safely(async event => { const file = event.target.files[0]; if (!file) return; @@ -505,7 +590,7 @@ function initWorkspace() { activePath: metadata && files.some(item => item.path === metadata.activePath) ? metadata.activePath : first && first.path, mainPath: metadata && files.some(item => item.kind === 'text' && item.path === metadata.mainPath) ? metadata.mainPath : main ? main.path : null}); } - if (confirm('用导入的项目替换当前项目?请确认已导出需要保留的内容。')) app.replaceProject(candidate); + if (await workspaceConfirm('用导入的项目替换当前项目?请确认已导出需要保留的内容。')) app.replaceProject(candidate); })); function literalFindPattern(query) { From af1cd663692ae8c9261e2ec41e44d20cd2e776c7 Mon Sep 17 00:00:00 2001 From: nisconder <2129048448@qq.com> Date: Wed, 28 Oct 2026 13:41:45 +0800 Subject: [PATCH 4/7] Restore visual LaTeX editing as the default workflow --- README.en.md | 17 ++-- README.md | 17 ++-- index.html | 17 ++-- main.js | 3 + preview.js | 10 ++- project-model.js | 2 +- tests/browser-acceptance.md | 5 +- tests/editor-regression.test.mjs | 34 +++++++ tests/preview.test.mjs | 30 ++++++- tests/workspace-controller.test.mjs | 70 ++++++++++++++- tests/workspace-markup.test.mjs | 15 ++-- tests/workspace-ui-flow.test.mjs | 74 ++++++++++++++-- workspace.css | 15 ++-- workspace.js | 133 +++++++++++++++++++--------- 14 files changed, 352 insertions(+), 90 deletions(-) diff --git a/README.en.md b/README.en.md index 78dc861..ec13084 100644 --- a/README.en.md +++ b/README.en.md @@ -1,8 +1,12 @@ # VisualLaTeX Studio -**A LaTeX / PostScript project editor with local compilation, PDF preview and export.** +**Import a document, edit it visually, then export—with multiple files, PostScript and local PDF compilation.** -This workspace edition extends [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) with full source editing, multiple files, references, bibliography entries, ZIP projects and real compilation. No npm packages or build step are required. Compilation uses Node.js 22+ and a local typesetting toolchain. +This workspace edition continues [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX)'s purpose of visually modifying existing LaTeX documents, adding full source access, multiple files, references, bibliography entries, ZIP projects and real compilation. No npm packages or build step are required. Compilation uses Node.js 22+ and a local typesetting toolchain. + +**Complete LaTeX documents open in Visual editing by default.** Edit text and headings directly, use the formatting toolbar, and double-click formulas to edit them. Keep untouched source intact while making changes. The current session remembers the selected editing mode for each file. + +Source editing remains available for preambles, macros, references and complex structures. Bibliography files, PostScript, TeX fragments and incomplete documents use source editing without forced visual conversion. PostScript supports source editing and rendering; arbitrary PS graphics cannot yet be modified as visual objects. ## Start @@ -38,11 +42,11 @@ Tectonic downloads missing TeX support files on first use and caches them for la ### Editing and PDF output - Add individual files, open a project folder, or import a ZIP project. -- Edit any text file in source mode, including preambles, macros, references and incomplete source. -- Complete LaTeX documents can switch to the visual editor. Fragments, BibTeX, PostScript and EPS text remain directly editable source. +- Complete LaTeX documents open in Visual editing: modify text and headings directly, use the formatting toolbar, or double-click formulas. +- Switch to Source editing for preambles, macros, references and complex commands, then return to visual editing. Fragments, BibTeX, PostScript and EPS text remain directly editable source. - Download one file or export the entire project as ZIP, including binary resources and changes in inactive files. - Select the complete LaTeX main document or a PS/EPS file, then compile/render with the button or Ctrl/Cmd+Enter. -- Inspect the generated PDF and export it. Running tasks can be cancelled; errors retain engine logs for diagnosis. +- Inspect the generated PDF and export it. The PDF pane displays the result; modify content in the editor. Running tasks can be cancelled; errors retain engine logs for diagnosis. Source changes mark an older PDF as stale. Export recompiles changed content before downloading, while failed compilation keeps the previous preview visibly marked and leaves the source editable. With Ghostscript installed, pages are displayed as images using Previous/Next controls, without requiring a browser PDF plugin. Without Ghostscript, the UI explains the limitation and falls back to native PDF display; the complete PDF remains exportable. @@ -56,12 +60,13 @@ Opening a folder or project replaces the current workspace after confirmation. A | Feature | Support | | --- | --- | +| Visual editing | Default for complete LaTeX documents; edit text, headings, formatting, lists and formulas | | Source files | TeX, LaTeX, STY, CLS, BIB, PS, EPS and UTF-8 text with custom extensions | | Project management | Create, rename, delete, select main file and preserve relative paths | | References | Navigate labels, citation locations and BibTeX entries; insert cite/ref/label and add entries | | Find and replace | Current-file search, wrap-around, replace one/all and case sensitivity | | History | Independent per-file undo/redo for source and visual changes | -| PostScript | PS/text EPS source, page/procedure outline, templates, UTF-8 and Latin-1 | +| PostScript | PS/text EPS source, page/procedure outline, templates, UTF-8 and Latin-1; no arbitrary PS graphics object editing | | Resources | Preserve original binary bytes, including binary EPS | | Archives | Read stored/deflated ZIP and export standard ZIP without packages | | Drafts | Atomic local project snapshots and legacy single-file migration | diff --git a/README.md b/README.md index 2767c15..7c9552d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # VisualLaTeX Studio -**支持本地编译、PDF 预览与导出的 LaTeX / PostScript 项目编辑器。** +**导入文档,直接可视化修改,再导出——支持多文件、PostScript 与本机 PDF 编译。** -这是基于 [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) 的独立工作区版本,提供完整源码、多文件项目、参考文献、ZIP 管理及真实编译。编辑器与本地服务不依赖 npm 包;编译需要 Node.js 22+ 和相应工具链。 +这是基于 [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) 的独立工作区版本,延续可视化修改现有 LaTeX 文档的用途,并增加完整源码、多文件项目、参考文献、ZIP 管理及真实编译。编辑器与本地服务不依赖 npm 包;编译需要 Node.js 22+ 和相应工具链。 -**所有文本文件都能直接编辑。** 导言区、宏定义、`\cite`、`\ref`、`\label`、BibTeX 条目以及 PostScript 程序不再受可视化解析能力限制。未完成的源码也可以保存和导出。 +**完整 LaTeX 文档默认进入「可视化编辑」。** 直接修改文字和标题,用工具栏调整格式,双击公式编辑。只修改需要改动的内容,保留其余源码;切换文件会记住当前会话中为各文件选择的编辑模式。 + +「源码编辑」随时可用,补充导言区、宏定义、`\cite`、`\ref`、`\label` 和复杂结构的修改。BibTeX、PostScript、章节片段及未完成的文档可直接编辑源码,并保存、导出;它们不会被强行转换成可视化内容。PostScript 当前支持源码编辑和渲染,不提供任意图形对象的可视化修改。 ## 开始使用 @@ -40,10 +42,10 @@ Tectonic 首次编译会按需联网下载宏包和字体支持文件,之后 ### 编辑与生成 PDF 1. 用「添加文件」加入文件,或用「打开文件夹」「打开项目」导入目录/ZIP。 -2. 从左侧选择文件,在源码区直接修改。`main.tex` 等完整 LaTeX 文档还可切换到「可视化」。 +2. 从左侧选择 `main.tex` 等完整 LaTeX 文档,默认在「可视化编辑」中修改文字、标题和格式。复杂命令可切换到「源码编辑」修改,再返回可视化继续写作。 3. 用「下载文件」导出当前文件,或用「导出 ZIP」保存整个项目及资源。 4. 选择编译目标:LaTeX 使用完整的主文档,PostScript 使用 `.ps` / `.eps` 文件,点击编译/渲染或按 Ctrl/Cmd+Enter。 -5. 在预览区检查生成的 PDF,使用「导出 PDF」保存结果。编译失败可查看日志,也可取消运行中的任务。 +5. 在预览区检查生成的 PDF,使用「导出 PDF」保存结果。PDF 预览只显示排版结果,修改内容仍在编辑区完成。编译失败可查看日志,也可取消运行中的任务。 修改源码后,旧 PDF 会标记为过期;导出会先编译当前内容,避免将旧结果误当成最新版本。编译失败时保留上次预览,项目源码保持可编辑。本机安装 Ghostscript 后,预览以分页图片显示,不依赖浏览器自带 PDF 阅读器;可用「上一页」「下一页」切换。未安装 Ghostscript 时会明确提示,并尝试浏览器原生 PDF 预览,仍可导出完整 PDF。 @@ -57,13 +59,14 @@ Tectonic 首次编译会按需联网下载宏包和字体支持文件,之后 | 功能 | 支持范围 | | --- | --- | +| 可视化修改 | 完整 LaTeX 文档默认可视化编辑;直接修改文字、标题、格式、列表及公式 | | 完整源码 | `.tex`、`.latex`、`.sty`、`.cls`、`.bib`、`.ps`、`.eps` 及自定义扩展名的 UTF-8 文本文件 | | 多文件工作区 | 新建、重命名、删除、设定主文件;保留相对目录结构 | -| 源码/可视化 | 切换时同步内容;不完整 TeX、片段、BibTeX 和 PostScript 始终可用源码模式 | +| 可视化/源码 | 切换时同步内容;记住各文件在当前会话中选择的模式;不完整 TeX、片段、BibTeX 和 PostScript 使用源码模式 | | 引用与文献 | 定位标签、引用位置和 BibTeX 条目;插入 `\cite` / `\ref` / `\label`,新增文献条目 | | 查找替换 | 当前文件查找、循环查找、单次替换、全部替换、区分大小写 | | 撤销重做 | 每个文件独立历史,支持源码和可视化编辑;同一输入过程合并成一步 | -| PostScript | `.ps` / 文本 `.eps` 源码编辑、页面/过程导航、示例文件、UTF-8 与 Latin-1 编码 | +| PostScript | `.ps` / 文本 `.eps` 源码编辑、页面/过程导航、示例文件、UTF-8 与 Latin-1 编码;暂不支持任意 PS 图形的可视化修改 | | 图片等资源 | 二进制文件按原始字节保存;二进制 EPS 保留为资源,可单独下载 | | 项目 ZIP | 导入 stored/deflate ZIP,导出标准 ZIP;包含未打开文件的编辑及原始资源 | | 本机草稿 | 整个项目单次保存;失败时显示状态;兼容旧版单文档草稿迁移 | diff --git a/index.html b/index.html index 27c6650..a340381 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - VisualLaTeX Studio · LaTeX 与 PostScript 工作台 + VisualLaTeX Studio · 可视化 LaTeX 编辑与排版 @@ -92,8 +92,8 @@

项目文件

main.tex
- - + +
@@ -116,14 +116,14 @@

项目文件

-
+ -
+ + + + + + diff --git a/main.js b/main.js index e93ceb4..a195611 100644 --- a/main.js +++ b/main.js @@ -747,9 +747,18 @@ function parseTexToHtml(tex) { const env = readTexEnvironment(tex, i); if (env) { let visual = null; + const source = tex.slice(i, env.end); + if (env.complete && /^(?:equation|align|gather)\*?$/.test(env.name)) { + // Keep labels, tags, row breaks, comments and nested math in the + // semantic body. The visual editor must preserve this metadata. + visual = texSourceElement('div', source, escapeForHtml(source), + ' class="formula-block" data-delimiter="environment" data-environment="' + escapeAttr(env.name) + + '" data-formula="' + texSourceAttribute(tex.slice(env.innerStart, env.innerEnd)) + + '" data-tex-env-open="' + texSourceAttribute(tex.slice(i, env.innerStart)) + + '" data-tex-env-close="' + texSourceAttribute(tex.slice(env.innerEnd, env.end)) + '" contenteditable="false"'); + } if (env.complete && (env.name === 'itemize' || env.name === 'enumerate')) visual = parseSimpleTexList(tex, env); if (env.complete && env.name === 'figure') visual = parseSimpleTexFigure(tex, env); - const source = tex.slice(i, env.end); html += visual || texSourceElement('div', source, escapeForHtml(source), ' class="raw-tex"'); i = env.end; continue; @@ -839,19 +848,42 @@ function hasTexPackage(preamble, packageName) { } // 同时检查内容和根节点属性:居中、标题级别或公式属性变化也必须使原文缓存失效。 -function getTexNodeSnapshot(node) { +function getTexNodeSnapshot(node, legacyPresentation = false) { function describe(current) { if (current.nodeType !== Node.ELEMENT_NODE) return [current.nodeType, current.textContent]; + // Atomic TeX nodes have editable semantics separate from their rendered + // presentation. Decorations must not invalidate an ancestor's source, + // while changing a command or formula must invalidate that ancestor. + if (!legacyPresentation && current.classList.contains('tex-cmd')) { + const source = current.getAttribute('data-tex-source'); + return ['tex-cmd', source === null ? current.textContent : source]; + } + if (!legacyPresentation && (current.classList.contains('formula-inline') || current.classList.contains('formula-block'))) { + return ['formula', current.classList.contains('formula-block') ? 'block' : 'inline', + current.getAttribute('data-formula'), current.getAttribute('data-delimiter'), + current.getAttribute('data-environment'), current.getAttribute('data-tex-env-open'), + current.getAttribute('data-tex-env-close')]; + } const attributes = Array.from(current.attributes || []) .filter(function(attr) { return !attr.name.startsWith('data-tex-'); }) .map(function(attr) { return [attr.name, attr.value]; }) .sort(function(a, b) { return a[0].localeCompare(b[0]); }); return [current.tagName.toLowerCase(), attributes, Array.from(current.childNodes).map(describe)]; } - // 不把子节点的原文和快照再次嵌进父快照,防止嵌套格式造成元数据膨胀。 + // Ordinary containers exclude cached source/snapshots to avoid metadata growth. return JSON.stringify(describe(node)); } +function upgradeTexNodeSnapshots(root) { + for (const node of Array.from(root.querySelectorAll('[data-tex-snapshot]'))) { + // Only migrate a still-valid legacy cache. Replacing stale snapshots + // would discard edits by making the original source authoritative again. + if (node.getAttribute('data-tex-snapshot') === getTexNodeSnapshot(node, true)) { + node.setAttribute('data-tex-snapshot', getTexNodeSnapshot(node)); + } + } +} + // 浏览器按 Enter 拆分段落时,不一定为新兄弟节点插入源文件的空白占位符。 function convertEditorNodesToLatex(nodes) { function ordinaryParagraph(node) { @@ -907,11 +939,22 @@ function convertNodeToLatex(node) { const separator = source !== null ? '' : '\n\n'; if (node.classList.contains('tex-whitespace')) return source || ''; if (node.classList.contains('raw-tex')) return getRawTexContent(node); - if (node.classList.contains('tex-cmd')) return node.textContent; + if (node.classList.contains('tex-cmd')) return source === null ? node.textContent : source; if (node.classList.contains('formula-inline') || node.classList.contains('formula-block')) { const formula = node.getAttribute('data-formula') || ''; const delimiter = node.getAttribute('data-delimiter'); + const environment = node.getAttribute('data-environment'); + if (delimiter === 'environment' && /^(?:equation|align|gather)\*?$/.test(environment || '')) { + const escapedName = environment.replace('*', '\\*'); + const originalOpen = node.getAttribute('data-tex-env-open') || ''; + const originalClose = node.getAttribute('data-tex-env-close') || ''; + const open = new RegExp('^\\\\begin[ \\t\\r\\n]*\\{' + escapedName + '\\}$').test(originalOpen) + ? originalOpen : '\\begin{' + environment + '}'; + const close = new RegExp('^\\\\end[ \\t\\r\\n]*\\{' + escapedName + '\\}$').test(originalClose) + ? originalClose : '\\end{' + environment + '}'; + return open + formula + close; + } if (delimiter === '$$') return '$$' + formula + '$$'; if (delimiter === '\\[') return '\\[' + formula + '\\]'; if (delimiter === '\\(') return '\\(' + formula + '\\)'; @@ -1089,9 +1132,9 @@ function sanitizeDraftHtml(html) { template.innerHTML = html; const allowedTags = new Set(['P', 'DIV', 'SPAN', 'H1', 'H2', 'H3', 'UL', 'OL', 'LI', 'B', 'STRONG', 'I', 'EM', 'BR', 'IMG']); const allowedAttributes = new Set(['class', 'contenteditable', 'hidden', 'src', 'alt', 'align', 'title', - 'data-caption', 'data-label', 'data-width', 'data-formula', 'data-delimiter', + 'data-caption', 'data-label', 'data-width', 'data-formula', 'data-delimiter', 'data-environment', 'data-placement', 'data-centering', 'data-has-caption', 'data-caption-tex', 'data-label-tex', 'data-item-label', - 'data-tex-command', 'data-tex-source', 'data-tex-snapshot']); + 'data-tex-command', 'data-tex-source', 'data-tex-snapshot', 'data-tex-env-open', 'data-tex-env-close']); for (const node of Array.from(template.content.querySelectorAll('*'))) { if (!allowedTags.has(node.tagName)) { if (/^(SCRIPT|STYLE|IFRAME|OBJECT|EMBED|SVG|MATH|TEMPLATE)$/.test(node.tagName)) node.remove(); @@ -1124,6 +1167,7 @@ function loadDraft() { const draft = JSON.parse(serialized); if (draft.version !== 1 || typeof draft.html !== 'string') throw new Error('草稿格式无效'); editorArea.innerHTML = sanitizeDraftHtml(draft.html); + upgradeTexNodeSnapshots(editorArea); texPreamble = typeof draft.preamble === 'string' ? draft.preamble : null; texTail = typeof draft.tail === 'string' ? draft.tail : ''; texDocumentOpen = typeof draft.open === 'string' ? draft.open : '\\begin{document}'; @@ -1137,6 +1181,7 @@ function loadDraft() { if (content !== null) { editorArea.innerHTML = sanitizeDraftHtml(content); + upgradeTexNodeSnapshots(editorArea); texPreamble = localStorage.getItem('visuellatex_preamble') || null; texTail = localStorage.getItem('visuellatex_tail') || ''; importedFileName = localStorage.getItem('visuellatex_filename') || null; @@ -1221,13 +1266,18 @@ function openFormulaModal(mode, formulaNode = null) { const radio = document.querySelector('input[name="formulaMode"][value="' + (mode || 'inline') + '"]'); if (radio) radio.checked = true; + document.querySelectorAll('input[name="formulaMode"]').forEach(function(option) { + option.disabled = Boolean(editingFormulaNode && editingFormulaNode.getAttribute('data-delimiter') === 'environment'); + }); modal.classList.add('show'); + if (typeof VisualMath !== 'undefined' && VisualMath.open(document.getElementById('formulaInput').value, editingFormulaNode)) return; document.getElementById('formulaInput').focus(); } // 关闭公式弹窗 function closeFormulaModal() { + if (typeof VisualMath !== 'undefined') VisualMath.close(); document.getElementById('formulaModal').classList.remove('show'); editingFormulaNode = null; document.getElementById('btnInsertFormula').textContent = '插入公式'; @@ -1252,6 +1302,7 @@ function renderSymbolPalette() { // 向公式输入框光标处插入符号 function insertSymbolIntoTextarea(symbol) { + if (typeof VisualMath !== 'undefined' && VisualMath.insert(symbol)) return; const ta = document.getElementById('formulaInput'); const start = ta.selectionStart; const end = ta.selectionEnd; @@ -1262,7 +1313,13 @@ function insertSymbolIntoTextarea(symbol) { // 从手动输入插入公式 function insertFormulaFromInput() { - const latex = document.getElementById('formulaInput').value; + let latex; + try { latex = typeof VisualMath !== 'undefined' ? VisualMath.value() : document.getElementById('formulaInput').value; } + catch (problem) { + const error = document.getElementById('formulaError'); + if (error) error.textContent = problem.message; + updateStatus(problem.message); return; + } if (!latex.trim()) { updateStatus('请输入公式内容'); return; @@ -1281,6 +1338,10 @@ function insertFormulaFromInput() { const delimiter = old.getAttribute('data-delimiter'); if (mode === oldMode && delimiter) { replacement.setAttribute('data-delimiter', delimiter); + ['data-environment','data-tex-env-open','data-tex-env-close'].forEach(function(name) { + const value = old.getAttribute(name); + if (value !== null) replacement.setAttribute(name, value); + }); const close = delimiter === '\\(' ? '\\)' : delimiter === '\\[' ? '\\]' : delimiter; replacement.textContent = delimiter + latex + close; } else if (mode === oldMode && mode === 'block') { @@ -1289,6 +1350,7 @@ function insertFormulaFromInput() { } // 新节点不携带旧源码快照,祖先的快照比较也会检测到此次修改。 old.parentNode.replaceChild(replacement, old); + if (typeof renderVisualMath === 'function') renderVisualMath(editorArea); updatePreview(); if (saveDraft()) updateStatus('公式已更新'); } else { @@ -1315,6 +1377,7 @@ function insertFormulaNode(latex, type) { const node = document.createElement('span'); configureFormulaNode(node, latex, type); if (!insertNodeAtCursor(node)) return; + if (typeof renderVisualMath === 'function') renderVisualMath(editorArea); updatePreview(); if (saveDraft()) updateStatus('公式已插入'); } @@ -1344,14 +1407,19 @@ function restoreEditorSelection() { // 初始化公式弹窗 function initFormulaModal() { renderSymbolPalette(); + if (typeof VisualMath !== 'undefined') VisualMath.initialize(); - editorArea.addEventListener('dblclick', function(e) { + function editFormula(e) { + if (e.type === 'keydown' && e.key !== 'Enter' && e.key !== ' ') return; const target = e.target.nodeType === Node.ELEMENT_NODE ? e.target : e.target.parentElement; const formula = target && target.closest ? target.closest('.formula-inline, .formula-block') : null; if (!formula || !editorArea.contains(formula)) return; e.preventDefault(); openFormulaModal(formula.classList.contains('formula-block') ? 'block' : 'inline', formula); - }); + } + editorArea.addEventListener('click', editFormula); + editorArea.addEventListener('dblclick', editFormula); + editorArea.addEventListener('keydown', editFormula); // 关闭按钮 document.getElementById('formulaModalClose').addEventListener('click', closeFormulaModal); @@ -1360,6 +1428,22 @@ function initFormulaModal() { document.getElementById('formulaModal').addEventListener('click', function(e) { if (e.target === this) closeFormulaModal(); }); + document.getElementById('formulaModal').addEventListener('keydown', function(e) { + // Keep document shortcuts out of the formula draft. Ctrl+S commits the + // formula itself; native MathLive undo remains inside the mathfield. + e.stopPropagation(); + if (e.key === 'Escape') { e.preventDefault(); closeFormulaModal(); } + else if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 's') { + e.preventDefault(); insertFormulaFromInput(); + } else if (e.key === 'Tab' && this.querySelectorAll) { + const fields = Array.from(this.querySelectorAll('button,input,textarea,summary,math-field')) + .filter(function(field) { return !field.disabled && field.getClientRects && field.getClientRects().length; }); + if (!fields.length) return; + const first = fields[0], last = fields[fields.length-1]; + if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } + else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } + } + }); // 插入按钮 document.getElementById('btnInsertFormula').addEventListener('click', insertFormulaFromInput); diff --git a/server.mjs b/server.mjs index 905fec9..5786ac5 100644 --- a/server.mjs +++ b/server.mjs @@ -9,13 +9,27 @@ import {getPdfPreviewInfo, renderPdfPreviewPage} from './pdf-preview.mjs'; const ROOT = dirname(fileURLToPath(import.meta.url)); const MAX_BODY_BYTES = 80 * 1024 * 1024; const MAX_PDF_BYTES = 80 * 1024 * 1024; +// The checked-in manifest is the only source of public vendor paths. Do not +// expose a vendor directory or derive a filesystem path from the request URL. +const mathliveManifest = JSON.parse(await readFile(new URL('./vendor/mathlive/manifest.json', import.meta.url), 'utf8')); +const mathliveTypes = new Map([ + ['mathlive.min.js', 'text/javascript; charset=utf-8'], + ['mathlive-static.css', 'text/css; charset=utf-8'], + ['mathlive-fonts.css', 'text/css; charset=utf-8'] +]); +const mathliveAssets = mathliveManifest.files.flatMap(({path}) => { + const type = mathliveTypes.get(path) || (/^fonts\/[A-Za-z0-9_-]+\.woff2$/.test(path) ? 'font/woff2' : null); + return type ? [['/vendor/mathlive/' + path, ['vendor/mathlive/' + path, type]]] : []; +}); const ASSETS = new Map([ ['/', ['index.html', 'text/html; charset=utf-8']], ['/index.html', ['index.html', 'text/html; charset=utf-8']], - ...['main.js', 'workspace.js', 'project-model.js', 'project-archive.js', 'preview.js'] + ...['main.js', 'workspace.js', 'project-model.js', 'project-archive.js', 'preview.js', + 'visual-math.js', 'visual-references.js', 'visual-references-ui.js'] .map(name => ['/' + name, [name, 'text/javascript; charset=utf-8']]), - ...['style.css', 'workspace.css', 'preview.css'] - .map(name => ['/' + name, [name, 'text/css; charset=utf-8']]) + ...['style.css', 'workspace.css', 'preview.css', 'visual-math.css', 'visual-references-ui.css'] + .map(name => ['/' + name, [name, 'text/css; charset=utf-8']]), + ...mathliveAssets ]); function error(message, status = 400, code = 'INVALID_REQUEST') { diff --git a/tests/browser-acceptance.md b/tests/browser-acceptance.md index c0026aa..b3fddff 100644 --- a/tests/browser-acceptance.md +++ b/tests/browser-acceptance.md @@ -19,3 +19,7 @@ PDF 图片预览依赖 Ghostscript,不依赖浏览器内置 PDF 插件。还 本次验收环境:Windows、Chromium 内嵌浏览器、Tectonic 0.17.0、Ghostscript 10.08.0。中文样例使用 `ctex` 的 `fontset=windows`。这不代表已覆盖 Safari、Firefox、移动设备或真实 XeLaTeX 发行版。 可视化恢复验收:实际在纸面修改标题、正文、粗体、标题级别与公式,下载的 `.tex` 包含全部改动且导言区/尾注及引用命令保持原样;再编译并读取实际下载 PDF,确认修改进入排版结果。当前用户项目在独立测试前后逐文件比较,内容不变。窄屏从 PDF 预览选择文档会返回编辑区。 + +公式和引用专项验收:单击公式打开 MathLive,通过分数按钮及分子/分母占位框将公式改为 1/2;修改 equation 内容及标签,修改两行 align 的末行内容及标签,确认光标默认位于最后一格内。直接修改正文标签、选择交叉引用目标、替换两处相同文献引用中的第二处,全程不切源码。验证取消、撤销、重做、刷新恢复和长引用卡片点击。实际下载 TeX 保留导言区和尾注;编译 PDF 正确显示方程 (1)、(2)、(3),引用 (1)/(3) 和文献 [1]/[2]。用户当前项目刷新前后 4 个文件逐字节相同。 + +高级输入与图形输入切换须保留新标签、编号和注释;未修改即确认须保留原始公式,不以数学组件的归一化结果覆盖原文。两项都有事件回归。内嵌浏览器仅允许 HTTP/HTTPS,本次未实跑 file:// UI;本地资源、字体白名单及打包完整性有自动检查。 diff --git a/tests/editor-regression.test.mjs b/tests/editor-regression.test.mjs index 91ef95e..47099bb 100644 --- a/tests/editor-regression.test.mjs +++ b/tests/editor-regression.test.mjs @@ -45,7 +45,7 @@ function fixture() { return null; } addEventListener(type, handler) { this.listeners[type] = handler; } - focus() {} + focus() { document.activeElement = this; } } function textNode(value) { return { nodeType: 3, textContent: String(value), get parentElement() { return this.parentNode; } }; @@ -81,13 +81,15 @@ function fixture() { const prompts = []; const calls = { prompts: 0, saves: 0, previews: 0, statuses: [] }; const document = { - addEventListener() {}, + listeners: {}, + addEventListener(type, handler) { this.listeners[type] = handler; }, getElementById: id => ids[id], createElement: tag => new Element(tag), createTextNode: textNode, createRange: () => new Range(ids.editorArea), querySelector: selector => selector.includes(':checked') ? radios.find(r => r.checked) : radios.find(r => selector.includes(`value="${r.value}"`)), + querySelectorAll: selector => selector === 'input[name="formulaMode"]' ? radios : [], }; const context = vm.createContext({ document, Node: { ELEMENT_NODE: 1, TEXT_NODE: 3 }, window: { getSelection: () => selection }, console, @@ -104,7 +106,17 @@ function fixture() { ids.editorArea.appendChild(node); return node; } - return { context, ids, selection, prompts, calls, Element, Range, formula, radios }; + return { context, ids, selection, prompts, calls, Element, Range, formula, radios, document }; +} + +function modalKey(f, key, properties = {}) { + const event = {type: 'keydown', key, target: f.ids.formulaInput, defaultPrevented: false, propagationStopped: false, + preventDefault() { this.defaultPrevented = true; }, stopPropagation() { this.propagationStopped = true; }, ...properties}; + // Match addEventListener's currentTarget/this binding and event bubbling. + // Parent listeners are deliberately installed by each shortcut regression. + f.ids.formulaModal.listeners.keydown.call(f.ids.formulaModal, event); + if (!event.propagationStopped) f.document.listeners.keydown?.call(f.document, event); + return event; } test('image insertion without an existing selection appends to the editor', () => { @@ -183,6 +195,110 @@ test('double-clicking an existing formula loads its value and mode', () => { assert.equal(f.ids.btnInsertFormula.textContent, '更新公式'); }); +test('a single click opens the formula editor from rendered children or their text', () => { + for (const textTarget of [false, true]) { + const f = fixture(); + const formula = f.formula(String.raw`\frac{x}{y}`, 'block'); + const rendered = new f.Element('span'); + rendered.textContent = 'rendered fraction'; + formula.appendChild(rendered); + f.context.initFormulaModal(); + let prevented = false; + f.ids.editorArea.listeners.click({type: 'click', target: textTarget ? rendered.childNodes[0] : rendered, + preventDefault() { prevented = true; }}); + assert.equal(prevented, true); + assert.equal(f.ids.formulaModal.classList.contains('show'), true); + assert.equal(f.ids.formulaInput.value, String.raw`\frac{x}{y}`); + assert.equal(f.radios.find(r => r.checked).value, 'block'); + assert.equal(f.ids.btnInsertFormula.textContent, '更新公式'); + assert.equal(f.calls.saves, 0); + } +}); + +test('Enter and Space open a focused formula while ordinary typing and outside formulas do not', () => { + for (const key of ['Enter', ' ', 'ArrowRight', 'a']) { + const f = fixture(); + const formula = f.formula('x + 1'); + f.context.initFormulaModal(); + let prevented = false; + f.ids.editorArea.listeners.keydown({type: 'keydown', key, target: formula, + preventDefault() { prevented = true; }}); + const activated = key === 'Enter' || key === ' '; + assert.equal(prevented, activated); + assert.equal(f.ids.formulaModal.classList.contains('show'), activated); + assert.equal(f.calls.saves, 0); + } + const f = fixture(); + f.context.initFormulaModal(); + const outside = new f.Element('span'); outside.className = 'formula-inline'; + let prevented = false; + f.ids.editorArea.listeners.click({type: 'click', target: outside, preventDefault() { prevented = true; }}); + assert.equal(prevented, false); + assert.equal(f.ids.formulaModal.classList.contains('show'), false); +}); + +for (const environment of ['equation', 'equation*', 'align', 'align*', 'gather', 'gather*']) { + test('editing ' + environment + ' through formula events preserves exact environment boundaries', () => { + const f = fixture(); + const original = '\r\nx &= 1\\\\\r\ny &= 2\\label{eq:result}\r\n'; + const updated = original.replace('x &= 1', 'x &= 3'); + const opening = '\\begin \t{' + environment + '}'; + const closing = '\\end\r\n{' + environment + '}'; + const formula = f.formula(original, 'block'); + formula.setAttribute('data-delimiter', 'environment'); + formula.setAttribute('data-environment', environment); + formula.setAttribute('data-tex-env-open', opening); + formula.setAttribute('data-tex-env-close', closing); + formula.setAttribute('data-tex-source', opening + original + closing); + formula.setAttribute('data-tex-snapshot', 'old snapshot'); + f.context.initFormulaModal(); + f.ids.editorArea.listeners.click({type: 'click', target: formula, preventDefault() {}}); + assert.equal(f.radios.find(r => r.checked).value, 'block'); + assert.ok(f.radios.every(r => r.disabled)); + f.ids.formulaInput.value = updated; + f.ids.btnInsertFormula.listeners.click({type: 'click'}); + assert.equal(f.ids.editorArea.childNodes.length, 1); + const replacement = f.ids.editorArea.childNodes[0]; + assert.notEqual(replacement, formula); + assert.equal(replacement.getAttribute('data-formula'), updated); + assert.equal(replacement.getAttribute('data-delimiter'), 'environment'); + assert.equal(replacement.getAttribute('data-environment'), environment); + assert.equal(replacement.getAttribute('data-tex-env-open'), opening); + assert.equal(replacement.getAttribute('data-tex-env-close'), closing); + assert.equal(replacement.getAttribute('data-tex-source'), null); + assert.equal(replacement.getAttribute('data-tex-snapshot'), null); + assert.equal(f.context.convertNodeToLatex(replacement), opening + updated + closing); + assert.equal(f.ids.formulaModal.classList.contains('show'), false); + assert.equal(f.calls.saves, 1); + assert.equal(f.calls.previews, 1); + f.context.openFormulaModal('inline'); + assert.ok(f.radios.every(r => !r.disabled)); + }); +} + +test('cancelling environment edits with close or Escape preserves the original atom and source', () => { + for (const action of ['close', 'escape']) { + const f = fixture(); + const formula = f.formula('\nx = 1\\label{eq:original}\n', 'block'); + const source = '\\begin{equation}' + formula.getAttribute('data-formula') + '\\end{equation}'; + formula.setAttribute('data-delimiter', 'environment'); + formula.setAttribute('data-environment', 'equation'); + formula.setAttribute('data-tex-env-open', '\\begin{equation}'); + formula.setAttribute('data-tex-env-close', '\\end{equation}'); + formula.setAttribute('data-tex-source', source); + f.context.initFormulaModal(); + f.ids.editorArea.listeners.keydown({type: 'keydown', key: 'Enter', target: formula, preventDefault() {}}); + f.ids.formulaInput.value = 'discarded'; + if (action === 'close') f.ids.formulaModalClose.listeners.click({type: 'click'}); + else f.document.listeners.keydown({type: 'keydown', key: 'Escape'}); + assert.equal(f.ids.editorArea.childNodes[0], formula); + assert.equal(formula.getAttribute('data-tex-source'), source); + assert.equal(formula.getAttribute('data-environment'), 'equation'); + assert.equal(f.ids.formulaModal.classList.contains('show'), false); + assert.equal(f.calls.saves, 0); + } +}); + test('formula confirmation shortcuts edit once without reaching workspace compile handlers', () => { for (const modifier of ['ctrlKey', 'metaKey']) { const f = fixture(); @@ -203,6 +319,94 @@ test('formula confirmation shortcuts edit once without reaching workspace compil } }); +test('modal Ctrl+S and Cmd+S commit the formula exactly once before document persistence', () => { + for (const modifier of ['ctrlKey', 'metaKey']) { + const f = fixture(); + const original = f.formula('x'); + f.context.initFormulaModal(); + f.context.openFormulaModal('inline', original); + f.ids.formulaInput.value = 'x + 1'; + let documentSaves = 0; + f.document.listeners.keydown = event => { + if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 's') documentSaves++; + }; + const event = modalKey(f, modifier === 'ctrlKey' ? 's' : 'S', {[modifier]: true}); + assert.equal(event.defaultPrevented, true); + assert.equal(event.propagationStopped, true); + assert.equal(documentSaves, 0); + assert.equal(f.calls.saves, 1); + assert.equal(f.calls.previews, 1); + assert.equal(f.ids.editorArea.childNodes.length, 1); + assert.equal(f.ids.editorArea.childNodes[0].getAttribute('data-formula'), 'x + 1'); + assert.equal(f.ids.formulaModal.classList.contains('show'), false); + } +}); + +test('modal undo shortcuts stay inside the formula field without preventing its native undo', () => { + for (const modifier of ['ctrlKey', 'metaKey']) { + const f = fixture(); + const original = f.formula('x'); + f.context.initFormulaModal(); + f.context.openFormulaModal('inline', original); + f.ids.formulaInput.value = 'draft'; + let documentUndos = 0; + f.document.listeners.keydown = () => documentUndos++; + const event = modalKey(f, 'z', {[modifier]: true}); + assert.equal(event.propagationStopped, true); + assert.equal(event.defaultPrevented, false); + assert.equal(documentUndos, 0); + assert.equal(f.ids.formulaModal.classList.contains('show'), true); + assert.equal(f.ids.editorArea.childNodes[0], original); + assert.equal(f.calls.saves, 0); + } +}); + +test('modal Escape cancels the draft without propagating to document handlers', () => { + const f = fixture(); + const original = f.formula('x'); + f.context.initFormulaModal(); + f.context.openFormulaModal('inline', original); + f.ids.formulaInput.value = 'discarded'; + let documentKeys = 0; + f.document.listeners.keydown = () => documentKeys++; + const event = modalKey(f, 'Escape'); + assert.equal(event.defaultPrevented, true); + assert.equal(event.propagationStopped, true); + assert.equal(documentKeys, 0); + assert.equal(f.ids.formulaModal.classList.contains('show'), false); + assert.equal(f.ids.editorArea.childNodes[0], original); + assert.equal(original.getAttribute('data-formula'), 'x'); + assert.equal(f.calls.saves, 0); + assert.equal(f.document.activeElement, f.ids.editorArea); +}); + +test('modal Tab loops only at visible enabled control boundaries', () => { + const f = fixture(); + f.context.initFormulaModal(); + f.context.openFormulaModal('inline'); + const disabled = new f.Element('button'); disabled.disabled = true; + const hidden = new f.Element('textarea'); + const fields = [disabled, f.ids.formulaModalClose, f.ids.formulaInput, f.ids.btnInsertFormula, hidden]; + for (const field of fields) field.getClientRects = () => [{}]; + hidden.getClientRects = () => []; + f.ids.formulaModal.querySelectorAll = selector => { + assert.equal(selector, 'button,input,textarea,summary,math-field'); + return fields; + }; + let documentKeys = 0; + f.document.listeners.keydown = () => documentKeys++; + f.ids.btnInsertFormula.focus(); + assert.equal(modalKey(f, 'Tab').defaultPrevented, true); + assert.equal(f.document.activeElement, f.ids.formulaModalClose); + assert.equal(modalKey(f, 'Tab', {shiftKey: true}).defaultPrevented, true); + assert.equal(f.document.activeElement, f.ids.btnInsertFormula); + f.ids.formulaInput.focus(); + assert.equal(modalKey(f, 'Tab').defaultPrevented, false); + assert.equal(f.document.activeElement, f.ids.formulaInput); + assert.equal(documentKeys, 0); + assert.equal(f.calls.saves, 0); +}); + test('an empty formula confirmation remains in the modal without starting compilation', () => { const f = fixture(); f.context.initFormulaModal(); diff --git a/tests/helpers/workspace-fixture.mjs b/tests/helpers/workspace-fixture.mjs new file mode 100644 index 0000000..0bf084f --- /dev/null +++ b/tests/helpers/workspace-fixture.mjs @@ -0,0 +1,236 @@ +import fs from 'node:fs'; +import vm from 'node:vm'; +import {createDocument, Element, Text} from './dom.mjs'; + +// Actual markup, production startup and event handlers; the local fixture adds +// basic form/events to the shared deterministic DOM. No browser engine, layout, +// automatic HTML repair, scripts in user text or OS clipboard are simulated. +const markup = fs.readFileSync(new URL('../../index.html', import.meta.url), 'utf8'); +const sources = ['main.js', 'project-model.js', 'project-archive.js', 'workspace.js'] + .map(name => [name, fs.readFileSync(new URL('../../' + name, import.meta.url), 'utf8')]); + +export async function fixture({denyStorage = false, denyDialogs = false, initialStorage = [], includeVisualReferences = false, includeVisualMath = false} = {}) { + const root = new Element('fixture-root'); + root.innerHTML = markup; + const storage = new Map(initialStorage); + const prompts = []; + const alerts = []; + const blobs = []; + const tasks = new Map(); + let timer = 0; + let document; + const addEvents = target => { + target._events = new Map(); + target.addEventListener = (type, listener) => { + if (!target._events.has(type)) target._events.set(type, []); + target._events.get(type).push(listener); + }; + target.removeEventListener = (type, listener) => { + target._events.set(type, (target._events.get(type) || []).filter(item => item !== listener)); + }; + }; + async function emit(target, type, properties = {}) { + const event = {type, target, defaultPrevented: false, propagationStopped: false, + preventDefault() { this.defaultPrevented = true; }, + stopPropagation() { this.propagationStopped = true; }, ...properties}; + for (const listener of target._events?.get(type) || []) await listener(event); + return event; + } + function enhance(node) { + if (node.nodeType !== 1 || node._events) return node; + addEvents(node); + node.classList = { + contains: name => node.className.split(/\s+/).includes(name), + add(...names) { node.className = [...new Set([...node.className.split(/\s+/).filter(Boolean), ...names])].join(' '); }, + remove(...names) { node.className = node.className.split(/\s+/).filter(name => !names.includes(name)).join(' '); }, + toggle(name, force) { + const add = force ?? !this.contains(name); + if (add) this.add(name); else this.remove(name); + return add; + }, + }; + node.replaceChildren = (...children) => { + for (const child of [...node.childNodes]) child.remove(); + for (const child of children) node.appendChild(typeof child === 'string' ? new Text(child) : child); + }; + node.replaceChild = (next, old) => { old.replaceWith(next); return old; }; + const queryAll = node.querySelectorAll.bind(node); + node.querySelectorAll = selector => selector.includes(',') + ? queryAll('*').filter(child => selector.split(',').some(part => child.matches(part.trim()))) : queryAll(selector); + node.querySelector = selector => node.querySelectorAll(selector)[0] || null; + node.closest = selector => { + for (let current = node; current; current = current.parentElement) { + if (selector.split(',').some(part => current.matches(part.trim()))) return current; + } + return null; + }; + node.focus = () => { document.activeElement = node; }; + node.click = () => node.disabled ? Promise.resolve() : emit(node, 'click'); + node.scrollTop = 0; + node.scrollLeft = 0; + node.selectionStart = node.selectionEnd = 0; + let value = node.getAttribute('value') || (node.tagName === 'TEXTAREA' ? node.textContent : ''); + Object.defineProperty(node, 'value', { + configurable: true, + get: () => value, + set(next) { + const normalized = String(next).replace(/\r\n?/g, '\n'); + if (normalized !== value) node.selectionStart = node.selectionEnd = normalized.length; + value = normalized; + }, + }); + Object.defineProperty(node, 'hidden', { + get: () => node.getAttribute('hidden') !== null, + set(hidden) { if (hidden) node.setAttribute('hidden', ''); else node.removeAttribute('hidden'); }, + }); + node.disabled = node.getAttribute('disabled') !== null; + let checked = node.getAttribute('checked') !== null; + Object.defineProperty(node, 'checked', { + get: () => checked, + set(value) { + if (value && node.getAttribute('type') === 'radio') { + for (const other of root.querySelectorAll('input')) { + if (other !== node && other.getAttribute('type') === 'radio' && other.getAttribute('name') === node.getAttribute('name')) other.checked = false; + } + } + checked = Boolean(value); + }, + }); + if (node.tagName === 'INPUT' && node.getAttribute('type') === 'file') node.files = []; + node.setSelectionRange = (start, end) => { + node.selectionStart = Math.max(0, Math.min(value.length, start)); + node.selectionEnd = Math.max(node.selectionStart, Math.min(value.length, end)); + }; + node.select = () => node.setSelectionRange(0, value.length); + return node; + } + for (const node of root.querySelectorAll('*')) enhance(node); + const ids = new Map(root.querySelectorAll('[id]').map(node => [node.getAttribute('id'), node])); + const base = createDocument(); + document = {...base, body: root.querySelector('body'), activeElement: null, visibilityState: 'visible', + getElementById: id => ids.get(id) || null, + createElement: tag => enhance(base.createElement(tag)), + createTextNode: value => new Text(String(value)), + querySelector(selector) { + if (selector.startsWith('input[name="formulaMode"]')) { + const radios = root.querySelectorAll('input').filter(node => node.getAttribute('name') === 'formulaMode'); + if (selector.endsWith(':checked')) return radios.find(node => node.checked) || null; + const requested = /\[value="([^"]+)"\]/.exec(selector)?.[1]; + return radios.find(node => node.value === requested) || null; + } + return root.querySelector(selector); + }, + querySelectorAll(selector) { + if (selector === 'input[name="formulaMode"]') return root.querySelectorAll('input').filter(node => node.getAttribute('name') === 'formulaMode'); + return root.querySelectorAll(selector); + }, + execCommand() { return true; }, + }; + addEvents(document); + // A minimal live Range for checking cursor restoration, not layout or a + // replacement for browser acceptance. Mutations are real fixture DOM edits. + class Range { + constructor() { this.startContainer = document.body; this.endContainer = document.body; this.startOffset = this.endOffset = 0; } + get commonAncestorContainer() { + for (let node = this.startContainer; node; node = node.parentNode) { + if (node === this.endContainer || node.contains?.(this.endContainer)) return node; + } + return document.body; + } + setStart(node, offset) { this.startContainer = node; this.startOffset = offset; } + setEnd(node, offset) { this.endContainer = node; this.endOffset = offset; } + setStartAfter(node) { this.setStart(node.parentNode, node.parentNode.childNodes.indexOf(node) + 1); } + setEndAfter(node) { this.setEnd(node.parentNode, node.parentNode.childNodes.indexOf(node) + 1); } + selectNodeContents(node) { this.setStart(node, 0); this.setEnd(node, node.nodeType === 3 ? node.textContent.length : node.childNodes.length); } + collapse(toStart = false) { + if (toStart) this.setEnd(this.startContainer, this.startOffset); + else this.setStart(this.endContainer, this.endOffset); + } + cloneRange() { const clone = new Range(); Object.assign(clone, this); return clone; } + deleteContents() { + if (this.startContainer !== this.endContainer) throw new Error('The fixture supports selections within a single node'); + if (this.startContainer.nodeType === 3) { + const node = this.startContainer; + node.textContent = node.textContent.slice(0, this.startOffset) + node.textContent.slice(this.endOffset); + } else for (const child of this.startContainer.childNodes.slice(this.startOffset, this.endOffset)) child.remove(); + this.collapse(true); + } + insertNode(node) { + let parent = this.startContainer; + let position = this.startOffset; + if (parent.nodeType === 3) { + const original = parent; + const after = new Text(original.textContent.slice(position)); + original.textContent = original.textContent.slice(0, position); + parent = original.parentNode; + position = parent.childNodes.indexOf(original) + 1; + after.parentNode = parent; parent.childNodes.splice(position, 0, after); + } + node.remove?.(); node.parentNode = parent; parent.childNodes.splice(position, 0, node); + } + } + const selection = {ranges: [], get rangeCount() { return this.ranges.length; }, + get anchorNode() { return this.ranges[0]?.startContainer || null; }, + getRangeAt: index => selection.ranges[index], removeAllRanges() { this.ranges = []; }, addRange(range) { this.ranges.push(range); }}; + document.createRange = () => new Range(); + const window = {getSelection: () => selection}; + addEvents(window); + const context = vm.createContext({document, window, Node: {ELEMENT_NODE: 1, TEXT_NODE: 3}, + TextEncoder, TextDecoder, Uint8Array, ArrayBuffer, DataView, atob, btoa, Blob, + DecompressionStream, ReadableStream, Date, console, + localStorage: {getItem: key => storage.get(key) ?? null, setItem: (key, value) => storage.set(key, String(value)), removeItem: key => storage.delete(key)}, + prompt: () => { if (denyDialogs) throw new Error('prompt() is not supported.'); return prompts.shift() ?? null; }, + confirm: () => { if (denyDialogs) throw new Error('confirm() is not supported.'); return true; }, + alert: message => alerts.push(message), + setTimeout: callback => { const id = ++timer; tasks.set(id, callback); return id; }, + clearTimeout: id => tasks.delete(id), + navigator: {clipboard: {writeText: async () => {}}}, + URL: {createObjectURL: blob => { blobs.push(blob); return 'blob:fixture/' + blobs.length; }, revokeObjectURL() {}}, + }); + let mathField = null; + if (includeVisualMath) { + // Instrument only the external custom element boundary. Production + // adapter, palette buttons, modal and workspace handlers remain real. + const field = ids.get('formulaMathField'); + mathField = {writes: [], inserts: []}; + let fieldValue = ''; + Object.defineProperty(field, 'value', {configurable: true, + get: () => fieldValue, + set(value) { fieldValue = String(value); mathField.writes.push(fieldValue); field.lastOffset = fieldValue.length + 5; }, + }); + field.insert = (latex, options) => { + mathField.inserts.push({latex, options: {...options}}); + field.value += latex; + }; + context.MathfieldElement = class MathfieldElement {}; + context.customElements = {get: name => ['math-field', 'math-span'].includes(name) ? context.MathfieldElement : undefined}; + } + if (denyStorage) Object.defineProperty(context, 'localStorage', { + get() { const error = new Error('Access to localStorage is denied'); error.name = 'SecurityError'; throw error; }, + }); + const loaded = [...sources]; + if (includeVisualMath) loaded.unshift(['visual-math.js', fs.readFileSync(new URL('../../visual-math.js', import.meta.url), 'utf8')]); + if (includeVisualReferences) for (const name of ['visual-references.js', 'visual-references-ui.js']) { + loaded.splice(loaded.length - 1, 0, [name, fs.readFileSync(new URL('../../' + name, import.meta.url), 'utf8')]); + } + for (const [filename, source] of loaded) vm.runInContext(source, context, {filename}); + await emit(document, 'DOMContentLoaded'); + const refresh = () => { for (const node of root.querySelectorAll('*')) enhance(node); }; + refresh(); + return {context, app: context.visualWorkspace, document, ids, storage, prompts, alerts, blobs, emit, + refresh, selection, mathField, + setCursor(node, offset) { const range = new Range(); range.setStart(node, offset); range.collapse(true); selection.removeAllRanges(); selection.addRange(range); }, + node: id => ids.get(id), click: id => ids.get(id).click(), + async input(id, value) { + // Source-oriented scenarios explicitly open the source editor, as a + // real user must now do from the default visual editing surface. + if (id === 'sourceArea') await ids.get('modeSource').click(); + ids.get(id).value = value; await emit(ids.get(id), 'input'); + }, + async flushTimers() { + const pending = [...tasks.values()]; tasks.clear(); + for (const callback of pending) await callback(); + }, + }; +} + diff --git a/tests/roundtrip-regression.test.mjs b/tests/roundtrip-regression.test.mjs index 6770c34..32a1da5 100644 --- a/tests/roundtrip-regression.test.mjs +++ b/tests/roundtrip-regression.test.mjs @@ -122,6 +122,109 @@ test('editing text retains adjacent escaped characters, commands and math delimi assert.equal(f.context.domToLatex(), tex.replace('Rate ', 'Updated rate ')); }); +test('visual command and math decorations preserve original source and ancestor snapshots', () => { + const tex = documentWith('\r\n' + String.raw`\textbf{See \cite[see][p. 7]{first,second} and \ref{sec:intro}.} \label{sec:intro} \(x^2\) $$y$$` + '\r\n'); + const f = fixture(); + f.context.applyImportedTex(tex, 'decorated.tex'); + const paragraph = f.editor.querySelector('p'); + const snapshot = f.context.getTexNodeSnapshot(paragraph); + for (const command of f.editor.querySelectorAll('.tex-cmd')) { + command.innerHTML = '↗Readable reference'; + command.setAttribute('title', 'Click to edit'); + command.setAttribute('aria-label', 'Edit reference'); + command.setAttribute('data-rendered', 'true'); + } + for (const formula of [...f.editor.querySelectorAll('.formula-inline'), ...f.editor.querySelectorAll('.formula-block')]) { + formula.innerHTML = '2rendered expression'; + formula.setAttribute('title', 'Edit equation'); + formula.setAttribute('aria-label', 'x squared'); + formula.setAttribute('role', 'button'); + } + assert.equal(f.context.getTexNodeSnapshot(paragraph), snapshot); + assert.equal(f.context.domToLatex(), tex); +}); + +test('changing a displayed reference invalidates its ancestors and changes only its command', () => { + const original = String.raw`\cite[see][p. 7]{first,second}`; + const replacement = String.raw`\cite[compare][p. 9]{third,fourth}`; + const tex = documentWith('\r\n' + String.raw`\textbf{See ` + original + String.raw` and \ref{sec:intro}.} \label{sec:intro} \(x^2\)` + '\r\n'); + const f = fixture(); + f.context.applyImportedTex(tex, 'references.tex'); + const paragraph = f.editor.querySelector('p'); + const snapshot = f.context.getTexNodeSnapshot(paragraph); + for (const node of f.editor.querySelectorAll('.tex-cmd')) node.textContent = 'Readable label'; + const citation = f.editor.querySelectorAll('.tex-cmd').find(node => node.getAttribute('data-tex-source') === original); + citation.setAttribute('data-tex-source', replacement); + citation.innerHTML = 'Third and Fourth, p. 9'; + assert.notEqual(f.context.getTexNodeSnapshot(paragraph), snapshot); + assert.equal(f.context.domToLatex(), tex.replace(original, replacement)); +}); + +test('rendered math and reference HTML never leaks into exports after neighboring text changes', () => { + const tex = documentWith('\n' + String.raw`Before \ref{sec:a}, \label{sec:a}, $x+1$ and \[y^2\].` + '\n'); + const f = fixture(); + f.context.applyImportedTex(tex, 'math.tex'); + const paragraph = f.editor.querySelector('p'); + for (const node of paragraph.childNodes.filter(node => node.nodeType === 1)) { + node.innerHTML = 'rendered HTML & presentation'; + node.setAttribute('aria-label', 'Spoken formula'); + } + paragraph.childNodes[0].textContent = 'After '; + assert.equal(f.context.domToLatex(), tex.replace('Before ', 'After ')); +}); + +for (const [open, close] of [['$', '$'], ['$$', '$$'], ['\\(', '\\)'], ['\\[', '\\]']]) { + test('editing rendered math retains ' + open + ' delimiters and changes only the formula', () => { + const oldFormula = open + 'x + 1' + close; + const tex = documentWith('\r\nPrefix ' + oldFormula + String.raw` and \ref{sec:a}.` + '\r\n'); + const f = fixture(); + f.context.applyImportedTex(tex, 'formula.tex'); + const formula = f.editor.querySelector('.formula-inline') || f.editor.querySelector('.formula-block'); + formula.innerHTML = 'x²'; + formula.setAttribute('data-formula', 'x^2 + 2'); + assert.equal(f.context.domToLatex(), tex.replace(oldFormula, () => open + 'x^2 + 2' + close)); + }); +} + +test('legacy command atoms without source metadata still export their TeX text', () => { + const f = fixture(); + f.editor.innerHTML = '

See \\ref{old:label}.

'; + assert.equal(f.context.convertNodeToLatex(f.editor.querySelector('.tex-cmd')), String.raw`\ref{old:label}`); +}); + +for (const environment of ['equation', 'equation*', 'align', 'align*', 'gather', 'gather*']) { + test(environment + ' renders as a source-preserving formula atom with editable content', () => { + const body = '\r\nx &= 1 ' + String.raw`\label{eq:first} \\` + '\r\ny &= 2 ' + String.raw`\tag{A}` + '\r\n'; + const tex = documentWith('\r\nBefore.\r\n\\begin \t{' + environment + '}' + body + '\\end\r\n{' + environment + '}\r\nAfter.\r\n'); + const f = fixture(); + f.context.applyImportedTex(tex, 'equations.tex'); + const formula = f.editor.querySelector('.formula-block'); + assert.ok(formula); + assert.equal(formula.getAttribute('data-environment'), environment); + assert.equal(formula.getAttribute('data-delimiter'), 'environment'); + assert.equal(formula.getAttribute('data-formula'), body); + formula.innerHTML = 'Visual equation with label and tag'; + formula.setAttribute('aria-label', 'Equation'); + assert.equal(f.context.domToLatex(), tex); + formula.setAttribute('data-formula', body.replace('x &= 1', 'x &= 3')); + assert.equal(f.context.domToLatex(), tex.replace('x &= 1', 'x &= 3')); + assert.equal(f.context.saveDraft(), true); + const reloaded = fixture(f.storage); + reloaded.context.loadDraft(); + assert.deepEqual(reloaded.errors, []); + assert.equal(reloaded.context.domToLatex(), tex.replace('x &= 1', 'x &= 3')); + }); +} + +test('changing the equation environment invalidates source and uses matching environment boundaries', () => { + const tex = documentWith(String.raw`\begin{equation}x=1\label{eq:first}\end{equation}`); + const f = fixture(); + f.context.applyImportedTex(tex, 'equation.tex'); + const formula = f.editor.querySelector('.formula-block'); + formula.setAttribute('data-environment', 'gather*'); + assert.equal(f.context.domToLatex(), tex.replaceAll('{equation}', '{gather*}')); +}); + test('empty document and metadata survive JSON draft save/reload', () => { const tex = '% prefix\r\n\\documentclass{report}\r\n\\begin {document}\\end {document}\r\n% tail\r\n'; const f = fixture(); @@ -149,6 +252,26 @@ test('nonempty draft restoration preserves source snapshots and command semantic assert.equal(reloaded.context.domToLatex(), tex); }); +for (const edited of [false, true]) { + test('legacy presentation snapshots migrate without losing ' + (edited ? 'unsaved source changes' : 'original source formatting'), () => { + const tex = documentWith('\r\n' + String.raw`\section {See \ref{sec:a}}` + '\r\n' + + String.raw`Original \textbf {math \(x + 1\)}.` + '\r\n'); + const f = fixture(); + f.context.applyImportedTex(tex, 'old-draft.tex'); + for (const node of f.editor.querySelectorAll('[data-tex-snapshot]')) { + node.setAttribute('data-tex-snapshot', f.context.getTexNodeSnapshot(node, true)); + } + if (edited) f.editor.querySelector('p').childNodes[0].textContent = 'Updated '; + f.context.saveDraft(); + const reloaded = fixture(f.storage); + reloaded.context.loadDraft(); + assert.deepEqual(reloaded.errors, []); + assert.equal(reloaded.context.domToLatex(), edited ? tex.replace('Original ', 'Updated ') : tex); + const heading = reloaded.editor.querySelector('h1'); + assert.equal(heading.getAttribute('data-tex-snapshot'), reloaded.context.getTexNodeSnapshot(heading)); + }); +} + test('legacy drafts strip event handlers, active elements and unsafe image protocols', () => { const f = fixture(new Map([['visuellatex_draft', '

Keep bold

' + diff --git a/tests/server.test.mjs b/tests/server.test.mjs index efb3a89..97dad11 100644 --- a/tests/server.test.mjs +++ b/tests/server.test.mjs @@ -46,6 +46,35 @@ test('loopback service serves only the UI assets and keeps compiler paths privat } }); +test('visual editor modules and bundled math fonts have usable MIME types without exposing other vendor files', async t => { + const f = await fixture(t); + for (const path of ['/visual-math.js', '/visual-references.js', '/visual-references-ui.js', '/vendor/mathlive/mathlive.min.js']) { + const response = await fetch(f.url + path); + assert.equal(response.status, 200, path); + assert.equal(response.headers.get('content-type'), 'text/javascript; charset=utf-8', path); + assert.ok((await response.text()).length > 0, path); + } + for (const path of ['/visual-math.css', '/visual-references-ui.css', '/vendor/mathlive/mathlive-static.css', '/vendor/mathlive/mathlive-fonts.css']) { + const response = await fetch(f.url + path); + assert.equal(response.status, 200, path); + assert.equal(response.headers.get('content-type'), 'text/css; charset=utf-8', path); + assert.ok((await response.text()).length > 0, path); + } + const font = await fetch(f.url + '/vendor/mathlive/fonts/KaTeX_Main-Regular.woff2'); + assert.equal(font.status, 200); + assert.equal(font.headers.get('content-type'), 'font/woff2'); + assert.equal(Buffer.from(await font.arrayBuffer()).subarray(0, 4).toString('ascii'), 'wOF2'); + const head = await fetch(f.url + '/vendor/mathlive/fonts/KaTeX_Math-Italic.woff2', {method: 'HEAD'}); + assert.equal(head.status, 200); + assert.ok(Number(head.headers.get('content-length')) > 0); + assert.equal((await head.arrayBuffer()).byteLength, 0); + for (const path of ['/vendor/mathlive/', '/vendor/mathlive/manifest.json', '/vendor/mathlive/LICENSE.txt', + '/vendor/mathlive/fonts/not-in-manifest.woff2', '/vendor/mathlive/private.js', + '/vendor/mathlive/fonts/..%2f..%2f..%2fserver.mjs', '/vendor/mathlive/fonts/%2e%2e%5cserver.mjs']) { + assert.equal((await fetch(f.url + path)).status, 404, path); + } +}); + test('cross-origin requests, DNS-rebinding hosts and missing tokens cannot invoke compilers', async t => { const f = await fixture(t); assert.equal((await fetch(f.url + '/api/status', {headers: {Origin: 'https://evil.example'}})).status, 403); diff --git a/tests/vendor-assets.test.mjs b/tests/vendor-assets.test.mjs new file mode 100644 index 0000000..bad8953 --- /dev/null +++ b/tests/vendor-assets.test.mjs @@ -0,0 +1,19 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFile} from 'node:fs/promises'; +import {createHash} from 'node:crypto'; + +test('bundled math renderer and every font match the verified package manifest', async () => { + const root = new URL('../vendor/mathlive/', import.meta.url); + const manifest = JSON.parse(await readFile(new URL('manifest.json', root), 'utf8')); + assert.equal(manifest.version, '0.111.1'); + assert.equal(manifest.license, 'MIT'); + assert.ok(manifest.files.some(file => file.path === 'mathlive.min.js')); + assert.ok(manifest.files.filter(file => file.path.endsWith('.woff2')).length >= 20); + for (const entry of manifest.files) { + assert.match(entry.path, /^(?:[\w.-]+|fonts\/[\w.-]+\.woff2)$/); + const data = await readFile(new URL(entry.path, root)); + assert.equal(createHash('sha256').update(data).digest('hex'), entry.sha256, entry.path); + } + assert.match(await readFile(new URL('LICENSE.txt', root),'utf8'), /Permission is hereby granted, free of charge/); +}); diff --git a/tests/visual-math-ui.test.mjs b/tests/visual-math-ui.test.mjs new file mode 100644 index 0000000..c169f33 --- /dev/null +++ b/tests/visual-math-ui.test.mjs @@ -0,0 +1,197 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {fixture} from './helpers/workspace-fixture.mjs'; + +async function visual(body) { + const f = await fixture({includeVisualMath: true}); + await f.input('sourceArea', '\\documentclass{article}\n\\begin{document}\n' + body + '\n\\end{document}\n'); + await f.click('modeVisual'); f.refresh(); + return f; +} +const formula = f => f.node('editorArea').querySelector('.formula-inline, .formula-block'); +const open = f => f.emit(f.node('editorArea'), 'click', {target: formula(f)}); + +test('opening and confirming an untouched mathfield preserves source despite field normalization', async () => { + const f = await visual('$ x + y \\label {eq:keep}% original note\n $'); + const original = f.app.model.get().text; + const originalNode = formula(f); + await open(f); + assert.equal(f.document.activeElement, f.node('formulaMathField')); + assert.equal(f.node('formulaMathField').mathVirtualKeyboardPolicy, 'manual'); + assert.equal(f.context.MathfieldElement.soundsDirectory, null); + assert.equal(f.context.MathfieldElement.computeEngine, null); + assert.doesNotMatch(f.node('formulaMathField').value, /\\label|original note/); + // MathLive normalizes its display value on assignment without a user input + // event. That must not overwrite the original mathematical source. + f.node('formulaMathField').value = 'x+y'; + await f.click('btnInsertFormula'); + assert.equal(f.app.model.get().text, original); + assert.equal(formula(f), originalNode); + assert.equal(f.app.mode, 'visual'); + assert.equal(f.node('formulaModal').classList.contains('show'), false); +}); + +test('actual palette events give MathLive editable placeholder slots', async () => { + const f = await visual('Text.'); + await f.click('btnInlineFormula'); + const palette = f.node('symbolPalette').querySelectorAll('button'); + await palette.find(button => button.textContent === '分数').click(); + await palette.find(button => button.textContent === '根式').click(); + assert.deepEqual(f.mathField.inserts, [ + {latex: String.raw`\frac{#?}{#?}`, options: {selectionMode: 'placeholder'}}, + {latex: String.raw`\sqrt{#?}`, options: {selectionMode: 'placeholder'}}, + ]); + assert.equal(f.document.activeElement, f.node('formulaMathField')); + await f.click('formulaModalClose'); + assert.equal(formula(f), null); +}); + +test('align and gather editors start inside their final cell and commit field input without wrapper leakage', async () => { + for (const environment of ['align', 'gather*']) { + const f = await visual('\\begin{' + environment + '}a=b\\\\c=d\\label{eq:last}\\end{' + environment + '}'); + await open(f); + const field = f.node('formulaMathField'); + const wrapper = environment.startsWith('align') ? 'aligned' : 'gathered'; + assert.equal(field.value, '\\begin{' + wrapper + '}a=b\\\\c=d\\end{' + wrapper + '}'); + assert.equal(field.position, field.lastOffset - 1); + field.value = '\\begin{' + wrapper + '}a=b\\\\c=d+1\\end{' + wrapper + '}'; + await f.emit(field, 'input'); + await f.click('btnInsertFormula'); + assert.equal(formula(f).getAttribute('data-formula'), String.raw`a=b\\c=d+1\label{eq:last}`); + assert.equal(formula(f).getAttribute('data-environment'), environment); + assert.doesNotMatch(f.app.model.get().text, /\\begin\{(?:aligned|gathered)\}/); + assert.equal(f.app.mode, 'visual'); + } +}); + +test('label and display-number input events update only their exact source fields', async () => { + const f = await visual(String.raw`\begin{equation} x = y \label {eq:old}\tag*{A 1}% retained +\end{equation}`); + const original = f.app.model.get().text; + await open(f); + const inputs = f.node('formulaMetadata').querySelectorAll('input'); + assert.equal(inputs.length, 2); + inputs[0].value = 'eq:new'; await f.emit(inputs[0], 'input'); + inputs[1].value = 'Result B 2'; await f.emit(inputs[1], 'input'); + await f.click('btnInsertFormula'); + assert.equal(f.app.model.get().text, original.replace('eq:old', 'eq:new').replace('A 1', 'Result B 2')); + assert.match(formula(f).textContent, /eq:new/); + assert.match(formula(f).textContent, /Result B 2/); + assert.equal(f.app.mode, 'visual'); +}); + +test('closing the visual formula editor discards mathematical and metadata edits', async () => { + const f = await visual(String.raw`$x\label{eq:original}$`); + const original = f.app.model.serialize(); + await open(f); + f.node('formulaMathField').value = 'discarded'; + await f.emit(f.node('formulaMathField'), 'input'); + const input = f.node('formulaMetadata').querySelector('input'); + input.value = 'eq:discarded'; await f.emit(input, 'input'); + await f.click('formulaModalClose'); + assert.equal(f.app.model.serialize(), original); + await open(f); + assert.equal(f.node('formulaMathField').value, 'x'); + assert.equal(f.node('formulaMetadata').querySelector('input').value, 'eq:original'); + await f.click('btnInsertFormula'); + assert.equal(f.app.model.serialize(), original); +}); + +test('switching from advanced input back to graphical editing preserves newly entered labels and comments', async () => { + const f = await visual(String.raw`$x\label{eq:old}$`); + await open(f); + f.node('formulaInput').focus(); + await f.input('formulaInput', 'y\\label{eq:new}% new comment\n'); + assert.equal(f.document.activeElement, f.node('formulaInput'), 'advanced typing must retain its focus'); + assert.equal(f.node('formulaMetadata').querySelector('input').value, 'eq:new'); + assert.doesNotMatch(f.node('formulaMathField').value, /\\label|new comment/); + f.node('formulaMathField').value = 'y+1'; + await f.emit(f.node('formulaMathField'), 'input'); + await f.click('btnInsertFormula'); + const saved = formula(f).getAttribute('data-formula'); + assert.match(saved, /y\+1/); + assert.match(saved, /\\label\{eq:new\}/); + assert.match(saved, /% new comment/); + assert.doesNotMatch(saved, /eq:old/); + assert.equal(f.context.VisualMath.split(saved).metadata.filter(entry => entry.kind === 'label').length, 1); + assert.equal(f.app.mode, 'visual'); +}); + +test('advanced align edits rebuild row metadata and retain the graphical environment wrapper', async () => { + const f = await visual(String.raw`\begin{align}x&=1\label{eq:old}\\y&=2\label{eq:oldlast}\end{align}`); + await open(f); + f.node('formulaInput').focus(); + await f.input('formulaInput', 'u&=3\\label{eq:first}% fresh\n\\\\v&=4\\label{eq:last}\\tag{B 2}'); + assert.equal(f.document.activeElement, f.node('formulaInput')); + assert.equal(f.node('formulaMathField').value, '\\begin{aligned}u&=3\n\\\\v&=4\\end{aligned}'); + const inputs = f.node('formulaMetadata').querySelectorAll('input'); + assert.deepEqual(inputs.map(input => input.value), ['eq:first', 'eq:last', 'B 2']); + inputs[2].value = 'B 3'; await f.emit(inputs[2], 'input'); + f.node('formulaMathField').value = String.raw`\begin{aligned}u&=3+1\\v&=4\end{aligned}`; + await f.emit(f.node('formulaMathField'), 'input'); + await f.click('btnInsertFormula'); + const saved = formula(f).getAttribute('data-formula'); + const metadata = f.context.VisualMath.split(saved).metadata; + assert.equal(formula(f).getAttribute('data-environment'), 'align'); + assert.deepEqual(Array.from(metadata.filter(entry => entry.kind !== 'comment'), entry => [entry.kind, entry.value, entry.row]), [ + ['label', 'eq:first', 0], ['label', 'eq:last', 1], ['tag', 'B 3', 1], + ]); + assert.equal(metadata.find(entry => entry.kind === 'comment').raw, '% fresh'); + assert.equal(metadata.find(entry => entry.kind === 'comment').row, 0); + assert.doesNotMatch(saved, /eq:old|\\begin\{aligned\}/); + assert.match(f.app.model.get().text, /\\begin\{align\}/); + assert.match(f.app.model.get().text, /\\end\{align\}/); +}); + +test('URL-bearing formulas never reach the custom field or math renderer and remain lossless', async () => { + const dangerous = String.raw`\href{javascript:alert(1)}{x}`; + const f = await visual('$' + dangerous + '$'); + const original = f.app.model.get().text; + assert.equal(formula(f).querySelectorAll('math-span').length, 0); + assert.equal(formula(f).querySelectorAll('a').length, 0); + assert.match(formula(f).textContent, /特殊排版指令/); + assert.doesNotMatch(formula(f).textContent, /javascript:/); + await open(f); + assert.equal(f.node('formulaMathField').readOnly, true); + assert.equal(f.node('formulaMathField').value, ''); + assert.equal(f.mathField.writes.some(value => value.includes('href') || value.includes('javascript:')), false); + assert.match(f.node('formulaError').textContent, /已保留原文/); + assert.equal(f.context.VisualMath.insert(String.raw`\frac{}{}`), false); + assert.equal(f.mathField.inserts.length, 0); + await f.click('btnInsertFormula'); + assert.equal(f.app.model.get().text, original); + + // Advanced edits are also gated before assigning the field value, while + // keeping the explicitly entered source available for a later correction. + await open(f); + await f.input('formulaInput', String.raw`\href{https://example.test}{y}`); + assert.equal(f.node('formulaMathField').value, ''); + assert.equal(f.mathField.writes.some(value => value.includes('href')), false); + await f.click('formulaModalClose'); + assert.equal(f.app.model.get().text, original); +}); + +test('formula labels in the reference sidebar open their formula editor while retaining visual mode', async () => { + const f = await fixture({includeVisualMath: true, includeVisualReferences: true}); + await f.input('sourceArea', String.raw`\documentclass{article} +\begin{document} +\begin{equation}x=1\label{eq:first}\end{equation} +\begin{equation}y=2\label{eq:second}\end{equation} +\end{document}`); + await f.click('modeVisual'); f.refresh(); await f.flushTimers(); + const item = f.node('referenceList').querySelectorAll('button').find(button => button.textContent.startsWith('eq:second ·')); + assert.ok(item); + await item.click(); + assert.equal(f.app.mode, 'visual'); + assert.equal(f.node('sourcePanel').hidden, true); + assert.equal(f.node('formulaModal').classList.contains('show'), true); + assert.equal(f.node('formulaMathField').value, 'y=2'); + assert.equal(f.node('formulaMetadata').querySelector('input').value, 'eq:second'); + const label = f.node('formulaMetadata').querySelector('input'); + label.value = 'eq:edited'; await f.emit(label, 'input'); + await f.click('btnInsertFormula'); + assert.match(f.app.model.get().text, /x=1\\label\{eq:first\}/); + assert.match(f.app.model.get().text, /y=2\\label\{eq:edited\}/); + assert.doesNotMatch(f.app.model.get().text, /eq:second/); + assert.equal(f.app.mode, 'visual'); +}); diff --git a/tests/visual-math.test.mjs b/tests/visual-math.test.mjs new file mode 100644 index 0000000..7eb98b6 --- /dev/null +++ b/tests/visual-math.test.mjs @@ -0,0 +1,155 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import vm from 'node:vm'; + +const context = vm.createContext({}); +vm.runInContext(fs.readFileSync(new URL('../visual-math.js', import.meta.url), 'utf8'), context); +const {split, combine, unwrap, safe, mathValue} = context.VisualMath; +const plain = value => JSON.parse(JSON.stringify(value)); + +test('legal whitespace in nested environment boundaries keeps labels on their mathematical row', () => { + const source = String.raw`x+\begin {matrix}a\\b\end {matrix}\label{eq:m}`; + const parts = split(source); + assert.equal(parts.rows.length, 1); + assert.equal(parts.metadata[0].row, 0); + const result = combine(parts, String.raw`x+1+\begin{matrix}a\\b\end{matrix}`, [], true); + assert.equal(result, String.raw`x+1+\begin{matrix}a\\b\end{matrix}\label{eq:m}`); + assert.equal(unwrap(String.raw`\begin {aligned}a&=b\\c&=d\end {aligned}`), String.raw`a&=b\\c&=d`); +}); + +test('split preserves row associations for labels, tags, comments and optional row spacing', () => { + const source = 'a &= b \\label{eq:first}\\tag{A 1}% first\r\n\\\\[6pt]\r\nc &= d \\tag*{Second}\\label{eq:second}% second'; + const parts = split(source); + assert.equal(parts.rows.length, 2); + assert.deepEqual(plain(parts.metadata.map(({kind, value, row}) => ({kind, value, row}))), [ + {kind:'label', value:'eq:first', row:0}, {kind:'tag', value:'A 1', row:0}, {kind:'comment', row:0}, + {kind:'tag', value:'Second', row:1}, {kind:'label', value:'eq:second', row:1}, {kind:'comment', row:1} + ]); + assert.equal(parts.rawRows.join('\\\\'), source); + assert.equal(parts.clean, 'a &= b \r\n\\\\[6pt]\r\nc &= d '); + for (const entry of parts.metadata) assert.equal(source.slice(entry.start,entry.end), entry.raw); +}); + +test('escaped percentages, nested groups and matrix row separators stay mathematical content', () => { + const source = String.raw`\text{50\% and a\\b} + \begin{matrix}a&b\\c&d\end{matrix} \label{one}\\x\label{two}`; + const parts = split(source); + assert.equal(parts.rows.length, 2); + assert.deepEqual(plain(parts.metadata.map(entry => entry.row)), [0,1]); + assert.match(parts.clean, /50\\%/); + assert.match(parts.clean, /\\begin\{matrix\}a&b\\\\c&d\\end\{matrix\}/); +}); + +test('nested tags are extracted without corrupting their original LaTeX', () => { + const source = String.raw`x=1\tag*{A {\mathrm{note}}}\label{eq:a}`; + const parts = split(source); + assert.equal(parts.clean, 'x=1'); + assert.equal(parts.metadata[0].value, String.raw`A {\mathrm{note}}`); + assert.equal(combine(parts,'ignored',[],false), source); + assert.equal(combine(parts,'ignored',['B 2'],false), String.raw`x=1\tag*{B 2}\label{eq:a}`); +}); + +test('no edits round trip every original byte regardless of editor normalization', () => { + const source = ' \r\na= b\\label {same}% \\label{same}\r\n\\\\\r\nc=d\\label{same}\\tag{A 1} \r\n'; + const parts = split(source); + assert.equal(combine(parts,'normalized elsewhere',[],false), source); + assert.equal(combine(parts,parts.clean,[],true), source); + assert.equal(combine(parts,mathValue(parts,'align'),[],true), source); + assert.equal(combine(parts,'',parts.metadata.map(entry => entry.value),false), source); +}); + +test('editing repeated label commands uses exact source offsets and preserves comments', () => { + const source = String.raw`a\label{same}% \label{same} +\\b\label{same}\tag*{A 1}`; + const parts = split(source); + const values = parts.metadata.map(entry => entry.value); + values[0] = 'first'; + values[2] = 'second'; + values[3] = 'A 2'; + assert.equal(combine(parts,'',values,false), String.raw`a\label{first}% \label{same} +\\b\label{second}\tag*{A 2}`); +}); + +test('math edits preserve old metadata on its original align row', () => { + const parts = split(String.raw`a=b\label{first}\tag{A}% first row +\\c=d\label{second}\tag*{B}% second row`); + const result = combine(parts,String.raw`\begin{aligned}a&=b+1\\c&=d+2\end{aligned}`,[],true); + const next = split(result); + assert.equal(next.rows.length, 2); + assert.deepEqual(plain(next.metadata.filter(entry => entry.kind !== 'comment').map(({kind,value,row}) => ({kind,value,row}))), [ + {kind:'label',value:'first',row:0}, {kind:'tag',value:'A',row:0}, + {kind:'label',value:'second',row:1}, {kind:'tag',value:'B',row:1} + ]); + assert.deepEqual(plain(next.metadata.filter(entry => entry.kind === 'comment').map(entry => entry.row)), [0,1]); + assert.doesNotMatch(result,/\\begin\{aligned\}/); +}); + +test('new field labels, tags and comments survive saving alongside existing metadata', () => { + const parts = split(String.raw`a\label{old}\tag{Old}`); + const edited = String.raw`b\label{new}\tag{New number}% user note`; + const result = combine(parts,edited,[],true); + const metadata = split(result).metadata; + assert.deepEqual(plain(metadata.filter(entry => entry.kind === 'label').map(entry => entry.value)), ['new','old']); + assert.deepEqual(plain(metadata.filter(entry => entry.kind === 'tag').map(entry => entry.value)), ['New number']); + assert.equal(metadata.filter(entry => entry.kind === 'comment')[0].raw, '% user note'); + assert.match(result, /% user note\n\\label\{old\}/); + assert.throws(() => combine(parts,edited,['old','Another number'],true), /不同编号/); +}); + +test('pasting unchanged metadata does not duplicate labels, tags or comments', () => { + const source = String.raw`a\label{key}\tag{A}% note`; + const result = combine(split(source),source.replace('a','b'),[],true); + const metadata = split(result).metadata; + assert.equal(metadata.length, 3); + assert.equal(metadata.filter(entry => entry.kind === 'label').length, 1); +}); + +test('deleting rows never silently drops labels, tags or comments', () => { + const parts = split(String.raw`a\\b\label{second}\tag{B}`); + assert.throws(() => combine(parts,'a',[],true), /被删除的公式行/); + assert.equal(combine(parts,'a',['',''],true), 'a'); + assert.throws(() => combine(split('a\\\\b% note'),'a',[],true), /注释/); +}); + +test('invalid label input is rejected while display tags can contain spaces', () => { + const parts = split(String.raw`x\label{old}\tag{A 1}`); + for (const value of ['two words','a{b','a}b','a\\b','a%b','a[b','a]b','a,b','a#b','a$b','a&b','a^b','a~b','*','a\nb','a\0b']) { + assert.throws(() => combine(parts,'',[value],false), /标签/); + assert.throws(() => combine(split('x'),String.raw`y\label{`+value+'}',[],true), /标签/); + } + assert.equal(combine(parts,'',['eq:新编号','Theorem A 2'],false), String.raw`x\label{eq:新编号}\tag{Theorem A 2}`); + assert.equal(combine(parts,'',['',''],false), 'x'); + assert.throws(() => combine(split('x'),String.raw`y\label{}`,[],true), /标签/); +}); + +test('unwrap removes only a complete matching wrapper and handles nested environments', () => { + assert.equal(unwrap(String.raw` \begin{aligned}x\\y\end{aligned} `), String.raw`x\\y`); + assert.equal(unwrap(String.raw`\begin{gathered}x\end{gathered}`), 'x'); + const nested = String.raw`\begin{aligned}a+\begin{aligned}b\\c\end{aligned}\end{aligned}`; + assert.equal(unwrap(nested), String.raw`a+\begin{aligned}b\\c\end{aligned}`); + for (const source of [String.raw`\begin{aligned}x\end{gathered}`, String.raw`\begin{aligned}a\end{aligned}+\begin{aligned}b\end{aligned}`, String.raw`\begin{matrix}a\end{matrix}`]) assert.equal(unwrap(source), source); + assert.equal(unwrap('\\begin{aligned}x% \\end{aligned}\n+y\\end{aligned}'), 'x% \\end{aligned}\n+y'); +}); + +test('source-owned wrappers survive edits and generated wrappers are removed once', () => { + const source = String.raw`\begin{aligned}a\\b\end{aligned}`; + const parts = split(source); + assert.equal(combine(parts,source,[],true), source); + const edited = source.replace('a\\\\b','a+1\\\\b'); + assert.equal(combine(parts,edited,[],true), edited); + assert.equal(combine(parts,'\\begin{aligned}'+edited+'\\end{aligned}',[],true), edited); +}); + +test('mathValue uses appropriate visual wrappers without exposing editorial metadata', () => { + const parts = split(String.raw`a=b\label{eq:a}`); + assert.equal(mathValue(parts,'align*'), String.raw`\begin{aligned}a=b\end{aligned}`); + assert.equal(mathValue(parts,'gather'), String.raw`\begin{gathered}a=b\end{gathered}`); + assert.equal(mathValue(parts,'equation'), 'a=b'); + assert.equal(mathValue(parts), 'a=b'); +}); + +test('safe blocks HTML and URL-bearing math directives before visual rendering', () => { + for (const command of ['href','url','htmlData','htmlStyle','class','cssId','style','includegraphics','HREF']) assert.equal(safe('\\'+command+'{x}{y}'), false, command); + for (const source of [String.raw`x^2+\frac{1}{2}`, String.raw`\text{href is text}`, String.raw`\label{eq:href}`]) assert.equal(safe(source), true); + assert.equal(safe(null), false); +}); diff --git a/tests/visual-reference-ui.test.mjs b/tests/visual-reference-ui.test.mjs new file mode 100644 index 0000000..c7c8fa7 --- /dev/null +++ b/tests/visual-reference-ui.test.mjs @@ -0,0 +1,173 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {fixture} from './helpers/workspace-fixture.mjs'; + +const documentText = body => '\\documentclass{article}\n\\begin{document}\n' + body + '\n\\end{document}\n'; +async function visual(body) { + const f = await fixture({includeVisualReferences: true}); + await f.input('sourceArea', documentText(body)); + await f.click('modeVisual'); f.refresh(); + return f; +} +const tokens = f => f.node('editorArea').querySelectorAll('.tex-cmd'); +const tokenFor = (f, source) => tokens(f).find(node => node.getAttribute('data-tex-source') === source); +const activate = (f, node, type = 'click') => f.emit(f.node('editorArea'), type, {target: node, ...(type === 'keydown' ? {key: 'Enter'} : {})}); + +test('visual references replace visible commands while opening and saving preserve exact original source', async () => { + const body = String.raw`\section{Overview}\label{sec:overview} +Read \citep[see][p.~4]{example2026}, \ref{sec:overview}, and \input{sections/method}. +\bibliographystyle{plain}\bibliography{references}\printbibliography`; + const f = await visual(body); + const original = f.app.model.get().text; + assert.doesNotMatch(f.node('editorArea').textContent, /\\(?:citep|ref|label|input|bibliographystyle|bibliography|printbibliography)/); + assert.match(f.node('editorArea').textContent, /An example reference/); + assert.match(f.node('editorArea').textContent, /Overview/); + assert.ok(tokens(f).every(node => node.getAttribute('data-visual-reference'))); + await f.emit(f.document, 'keydown', {key: 's', ctrlKey: true}); + assert.equal(f.app.model.get().text, original); + const citation = tokenFor(f, String.raw`\citep[see][p.~4]{example2026}`); + await activate(f, citation); + assert.equal(f.node('referenceModal').hidden, false); + assert.equal(f.document.activeElement, f.node('referenceKeys')); + assert.equal(f.document.querySelector('.container').getAttribute('inert'), ''); + assert.equal(f.node('referenceKeys').value, 'example2026'); + const tab = await f.emit(f.node('referenceModal'), 'keydown', {key: 'Tab', shiftKey: true}); + assert.equal(tab.defaultPrevented, true); + assert.equal(f.document.activeElement, f.node('referenceChoice')); + await f.emit(f.node('referenceModal'), 'keydown', {key: 'Enter', target: f.node('referenceKeys'), isComposing: true}); + assert.equal(f.node('referenceModal').hidden, false); + await f.click('referenceAccept'); + assert.equal(f.app.model.get().text, original); + assert.equal(f.node('referenceModal').hidden, true); + assert.equal(f.document.querySelector('.container').getAttribute('inert'), null); + assert.equal(f.app.mode, 'visual'); +}); + +test('clicking the second identical citation edits only that atom and supports undo and redo', async () => { + const command = String.raw`\citep[see][p.~4]{example2026}`; + const f = await visual('First ' + command + '. Second ' + command + '.'); + const original = f.app.model.get().text; + const citations = tokens(f).filter(node => node.getAttribute('data-tex-source') === command); + await activate(f, citations[1]); + f.node('referenceKeys').value = 'updated2026'; + await f.click('referenceAccept'); + const updated = documentText('First ' + command + '. Second ' + String.raw`\citep[see][p.~4]{updated2026}` + '.'); + assert.equal(f.app.model.get().text, updated); + assert.equal(citations[0].getAttribute('data-tex-source'), command); + assert.equal(f.app.mode, 'visual'); + assert.equal(JSON.parse(f.storage.get('visuallatex_workspace_v1')).files.find(file => file.path === 'main.tex').text, updated); + await f.click('btnUndo'); assert.equal(f.app.model.get().text, original); + await f.click('btnRedo'); assert.equal(f.app.model.get().text, updated); +}); + +test('keyboard editing selects project labels and cancellation leaves bytes and history unchanged', async () => { + const f = await visual(String.raw`\section{Method}\label{sec:method} See \ref{sec:old}.`); + const reference = tokenFor(f, String.raw`\ref{sec:old}`); + const event = await activate(f, reference, 'keydown'); + assert.equal(event.defaultPrevented, true); + assert.equal(event.propagationStopped, true); + f.node('referenceChoice').value = 'sec:method'; + await f.emit(f.node('referenceChoice'), 'change'); + assert.equal(f.node('referenceKeys').value, 'sec:method'); + const saved = await f.emit(f.node('referenceModal'), 'keydown', {key: 'Enter', target: f.node('referenceKeys')}); + assert.equal(saved.propagationStopped, true); + assert.match(f.app.model.get().text, /\\ref\{sec:method\}/); + const original = f.app.model.serialize(); + await activate(f, reference); + f.node('referenceKeys').value = 'discarded'; + await f.emit(f.node('referenceModal'), 'keydown', {key: 'Escape'}); + assert.equal(f.app.model.serialize(), original); + assert.equal(f.node('referenceModal').hidden, true); + assert.equal(f.app.mode, 'visual'); +}); + +test('invalid keys remain in the accessible dialog without changing the source', async () => { + const f = await visual(String.raw`Text \label{sec:old}.`); + const original = f.app.model.serialize(); + await activate(f, tokenFor(f, String.raw`\label{sec:old}`)); + f.node('referenceKeys').value = String.raw`bad}\input{attack}`; + await f.click('referenceAccept'); + assert.equal(f.app.model.serialize(), original); + assert.equal(f.node('referenceModal').hidden, false); + assert.equal(f.node('referenceKeys').getAttribute('aria-invalid'), 'true'); + assert.match(f.node('referenceError').textContent, /引用键/); + await f.click('referenceCancel'); +}); + +test('reference toolbar inserts at the saved visual cursor without opening source mode', async () => { + const f = await visual('Before after.'); + const paragraph = f.node('editorArea').querySelector('p'); + const text = paragraph.childNodes.find(node => node.nodeType === 3 && node.textContent.includes('Before')); + f.setCursor(text, 7); + await f.emit(f.node('editorArea'), 'mouseup'); + await f.click('btnInsertCitation'); + assert.equal(f.node('referenceModal').hidden, false); + assert.equal(f.app.mode, 'visual'); + f.node('referenceKeys').value = 'example2026'; + await f.click('referenceAccept'); + assert.equal(f.node('referenceModal').hidden, true); + assert.match(f.app.model.get().text, /Before \\cite\{example2026\} after\./); + assert.equal(f.app.mode, 'visual'); + assert.equal(f.node('sourcePanel').hidden, true); + assert.equal(tokenFor(f, String.raw`\cite{example2026}`).getAttribute('role'), 'button'); + assert.equal(f.selection.rangeCount, 1); +}); + +test('source-mode reference insertion retains source selection while using the same editor', async () => { + const f = await fixture({includeVisualReferences: true}); + await f.input('sourceArea', 'before after'); + f.node('sourceArea').setSelectionRange(7, 7); + await f.click('btnInsertReference'); + f.node('referenceKeys').value = 'sec:method'; + await f.click('referenceAccept'); + assert.equal(f.app.model.get().text, String.raw`before \ref{sec:method}after`); + assert.equal(f.app.mode, 'source'); +}); + +test('file and bibliography commands edit visually, preserving resource option syntax', async () => { + const f = await visual(String.raw`\input{old.tex}\addbibresource[location=local]{old.bib}\bibliography{old}`); + await activate(f, tokenFor(f, String.raw`\input{old.tex}`)); + f.node('referenceKeys').value = 'sections/new.tex'; + await f.click('referenceAccept'); + await activate(f, tokenFor(f, String.raw`\addbibresource[location=local]{old.bib}`)); + f.node('referenceChoice').value = 'references.bib'; + await f.emit(f.node('referenceChoice'), 'change'); + await f.click('referenceAccept'); + await activate(f, tokenFor(f, String.raw`\bibliography{old}`)); + f.node('referenceChoice').value = 'references.bib'; + await f.emit(f.node('referenceChoice'), 'change'); + await f.click('referenceAccept'); + assert.match(f.app.model.get().text, /\\input\{sections\/new\.tex\}/); + assert.match(f.app.model.get().text, /\\addbibresource\[location=local\]\{references\.bib\}/); + assert.match(f.app.model.get().text, /\\bibliography\{references\}/); + assert.equal(f.app.mode, 'visual'); +}); + +test('reference sidebar opens the supported visual atom and double click never switches it to source', async () => { + const f = await visual(String.raw`\section{Method}\label{sec:method} See \ref{sec:method}.`); + await f.flushTimers(); + const label = tokenFor(f, String.raw`\label{sec:method}`); + await f.emit(f.node('editorArea'), 'dblclick', {target: label}); + assert.equal(f.app.mode, 'visual'); + await f.node('referenceList').querySelector('button').click(); + assert.equal(f.node('referenceModal').hidden, false); + assert.equal(f.node('referenceKeys').value, 'sec:method'); + assert.equal(f.app.mode, 'visual'); + await f.click('referenceCancel'); +}); + +test('bibliography labels are literal text and cannot create active HTML', async () => { + const f = await fixture({includeVisualReferences: true}); + f.app.switchFile('references.bib'); + await f.input('sourceArea', '@article{attack, title = {}, author = {}}'); + f.app.switchFile('main.tex'); + await f.input('sourceArea', documentText(String.raw`Read \cite{attack}.`)); + await f.click('modeVisual'); f.refresh(); + assert.match(f.node('editorArea').textContent, //); + assert.equal(f.node('editorArea').querySelectorAll('img').length, 0); + assert.equal(f.node('editorArea').querySelectorAll('script').length, 0); + await activate(f, tokenFor(f, String.raw`\cite{attack}`)); + assert.equal(f.node('referenceChoice').querySelectorAll('img').length, 0); + assert.equal(f.node('referenceChoice').querySelectorAll('script').length, 0); + assert.match(f.node('referenceChoice').textContent, //); +}); diff --git a/tests/visual-references.test.mjs b/tests/visual-references.test.mjs new file mode 100644 index 0000000..1495133 --- /dev/null +++ b/tests/visual-references.test.mjs @@ -0,0 +1,197 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import vm from 'node:vm'; + +const context = vm.createContext({TextEncoder}); +for (const name of ['project-model.js', 'visual-references.js']) { + vm.runInContext(fs.readFileSync(new URL('../' + name, import.meta.url), 'utf8'), context); +} +const {ProjectModel, VisualReferences: api} = context; +const plain = value => JSON.parse(JSON.stringify(value)); +const file = (path, text) => ({path, kind: 'text', text}); +const model = files => new ProjectModel({files, activePath: files[0].path}); + +test('citation variants expose plain semantic data and preserve optional notes and star', () => { + for (const command of ['cite', 'citep', 'citet', 'autocite', 'parencite', 'textcite', 'nocite']) { + const value = api.describe('\\' + command + '* [see][pp. 1–2] { alpha, beta }'); + assert.equal(value.kind, 'citation'); + assert.equal(value.command, command + '*'); + assert.equal(value.cmd, value.command); + assert.equal(value.key, 'alpha, beta'); + assert.deepEqual(plain(value.keys), ['alpha', 'beta']); + assert.deepEqual(plain(value.options), ['see', 'pp. 1–2']); + assert.equal(value.editable, true); + assert.doesNotMatch(value.label, /\\/); + } +}); + +test('unmodified values round trip byte for byte, including CRLF, comments and argument spacing', () => { + const source = ' \r\n\\citep* % preserve\r\n [see {this}] [pp. 7–9]\t{ alpha ,beta } % tail\r\n'; + assert.equal(api.rewrite(source), source); + assert.equal(api.rewrite(source, {key: 'alpha, beta'}), source); + assert.equal(api.rewrite(source, {keys: ['alpha', 'beta'], options: ['see {this}', 'pp. 7–9']}), source); + assert.equal(api.rewrite(source, {keys: ['gamma', 'beta']}), source.replace(' alpha ,beta ', ' gamma, beta ')); +}); + +test('key edits preserve reference variants and only the required argument changes', () => { + for (const command of ['ref', 'eqref', 'autoref', 'pageref', 'label', 'Cref']) { + const source = '\\' + command + '* \t{ sec:old }'; + assert.equal(api.rewrite(source, {key: 'sec:new'}), '\\' + command + '* \t{ sec:new }'); + } + assert.equal(api.rewrite('\\nocite{*}', {keys: ['entry']}), '\\nocite{entry}'); + assert.equal(api.describe('\\nocite{*}').label, '收录全部参考文献'); +}); + +test('key validation prevents escaping arguments and injecting LaTeX commands', () => { + for (const key of ['', 'a b', 'a\nb', 'a\\b', 'a}\\input{secret', 'a{b', 'a[b', 'a]b', 'a%b', 'a#b', 'a,b', 'a$b', 'a&b', 'a^b', 'a~b', 'a\0b', '*']) { + assert.throws(() => api.rewrite('\\label{old}', {key}), /键|通配符/); + } + assert.throws(() => api.rewrite('\\cite{old}', {keys: ['one', 'two,three']})); + assert.throws(() => api.rewrite('\\ref{old}', {keys: ['one', 'two']})); + assert.throws(() => api.rewrite('\\ref{old}', {key: 2})); + assert.throws(() => api.rewrite('\\cite{old}', {keys: ['one', '']})); + assert.equal(api.rewrite('\\label{old}', {key: '章节:方法_2026.1-甲'}), '\\label{章节:方法_2026.1-甲}'); +}); + +test('explicit optional note edits retain untouched notes and balanced TeX content', () => { + const source = '\\citep* [see] % note\r\n [p. 2] {key}'; + assert.equal(api.rewrite(source, {options: ['compare', 'p. 2']}), source.replace('[see]', '[compare]')); + assert.equal(api.rewrite('\\cite{a}', {options: ['see {A [B]}', 'p. 3'], key: 'b'}), '\\cite[see {A [B]}][p. 3]{b}'); + assert.equal(api.rewrite('\\cite[see][p. 2]{a}', {options: ['p. 3']}), '\\cite[p. 3]{a}'); + assert.equal(api.rewrite('\\cite[see]{a}', {options: []}), '\\cite{a}'); + for (const options of [['bad]\\input{other}'], ['bad{'], ['bad}'], ['bad%'], [42], 'bad']) { + assert.throws(() => api.rewrite('\\cite{a}', {options})); + } +}); + +test('unsupported and incomplete fragments remain outside the reference editor', () => { + for (const source of ['plain', '\\textbf{word}', '\\cite{missing', '\\cite[missing{a}', '\\ref{a}{b}', '\\cite{a} trailing', '\\cite', '% \\label{fake}']) { + assert.equal(api.describe(source), null, source); + assert.throws(() => api.rewrite(source, {key: 'b'})); + } + assert.equal(api.describe(null), null); +}); + +test('references use actual project section titles and never invent compiled numbers', () => { + const project = model([file('main.tex', String.raw`\section{Research \textbf{methods}}\label{sec:methods} +\subsection[Short]{Detailed setup}\label{sec:setup}`)]); + assert.equal(api.describe('\\ref{sec:methods}', project).label, 'Research methods'); + assert.equal(api.describe('\\autoref{sec:setup}', project).label, 'Detailed setup'); + assert.equal(api.describe('\\label{sec:methods}', project).label, '标签:sec:methods'); + assert.match(api.describe('\\label{sec:methods}', project).detail, /Research methods.*main\.tex/); + assert.equal(api.describe('\\pageref{sec:methods}', project).label, 'Research methods · 页码待编译'); + assert.equal(api.describe('\\eqref{sec:methods}', project).label, '公式:sec:methods'); + const missing = api.describe('\\ref{missing}', project); + assert.equal(missing.label, 'missing'); + assert.equal(missing.detail, '未找到标签:missing'); +}); + +test('formula references in the same section remain distinguishable by their actual label keys', () => { + const project = model([file('main.tex', String.raw`\section{Visual mathematics}\label{sec:math} +\begin{equation}E=mc^2\label{eq:energy}\end{equation} +\begin{align*}a&=b\label{eq:second}\end{align*} +\[c=d\label{eq:display}\] +\label{sec:after}`)]); + for (const key of ['eq:energy','eq:second','eq:display']) { + assert.equal(api.describe('\\eqref{' + key + '}', project).label, '公式:' + key); + assert.equal(api.describe('\\ref{' + key + '}', project).label, '公式:' + key); + assert.equal(api.describe('\\autoref{' + key + '}', project).label, '公式:' + key); + assert.match(api.describe('\\eqref{' + key + '}', project).detail, /Visual mathematics/); + } + assert.equal(api.describe('\\ref{sec:math}', project).label, 'Visual mathematics'); + assert.equal(api.describe('\\ref{sec:after}', project).label, 'Visual mathematics'); + assert.equal(api.describe('\\eqref{missing}', project).label, '公式:missing'); + assert.equal(api.getChoices('reference', project).find(choice => choice.value === 'eq:energy').label, '公式:eq:energy'); +}); + +test('label indexing ignores comments, escaped backslashes, inline verbatim and verbatim environments', () => { + const source = String.raw`% \section{Wrong}\label{comment} +\section{Real \% title}\label{real} +\verb|\label{inline}| \verb*+\label{star}+ +\lstinline[language=TeX]!\label{listing}! +\begin{verbatim}\label{environment}\end{verbatim} +\begin{minted}{latex}\label{minted}\end{minted} +\begin{comment}\label{hidden}\end{comment} +\\label{escaped} +\label{after}`; + const project = model([file('main.tex', source)]); + assert.deepEqual(plain(api.getChoices('reference', project).map(item => item.value)), ['real', 'after']); + assert.equal(api.describe('\\ref{real}', project).label, 'Real % title'); +}); + +test('nested and quoted BibTeX metadata yields human-readable citation labels', () => { + const project = model([file('main.tex', ''), file('refs.bib', String.raw`% @article{hidden, title={Hidden}} +@string{journal = "Not a reference"} +@comment{ @article{alsohidden, title={Hidden}} } +@article{lamport, + author = {Lamport, Leslie and {Research Group}}, + title = {A {Nested {LaTeX}} \textit{Document}}, + year = 1994 +} +@book(knuth, author = "Knuth, Donald", title = "The {TeX}book, Volume A", year={1984})`)]); + const choices = plain(api.getChoices('citation', project)); + assert.deepEqual(choices.map(item => item.value), ['lamport', 'knuth']); + assert.equal(choices[0].label, 'Lamport, Leslie and Research Group — A Nested LaTeX Document'); + assert.match(choices[1].label, /The TeXbook, Volume A/); + const cited = api.describe('\\cite[see][p. 2]{lamport, knuth}', project); + assert.match(cited.label, /Lamport.*Knuth/); + assert.match(cited.detail, /1994.*refs\.bib.*1984/); + assert.doesNotMatch(cited.label, /\\cite|\[1\]|\[2\]/); + assert.match(api.describe('\\cite{unknown}', project).detail, /未找到文献/); +}); + +test('metadata stays plain text even when document headings and BibTeX contain markup', () => { + const project = model([file('main.tex', '\\section{}\\label{x}'), + file('refs.bib', '@article{attack,title={}}')]); + assert.equal(api.describe('\\ref{x}', project).label, ''); + assert.equal(api.describe('\\cite{attack}', project).label, ''); + assert.equal(typeof api.describe('\\cite{attack}', project).label, 'string'); + assert.equal('html' in api.describe('\\ref{x}', project), false); +}); + +test('BibTeX comments cannot swallow metadata or introduce fake entries through unmatched braces', () => { + const project = model([file('refs.bib', String.raw`@article{paper, +% misplaced { }, title={Wrong}, +author = {A. Researcher}, % an unmatched }, +title = {Results with 50\% improvement}, +year = {2026} +} +% @article{fake, title={Fake}} +@article{next,title={Next paper}}`)]); + const choices = plain(api.getChoices('citation', project)); + assert.deepEqual(choices.map(item => item.value), ['paper', 'next']); + assert.equal(choices[0].label, 'A. Researcher — Results with 50% improvement'); + assert.match(choices[0].detail, /2026/); +}); + +test('duplicate labels and bibliography entries are explicit instead of picking an arbitrary target', () => { + const project = model([file('main.tex', '\\section{First}\\label{same}'), file('chapter.tex', '\\section{Second}\\label{same}'), + file('a.bib', '@article{same,title={First}}'), file('b.bib', '@article{same,title={Second}}')]); + assert.match(api.describe('\\ref{same}', project).detail, /重复标签/); + assert.match(api.describe('\\cite{same}', project).label, /文献键重复/); +}); + +test('file and bibliography setup commands have readable descriptions and safe edits', () => { + const project = model([file('main.tex', ''), file('chapters/intro.tex', ''), file('refs.bib', ''), file('image.ps', '')]); + assert.equal(api.describe('\\input{chapters/intro}').label, '引入文件:chapters/intro'); + assert.equal(api.describe('\\bibliography{refs,extra}').label, '文献库:refs、extra'); + assert.equal(api.describe('\\addbibresource[location=local]{refs.bib}').label, '文献库:refs.bib'); + assert.equal(api.describe('\\bibliographystyle{plain}').label, '文献样式:plain'); + assert.equal(api.describe('\\printbibliography[title={References}]').editable, false); + assert.throws(() => api.rewrite('\\printbibliography', {key: 'refs'})); + assert.equal(api.rewrite('\\addbibresource[location=local]{refs.bib}', {key: 'other.bib'}), '\\addbibresource[location=local]{other.bib}'); + assert.deepEqual(plain(api.getChoices('include', project).map(item => item.value)), ['main.tex', 'chapters/intro.tex']); + assert.deepEqual(plain(api.getChoices('bibliography', project).map(item => item.value)), ['refs.bib']); + assert.equal(api.getChoices('style', project).length, 4); + assert.deepEqual(plain(api.getChoices('other', project)), []); +}); + +test('cached metadata updates when a project file changes', () => { + const project = model([file('main.tex', '\\section{Before}\\label{target}')]); + assert.equal(api.describe('\\ref{target}', project).label, 'Before'); + project.update('\\section{After}\\label{target}'); + assert.equal(api.describe('\\ref{target}', project).label, 'After'); + project.update('\\section{After}\\label{renamed}'); + assert.match(api.describe('\\ref{target}', project).detail, /未找到标签/); +}); diff --git a/tests/workspace-markup.test.mjs b/tests/workspace-markup.test.mjs index c556647..3ef2291 100644 --- a/tests/workspace-markup.test.mjs +++ b/tests/workspace-markup.test.mjs @@ -37,9 +37,10 @@ test('dynamic toolbar arrays and project/editor controls have real markup', () = test('offline scripts and stylesheet overrides load in dependency order', () => { const scripts = [...html.matchAll(/]*>/g)].map(match => match[1]); - assert.deepEqual(scripts, ['main.js', 'project-model.js', 'project-archive.js', 'workspace.js', 'preview.js']); + assert.deepEqual(scripts, ['vendor/mathlive/mathlive.min.js', 'visual-math.js', 'main.js', 'project-model.js', + 'project-archive.js', 'visual-references.js', 'visual-references-ui.js', 'workspace.js', 'preview.js']); const styles = [...html.matchAll(/]*>/g)].map(match => match[1]); - assert.deepEqual(styles, ['style.css', 'workspace.css', 'preview.css']); + assert.deepEqual(styles, ['style.css', 'workspace.css', 'preview.css', 'visual-references-ui.css', 'visual-math.css']); for (const resource of [...scripts, ...styles]) { assert.doesNotMatch(resource, /^(?:https?:)?\/\//); assert.ok(fs.existsSync(new URL('../' + resource, import.meta.url)), `missing local resource ${resource}`); diff --git a/tests/workspace-ui-flow.test.mjs b/tests/workspace-ui-flow.test.mjs index 06d047c..2fe50d1 100644 --- a/tests/workspace-ui-flow.test.mjs +++ b/tests/workspace-ui-flow.test.mjs @@ -1,146 +1,6 @@ import test from 'node:test'; import assert from 'node:assert/strict'; -import fs from 'node:fs'; -import vm from 'node:vm'; -import {createDocument, Element, Text} from './helpers/dom.mjs'; - -// Actual markup, production startup and event handlers; the local fixture adds -// basic form/events to the shared deterministic DOM. No browser engine, layout, -// automatic HTML repair, scripts in user text or OS clipboard are simulated. -const markup = fs.readFileSync(new URL('../index.html', import.meta.url), 'utf8'); -const sources = ['main.js', 'project-model.js', 'project-archive.js', 'workspace.js'] - .map(name => [name, fs.readFileSync(new URL('../' + name, import.meta.url), 'utf8')]); - -async function fixture({denyStorage = false, denyDialogs = false, initialStorage = []} = {}) { - const root = new Element('fixture-root'); - root.innerHTML = markup; - const storage = new Map(initialStorage); - const prompts = []; - const alerts = []; - const blobs = []; - const tasks = new Map(); - let timer = 0; - let document; - const addEvents = target => { - target._events = new Map(); - target.addEventListener = (type, listener) => { - if (!target._events.has(type)) target._events.set(type, []); - target._events.get(type).push(listener); - }; - target.removeEventListener = (type, listener) => { - target._events.set(type, (target._events.get(type) || []).filter(item => item !== listener)); - }; - }; - async function emit(target, type, properties = {}) { - const event = {type, target, defaultPrevented: false, propagationStopped: false, - preventDefault() { this.defaultPrevented = true; }, - stopPropagation() { this.propagationStopped = true; }, ...properties}; - for (const listener of target._events?.get(type) || []) await listener(event); - return event; - } - function enhance(node) { - if (node.nodeType !== 1 || node._events) return node; - addEvents(node); - node.classList = { - contains: name => node.className.split(/\s+/).includes(name), - add(...names) { node.className = [...new Set([...node.className.split(/\s+/).filter(Boolean), ...names])].join(' '); }, - remove(...names) { node.className = node.className.split(/\s+/).filter(name => !names.includes(name)).join(' '); }, - toggle(name, force) { - const add = force ?? !this.contains(name); - if (add) this.add(name); else this.remove(name); - return add; - }, - }; - node.replaceChildren = (...children) => { - for (const child of [...node.childNodes]) child.remove(); - for (const child of children) node.appendChild(typeof child === 'string' ? new Text(child) : child); - }; - node.closest = selector => { - for (let current = node; current; current = current.parentElement) { - if (selector.split(',').some(part => current.matches(part.trim()))) return current; - } - return null; - }; - node.focus = () => { document.activeElement = node; }; - node.click = () => node.disabled ? Promise.resolve() : emit(node, 'click'); - node.scrollTop = 0; - node.scrollLeft = 0; - node.selectionStart = node.selectionEnd = 0; - let value = node.getAttribute('value') || (node.tagName === 'TEXTAREA' ? node.textContent : ''); - Object.defineProperty(node, 'value', { - get: () => value, - set(next) { - const normalized = String(next).replace(/\r\n?/g, '\n'); - if (normalized !== value) node.selectionStart = node.selectionEnd = normalized.length; - value = normalized; - }, - }); - Object.defineProperty(node, 'hidden', { - get: () => node.getAttribute('hidden') !== null, - set(hidden) { if (hidden) node.setAttribute('hidden', ''); else node.removeAttribute('hidden'); }, - }); - node.disabled = node.getAttribute('disabled') !== null; - node.checked = node.getAttribute('checked') !== null; - if (node.tagName === 'INPUT' && node.getAttribute('type') === 'file') node.files = []; - node.setSelectionRange = (start, end) => { - node.selectionStart = Math.max(0, Math.min(value.length, start)); - node.selectionEnd = Math.max(node.selectionStart, Math.min(value.length, end)); - }; - node.select = () => node.setSelectionRange(0, value.length); - return node; - } - for (const node of root.querySelectorAll('*')) enhance(node); - const ids = new Map(root.querySelectorAll('[id]').map(node => [node.getAttribute('id'), node])); - const base = createDocument(); - document = {...base, body: root.querySelector('body'), activeElement: null, visibilityState: 'visible', - getElementById: id => ids.get(id) || null, - createElement: tag => enhance(base.createElement(tag)), - createTextNode: value => new Text(String(value)), - querySelector(selector) { - if (selector.startsWith('input[name="formulaMode"]')) { - const radios = root.querySelectorAll('input').filter(node => node.getAttribute('name') === 'formulaMode'); - if (selector.endsWith(':checked')) return radios.find(node => node.checked) || null; - const requested = /\[value="([^"]+)"\]/.exec(selector)?.[1]; - return radios.find(node => node.value === requested) || null; - } - return root.querySelector(selector); - }, - execCommand() { return true; }, - }; - addEvents(document); - const window = {getSelection: () => ({rangeCount: 0})}; - addEvents(window); - const context = vm.createContext({document, window, Node: {ELEMENT_NODE: 1, TEXT_NODE: 3}, - TextEncoder, TextDecoder, Uint8Array, ArrayBuffer, DataView, atob, btoa, Blob, - DecompressionStream, ReadableStream, Date, console, - localStorage: {getItem: key => storage.get(key) ?? null, setItem: (key, value) => storage.set(key, String(value)), removeItem: key => storage.delete(key)}, - prompt: () => { if (denyDialogs) throw new Error('prompt() is not supported.'); return prompts.shift() ?? null; }, - confirm: () => { if (denyDialogs) throw new Error('confirm() is not supported.'); return true; }, - alert: message => alerts.push(message), - setTimeout: callback => { const id = ++timer; tasks.set(id, callback); return id; }, - clearTimeout: id => tasks.delete(id), - navigator: {clipboard: {writeText: async () => {}}}, - URL: {createObjectURL: blob => { blobs.push(blob); return 'blob:fixture/' + blobs.length; }, revokeObjectURL() {}}, - }); - if (denyStorage) Object.defineProperty(context, 'localStorage', { - get() { const error = new Error('Access to localStorage is denied'); error.name = 'SecurityError'; throw error; }, - }); - for (const [filename, source] of sources) vm.runInContext(source, context, {filename}); - await emit(document, 'DOMContentLoaded'); - return {context, app: context.visualWorkspace, document, ids, storage, prompts, alerts, blobs, emit, - node: id => ids.get(id), click: id => ids.get(id).click(), - async input(id, value) { - // Source-oriented scenarios explicitly open the source editor, as a - // real user must now do from the default visual editing surface. - if (id === 'sourceArea') await ids.get('modeSource').click(); - ids.get(id).value = value; await emit(ids.get(id), 'input'); - }, - async flushTimers() { - const pending = [...tasks.values()]; tasks.clear(); - for (const callback of pending) await callback(); - }, - }; -} +import {fixture} from './helpers/workspace-fixture.mjs'; test('actual workspace startup opens LaTeX in the editable visual surface', async () => { const f = await fixture(); diff --git a/vendor/mathlive/LICENSE.txt b/vendor/mathlive/LICENSE.txt new file mode 100644 index 0000000..97ba135 --- /dev/null +++ b/vendor/mathlive/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2017 - present Arno Gourdol. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/vendor/mathlive/fonts/KaTeX_AMS-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0acaaff03d4bb7606de02a827aeee338e5a86910 GIT binary patch literal 28076 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 G2<`xUL{2yW literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Caligraphic-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75344a1f98e37e2c631e178065854c3a81fb842f GIT binary patch literal 6908 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 CFgb+) literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Fraktur-Bold.woff2 b/vendor/mathlive/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..395f28beac23c7b0f7f3a1e714bd8dac253dd3bc GIT binary patch literal 11348 zcmV-aEUVLZPew8T0RR9104!7h4gdfE08HQj04x0f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Main-Italic.woff2 b/vendor/mathlive/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b50920e138807f385d0b0359f4f0f09891f18406 GIT binary patch literal 16988 zcmV(>K-j-`Pew8T0RR91076^<4gdfE0E4su073x(0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Main-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eb24a7ba282b03d830fa6c63ee897d92a5188736 GIT binary patch literal 26272 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�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 bkH82T%!~T~dOL3iZSfI!+IWoKhyte*`46Vs literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Math-BoldItalic.woff2 b/vendor/mathlive/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29657023adc09956249f6295746c8ce4469b50d3 GIT binary patch literal 16400 zcmV+rK<~eIPew8T0RR9106-7`4gdfE0D43K06(+<0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Math-Italic.woff2 b/vendor/mathlive/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..215c143fd7805a5c2b222bd7892a1a2b09610020 GIT binary patch literal 16440 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 G>;nKVNojrn literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_SansSerif-Italic.woff2 b/vendor/mathlive/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..349c06dc609f896392fd5bc8b364d3bc3efc9330 GIT binary patch literal 12028 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 GG{*pT{>~Tx literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Script-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3048fc115681ee6c1bc86b0aa158cfbbf59daa3 GIT binary patch literal 9644 zcmV;dB~#jWPew8T0RR91041yd4gdfE06`=G03}%f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Size1-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5a8462fbfe2c39a7c1857b9e296e62500a8a8a5 GIT binary patch literal 5468 zcmV-i6{G5RPew8T0RR9102N#S4gdfE059|a02KrP0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Size4-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..680c13085076a2f6c5a7e695935ec3f21cddb65f GIT binary patch literal 4928 zcmV-G6Tj?tPew8T0RR91024p}4gdfE04S^g021l|0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/vendor/mathlive/fonts/KaTeX_Typewriter-Regular.woff2 b/vendor/mathlive/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..771f1af705f5cef5f578b3a1e7d8eff66f9b76b0 GIT binary patch literal 13568 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 G0ssIWspan{font-family:KaTeX_Size1}.ML__delim-mult .delim-size4>span{font-family:KaTeX_Size4}.ML__accent-body{font-family:KaTeX_Main}.ML__accent-combining-char{left:0.24em;position:relative}.ML__latex{direction:ltr;display:inline-block;font-family:inherit;font-size-adjust:none;font-stretch:normal;font-style:normal;font-variant-caps:normal;letter-spacing:normal;line-height:1.2;text-align:left;text-indent:0;text-rendering:auto;word-wrap:normal;forced-color-adjust:preserve-parent-color;text-shadow:none;-webkit-user-select:none;user-select:none;white-space:nowrap;width:min-content;word-spacing:normal}.ML__latex .style-wrap{position:relative}.ML__latex .ML__left-right,.ML__latex .ML__mfrac{display:inline-block}.ML__latex .ML__vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.ML__latex .ML__vlist-r{display:table-row}.ML__latex .ML__vlist{display:table-cell;position:relative;vertical-align:bottom}.ML__latex .ML__vlist>span{display:block;height:0;position:relative}.ML__latex .ML__vlist>span>span{display:inline-block}.ML__latex .ML__vlist>span>.ML__pstrut{overflow:hidden;width:0}.ML__latex .ML__vlist-t2{margin-right:-2px}.ML__latex .ML__vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.ML__latex .ML__msubsup{text-align:left}.ML__latex .ML__negativethinspace{display:inline-block;height:0.71em;margin-left:-0.16667em}.ML__latex .ML__thinspace{display:inline-block;height:0.71em;width:0.16667em}.ML__latex .ML__mediumspace{display:inline-block;height:0.71em;width:0.22222em}.ML__latex .ML__thickspace{display:inline-block;height:0.71em;width:0.27778em}.ML__latex .ML__enspace{display:inline-block;height:0.71em;width:0.5em}.ML__latex .ML__quad{display:inline-block;height:0.71em;width:1em}.ML__latex .ML__qquad{display:inline-block;height:0.71em;width:2em}.ML__latex .ML__llap,.ML__latex .ML__rlap{display:inline-block;position:relative;width:0}.ML__latex .ML__llap>.ML__inner,.ML__latex .ML__rlap>.ML__inner{position:absolute}.ML__latex .ML__llap>.ML__fix,.ML__latex .ML__rlap>.ML__fix{display:inline-block}.ML__latex .ML__llap>.ML__inner{right:0}.ML__latex .ML__rlap>.ML__inner{left:0}.ML__latex .ML__rule{border:0 solid;box-sizing:border-box;display:inline-block;position:relative}.ML__latex .overline .overline-line,.ML__latex .underline .underline-line{width:100%}.ML__latex .overline .overline-line:before,.ML__latex .underline .underline-line:before{border-bottom-style:solid;border-bottom-width:max(1px,0.04em);content:"";display:block;print-color-adjust:exact}.ML__latex .overline .overline-line:after,.ML__latex .underline .underline-line:after{border-bottom-style:solid;border-bottom-width:max(1px,0.04em);content:"";display:block;margin-top:-1px;print-color-adjust:exact}.ML__latex .ML__stretchy{display:block;left:0;overflow:hidden;position:absolute;width:100%}.ML__latex .ML__stretchy:after,.ML__latex .ML__stretchy:before{content:""}.ML__latex .ML__stretchy svg{display:block;fill:currentColor;fill-opacity:1;fill-rule:nonzero;height:inherit;position:absolute;stroke:currentColor;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:1;width:100%}.ML__latex .slice-1-of-2{left:0}.ML__latex .slice-1-of-2,.ML__latex .slice-2-of-2{display:inline-flex;overflow:hidden;position:absolute;width:50.2%}.ML__latex .slice-2-of-2{right:0}.ML__latex .slice-1-of-3{left:0;width:25.1%}.ML__latex .slice-1-of-3,.ML__latex .slice-2-of-3{display:inline-flex;overflow:hidden;position:absolute}.ML__latex .slice-2-of-3{left:25%;width:50%}.ML__latex .slice-3-of-3{right:0;width:25.1%}.ML__latex .slice-1-of-1,.ML__latex .slice-3-of-3{display:inline-flex;overflow:hidden;position:absolute}.ML__latex .slice-1-of-1{left:0;width:100%}.ML__latex .ML__nulldelimiter,.ML__latex .ML__op-group{display:inline-block}.ML__latex .ML__op-symbol{position:relative}.ML__latex .ML__op-symbol.ML__small-op{font-family:KaTeX_Size1}.ML__latex .ML__op-symbol.ML__large-op{font-family:KaTeX_Size2}.ML__latex:has(.ML__align_environment),.ML__latex:has(.ML__center_environment),.ML__latex:has(.ML__eqnarray_environment),.ML__latex:has(.ML__gather_environment),.ML__latex:has(.ML__multiline_environment){width:100%}.ML__latex .ML__multiline_environment{display:inline-flex;width:100%}.ML__latex .ML__center_environment{display:inline-flex;justify-content:center;width:100%}.ML__latex .ML__align_environment,.ML__latex .ML__eqnarray_environment,.ML__latex .ML__gather_environment{display:inline-block}.ML__latex .ML__mtable .ML__vertical-separator{box-sizing:border-box;display:inline-block;min-width:1px}.ML__latex .ML__mtable .ML__arraycolsep{display:inline-block}.ML__latex .ML__mtable .col-align-m>.ML__vlist-t{text-align:center}.ML__latex .ML__mtable .col-align-c>.ML__vlist-t{text-align:center}.ML__latex .ML__mtable .col-align-l>.ML__vlist-t{text-align:left}.ML__latex .ML__mtable .col-align-r>.ML__vlist-t{text-align:right}[data-href]{cursor:pointer}.ML__error{background-color:rgba(204,0,65,.1);background-image:radial-gradient(ellipse at center,#cc0041,transparent 70%);background-position:0 100%;background-repeat:repeat-x;background-size:3px 3px;display:inline-block;padding-bottom:3px}.ML__error>.ML__error{background:transparent;padding:0}.ML__placeholder{color:var(--_placeholder-color);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;opacity:var(--_placeholder-opacity);padding-left:0.4ex;padding-right:0.4ex}.ML__notation{box-sizing:border-box;line-height:0;position:absolute}.ML__tooltip-container{position:relative;transform:scale(0)}.ML__tooltip-container .ML__tooltip-content{background:var(--_tooltip-background-color);border:var(--_tooltip-border);border-radius:var(--_tooltip-border-radius);display:inline-table;max-width:400px;padding:12px;position:fixed;visibility:hidden;width:max-content;z-index:2;--_selection-color:var(--_tooltip-color);box-shadow:var(--_tooltip-box-shadow);color:var(--_tooltip-color);opacity:0;transition:opacity 0.15s cubic-bezier(0.4,0,1,1)}.ML__tooltip-container .ML__tooltip-content .ML__text{white-space:normal}.ML__tooltip-container .ML__tooltip-content .ML__base{display:contents}.ML__tooltip-container:hover .ML__tooltip-content{font-size:0.75em;opacity:1;transform:scale(1) translateY(3em);visibility:visible}.ML__bg{background-color:transparent!important}.ML__bg:before{background-color:var(--bg-color);bottom:0;box-sizing:border-box;content:"";left:0;position:absolute;right:0;top:0;z-index:-1} \ No newline at end of file diff --git a/vendor/mathlive/mathlive.min.js b/vendor/mathlive/mathlive.min.js new file mode 100644 index 0000000..089bfe2 --- /dev/null +++ b/vendor/mathlive/mathlive.min.js @@ -0,0 +1,3229 @@ +/** MathLive 0.111.1 */ + (function(global,factory){typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'],factory):(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MathLive = {}));})(this, (function (exports) { 'use strict'; +var MathLive=(()=>{var Wo=Object.defineProperty,of=Object.defineProperties,af=Object.getOwnPropertyDescriptor,sf=Object.getOwnPropertyDescriptors,lf=Object.getOwnPropertyNames,Ho=Object.getOwnPropertySymbols;var il=Object.prototype.hasOwnProperty,pu=Object.prototype.propertyIsEnumerable;var hu=(t,e,r)=>e in t?Wo(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,h=(t,e)=>{for(var r in e||(e={}))il.call(e,r)&&hu(t,r,e[r]);if(Ho)for(var r of Ho(e))pu.call(e,r)&&hu(t,r,e[r]);return t},g=(t,e)=>of(t,sf(e));var nl=t=>typeof t=="symbol"?t:t+"",Ti=(t,e)=>{var r={};for(var i in t)il.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&Ho)for(var i of Ho(t))e.indexOf(i)<0&&pu.call(t,i)&&(r[i]=t[i]);return r};var cf=(t,e)=>{for(var r in e)Wo(t,r,{get:e[r],enumerable:!0})},uf=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of lf(e))!il.call(t,n)&&n!==r&&Wo(t,n,{get:()=>e[n],enumerable:!(i=af(e,n))||i.enumerable});return t};var df=t=>uf(Wo({},"__esModule",{value:!0}),t);var Yy={};cf(Yy,{MathDivElement:()=>Fo,MathSpanElement:()=>No,MathfieldElement:()=>lt,_renderMathInElement:()=>mu,convertAsciiMathToLatex:()=>eu,convertLatexToAsciiMath:()=>by,convertLatexToMarkup:()=>pe,convertLatexToMathMl:()=>Bo,convertLatexToSpeakableText:()=>Ko,globalMathLive:()=>At,initVirtualKeyboardInCurrentBrowsingContext:()=>vo,renderMathInDocument:()=>Jy,renderMathInElement:()=>Qs,setKeyboardLayout:()=>Ou,setKeyboardLayoutLocale:()=>Bu,validateLatex:()=>gy,version:()=>Zy});function Le(){return"window"in globalThis&&"document"in globalThis}function Uo(){return"matchMedia"in window?window.matchMedia("(pointer: coarse)").matches:"ontouchstart"in window||navigator.maxTouchPoints>0}function fu(){try{return window.self!==window.top}catch(t){return!0}}function Di(){return typeof navigator.vibrate=="function"}function Et(){var e,r;if(!Le())return"other";let t=(r=(e=navigator.userAgentData)==null?void 0:e.platform)!=null?r:navigator.platform;return/^mac/i.test(t)?navigator.maxTouchPoints===5?"ios":"macos":/^win/i.test(t)?"windows":/android/i.test(navigator.userAgent)?"android":/iphone|ipod|ipad/i.test(navigator.userAgent)?"ios":/\bcros\b/i.test(navigator.userAgent)?"chromeos":"other"}function gu(){if(!Le())return!0;if(/firefox/i.test(navigator.userAgent)){let t=navigator.userAgent.match(/firefox\/(\d+)/i);return t?parseInt(t[1])>=78:!1}if(/trident/i.test(navigator.userAgent))return!1;if(/edge/i.test(navigator.userAgent)){let t=navigator.userAgent.match(/edg\/(\d+)/i);return t?parseInt(t[1])>=79:!1}return!0}function ol(){return HTMLElement.prototype.hasOwnProperty("popover")}var bu={id:"dvorak",locale:"en",displayName:"Dvorak",virtualLayout:"dvorak",platform:"",score:0,mapping:{KeyA:["a","A","\xE5","\xC5"],KeyB:["x","X","\u2248","\u02DB"],KeyC:["j","J","\u2206","\xD4"],KeyD:["e","E","\xB4","\xB4"],KeyE:[".",">","\u2265","\u02D8"],KeyF:["u","U","\xA8","\xA8"],KeyG:["i","I","\u02C6","\u02C6"],KeyH:["d","D","\u2202","\xCE"],KeyI:["c","C","\xE7","\xC7"],KeyJ:["h","H","\u02D9","\xD3"],KeyK:["t","T","\u2020","\u02C7"],KeyL:["n","N","\u02DC","\u02DC"],KeyM:["m","M","\xB5","\xC2"],KeyN:["b","B","\u222B","\u0131"],KeyO:["r","R","\xAE","\u2030"],KeyP:["l","L","\xAC","\xD2"],KeyQ:["'",'"',"\xE6","\xC6"],KeyR:["p","P","\u03C0","\u220F"],KeyS:["o","O","\xF8","\xD8"],KeyT:["y","Y","\xA5","\xC1"],KeyU:["g","G","\xA9","\u02DD"],KeyV:["k","K","\u02DA","\uF8FF"],KeyW:[",","<","\u2264","\xAF"],KeyX:["q","Q","\u0153","\u0152"],KeyY:["f","F","\u0192","\xCF"],KeyZ:[";",":","\u2026","\xDA"],Digit1:["1","!","\xA1","\u2044"],Digit2:["2","@","\u2122","\u20AC"],Digit3:["3","#","\xA3","\u2039"],Digit4:["4","$","\xA2","\u203A"],Digit5:["5","%","\u221E","\uFB01"],Digit6:["6","^","\xA7","\uFB02"],Digit7:["7","&","\xB6","\u2021"],Digit8:["8","*","\u2022","\xB0"],Digit9:["9","(","\xAA","\xB7"],Digit0:["0",")","\xBA","\u201A"],Space:[" "," "," "," "],Minus:["[","{","\u201C","\u201D"],Equal:["]","}","\u2018","\u2019"],BracketLeft:["/","?","\xF7","\xBF"],BracketRight:["=","+","\u2260","\xB1"],Backslash:["\\","|","\xAB","\xBB"],Semicolon:["s","S","\xDF","\xCD"],Quote:["-","_","\u2013","\u2014"],Backquote:["`","~","`","`"],Comma:["w","W","\u2211","\u201E"],Period:["v","V","\u221A","\u25CA"],Slash:["z","Z","\u03A9","\xB8"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],Numpad1:["1","1","1","1"],Numpad2:["2","2","2","2"],Numpad3:["3","3","3","3"],Numpad4:["4","4","4","4"],Numpad5:["5","5","5","5"],Numpad6:["6","6","6","6"],Numpad7:["7","7","7","7"],Numpad8:["8","8","8","8"],Numpad9:["9","9","9","9"],Numpad0:["0","0","0","0"],NumpadDecimal:[".",".",".","."],IntlBackslash:["\xA7","\xB1","\xA7","\xB1"],NumpadEqual:["=","=","=","="],AudioVolumeUp:["","=","","="]}};var Go={id:"apple.en-intl",displayName:"English (international)",virtualLayout:"qwerty",platform:"apple",locale:"en",score:0,mapping:{KeyA:["a","A","\xE5","\xC5"],KeyB:["b","B","\u222B","\u0131"],KeyC:["c","C","\xE7","\xC7"],KeyD:["d","D","\u2202","\xCE"],KeyE:["e","E","\xB4","\xB4"],KeyF:["f","F","\u0192","\xCF"],KeyG:["g","G","\xA9","\u02DD"],KeyH:["h","H","\u02D9","\xD3"],KeyI:["i","I","\u02C6","\u02C6"],KeyJ:["j","J","\u2206","\xD4"],KeyK:["k","K","\u02DA","\uF8FF"],KeyL:["l","L","\xAC","\xD2"],KeyM:["m","M","\xB5","\xC2"],KeyN:["n","N","\u02DC","\u02DC"],KeyO:["o","O","\xF8","\xD8"],KeyP:["p","P","\u03C0","\u220F"],KeyQ:["q","Q","\u0153","\u0152"],KeyR:["r","R","\xAE","\u2030"],KeyS:["s","S","\xDF","\xCD"],KeyT:["t","T","\u2020","\u02C7"],KeyU:["u","U","\xA8","\xA8"],KeyV:["v","V","\u221A","\u25CA"],KeyW:["w","W","\u2211","\u201E"],KeyX:["x","X","\u2248","\u02DB"],KeyY:["y","Y","\xA5","\xC1"],KeyZ:["z","Z","\u03A9","\xB8"],Digit1:["1","!","\xA1","\u2044"],Digit2:["2","@","\u2122","\u20AC"],Digit3:["3","#","\xA3","\u2039"],Digit4:["4","$","\xA2","\u203A"],Digit5:["5","%","\u221E","\uFB01"],Digit6:["6","^","\xA7","\uFB02"],Digit7:["7","&","\xB6","\u2021"],Digit8:["8","*","\u2022","\xB0"],Digit9:["9","(","\xAA","\xB7"],Digit0:["0",")","\xBA","\u201A"],Space:[" "," "," "," "],Minus:["-","_","\u2013","\u2014"],Equal:["=","+","\u2260","\xB1"],BracketLeft:["[","{","\u201C","\u201D"],BracketRight:["]","}","\u2018","\u2019"],Backslash:["\\","|","\xAB","\xBB"],Semicolon:[";",":","\u2026","\xDA"],Quote:["'",'"',"\xE6","\xC6"],Backquote:["`","\u02DC","`","`"],Comma:[",","<","\u2264","\xAF"],Period:[".",">","\u2265","\u02D8"],Slash:["/","?","\xF7","\xBF"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],Numpad1:["1","1","1","1"],Numpad2:["2","2","2","2"],Numpad3:["3","3","3","3"],Numpad4:["4","4","4","4"],Numpad5:["5","5","5","5"],Numpad6:["6","6","6","6"],Numpad7:["7","7","7","7"],Numpad8:["8","8","8","8"],Numpad9:["9","9","9","9"],Numpad0:["0","0","0","0"],NumpadDecimal:[".",".",".","."],IntlBackslash:["\xA7","\xB1","\xA7","\xB1"],NumpadEqual:["=","=","=","="],AudioVolumeUp:["","=","","="]}},al={id:"windows.en-intl",displayName:"English (international)",platform:"windows",virtualLayout:"qwerty",locale:"en",score:0,mapping:{KeyA:["a","A","\xE1","\xC1"],KeyB:["b","B","",""],KeyC:["c","C","\xA9","\xA2"],KeyD:["d","D","\xF0","\xD0"],KeyE:["e","E","\xE9","\xC9"],KeyF:["f","F","",""],KeyG:["g","G","",""],KeyH:["h","H","",""],KeyI:["i","I","\xED","\xCD"],KeyJ:["j","J","",""],KeyK:["k","K","",""],KeyL:["l","L","\xF8","\xD8"],KeyM:["m","M","\xB5",""],KeyN:["n","N","\xF1","\xD1"],KeyO:["o","O","\xF3","\xD3"],KeyP:["p","P","\xF6","\xD6"],KeyQ:["q","Q","\xE4","\xC4"],KeyR:["r","R","\xAE",""],KeyS:["s","S","\xDF","\xA7"],KeyT:["t","T","\xFE","\xDE"],KeyU:["u","U","\xFA","\xDA"],KeyV:["v","V","",""],KeyW:["w","W","\xE5","\xC5"],KeyX:["x","X","",""],KeyY:["y","Y","\xFC","\xDC"],KeyZ:["z","Z","\xE6","\xC6"],Digit1:["1","!","\xA1","\xB9"],Digit2:["2","@","\xB2",""],Digit3:["3","#","\xB3",""],Digit4:["4","$","\xA4","\xA3"],Digit5:["5","%","\u20AC",""],Digit6:["6","^","\xBC",""],Digit7:["7","&","\xBD",""],Digit8:["8","*","\xBE",""],Digit9:["9","(","\u2018",""],Digit0:["0",")","\u2019",""],Space:[" "," ","",""],Minus:["-","_","\xA5",""],Equal:["=","+","\xD7","\xF7"],BracketLeft:["[","{","\xAB",""],BracketRight:["]","}","\xBB",""],Backslash:["\\","|","\xAC","\xA6"],Semicolon:[";",":","\xB6","\xB0"],Quote:["'",'"',"\xB4","\xA8"],Backquote:["`","~","",""],Comma:[",","<","\xE7","\xC7"],Period:[".",">","",""],Slash:["/","?","\xBF",""],NumpadDivide:["/","/","",""],NumpadMultiply:["*","*","",""],NumpadSubtract:["-","-","",""],NumpadAdd:["+","+","",""],IntlBackslash:["\\","|","",""]}},sl={id:"linux.en",displayName:"English",platform:"linux",virtualLayout:"qwerty",locale:"en",score:0,mapping:{KeyA:["a","A","a","A"],KeyB:["b","B","b","B"],KeyC:["c","C","c","C"],KeyD:["d","D","d","D"],KeyE:["e","E","e","E"],KeyF:["f","F","f","F"],KeyG:["g","G","g","G"],KeyH:["h","H","h","H"],KeyI:["i","I","i","I"],KeyJ:["j","J","j","J"],KeyK:["k","K","k","K"],KeyL:["l","L","l","L"],KeyM:["m","M","m","M"],KeyN:["n","N","n","N"],KeyO:["o","O","o","O"],KeyP:["p","P","p","P"],KeyQ:["q","Q","q","Q"],KeyR:["r","R","r","R"],KeyS:["s","S","s","S"],KeyT:["t","T","t","T"],KeyU:["u","U","u","U"],KeyV:["v","V","v","V"],KeyW:["w","W","w","W"],KeyX:["x","X","x","X"],KeyY:["y","Y","y","Y"],KeyZ:["z","Z","z","Z"],Digit1:["1","!","1","!"],Digit2:["2","@","2","@"],Digit3:["3","#","3","#"],Digit4:["4","$","4","$"],Digit5:["5","%","5","%"],Digit6:["6","^","6","^"],Digit7:["7","&","7","&"],Digit8:["8","*","8","*"],Digit9:["9","(","9","("],Digit0:["0",")","0",")"],Space:[" "," "," "," "],Minus:["-","_","-","_"],Equal:["=","+","=","+"],BracketLeft:["[","{","[","{"],BracketRight:["]","}","]","}"],Backslash:["\\","|","\\","|"],Semicolon:[";",":",";",":"],Quote:["'",'"',"'",'"'],Backquote:["`","~","`","~"],Comma:[",","<",",","<"],Period:[".",">",".",">"],Slash:["/","?","/","?"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],Numpad1:["1","1","1","1"],Numpad2:["2","2","2","2"],Numpad3:["3","3","3","3"],Numpad4:["4","4","4","4"],Numpad5:["5","5","5","5"],Numpad6:["6","6","6","6"],Numpad7:["7","7","7","7"],Numpad8:["8","8","8","8"],Numpad9:["9","9","9","9"],Numpad0:["0","0","0","0"],NumpadDecimal:["",".","","."],IntlBackslash:["<",">","|","\xA6"],NumpadEqual:["=","=","=","="],NumpadComma:[".",".",".","."],NumpadParenLeft:["(","(","(","("],NumpadParenRight:[")",")",")",")"]}};var yu={id:"apple.french",locale:"fr",displayName:"French",platform:"apple",virtualLayout:"azerty",score:0,mapping:{KeyA:["q","Q","\u2021","\u03A9"],KeyB:["b","B","\xDF","\u222B"],KeyC:["c","C","\xA9","\xA2"],KeyD:["d","D","\u2202","\u2206"],KeyE:["e","E","\xEA","\xCA"],KeyF:["f","F","\u0192","\xB7"],KeyG:["g","G","\uFB01","\uFB02"],KeyH:["h","H","\xCC","\xCE"],KeyI:["i","I","\xEE","\xEF"],KeyJ:["j","J","\xCF","\xCD"],KeyK:["k","K","\xC8","\xCB"],KeyL:["l","L","\xAC","|"],KeyM:[",","?","\u221E","\xBF"],KeyN:["n","N","~","\u0131"],KeyO:["o","O","\u0153","\u0152"],KeyP:["p","P","\u03C0","\u220F"],KeyQ:["a","A","\xE6","\xC6"],KeyR:["r","R","\xAE","\u201A"],KeyS:["s","S","\xD2","\u2211"],KeyT:["t","T","\u2020","\u2122"],KeyU:["u","U","\xBA","\xAA"],KeyV:["v","V","\u25CA","\u221A"],KeyW:["z","Z","\xC2","\xC5"],KeyX:["x","X","\u2248","\u2044"],KeyY:["y","Y","\xDA","\u0178"],KeyZ:["w","W","\u2039","\u203A"],Digit1:["&","1","\uF8FF","\xB4"],Digit2:["\xE9","2","\xEB","\u201E"],Digit3:['"',"3","\u201C","\u201D"],Digit4:["'","4","\u2018","\u2019"],Digit5:["(","5","{","["],Digit6:["\xA7","6","\xB6","\xE5"],Digit7:["\xE8","7","\xAB","\xBB"],Digit8:["!","8","\xA1","\xDB"],Digit9:["\xE7","9","\xC7","\xC1"],Digit0:["\xE0","0","\xF8","\xD8"],Space:[" "," "," "," "],Minus:[")","\xB0","}","]"],Equal:["-","_","\u2014","\u2013"],BracketLeft:["^","\xA8","\xF4","\xD4"],BracketRight:["$","*","\u20AC","\xA5"],Backslash:["`","\xA3","@","#"],Semicolon:["m","M","\xB5","\xD3"],Quote:["\xF9","%","\xD9","\u2030"],Backquote:["<",">","\u2264","\u2265"],Comma:[";",".","\u2026","\u2022"],Period:[":","/","\xF7","\\"],Slash:["=","+","\u2260","\xB1"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],NumpadDecimal:[",",".",",","."],IntlBackslash:["@","#","\u2022","\u0178"],NumpadEqual:["=","=","=","="]}},xu={id:"windows.french",locale:"fr",displayName:"French",virtualLayout:"azerty",platform:"windows",score:0,mapping:{KeyA:["q","Q","",""],KeyB:["b","B","",""],KeyC:["c","C","",""],KeyD:["d","D","",""],KeyE:["e","E","\u20AC",""],KeyF:["f","F","",""],KeyG:["g","G","",""],KeyH:["h","H","",""],KeyI:["i","I","",""],KeyJ:["j","J","",""],KeyK:["k","K","",""],KeyL:["l","L","",""],KeyM:[",","?","",""],KeyN:["n","N","",""],KeyO:["o","O","",""],KeyP:["p","P","",""],KeyQ:["a","A","",""],KeyR:["r","R","",""],KeyS:["s","S","",""],KeyT:["t","T","",""],KeyU:["u","U","",""],KeyV:["v","V","",""],KeyW:["z","Z","",""],KeyX:["x","X","",""],KeyY:["y","Y","",""],KeyZ:["w","W","",""],Digit1:["&","1","",""],Digit2:["\xE9","2","~",""],Digit3:['"',"3","#",""],Digit4:["'","4","{",""],Digit5:["(","5","[",""],Digit6:["-","6","|",""],Digit7:["\xE8","7","`",""],Digit8:["_","8","\\",""],Digit9:["\xE7","9","^",""],Digit0:["\xE0","0","@",""],Space:[" "," ","",""],Minus:[")","\xB0","]",""],Equal:["=","+","}",""],BracketLeft:["^","\xA8","",""],BracketRight:["$","\xA3","\xA4",""],Backslash:["*","\xB5","",""],Semicolon:["m","M","",""],Quote:["\xF9","%","",""],Backquote:["\xB2","","",""],Comma:[";",".","",""],Period:[":","/","",""],Slash:["!","\xA7","",""],NumpadDivide:["/","/","",""],NumpadMultiply:["*","*","",""],NumpadSubtract:["-","-","",""],NumpadAdd:["+","+","",""],IntlBackslash:["<",">","",""]}},vu={id:"linux.french",locale:"fr",displayName:"French",virtualLayout:"azerty",platform:"linux",score:0,mapping:{KeyA:["q","Q","@","\u03A9"],KeyB:["b","B","\u201D","\u2019"],KeyC:["c","C","\xA2","\xA9"],KeyD:["d","D","\xF0","\xD0"],KeyE:["e","E","\u20AC","\xA2"],KeyF:["f","F","\u0111","\xAA"],KeyG:["g","G","\u014B","\u014A"],KeyH:["h","H","\u0127","\u0126"],KeyI:["i","I","\u2192","\u0131"],KeyJ:["j","J","\u0309","\u031B"],KeyK:["k","K","\u0138","&"],KeyL:["l","L","\u0142","\u0141"],KeyM:[",","?","\u0301","\u030B"],KeyN:["n","N","n","N"],KeyO:["o","O","\xF8","\xD8"],KeyP:["p","P","\xFE","\xDE"],KeyQ:["a","A","\xE6","\xC6"],KeyR:["r","R","\xB6","\xAE"],KeyS:["s","S","\xDF","\xA7"],KeyT:["t","T","\u0167","\u0166"],KeyU:["u","U","\u2193","\u2191"],KeyV:["v","V","\u201C","\u2018"],KeyW:["z","Z","\xAB","<"],KeyX:["x","X","\xBB",">"],KeyY:["y","Y","\u2190","\xA5"],KeyZ:["w","W","\u0142","\u0141"],Digit1:["&","1","\xB9","\xA1"],Digit2:["\xE9","2","~","\u215B"],Digit3:['"',"3","#","\xA3"],Digit4:["'","4","{","$"],Digit5:["(","5","[","\u215C"],Digit6:["-","6","|","\u215D"],Digit7:["\xE8","7","`","\u215E"],Digit8:["_","8","\\","\u2122"],Digit9:["\xE7","9","^","\xB1"],Digit0:["\xE0","0","@","\xB0"],Enter:["\r","\r","\r","\r"],Escape:["\x1B","\x1B","\x1B","\x1B"],Backspace:["\b","\b","\b","\b"],Tab:[" ",""," ",""],Space:[" "," "," "," "],Minus:[")","\xB0","]","\xBF"],Equal:["=","+","}","\u0328"],BracketLeft:["\u0302","\u0308","\u0308","\u030A"],BracketRight:["$","\xA3","\xA4","\u0304"],Backslash:["*","\xB5","\u0300","\u0306"],Semicolon:["m","M","\xB5","\xBA"],Quote:["\xF9","%","\u0302","\u030C"],Backquote:["\xB2","~","\xAC","\xAC"],Comma:[";",".","\u2500","\xD7"],Period:[":","/","\xB7","\xF7"],Slash:["!","\xA7","\u0323","\u0307"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],NumpadDecimal:["",".","","."],IntlBackslash:["<",">","|","\xA6"]}};var _u={id:"apple.german",locale:"de",displayName:"German",virtualLayout:"qwertz",platform:"apple",score:0,mapping:{KeyA:["a","A","\xE5","\xC5"],KeyB:["b","B","\u222B","\u2039"],KeyC:["c","C","\xE7","\xC7"],KeyD:["d","D","\u2202","\u2122"],KeyE:["e","E","\u20AC","\u2030"],KeyF:["f","F","\u0192","\xCF"],KeyG:["g","G","\xA9","\xCC"],KeyH:["h","H","\xAA","\xD3"],KeyI:["i","I","\u2044","\xDB"],KeyJ:["j","J","\xBA","\u0131"],KeyK:["k","K","\u2206","\u02C6"],KeyL:["l","L","@","\uFB02"],KeyM:["m","M","\xB5","\u02D8"],KeyN:["n","N","~","\u203A"],KeyO:["o","O","\xF8","\xD8"],KeyP:["p","P","\u03C0","\u220F"],KeyQ:["q","Q","\xAB","\xBB"],KeyR:["r","R","\xAE","\xB8"],KeyS:["s","S","\u201A","\xCD"],KeyT:["t","T","\u2020","\u02DD"],KeyU:["u","U","\xA8","\xC1"],KeyV:["v","V","\u221A","\u25CA"],KeyW:["w","W","\u2211","\u201E"],KeyX:["x","X","\u2248","\xD9"],KeyY:["z","Z","\u03A9","\u02C7"],KeyZ:["y","Y","\xA5","\u2021"],Digit1:["1","!","\xA1","\xAC"],Digit2:["2",'"',"\u201C","\u201D"],Digit3:["3","\xA7","\xB6","#"],Digit4:["4","$","\xA2","\xA3"],Digit5:["5","%","[","\uFB01"],Digit6:["6","&","]","^"],Digit7:["7","/","|","\\"],Digit8:["8","(","{","\u02DC"],Digit9:["9",")","}","\xB7"],Digit0:["0","=","\u2260","\xAF"],Space:[" "," "," "," "],Minus:["\xDF","?","\xBF","\u02D9"],Equal:["\xB4","`","'","\u02DA"],BracketLeft:["\xFC","\xDC","\u2022","\xB0"],BracketRight:["+","*","\xB1","\uF8FF"],Backslash:["#","'","\u2018","\u2019"],Semicolon:["\xF6","\xD6","\u0153","\u0152"],Quote:["\xE4","\xC4","\xE6","\xC6"],Backquote:["<",">","\u2264","\u2265"],Comma:[",",";","\u221E","\u02DB"],Period:[".",":","\u2026","\xF7"],Slash:["-","_","\u2013","\u2014"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],NumpadDecimal:[",",",",".","."],IntlBackslash:["^","\xB0","\u201E","\u201C"],NumpadEqual:["=","=","=","="]}},Mu={id:"windows.german",locale:"de",displayName:"German",platform:"windows",virtualLayout:"qwertz",score:0,mapping:{KeyA:["a","A","",""],KeyB:["b","B","",""],KeyC:["c","C","",""],KeyD:["d","D","",""],KeyE:["e","E","\u20AC",""],KeyF:["f","F","",""],KeyG:["g","G","",""],KeyH:["h","H","",""],KeyI:["i","I","",""],KeyJ:["j","J","",""],KeyK:["k","K","",""],KeyL:["l","L","",""],KeyM:["m","M","\xB5",""],KeyN:["n","N","",""],KeyO:["o","O","",""],KeyP:["p","P","",""],KeyQ:["q","Q","@",""],KeyR:["r","R","",""],KeyS:["s","S","",""],KeyT:["t","T","",""],KeyU:["u","U","",""],KeyV:["v","V","",""],KeyW:["w","W","",""],KeyX:["x","X","",""],KeyY:["z","Z","",""],KeyZ:["y","Y","",""],Digit1:["1","!","",""],Digit2:["2",'"',"\xB2",""],Digit3:["3","\xA7","\xB3",""],Digit4:["4","$","",""],Digit5:["5","%","",""],Digit6:["6","&","",""],Digit7:["7","/","{",""],Digit8:["8","(","[",""],Digit9:["9",")","]",""],Digit0:["0","=","}",""],Space:[" "," ","",""],Minus:["\xDF","?","\\","\u1E9E"],Equal:["\xB4","`","",""],BracketLeft:["\xFC","\xDC","",""],BracketRight:["+","*","~",""],Backslash:["#","'","",""],Semicolon:["\xF6","\xD6","",""],Quote:["\xE4","\xC4","",""],Backquote:["^","\xB0","",""],Comma:[",",";","",""],Period:[".",":","",""],Slash:["-","_","",""],NumpadDivide:["/","/","",""],NumpadMultiply:["*","*","",""],NumpadSubtract:["-","-","",""],NumpadAdd:["+","+","",""],IntlBackslash:["<",">","|",""]}},wu={id:"linux.german",locale:"de",displayName:"German",platform:"windows",virtualLayout:"qwertz",score:0,mapping:{KeyA:["a","A","\xE6","\xC6"],KeyB:["b","B","\u201C","\u2018"],KeyC:["c","C","\xA2","\xA9"],KeyD:["d","D","\xF0","\xD0"],KeyE:["e","E","\u20AC","\u20AC"],KeyF:["f","F","\u0111","\xAA"],KeyG:["g","G","\u014B","\u014A"],KeyH:["h","H","\u0127","\u0126"],KeyI:["i","I","\u2192","\u0131"],KeyJ:["j","J","\u0323","\u0307"],KeyK:["k","K","\u0138","&"],KeyL:["l","L","\u0142","\u0141"],KeyM:["m","M","\xB5","\xBA"],KeyN:["n","N","\u201D","\u2019"],KeyO:["o","O","\xF8","\xD8"],KeyP:["p","P","\xFE","\xDE"],KeyQ:["q","Q","@","\u03A9"],KeyR:["r","R","\xB6","\xAE"],KeyS:["s","S","\u017F","\u1E9E"],KeyT:["t","T","\u0167","\u0166"],KeyU:["u","U","\u2193","\u2191"],KeyV:["v","V","\u201E","\u201A"],KeyW:["w","W","\u0142","\u0141"],KeyX:["x","X","\xAB","\u2039"],KeyY:["z","Z","\u2190","\xA5"],KeyZ:["y","Y","\xBB","\u203A"],Digit1:["1","!","\xB9","\xA1"],Digit2:["2",'"',"\xB2","\u215B"],Digit3:["3","\xA7","\xB3","\xA3"],Digit4:["4","$","\xBC","\xA4"],Digit5:["5","%","\xBD","\u215C"],Digit6:["6","&","\xAC","\u215D"],Digit7:["7","/","{","\u215E"],Digit8:["8","(","[","\u2122"],Digit9:["9",")","]","\xB1"],Digit0:["0","=","}","\xB0"],Enter:["\r","\r","\r","\r"],Escape:["\x1B","\x1B","\x1B","\x1B"],Backspace:["\b","\b","\b","\b"],Tab:[" ",""," ",""],Space:[" "," "," "," "],Minus:["\xDF","?","\\","\xBF"],Equal:["\u0301","\u0300","\u0327","\u0328"],BracketLeft:["\xFC","\xDC","\u0308","\u030A"],BracketRight:["+","*","~","\xAF"],Backslash:["#","'","\u2019","\u0306"],Semicolon:["\xF6","\xD6","\u030B","\u0323"],Quote:["\xE4","\xC4","\u0302","\u030C"],Backquote:["\u0302","\xB0","\u2032","\u2033"],Comma:[",",";","\xB7","\xD7"],Period:[".",":","\u2026","\xF7"],Slash:["-","_","\u2013","\u2014"],PrintScreen:["","","",""],PageUp:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],Numpad1:["","1","","1"],Numpad2:["","2","","2"],Numpad3:["","3","","3"],Numpad4:["","4","","4"],Numpad5:["","5","","5"],Numpad6:["","6","","6"],Numpad7:["","7","","7"],Numpad8:["","8","","8"],Numpad9:["","9","","9"],Numpad0:["","0","","0"],NumpadDecimal:["",",","",","],IntlBackslash:["<",">","|","\u0331"],AltRight:["\r","\r","\r","\r"],MetaRight:[".",".",".","."]}};var Su={id:"apple.spanish",locale:"es",displayName:"Spanish ISO",platform:"apple",virtualLayout:"qwerty",score:0,mapping:{KeyA:["a","A","\xE5","\xC5"],KeyB:["b","B","\xDF",""],KeyC:["c","C","\xA9"," "],KeyD:["d","D","\u2202","\u2206"],KeyE:["e","E","\u20AC","\u20AC"],KeyF:["f","F","\u0192","\uFB01"],KeyG:["g","G","\uF8FF","\uFB02"],KeyH:["h","H","\u2122"," "],KeyI:["i","I"," "," "],KeyJ:["j","J","\xB6","\xAF"],KeyK:["k","K","\xA7","\u02C7"],KeyL:["l","L"," ","\u02D8"],KeyM:["m","M","\xB5","\u02DA"],KeyN:["n","N"," ","\u02D9"],KeyO:["o","O","\xF8","\xD8"],KeyP:["p","P","\u03C0","\u220F"],KeyQ:["q","Q","\u0153","\u0152"],KeyR:["r","R","\xAE"," "],KeyS:["s","S","\u222B"," "],KeyT:["t","T","\u2020","\u2021"],KeyU:["u","U"," "," "],KeyV:["v","V","\u221A","\u25CA"],KeyW:["w","W","\xE6","\xC6"],KeyX:["x","X","\u2211","\u203A"],KeyY:["y","Y","\xA5"," "],KeyZ:["z","Z","\u03A9","\u2039"],Digit1:["1","!","|","\u0131"],Digit2:["2",'"',"@","\u02DD"],Digit3:["3","\xB7","#","\u2022"],Digit4:["4","$","\xA2","\xA3"],Digit5:["5","%","\u221E","\u2030"],Digit6:["6","&","\xAC"," "],Digit7:["7","/","\xF7","\u2044"],Digit8:["8","(","\u201C","\u2018"],Digit9:["9",")","\u201D","\u2019"],Digit0:["0","=","\u2260","\u2248"],Space:[" "," "," "," "],Minus:["'","?","\xB4","\xB8"],Equal:["\xA1","\xBF","\u201A","\u02DB"],BracketLeft:["`","^","[","\u02C6"],BracketRight:["+","*","]","\xB1"],Backslash:["\xE7","\xC7","}","\xBB"],Semicolon:["\xF1","\xD1","~","\u02DC"],Quote:["\xB4","\xA8","{","\xAB"],Backquote:["<",">","\u2264","\u2265"],Comma:[",",";","\u201E",""],Period:[".",":","\u2026","\u2026"],Slash:["-","_","\u2013","\u2014"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],Numpad1:["1","1","1","1"],Numpad2:["2","2","2","2"],Numpad3:["3","3","3","3"],Numpad4:["4","4","4","4"],Numpad5:["5","5","5","5"],Numpad6:["6","6","6","6"],Numpad7:["7","7","7","7"],Numpad8:["8","8","8","8"],Numpad9:["9","9","9","9"],Numpad0:["0","0","0","0"],NumpadDecimal:[",",",",",",","],IntlBackslash:["\xBA","\xAA","\\","\xB0"]}},ku={id:"windows.spanish",locale:"es",displayName:"Spanish",platform:"windows",virtualLayout:"qwerty",score:0,mapping:{KeyA:["a","A","",""],KeyB:["b","B","",""],KeyC:["c","C","",""],KeyD:["d","D","",""],KeyE:["e","E","\u20AC",""],KeyF:["f","F","",""],KeyG:["g","G","",""],KeyH:["h","H","",""],KeyI:["i","I","",""],KeyJ:["j","J","",""],KeyK:["k","K","",""],KeyL:["l","L","",""],KeyM:["m","M","",""],KeyN:["n","N","",""],KeyO:["o","O","",""],KeyP:["p","P","",""],KeyQ:["q","Q","",""],KeyR:["r","R","",""],KeyS:["s","S","",""],KeyT:["t","T","",""],KeyU:["u","U","",""],KeyV:["v","V","",""],KeyW:["w","W","",""],KeyX:["x","X","",""],KeyY:["y","Y","",""],KeyZ:["z","Z","",""],Digit1:["1","!","|",""],Digit2:["2",'"',"@",""],Digit3:["3","\xB7","#",""],Digit4:["4","$","~",""],Digit5:["5","%","\u20AC",""],Digit6:["6","&","\xAC",""],Digit7:["7","/","",""],Digit8:["8","(","",""],Digit9:["9",")","",""],Digit0:["0","=","",""],Space:[" "," ","",""],Minus:["'","?","",""],Equal:["\xA1","\xBF","",""],BracketLeft:["`","^","[",""],BracketRight:["+","*","]",""],Backslash:["\xE7","\xC7","}",""],Semicolon:["\xF1","\xD1","",""],Quote:["\xB4","\xA8","{",""],Backquote:["\xBA","\xAA","\\",""],Comma:[",",";","",""],Period:[".",":","",""],Slash:["-","_","",""],NumpadDivide:["/","/","",""],NumpadMultiply:["*","*","",""],NumpadSubtract:["-","-","",""],NumpadAdd:["+","+","",""],IntlBackslash:["<",">","",""]}},Lu={id:"linux.spanish",locale:"es",displayName:"Spanish",platform:"linux",virtualLayout:"qwerty",score:0,mapping:{KeyA:["a","A","\xE6","\xC6"],KeyB:["b","B","\u201D","\u2019"],KeyC:["c","C","\xA2","\xA9"],KeyD:["d","D","\xF0","\xD0"],KeyE:["e","E","\u20AC","\xA2"],KeyF:["f","F","\u0111","\xAA"],KeyG:["g","G","\u014B","\u014A"],KeyH:["h","H","\u0127","\u0126"],KeyI:["i","I","\u2192","\u0131"],KeyJ:["j","J","\u0309","\u031B"],KeyK:["k","K","\u0138","&"],KeyL:["l","L","\u0142","\u0141"],KeyM:["m","M","\xB5","\xBA"],KeyN:["n","N","n","N"],KeyO:["o","O","\xF8","\xD8"],KeyP:["p","P","\xFE","\xDE"],KeyQ:["q","Q","@","\u03A9"],KeyR:["r","R","\xB6","\xAE"],KeyS:["s","S","\xDF","\xA7"],KeyT:["t","T","\u0167","\u0166"],KeyU:["u","U","\u2193","\u2191"],KeyV:["v","V","\u201C","\u2018"],KeyW:["w","W","\u0142","\u0141"],KeyX:["x","X","\xBB",">"],KeyY:["y","Y","\u2190","\xA5"],KeyZ:["z","Z","\xAB","<"],Digit1:["1","!","|","\xA1"],Digit2:["2",'"',"@","\u215B"],Digit3:["3","\xB7","#","\xA3"],Digit4:["4","$","~","$"],Digit5:["5","%","\xBD","\u215C"],Digit6:["6","&","\xAC","\u215D"],Digit7:["7","/","{","\u215E"],Digit8:["8","(","[","\u2122"],Digit9:["9",")","]","\xB1"],Digit0:["0","=","}","\xB0"],Enter:["\r","\r","\r","\r"],Escape:["\x1B","\x1B","\x1B","\x1B"],Backspace:["\b","\b","\b","\b"],Tab:[" ",""," ",""],Space:[" "," "," "," "],Minus:["'","?","\\","\xBF"],Equal:["\xA1","\xBF","\u0303","~"],BracketLeft:["\u0300","\u0302","[","\u030A"],BracketRight:["+","*","]","\u0304"],Backslash:["\xE7","\xC7","}","\u0306"],Semicolon:["\xF1","\xD1","~","\u030B"],Quote:["\u0301","\u0308","{","{"],Backquote:["\xBA","\xAA","\\","\\"],Comma:[",",";","\u2500","\xD7"],Period:[".",":","\xB7","\xF7"],Slash:["-","_","\u0323","\u0307"],NumpadDivide:["/","/","/","/"],NumpadMultiply:["*","*","*","*"],NumpadSubtract:["-","-","-","-"],NumpadAdd:["+","+","+","+"],NumpadEnter:["\r","\r","\r","\r"],Numpad1:["","1","","1"],Numpad2:["","2","","2"],Numpad3:["","3","","3"],Numpad4:["","4","","4"],Numpad5:["","5","","5"],Numpad6:["","6","","6"],Numpad7:["","7","","7"],Numpad8:["","8","","8"],Numpad9:["","9","","9"],Numpad0:["","0","","0"],NumpadDecimal:["",".","","."],IntlBackslash:["<",">","|","\xA6"],NumpadEqual:["=","=","=","="],NumpadComma:[".",".",".","."],NumpadParenLeft:["(","(","(","("],NumpadParenRight:[")",")",")",")"]}};function ll(t){let e=t.split("+"),r={shift:!1,alt:!1,cmd:!1,win:!1,meta:!1,ctrl:!1,key:e.pop()};return e.includes("shift")&&(r.shift=!0),e.includes("alt")&&(r.alt=!0),e.includes("ctrl")&&(r.ctrl=!0),e.includes("cmd")&&(r.cmd=!0),e.includes("win")&&(r.win=!0),e.includes("meta")&&(r.meta=!0),r}function Zr(t){let e="";return t.shift&&(e+="shift+"),t.alt&&(e+="alt+"),t.ctrl&&(e+="ctrl+"),t.cmd&&(e+="cmd+"),t.win&&(e+="win+"),t.meta&&(e+="meta+"),e+t.key}var mf={enter:"[Enter]",escape:"[Escape]",backspace:"[Backspace]",tab:"[Tab]",space:"[Space]",pausebreak:"[Pause]",insert:"[Insert]",home:"[Home]",pageup:"[PageUp]",delete:"[Delete]",end:"[End]",pagedown:"[PageDown]",right:"[ArrowRight]",left:"[ArrowLeft]",down:"[ArrowDown]",up:"[ArrowUp]",numpad0:"[Numpad0]",numpad1:"[Numpad1]",numpad2:"[Numpad2]",numpad3:"[Numpad3]",numpad4:"[Numpad4]",numpad5:"[Numpad5]",numpad6:"[Numpad6]",numpad7:"[Numpad7]",numpad8:"[Numpad8]",numpad9:"[Numpad9]",numpad_divide:"[NumpadDivide]",numpad_multiply:"[NumpadMultiply]",numpad_subtract:"[NumpadSubtract]",numpad_add:"[NumpadAdd]",numpad_decimal:"[NumpadDecimal]",numpad_separator:"[NumpadComma]",capslock:"[Capslock]",f1:"[F1]",f2:"[F2]",f3:"[F3]",f4:"[F4]",f5:"[F5]",f6:"[F6]",f7:"[F7]",f8:"[F8]",f9:"[F9]",f10:"[F10]",f11:"[F11]",f12:"[F12]",f13:"[F13]",f14:"[F14]",f15:"[F15]",f16:"[F16]",f17:"[F17]",f18:"[F18]",f19:"[F19]"},Oi=[],Yt;function cl(){switch(Et()){case"macos":case"ios":return"apple";case"windows":return"windows"}return"linux"}function Je(t){(!t.platform||t.platform===cl())&&Oi.push(t)}function Au(t,e){var i;let r={shift:!1,alt:!1,cmd:!1,win:!1,meta:!1,ctrl:!1,key:""};if(!t)return r;for(let[n,o]of Object.entries(e.mapping)){if(o[0]===t)return r.key=`[${n}]`,r;if(o[1]===t)return r.shift=!0,r.key=`[${n}]`,r;if(o[2]===t)return r.alt=!0,r.key=`[${n}]`,r;if(o[3]===t)return r.shift=!0,r.alt=!0,r.key=`[${n}]`,r}return r.key=(i=mf[t])!=null?i:"",r}function Cu(t){if(t.code)return t;let e=Object.entries(yr().mapping),r=!1,i=!1,n="";for(let o=0;o<4;o++){for(let[a,s]of e)if(s[o]===t.key){n=a,o===3?(r=!0,i=!0):o===2?r=!0:o===1&&(i=!0);break}if(n)break}return new KeyboardEvent(t.type,g(h({},t),{altKey:r,shiftKey:i,code:n}))}function Eu(t){var r,i;if(!t||t.key==="Unidentified"||t.key==="Dead")return;let e=t.shiftKey&&t.altKey?3:t.altKey?2:t.shiftKey?1:0;for(let n of Oi)((r=n.mapping[t.code])==null?void 0:r[e])===t.key?n.score+=1:(i=n.mapping[t.code])!=null&&i[e]&&(n.score=0);Oi.sort((n,o)=>o.score-n.score)}function jo(t){Yt=Oi.find(e=>t.startsWith(e.locale))}function Tu(t){return Yt=Oi.find(e=>e.id===t),Yt}function yr(){return Yt!=null?Yt:Oi[0]}function Du(){switch(cl()){case"apple":return Go;case"windows":return al;case"linux":return sl}return Go}switch(cl()){case"apple":Je(Go),Je(yu),Je(Su),Je(_u);break;case"windows":Je(al),Je(xu),Je(ku),Je(Mu);break;case"linux":Je(sl),Je(vu),Je(Lu),Je(wu);break}Je(bu);function Ou(t){Tu(t)}function Bu(t){jo(t)}function ee(t){return Array.isArray(t)}var Ku={en:{"keyboard.tooltip.symbols":"Symbols","keyboard.tooltip.greek":"Greek Letters","keyboard.tooltip.numeric":"Numeric","keyboard.tooltip.alphabetic":"Roman Letters","tooltip.copy to clipboard":"Copy to Clipboard","tooltip.cut to clipboard":"Cut to Clipboard","tooltip.paste from clipboard":"Paste from Clipboard","tooltip.redo":"Redo","tooltip.toggle virtual keyboard":"Toggle Virtual Keyboard","tooltip.menu":"Menu","tooltip.undo":"Undo","menu.borders":"Borders","menu.insert matrix":"Insert Matrix","menu.array.add row above":"Add Row Before","menu.array.add row below":"Add Row After","menu.array.add column after":"Add Column After","menu.array.add column before":"Add Column Before","menu.array.delete row":"Delete Row","menu.array.delete rows":"Delete Selected Rows","menu.array.delete column":"Delete Column","menu.array.delete columns":"Delete Selected Columns","menu.mode":"Mode","menu.mode-math":"Math","menu.mode-text":"Text","menu.mode-latex":"LaTeX","menu.insert":"Insert","menu.insert.abs":"Absolute Value","menu.insert.abs-template":"\\left|x\\right|","menu.insert.nth-root":"nth Root","menu.insert.nth-root-template":"\\sqrt[n]{x}","menu.insert.log-base":"Logarithm base a","menu.insert.log-base-template":"\\log_a(x)","menu.insert.heading-calculus":"Calculus","menu.insert.derivative":"Derivative","menu.insert.derivative-template":"\\dfrac{\\mathrm{d}}{\\mathrm{d}x}f(x)\\bigm|_{x=a}","menu.insert.nth-derivative":"nth derivative","menu.insert.nth-derivative-template":"\\dfrac{\\mathrm{d}^n}{\\mathrm{d}x^n}f(x)\\bigm|_{x=a}","menu.insert.integral":"Integral","menu.insert.integral-template":"$\\int_a^b f(x)\\,\\mathrm{d}x$","menu.insert.sum":"Sum","menu.insert.sum-template":"$\\sum_{i=1}^n x_i$","menu.insert.product":"Product","menu.insert.product-template":"\\prod_{i=1}^n x_i","menu.insert.heading-complex-numbers":"Complex Numbers","menu.insert.modulus":"Modulus","menu.insert.modulus-template":"\\lvert z \\rvert","menu.insert.argument":"Argument","menu.insert.argument-template":"\\arg(z)","menu.insert.real-part":"Real Part","menu.insert.real-part-template":"\\Re(z)","menu.insert.imaginary-part":"Imaginary Part","menu.insert.imaginary-part-template":"\\Im(z)","menu.insert.conjugate":"Conjugate","menu.insert.conjugate-template":"\\overline{z}","tooltip.blackboard":"Blackboard","tooltip.bold":"Bold","tooltip.italic":"Italic","tooltip.fraktur":"Fraktur","tooltip.script":"Script","tooltip.caligraphic":"Caligraphic","tooltip.typewriter":"Typewriter","tooltip.roman-upright":"Roman Upright","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Font Style","menu.accent":"Accent","menu.decoration":"Decoration","menu.color":"Color","menu.background-color":"Background","menu.cut":"Cut","menu.copy":"Copy","menu.copy-as-latex":"Copy as LaTeX","menu.copy-as-typst":"Copy as Typst","menu.copy-as-ascii-math":"Copy as ASCII Math","menu.copy-as-mathml":"Copy as MathML","menu.paste":"Paste","menu.select-all":"Select All","color.red":"Red","color.orange":"Orange","color.yellow":"Yellow","color.lime":"Lime","color.green":"Green","color.teal":"Teal","color.cyan":"Cyan","color.blue":"Blue","color.indigo":"Indigo","color.purple":"Purple","color.magenta":"Magenta","color.black":"Black","color.dark-grey":"Dark Grey","color.grey":"Grey","color.light-grey":"Light Grey","color.white":"White"},ar:{"keyboard.tooltip.symbols":"\u062D\u0631\u0641 \u0627\u0648 \u0631\u0645\u0632","keyboard.tooltip.greek":"\u062D\u0631\u0648\u0641 \u064A\u0648\u0646\u0627\u0646\u064A\u0629","keyboard.tooltip.numeric":"\u0627\u0644\u0631\u0642\u0645\u064A\u0629","keyboard.tooltip.alphabetic":"\u0631\u0645\u0648\u0632 \u0627\u0644\u0627\u062D\u0631\u0641 \u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064A\u0629","tooltip.copy to clipboard":"\u0646\u0633\u062E \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629","tooltip.cut to clipboard":"\u0642\u0635 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629","tooltip.paste from clipboard":"\u0644\u0635\u0642 \u0645\u0646 \u0627\u0644\u062D\u0627\u0641\u0638\u0629","tooltip.redo":"\u0627\u0644\u0625\u0639\u0627\u062F\u0629","tooltip.toggle virtual keyboard":"\u062A\u0628\u062F\u064A\u0644 \u0644\u0648\u062D\u0629 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0625\u0641\u062A\u0631\u0627\u0636\u064A\u0629","tooltip.undo":"\u0625\u0644\u063A\u0627\u0621","menu.insert matrix":"\u0623\u062F\u062E\u0644 \u0627\u0644\u0645\u0635\u0641\u0648\u0641\u0629","menu.borders":"\u0645\u062D\u062F\u062F\u0627\u062A \u0627\u0644\u0645\u0635\u0641\u0648\u0641\u0629","menu.array.add row above":"\u0623\u0636\u0641 \u0635\u0641\u064B\u0627 \u0628\u0639\u062F \u0630\u0644\u0643","menu.array.add row below":"\u0623\u0636\u0641 \u0627\u0644\u0635\u0641 \u0642\u0628\u0644","menu.array.add column after":"\u0623\u0636\u0641 \u0627\u0644\u0639\u0645\u0648\u062F \u0628\u0639\u062F \u0630\u0644\u0643","menu.array.add column before":"\u0623\u0636\u0641 \u0627\u0644\u0639\u0645\u0648\u062F \u0642\u0628\u0644","menu.array.delete row":"\u0627\u062D\u0630\u0641 \u0635\u0641","menu.array.delete rows":"\u062D\u0630\u0641 \u0627\u0644\u0635\u0641\u0648\u0641 \u0627\u0644\u0645\u062D\u062F\u062F\u0629","menu.array.delete column":"\u062D\u0630\u0641 \u0627\u0644\u0639\u0645\u0648\u062F","menu.array.delete columns":"\u062D\u0630\u0641 \u0627\u0644\u0623\u0639\u0645\u062F\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0629","menu.mode":"\u0648\u0636\u0639","menu.mode-math":"\u0631\u064A\u0627\u0636\u064A\u0627\u062A","menu.mode-text":"\u0646\u0635","menu.mode-latex":"\u0644\u0627\u062A\u0643\u0633","tooltip.blackboard":"\u0633\u0628\u0648\u0631\u0629","tooltip.bold":"\u0639\u0631\u064A\u0636","tooltip.italic":"\u0645\u0627\u0626\u0644","tooltip.fraktur":"\u0641\u0631\u0627\u0643\u062A\u0648\u0631","tooltip.script":"\u0633\u0643\u0631\u064A\u0628\u062A","tooltip.caligraphic":"\u0643\u0627\u0644\u064A\u062C\u0631\u0627\u0641\u064A\u0643","tooltip.typewriter":"\u0622\u0644\u0629 \u0643\u0627\u062A\u0628\u0629","tooltip.roman-upright":"\u0631\u0648\u0645\u0627\u0646\u064A \u0645\u0633\u062A\u0642\u064A\u0645","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u0646\u0645\u0637 \u0627\u0644\u062E\u0637","menu.accent":"\u062A\u0634\u0643\u064A\u0644","menu.decoration":"\u0632\u062E\u0631\u0641\u0629","menu.color":"\u0644\u0648\u0646","menu.background-color":"\u0627\u0644\u062E\u0644\u0641\u064A\u0629","menu.cut":"\u0642\u0635","menu.copy":"\u0646\u0633\u062E","menu.copy-as-latex":"\u0646\u0633\u062E \u0643\u0640 LaTeX","menu.copy-as-ascii-math":"\u0646\u0633\u062E \u0643\u0640 ASCII Math","menu.copy-as-mathml":"\u0646\u0633\u062E \u0643\u0640 MathML","menu.paste":"\u0644\u0635\u0642","menu.select-all":"\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0643\u0644","color.red":"\u0623\u062D\u0645\u0631","color.orange":"\u0628\u0631\u062A\u0642\u0627\u0644\u064A","color.yellow":"\u0623\u0635\u0641\u0631","color.lime":"\u0644\u064A\u0645\u0648\u0646\u064A","color.green":"\u0623\u062E\u0636\u0631","color.teal":"\u0633\u0645\u0627\u0648\u064A","color.cyan":"\u0633\u0645\u0627\u0648\u064A \u0641\u0627\u062A\u062D","color.blue":"\u0623\u0632\u0631\u0642","color.indigo":"\u0646\u064A\u0644\u064A","color.purple":"\u0628\u0646\u0641\u0633\u062C\u064A","color.magenta":"\u0623\u0631\u062C\u0648\u0627\u0646\u064A","color.black":"\u0623\u0633\u0648\u062F","color.dark-grey":"\u0631\u0645\u0627\u062F\u064A \u063A\u0627\u0645\u0642","color.grey":"\u0631\u0645\u0627\u062F\u064A","color.light-grey":"\u0631\u0645\u0627\u062F\u064A \u0641\u0627\u062A\u062D","color.white":"\u0623\u0628\u064A\u0636"},de:{"keyboard.tooltip.symbols":"Symbole","keyboard.tooltip.greek":"Griechische Buchstaben","keyboard.tooltip.numeric":"Numerisch","keyboard.tooltip.alphabetic":"R\xF6mische Buchstaben","tooltip.copy to clipboard":"In die Zwischenablage kopieren","tooltip.redo":"Wiederholen","tooltip.toggle virtual keyboard":"Virtuelle Tastatur umschalten","tooltip.undo":"Widerrufen","menu.insert matrix":"Matrix einf\xFCgen","menu.borders":"Matrixtrennzeichen","menu.array.add row above":"Zeile hinzuf\xFCgen nach","menu.array.add row below":"Zeile hinzuf\xFCgen vor","menu.array.add column after":"Spalte hinzuf\xFCgen nach","menu.array.add column before":"Spalte hinzuf\xFCgen vor","menu.array.delete row":"Zeile l\xF6schen","menu.array.delete rows":"Ausgew\xE4hlte Zeilen l\xF6schen","menu.array.delete column":"Spalte l\xF6schen","menu.array.delete columns":"Ausgew\xE4hlte Spalten l\xF6schen","menu.mode":"Modus","menu.mode-math":"Mathematik","menu.mode-text":"Text","menu.mode-latex":"LaTeX","tooltip.blackboard":"Tafel","tooltip.bold":"Fett","tooltip.italic":"Kursiv","tooltip.fraktur":"Fraktur","tooltip.script":"Skript","tooltip.caligraphic":"Kalligraphie","tooltip.typewriter":"Schreibmaschine","tooltip.roman-upright":"R\xF6misch aufrecht","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Schriftstil","menu.accent":"Akzent","menu.decoration":"Dekoration","menu.color":"Farbe","menu.background-color":"Hintergrund","menu.cut":"Ausschneiden","menu.copy":"Kopieren","menu.copy-as-latex":"Als LaTeX kopieren","menu.copy-as-ascii-math":"Als ASCII Math kopieren","menu.copy-as-mathml":"Als MathML kopieren","menu.paste":"Einf\xFCgen","menu.select-all":"Alles ausw\xE4hlen","color.red":"Rot","color.orange":"Orange","color.yellow":"Gelb","color.lime":"Limette","color.green":"Gr\xFCn","color.teal":"Blaugr\xFCn","color.cyan":"Cyan","color.blue":"Blau","color.indigo":"Indigo","color.purple":"Lila","color.magenta":"Magenta","color.black":"Schwarz","color.dark-grey":"Dunkelgrau","color.grey":"Grau","color.light-grey":"Hellgrau","color.white":"Wei\xDF"},el:{"keyboard.tooltip.symbols":"\u03C3\u03CD\u03BC\u03B2\u03BF\u03BB\u03B1","keyboard.tooltip.greek":"\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC \u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1","keyboard.tooltip.numeric":"\u0391\u03C1\u03B9\u03B8\u03BC\u03B7\u03C4\u03B9\u03BA\u03CC\u03C2","keyboard.tooltip.alphabetic":"\u03A1\u03C9\u03BC\u03B1\u03CA\u03BA\u03AC \u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1","tooltip.copy to clipboard":"\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03C4\u03BF \u03C0\u03C1\u03CC\u03C7\u03B5\u03B9\u03C1\u03BF","tooltip.redo":"\u039E\u03B1\u03BD\u03B1\u03BA\u03AC\u03BD\u03C9","tooltip.toggle virtual keyboard":"\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03BA\u03BF\u03CD \u03C0\u03BB\u03B7\u03BA\u03C4\u03C1\u03BF\u03BB\u03BF\u03B3\u03AF\u03BF\u03C5","tooltip.undo":"\u039E\u03B5\u03BA\u03AC\u03BD\u03C9","menu.insert matrix":"\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03BC\u03AE\u03C4\u03C1\u03B1","menu.borders":"\u039F\u03C1\u03B9\u03BF\u03B8\u03AD\u03C4\u03B5\u03C2 \u03BC\u03AE\u03C4\u03C1\u03B1","menu.array.add row above":"\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 \u03BC\u03B5\u03C4\u03AC","menu.array.add row below":"\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 \u03C0\u03C1\u03B9\u03BD","menu.array.add column after":"\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C4\u03AE\u03BB\u03B7\u03C2 \u03BC\u03B5\u03C4\u03AC","menu.array.add column before":"\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C4\u03AE\u03BB\u03B7\u03C2 \u03C0\u03C1\u03B9\u03BD","menu.array.delete row":"\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03B5\u03B9\u03C1\u03AC\u03C2","menu.array.delete rows":"\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD \u03C3\u03B5\u03B9\u03C1\u03CE\u03BD","menu.array.delete column":"\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03C4\u03AE\u03BB\u03B7\u03C2","menu.array.delete columns":"\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD \u03C3\u03C4\u03B7\u03BB\u03CE\u03BD","menu.mode":"\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1","menu.mode-math":"\u039C\u03B1\u03B8\u03B7\u03BC\u03B1\u03C4\u03B9\u03BA\u03AC","menu.mode-text":"\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF","menu.mode-latex":"LaTeX","tooltip.blackboard":"\u03A0\u03AF\u03BD\u03B1\u03BA\u03B1\u03C2","tooltip.bold":"\u0388\u03BD\u03C4\u03BF\u03BD\u03B7","tooltip.italic":"\u03A0\u03BB\u03AC\u03B3\u03B9\u03B1","tooltip.fraktur":"\u03A6\u03C1\u03AC\u03BA\u03C4\u03BF\u03C5\u03C1","tooltip.script":"\u03A3\u03B5\u03BD\u03AC\u03C1\u03B9\u03BF","tooltip.caligraphic":"\u039A\u03B1\u03BB\u03BB\u03B9\u03B3\u03C1\u03B1\u03C6\u03B9\u03BA\u03AE","tooltip.typewriter":"\u039C\u03B7\u03C7\u03B1\u03BD\u03AE \u03B3\u03C1\u03B1\u03C6\u03AE\u03C2","tooltip.roman-upright":"\u03A1\u03C9\u03BC\u03B1\u03CA\u03BA\u03CC \u039A\u03B1\u03C4\u03B1\u03BA\u03CC\u03C1\u03C5\u03C6\u03BF","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u03A3\u03C4\u03C5\u03BB \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2","menu.accent":"\u03A4\u03CC\u03BD\u03BF\u03C2","menu.decoration":"\u0394\u03B9\u03B1\u03BA\u03CC\u03C3\u03BC\u03B7\u03C3\u03B7","menu.color":"\u03A7\u03C1\u03CE\u03BC\u03B1","menu.background-color":"\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5","menu.cut":"\u0391\u03C0\u03BF\u03BA\u03BF\u03C0\u03AE","menu.copy":"\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE","menu.copy-as-latex":"\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C9\u03C2 LaTeX","menu.copy-as-ascii-math":"\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C9\u03C2 ASCII Math","menu.copy-as-mathml":"\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C9\u03C2 MathML","menu.paste":"\u0395\u03C0\u03B9\u03BA\u03CC\u03BB\u03BB\u03B7\u03C3\u03B7","menu.select-all":"\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD","color.red":"\u039A\u03CC\u03BA\u03BA\u03B9\u03BD\u03BF","color.orange":"\u03A0\u03BF\u03C1\u03C4\u03BF\u03BA\u03B1\u03BB\u03AF","color.yellow":"\u039A\u03AF\u03C4\u03C1\u03B9\u03BD\u03BF","color.lime":"\u039B\u03B1\u03C7\u03B1\u03BD\u03AF","color.green":"\u03A0\u03C1\u03AC\u03C3\u03B9\u03BD\u03BF","color.teal":"\u039A\u03C5\u03B1\u03BD\u03CC","color.cyan":"\u0393\u03B1\u03BB\u03AC\u03B6\u03B9\u03BF","color.blue":"\u039C\u03C0\u03BB\u03B5","color.indigo":"\u0399\u03BD\u03B4\u03B9\u03BA\u03CC","color.purple":"\u039C\u03C9\u03B2","color.magenta":"\u039C\u03B1\u03C4\u03B6\u03AD\u03BD\u03C4\u03B1","color.black":"\u039C\u03B1\u03CD\u03C1\u03BF","color.dark-grey":"\u03A3\u03BA\u03BF\u03CD\u03C1\u03BF \u0393\u03BA\u03C1\u03B9","color.grey":"\u0393\u03BA\u03C1\u03B9","color.light-grey":"\u0391\u03BD\u03BF\u03B9\u03C7\u03C4\u03CC \u0393\u03BA\u03C1\u03B9","color.white":"\u039B\u03B5\u03C5\u03BA\u03CC"},es:{"keyboard.tooltip.symbols":"S\xEDmbolos","keyboard.tooltip.greek":"Letras griegas","keyboard.tooltip.numeric":"Num\xE9rico","keyboard.tooltip.alphabetic":"Letras romanas","tooltip.copy to clipboard":"Copiar al portapapeles","tooltip.redo":"Rehacer","tooltip.toggle virtual keyboard":"Alternar teclado virtual","tooltip.undo":"Deshacer","menu.insert matrix":"A\xF1adir Matriz","menu.borders":"Delimitadores de Matriz","menu.array.add row above":"A\xF1adir L\xEDnea Antes","menu.array.add row below":"A\xF1adir L\xEDnea Despues","menu.array.add column after":"A\xF1adir Columna Despues","menu.array.add column before":"A\xF1adir Columna Antes","menu.array.delete row":"Borrar L\xEDnea","menu.array.delete rows":"Borrar L\xEDneas Seleccionadas","menu.array.delete column":"Borrar Columna","menu.array.delete columns":"Borrar Columnas Seleccionadas","menu.mode":"Modo","menu.mode-math":"Matem\xE1ticas","menu.mode-text":"Texto","menu.mode-latex":"LaTeX","tooltip.blackboard":"Pizarra","tooltip.bold":"Negrita","tooltip.italic":"Cursiva","tooltip.fraktur":"Fraktur","tooltip.script":"Script","tooltip.caligraphic":"Caligr\xE1fico","tooltip.typewriter":"M\xE1quina de escribir","tooltip.roman-upright":"Romano Vertical","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Estilo de fuente","menu.accent":"Acento","menu.decoration":"Decoraci\xF3n","menu.color":"Color","menu.background-color":"Fondo","menu.cut":"Cortar","menu.copy":"Copiar","menu.copy-as-latex":"Copiar como LaTeX","menu.copy-as-ascii-math":"Copiar como ASCII Math","menu.copy-as-mathml":"Copiar como MathML","menu.paste":"Pegar","menu.select-all":"Seleccionar todo","color.red":"Rojo","color.orange":"Naranja","color.yellow":"Amarillo","color.lime":"Lima","color.green":"Verde","color.teal":"Verde azulado","color.cyan":"Cian","color.blue":"Azul","color.indigo":"\xCDndigo","color.purple":"Morado","color.magenta":"Magenta","color.black":"Negro","color.dark-grey":"Gris oscuro","color.grey":"Gris","color.light-grey":"Gris claro","color.white":"Blanco"},fr:{"keyboard.tooltip.symbols":"Symboles","keyboard.tooltip.greek":"Lettres grecques","keyboard.tooltip.numeric":"Num\xE9rique","keyboard.tooltip.alphabetic":"Lettres romaines","tooltip.menu":"Menu","tooltip.copy to clipboard":"Copier dans le presse-papiers","tooltip.redo":"R\xE9tablir","tooltip.toggle virtual keyboard":"Afficher/Masquer le clavier virtuel","tooltip.undo":"Annuler","menu.insert matrix":"Ins\xE9rer une Matrice","menu.borders":"Bords","menu.array.add row above":"Ajouter une Ligne Avant","menu.array.add row below":"Ajouter une Ligne Apr\xE8s","menu.array.add column before":"Ajouter une Colonne Avant","menu.array.add column after":"Ajouter une Colonne Apr\xE8s","menu.array.delete row":"Enlever une Ligne","menu.array.delete rows":"Enlever les Lignes S\xE9lection\xE9es","menu.array.delete column":"Enlever une Colone","menu.array.delete columns":"Enlever les Colonnes S\xE9lection\xE9es","menu.mode":"Mode","menu.mode-math":"Math","menu.mode-text":"Text","menu.mode-latex":"LaTeX","tooltip.blackboard":"Tableau noir","tooltip.bold":"Gras","tooltip.italic":"Italique","tooltip.fraktur":"Fraktur","tooltip.script":"Script","tooltip.caligraphic":"Calligraphique","tooltip.typewriter":"Machine \xE0 \xE9crire","tooltip.roman-upright":"Romain droit","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Style de police","menu.accent":"Accent","menu.decoration":"D\xE9coration","menu.color":"Couleur","menu.background-color":"Arri\xE8re-plan","menu.cut":"Couper","menu.copy":"Copier","menu.copy-as-latex":"Copier en LaTeX","menu.copy-as-ascii-math":"Copier en ASCII Math","menu.copy-as-mathml":"Copier en MathML","menu.paste":"Coller","menu.select-all":"S\xE9lectionner tout","color.red":"Rouge","color.orange":"Orange","color.yellow":"Jaune","color.lime":"Citron vert","color.green":"Vert","color.teal":"Turquoise","color.cyan":"Cyan","color.blue":"Bleu","color.indigo":"Indigo","color.purple":"Violet","color.magenta":"Magenta","color.black":"Noir","color.dark-grey":"Gris fonc\xE9","color.grey":"Gris","color.light-grey":"Gris clair","color.white":"Blanc"},he:{"keyboard.tooltip.symbols":"\u05E1\u05DE\u05DC\u05D9\u05DD","keyboard.tooltip.greek":"\u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05D9\u05D5\u05D5\u05E0\u05D9\u05D5\u05EA","keyboard.tooltip.numeric":"\u05DE\u05E1\u05E4\u05E8\u05D9","keyboard.tooltip.alphabetic":"\u05DE\u05DB\u05EA\u05D1\u05D9\u05DD \u05E8\u05D5\u05DE\u05D9\u05D9\u05DD","tooltip.copy to clipboard":"\u05D4\u05E2\u05EA\u05E7 \u05DC\u05DC\u05D5\u05D7","tooltip.redo":"\u05DC\u05B7\u05E2\u05B2\u05E9\u05C2\u05D5\u05B9\u05EA \u05E9\u05C1\u05D5\u05BC\u05D1","tooltip.toggle virtual keyboard":"\u05D4\u05D7\u05DC\u05E3 \u05D0\u05EA \u05D4\u05DE\u05E7\u05DC\u05D3\u05EA \u05D4\u05D5\u05D5\u05D9\u05E8\u05D8\u05D5\u05D0\u05DC\u05D9\u05EA","tooltip.undo":"\u05DC\u05D1\u05D8\u05DC","menu.insert matrix":"\u05D4\u05DB\u05E0\u05E1 \u05DE\u05D8\u05E8\u05D9\u05E7\u05E1","menu.borders":"\u05DE\u05E4\u05E8\u05D9\u05D3\u05D9 \u05DE\u05D8\u05E8\u05D9\u05E7\u05E1","menu.array.add row above":"\u05D4\u05D5\u05E1\u05E3 \u05E9\u05D5\u05E8\u05D4 \u05D0\u05D7\u05E8\u05D9","menu.array.add row below":"\u05D4\u05D5\u05E1\u05E3 \u05E9\u05D5\u05E8\u05D4 \u05DC\u05E4\u05E0\u05D9","menu.array.add column after":"\u05D4\u05D5\u05E1\u05E3 \u05E2\u05DE\u05D5\u05D3\u05D4 \u05D0\u05D7\u05E8\u05D9","menu.array.add column before":"\u05D4\u05D5\u05E1\u05E3 \u05E2\u05DE\u05D5\u05D3\u05D4 \u05DC\u05E4\u05E0\u05D9","menu.array.delete row":"\u05DE\u05D7\u05E7 \u05E9\u05D5\u05E8\u05D4","menu.array.delete rows":"\u05DE\u05D7\u05E7 \u05E9\u05D5\u05E8\u05D5\u05EA \u05E9\u05E0\u05D1\u05D7\u05E8\u05D5","menu.array.delete column":"\u05DE\u05D7\u05E7 \u05E2\u05DE\u05D5\u05D3\u05D4","menu.array.delete columns":"\u05DE\u05D7\u05E7 \u05E2\u05DE\u05D5\u05D3\u05D5\u05EA \u05E9\u05E0\u05D1\u05D7\u05E8\u05D5","menu.mode":"\u05DE\u05E6\u05D1","menu.mode-math":"\u05DE\u05EA\u05DE\u05D8\u05D9\u05E7\u05D4","menu.mode-text":"\u05D8\u05E7\u05E1\u05D8","menu.mode-latex":"LaTeX","tooltip.blackboard":"\u05DC\u05D5\u05D7 \u05E9\u05D7\u05D5\u05E8","tooltip.bold":"\u05DE\u05D5\u05D3\u05D2\u05E9","tooltip.italic":"\u05E0\u05D8\u05D5\u05D9","tooltip.fraktur":"\u05E4\u05E8\u05E7\u05D8\u05D5\u05E8","tooltip.script":"\u05DB\u05EA\u05D1","tooltip.caligraphic":"\u05E7\u05DC\u05D9\u05D2\u05E8\u05E4\u05D9","tooltip.typewriter":"\u05DE\u05DB\u05D5\u05E0\u05EA \u05DB\u05EA\u05D9\u05D1\u05D4","tooltip.roman-upright":"\u05E8\u05D5\u05DE\u05D9 \u05D9\u05E9\u05E8","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u05E1\u05D2\u05E0\u05D5\u05DF \u05D2\u05D5\u05E4\u05DF","menu.accent":"\u05E6\u05DC\u05D9\u05DC","menu.decoration":"\u05E7\u05D9\u05E9\u05D5\u05D8","menu.color":"\u05E6\u05D1\u05E2","menu.background-color":"\u05E8\u05E7\u05E2","menu.cut":"\u05D2\u05D6\u05D5\u05E8","menu.copy":"\u05D4\u05E2\u05EA\u05E7","menu.copy-as-latex":"\u05D4\u05E2\u05EA\u05E7 \u05DB\u05BELaTeX","menu.copy-as-ascii-math":"\u05D4\u05E2\u05EA\u05E7 \u05DB\u05BEASCII Math","menu.copy-as-mathml":"\u05D4\u05E2\u05EA\u05E7 \u05DB\u05BEMathML","menu.paste":"\u05D4\u05D3\u05D1\u05E7","menu.select-all":"\u05D1\u05D7\u05E8 \u05D4\u05DB\u05DC","color.red":"\u05D0\u05D3\u05D5\u05DD","color.orange":"\u05DB\u05EA\u05D5\u05DD","color.yellow":"\u05E6\u05D4\u05D5\u05D1","color.lime":"\u05D9\u05E8\u05D5\u05E7 \u05DC\u05D9\u05D9\u05DD","color.green":"\u05D9\u05E8\u05D5\u05E7","color.teal":"\u05D8\u05D9\u05DC","color.cyan":"\u05E6\u05D9\u05D0\u05DF","color.blue":"\u05DB\u05D7\u05D5\u05DC","color.indigo":"\u05D0\u05D9\u05E0\u05D3\u05D9\u05D2\u05D5","color.purple":"\u05E1\u05D2\u05D5\u05DC","color.magenta":"\u05DE\u05D2\u05E0\u05D8\u05D4","color.black":"\u05E9\u05D7\u05D5\u05E8","color.dark-grey":"\u05D0\u05E4\u05D5\u05E8 \u05DB\u05D4\u05D4","color.grey":"\u05D0\u05E4\u05D5\u05E8","color.light-grey":"\u05D0\u05E4\u05D5\u05E8 \u05D1\u05D4\u05D9\u05E8","color.white":"\u05DC\u05D1\u05DF"},it:{"keyboard.tooltip.symbols":"Simboli","keyboard.tooltip.greek":"Lettere greche","keyboard.tooltip.numeric":"Numerico","keyboard.tooltip.alphabetic":"Lettere romane","tooltip.copy to clipboard":"Copia negli appunti","tooltip.cut to clipboard":"Taglia negli appunti","tooltip.paste from clipboard":"Incolla dagli appunti","tooltip.redo":"Ripeti","tooltip.toggle virtual keyboard":"Attiva/disattiva tastiera virtuale","tooltip.menu":"Menu","tooltip.undo":"Annulla","menu.borders":"Delimitatori","menu.insert matrix":"Inserisci matrice","menu.array.add row above":"Aggiungi riga sopra","menu.array.add row below":"Aggiungi riga sotto","menu.array.add column after":"Aggiungi colonna dopo","menu.array.add column before":"Aggiungi colonna prima","menu.array.delete row":"Elimina riga","menu.array.delete rows":"Elimina righe selezionate","menu.array.delete column":"Elimina colonna","menu.array.delete columns":"Elimina colonne selezionate","menu.mode":"Modalit\xE0","menu.mode-math":"Matematica","menu.mode-text":"Testo","menu.mode-latex":"LaTeX","menu.insert":"Inserisci","menu.insert.abs":"Valore assoluto","menu.insert.abs-template":"\\left|x\\right|","menu.insert.nth-root":"Radice n-esima","menu.insert.nth-root-template":"\\sqrt[n]{x}","menu.insert.log-base":"Logaritmo in base a","menu.insert.log-base-template":"\\log_a(x)","menu.insert.heading-calculus":"Calcolo","menu.insert.derivative":"Derivata","menu.insert.derivative-template":"\\dfrac{\\mathrm{d}}{\\mathrm{d}x}f(x)\\bigm|_{x=a}","menu.insert.nth-derivative":"Derivata n-esima","menu.insert.nth-derivative-template":"\\dfrac{\\mathrm{d}^n}{\\mathrm{d}x^n}f(x)\\bigm|_{x=a}","menu.insert.integral":"Integrale","menu.insert.integral-template":"$\\int_a^b f(x)\\,\\mathrm{d}x$","menu.insert.sum":"Somma","menu.insert.sum-template":"$\\sum_{i=1}^n x_i$","menu.insert.product":"Prodotto","menu.insert.product-template":"\\prod_{i=1}^n x_i","menu.insert.heading-complex-numbers":"Numeri complessi","menu.insert.modulus":"Modulo","menu.insert.modulus-template":"\\lvert z \\rvert","menu.insert.argument":"Argomento","menu.insert.argument-template":"\\arg(z)","menu.insert.real-part":"Parte reale","menu.insert.real-part-template":"\\Re(z)","menu.insert.imaginary-part":"Parte immaginaria","menu.insert.imaginary-part-template":"\\Im(z)","menu.insert.conjugate":"Coniugato","menu.insert.conjugate-template":"\\overline{z}","tooltip.blackboard":"Lavagna","tooltip.bold":"Grassetto","tooltip.italic":"Corsivo","tooltip.fraktur":"Fraktur","tooltip.script":"Script","tooltip.caligraphic":"Calligrafico","tooltip.typewriter":"Macchina da scrivere","tooltip.roman-upright":"Romano diritto","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Stile carattere","menu.accent":"Accento","menu.decoration":"Decorazione","menu.color":"Colore","menu.background-color":"Sfondo","menu.cut":"Taglia","menu.copy":"Copia","menu.copy-as-latex":"Copia come LaTeX","menu.copy-as-ascii-math":"Copia come ASCII Math","menu.copy-as-mathml":"Copia come MathML","menu.paste":"Incolla","menu.select-all":"Seleziona tutto","color.red":"Rosso","color.orange":"Arancione","color.yellow":"Giallo","color.lime":"Lime","color.green":"Verde","color.teal":"Verde acqua","color.cyan":"Ciano","color.blue":"Blu","color.indigo":"Indaco","color.purple":"Viola","color.magenta":"Magenta","color.black":"Nero","color.dark-grey":"Grigio scuro","color.grey":"Grigio","color.light-grey":"Grigio chiaro","color.white":"Bianco"},ja:{"keyboard.tooltip.symbols":"\u8A18\u53F7","keyboard.tooltip.greek":"\u30AE\u30EA\u30B7\u30A2\u6587\u5B57","keyboard.tooltip.numeric":"\u6570\u5024","keyboard.tooltip.alphabetic":"\u30ED\u30FC\u30DE\u5B57","tooltip.copy to clipboard":"\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC","tooltip.cut to clipboard":"\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u5207\u308A\u53D6\u308A","tooltip.paste from clipboard":"\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u304B\u3089\u8CBC\u308A\u4ED8\u3051","tooltip.redo":"\u3084\u308A\u76F4\u3057","tooltip.toggle virtual keyboard":"\u4EEE\u60F3\u30AD\u30FC\u30DC\u30FC\u30C9\u306E\u5207\u308A\u66FF\u3048","tooltip.menu":"\u30E1\u30CB\u30E5\u30FC","tooltip.undo":"\u5143\u306B\u623B\u3059","menu.borders":"\u884C\u5217\u306E\u533A\u5207\u308A\u6587\u5B57","menu.insert matrix":"\u884C\u5217\u3092\u633F\u5165","menu.array.add row above":"\u5F8C\u306B\u884C\u3092\u8FFD\u52A0","menu.array.add row below":"\u524D\u306B\u884C\u3092\u8FFD\u52A0","menu.array.add column after":"\u5F8C\u306B\u5217\u3092\u8FFD\u52A0","menu.array.add column before":"\u524D\u306B\u5217\u3092\u8FFD\u52A0","menu.array.delete row":"\u884C\u3092\u524A\u9664","menu.array.delete rows":"\u9078\u629E\u3057\u305F\u884C\u3092\u524A\u9664","menu.array.delete column":"\u5217\u3092\u524A\u9664","menu.array.delete columns":"\u9078\u629E\u3057\u305F\u5217\u3092\u524A\u9664","menu.mode":"\u30E2\u30FC\u30C9","menu.mode-math":"\u6570\u5F0F","menu.mode-text":"\u30C6\u30AD\u30B9\u30C8","menu.mode-latex":"LaTeX","menu.insert":"\u633F\u5165","menu.insert.abs":"\u7D76\u5BFE\u5024","menu.insert.nth-root":"n \u4E57\u6839","menu.insert.log-base":"\u5E95\u304C a \u306E\u5BFE\u6570","menu.insert.heading-calculus":"\u5FAE\u7A4D\u5206","menu.insert.derivative":"\u5C0E\u95A2\u6570","menu.insert.nth-derivative":"n \u968E\u5C0E\u95A2\u6570","menu.insert.integral":"\u7A4D\u5206","menu.insert.sum":"\u7DCF\u548C","menu.insert.product":"\u7DCF\u7A4D","menu.insert.heading-complex-numbers":"\u8907\u7D20\u6570","menu.insert.modulus":"\u7D76\u5BFE\u5024","menu.insert.argument":"\u504F\u89D2","menu.insert.real-part":"\u5B9F\u90E8","menu.insert.imaginary-part":"\u865A\u90E8","menu.insert.conjugate":"\u5171\u5F79\u8907\u7D20\u6570","tooltip.blackboard":"\u9ED2\u677F","tooltip.bold":"\u592A\u5B57","tooltip.italic":"\u30A4\u30BF\u30EA\u30C3\u30AF\u4F53","tooltip.fraktur":"\u30D5\u30E9\u30AF\u30C8\u30A5\u30FC\u30EB","tooltip.script":"\u30B9\u30AF\u30EA\u30D7\u30C8","tooltip.caligraphic":"\u30AB\u30EA\u30B0\u30E9\u30D5\u30A3\u30C3\u30AF","tooltip.typewriter":"\u30BF\u30A4\u30D7\u30E9\u30A4\u30BF\u30FC","tooltip.roman-upright":"\u30ED\u30FC\u30DE\u76F4\u7ACB","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u30D5\u30A9\u30F3\u30C8\u30B9\u30BF\u30A4\u30EB","menu.accent":"\u30A2\u30AF\u30BB\u30F3\u30C8","menu.decoration":"\u88C5\u98FE","menu.color":"\u8272","menu.background-color":"\u80CC\u666F","menu.cut":"\u5207\u308A\u53D6\u308A","menu.copy":"\u30B3\u30D4\u30FC","menu.copy-as-latex":"LaTeX \u3068\u3057\u3066\u30B3\u30D4\u30FC","menu.copy-as-typst":"Typst \u3068\u3057\u3066\u30B3\u30D4\u30FC","menu.copy-as-ascii-math":"ASCII Math \u3068\u3057\u3066\u30B3\u30D4\u30FC","menu.copy-as-mathml":"MathML \u3068\u3057\u3066\u30B3\u30D4\u30FC","menu.paste":"\u8CBC\u308A\u4ED8\u3051","menu.select-all":"\u3059\u3079\u3066\u9078\u629E","color.red":"\u8D64","color.orange":"\u30AA\u30EC\u30F3\u30B8","color.yellow":"\u9EC4\u8272","color.lime":"\u30E9\u30A4\u30E0","color.green":"\u7DD1","color.teal":"\u30C6\u30A3\u30FC\u30EB","color.cyan":"\u30B7\u30A2\u30F3","color.blue":"\u9752","color.indigo":"\u30A4\u30F3\u30C7\u30A3\u30B4","color.purple":"\u7D2B","color.magenta":"\u30DE\u30BC\u30F3\u30BF","color.black":"\u9ED2","color.dark-grey":"\u6FC3\u3044\u30B0\u30EC\u30FC","color.grey":"\u30B0\u30EC\u30FC","color.light-grey":"\u8584\u3044\u30B0\u30EC\u30FC","color.white":"\u767D"},ko:{"keyboard.tooltip.symbols":"\uAE30\uD638","keyboard.tooltip.greek":"\uADF8\uB9AC\uC2A4 \uBB38\uC790","keyboard.tooltip.numeric":"\uC22B\uC790","keyboard.tooltip.alphabetic":"\uB85C\uB9C8 \uBB38\uC790","tooltip.copy to clipboard":"\uD074\uB9BD \uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC","tooltip.redo":"\uB2E4\uC2DC \uC2E4\uD589","tooltip.toggle virtual keyboard":"\uAC00\uC0C1 \uD0A4\uBCF4\uB4DC \uC804\uD658","tooltip.undo":"\uC2E4\uD589 \uCDE8\uC18C","menu.insert matrix":"\uD589\uB82C \uC0BD\uC785","menu.borders":"\uD589\uB82C \uAD6C\uBD84 \uAE30\uD638","menu.array.add row above":"\uB4A4\uC5D0 \uD589 \uCD94\uAC00","menu.array.add row below":"\uC55E\uC5D0 \uD589 \uCD94\uAC00","menu.array.add column after":"\uB4A4\uC5D0 \uC5F4 \uCD94\uAC00","menu.array.add column before":"\uC55E\uC5D0 \uC5F4 \uCD94\uAC00","menu.array.delete row":"\uD589 \uC0AD\uC81C","menu.array.delete rows":"\uC120\uD0DD\uD55C \uD589 \uC0AD\uC81C","menu.array.delete column":"\uC5F4 \uC0AD\uC81C","menu.array.delete columns":"\uC120\uD0DD\uD55C \uC5F4 \uC0AD\uC81C","menu.mode":"\uBAA8\uB4DC","menu.mode-math":"\uC218\uC2DD","menu.mode-text":"\uD14D\uC2A4\uD2B8","menu.mode-latex":"LaTeX","tooltip.blackboard":"\uCE60\uD310","tooltip.bold":"\uAD75\uAC8C","tooltip.italic":"\uC774\uD0E4\uB9AD","tooltip.fraktur":"\uD504\uB799\uD22C\uC5B4","tooltip.script":"\uCCA8\uC790","tooltip.caligraphic":"\uD544\uAE30\uCCB4","tooltip.typewriter":"\uD0C0\uC790\uAE30","tooltip.roman-upright":"\uC77C\uBC18 \uB85C\uB9C8\uC790","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\uAE00\uAF34 \uC2A4\uD0C0\uC77C","menu.accent":"\uBC1C\uC74C \uAE30\uD638","menu.decoration":"\uC7A5\uC2DD","menu.color":"\uC0C9\uC0C1","menu.background-color":"\uBC30\uACBD","menu.cut":"\uC798\uB77C\uB0B4\uAE30","menu.copy":"\uBCF5\uC0AC","menu.copy-as-latex":"LaTeX\uB85C \uBCF5\uC0AC","menu.copy-as-ascii-math":"ASCIIMath\uB85C \uBCF5\uC0AC","menu.copy-as-mathml":"MathML\uB85C \uBCF5\uC0AC","menu.paste":"\uBD99\uC5EC\uB123\uAE30","menu.select-all":"\uBAA8\uB450 \uC120\uD0DD","color.red":"\uBE68\uAC15","color.orange":"\uC8FC\uD669","color.yellow":"\uB178\uB791","color.lime":"\uB77C\uC784","color.green":"\uCD08\uB85D","color.teal":"\uCCAD\uB85D","color.cyan":"\uCCAD\uC0C9","color.blue":"\uD30C\uB791","color.indigo":"\uB0A8\uC0C9","color.purple":"\uBCF4\uB77C","color.magenta":"\uC790\uD64D","color.black":"\uAC80\uC815","color.dark-grey":"\uC9C4\uD55C \uD68C\uC0C9","color.grey":"\uD68C\uC0C9","color.light-grey":"\uC5F0\uD55C \uD68C\uC0C9","color.white":"\uD770\uC0C9"},pl:{"keyboard.tooltip.symbols":"Symbolika","keyboard.tooltip.greek":"Litery greckie","keyboard.tooltip.numeric":"Numeryczne","keyboard.tooltip.alphabetic":"Litery rzymskie","tooltip.copy to clipboard":"Kopiuj do Schowka","tooltip.cut to clipboard":"Wytnij ze Schowka","tooltip.paste from clipboard":"Wklej ze Schowka","tooltip.redo":"Przywr\xF3\u0107","tooltip.toggle virtual keyboard":"Prze\u0142\u0105cz klawiatur\u0119 wirtualn\u0105","tooltip.menu":"Menu","tooltip.undo":"Cofnij","menu.borders":"Ograniczniki macierzy","menu.insert matrix":"Wstaw macierz","menu.array.add row above":"Dodaj wiersz przed","menu.array.add row below":"Dodaj wiersz po","menu.array.add column after":"Dodaj kolumn\u0119 po","menu.array.add column before":"Dodaj kolumn\u0119 przed","menu.array.delete row":"Usu\u0144 wiersz","menu.array.delete rows":"Usu\u0144 wybrane wiersze","menu.array.delete column":"Usu\u0144 kolumn\u0119","menu.array.delete columns":"Usu\u0144 wybrane kolumny","menu.mode":"Tryb","menu.mode-math":"Formu\u0142a","menu.mode-text":"Tekst","menu.mode-latex":"LaTeX","menu.insert":"Wstaw","menu.insert.abs":"Warto\u015B\u0107 bezwzgl\u0119dna","menu.insert.abs-template":"\\left|x\\right|","menu.insert.nth-root":"Pierwiastek n-tego stopnia","menu.insert.nth-root-template":"\\sqrt[n]{x}","menu.insert.log-base":"Logarytm o podstawie a","menu.insert.log-base-template":"\\log_a(x)","menu.insert.heading-calculus":"Rachunek r\xF3\u017Cniczkowy i ca\u0142kowy","menu.insert.derivative":"Pochodna","menu.insert.derivative-template":"\\dfrac{\\mathrm{d}}{\\mathrm{d}x}f(x)\\bigm|_{x=a}","menu.insert.nth-derivative":"Pochodna n-tego rz\u0119du","menu.insert.nth-derivative-template":"\\dfrac{\\mathrm{d}^n}{\\mathrm{d}x^n}f(x)\\bigm|_{x=a}","menu.insert.integral":"Ca\u0142ka","menu.insert.integral-template":"$\\int_a^b f(x)\\,\\mathrm{d}x$","menu.insert.sum":"Suma","menu.insert.sum-template":"$\\sum_{i=1}^n x_i$","menu.insert.product":"Iloczyn","menu.insert.product-template":"\\prod_{i=1}^n x_i","menu.insert.heading-complex-numbers":"Liczby zespolone","menu.insert.modulus":"Modu\u0142","menu.insert.modulus-template":"\\lvert z \\rvert","menu.insert.argument":"Argument","menu.insert.argument-template":"\\arg(z)","menu.insert.real-part":"Cz\u0119\u015B\u0107 rzeczywista","menu.insert.real-part-template":"\\Re(z)","menu.insert.imaginary-part":"Cz\u0119\u015B\u0107 urojona","menu.insert.imaginary-part-template":"\\Im(z)","menu.insert.conjugate":"Sprz\u0119\u017Cenie","menu.insert.conjugate-template":"\\overline{z}","tooltip.blackboard":"Tablica","tooltip.bold":"Pogrubienie","tooltip.italic":"Kursywa","tooltip.fraktur":"Fraktura","tooltip.script":"Skrypt","tooltip.caligraphic":"Kaligraficzny","tooltip.typewriter":"Maszynowy","tooltip.roman-upright":"Rzymski prosto","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Styl czcionki","menu.accent":"Akcent","menu.decoration":"Dekoracja","menu.color":"Kolor","menu.background-color":"T\u0142o","menu.cut":"Wytnij","menu.copy":"Kopiuj","menu.copy-as-latex":"Kopiuj jako LaTeX","menu.copy-as-ascii-math":"Kopiuj jako ASCII Math","menu.copy-as-mathml":"Kopiuj jako MathML","menu.paste":"Wklej","menu.select-all":"Zaznacz wszystko","color.red":"Czerwony","color.orange":"Pomara\u0144czowy","color.yellow":"\u017B\xF3\u0142ty","color.lime":"Limetkowy","color.green":"Zielony","color.teal":"Turkusowy","color.cyan":"Cyjan","color.blue":"Niebieski","color.indigo":"Indygo","color.purple":"Fioletowy","color.magenta":"Magenta","color.black":"Czarny","color.dark-grey":"Ciemnoszary","color.grey":"Szary","color.light-grey":"Jasnoszary","color.white":"Bia\u0142y"},pt:{"keyboard.tooltip.symbols":"S\xEDmbolos","keyboard.tooltip.greek":"Letras gregas","keyboard.tooltip.numeric":"Num\xE9rico","keyboard.tooltip.alphabetic":"Letras romanas","tooltip.copy to clipboard":"Copiar para \xE1rea de transfer\xEAncia","tooltip.redo":"Refazer","tooltip.toggle virtual keyboard":"Alternar teclado virtual","tooltip.undo":"Desfazer","menu.insert matrix":"Inserir Matriz","menu.borders":"Delimitadores de matriz","menu.array.add row above":"Adicionar linha depois","menu.array.add row below":"Adicionar linha antes","menu.array.add column after":"Adicionar coluna depois","menu.array.add column before":"Adicionar coluna antes","menu.array.delete row":"Excluir linha","menu.array.delete rows":"Excluir linhas selecionadas","menu.array.delete column":"Apagar Coluna","menu.array.delete columns":"Excluir Colunas Selecionadas","menu.mode":"Modo","menu.mode-math":"F\xF3rmula","menu.mode-text":"Texto","menu.mode-latex":"LaTeX","tooltip.blackboard":"Quadro Negro","tooltip.bold":"Negrito","tooltip.italic":"It\xE1lico","tooltip.fraktur":"Fraktur","tooltip.script":"Script","tooltip.caligraphic":"Caligr\xE1fico","tooltip.typewriter":"M\xE1quina de Escrever","tooltip.roman-upright":"Romano Vertical","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"Estilo da Fonte","menu.accent":"Acento","menu.decoration":"Decora\xE7\xE3o","menu.color":"Cor","menu.background-color":"Cor de Fundo","menu.cut":"Recortar","menu.copy":"Copiar","menu.copy-as-latex":"Copiar como LaTeX","menu.copy-as-ascii-math":"Copiar como ASCII Math","menu.copy-as-mathml":"Copiar como MathML","menu.paste":"Colar","menu.select-all":"Selecionar Tudo","color.red":"Vermelho","color.orange":"Laranja","color.yellow":"Amarelo","color.lime":"Verde Lima","color.green":"Verde","color.teal":"Verde-azulado","color.cyan":"Ciano","color.blue":"Azul","color.indigo":"\xCDndigo","color.purple":"Roxo","color.magenta":"Magenta","color.black":"Preto","color.dark-grey":"Cinza Escuro","color.grey":"Cinza","color.light-grey":"Cinza Claro","color.white":"Branco"},uk:{"keyboard.tooltip.symbols":"\u0421\u0438\u043C\u0432\u043E\u043B\u0438","keyboard.tooltip.greek":"\u0413\u0440\u0435\u0446\u044C\u043A\u0456 \u043B\u0456\u0442\u0435\u0440\u0438","keyboard.tooltip.numeric":"\u0427\u0438\u0441\u043B\u043E\u0432\u0438\u0439","keyboard.tooltip.alphabetic":"\u0420\u0438\u043C\u0441\u044C\u043A\u0456 \u043B\u0456\u0442\u0435\u0440\u0438","tooltip.copy to clipboard":"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0456\u043D\u0443","tooltip.cut to clipboard":"\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0456\u043D\u0443","tooltip.paste from clipboard":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0456\u043D\u0443","tooltip.redo":"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438","tooltip.toggle virtual keyboard":"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438 \u0432\u0456\u0440\u0442\u0443\u0430\u043B\u044C\u043D\u0443 \u043A\u043B\u0430\u0432\u0456\u0430\u0442\u0443\u0440\u0443","tooltip.menu":"\u041C\u0435\u043D\u044E","tooltip.undo":"\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438","menu.borders":"\u041C\u0435\u0436\u0456","menu.insert matrix":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043C\u0430\u0442\u0440\u0438\u0446\u044E","menu.array.add row above":"\u0414\u043E\u0434\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u043F\u0435\u0440\u0435\u0434","menu.array.add row below":"\u0414\u043E\u0434\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u043F\u0456\u0441\u043B\u044F","menu.array.add column after":"\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0435\u0446\u044C \u043F\u0456\u0441\u043B\u044F","menu.array.add column before":"\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0435\u0446\u044C \u043F\u0435\u0440\u0435\u0434","menu.array.delete row":"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0440\u044F\u0434\u043E\u043A","menu.array.delete rows":"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0440\u044F\u0434\u043A\u0438","menu.array.delete column":"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0435\u0446\u044C","menu.array.delete columns":"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0441\u0442\u043E\u0432\u043F\u0446\u0456","menu.mode":"\u0420\u0435\u0436\u0438\u043C","menu.mode-math":"\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430","menu.mode-text":"\u0422\u0435\u043A\u0441\u0442","menu.mode-latex":"LaTeX","menu.insert":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438","menu.insert.abs":"\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F","menu.insert.abs-template":"\\left|x\\right|","menu.insert.nth-root":"\u041A\u043E\u0440\u0456\u043D\u044C n-\u0433\u043E \u0441\u0442\u0435\u043F\u0435\u043D\u044F","menu.insert.nth-root-template":"\\sqrt[n]{x}","menu.insert.log-base":"\u041B\u043E\u0433\u0430\u0440\u0438\u0444\u043C \u0437\u0430 \u043E\u0441\u043D\u043E\u0432\u043E\u044E a","menu.insert.log-base-template":"\\log_a(x)","menu.insert.heading-calculus":"\u041E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u043D\u044F","menu.insert.derivative":"\u041F\u043E\u0445\u0456\u0434\u043D\u0430","menu.insert.derivative-template":"\\dfrac{\\mathrm{d}}{\\mathrm{d}x}f(x)\\bigm|_{x=a}","menu.insert.nth-derivative":"\u041F\u043E\u0445\u0456\u0434\u043D\u0430 n-\u0433\u043E \u043F\u043E\u0440\u044F\u0434\u043A\u0443","menu.insert.nth-derivative-template":"\\dfrac{\\mathrm{d}^n}{\\mathrm{d}x^n}f(x)\\bigm|_{x=a}","menu.insert.integral":"\u0406\u043D\u0442\u0435\u0433\u0440\u0430\u043B","menu.insert.integral-template":"$\\int_a^b f(x)\\,\\mathrm{d}x$","menu.insert.sum":"\u0421\u0443\u043C\u0430","menu.insert.sum-template":"$\\sum_{i=1}^n x_i$","menu.insert.product":"\u0414\u043E\u0431\u0443\u0442\u043E\u043A","menu.insert.product-template":"\\prod_{i=1}^n x_i","menu.insert.heading-complex-numbers":"\u041A\u043E\u043C\u043F\u043B\u0435\u043A\u0441\u043D\u0456 \u0447\u0438\u0441\u043B\u0430","menu.insert.modulus":"\u041C\u043E\u0434\u0443\u043B\u044C","menu.insert.modulus-template":"\\lvert z \\rvert","menu.insert.argument":"\u0410\u0440\u0433\u0443\u043C\u0435\u043D\u0442","menu.insert.argument-template":"\\arg(z)","menu.insert.real-part":"\u0414\u0456\u0439\u0441\u043D\u0430 \u0447\u0430\u0441\u0442\u0438\u043D\u0430","menu.insert.real-part-template":"\\Re(z)","menu.insert.imaginary-part":"\u0423\u044F\u0432\u043D\u0430 \u0447\u0430\u0441\u0442\u0438\u043D\u0430","menu.insert.imaginary-part-template":"\\Im(z)","menu.insert.conjugate":"\u0421\u043F\u0440\u044F\u0436\u0435\u043D\u0435 \u0447\u0438\u0441\u043B\u043E","menu.insert.conjugate-template":"\\overline{z}","tooltip.blackboard":"\u0414\u043E\u0448\u043A\u0430","tooltip.bold":"\u0416\u0438\u0440\u043D\u0438\u0439","tooltip.italic":"\u041A\u0443\u0440\u0441\u0438\u0432","tooltip.fraktur":"\u0424\u0440\u0430\u043A\u0442\u0443\u0440\u043D\u0438\u0439","tooltip.script":"\u0420\u0443\u043A\u043E\u043F\u0438\u0441\u043D\u0438\u0439","tooltip.caligraphic":"\u041A\u0430\u043B\u0456\u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u0439","tooltip.typewriter":"\u0414\u0440\u0443\u043A\u0430\u0440\u0441\u044C\u043A\u0438\u0439","tooltip.roman-upright":"\u041F\u0440\u044F\u043C\u0438\u0439 \u0440\u0438\u043C\u0441\u044C\u043A\u0438\u0439","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u0421\u0442\u0438\u043B\u044C \u0448\u0440\u0438\u0444\u0442\u0443","menu.accent":"\u0410\u043A\u0446\u0435\u043D\u0442","menu.decoration":"\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u043D\u044F","menu.color":"\u041A\u043E\u043B\u0456\u0440","menu.background-color":"\u0424\u043E\u043D","menu.cut":"\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438","menu.copy":"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438","menu.copy-as-latex":"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u044F\u043A LaTeX","menu.copy-as-ascii-math":"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u044F\u043A ASCII Math","menu.copy-as-mathml":"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u044F\u043A MathML","menu.paste":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438","menu.select-all":"\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u0435","color.red":"\u0427\u0435\u0440\u0432\u043E\u043D\u0438\u0439","color.orange":"\u041F\u043E\u043C\u0430\u0440\u0430\u043D\u0447\u0435\u0432\u0438\u0439","color.yellow":"\u0416\u043E\u0432\u0442\u0438\u0439","color.lime":"\u041B\u0430\u0439\u043C\u043E\u0432\u0438\u0439","color.green":"\u0417\u0435\u043B\u0435\u043D\u0438\u0439","color.teal":"\u0411\u0456\u0440\u044E\u0437\u043E\u0432\u0438\u0439","color.cyan":"\u0421\u0438\u043D\u044C\u043E-\u0437\u0435\u043B\u0435\u043D\u0438\u0439","color.blue":"\u0421\u0438\u043D\u0456\u0439","color.indigo":"\u0406\u043D\u0434\u0438\u0433\u043E","color.purple":"\u0424\u0456\u043E\u043B\u0435\u0442\u043E\u0432\u0438\u0439","color.magenta":"\u041F\u0443\u0440\u043F\u0443\u0440\u043D\u0438\u0439","color.black":"\u0427\u043E\u0440\u043D\u0438\u0439","color.dark-grey":"\u0422\u0435\u043C\u043D\u043E-\u0441\u0456\u0440\u0438\u0439","color.grey":"\u0421\u0456\u0440\u0438\u0439","color.light-grey":"\u0421\u0432\u0456\u0442\u043B\u043E-\u0441\u0456\u0440\u0438\u0439","color.white":"\u0411\u0456\u043B\u0438\u0439"},"zh-cn":{"keyboard.tooltip.symbols":"\u7B26\u53F7","keyboard.tooltip.greek":"\u5E0C\u814A\u5B57\u6BCD","keyboard.tooltip.numeric":"\u6570\u5B57","keyboard.tooltip.alphabetic":"\u7F57\u9A6C\u5B57\u6BCD","tooltip.copy to clipboard":"\u590D\u5236\u5230\u526A\u8D34\u677F","tooltip.redo":"\u91CD\u505A","tooltip.toggle virtual keyboard":"\u5207\u6362\u865A\u62DF\u952E\u76D8","tooltip.undo":"\u64A4\u6D88","menu.insert matrix":"\u63D2\u5165\u77E9\u9635","menu.borders":"\u77E9\u9635\u5206\u9694\u7B26","menu.array.add row above":"\u5728\u540E\u9762\u6DFB\u52A0\u884C","menu.array.add row below":"\u5728\u524D\u9762\u6DFB\u52A0\u884C","menu.array.add column after":"\u5728\u540E\u9762\u6DFB\u52A0\u5217r","menu.array.add column before":"\u5728\u524D\u9762\u6DFB\u52A0\u5217","menu.array.delete row":"\u5220\u9664\u884C","menu.array.delete rows":"\u5220\u9664\u9009\u5B9A\u884C","menu.array.delete column":"\u5220\u9664\u5217","menu.array.delete columns":"\u5220\u9664\u9009\u5B9A\u7684\u5217","menu.mode":"\u6A21\u5F0F","menu.mode-math":"\u6570\u5B66","menu.mode-text":"\u6587\u672C","menu.mode-latex":"LaTeX","tooltip.blackboard":"\u9ED1\u677F","tooltip.bold":"\u7C97\u4F53","tooltip.italic":"\u659C\u4F53","tooltip.fraktur":"Fraktur","tooltip.script":"\u811A\u672C","tooltip.caligraphic":"\u8349\u4E66","tooltip.typewriter":"\u6253\u5B57\u673A","tooltip.roman-upright":"\u7F57\u9A6C\u76F4\u7ACB","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u5B57\u4F53\u6837\u5F0F","menu.accent":"\u91CD\u97F3","menu.decoration":"\u88C5\u9970","menu.color":"\u989C\u8272","menu.background-color":"\u80CC\u666F","menu.cut":"\u526A\u5207","menu.copy":"\u590D\u5236","menu.copy-as-latex":"\u590D\u5236\u4E3A LaTeX","menu.copy-as-ascii-math":"\u590D\u5236\u4E3A ASCII Math","menu.copy-as-mathml":"\u590D\u5236\u4E3A MathML","menu.paste":"\u7C98\u8D34","menu.select-all":"\u5168\u9009","color.red":"\u7EA2\u8272","color.orange":"\u6A59\u8272","color.yellow":"\u9EC4\u8272","color.lime":"\u7EFF\u9EC4\u8272","color.green":"\u7EFF\u8272","color.teal":"\u9752\u8272","color.cyan":"\u84DD\u7EFF\u8272","color.blue":"\u84DD\u8272","color.indigo":"\u975B\u84DD\u8272","color.purple":"\u7D2B\u8272","color.magenta":"\u6D0B\u7EA2\u8272","color.black":"\u9ED1\u8272","color.dark-grey":"\u6DF1\u7070\u8272","color.grey":"\u7070\u8272","color.light-grey":"\u6D45\u7070\u8272","color.white":"\u767D\u8272"},"zh-tw":{"keyboard.tooltip.symbols":"\u7B26\u865F","keyboard.tooltip.greek":"\u5E0C\u81D8\u5B57\u6BCD","keyboard.tooltip.numeric":"\u6578\u5B57","keyboard.tooltip.alphabetic":"\u7F85\u99AC\u5B57\u6BCD","tooltip.copy to clipboard":"\u8907\u88FD\u5230\u526A\u8CBC\u677F","tooltip.redo":"\u91CD\u505A","tooltip.toggle virtual keyboard":"\u5207\u63DB\u865B\u64EC\u9375\u76E4","tooltip.undo":"\u64A4\u6D88","menu.insert matrix":"\u63D2\u5165\u77E9\u9663","menu.borders":"\u77E9\u9663\u5206\u9694\u7B26","menu.array.add row above":"\u5728\u5F8C\u9762\u6DFB\u52A0\u884C","menu.array.add row below":"\u5728\u524D\u9762\u6DFB\u52A0\u884C","menu.array.add column after":"\u5728\u5F8C\u9762\u6DFB\u52A0\u5217","menu.array.add column before":"\u5728\u524D\u9762\u6DFB\u52A0\u5217","menu.array.delete row":"\u522A\u9664\u884C","menu.array.delete rows":"\u522A\u9664\u9078\u5B9A\u884C","menu.array.delete column":"\u522A\u9664\u5217","menu.array.delete columns":"\u522A\u9664\u9078\u5B9A\u7684\u5217","menu.mode":"\u6A21\u5F0F","menu.mode-math":"\u6578\u5B78","menu.mode-text":"\u6587\u672C","menu.mode-latex":"LaTeX","tooltip.blackboard":"\u9ED1\u677F","tooltip.bold":"\u7C97\u9AD4","tooltip.italic":"\u659C\u9AD4","tooltip.fraktur":"Fraktur","tooltip.script":"\u8173\u672C","tooltip.caligraphic":"\u8349\u66F8","tooltip.typewriter":"\u6253\u5B57\u6A5F","tooltip.roman-upright":"\u7F85\u99AC\u76F4\u7ACB","tooltip.row-by-col":"%@ \xD7 %@","menu.font-style":"\u5B57\u9AD4\u6A23\u5F0F","menu.accent":"\u91CD\u97F3","menu.decoration":"\u88DD\u98FE","menu.color":"\u984F\u8272","menu.background-color":"\u80CC\u666F","menu.cut":"\u526A\u4E0B","menu.copy":"\u8907\u88FD","menu.copy-as-latex":"\u8907\u88FD\u70BA LaTeX","menu.copy-as-ascii-math":"\u8907\u88FD\u70BA ASCII Math","menu.copy-as-mathml":"\u8907\u88FD\u70BA MathML","menu.paste":"\u8CBC\u4E0A","menu.select-all":"\u5168\u9078","color.red":"\u7D05\u8272","color.orange":"\u6A59\u8272","color.yellow":"\u9EC3\u8272","color.lime":"\u7DA0\u9EC3\u8272","color.green":"\u7DA0\u8272","color.teal":"\u9752\u8272","color.cyan":"\u85CD\u7DA0\u8272","color.blue":"\u85CD\u8272","color.indigo":"\u975B\u85CD\u8272","color.purple":"\u7D2B\u8272","color.magenta":"\u6D0B\u7D05\u8272","color.black":"\u9ED1\u8272","color.dark-grey":"\u6DF1\u7070\u8272","color.grey":"\u7070\u8272","color.light-grey":"\u6DFA\u7070\u8272","color.white":"\u767D\u8272"}};var F={strings:Ku,_locale:"",_dirty:!1,_subscribers:[],_numberFormatter:void 0,get locale(){return F._locale||(F._locale=Le()?navigator.language.slice(0,5):"en-US"),F._locale},set locale(t){F._locale=t,F._numberFormatter=void 0,F.dirty=!0},get numberFormatter(){if(!F._numberFormatter)try{F._numberFormatter=new Intl.NumberFormat(F.locale)}catch(t){try{F._numberFormatter=new Intl.NumberFormat(F.locale.slice(0,2))}catch(e){F._numberFormatter=new Intl.NumberFormat("en-US")}}return F._numberFormatter},merge(t,e){if(typeof t=="string"&&e)F.strings[t]=h(h({},F.strings[t]),e),F.dirty=!0;else for(let r of Object.keys(t))F.merge(r,t[r])},get dirty(){return F._dirty},set dirty(t){F._dirty||F._dirty===t||(F._dirty=!0,setTimeout(()=>{F._dirty=!1,this._subscribers.forEach(e=>e==null?void 0:e())},0))},subscribe(t){return F._subscribers.push(t),F._subscribers.length-1},unsubscribe(t){t<0||t>=F._subscribers.length||(F._subscribers[t]=void 0)},update(t){let e=t.querySelectorAll("[data-l10n-tooltip]");for(let r of e){let i=r.getAttribute("data-l10n-tooltip");if(i){let n=$(i);n&&r.setAttribute("data-tooltip",n)}}e=t.querySelectorAll("[data-l10n-arial-label]");for(let r of e){let i=r.getAttribute("data-l10n-arial-label");if(i){let n=$(i);n&&r.setAttribute("aria-label",n)}}}};function $(t,...e){if(t===void 0)return;let r="",i=F.locale;F.strings[i]&&(r=F.strings[i][t]);let n=i.slice(0,2);if(!r&&F.strings[n]&&(r=F.strings[n][t]),r||(r=F.strings.en[t]),!r)return;let o=/(%@|%([0-9]+)\$@)/g,a=o.exec(r),s=0;for(;a;){if(e[s++]){let c=a[2]?parseInt(a[2],10)-1:s-1,u=e[c];typeof u=="number"&&(u=F.numberFormatter.format(u)),r=r.replace(a[1],u)}a=o.exec(r)}return r=r.replace(/%%/g,"%"),r}var hf={m0:"#3F3D99",m1:"#993D71",m2:"#998B3D",m3:"#3D9956",m4:"#3D5A99",m5:"#993D90",m6:"#996D3D",m7:"#43993D",m8:"#3D7999",m9:"#843D99"},pf={blue:"#0072BD",orange:"#D95319",yellow:"#EDB120",purple:"#7E2F8E",green:"#77AC30",cyan:"#4DBEEE",red:"#A2142F"},Qt={red:"#fbbbb6",orange:"#ffe0c2",yellow:"#fff1c2",lime:"#d0e8b9",green:"#bceac4",teal:"#b9f1f1",cyan:"#b8e5c9",blue:"#b6d9fb",indigo:"#d1c2f0",purple:"#e3baf8",magenta:"#f9c8e0",black:"#353535","dark-grey":"#8C8C8C",grey:"#D0D0D0","light-grey":"#F0F0F0",white:"#ffffff"},er={red:"#d7170b",orange:"#fe8a2b",yellow:"#ffc02b",lime:"#63b215",green:"#21ba3a",teal:"#17cfcf",cyan:"#13a7ec",blue:"#0d80f2",indigo:"#63c",purple:"#a219e6",magenta:"#eb4799",black:"#000","dark-grey":"#666",grey:"#A6A6A6","light-grey":"#d4d5d2",white:"#ffffff"},Pu={Red:"red",Orange:"orange",Yellow:"yellow",LimeGreen:"lime",Green:"green",TealBlue:"teal",Blue:"blue",Violet:"indigo",Purple:"purple",Magenta:"magenta",Black:"black",Gray:"grey",White:"white"},ff={Apricot:"#FBB982",Aquamarine:"#00B5BE",Bittersweet:"#C04F17",Black:"#221E1F",Blue:"#2D2F92",BlueGreen:"#00B3B8",BlueViolet:"#473992",BrickRed:"#B6321C",Brown:"#792500",BurntOrange:"#F7921D",CadetBlue:"#74729A",CarnationPink:"#F282B4",Cerulean:"#00A2E3",CornflowerBlue:"#41B0E4",Cyan:"#00AEEF",Dandelion:"#FDBC42",DarkOrchid:"#A4538A",Emerald:"#00A99D",ForestGreen:"#009B55",Fuchsia:"#8C368C",Goldenrod:"#FFDF42",Gray:"#949698",Green:"#00A64F",GreenYellow:"#DFE674",JungleGreen:"#00A99A",Lavender:"#F49EC4",Limegreen:"#8DC73E",Magenta:"#EC008C",Mahogany:"#A9341F",Maroon:"#AF3235",Melon:"#F89E7B",MidnightBlue:"#006795",Mulberry:"#A93C93",NavyBlue:"#006EB8",OliveGreen:"#3C8031",Orange:"#F58137",OrangeRed:"#ED135A",Orchid:"#AF72B0",Peach:"#F7965A",Periwinkle:"#7977B8",PineGreen:"#008B72",Plum:"#92268F",ProcessBlue:"#00B0F0",Purple:"#99479B",RawSienna:"#974006",Red:"#ED1B23",RedOrange:"#F26035",RedViolet:"#A1246B",Rhodamine:"#EF559F",RoyalBlue:"#0071BC",RoyalPurple:"#613F99",RubineRed:"#ED017D",Salmon:"#F69289",SeaGreen:"#3FBC9D",Sepia:"#671800",SkyBlue:"#46C5DD",SpringGreen:"#C6DC67",Tan:"#DA9D76",TealBlue:"#00AEB3",Thistle:"#D883B7",Turquoise:"#00B4CE",Violet:"#58429B",VioletRed:"#EF58A0",White:"#FFFFFF",WildStrawberry:"#EE2967",Yellow:"#FFF200",YellowGreen:"#98CC70",YellowOrange:"#FAA21A"};function Yr(t){var u,d,m,p,f,y;let e=t.split("!"),r,i,n,o=255,a=255,s=255,l=-1,c=e.length>0&&e[0].startsWith("-");c&&(e[0]=e[0].slice(1));for(let v=0;v=0&&(o=(1-l)*o+l*r,a=(1-l)*a+l*i,s=(1-l)*s+l*n,l=-1),v+1=0&&(o=l*o+(1-l)*r,a=l*a+(1-l)*i,s=l*s+(1-l)*n),c&&(o=255-o,a=255-a,s=255-s),"#"+("00"+Math.round(o).toString(16)).slice(-2)+("00"+Math.round(a).toString(16)).slice(-2)+("00"+Math.round(s).toString(16)).slice(-2)}function Bi(t){var e,r;return t=t.trim(),(r=(e=Qt[t.toLowerCase()])!=null?e:Qt[Pu[t]])!=null?r:Yr(t)}function gf(t){if(!t||t[0]!=="#")return;t=t.slice(1);let e;return t.length<=4?(e={r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16)},t.length===4&&(e.a=parseInt(t[3]+t[3],16)/255)):(e={r:parseInt(t[0]+t[1],16),g:parseInt(t[2]+t[3],16),b:parseInt(t[4]+t[5],16)},t.length===8&&(e.a=parseInt(t[6]+t[7],16)/255)),e&&e.a===void 0&&(e.a=1),e}function ul(t,e,r){return r<0&&(r+=6),r>=6&&(r-=6),r<1?(e-t)*r+t:r<3?e:r<4?(e-t)*(4-r)+t:t}function bf(t){let[e,r,i]=[t.h,t.s,t.l];e=(e+360)%360/60,i=Math.max(0,Math.min(i,1)),r=Math.max(0,Math.min(r,1));let n=i<=.5?i*(r+1):i+r-i*r,o=i*2-n;return{r:Math.round(255*ul(o,n,e+2)),g:Math.round(255*ul(o,n,e)),b:Math.round(255*ul(o,n,e-2))}}function dl(t){return t<0?0:t>255?255:Math.round(t)}function yf(t){let{r:e,g:r,b:i}=t,n=((1<<24)+(dl(e)<<16)+(dl(r)<<8)+dl(i)).toString(16).slice(1);return n[0]===n[1]&&n[2]===n[3]&&n[4]===n[5]&&n[6]===n[7]&&(n=n[0]+n[2]+n[4]),"#"+n}function xf(t){let{r:e,g:r,b:i}=t;e=e/255,r=r/255,i=i/255;let n=Math.min(e,r,i),o=Math.max(e,r,i),a=o-n,s,l;o===n?s=0:e===o?s=(r-i)/a:r===o?s=2+(i-e)/a:i===o&&(s=4+(e-r)/a),s=Math.min(s*60,360),s<0&&(s+=360);let c=(n+o)/2;return o===n?l=0:c<=.5?l=a/(o+n):l=a/(2-o-n),{h:s,s:l,l:c}}function Ru(t){let e=gf(t);if(!e)return t;let{h:r,s:i,l:n}=xf(e);return i+=.1,n-=.1,yf(bf({h:r,s:i,l:n}))}var hl={60:"\\lt",62:"\\gt",111:"o",38:"\\&",123:"\\lbrace",125:"\\rbrace",91:"\\lbrack",93:"\\rbrack",58:"\\colon",160:"~",172:"\\neg",183:"\\cdot",188:"\\frac{1}{4}",189:"\\frac{1}{2}",190:"\\frac{3}{4}",8304:"^{0}",8305:"^{i}",185:"^{1}",178:"^{2}",179:"^{3}",8224:"\\dagger",8225:"\\ddagger",8230:"\\ldots",8308:"^{4}",8309:"^{5}",8310:"^{6}",8311:"^{7}",8312:"^{8}",8313:"^{9}",8314:"^{+}",8315:"^{-}",8316:"^{=}",8319:"^{n}",8320:"_{0}",8321:"_{1}",8322:"_{2}",8323:"_{3}",8324:"_{4}",8325:"_{5}",8326:"_{6}",8327:"_{7}",8328:"_{8}",8329:"_{9}",8330:"_{+}",8331:"_{-}",8332:"_{=}",8336:"_{a}",8337:"_{e}",8338:"_{o}",8339:"_{x}",8242:"\\prime",39:"\\prime",8592:"\\gets",8594:"\\to",9651:"\\triangle",9661:"\\triangledown",8715:"\\owns",8727:"\\ast",8739:"\\vert",8741:"\\Vert",8743:"\\land",8744:"\\lor",8901:"\\cdot",8904:"\\bowtie",8800:"\\ne",8804:"\\le",8805:"\\ge",8869:"\\bot",10178:"\\perp",10231:"\\biconditional",10232:"\\impliedby",10233:"\\implies",10234:"\\iff",8450:"\\mathbb{C}",8469:"\\mathbb{N}",8473:"\\mathbb{P}",8474:"\\mathbb{Q}",8477:"\\mathbb{R}",8484:"\\mathbb{Z}",8461:"\\mathbb{H}",8476:"\\Re",8465:"\\Im",42:"\\ast",11036:"\\square",9633:"\\square",8720:"\\coprod",8716:"\\not\\ni",9671:"\\diamond",8846:"\\uplus",8851:"\\sqcap",8852:"\\sqcup",8768:"\\wr",8750:"\\oint",8226:"\\textbullet",8722:"-",978:"\\Upsilon"},ml={119893:8462,119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500,120070:8493,120075:8460,120076:8465,120085:8476,120093:8488,120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484},Iu=[{start:119808,len:26,offset:65,style:"bold"},{start:119834,len:26,offset:97,style:"bold"},{start:120488,len:25,offset:913,style:"bold"},{start:120514,len:25,offset:945,style:"bold"},{start:119860,len:26,offset:65,style:"italic"},{start:119886,len:26,offset:97,style:"italic"},{start:120546,len:25,offset:913,style:"italic"},{start:120572,len:25,offset:945,style:"italic"},{start:119912,len:26,offset:65,style:"bolditalic"},{start:119938,len:26,offset:97,style:"bolditalic"},{start:120604,len:25,offset:913,style:"bolditalic"},{start:120630,len:25,offset:945,style:"bolditalic"},{start:120782,len:10,offset:48,variant:"main",style:"bold"},{start:119964,len:26,offset:65,variant:"script"},{start:119990,len:26,offset:97,variant:"script"},{start:120016,len:26,offset:65,variant:"script",style:"bold"},{start:120042,len:26,offset:97,variant:"script",style:"bold"},{start:120068,len:26,offset:65,variant:"fraktur"},{start:120094,len:26,offset:97,variant:"fraktur"},{start:120172,len:26,offset:65,variant:"fraktur",style:"bold"},{start:120198,len:26,offset:97,variant:"fraktur",style:"bold"},{start:120120,len:26,offset:65,variant:"double-struck"},{start:120146,len:26,offset:97,variant:"double-struck"},{start:120792,len:10,offset:48,variant:"double-struck"},{start:120432,len:26,offset:65,variant:"monospace"},{start:120458,len:26,offset:97,variant:"monospace"},{start:120822,len:10,offset:48,variant:"monospace"},{start:120224,len:26,offset:65,variant:"sans-serif"},{start:120250,len:26,offset:97,variant:"sans-serif"},{start:120276,len:26,offset:65,variant:"sans-serif",style:"bold"},{start:120302,len:26,offset:97,variant:"sans-serif",style:"bold"},{start:120328,len:26,offset:65,variant:"sans-serif",style:"italic"},{start:120354,len:26,offset:97,variant:"sans-serif",style:"italic"},{start:120380,len:26,offset:65,variant:"sans-serif",style:"bolditalic"},{start:120406,len:26,offset:97,variant:"sans-serif",style:"bolditalic"},{start:120662,len:25,offset:913,variant:"sans-serif",style:"bold"},{start:120688,len:25,offset:945,variant:"sans-serif",style:"bold"},{start:120720,len:25,offset:913,variant:"sans-serif",style:"bolditalic"},{start:120746,len:25,offset:945,variant:"sans-serif",style:"bolditalic"},{start:120803,len:10,offset:48,variant:"sans-serif"},{start:120812,len:10,offset:48,variant:"sans-serif",style:"bold"}];function Bn(t,e,r){if(!/[A-Za-z\d]/.test(t)||(r==="up"&&(r=void 0),!e&&!r))return;let i=t.codePointAt(0);if(i===void 0)return t;for(let n of Iu)if((!e||n.variant===e)&&(!r||n.style===r)&&i>=n.offset&&i120831)&&(t<8448||t>8527))return{char:String.fromCodePoint(t)};for(let r in ml)if(ml[r]===t){t=(e=r.codePointAt(0))!=null?e:0;break}for(let r of Iu)if(t>=r.start&&t[]$&*#^_%:'\u02DC".includes(t)||t.length>1)return;let e=(a=t.codePointAt(0))!=null?a:0,r=hl[e];if(r)return r;let{char:i,variant:n,style:o}=vf(e);if(!(!n&&!o)){switch(r=i,n){case"double-struck":r=`\\mathbb{${r}}`;break;case"fraktur":r=`\\mathfrak{${r}}`;break;case"script":r=`\\mathscr{${r}}`;break;case"sans-serif":r=`\\mathsf{${r}}`;break;case"monospace":r=`\\mathtt{${r}}`;break;case"calligraphic":r=`\\mathcal{${r}}`;break}switch(o){case"bold":r=`\\mathbf{${r}}`;break;case"italic":r=`\\mathit{${r}}`;break;case"bolditalic":r=`\\mathbfit{${r}}`;break}return r}}function T(t){return t?Array.isArray(t)?t:typeof t=="object"&&"group"in t?t.group:[]:[]}var Kn={},Xo=h({},hl),Pi={},fl={},_f={darr:"\\downarrow",dArr:"\\Downarrow",Darr:"\\Downarrow",lang:"\\langle",rang:"\\rangle",uarr:"\\uparrow",uArr:"\\Uparrow",Uarr:"\\Uparrow",C:"\\mathbb{C}",H:"\\mathbb{H}",N:"\\mathbb{N}",Q:"\\mathbb{Q}",R:"\\mathbb{R}",Z:"\\mathbb{Z}",alef:"\\aleph",alefsym:"\\aleph",Alpha:"\\mathrm{A}",Beta:"\\mathrm{B}",bull:"\\bullet",Chi:"\\mathrm{X}",clubs:"\\clubsuit",cnums:"\\mathbb{C}",Complex:"\\mathbb{C}",Dagger:"\\ddagger",diamonds:"\\diamondsuit",doublecap:"\\Cap",doublecup:"\\Cup",empty:"\\emptyset",Epsilon:"\\mathrm{E}",Eta:"\\mathrm{H}",exist:"\\exists",hArr:"\\Leftrightarrow",harr:"\\leftrightarrow",Harr:"\\Leftrightarrow",hearts:"\\heartsuit",image:"\\Im",infin:"\\infty",Iota:"\\mathrm{I}",isin:"\\in",Kappa:"\\mathrm{K}",larr:"\\leftarrow",Larr:"\\Leftarrow",lArr:"\\Leftarrow",lrarr:"\\leftrightarrow",Lrarr:"\\Leftrightarrow",lrArr:"\\Leftrightarrow",Mu:"\\mathrm{M}",natnums:"\\mathbb{N}",Nu:"\\mathrm{N}",Omicron:"\\mathrm{O}",part:"\\partial",plusmn:"\\pm",rarr:"\\rightarrow",Rarr:"\\Rightarrow",rArr:"\\Rightarrow",real:"\\Re",reals:"\\mathbb{R}",Reals:"\\mathbb{R}",restriction:"\\upharpoonright",Rho:"\\mathrm{P}",sdot:"\\cdot",sect:"\\S",spades:"\\spadesuit",sub:"\\subset",sube:"\\subseteq",supe:"\\supseteq",Tau:"\\mathrm{T}",thetasym:"\\vartheta",varcoppa:"\\coppa",weierp:"\\wp",Zeta:"\\mathrm{Z}"},Mf={varGamma:"\\mathit{\\Gamma}",varDelta:"\\mathit{\\Delta}",varTheta:"\\mathit{\\Theta}",varLambda:"\\mathit{\\Lambda}",varXi:"\\mathit{\\Xi}",varPi:"\\mathit{\\Pi}",varSigma:"\\mathit{\\Sigma}",varUpsilon:"\\mathit{\\Upsilon}",varPhi:"\\mathit{\\Phi}",varPsi:"\\mathit{\\Psi}",varOmega:"\\mathit{\\Omega}",pmod:{def:"\\quad(\\operatorname{mod}\\ #1)",args:1,expand:!1,captureSelection:!1},mod:{def:"\\quad\\operatorname{mod}\\,\\,#1",args:1,expand:!1},bmod:{def:"\\;\\mathbin{\\operatorname{mod }}",expand:!1}},wf={bra:{def:"\\mathinner{\\langle{#1}|}",args:1,captureSelection:!1},ket:{def:"\\mathinner{|{#1}\\rangle}",args:1,captureSelection:!1},braket:{def:"\\mathinner{\\langle{#1}\\rangle}",args:1,captureSelection:!1},set:{def:"\\mathinner{\\lbrace #1 \\rbrace}",args:1,captureSelection:!1},Bra:{def:"\\left\\langle #1\\right|",args:1,captureSelection:!1},Ket:{def:"\\left|#1\\right\\rangle",args:1,captureSelection:!1},Braket:{def:"\\left\\langle{#1}\\right\\rangle",args:1,captureSelection:!1},Set:{def:"\\left\\lbrace #1 \\right\\rbrace",args:1,captureSelection:!1}},Sf={strut:{primitive:!0,def:"\\phantom{\\rule[0.3\\baselineskip]{0}{0.7\\baselineskip}}",args:0,captureSelection:!0},iff:{primitive:!0,captureSelection:!0,def:"\\;\\Longleftrightarrow\\;"},nicefrac:"^{#1}\\!\\!/\\!_{#2}",phase:{def:"\\enclose{phasorangle}{#1}",args:1,captureSelection:!1},rd:"\\mathrm{d}",rD:"\\mathrm{D}",odif:"\\mathrm{d}",doubleStruckCapitalN:"\\mathbb{N}",doubleStruckCapitalR:"\\mathbb{R}",doubleStruckCapitalQ:"\\mathbb{Q}",doubleStruckCapitalZ:"\\mathbb{Z}",doubleStruckCapitalP:"\\mathbb{P}",scriptCapitalE:"\\mathscr{E}",scriptCapitalH:"\\mathscr{H}",scriptCapitalL:"\\mathscr{L}",gothicCapitalC:"\\mathfrak{C}",gothicCapitalH:"\\mathfrak{H}",gothicCapitalI:"\\mathfrak{I}",gothicCapitalR:"\\mathfrak{R}",imaginaryI:"\\mathrm{i}",imaginaryJ:"\\mathrm{j}",exponentialE:"\\mathrm{e}",differentialD:"\\mathrm{d}",capitalDifferentialD:"\\mathrm{D}",mathstrut:{def:"\\vphantom{(}",primitive:!0},angl:"\\enclose{actuarial}{#1}",angln:"\\enclose{actuarial}{n}",anglr:"\\enclose{actuarial}{r}",anglk:"\\enclose{actuarial}{k}",mathtools:{primitive:!0,package:{ordinarycolon:":",vcentcolon:"\\mathrel{\\mathop\\ordinarycolon}",dblcolon:'{\\mathop{\\char"2237}}',coloneqq:'{\\mathop{\\char"2254}}',Coloneqq:'{\\mathop{\\char"2A74}}',coloneq:'{\\mathop{\\char"2254}}',Coloneq:'{\\mathop{\\char"2A74}}',eqqcolon:'{\\mathop{\\char"2255}}',Eqqcolon:'{\\mathop{\\char"3D\\char"2237}}',eqcolon:'{\\mathop{\\char"2255}}',Eqcolon:'{\\mathop{\\char"3D\\char"2237}}',colonapprox:'{\\mathop{\\char"003A\\char"2248}}',Colonapprox:'{\\mathop{\\char"2237\\char"2248}}',colonsim:'{\\mathop{\\char"3A\\char"223C}}',Colonsim:'{\\mathop{\\char"2237\\char"223C}}',colondash:"\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}",Colondash:"\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}",dashcolon:"\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}",Dashcolon:"\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}"}},ratio:"\\vcentcolon",coloncolon:"\\dblcolon",colonequals:"\\coloneq",coloncolonequals:"\\Coloneq",equalscolon:"\\eqcolon",equalscoloncolon:"\\Eqcolon",colonminus:"\\colondash",coloncolonminus:"\\Colondash",minuscolon:"\\dashcolon",minuscoloncolon:"\\Dashcolon",coloncolonapprox:"\\Colonapprox",coloncolonsim:"\\Colonsim",simcolon:"\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}",Simcolon:"\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}",simcoloncolon:"\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}",approxcolon:"\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}",Approxcolon:"\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}",approxcoloncolon:"\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}",notni:"\\mathrel{\\char`\u220C}",limsup:"\\operatorname*{lim\\,sup}",liminf:"\\operatorname*{lim\\,inf}",injlim:"\\operatorname*{inj\\,lim}",projlim:"\\operatorname*{proj\\,lim}",varlimsup:"\\operatorname*{\\overline{lim}}",varliminf:"\\operatorname*{\\underline{lim}}",varinjlim:"\\operatorname*{\\underrightarrow{lim}}",varprojlim:"\\operatorname*{\\underleftarrow{lim}}",argmin:"\\operatorname*{arg\\,min}",argmax:"\\operatorname*{arg\\,max}",plim:"\\mathop{\\operatorname{plim}}\\limits",tripledash:{def:"\\vphantom{-}\\raise{4mu}{\\mkern1.5mu\\rule{2mu}{1.5mu}\\mkern{2.25mu}\\rule{2mu}{1.5mu}\\mkern{2.25mu}\\rule{2mu}{1.5mu}\\mkern{2mu}}",expand:!0},"braket.sty":{package:wf},"amsmath.sty":{package:Mf,primitive:!0},"texvc.sty":{package:_f,primitive:!1}},Ki={" ":32,"\\!":33,"\\#":35,"\\$":36,"\\%":37,"\\&":38,"\\_":95,"-":45,"\\textunderscore":95,"\\euro":8364,"\\maltese":10016,"\\{":123,"\\}":125,"\\textbraceleft":123,"\\textbraceright":125,"\\lbrace":123,"\\rbrace":125,"\\lbrack":91,"\\rbrack":93,"\\nobreakspace":160,"\\ldots":8230,"\\textellipsis":8230,"\\backslash":92,"`":8216,"'":8217,"``":8220,"''":8221,"\\degree":176,"\\textasciicircum":94,"\\textasciitilde":126,"\\textasteriskcentered":42,"\\textbackslash":92,"\\textbullet":8226,"\\textdollar":36,"\\textsterling":163,"\\textdagger":8224,"\\textdaggerdbl":8225,"\u2013":8211,"\u2014":8212,"\u2018":8216,"\u2019":8217,"\u201C":8220,"\u201D":8221,'"':8221,"\\ss":223,"\\ae":230,"\\oe":339,"\\AE":198,"\\OE":338,"\\O":216,"\\i":305,"\\j":567,"\\aa":229,"\\AA":197},$u=/[\w!@*()-=+{}\[\]\\';:?/.,~<>`|$%#&^" ]/,Zo,Qr;gu()?(Zo=new RegExp("\\p{Letter}","u"),Qr=new RegExp("[0-9\\p{Letter}]","u")):(Zo=/[a-zA-ZаАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяĄąĆćĘꣳŃńÓóŚśŹźŻżàâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞìíòúÌÍÒÚáñÁÑ]/,Qr=/[\da-zA-ZаАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяĄąĆćĘꣳŃńÓóŚśŹźŻżàâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞìíòúÌÍÒÚáñÁÑ]/);function pl(t,e,r="mord",i){e!==void 0&&(Kn[t]={definitionType:"symbol",type:r,variant:i,codepoint:e},Xo[e]||(Xo[e]=t))}function Se(t,e,r){if(typeof t=="string"){for(let i=0;i{var l,c;return a.frequency===s.frequency?a.match.length===s.match.length?a.matcha.match)}function Nu(t){let e="auto",r=t.match(/:([^=]+)/);return r&&(e=r[1].trim()),e}function Yo(t){if(!t)return[];let e=[],r=t.split("]");if(r[0].startsWith("[")){e.push({isOptional:!0,type:Nu(r[0].slice(1))});for(let i=1;i<=r.length;i++)e.push(...Yo(r[i]))}else if(r=t.split("}"),r[0].startsWith("{")){e.push({isOptional:!1,type:Nu(r[0].slice(1))});for(let i=1;i<=r.length;i++)e.push(...Yo(r[i]))}return e}function bl(t){if(!t)return"";let e="",r=!0;for(let i of t)typeof i.value=="string"?e+=i.value:r=!1;return r?e:""}function Tt(t,e,r){typeof t=="string"&&(t=[t]);let n={tabular:!0,rootOnly:!1,params:Yo(e),createAtom:r};for(let o of t)fl[o]=n}function Qo(t,e,r){var n;typeof t=="string"&&(t=[t]);let i={tabular:(n=r==null?void 0:r.tabular)!=null?n:!1,rootOnly:!0,params:[],createAtom:e};for(let o of t)fl[o]=i}function M(t,e,r){var n,o;r||(r={});let i={definitionType:"function",params:Yo(e),ifMode:r.ifMode,isFunction:(n=r.isFunction)!=null?n:!1,applyMode:r.applyMode,infix:(o=r.infix)!=null?o:!1,parse:r.parse,createAtom:r.createAtom,applyStyle:r.applyStyle,serialize:r.serialize,render:r.render};if(typeof t=="string")Pi["\\"+t]=i;else for(let a of t)Pi["\\"+a]=i}var Jo;function Ri(t){return Jo||(Jo=ei(Sf)),t?ei(h(h({},Jo),t)):Jo}function Fu(t,e){var r,i,n,o;if(typeof t=="string"){let a=0,s=t;return/(^|[^\\])#1/.test(s)&&(a=1),/(^|[^\\])#2/.test(s)&&(a=2),/(^|[^\\])#3/.test(s)&&(a=3),/(^|[^\\])#4/.test(s)&&(a=4),/(^|[^\\])#5/.test(s)&&(a=5),/(^|[^\\])#6/.test(s)&&(a=6),/(^|[^\\])#7/.test(s)&&(a=7),/(^|[^\\])#8/.test(s)&&(a=8),/(^|[^\\])#9/.test(s)&&(a=9),{expand:(r=e==null?void 0:e.expand)!=null?r:!0,captureSelection:(i=e==null?void 0:e.captureSelection)!=null?i:!0,args:a,def:s}}return h({expand:(n=e==null?void 0:e.expand)!=null?n:!0,captureSelection:(o=e==null?void 0:e.captureSelection)!=null?o:!0,args:0},t)}function ei(t){if(!t)return{};let e={};for(let r of Object.keys(t)){let i=t[r];if(i==null)delete e[r];else if(typeof i=="object"&&"package"in i)for(let n of Object.keys(i.package))e[n]=Fu(i.package[n],{expand:!i.primitive,captureSelection:i.captureSelection});else e[r]=Fu(i)}return e}function ne(t,e="math"){if(!t||t.length===0)return null;let r=null;if(t.startsWith("\\")){if(r=Pi[t],r)return!r.ifMode||r.ifMode===e?r:null;e==="math"?r=Kn[t]:Ki[t]&&(r={definitionType:"symbol",type:"mord",codepoint:Ki[t]})}else if(e==="math"){if(r=Kn[t],!r&&t.length===1){let i=yl("math",t.codePointAt(0));return i.startsWith("\\")?g(h({},ne(i,"math")),{command:i}):null}}else Ki[t]?r={definitionType:"symbol",type:"mord",codepoint:Ki[t]}:e==="text"&&(r={definitionType:"symbol",type:"mord",codepoint:t.codePointAt(0)});return r!=null?r:null}function ti(t,e){if(!t.startsWith("\\"))return null;let r=t.slice(1);return e[r]}function yl(t,e){if(e===void 0)return"";if(t==="math"&&Xo[e])return Xo[e];if(t==="text"){let r=Object.keys(Ki).find(i=>Ki[i]===e);return r||String.fromCodePoint(e)}return String.fromCodePoint(e)}var tt=[0,.68889,0,0,.72222],ri=[0,.68889,0,0,.66667],xl=[0,.68889,0,0,.77778],ea=[0,.68889,0,0,.61111],Hu=[.16667,.68889,0,0,.77778],Pn=[0,.68889,0,0,.55556],Z=[0,0,0,0,.25],Wu=[0,.825,0,0,2.33334],Uu=[0,.9,0,0,2.33334],ta=[0,.68889,0,0,.54028],vl=[-.03598,.46402,0,0,.5],Be=[-.13313,.36687,0,0,1],ra=[.01354,.52239,0,0,1],Gu=[.01354,.52239,0,0,1.11111],ju=[0,.54986,0,0,1],ia=[0,.69224,0,0,.5],_l=[0,.43056,0,0,1],xr=[.08198,.58198,0,0,.77778],na=[.19444,.69224,0,0,.41667],oa=[.1808,.675,0,0,1],Ju=[.19444,.69224,0,0,.83334],Xu=[.13667,.63667,0,0,1],Zu=[-.064,.437,0,0,1.334],vr=[.08167,.58167,0,0,.77778],Rn=[0,.69224,0,0,.72222],Ml=[0,.69224,0,0,.66667],aa=[-.13313,.36687,0,0,.77778],Yu=[.06062,.54986,0,0,.77778],sa=[0,.69224,0,0,.77778],Ii=[.25583,.75583,0,0,.77778],Dt=[.25142,.75726,0,0,.77778],zi=[.20576,.70576,0,0,.77778],dt=[.30274,.79383,0,0,.77778],In=[.22958,.72958,0,0,.77778],Qu=[.1808,.675,0,0,.77778],Ot=[.13667,.63667,0,0,.77778],qe=[.13597,.63597,0,0,.77778],_r=[.03517,.54986,0,0,.77778],Ni=[0,.675,0,0,.77778],ed=[.19444,.69224,0,0,.61111],td=[0,.54986,0,0,.76042],rd=[0,.54986,0,0,.66667],Mr=[.0391,.5391,0,0,.77778],id=[.03517,.54986,0,0,1.33334],nd=[.38569,.88569,0,0,.77778],la=[.23222,.74111,0,0,.77778],od=[.19444,.69224,0,0,.77778],ad=[0,.37788,0,0,.5],ca=[0,.54986,0,0,.72222],sd=[0,.69224,0,0,.83334],ld=[.11111,.69224,0,0,.66667],Fi=[.26167,.75726,0,0,.77778],cd=[.48256,.98256,0,0,.77778],ud=[.28481,.79383,0,0,.77778],dd=[.08167,.58167,0,0,.22222],md=[.08167,.58167,0,0,.38889],hd=[0,.43056,.04028,0,.66667],pd=[.41951,.91951,0,0,.77778],fd=[.24982,.74947,0,0,.38865],gd=[.08319,.58283,0,0,.75623],bd=[0,.10803,0,0,.27764],wl=[0,.47534,0,0,.50181],zn=[.18906,.47534,0,0,.50181],yd=[0,.69141,0,0,.50181],xd=[.24982,.74947,0,0,.27764],Sl=[0,.69141,0,0,.21471],ua=[.25,.75,0,0,.44722],rt=[0,.64444,0,0,.575],$i=[.08556,.58556,0,0,.89444],da=[0,.69444,0,0,.89444],ma=[0,.68611,0,0,.9],kl=[0,.68611,0,0,.86944],wr=[.25,.75,0,0,.575],ha=[.25,.75,0,0,.31944],ii=[0,.69444,0,0,.63889],Vi=[0,.69444,0,0,.31944],vd=[0,.44444,0,0,.63889],_d=[0,.44444,0,0,.51111],Sr=[0,.69444,0,0,.575],mt=[.13333,.63333,0,0,.89444],Md=[0,.44444,0,0,.31944],wd=[0,.69444,0,0,.86944],Sd=[0,.68611,0,0,.69166],pa=[0,.68611,0,0,.83055],Ll=[0,.68611,0,0,.89444],Al=[0,.69444,0,0,.60278],kd=[.19444,.69444,0,0,.51111],Ld=[0,.69444,0,0,.83055],Bt=[-.10889,.39111,0,0,1.14999],Ad=[.19444,.69444,0,0,.575],Nn=[.19444,.69444,0,0,1.14999],Cd=[.19444,.69444,0,0,.70277],Ed=[.05556,.75,0,0,.575],Cl=[0,.68611,0,0,.95833],Td=[.08556,.58556,0,0,.76666],El=[-.02639,.47361,0,0,.575],Dd=[0,.44444,0,0,.89444],ni=[0,.55556,0,0,.76666],Od=[-.10889,.39111,0,0,.89444],Tl=[.00222,.50222,0,0,.89444],kr=[.19667,.69667,0,0,.89444],Bd=[.08556,.58556,0,0,1.14999],Dl=[0,.69444,0,0,.70277],fa=[-.02778,.47222,0,0,.575],ga=[.25,.75,0,0,.51111],Kd=[-.13889,.36111,0,0,1.14999],Pd=[.19444,.69444,0,0,1.02222],ba=[.12963,.69444,0,0,.89444],Rd=[.19444,.69444,0,0,.44722],Lr=[0,.64444,.13167,0,.59111],Id=[.19444,.64444,.13167,0,.59111],Ol=[0,.68611,.17208,0,.8961],zd=[.19444,.44444,.105,0,.53222],Nd=[0,.44444,.085,0,.82666],Fd=[0,.69444,.06709,0,.59111],ya=[0,.69444,.12945,0,.35555],$d=[0,.69444,0,0,.94888],Bl=[0,.69444,.11472,0,.59111],Vd=[0,.68611,.10778,0,.88555],qd=[0,.69444,.07939,0,.62055],xa=[0,.69444,.12417,0,.30667],Ar=[0,.64444,.13556,0,.51111],Hd=[.19444,.64444,.13556,0,.51111],va=[0,.68333,.16389,0,.74333],Wd=[.19444,.43056,.08847,0,.46],Ud=[0,.43056,.07514,0,.71555],Gd=[0,.69444,.06646,0,.51111],jd=[0,.69444,0,0,.83129],Jd=[0,.69444,.1225,0,.51111],Xd=[0,.68333,.09403,0,.76666],Zd=[0,.68333,.11111,0,.76666],Yd=[0,.69444,.06961,0,.51444],tr=[0,.69444,0,0,.27778],qi=[.25,.75,0,0,.38889],it=[0,.64444,0,0,.5],oi=[0,.69444,0,0,.77778],ai=[0,.68333,0,0,.75],Fn=[0,.68333,0,0,.77778],Qd=[0,.68333,0,0,.68056],$n=[0,.68333,0,0,.72222],rr=[.25,.75,0,0,.5],_a=[.25,.75,0,0,.27778],ke=[0,.69444,0,0,.5],Hi=[0,.69444,0,0,.55556],Kl=[0,.43056,0,0,.44445],Vn=[0,.43056,0,0,.5],em=[.19444,.43056,0,0,.55556],tm=[0,.43056,0,0,.55556],nt=[.08333,.58333,0,0,.77778],rm=[0,.43056,0,0,.27778],im=[0,.66786,0,0,.27778],nm=[0,.69444,0,0,.75],om=[0,.66786,0,0,.5],am=[0,.68333,0,0,.625],Pl=[.19444,.69444,0,0,.44445],qn=[0,.69444,0,0,.72222],sm=[.19444,.69444,0,0,.5],Hn=[.19444,.69444,0,0,1],lm=[.011,.511,0,0,1.126],Rl=[.19444,.69444,0,0,.61111],Il=[.05556,.75,0,0,.5],cm=[0,.68333,0,0,.83334],um=[.0391,.5391,0,0,.66667],zl=[-.05555,.44445,0,0,.5],dm=[0,.43056,0,0,.77778],si=[0,.55556,0,0,.66667],Ma=[-.03625,.46375,0,0,.77778],mm=[-.01688,.48312,0,0,.77778],hm=[.0391,.5391,0,0,1],Cr=[0,.69444,0,0,.61111],wa=[-.03472,.46528,0,0,.5],Sa=[.25,.75,0,0,.44445],pm=[-.14236,.35764,0,0,1],ka=[.244,.744,0,0,.412],fm=[.19444,.69444,0,0,.88889],La=[.12963,.69444,0,0,.77778],gm=[.19444,.69444,0,0,.38889],bm=[.011,.511,0,0,1.638],ym=[.19444,.69444,0,0,0],Aa=[0,.44444,0,0,.575],Wn=[.19444,.44444,0,0,.575],xm=[0,.68611,0,0,.75555],vm=[0,.69444,0,0,.66759],_m=[0,.68611,0,0,.80555],Mm=[0,.68611,.08229,0,.98229],wm=[0,.68611,0,0,.76666],Sm=[0,.44444,0,0,.58472],km=[.19444,.44444,0,0,.6118],Un=[.19444,.43056,0,0,.5],Lm=[0,.68333,.02778,.08334,.76278],Am=[0,.68333,.08125,.05556,.83125],Cm=[0,.43056,0,.05556,.48472],Em=[.19444,.43056,0,.08334,.51702],Tm=[.25,.75,0,0,.42778],Ce=[0,.69444,0,0,.55],ir=[0,.69444,0,0,.73334],Er=[0,.69444,0,0,.79445],Dm=[0,.69444,0,0,.51945],Nl=[0,.69444,0,0,.70278],Om=[0,.69444,0,0,.76389],Bm=[.25,.75,0,0,.34306],Fl=[0,.69444,0,0,.56111],Km=[0,.69444,0,0,.25556],Pm=[.19444,.45833,0,0,.56111],Rm=[0,.45833,0,0,.56111],Ca=[0,.69444,0,0,.30556],Im=[0,.69444,0,0,.58056],zm=[0,.69444,0,0,.67223],$l=[0,.69444,0,0,.85556],Vl=[0,.69444,0,0,.55834],Kt=[0,.65556,.11156,0,.5],ql=[0,.69444,.08094,0,.70834],Hl=[.17014,0,0,0,.44445],Nm=[0,.69444,.0799,0,.5],Fm=[0,.69444,0,0,.73752],$m=[0,.69444,.09205,0,.5],Vm=[0,.69444,.09031,0,.77778],Wl=[0,.69444,.07816,0,.27778],qm=[0,.69444,.00316,0,.5],Hm=[.19444,.69444,0,0,.83334],Wm=[.05556,.75,0,0,.83334],Um=[0,.75,0,0,.5],Gm=[.125,.08333,0,0,.27778],jm=[0,.08333,0,0,.27778],Pt=[0,.65556,0,0,.5],Ul=[0,.69444,0,0,.47222],nr=[0,.69444,0,0,.66667],Jm=[0,.69444,0,0,.59722],Gl=[0,.69444,0,0,.54167],jl=[0,.69444,0,0,.70834],Xm=[.25,.75,0,0,.28889],Jl=[0,.69444,0,0,.51667],Zm=[0,.44444,0,0,.44445],Ym=[.19444,.44444,0,0,.51667],Qm=[0,.44444,0,0,.38333],e0=[0,.44444,0,0,.51667],t0=[0,.69444,0,0,.83334],r0=[.35001,.85,0,0,.45834],i0=[.35001,.85,0,0,.57778],n0=[.35001,.85,0,0,.41667],o0=[.35001,.85,0,0,.58334],Ea=[0,.72222,0,0,.55556],a0=[1e-5,.6,0,0,.66667],s0=[1e-5,.6,0,0,.77778],l0=[.25001,.75,0,0,.94445],c0=[.306,.805,.19445,0,.47222],u0=[.30612,.805,.19445,0,.47222],Wi=[.25001,.75,0,0,.83334],Ui=[.35001,.85,0,0,.47222],Xl=[.25001,.75,0,0,1.11111],d0=[.65002,1.15,0,0,.59722],m0=[.65002,1.15,0,0,.81111],h0=[.65002,1.15,0,0,.47222],p0=[.65002,1.15,0,0,.66667],Ta=[0,.75,0,0,1],f0=[.55001,1.05,0,0,1.27778],g0=[.862,1.36,.44445,0,.55556],b0=[.86225,1.36,.44445,0,.55556],Gi=[.55001,1.05,0,0,1.11111],Da=[.65002,1.15,0,0,.52778],y0=[.65002,1.15,0,0,.61111],Zl=[.55001,1.05,0,0,1.51112],x0=[.95003,1.45,0,0,.73611],v0=[.95003,1.45,0,0,1.04445],_0=[.95003,1.45,0,0,.52778],Oa=[.95003,1.45,0,0,.75],Ba=[0,.75,0,0,1.44445],Ka=[.95003,1.45,0,0,.58334],M0=[1.25003,1.75,0,0,.79167],w0=[1.25003,1.75,0,0,1.27778],S0=[1.25003,1.75,0,0,.58334],Pa=[1.25003,1.75,0,0,.80556],Ra=[0,.825,0,0,1.8889],Ia=[1.25003,1.75,0,0,.63889],za=[.64502,1.155,0,0,.875],k0=[1e-5,.6,0,0,.875],Yl=[-99e-5,.601,0,0,.66667],Na=[.64502,1.155,0,0,.66667],L0=[1e-5,.9,0,0,.88889],A0=[.65002,1.15,0,0,.88889],C0=[.90001,0,0,0,.88889],E0=[-.00499,.605,0,0,1.05556],Fa=[0,.12,0,0,.45],B=[0,.61111,0,0,.525],ht=[.08333,.69444,0,0,.525],T0=[-.08056,.53055,0,0,.525],D0=[-.05556,.55556,0,0,.525],Re=[0,.43056,0,0,.525],Gn=[.22222,.43056,0,0,.525],O0=[0,0,0,0,.525],B0={"AMS-Regular":{32:Z,65:tt,66:ri,67:tt,68:tt,69:ri,70:ea,71:xl,72:xl,73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:xl,76:ri,77:[0,.68889,0,0,.94445],78:tt,79:Hu,80:ea,81:Hu,82:tt,83:Pn,84:ri,85:tt,86:tt,87:[0,.68889,0,0,1],88:tt,89:tt,90:ri,107:Pn,160:Z,165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:Pn,295:ta,710:Wu,732:Uu,770:Wu,771:Uu,989:vr,1008:hd,8245:[0,.54986,0,0,.275],8463:ta,8487:tt,8498:Pn,8502:ri,8503:[0,.68889,0,0,.44445],8504:ri,8513:[0,.68889,0,0,.63889],8592:vl,8594:vl,8602:Be,8603:Be,8606:ra,8608:ra,8610:Gu,8611:Gu,8619:ju,8620:ju,8621:[-.13313,.37788,0,0,1.38889],8622:Be,8624:ia,8625:ia,8630:_l,8631:_l,8634:xr,8635:xr,8638:na,8639:na,8642:na,8643:na,8644:oa,8646:oa,8647:oa,8648:Ju,8649:oa,8650:Ju,8651:ra,8652:ra,8653:Be,8654:Be,8655:Be,8666:Xu,8667:Xu,8669:[-.13313,.37788,0,0,1],8672:Zu,8674:Zu,8705:[0,.825,0,0,.5],8708:Pn,8709:vr,8717:[0,.43056,0,0,.42917],8722:vl,8724:[.08198,.69224,0,0,.77778],8726:vr,8733:sa,8736:Rn,8737:Rn,8738:[.03517,.52239,0,0,.72222],8739:dd,8740:[.25142,.74111,0,0,.27778],8741:md,8742:[.25142,.74111,0,0,.5],8756:Ml,8757:Ml,8764:aa,8765:[-.13313,.37788,0,0,.77778],8769:aa,8770:Ma,8774:dt,8776:mm,8778:vr,8782:Yu,8783:Yu,8785:xr,8786:xr,8787:xr,8790:sa,8791:In,8796:[.08198,.91667,0,0,.77778],8806:Ii,8807:Ii,8808:Dt,8809:Dt,8812:[.25583,.75583,0,0,.5],8814:zi,8815:zi,8816:dt,8817:dt,8818:In,8819:In,8822:Qu,8823:Qu,8828:Ot,8829:Ot,8830:In,8831:In,8832:zi,8833:zi,8840:dt,8841:dt,8842:qe,8843:qe,8847:_r,8848:_r,8858:xr,8859:xr,8861:xr,8862:Ni,8863:Ni,8864:Ni,8865:Ni,8872:[0,.69224,0,0,.61111],8873:Rn,8874:[0,.69224,0,0,.88889],8876:ea,8877:ea,8878:tt,8879:tt,8882:_r,8883:_r,8884:Ot,8885:Ot,8888:[0,.54986,0,0,1.11111],8890:em,8891:ed,8892:ed,8901:[0,.54986,0,0,.27778],8903:vr,8905:vr,8906:vr,8907:sa,8908:sa,8909:[-.03598,.46402,0,0,.77778],8910:td,8911:td,8912:_r,8913:_r,8914:rd,8915:rd,8916:Ml,8918:Mr,8919:Mr,8920:id,8921:id,8922:nd,8923:nd,8926:Ot,8927:Ot,8928:dt,8929:dt,8934:la,8935:la,8936:la,8937:la,8938:zi,8939:zi,8940:dt,8941:dt,8994:od,8995:od,9416:[.15559,.69224,0,0,.90222],9484:ia,9488:ia,9492:ad,9496:ad,9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:Ni,9633:Ni,9650:ca,9651:ca,9654:_r,9660:ca,9661:ca,9664:_r,9674:ld,9733:[.19444,.69224,0,0,.94445],10003:sd,10016:sd,10731:ld,10846:[.19444,.75583,0,0,.61111],10877:Ot,10878:Ot,10885:Ii,10886:Ii,10887:qe,10888:qe,10889:Fi,10890:Fi,10891:cd,10892:cd,10901:Ot,10902:Ot,10933:Dt,10934:Dt,10935:Fi,10936:Fi,10937:Fi,10938:Fi,10949:Ii,10950:Ii,10955:ud,10956:ud,57350:dd,57351:md,57352:vr,57353:hd,57356:Dt,57357:Dt,57358:pd,57359:dt,57360:dt,57361:pd,57366:Dt,57367:Dt,57368:Dt,57369:Dt,57370:qe,57371:qe},"Caligraphic-Regular":{32:Z,65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:Z},"Fraktur-Regular":{32:Z,33:[0,.69141,0,0,.29574],34:Sl,38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:fd,41:fd,42:[0,.62119,0,0,.27764],43:gd,44:bd,45:gd,46:bd,47:[.24982,.74947,0,0,.50181],48:wl,49:wl,50:wl,51:zn,52:zn,53:zn,54:yd,55:zn,56:yd,57:zn,58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:xd,93:xd,94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:Z,8216:Sl,8217:Sl,58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:Z,33:[0,.69444,0,0,.35],34:Al,35:[.19444,.69444,0,0,.95833],36:Ed,37:[.05556,.75,0,0,.95833],38:da,39:Vi,40:ua,41:ua,42:[0,.75,0,0,.575],43:mt,44:[.19444,.15556,0,0,.31944],45:Qm,46:[0,.15556,0,0,.31944],47:wr,48:rt,49:rt,50:rt,51:rt,52:rt,53:rt,54:rt,55:rt,56:rt,57:rt,58:Md,59:[.19444,.44444,0,0,.31944],60:$i,61:Od,62:$i,63:[0,.69444,0,0,.54305],64:da,65:kl,66:[0,.68611,0,0,.81805],67:pa,68:[0,.68611,0,0,.88194],69:xm,70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:ma,73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:Sd,77:[0,.68611,0,0,1.09166],78:ma,79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:kl,89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:ha,92:wr,93:ha,94:Sr,95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:ii,99:_d,100:ii,101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:ii,105:Vi,106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:Vi,109:[0,.44444,0,0,.95833],110:vd,111:Aa,112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:vd,118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:_d,123:wr,124:ha,125:wr,126:[.35,.34444,0,0,.575],160:Z,163:[0,.69444,0,0,.86853],168:Sr,172:[0,.44444,0,0,.76666],176:wd,177:mt,184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:mt,216:[.04861,.73472,0,0,.89444],223:Jm,230:[0,.44444,0,0,.83055],247:mt,248:[.09722,.54167,0,0,.575],305:Md,338:[0,.68611,0,0,1.16944],339:Dd,567:[.19444,.44444,0,0,.35139],710:Sr,711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:Sr,715:Sr,728:Sr,729:Vi,730:wd,732:Sr,733:Sr,915:Sd,916:Cl,920:Ll,923:_m,926:wm,928:ma,931:pa,933:Ll,934:pa,936:Ll,937:pa,8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:Vi,8217:Vi,8220:Al,8221:Al,8224:kd,8225:kd,8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:vm,8465:Ld,8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:Ld,8501:Dl,8592:Bt,8593:Ad,8594:Bt,8595:Ad,8596:Bt,8597:wr,8598:Nn,8599:Nn,8600:Nn,8601:Nn,8636:Bt,8637:Bt,8640:Bt,8641:Bt,8656:Bt,8657:Cd,8658:Bt,8659:Cd,8660:Bt,8661:[.25,.75,0,0,.70277],8704:ii,8706:[0,.69444,.06389,0,.62847],8707:ii,8709:Ed,8711:Cl,8712:Td,8715:Td,8722:mt,8723:mt,8725:wr,8726:wr,8727:fa,8728:El,8729:El,8730:[.18,.82,0,0,.95833],8733:Dd,8734:[0,.44444,0,0,1.14999],8736:Rn,8739:ha,8741:wr,8743:ni,8744:ni,8745:ni,8746:ni,8747:[.19444,.69444,.12778,0,.56875],8764:Od,8768:[.19444,.69444,0,0,.31944],8771:Tl,8776:[.02444,.52444,0,0,.89444],8781:Tl,8801:Tl,8804:kr,8805:kr,8810:Bd,8811:Bd,8826:$i,8827:$i,8834:$i,8835:$i,8838:kr,8839:kr,8846:ni,8849:kr,8850:kr,8851:ni,8852:ni,8853:mt,8854:mt,8855:mt,8856:mt,8857:mt,8866:Dl,8867:Dl,8868:da,8869:da,8900:El,8901:[-.02639,.47361,0,0,.31944],8902:fa,8968:ga,8969:ga,8970:ga,8971:ga,8994:Kd,8995:Kd,9651:Pd,9657:fa,9661:Pd,9667:fa,9711:Nn,9824:ba,9825:ba,9826:ba,9827:ba,9837:[0,.75,0,0,.44722],9838:Rd,9839:Rd,10216:ua,10217:ua,10815:ma,10927:kr,10928:kr,57376:ym},"Main-BoldItalic":{32:Z,33:[0,.69444,.11417,0,.38611],34:qd,35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:ya,40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:Lr,49:Lr,50:Lr,51:Lr,52:Id,53:Lr,54:Lr,55:Id,56:Lr,57:Lr,58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:Bl,64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:Ol,73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:Ol,79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:Fd,95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:zd,104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:zd,114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:Z,168:[0,.69444,.11473,0,.59111],176:$d,184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:Nd,248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:Nd,567:[.19444,.44444,.04611,0,.385],710:Fd,711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:ya,730:$d,732:Bl,733:Bl,915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:Ol,931:[0,.68611,.11431,0,.82666],933:Vd,934:[0,.68611,.05632,0,.82666],936:Vd,937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:ya,8217:ya,8220:[0,.69444,.16772,0,.62055],8221:qd},"Main-Italic":{32:Z,33:xa,34:Yd,35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:xa,40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:Ar,49:Ar,50:Ar,51:Ar,52:Hd,53:Ar,54:Ar,55:Hd,56:Ar,57:Ar,58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:Jd,64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:va,73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:va,79:Xd,80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:va,86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:Gd,95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:Wd,104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:Wd,114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:Z,168:[0,.66786,.10474,0,.51111],176:jd,184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:Ud,248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:Ud,710:Gd,711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:jd,732:[0,.66786,.11585,0,.51111],733:Jd,915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:Xd,923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:va,931:[0,.68333,.12028,0,.71555],933:Zd,934:[0,.68333,.05986,0,.71555],936:Zd,937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:xa,8217:xa,8220:[0,.69444,.1685,0,.51444],8221:Yd,8463:ta},"Main-Regular":{32:Z,33:tr,34:ke,35:Hm,36:Il,37:Wm,38:oi,39:tr,40:qi,41:qi,42:Um,43:nt,44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:rr,48:it,49:it,50:it,51:it,52:it,53:it,54:it,55:it,56:it,57:it,58:rm,59:[.19444,.43056,0,0,.27778],60:Mr,61:aa,62:Mr,63:Ul,64:oi,65:ai,66:[0,.68333,0,0,.70834],67:$n,68:[0,.68333,0,0,.76389],69:Qd,70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:ai,73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:Fn,76:am,77:[0,.68333,0,0,.91667],78:ai,79:Fn,80:Qd,81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:$n,85:ai,86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:ai,89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:_a,92:rr,93:_a,94:ke,95:[.31,.12056,.02778,0,.5],97:Vn,98:Hi,99:Kl,100:Hi,101:Kl,102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:Hi,105:im,106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:tr,109:[0,.43056,0,0,.83334],110:tm,111:Vn,112:em,113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:tm,118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:Kl,123:rr,124:_a,125:rr,126:[.35,.31786,0,0,.5],160:Z,163:[0,.69444,0,0,.76909],167:Pl,168:om,172:[0,.43056,0,0,.66667],176:nm,177:nt,182:Rl,184:Hl,198:[0,.68333,0,0,.90278],215:nt,216:[.04861,.73194,0,0,.77778],223:ke,230:[0,.43056,0,0,.72222],247:nt,248:[.09722,.52778,0,0,.5],305:rm,338:[0,.68333,0,0,1.01389],339:dm,567:[.19444,.43056,0,0,.30556],710:ke,711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:ke,715:ke,728:ke,729:im,730:nm,732:om,733:ke,915:am,916:cm,920:Fn,923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:ai,931:$n,933:Fn,934:$n,936:Fn,937:$n,8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:tr,8217:tr,8220:ke,8221:ke,8224:Pl,8225:Pl,8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:ta,8465:qn,8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:qn,8501:Cr,8592:Be,8593:sm,8594:Be,8595:sm,8596:Be,8597:rr,8598:Hn,8599:Hn,8600:Hn,8601:Hn,8614:[.011,.511,0,0,1],8617:lm,8618:lm,8636:Be,8637:Be,8640:Be,8641:Be,8652:[.011,.671,0,0,1],8656:Be,8657:Rl,8658:Be,8659:Rl,8660:Be,8661:[.25,.75,0,0,.61111],8704:Hi,8706:[0,.69444,.05556,.08334,.5309],8707:Hi,8709:Il,8711:cm,8712:um,8715:um,8722:nt,8723:nt,8725:rr,8726:rr,8727:wa,8728:zl,8729:zl,8730:[.2,.8,0,0,.83334],8733:dm,8734:_l,8736:Rn,8739:_a,8741:rr,8743:si,8744:si,8745:si,8746:si,8747:[.19444,.69444,.11111,0,.41667],8764:aa,8768:[.19444,.69444,0,0,.27778],8771:Ma,8773:[-.022,.589,0,0,1],8776:mm,8781:Ma,8784:[-.133,.67,0,0,.778],8801:Ma,8804:qe,8805:qe,8810:hm,8811:hm,8826:Mr,8827:Mr,8834:Mr,8835:Mr,8838:qe,8839:qe,8846:si,8849:qe,8850:qe,8851:si,8852:si,8853:nt,8854:nt,8855:nt,8856:nt,8857:nt,8866:Cr,8867:Cr,8868:oi,8869:oi,8872:[.249,.75,0,0,.867],8900:zl,8901:[-.05555,.44445,0,0,.27778],8902:wa,8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:Sa,8969:Sa,8970:Sa,8971:Sa,8994:pm,8995:pm,9136:ka,9137:ka,9651:fm,9657:wa,9661:fm,9667:wa,9711:Hn,9824:La,9825:La,9826:La,9827:La,9837:[0,.75,0,0,.38889],9838:gm,9839:gm,10216:qi,10217:qi,10222:ka,10223:ka,10229:[.011,.511,0,0,1.609],10230:bm,10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:bm,10815:ai,10927:qe,10928:qe,57376:ym},"Math-BoldItalic":{32:Z,48:Aa,49:Aa,50:Aa,51:Wn,52:Wn,53:Wn,54:rt,55:Wn,56:rt,57:Wn,65:kl,66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:Mm,73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:xm,77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:vm,105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:Sm,112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:Z,915:[0,.68611,.15972,0,.65694],916:Cl,920:[0,.68611,.03194,0,.86722],923:_m,926:[0,.68611,.07458,0,.84125],928:Mm,931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:wm,936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:Sm,960:[0,.44444,.03704,0,.68241],961:km,962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:km,1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:Z,48:Vn,49:Vn,50:Vn,51:Un,52:Un,53:Un,54:it,55:Un,56:it,57:Un,65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:Am,73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:Lm,80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:Cm,112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:Z,915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:Lm,923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:Am,931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:Cm,960:[0,.43056,.03588,0,.57003],961:Em,962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:Em,1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:Z,33:[0,.69444,0,0,.36667],34:Vl,35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:Ca,40:Tm,41:Tm,42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:Ce,49:Ce,50:Ce,51:Ce,52:Ce,53:Ce,54:Ce,55:Ce,56:Ce,57:Ce,58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:Dm,64:ir,65:ir,66:ir,67:Nl,68:Er,69:[0,.69444,0,0,.64167],70:Cr,71:ir,72:Er,73:[0,.69444,0,0,.33056],74:Dm,75:Om,76:Im,77:[0,.69444,0,0,.97778],78:Er,79:Er,80:Nl,81:[.10556,.69444,0,0,.79445],82:Nl,83:Cr,84:ir,85:Om,86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:ir,89:[0,.69444,.0275,0,.73334],90:zm,91:Bm,93:Bm,94:Ce,95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:Fl,99:[0,.45833,0,0,.48889],100:Fl,101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:Fl,105:Km,106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:Km,109:[0,.45833,0,0,.86667],110:Rm,111:[0,.45833,0,0,.55],112:Pm,113:Pm,114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:Rm,118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:Z,168:Ce,176:ir,180:Ce,184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:Ce,711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:Ce,729:Ca,730:ir,732:Ce,733:Ce,915:Im,916:[0,.69444,0,0,.91667],920:$l,923:zm,926:ir,928:Er,931:Er,933:$l,934:Er,936:$l,937:Er,8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:Ca,8217:Ca,8220:Vl,8221:Vl},"SansSerif-Italic":{32:Z,33:[0,.69444,.05733,0,.31945],34:qm,35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:Wl,40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:Gm,45:[0,.44444,.01946,0,.33333],46:jm,47:[.25,.75,.13164,0,.5],48:Kt,49:Kt,50:Kt,51:Kt,52:Kt,53:Kt,54:Kt,55:Kt,56:Kt,57:Kt,58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:nr,66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:ql,73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:Gl,77:[0,.69444,.08094,0,.875],78:ql,79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:Nm,95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:Z,168:[0,.67937,.06385,0,.5],176:Fm,184:Hl,305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:Nm,711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:$m,715:ke,728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:Fm,732:[0,.67659,.08826,0,.5],733:$m,915:[0,.69444,.13372,0,.54167],916:t0,920:[0,.69444,.07555,0,.77778],923:Cr,926:[0,.69444,.12816,0,.66667],928:ql,931:[0,.69444,.11983,0,.72222],933:Vm,934:[0,.69444,.04603,0,.72222],936:Vm,937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:Wl,8217:Wl,8220:[0,.69444,.14205,0,.5],8221:qm},"SansSerif-Regular":{32:Z,33:[0,.69444,0,0,.31945],34:ke,35:Hm,36:Il,37:Wm,38:[0,.69444,0,0,.75834],39:tr,40:qi,41:qi,42:Um,43:nt,44:Gm,45:[0,.44444,0,0,.33333],46:jm,47:rr,48:Pt,49:Pt,50:Pt,51:Pt,52:Pt,53:Pt,54:Pt,55:Pt,56:Pt,57:Pt,58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:Ul,64:nr,65:nr,66:nr,67:ii,68:[0,.69444,0,0,.72223],69:Jm,70:[0,.69444,0,0,.56945],71:nr,72:jl,73:tr,74:Ul,75:[0,.69444,0,0,.69445],76:Gl,77:[0,.69444,0,0,.875],78:jl,79:[0,.69444,0,0,.73611],80:ii,81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:Hi,84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:nr,89:[0,.69444,.025,0,.66667],90:Cr,91:Xm,93:Xm,94:ke,95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:Jl,99:Zm,100:Jl,101:Zm,102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:Jl,105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:e0,111:[0,.44444,0,0,.5],112:Ym,113:Ym,114:[0,.44444,.01389,0,.34167],115:Qm,116:[0,.57143,0,0,.36111],117:e0,118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:Z,168:[0,.67937,0,0,.5],176:nr,184:Hl,305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:ke,711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:ke,715:ke,728:ke,729:[0,.67937,0,0,.27778],730:nr,732:[0,.67659,0,0,.5],733:ke,915:Gl,916:t0,920:oi,923:Cr,926:nr,928:jl,931:qn,933:oi,934:qn,936:oi,937:qn,8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:tr,8217:tr,8220:ke,8221:ke},"Script-Regular":{32:Z,65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:Z},"Size1-Regular":{32:Z,40:r0,41:r0,47:i0,91:n0,92:i0,93:n0,123:o0,125:o0,160:Z,710:Ea,732:Ea,770:Ea,771:Ea,8214:[-99e-5,.601,0,0,.77778],8593:a0,8595:a0,8657:s0,8659:s0,8719:l0,8720:l0,8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:u0,8748:c0,8749:c0,8750:u0,8896:Wi,8897:Wi,8898:Wi,8899:Wi,8968:Ui,8969:Ui,8970:Ui,8971:Ui,9168:Yl,10216:Ui,10217:Ui,10752:Xl,10753:Xl,10754:Xl,10756:Wi,10758:Wi},"Size2-Regular":{32:Z,40:d0,41:d0,47:m0,91:h0,92:m0,93:h0,123:p0,125:p0,160:Z,710:Ta,732:Ta,770:Ta,771:Ta,8719:f0,8720:f0,8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:b0,8748:g0,8749:g0,8750:b0,8896:Gi,8897:Gi,8898:Gi,8899:Gi,8968:Da,8969:Da,8970:Da,8971:Da,10216:y0,10217:y0,10752:Zl,10753:Zl,10754:Zl,10756:Gi,10758:Gi},"Size3-Regular":{32:Z,40:x0,41:x0,47:v0,91:_0,92:v0,93:_0,123:Oa,125:Oa,160:Z,710:Ba,732:Ba,770:Ba,771:Ba,8730:[.95003,1.45,0,0,1],8968:Ka,8969:Ka,8970:Ka,8971:Ka,10216:Oa,10217:Oa},"Size4-Regular":{32:Z,40:M0,41:M0,47:w0,91:S0,92:w0,93:S0,123:Pa,125:Pa,160:Z,710:Ra,732:Ra,770:Ra,771:Ra,8730:[1.25003,1.75,0,0,1],8968:Ia,8969:Ia,8970:Ia,8971:Ia,9115:za,9116:k0,9117:za,9118:za,9119:k0,9120:za,9121:Na,9122:Yl,9123:Na,9124:Na,9125:Yl,9126:Na,9127:L0,9128:A0,9129:C0,9130:[0,.3,0,0,.88889],9131:L0,9132:A0,9133:C0,9143:[.88502,.915,0,0,1.05556],10216:Pa,10217:Pa,57344:E0,57345:E0,57680:Fa,57681:Fa,57682:Fa,57683:Fa},"Typewriter-Regular":{32:O0,33:B,34:B,35:B,36:ht,37:ht,38:B,39:B,40:ht,41:ht,42:[0,.52083,0,0,.525],43:T0,44:[.13889,.125,0,0,.525],45:T0,46:[0,.125,0,0,.525],47:ht,48:B,49:B,50:B,51:B,52:B,53:B,54:B,55:B,56:B,57:B,58:Re,59:[.13889,.43056,0,0,.525],60:D0,61:[-.19549,.41562,0,0,.525],62:D0,63:B,64:B,65:B,66:B,67:B,68:B,69:B,70:B,71:B,72:B,73:B,74:B,75:B,76:B,77:B,78:B,79:B,80:B,81:[.13889,.61111,0,0,.525],82:B,83:B,84:B,85:B,86:B,87:B,88:B,89:B,90:B,91:ht,92:ht,93:ht,94:B,95:[.09514,0,0,0,.525],96:B,97:Re,98:B,99:Re,100:B,101:Re,102:B,103:Gn,104:B,105:B,106:[.22222,.61111,0,0,.525],107:B,108:B,109:Re,110:Re,111:Re,112:Gn,113:Gn,114:Re,115:Re,116:[0,.55358,0,0,.525],117:Re,118:Re,119:Re,120:Re,121:Gn,122:Re,123:ht,124:ht,125:ht,126:B,127:B,160:O0,176:B,184:[.19445,0,0,0,.525],305:Re,567:Gn,711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:B,715:B,728:B,730:B,770:B,771:B,776:B,915:B,916:B,920:B,923:B,926:B,928:B,931:B,933:B,934:B,936:B,937:B,8216:B,8217:B,8242:B,9251:[.11111,.21944,0,0,.525]}};var kf=/[\u3040-\u309F]|[\u30A0-\u30FF]|[\u4E00-\u9FAF]|[\uAC00-\uD7AF]/,Rt=10,Ie=.25,P0=1.2,Xe=.431,Ql={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[Xe,Xe,Xe],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.5,.732,.925],num2:[.394,.384,.5],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[Ie,Ie,Ie],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04]},jn=[0,.5,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],ji=5,K0={"\xA0":" ","\u200B":" ",\u00C5:"A",\u00C7:"C",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00E7:"c",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};function Tr(t,e){t===void 0&&(t=77);let r=B0[e][t];if(r)return{defaultMetrics:!1,depth:r[0],height:r[1],italic:r[2],skew:r[3],width:r[4]};if(t===11034)return{defaultMetrics:!0,depth:.2,height:.8,italic:0,skew:0,width:.8};let i=String.fromCodePoint(t);if(i in K0)t=K0[i].codePointAt(0);else if(kf.test(i))return t=77,{defaultMetrics:!0,depth:.2,height:.9,italic:0,skew:0,width:1};return{defaultMetrics:!0,depth:.2,height:.7,italic:0,skew:0,width:.8}}var ec={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],longrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],longleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],longleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],longrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],longleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xleftrightarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],longleftrightarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xRightleftharpoons:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],longRightleftharpoons:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xLeftrightharpoons:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716],longLeftrightharpoons:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},tc={widehat1:[1062,239,.24],widehat2:[2364,300,.3],widehat3:[2364,360,.36],widehat4:[2364,420,.42],widecheck1:[1062,239,.24],widecheck2:[2364,300,.3],widecheck3:[2364,360,.36],widecheck4:[2364,420,.42],widetilde1:[600,260,.26],widetilde2:[1033,286,.286],widetilde3:[2339,306,.306],widetilde4:[2340,312,.34],overarc:[1061,159,.3],underarc:[1061,159,.3]},R0={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,overarc:"M529 0c179 0 524 115 524 115 5 1 9 5 9 10 0 1-1 2-1 3l-4 22c-1 5-5 9-11 9h-2s-338-93-512-92c-174 0-513 92-513 92h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13 0 0 342-115 520-115z",underarc:`m 529 160 + c -179 0 -524 -115 -524 -115 + c -5 -1 -9 -5 -9 -10 + c 0 -1 1 -2 1 -3 + l 4 -22 + c 1 -5 5 -9 11 -9 + h 2 + s 338 93 512 92 + c 174 0 513 -92 513 -92 + h 2 + c 5 0 9 4 11 9 + l 5 22 + c 1 6 -2 12 -8 13 + c 0 0 -342 115 -520 115 + z + `,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z +M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z +M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z +M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z +M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,widetilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,widetilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,widetilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,widetilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`};function I0(t){if(tc[t]){let[c,u,d]=tc[t],m=``;return`${m}`}let[e,r,i,n]=ec[t],o,a,s=i/1e3;e.length===3?(o=["slice-1-of-3","slice-2-of-3","slice-3-of-3"],a=["xMinYMin","xMidYMin","xMaxYMin"]):e.length===2?(o=["slice-1-of-2","slice-2-of-2"],a=["xMinYMin","xMaxYMin"]):(o=["slice-1-of-1"],a=[n]);let l=e.map((c,u)=>``).join("");return`${l}`}function z0(t){return ec[t]?ec[t][2]/1e3:tc[t][2]}function Lf(t){let e=[];for(let r=0;r=55296&&i<=56319){let n=t.charCodeAt(r+1);if(n>=56320&&n<=57343){let o=i-55296,a=n-56320;i=2**16+o*2**10+a,r++}}e.push(i)}return e}var Va=8205,Af=[[Va,1],[65038,2],[127995,5],[129456,4],[917536,96]],$a,N0=[127462,127487];function F0(t){var e;if($a===void 0){$a={};for(let r of Af)for(let i=r[0];i<=r[0]+r[1]-1;i++)$a[i]=!0}return(e=$a[t])!=null?e:!1}function Cf(t){return t>=N0[0]&&t<=N0[1]}function qa(t){if(/^[\u0020-\u00FF]*$/.test(t))return t;let e=[],r=Lf(t),i=0;for(;i=this.s.length}get(){return this.pos";let e=this.get();if(e==="\\"){if(!this.end()){let r=this.match(/^[a-zA-Z\*]+/);return r?this.match(/^[ \f\n\r\t\v\u00A0\u2028\u2029]*/):r=this.get(),"\\"+r}}else{if(e==="{")return"<{>";if(e==="}")return"<}>";if(e==="^"){if(this.peek()==="^"){this.get();let r=this.match(/^(\^(\^(\^(\^[\da-f])?[\da-f])?[\da-f])?[\da-f])?[\da-f]{2}/);if(r)return String.fromCodePoint(Number.parseInt(r.slice(r.lastIndexOf("^")+1),16))}return e}else if(e==="#"){if(!this.end()){let r=!1;if(/[\d?@]/.test(this.peek())&&(r=!0,this.pos+1"):"<$>"}return e}};function Ef(t,e){var n,o,a,s;let r=[],i=t.next();if(i&&i!=="\\relax"){if(i==="\\noexpand")i=t.next(),i&&r.push(i);else if(i==="\\obeyspaces")t.obeyspaces=!0;else if(i==="\\bgroup")r.push("<{>");else if(i==="\\egroup")r.push("<}>");else if(i==="\\string"){if(i=t.next(),i)if(i.startsWith("\\"))for(let l of i)r.push(l==="\\"?"\\backslash":l);else i==="<{>"?r.push("\\{"):i===""?r.push("~"):i==="<}>"&&r.push("\\}")}else if(i==="\\csname"){for(;t.peek()==="";)t.next();let l="",c=!1,u=[];do{if(u.length===0)if(/^#[\d?@]$/.test(t.peek())){let d=t.get().slice(1);u=Ji((o=(n=e==null?void 0:e(d))!=null?n:e==null?void 0:e("?"))!=null?o:"\\placeholder{}",e),i=u[0]}else i=t.next(),u=i?[i]:[];c=u.length===0,!c&&i==="\\endcsname"&&(c=!0,u.shift()),c||(c=i==="<$>"||i==="<$$>"||i==="<{>"||i==="<}>"||typeof i=="string"&&i.length>1&&i.startsWith("\\")),c||(l+=u.shift())}while(!c);l&&r.push("\\"+l),r.push(...u)}else if(i!=="\\endcsname")if(i.length>1&&i.startsWith("#")){let l=i.slice(1);r.push(...Ji((s=(a=e==null?void 0:e(l))!=null?a:e==null?void 0:e("?"))!=null?s:"\\placeholder{}",e))}else r.push(i)}return r}function Ji(t,e=null){if(!t)return[];let r=[],i="";for(let a of t.toString().split(/\r?\n/)){i&&r.push(i),i=" ";let s=a.match(/((?:\\%)|[^%])*/);s!==null&&r.push(s[0])}let n=new rc(r.join("")),o=[];do o.push(...Ef(n,e));while(!n.end());return o}function R(t){let e="",r=[];for(let i of t)i&&(e&&/^[a-zA-Z\*]/.test(i)&&r.push(e),r.push(i),/^\\[a-zA-Z]+\*?[\"\'][^\ ]+$/.test(i)&&r.push(" "),e=/\\[a-zA-Z]+\*?$/.test(i)?" ":"");return r.join("")}function U(t,...e){return t.startsWith("\\"),e.length===0?t:R([t,...e.map(r=>`{${r}}`)])}function Dr(t){return R(t.map(e=>{var r;return(r={"":" ","<$$>":"$$","<$>":"$","<{>":"{","<}>":"}"}[e])!=null?r:e}))}var li=class li{constructor(e){li._registry[e]=this}static createAtom(e,r,i){return li._registry[e].createAtom(r,ne(r,e),i)}static serialize(e,r){var i;if(!e||e.length===0)return"";if((i=r.skipStyles)!=null&&i){let n=[];for(let o of V0(e)){let a=li._registry[o[0].mode];n.push(...a.serialize(o,r))}return R(n)}return R(Df(e,r))}static getFont(e,r,i){return li._registry[e].getFont(r,i)}};li._registry={};var _e=li;function V0(t){let e=[],r=[],i="NONE";for(let n of t)n.type!=="first"&&(n.mode!==i?(r.length>0&&e.push(r),r=[n],i=n.mode):r.push(n));return r.length>0&&e.push(r),e}function Ha(t){if((t==null?void 0:t.mode)!=="math")return"";let{style:e}=t;return!e||!e.variantStyle?"":e.variantStyle==="bold"||e.variantStyle==="bolditalic"?"bold":""}function Wa(t){if(!t)return"";let{style:e}=t;if(!e)return"";let r=e.variant;return r===void 0&&(r="normal"),!["calligraphic","fraktur","double-struck","script","monospace","sans-serif"].includes(r)&&e.variantStyle&&(r+="-"+e.variantStyle),r}function pt(t,e){let r=[],i=[],n;for(let o of t){if(o.type==="first")continue;let a;e==="variant"?a=Wa(o):e==="bold"?a=Ha(o):a=o.style[e],a===n?i.push(o):(i.length>0&&r.push(i),i=[o],n=a)}return i.length>0&&r.push(i),r}function $0(t,e){var o;let{parent:r}=t[0],i=r==null?void 0:r.style.color,n=[];for(let a of V0(t)){let s=e.defaultMode;for(let l of pt(a,"color")){let c=l[0].style,u=_e._registry[l[0].mode].serialize(l,g(h({},e),{defaultMode:s==="text"?"text":"math"}));!e.skipStyles&&c.color&&c.color!=="none"&&(!r||i!==c.color)?n.push(U("\\textcolor",(o=c.verbatimColor)!=null?o:c.color,R(u))):n.push(R(u))}}return n}function Tf(t,e){let{parent:r}=t[0],i=r==null?void 0:r.style.backgroundColor;return pt(t,"backgroundColor").map(n=>{var o;if(n.length>0||n[0].type!=="box"){let a=n[0].style;if(a.backgroundColor&&a.backgroundColor!=="none"&&(!r||i!==a.backgroundColor))return U("\\colorbox",(o=a.verbatimBackgroundColor)!=null?o:a.backgroundColor,R($0(n,g(h({},e),{defaultMode:"text"}))))}return R($0(n,e))})}function Df(t,e){if(t.length===0)return[];let{parent:r}=t[0],i=r==null?void 0:r.style.fontSize,n=[];for(let o of pt(t,"fontSize")){let a=o[0].style.fontSize,s=Tf(o,e);s&&(a&&a!=="auto"&&(!r||i!==a)?n.push(["","\\tiny","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"][a],...s):n.push(...s))}return n}function Ua(t){return t?{mord:"ord",mbin:"bin",mop:"op",mrel:"rel",mopen:"open",mclose:"close",mpunct:"punct",minner:"inner",spacing:"ignore",latex:"latex",composition:"inner",error:"inner",placeholder:"ord",supsub:"ignore"}[t]:void 0}function ci(t){if(t.length===0)return"ord";let e=Ua(t[0].type),r=Ua(t[t.length-1].type);return e&&e===r?e:"ord"}function Jn(t,e){if(typeof t=="string")return t;if(typeof t=="number"){Number.isFinite(t);let r=Math.ceil(100*t)/100;return r===0?"0":r.toString()+(e!=null?e:"")}return""}var w=class t{constructor(e,r){var n,o,a,s,l;if(typeof e=="number"?this.value=String.fromCodePoint(e):typeof e=="string"?this.value=e:ee(e)?this.children=e.filter(c=>c!==null):e&&e instanceof t&&(this.children=[e]),this.children)for(let c of this.children)c.parent=this;this.type=(n=r==null?void 0:r.type)!=null?n:"ignore",this.isSelected=(r==null?void 0:r.isSelected)===!0,r!=null&&r.caret&&(this.caret=r.caret),this.classes=(o=r==null?void 0:r.classes)!=null?o:"",this.isTight=(a=r==null?void 0:r.isTight)!=null?a:!1,r!=null&&r.attributes&&(this.attributes=r.attributes);let i=r==null?void 0:r.fontFamily;r!=null&&r.style&&this.value&&(i=(l=_e.getFont((s=r.mode)!=null?s:"math",this,g(h({variant:"normal"},r.style),{letterShapeStyle:r.letterShapeStyle})))!=null?l:void 0),i||(i="Main-Regular"),this._height=0,this._depth=0,this._width=0,this.hasExplicitWidth=!1,this.skew=0,this.italic=0,this.maxFontSize=0,this.scale=1,(r==null?void 0:r.maxFontSize)!==void 0&&(this.maxFontSize=r.maxFontSize),Of(this,i)}set atomID(e){e===void 0||e.length===0||(this.id=e)}selected(e){if(this.isSelected!==e&&(this.isSelected=e,this.children))for(let r of this.children)r.selected(e)}setStyle(e,r,i){if(r===void 0)return;let n=Jn(r,i);n.length>0&&(this.cssProperties||(this.cssProperties={}),this.cssProperties[e]=n)}setTop(e){Number.isFinite(e)&&Math.abs(e)>.01&&(this.cssProperties||(this.cssProperties={}),this.cssProperties.top=Jn(e,"em"),this.height-=e,this.depth+=e)}get left(){var e;return(e=this.cssProperties)!=null&&e["margin-left"]?Number.parseFloat(this.cssProperties["margin-left"]):0}set left(e){Number.isFinite(e)&&(e===0?this.cssProperties&&delete this.cssProperties["margin-left"]:(this.cssProperties||(this.cssProperties={}),this.cssProperties["margin-left"]=Jn(e,"em")))}set right(e){Number.isFinite(e)&&(e===0?this.cssProperties&&delete this.cssProperties["margin-right"]:(this.cssProperties||(this.cssProperties={}),this.cssProperties["margin-right"]=Jn(e,"em")))}set bottom(e){Number.isFinite(e)&&(e===0?this.cssProperties&&delete this.cssProperties["margin-bottom"]:(this.cssProperties||(this.cssProperties={}),this.cssProperties["margin-bottom"]=Jn(e,"em")))}get width(){return this._width*this.scale}set width(e){this._width=e,this.hasExplicitWidth=!0}set softWidth(e){}get height(){return this._height*this.scale}set height(e){this._height=e}get depth(){return this._depth*this.scale}set depth(e){this._depth=e}wrap(e){let r=e.parent;if(!r)return this;e.isPhantom&&this.setStyle("opacity",0);let i=e.color;i&&i!==r.color&&this.setStyle("color",i);let o=e.backgroundColor;this.isSelected&&(o=Ru(o)),o&&o!==r.backgroundColor&&(this.setStyle("background-color",o),this.setStyle("--bg-color",o),this.setStyle("display","inline-block"),this.setStyle("position","relative"),this.classes=this.classes?`${this.classes} ML__bg`:"ML__bg");let a=e.scalingFactor;return this.scale=a,this.skew*=a,this.italic*=a,this}toMarkup(){var c,u,d;let e=this.value?Bf(this.value):"";if(this.children)for(let m of this.children)e+=m.toMarkup();let r="";if(this.svgBody)r=I0(this.svgBody);else if(this.svgOverlay){r='',r+=e,r+="",r+=']/g,p=>`&#${p.charCodeAt(0)};`)};`),r+='"',this.svgStyle&&(r+=this.svgStyle),r+=` viewBox="0 0 ${Math.floor(100*this.width)/100} ${Math.floor(100*(this.height+this.depth))/100}"`,r+=`>${this.svgOverlay}`}let i=[],n=this.classes.split(" ");n.push((u={latex:"ML__raw-latex",placeholder:"ML__placeholder",error:"ML__error"}[this.type])!=null?u:""),this.caret==="latex"&&n.push("ML__latex-caret"),this.isSelected&&n.push("ML__selected");let o=n.length===1?n[0]:n.filter((m,p,f)=>m.length>0&&f.indexOf(m)===p).join(" ");if(o.length>0&&i.push(`class=${Xi(`"${o}"`)}`),this.id&&i.push(` data-atom-id=${Xi(this.id)}`),this.cssId&&i.push(` id=${Xi(`"${this.cssId.replace(/ /g,"-")}"`)}`),this.attributes&&i.push(...Object.keys(this.attributes).map(m=>`${ic(m)}=${Xi(this.attributes[m])}`)),this.htmlData){let m=this.htmlData.split(",");for(let p of m){let f=p.match(/([^=]+)=(.+$)/);if(f){let y=ic(f[1]);if(y)if(y==="href"){let v=new URL(f[2]);if(v.protocol!=="http:"&&v.protocol!=="https:")throw new Error(`Invalid URL: ${f[2]}`);i.push(`href="${q0(f[2])}"`)}else i.push(`data-${y}=${Xi(f[2])}`)}else{let y=ic(p);y&&i.push(`data-${y} `)}}}let a=(d=this.cssProperties)!=null?d:{};this.hasExplicitWidth&&a.width===void 0&&(a.width=`${Math.ceil(this._width*100)/100}em`);let s=Object.keys(a).map(m=>`${m}:${a[m]}`);if(this.scale!==void 0&&this.scale!==1&&(e.length>0||r.length>0)&&s.push(`font-size: ${Math.ceil(this.scale*1e4)/100}%`),this.htmlStyle)for(let m of this.htmlStyle.split(";")){let p=m.match(/([^:]+):(.+$)/);if(p){let f=p[1].trim().replace(/ /g,"-");f&&s.push(`${f}:${p[2]}`)}}s.length>0&&i.push(`style=${Xi(s.join(";"))}`);let l="";return i.length>0||r.length>0?l=`${e}${r}`:l=e,this.caret==="text"?l+='':this.caret==="math"&&(l+=''),l}tryCoalesceWith(e){if(this.svgBody||!this.value||e.svgBody||!e.value)return!1;let r=this.children&&this.children.length>0,i=e.children&&e.children.length>0;if(r||i)return!1;if(e.cssProperties||this.cssProperties){for(let l of["border","border-left","border-right","border-right-width","left","margin","margin-left","margin-right","padding","position","width"])if(e.cssProperties&&l in e.cssProperties||this.cssProperties&&l in this.cssProperties)return!1}let n=this.cssProperties?Object.keys(this.cssProperties).length:0,o=e.cssProperties?Object.keys(e.cssProperties).length:0;if(n!==o)return!1;if(n>0){for(let l of Object.keys(this.cssProperties))if(this.cssProperties[l]!==e.cssProperties[l])return!1}let a=this.classes.trim().replace(/\s+/g," ").split(" "),s=e.classes.trim().replace(/\s+/g," ").split(" ");if(a.length!==s.length)return!1;a.sort(),s.sort();for(let[l,c]of a.entries())if(c==="ML__vertical-separator"||c!==s[l])return!1;return this.value+=e.value,this.height=Math.max(this.height,e.height),this.depth=Math.max(this.depth,e.depth),this._width=this._width+e._width,this.maxFontSize=Math.max(this.maxFontSize,e.maxFontSize),this.italic=e.italic,!0}};function nc(t){if(!t||t.length===0)return[];t[0].children=nc(t[0].children);let e=[t[0]];for(let r=1;r0){let i=-1/0,n=-1/0,o=0;for(let a of t.children)a.height>i&&(i=a.height),a.depth>n&&(n=a.depth),o=Math.max(o,(r=a.maxFontSize)!=null?r:0);t.height=i,t.depth=n,t._width=t.children.reduce((a,s)=>a+s.width,0),t.maxFontSize=o}}function Bf(t){return t.replace(/&/g,"&").replace(//g,">")}function ic(t){if(t=t.trim().replace(/ /g,"-"),t.length===0)throw new Error("Invalid empty attribute name");if(/[\x20\x09\x0a\x0c\x0d"'>/=\x00-\x1f]/.test(t))throw new Error(`Invalid attribute name "${t}"`);return t}function q0(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function Xi(t){if(t=t.trim(),t.length>=2&&(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")))t=t.slice(1,-1);else if(t.length===0)throw new Error("Invalid empty attribute value");return`"${q0(t)}"`}function Kf(t){if("individualShift"in t){let e=t.individualShift,r=e[0];if(r==null)return[null,0];let i=[r],n=-r.shift-r.box.depth,o=n;for(let a=1;a{f.softWidth=c});let u=new w(o,{classes:"ML__vlist"});if(u.softWidth=c,u.height=s,u.setStyle("height",s,"em"),a>=0)return[[new w(u,{classes:"ML__vlist-r"})],s,-a];let d=new w(new w(null),{classes:"ML__vlist"});d.height=-a,d.setStyle("height",-a,"em");let m=new w(8203,{classes:"ML__vlist-s",maxFontSize:0});return m.softWidth=0,m.height=0,m.depth=0,[[new w([u,m],{classes:"ML__vlist-r"}),new w(d,{classes:"ML__vlist-r"})],s,-a]}var te=class extends w{constructor(e,r){var a;let[i,n,o]=Pf(e);super(i.length===1?i[0]:i,{type:r==null?void 0:r.type,classes:((a=r==null?void 0:r.classes)!=null?a:"")+" ML__vlist-t"+(i.length===2?" ML__vlist-t2":"")}),this.height=n,this.depth=o,this.softWidth=i.reduce((s,l)=>Math.max(s,l.width),0)}};function H0(t,e){var c,u,d,m,p;let r=t.metrics,i=new w(e.base),n=(c=e.baseShift)!=null?c:0,o=(u=e.slant)!=null?u:0,a=0,s=0;e.above&&(a=(d=e.aboveShift)!=null?d:Math.max(r.bigOpSpacing1,r.bigOpSpacing3-e.above.depth)),e.below&&(s=(m=e.belowShift)!=null?m:Math.max(r.bigOpSpacing2,r.bigOpSpacing4-e.below.height));let l=null;if(e.below&&e.above){let f=r.bigOpSpacing5+e.below.height+e.below.depth+s+i.depth+n;l=new te({bottom:f,children:[r.bigOpSpacing5,{box:e.below,marginLeft:-o,classes:["ML__center"]},s,{box:i,classes:["ML__center"]},a,{box:e.above,marginLeft:o,classes:["ML__center"]},r.bigOpSpacing5]}).wrap(t)}else if(e.below&&!e.above)l=new te({top:i.height-n,children:[r.bigOpSpacing5,{box:e.below,marginLeft:-o,classes:["ML__center"]},s,{box:i,classes:["ML__center"]}]}).wrap(t);else if(!e.below&&e.above){let f=i.depth+n;l=new te({bottom:f,children:[{box:i,classes:["ML__center"]},a,{box:e.above,marginLeft:o,classes:["ML__center"]},r.bigOpSpacing5]}).wrap(t)}else{let f=i.depth+n;l=new te({bottom:f,children:[{box:i},r.bigOpSpacing5]}).wrap(t)}return new w(l,{type:(p=e.type)!=null?p:"op"})}var Rf=/^-?(\d+|\d*\.\d+)(px|em|rem|ex|ch|pt|pc|cm|mm|in|vw|vh|%)?$/,If=/^([a-zA-Z]+|#[0-9a-fA-F]{3,8}|(rgba?|hsla?)\(\s*[-\d.,%\s/]*\s*\)|var\(--[\w-]+\))$/,zf=/^(none|hidden|solid|dashed|dotted|double|groove|ridge|inset|outset)$/;function oc(t){let e=[],r=0,i="";for(let n of t.trim()){if(n==="("?r+=1:n===")"&&(r-=1),r<0)return;/\s/.test(n)&&r===0?(i&&e.push(i),i=""):i+=n}if(r===0)return i&&e.push(i),e}function ac(t){return Rf.test(t)}function sc(t){return If.test(t)}function W0(t){if(!t)return;let e=t.trim();return ac(e)?e:void 0}function Yi(t){if(!t)return;let e=oc(t);if(!(!e||e.length!==1))return sc(e[0])?e[0]:void 0}function Ga(t){if(!t)return;let e=oc(t);if(!e||e.length===0||e.length>3)return;let r=0,i=0,n=0;for(let o of e)if(ac(o))r+=1;else if(zf.test(o))i+=1;else if(sc(o))n+=1;else return;if(!(r>1||i>1||n>1))return e.join(" ")}function U0(t){if(!t)return;let e=oc(t);if(!e||e.length<2||e.length>4)return;let r=0,i=0;for(let n of e)if(ac(n))r+=1;else if(sc(n))i+=1;else return;if(!(r<2||r>3||i>1))return e.join(" ")}function G0(t){if(!t)return;let e=t.trim();return/^[A-Za-z0-9 _'",-]+$/.test(e)?e:void 0}var ja=7,Zn=6,Yn=5,Kr=4,ui=3,He=2,Pr=1,Ee=0,It=class{constructor(e,r,i){this.id=e,this.sizeDelta=r,this.cramped=i;let n={"-4":2,"-3":1,0:0}[r];this.metrics=Object.keys(Ql).reduce((o,a)=>g(h({},o),{[a]:Ql[a][n]}),{})}getFontSize(e){return Math.max(1,e+this.sizeDelta)}get sup(){return ft[[Ee,Pr,Ee,Pr,He,ui,He,ui][this.id]]}get sub(){return ft[[Ee,Ee,Ee,Ee,He,He,He,He][this.id]]}get fracNum(){return ft[[Ee,Pr,Ee,Pr,He,ui,Kr,Yn][this.id]]}get fracDen(){return ft[[Ee,Ee,Ee,Ee,He,He,Kr,Kr][this.id]]}get cramp(){return ft[[Ee,Ee,He,He,Kr,Kr,Zn,Zn][this.id]]}get isTight(){return this.sizeDelta<0}},Xn={7:new It(ja,0,!1),6:new It(Zn,0,!0),5:new It(Yn,0,!1),4:new It(Kr,0,!0),3:new It(ui,-3,!1),2:new It(He,-3,!0),1:new It(Pr,-4,!1),0:new It(Ee,-4,!0)},ft=g(h({},Xn),{displaystyle:Xn[ja],textstyle:Xn[Yn],scriptstyle:Xn[ui],scriptscriptstyle:Xn[Pr]});function cc(t,e){var i;if(!t)return 0;let r={pt:1,mm:7227/2540,cm:7227/254,ex:35271/8192,px:3/4,em:Rt,bp:803/800,dd:1238/1157,pc:12,in:72.27,mu:10/18}[(i=t.unit)!=null?i:"pt"];if(Number.isFinite(e)){let n=10**e;return Math.round(t.dimension/Rt*r*n)/n}return t.dimension*r}function Ja(t,e){if(t===null)return 0;let r=cc(t)/Rt;if(Number.isFinite(e)){let i=10**e;return Math.round(r*i)/i}return r}function lc(t){var e;return`${t.dimension}${(e=t.unit)!=null?e:"pt"}`}function Nf(t){let e=lc(t.glue);return t.grow&&t.grow.dimension!==0&&(e+=` plus ${lc(t.grow)}`),t.shrink&&t.shrink.dimension!==0&&(e+=` minus ${lc(t.shrink)}`),e}function ge(t){var r,i;if(t==null)return null;let e="";if("dimension"in t&&(e=`${t.dimension}${(r=t.unit)!=null?r:"pt"}`),"glue"in t&&(e=Nf(t)),"number"in t)if(!("base"in t)||t.base==="decimal")e=Number(t.number).toString();else if(t.base==="alpha")e=`\`${String.fromCodePoint(t.number)}`;else{let n=Math.round(t.number)>>>0;t.base==="hexadecimal"?(e=Number(n).toString(16).toUpperCase(),n<=255?e=e.padStart(2,"0"):n<=65535?e=e.padStart(4,"0"):n<=16777215?e=e.padStart(6,"0"):e=e.padStart(8,"0"),e=`"${e}`):t.base==="octal"&&(e=Number(n).toString(8),n<=63?e=e.padStart(2,"0"):n<=30583?e=e.padStart(4,"0"):e=e.padStart(8,"0"),e=`'${e}`)}return"register"in t&&("factor"in t&&(t.factor===-1?e="-":t.factor!==1&&(e=Number(t.factor).toString())),"global"in t&&t.global&&(e+="\\global"),e+=`\\${t.register}`),"string"in t&&(e=t.string),(i=t.relax)!=null&&i&&(e+="\\relax"),e}function gt(t,e){return t==null?null:"number"in t?g(h({},t),{number:t.number*e}):"register"in t?"factor"in t&&t.factor?g(h({},t),{factor:t.factor*e}):g(h({},t),{factor:e}):"dimension"in t?g(h({},t),{dimension:t.dimension*e}):"glue"in t?t.shrink&&t.grow?{glue:gt(t.glue,e),shrink:gt(t.shrink,e),grow:gt(t.grow,e)}:t.shrink?{glue:gt(t.glue,e),shrink:gt(t.shrink,e)}:t.grow?{glue:gt(t.glue,e),grow:gt(t.grow,e)}:{glue:gt(t.glue,e)}:null}var Ff={"p@":{dimension:1},"z@":{dimension:0},maxdimen:{dimension:16383.99999},hfuzz:{dimension:.1},vfuzz:{dimension:.1},overfullrule:{dimension:5},hsize:{dimension:6.5,unit:"in"},vsize:{dimension:8.9,unit:"in"},parindent:{dimension:20},maxdepth:{dimension:4},splitmaxdepth:{register:"maxdimen"},boxmaxdepth:{register:"maxdimen"},delimitershortfall:{dimension:5},nulldelimiterspace:{dimension:1.2,unit:"pt"},scriptspace:{dimension:.5},topskip:{dimension:10},splittopskip:{dimension:10},normalbaselineskip:{dimension:12},normallineskip:{dimension:1},normallineskiplimit:{dimension:0},jot:{dimension:3},doublerulesep:{dimension:2},arrayrulewidth:{dimension:.4},arraycolsep:{dimension:5},fboxsep:{dimension:3},fboxrule:{dimension:.4},"z@skip":{glue:{dimension:0},shrink:{dimension:0},grow:{dimension:0}},hideskip:{glue:{dimension:-1e3},grow:{dimension:1,unit:"fill"}},"@flushglue":{glue:{dimension:0},grow:{dimension:1,unit:"fill"}},parskip:{glue:{dimension:0},grow:{dimension:1}},abovedisplayskip:{glue:{dimension:12},grow:{dimension:3},shrink:{dimension:9}},abovedisplayshortskip:{glue:{dimension:0},grow:{dimension:3}},belowdisplayskip:{glue:{dimension:12},grow:{dimension:3},shrink:{dimension:9}},belowdisplayshortskip:{glue:{dimension:7},grow:{dimension:3},shrink:{dimension:4}},parfillskip:{glue:{dimension:0},grow:{dimension:1,unit:"fil"}},thinmuskip:{glue:{dimension:3,unit:"mu"}},medmuskip:{glue:{dimension:4,unit:"mu"},grow:{dimension:2,unit:"mu"},shrink:{dimension:4,unit:"mu"}},thickmuskip:{glue:{dimension:5,unit:"mu"},grow:{dimension:5,unit:"mu"}},smallskipamount:{glue:{dimension:3},grow:{dimension:1},shrink:{dimension:1}},medskipamount:{glue:{dimension:6},grow:{dimension:2},shrink:{dimension:3}},bigskipamount:{glue:{dimension:12},grow:{dimension:2},shrink:{dimension:4}},pretolerance:100,tolerance:200,hbadness:1e3,vbadness:1e3,linepenalty:10,hyphenpenalty:50,exhyphenpenalty:50,binoppenalty:700,relpenalty:500,clubpenalty:150,widowpenalty:150,displaywidowpenalty:50,brokenpenalty:100,predisplaypenalty:1e4,doublehyphendemerits:1e4,finalhyphendemerits:5e3,adjdemerits:1e4,tracinglostchars:1,uchyph:1,delimiterfactor:901,defaulthyphenchar:"\\-",defaultskewchar:-1,newlinechar:-1,showboxbreadth:5,showboxdepth:3,errorcontextlines:5,interdisplaylinepenalty:100,interfootnotelinepenalty:100,baselineSkip:1.2,arraystretch:1,month:new Date().getMonth()+1,day:new Date().getDate(),year:new Date().getFullYear()};function Xa(){return h({},Ff)}function Qn(){return{registers:Xa(),smartFence:!1,renderPlaceholder:void 0,placeholderSymbol:"\u25A2",letterShapeStyle:F.locale.startsWith("fr")?"french":"tex",minFontScale:0,maxMatrixCols:10,colorMap:Yr,backgroundColorMap:Bi,getMacro:t=>ti(t,Ri())}}var P=class t{constructor(e,r){var o,a,s,l,c,u,d,m,p,f,y,v,b,k,S;let i;e!=null&&e.parent?(this.parent=e.parent,i=e.parent,this.registers={}):(i=h(h({},Qn()),(o=e==null?void 0:e.from)!=null?o:{}),this.registers=i.registers),i.atomIdsSettings&&(this.atomIdsSettings=h({},i.atomIdsSettings)),this.renderPlaceholder=i.renderPlaceholder,this.isPhantom=(l=(s=e==null?void 0:e.isPhantom)!=null?s:(a=this.parent)==null?void 0:a.isPhantom)!=null?l:!1,this.letterShapeStyle=i.letterShapeStyle,this.minFontScale=i.minFontScale,this.maxMatrixCols=i.maxMatrixCols,r!=null&&r.color&&r.color!=="none"?this.color=r.color:this.color=(u=(c=this.parent)==null?void 0:c.color)!=null?u:"",r!=null&&r.backgroundColor&&r.backgroundColor!=="none"?this.backgroundColor=r.backgroundColor:this.backgroundColor=(m=(d=this.parent)==null?void 0:d.backgroundColor)!=null?m:"",r!=null&&r.fontSize&&r.fontSize!=="auto"&&r.fontSize!==((p=this.parent)==null?void 0:p.size)?this.size=r.fontSize:this.size=(y=(f=this.parent)==null?void 0:f.size)!=null?y:ji;let n=(b=(v=this.parent)==null?void 0:v.mathstyle)!=null?b:ft.displaystyle;if(typeof(e==null?void 0:e.mathstyle)=="string"){if(i instanceof t)switch(e.mathstyle){case"cramp":n=n.cramp;break;case"superscript":n=n.sup;break;case"subscript":n=n.sub;break;case"numerator":n=n.fracNum;break;case"denominator":n=n.fracDen;break}switch(e.mathstyle){case"textstyle":n=ft.textstyle;break;case"displaystyle":n=ft.displaystyle;break;case"scriptstyle":n=ft.scriptstyle;break;case"scriptscriptstyle":n=ft.scriptscriptstyle;break;case"":case"auto":break}}this.mathstyle=n,this.smartFence=i.smartFence,this.placeholderSymbol=i.placeholderSymbol,this.colorMap=(k=i.colorMap)!=null?k:(A=>A),this.backgroundColorMap=(S=i.backgroundColorMap)!=null?S:(A=>A),this.getMacro=i.getMacro,this.parent!==void 0||this.registers}makeID(){if(!this.atomIdsSettings)return;if(this.atomIdsSettings.overrideID)return this.atomIdsSettings.overrideID;if(typeof this.atomIdsSettings.seed!="number")return`${Date.now().toString(36).slice(-2)}${Math.floor(Math.random()*1e5).toString(36)}`;let e=this.atomIdsSettings.seed.toString(36);return this.atomIdsSettings.seed+=1,e}scale(e){return e*this.effectiveFontSize}get scalingFactor(){return this.parent?this.effectiveFontSize/this.parent.effectiveFontSize:1}get isDisplayStyle(){return this.mathstyle.id===ja||this.mathstyle.id===Zn}get isCramped(){return this.mathstyle.cramped}get isTight(){return this.mathstyle.isTight}get metrics(){return this.mathstyle.metrics}get effectiveFontSize(){return Math.max(jn[Math.max(1,this.size+this.mathstyle.sizeDelta)],this.minFontScale)}getRegister(e){if(this.registers&&e in this.registers)return this.registers[e];if(this.parent)return this.parent.getRegister(e)}getRegisterAsNumber(e){let r=this.getRegister(e);if(typeof r=="number")return r;if(typeof r=="string")return Number(r)}getRegisterAsGlue(e){if(this.registers&&e in this.registers){let r=this.registers[e];return typeof r=="object"&&"glue"in r?r:typeof r=="object"&&"dimension"in r?{glue:{dimension:r.dimension}}:typeof r=="number"?{glue:{dimension:r}}:void 0}if(this.parent)return this.parent.getRegisterAsGlue(e)}getRegisterAsEm(e,r){return Ja(this.getRegisterAsDimension(e),r)}getRegisterAsDimension(e){if(this.registers&&e in this.registers){let r=this.registers[e];return typeof r=="object"&&"glue"in r?r.glue:typeof r=="object"&&"dimension"in r?r:typeof r=="number"?{dimension:r}:void 0}if(this.parent)return this.parent.getRegisterAsDimension(e)}setRegister(e,r){if(r===void 0){delete this.registers[e];return}this.registers[e]=r}evaluate(e){if(!e||!("register"in e))return e;let r=this;if("global"in e&&e.global)for(;r.parent;)r=r.parent;let i=1;"factor"in e&&e.factor!==1&&e.factor!==void 0&&(i=e.factor);let n=r.getRegister(e.register);if(n===void 0)return;if(typeof n=="string")return{string:Number(n).toString()+n};if(typeof n=="number")return{number:i*n};let o=r.evaluate(n);if(o!==void 0)return"string"in o?{string:Number(n).toString()+o.string}:"number"in o?{number:i*o.number}:"dimension"in o?g(h({},o),{dimension:i*o.dimension}):"glue"in o?g(h({},o),{glue:g(h({},o.glue),{dimension:i*o.glue.dimension}),shrink:o.shrink?g(h({},o.shrink),{dimension:i*o.shrink.dimension}):void 0,grow:o.grow?g(h({},o.grow),{dimension:i*o.grow.dimension}):void 0}):e}toDimension(e){let r=this.evaluate(e);if(r===void 0)return null;if("dimension"in r)return r;if("glue"in r)return r.glue;if("number"in r)return{dimension:r.number};if("string"in r){let i=parseFloat(r.string),n=r.string.match(/(mm|cm|ex|px|em|bp|dd|pc|in|mu)$/);return n?{dimension:i,unit:n[0]}:{dimension:i}}return null}toEm(e,r){if(e===null)return 0;let i=this.toDimension(e);return i===null?0:cc(i,r)/Rt}toNumber(e){if(e===null)return null;let r=this.evaluate(e);return r===void 0?null:"number"in r?r.number:"dimension"in r?r.dimension:"glue"in r?r.glue.dimension:"string"in r?Number(r.string):null}toColor(e){var i,n,o;if(e===null)return null;let r=this.evaluate(e);return r===void 0?null:"string"in r&&(o=(n=(i=this.colorMap)==null?void 0:i.call(this,r.string))!=null?n:Yi(r.string))!=null?o:null}toBackgroundColor(e){var i,n,o;if(e===null)return null;let r=this.evaluate(e);return r===void 0?null:"string"in r&&(o=(n=(i=this.backgroundColorMap)==null?void 0:i.call(this,r.string))!=null?n:Yi(r.string))!=null?o:null}};var Ir=["body","above","below","subscript","superscript"];function Rr(t){return typeof t=="string"&&Ir.includes(t)}function Ze(t){return t!==void 0&&Array.isArray(t)&&t.length===2}var x=class t{constructor(e){this.isRoot=!1;var r,i,n,o,a,s,l;this.type=e.type,typeof e.value=="string"&&(this.value=e.value),this.command=(i=(r=e.command)!=null?r:this.value)!=null?i:"",this.mode=(n=e.mode)!=null?n:"math",e.isFunction&&(this.isFunction=!0),(e.isRoot||this.type==="root")&&(this.isRoot=!0),e.limits&&(this.subsupPlacement=e.limits),this.style=h({},(o=e.style)!=null?o:{}),this.displayContainsHighlight=(a=e.displayContainsHighlight)!=null?a:!1,this.captureSelection=(s=e.captureSelection)!=null?s:!1,this.skipBoundary=(l=e.skipBoundary)!=null?l:!1,e.verbatimLatex!==void 0&&e.verbatimLatex!==null&&(this.verbatimLatex=e.verbatimLatex),e.args&&(this.args=e.args),e.body&&(this.body=e.body),this._changeCounter=0}static createBox(e,r,i){var s;if(!r)return null;let n=$f(r),o=[];for(let l of n){let c=l[0].style,u=Vf(e,l,{style:{color:c.color,backgroundColor:c.backgroundColor,fontSize:c.fontSize}});u&&o.push(u)}if(o.length===0)return null;let a=((s=i==null?void 0:i.classes)!=null?s:"").trim();return o.length===1&&!a&&!(i!=null&&i.type)?o[0].wrap(e):new w(o,{classes:a,type:i==null?void 0:i.type}).wrap(e)}static serialize(e,r){return _e.serialize(e,r)}static commonAncestor(e,r){if(e===r||e.parent===r.parent)return e.parent;let i=new WeakSet,{parent:n}=e;for(;n;)i.add(n),n=n.parent;for(n=r.parent;n;){if(i.has(n))return n;n=n.parent}}static fromJson(e){return typeof e=="string"?new t({type:"mord",value:e,mode:"math"}):new t(e)}toJson(){if(this._json)return this._json;let e={};if(this.type&&(e.type=this.type),this.mode!=="math"&&(e.mode=this.mode),this.command&&this.command!==this.value&&(e.command=this.command),this.value!==void 0&&(e.value=this.value),this.style&&Object.keys(this.style).length>0&&(e.style=h({},this.style)),this.verbatimLatex!==void 0&&(e.verbatimLatex=this.verbatimLatex),this.subsupPlacement&&(e.subsupPlacement=this.subsupPlacement),this.explicitSubsupPlacement&&(e.explicitSubsupPlacement=!0),this.isFunction&&(e.isFunction=!0),this.displayContainsHighlight&&(e.displayContainsHighlight=!0),this.skipBoundary&&(e.skipBoundary=!0),this.captureSelection&&(e.captureSelection=!0),this.args&&(e.args=qf(this.args)),this._branches)for(let r of Object.keys(this._branches))this._branches[r]&&(e[r]=this._branches[r].filter(i=>i.type!=="first").map(i=>i.toJson()));return e.type==="mord"&&Object.keys(e).length===2&&"value"in e?e.value:(this._json=e,e)}get changeCounter(){return this.parent?this.parent.changeCounter:this._changeCounter}set isDirty(e){e&&(this._json=void 0,this.parent||this._changeCounter++,"verbatimLatex"in this&&(this.verbatimLatex=void 0),this._children=void 0,this.parent&&(this.parent.isDirty=!0))}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);return r!=null&&r.serialize?r.serialize(this,e):this.body&&this.command?R([U(this.command,this.bodyToLatex(e)),this.supsubToLatex(e)]):this.body?R([this.bodyToLatex(e),this.supsubToLatex(e)]):!this.value||this.value==="\u200B"?"":this.command}bodyToLatex(e){var i;let r=(i=e.defaultMode)!=null?i:this.mode==="math"?"math":"text";return _e.serialize(this.body,g(h({},e),{defaultMode:r}))}aboveToLatex(e){return _e.serialize(this.above,e)}belowToLatex(e){return _e.serialize(this.below,e)}supsubToLatex(e){let r="";if(e=g(h({},e),{defaultMode:"math"}),this.branch("subscript")!==void 0){let i=_e.serialize(this.subscript,e);i.length===0?r+="_{}":i.length===1?/^[0-9]$/.test(i)?r+=`_${i}`:r+=`_{${i}}`:r+=`_{${i}}`}if(this.branch("superscript")!==void 0){let i=_e.serialize(this.superscript,e);i.length===0?r+="^{}":i.length===1?i==="\u2032"?r+="^\\prime ":i==="\u2033"?r+="^\\doubleprime ":/^[0-9]$/.test(i)?r+=`^${i}`:r+=`^{${i}}`:r+=`^{${i}}`}return r}get treeDepth(){let e=1,r=this.parent;for(;r;)r=r.parent,e+=1;return e}get inCaptureSelection(){let e=this;for(;e;){if(e.captureSelection)return!0;e=e.parent}return!1}get parentPrompt(){let e=this.parent;for(;e;){if(e.type==="prompt"&&!e.captureSelection)return e;e=e.parent}return null}branch(e){if(Rr(e)&&this._branches)return this._branches[e]}get branches(){if(!this._branches)return[];let e=[];for(let r of Ir)this._branches[r]&&e.push(r);return e}createBranch(e){return Rr(e),Rr(e)?(this._branches?this._branches[e]||(this._branches[e]=[this.makeFirstAtom(e)]):this._branches={[e]:[this.makeFirstAtom(e)]},this.isDirty=!0,this._branches[e]):[]}get row(){return Ze(this.parentBranch)?this.parentBranch[0]:-1}get col(){return Ze(this.parentBranch)?this.parentBranch[1]:-1}get body(){var e;return(e=this._branches)==null?void 0:e.body}set body(e){this.setChildren(e,"body")}get superscript(){var e;return(e=this._branches)==null?void 0:e.superscript}set superscript(e){this.setChildren(e,"superscript")}get subscript(){var e;return(e=this._branches)==null?void 0:e.subscript}set subscript(e){this.setChildren(e,"subscript")}get above(){var e;return(e=this._branches)==null?void 0:e.above}set above(e){this.setChildren(e,"above")}get below(){var e;return(e=this._branches)==null?void 0:e.below}set below(e){this.setChildren(e,"below")}applyStyle(e,r){this.isDirty=!0,r!=null&&r.unstyledOnly?(e.color&&!this.style.color&&(this.style.color=e.color),e.backgroundColor&&!this.style.backgroundColor&&(this.style.backgroundColor=e.backgroundColor),e.fontFamily&&!this.style.fontFamily&&(this.style.fontFamily=e.fontFamily),e.fontShape&&!this.style.fontShape&&(this.style.fontShape=e.fontShape),e.fontSeries&&!this.style.fontSeries&&(this.style.fontSeries=e.fontSeries),e.fontSize&&!this.style.fontSize&&(this.style.fontSize=e.fontSize),e.variant&&!this.style.variant&&(this.style.variant=e.variant),e.variantStyle&&!this.style.variantStyle&&(this.style.variantStyle=e.variantStyle)):this.style=h(h({},this.style),e),this.style.fontFamily==="none"&&delete this.style.fontFamily,this.style.fontShape==="auto"&&delete this.style.fontShape,this.style.fontSeries==="auto"&&delete this.style.fontSeries,this.style.color==="none"&&(delete this.style.color,delete this.style.verbatimColor),this.style.backgroundColor==="none"&&(delete this.style.backgroundColor,delete this.style.verbatimBackgroundColor),this.style.fontSize==="auto"&&delete this.style.fontSize;for(let i of this.children)i.applyStyle(e,r)}getInitialBaseElement(){var e,r,i;return this.hasEmptyBranch("body")?this:((e=this.body)==null||e[0].type,(i=(r=this.body[1])==null?void 0:r.getInitialBaseElement())!=null?i:this)}getFinalBaseElement(){return this.hasEmptyBranch("body")?this:this.body[this.body.length-1].getFinalBaseElement()}isCharacterBox(){return this.type==="leftright"||this.type==="genfrac"||this.type==="subsup"||this.type==="delim"||this.type==="array"||this.type==="surd"?!1:this.getFinalBaseElement().type==="mord"}hasEmptyBranch(e){let r=this.branch(e);return r?(r.length>0,r[0].type,r.length===1):!0}setChildren(e,r){var n;if(!e||(Rr(r),!Rr(r)))return;let i=((n=e[0])==null?void 0:n.type)==="first"?[...e]:[this.makeFirstAtom(r),...e];this._branches?this._branches[r]=i:this._branches={[r]:i};for(let o of e)o.parent=this,o.parentBranch=r;this.isDirty=!0}makeFirstAtom(e){let r=new t({type:"first",mode:this.mode});return r.parent=this,r.parentBranch=e,r}addChild(e,r){e.type,this.createBranch(r).push(e),this.isDirty=!0,e.parent=this,e.parentBranch=r}addChildBefore(e,r){r.parentBranch;let i=this.createBranch(r.parentBranch);i.splice(i.indexOf(r),0,e),this.isDirty=!0,e.parent=this,e.parentBranch=r.parentBranch}addChildAfter(e,r){r.parentBranch;let i=this.createBranch(r.parentBranch);i.splice(i.indexOf(r)+1,0,e),this.isDirty=!0,e.parent=this,e.parentBranch=r.parentBranch}addChildren(e,r){let i=this.createBranch(r);for(let n of e)n.parent=this,n.parentBranch=r,i.push(n);this.isDirty=!0}addChildrenAfter(e,r){e.length===0||e[0].type,r.parentBranch;let i=this.createBranch(r.parentBranch);i.splice(i.indexOf(r)+1,0,...e),this.isDirty=!0;for(let n of e)n.parent=this,n.parentBranch=r.parentBranch;return e[e.length-1]}removeBranch(e){let r=this.branch(e);if(Rr(e)&&(this._branches[e]=void 0),!r)return[];for(let o of r)o.parent=void 0,o.parentBranch=void 0;r[0].type;let[i,...n]=r;return this.isDirty=!0,n}removeChild(e){if(e.parent,e.type==="first")return;let r=this.branch(e.parentBranch),i=r.indexOf(e);i>=0,r.splice(i,1),this.isDirty=!0,e.parent=void 0,e.parentBranch=void 0}get siblings(){return this.parent?this.parent.branch(this.parentBranch):[]}get firstSibling(){return this.siblings[0]}get lastSibling(){let{siblings:e}=this;return e[e.length-1]}get isFirstSibling(){return this===this.firstSibling}get isLastSibling(){return this===this.lastSibling}get hasNoSiblings(){return this.siblings.length===1}get leftSibling(){this.parent;let e=this.parent.branch(this.parentBranch);return e[e.indexOf(this)-1]}get rightSibling(){this.parent;let e=this.parent.branch(this.parentBranch);return e[e.indexOf(this)+1]}get hasChildren(){return!!(this._branches&&this.children.length>0)}get firstChild(){return this.hasChildren,this.children[0]}get lastChild(){this.hasChildren;let{children:e}=this;return e[e.length-1]}get children(){if(this._children)return this._children;if(!this._branches)return[];let e=[];for(let r of Ir)if(this._branches[r])for(let i of this._branches[r])e.push(...i.children),e.push(i);return this._children=e,e}render(e){if(this.type==="first"&&!e.atomIdsSettings)return null;let r=ne(this.command,this.mode);if(r!=null&&r.render)return r.render(this,e);let i=new P({parent:e},this.style),n=this.createBox(i,{classes:this.parent?"":"ML__base"});return n?(!this.subsupPlacement&&(this.superscript||this.subscript)&&(n=this.attachSupsub(i,{base:n})),n.wrap(i)):null}attachSupsub(e,r){var f;let i=r.base,n=this.superscript,o=this.subscript;if(!n&&!o)return i;let a=null,s=null,l=(f=r.isCharacterBox)!=null?f:this.isCharacterBox(),c=0;if(n){let y=new P({parent:e,mathstyle:"superscript"});a=t.createBox(y,n),l||(c=i.height-e.metrics.supDrop*y.scalingFactor)}let u=0;if(o){let y=new P({parent:e,mathstyle:"subscript"});s=t.createBox(y,o),l||(u=i.depth+e.metrics.subDrop*y.scalingFactor)}let d;e.isDisplayStyle?d=e.metrics.sup1:e.isCramped?d=e.metrics.sup3:d=e.metrics.sup2;let m=.5/Rt/e.scalingFactor,p=null;if(s&&a){c=Math.max(c,d,a.depth+.25*e.metrics.xHeight),u=Math.max(u,e.metrics.sub2);let y=e.metrics.defaultRuleThickness;if(c-a.depth-(s.height-u)<4*y){u=4*y-(c-a.depth)+s.height;let b=.8*e.metrics.xHeight-(c-a.depth);b>0&&(c+=b,u-=b)}let v=this.type==="extensible-symbol"&&i.italic?-i.italic:0;p=new te({individualShift:[{box:s,shift:u,marginLeft:v},{box:a,shift:-c}]})}else s&&!a?(u=Math.max(u,e.metrics.sub1,s.height-.8*Xe),p=new te({shift:u,children:[{box:s,marginRight:m,marginLeft:this.isCharacterBox()?-i.italic:0}]})):!s&&a&&(c=Math.max(c,d,a.depth+.25*Xe),p=new te({shift:-c,children:[{box:a,marginRight:m}]}));return new w([i,new w(p,{caret:this.caret,isSelected:this.isSelected,classes:"ML__msubsup"})],{type:r.type})}attachLimits(e,r){let i=this.superscript?t.createBox(new P({parent:e,mathstyle:"superscript"},this.style),this.superscript):null,n=this.subscript?t.createBox(new P({parent:e,mathstyle:"subscript"},this.style),this.subscript):null;return!i&&!n?r.base.wrap(e):H0(e,g(h({},r),{above:i,below:n}))}bind(e,r){if(!r||e.isPhantom||this.value==="\u200B")return r;let i=this.parent;for(;i&&!i.captureSelection;)i=i.parent;return i!=null&&i.captureSelection||(this.id||(this.id=e.makeID()),r.atomID=this.id),r}createBox(e,r){var s,l,c,u;let i=(s=this.value)!=null?s:this.body,n=(l=r==null?void 0:r.boxType)!=null?l:Ua(this.type),o=(c=r==null?void 0:r.classes)!=null?c:"";this.mode==="text"&&(o+=" ML__text");let a=typeof i=="string"||i===void 0?new w(i!=null?i:null,{type:n,isSelected:this.isSelected,mode:this.mode,maxFontSize:e.scalingFactor,style:g(h({variant:"normal"},this.style),{fontSize:Math.max(1,e.size+e.mathstyle.sizeDelta)}),letterShapeStyle:e.letterShapeStyle,classes:o}):(u=t.createBox(e,i,{type:n,classes:o}))!=null?u:new w(null);return e.isTight&&(a.isTight=!0),(this.mode!=="math"||this.style.variant==="main")&&(a.italic=0),a.right=a.italic,this.bind(e,a),this.caret&&!this.superscript&&!this.subscript&&(a.caret=this.caret),a}isDigit(){var e;return this.type==="mord"&&this.value?/^[\d,\.]$/.test(this.value):this.type==="group"&&((e=this.body)==null?void 0:e.length)===2?this.body[0].type==="first"&&this.body[1].value===",":!1}asDigit(){var e;return this.type==="mord"&&this.value&&/^[\d,\.]$/.test(this.value)?this.value:this.type==="group"&&((e=this.body)==null?void 0:e.length)===2&&this.body[0].type==="first"&&this.body[1].value===","?".":""}};function $f(t){let e,r=[],i=[];for(let n of t){if(n.type==="first"){i.push(n);continue}if(!e&&!n.style)i.push(n);else{let o=n.style;e&&o.color===e.color&&o.backgroundColor===e.backgroundColor&&o.fontSize===e.fontSize?i.push(n):(i.length>0&&r.push(i),i=[n],e=o)}}return i.length>0&&r.push(i),r}function Vf(t,e,r){var s,l,c,u,d;if(!e||e.length===0)return null;let i=new P({parent:t},r.style),n=!((s=i.atomIdsSettings)!=null&&s.groupNumbers),o=[];if(e.length===1){let m=e[0],p=m.render(i);p&&(n&&m.isSelected&&p.selected(!0),o=[p])}else{let m="",p=!0;for(let f of e){(l=i.atomIdsSettings)!=null&&l.groupNumbers&&m&&(p&&f.isDigit()||!p&&uc(f))&&(i.atomIdsSettings.overrideID=m);let y=f.render(i);i.atomIdsSettings&&(i.atomIdsSettings.overrideID=void 0),y&&((c=i.atomIdsSettings)!=null&&c.groupNumbers&&((f.isDigit()||uc(f))&&(!m||p!==f.isDigit())&&(p=f.isDigit(),m=(u=f.id)!=null?u:""),m&&(!(f.isDigit()||uc(f))||!f.hasEmptyBranch("superscript")||!f.hasEmptyBranch("subscript"))&&(m="")),n&&f.isSelected&&y.selected(!0),o.push(y))}}if(o.length===0)return null;let a=new w(o,g(h({isTight:i.isTight},r),{type:(d=r.type)!=null?d:"lift"}));return a.isSelected=o.every(m=>m.isSelected),a.wrap(i)}function uc(t){return t.mode==="text"}function qf(t){return t.map(e=>e===null?"":Array.isArray(e)&&e[0]instanceof x?{atoms:e.map(r=>r.toJson())}:typeof e=="object"&&"group"in e?{group:e.group.map(r=>r.toJson())}:e)}var We=class t extends x{constructor(e,r,i){super({type:"text",command:e,mode:"text",displayContainsHighlight:!0}),this.value=r,this.verbatimLatex=r,this.applyStyle(i)}static fromJson(e){return new t(e.command,e.value,e.style)}render(e){let r=this.createBox(e);return this.caret&&(r.caret=this.caret),r}_serialize(e){var r;return(r=this.verbatimLatex)!=null?r:yl("text",this.value.codePointAt(0))}};function j0(t,e){if(t.direction===e.direction){let r=t.ranges.length;if(e.ranges.length===r){let i=0;for(;i=":"\\ge","\u2264":"\\le","<=":"\\le","<<":"\\ll",">>":"\\gg","~~":"\\approx","\u2248":"\\approx","?=":"\\questeq","\xF7":"\\div","\xAC":"\\neg",":=":"\\coloneq","::":"\\Colon","(:":"\\langle",":)":"\\rangle",beta:"\\beta",chi:"\\chi",epsilon:"\\epsilon",varepsilon:"\\varepsilon",eta:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\eta"},gamma:"\\gamma",Gamma:"\\Gamma",iota:"\\iota",kappa:"\\kappa",lambda:"\\lambda",Lambda:"\\Lambda",mu:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\mu"},nu:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\nu"},\u00B5:"\\mu",phi:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\phi"},Phi:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\Phi"},varphi:"\\varphi",psi:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\psi"},Psi:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\Psi"},rho:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\rho"},sigma:"\\sigma",Sigma:"\\Sigma",tau:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\tau"},vartheta:"\\vartheta",upsilon:"\\upsilon",xi:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space",value:"\\xi"},Xi:{after:"nothing+digit+function+frac+surd+binop+relop+punct+array+openfence+closefence+space+text",value:"\\Xi"},zeta:"\\zeta",omega:"\\omega",Omega:"\\Omega",\u03A9:"\\omega",forall:"\\forall",exists:"\\exists","!exists":"\\nexists",":.":"\\therefore",liminf:"\\liminf_{#?}",limsup:"\\limsup_{#?}",argmin:"\\operatorname*{arg~min}_{#?}",argmax:"\\operatorname*{arg~max}_{#?}",det:"\\det",mod:"\\bmod{#?}","(mod":"\\pmod{#?}",max:"\\max",min:"\\min",erf:"\\operatorname{erf}",erfc:"\\operatorname{erfc}",bessel:"\\operatorname{bessel}",mean:"\\operatorname{mean}",median:"\\operatorname{median}",fft:"\\operatorname{fft}",lcm:"\\operatorname{lcm}",gcd:"\\gcd",randomReal:"\\operatorname{randomReal}",randomInteger:"\\operatorname{randomInteger}",Re:"\\operatorname{Re}",Im:"\\operatorname{Im}",mm:{after:"nothing+digit+operator",value:"\\operatorname{mm}"},cm:{after:"nothing+digit+operator",value:"\\operatorname{cm}"},km:{after:"nothing+digit+operator",value:"\\operatorname{km}"},kg:{after:"nothing+digit+operator",value:"\\operatorname{kg}"},ft:{after:"nothing+digit+operator",value:"\\operatorname{ft}"},inch:{after:"nothing+digit+operator",value:"\\operatorname{inch}"},mi:{after:"nothing+digit+operator",value:"\\operatorname{mi}"},"...":"\\ldots","+...":"+\\cdots","-...":"-\\cdots","->...":"\\to\\cdots","-->...":"\\longrightarrow\\cdots","->":"\\to","|->":"\\mapsto","-->":"\\longrightarrow","<--":"\\longleftarrow","=>":"\\Rightarrow","==>":"\\Longrightarrow","<=>":"\\iff","<->":"\\leftrightarrow","(.)":"\\odot","(+)":"\\oplus","(/)":"\\oslash","(*)":"\\otimes","(-)":"\\ominus","||":"\\Vert","*":"\\cdot","**":"\\star","***":"\\ast","//":"\\slash","\\\\":"\\backslash",setminus:"\\backslash","|><":"\\ltimes","><|":"\\rtimes","|><|":"\\bowtie","-:":"\\div",divide:"\\div","@":"\\circ","^^":"\\wedge","^^^":"\\bigwedge",vv:"\\vee",vvv:"\\bigvee",nn:"\\cap",nnn:"\\bigcap",uu:"\\cup",uuu:"\\bigcup","-=":"\\equiv","~=":"\\cong",lt:"<","lt=":"\\leq",gt:">","gt=":"\\geq","-<":"\\prec","-lt":"\\prec","-<=":"\\preceq",">-=":"\\succeq",prop:"\\propto",diamond:"\\diamond",square:"\\square",iff:"\\iff",sub:"\\subset",sup:"\\supset",sube:"\\subseteq",supe:"\\supseteq",uarr:"\\uparrow",darr:"\\downarrow",rarr:"\\rightarrow",rArr:"\\Rightarrow",larr:"\\leftarrow",lArr:"\\Leftarrow",harr:"\\leftrightarrow",hArr:"\\Leftrightarrow",aleph:"\\aleph",and:"\\land",or:"\\lor",not:"\\neg","_|_":"\\bot",TT:"\\top","|--":"\\vdash","|==":"\\models","|__":"\\lfloor","__|":"\\rfloor","|~":"\\lceil","~|":"\\rceil",">->":"\\rightarrowtail","->>":"\\twoheadrightarrow",">->>":"\\twoheadrightarrowtail",times:"\\times",of:"\\circ",infinity:"\\infty",defint:"\\int_{#?}^{#?}",approaches:"\\to",ceil:"\\left\\lceil#?\\right\\rceil",floor:"\\left\\lfloor#?\\right\\rfloor",union:"\\cup",asterisk:"\\ast",frac:"\\frac{#?}{#?}",cbrt:"\\sqrt[3]{#?}",nthroot:"\\sqrt[#?]{#?}"};function or(t,e){var i;let r=(i=e==null?void 0:e.format)!=null?i:"auto";return r==="auto"&&([r,t]=Uf(t)),r==="ascii-math"?(t=t.replace(/\u2061/gu,""),t=t.replace(/\u3016/gu,"{"),t=t.replace(/\u3017/gu,"}"),t=t.replace(/([^\\])sinx/g,"$1\\sin x"),t=t.replace(/([^\\])cosx/g,"$1\\cos x "),t=t.replace(/\u2013/g,"-"),["ascii-math",Ue(t,{inlineShortcuts:e==null?void 0:e.inlineShortcuts})]):["latex",t]}function Ue(t,e){var a;if(t=t.trim(),!t)return"";let r=(a=e.inlineShortcuts)!=null?a:Za;if(t.startsWith("^")||t.startsWith("_")){let{match:s,rest:l}=mi(t.slice(1),{inlineShortcuts:r,noWrap:!0});return`${t[0]}{${s}}${Ue(l,e)}`}let i=t.match(/^(sqrt|\u221A)(.*)/);if(i){let{match:s,rest:l}=mi(i[2],{inlineShortcuts:r,noWrap:!0});return`\\sqrt{${s!=null?s:"\\placeholder{}"}}${Ue(l,e)}`}if(i=t.match(/^(\\cbrt|\u221B)(.*)/),i){let{match:s,rest:l}=mi(i[2],{inlineShortcuts:r,noWrap:!0});return`\\sqrt[3]{${s!=null?s:"\\placeholder{}"}}${Ue(l,e)}`}if(i=t.match(/^abs(.*)/),i){let{match:s,rest:l}=mi(i[1],{inlineShortcuts:r,noWrap:!0});return`\\left|${s!=null?s:"\\placeholder{}"}\\right|${Ue(l,e)}`}if(i=t.match(/^["”“](.*?)["”“](.*)/),i)return`\\text{${i[1]}}${Ue(i[2],e)}`;if(i=t.match(/^([^a-zA-Z0-9\(\{\[\_\^\\\s"]+)(.*)/),i)return`${Z0(i[1],r)}${Ue(i[2],e)}`;if(/^([fgh])[^a-zA-Z]/.test(t)){let{rest:s,match:l}=mi(t.slice(1),{inlineShortcuts:r,noWrap:!0}),c="";return t[1]==="("?c=`${t[0]}\\left(${l}\\right)`:c=t[0]+l,c+Ue(s,e)}if(i=t.match(/^([a-zA-Z]+)(.*)/),i)return Z0(i[1],r)+Ue(i[2],e);let{match:n,rest:o}=mi(t,{inlineShortcuts:r,noWrap:!0});if(n&&o[0]==="/"){let s=mi(o.slice(1),{inlineShortcuts:r,noWrap:!0});if(s.match)return`\\frac{${n}}{${s.match}}${Ue(s.rest,e)}`}else return t.startsWith("(")?"\\left("+n+"\\right)"+Ue(o,e):n+Ue(o,e);return i=t.match(/^(\s+)(.*)$/),i?" "+Ue(i[2],e):t}var X0={"[":"\\lbrack","]":"\\rbrack","{":"\\lbrace","}":"\\rbrace"};function mi(t,e){var a,s;let r="";t=t.trim();let i=t,n=t.charAt(0),o={"(":")","{":"}","[":"]"}[n];if(o){let l=1,c=1;for(;c0;)t[c]===n&&l++,t[c]===o&&l--,c++;if(l===0){let u=Ue(t.substring(1,c-1),e);e.noWrap&&n==="("?r=u:r=`\\left${(a=X0[n])!=null?a:n}${u}\\right${(s=X0[o])!=null?s:o}`,i=t.slice(Math.max(0,c))}else r=t.substring(1,c),i=""}else{let l=t.match(/^([a-zA-Z]+)/);if(l){let c=eo(null,t,e.inlineShortcuts);if(c)return c=c.replace("_{#?}",""),c=c.replace("^{#?}",""),{match:c,rest:t.slice(c.length)}}if(l=t.match(/^([a-zA-Z])/),l)return{match:l[1],rest:t.slice(1)};if(l=t.match(/^(-)?\d+(\.\d*)?/),l)return{match:l[0],rest:t.slice(l[0].length)};/^\\(left|right)/.test(t)||(l=t.match(/^(\\[a-zA-Z]+)/),l&&(i=t.slice(l[1].length),r=l[1]))}return{match:r,rest:i}}function Z0(t,e){let r=eo(null,t,e);return r?(r=r.replace("_{#?}",""),r=r.replace("^{#?}",""),r+=" "):r=t,r}var dc=[["\\[","\\]"],["\\(","\\)"],["$$","$$"],["$","$"],["\\begin{math}","\\end{math}"],["\\begin{displaymath}","\\end{displaymath}"],["\\begin{equation}","\\end{equation}"],["\\begin{equation*}","\\end{equation*}"]];function Ya(t){let e=t.trim();for(let r of dc)if(e.startsWith(r[0])&&e.endsWith(r[1]))return[!0,e.substring(r[0].length,e.length-r[1].length)];return[!1,t]}function Uf(t){if(t=t.trim(),t.length<=1)return["latex",t];let e;return[e,t]=Ya(t),e?["latex",t]:t.startsWith("`")&&t.endsWith("`")?(t=t.substring(1,t.length-1),["ascii-math",t]):t.includes("\\")?["latex",t]:/\$.+\$/.test(t)?["latex",`\\text{${t}}`]:[void 0,t]}var Gf="$$",jf="$$",Y0=(t,e,r)=>(dc.some(i=>e.startsWith(i[0])&&e.endsWith(i[1]))||(e=`${Gf} ${e} ${jf}`),e),en=class en{constructor(e){en._modes[e]=this}static onPaste(e,r,i){var o;if(!r.contentEditable&&r.userSelect==="none")return r.model.announce("plonk"),!1;if(typeof i=="string"){let a=new DataTransfer;a.setData("text/plain",i),i=a}let n=new ClipboardEvent("paste",{clipboardData:i,cancelable:!0});return(o=r.host)!=null&&o.dispatchEvent(n)?en._modes[e].onPaste(r,i):!1}static copyToClipboard(e,r){if(!e.contentEditable&&e.userSelect==="none"){e.model.announce("plonk");return}let i=e.model,n=i.selectionIsCollapsed?[0,i.lastOffset]:de(i.selection),o=i.getValue(n,r);navigator.clipboard.writeText(o).then(()=>{},()=>e.model.announce("plonk"))}static onCopy(e,r){var a;if(!r.clipboardData)return;if(!e.contentEditable&&e.userSelect==="none"){e.model.announce("plonk");return}let i=e.model,n=i.selectionIsCollapsed?[0,i.lastOffset]:de(i.selection),o=i.getAtoms(n);if(o.every(s=>s.mode==="text"||!s.mode))r.clipboardData.setData("text/plain",o.filter(s=>s instanceof We).map(s=>s.value).join(""));else if(o.every(s=>s.mode==="latex"))r.clipboardData.setData("text/plain",i.getAtoms(n,{includeChildren:!0}).map(s=>{var l;return(l=s.value)!=null?l:""}).join(""));else{let s;o.length===1&&o[0].verbatimLatex!==void 0?s=o[0].verbatimLatex:s=i.getValue(n,"latex-expanded"),r.clipboardData.setData("application/x-latex",s);try{r.clipboardData.setData("text/plain",e.options.onExport(e,s,n))}catch(l){}if(o.length===1){let l=o[0];(l.type==="root"||l.type==="group")&&(o=l.body.filter(c=>c.type!=="first"))}try{r.clipboardData.setData("application/json+mathlive",JSON.stringify(o.map(l=>l.toJson())))}catch(l){}if((a=window[Symbol.for("io.cortexjs.compute-engine")])!=null&&a.ComputeEngine){let l=globalThis.MathfieldElement.computeEngine;if(l)try{let c=l.jsonSerializationOptions;l.jsonSerializationOptions={metadata:["latex"]};let u=l.parse(i.getValue(n,"latex-unstyled"));l.jsonSerializationOptions=c;let d=JSON.stringify(u.json);d&&r.clipboardData.setData("application/json",d)}catch(c){}}}r.preventDefault()}static insert(e,r,i={}){var o;let n=i.mode==="auto"?e.mode:(o=i.mode)!=null?o:e.mode;return en._modes[n].insert(e,r,i)}onPaste(e,r){return!1}insert(e,r,i){return!1}};en._modes={};var H=en;var Q0=[{key:"left",command:"moveToPreviousChar"},{key:"right",command:"moveToNextChar"},{key:"up",command:"moveUp"},{key:"down",command:"moveDown"},{key:"shift+[ArrowLeft]",command:"extendSelectionBackward"},{key:"shift+[ArrowRight]",command:"extendSelectionForward"},{key:"shift+[ArrowUp]",command:"extendSelectionUpward"},{key:"shift+[ArrowDown]",command:"extendSelectionDownward"},{key:"[Backspace]",command:"deleteBackward"},{key:"[Delete]",command:"deleteForward"},{key:"shift+[Backspace]",command:"deleteForward"},{key:"alt+[Backspace]",command:"deletePreviousWord"},{key:"alt+[Delete]",command:"deleteNextWord"},{key:"ctrl+[Backspace]",command:"deleteToGroupStart"},{key:"ctrl+[Delete]",command:"deleteToGroupEnd"},{key:"ctrl+shift+[Backspace]",command:"deleteToGroupEnd"},{key:"alt+[ArrowLeft]",command:"moveToPreviousWord"},{key:"alt+[ArrowRight]",command:"moveToNextWord"},{key:"shift+alt+[ArrowLeft]",command:"extendToPreviousWord"},{key:"shift+alt+[ArrowRight]",command:"extendToNextWord"},{key:"ctrl+[ArrowLeft]",command:"moveToGroupStart"},{key:"ctrl+[ArrowRight]",command:"moveToGroupEnd"},{key:"shift+ctrl+[ArrowLeft]",command:"extendToGroupStart"},{key:"shift+ctrl+[ArrowRight]",command:"extendToGroupEnd"},{key:"[Home]",command:"moveToMathfieldStart"},{key:"cmd+[ArrowLeft]",command:"moveToMathfieldStart"},{key:"shift+[Home]",command:"extendToMathFieldStart"},{key:"shift+cmd+[ArrowLeft]",command:"extendToMathFieldStart"},{key:"[End]",command:"moveToMathfieldEnd"},{key:"cmd+[ArrowRight]",command:"moveToMathfieldEnd"},{key:"shift+[End]",command:"extendToMathFieldEnd"},{key:"shift+cmd+[ArrowRight]",command:"extendToMathFieldEnd"},{key:"[Pageup]",command:"moveToGroupStart"},{key:"[Pagedown]",command:"moveToGroupEnd"},{key:"[Tab]",command:"moveToNextGroup"},{key:"shift+[Tab]",command:"moveToPreviousGroup"},{key:"[Escape]",ifMode:"math",command:["switchMode","latex"]},{key:"[Escape]",ifMode:"text",command:["switchMode","latex"]},{key:"[Escape]",ifMode:"latex",command:["complete","complete",{selectItem:"true"}]},{key:"\\",ifMode:"math",command:["switchMode","latex","","\\"]},{key:"[IntlBackslash]",ifMode:"math",command:["switchMode","latex","","\\"]},{key:"[Tab]",ifMode:"latex",command:["complete","accept-suggestion"]},{key:"[Return]",ifMode:"latex",command:["complete","accept-all"]},{key:"[Enter]",ifMode:"latex",command:["complete","accept-all"]},{key:"shift+[Escape]",ifMode:"latex",command:["complete","reject"]},{key:"[ArrowDown]",ifMode:"latex",command:"nextSuggestion"},{key:"[ArrowUp]",ifMode:"latex",command:"previousSuggestion"},{key:"ctrl+a",ifPlatform:"!macos",command:"selectAll"},{key:"cmd+a",command:"selectAll"},{key:"[Cut]",command:"cutToClipboard"},{key:"[Copy]",command:"copyToClipboard"},{key:"[Paste]",command:"pasteFromClipboard"},{key:"[Clear]",command:"deleteBackward"},{key:"[Undo]",command:"undo"},{key:"[Redo]",command:"redo"},{key:"[EraseEof]",command:"deleteToGroupEnd"},{key:"ctrl+x",ifPlatform:"ios",command:"cutToClipboard"},{key:"cmd+x",ifPlatform:"ios",command:"cutToClipboard"},{key:"ctrl+c",ifPlatform:"ios",command:"copyToClipboard"},{key:"cmd+c",ifPlatform:"ios",command:"copyToClipboard"},{key:"ctrl+v",ifPlatform:"ios",command:"pasteFromClipboard"},{key:"cmd+v",ifPlatform:"ios",command:"pasteFromClipboard"},{key:"ctrl+z",ifPlatform:"!macos",command:"undo"},{key:"cmd+z",command:"undo"},{key:"ctrl+y",ifPlatform:"!macos",command:"redo"},{key:"shift+cmd+y",command:"redo"},{key:"shift+ctrl+z",ifPlatform:"!macos",command:"redo"},{key:"shift+cmd+z",command:"redo"},{key:"ctrl+b",ifPlatform:"macos",command:"moveToPreviousChar"},{key:"ctrl+f",ifPlatform:"macos",command:"moveToNextChar"},{key:"ctrl+p",ifPlatform:"macos",command:"moveUp"},{key:"ctrl+n",ifPlatform:"macos",command:"moveDown"},{key:"ctrl+a",ifPlatform:"macos",command:"moveToMathfieldStart"},{key:"ctrl+e",ifPlatform:"macos",command:"moveToMathfieldEnd"},{key:"shift+ctrl+b",ifPlatform:"macos",command:"extendSelectionBackward"},{key:"shift+ctrl+f",ifPlatform:"macos",command:"extendSelectionForward"},{key:"shift+ctrl+p",ifPlatform:"macos",command:"extendSelectionUpward"},{key:"shift+ctrl+n",ifPlatform:"macos",command:"extendSelectionDownward"},{key:"shift+ctrl+a",ifPlatform:"macos",command:"extendToMathFieldStart"},{key:"shift+ctrl+e",ifPlatform:"macos",command:"extendToMathFieldEnd"},{key:"alt+ctrl+b",ifPlatform:"macos",command:"moveToPreviousWord"},{key:"alt+ctrl+f",ifPlatform:"macos",command:"moveToNextWord"},{key:"shift+alt+ctrl+b",ifPlatform:"macos",command:"extendToPreviousWord"},{key:"shift+alt+ctrl+f",ifPlatform:"macos",command:"extendToNextWord"},{key:"ctrl+h",ifPlatform:"macos",command:"deleteBackward"},{key:"ctrl+d",ifPlatform:"macos",command:"deleteForward"},{key:"ctrl+l",ifPlatform:"macos",command:"scrollIntoView"},{key:"ctrl+[Digit2]",ifMode:"math",command:["insert","\\sqrt{#0}"]},{key:"ctrl+[Digit5]",ifMode:"math",command:"moveToOpposite"},{key:"ctrl+[Digit6]",ifMode:"math",command:"moveToSuperscript"},{key:"ctrl+[Return]",ifMode:"math",command:"addRowAfter"},{key:"ctrl+[Enter]",ifMode:"math",command:"addRowAfter"},{key:"cmd+[Return]",ifMode:"math",command:"addRowAfter"},{key:"cmd+[Enter]",ifMode:"math",command:"addRowAfter"},{key:"alt+p",ifMode:"math",command:["insert","\\pi"]},{key:"alt+v",ifMode:"math",command:["insert","\\sqrt{#0}"]},{key:"alt+shift+v",ifMode:"math",command:["insert","\\sqrt[#0]{#1}"]},{key:"alt+o",ifMode:"math",command:["insert","\\emptyset"]},{key:"alt+d",ifMode:"math",command:["insert","\\differentialD"]},{key:"shift+alt+o",ifMode:"math",command:["insert","\\varnothing"]},{key:"shift+alt+d",ifMode:"math",command:["insert","\\partial"]},{key:"alt+[Backslash]",ifMode:"math",command:["insert","\\backslash"]},{key:"[NumpadDivide]",ifMode:"math",command:["insert","\\frac{#@}{#?}"]},{key:"alt+[NumpadDivide]",ifMode:"math",command:["insert","\\frac{#?}{#@}"]},{key:"shift+alt+k",command:"toggleKeystrokeCaption"},{key:"alt+[Space]",command:"toggleContextMenu"},{key:"alt+shift+[Space]",command:"toggleVirtualKeyboard"},{key:"alt+ctrl+[ArrowUp]",command:["speak","all",{withHighlighting:!1}]},{key:"alt+ctrl+[ArrowDown]",command:["speak","selection",{withHighlighting:!1}]},{key:"shift+[Quote]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["switchMode","text","",""]},{key:"shift+[Quote]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"text",command:["switchMode","math","",""]},{key:"shift+alt+[KeyT]",ifMode:"math",command:["switchMode","text"]},{key:"shift+alt+[KeyT]",ifMode:"text",command:["switchMode","math"]},{key:"/",ifMode:"math",command:["insert","\\frac{#@}{#?}"]},{key:"alt+/",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","/"]},{key:"alt+shift+/",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","/"]},{key:"alt+[BracketLeft]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","\\left\\lbrack #0 \\right\\rbrack"]},{key:"ctrl+[Minus]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:"moveToSubscript"},{key:"shift+alt+[BracketLeft]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","\\left\\lbrace #0 \\right\\rbrace"]},{key:"ctrl+;",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:"addRowAfter"},{key:"cmd+;",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:"addRowAfter"},{key:"shift+ctrl+;",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:"addRowBefore"},{key:"shift+cmd+;",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:"addRowBefore"},{key:"alt+[Tab]",ifMode:"math",command:"addColumnAfter"},{key:"shift+alt+[Tab]",ifMode:"math",command:"addColumnBefore"},{key:"alt+[Enter]",ifMode:"math",command:"addRowAfter"},{key:"shift+alt+[Enter]",ifMode:"math",command:"addRowBefore"},{key:"alt+[Return]",ifMode:"math",command:"addRowAfter"},{key:"shift+alt+[Return]",ifMode:"math",command:"addRowBefore"},{key:"shift+[Backspace]",ifMode:"math",command:"removeColumn"},{key:"shift+[Delete]",ifMode:"math",command:"removeRow"},{key:"shift+alt+[Backspace]",ifMode:"math",command:"removeRow"},{key:"alt+[Digit5]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","$\\infty"]},{key:"alt+[Digit9]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","("]},{key:"alt+[Digit0]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert",")"]},{key:"alt+|",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","|"]},{key:"shift+[Backquote]",ifLayout:["apple.en-intl","windows.en-intl","linux.en"],ifMode:"math",command:["insert","\\~"]},{key:"[Backquote]",ifLayout:["windows.french","linux.french"],ifMode:"math",command:["insert","^2"]},{key:"[Backquote]",ifLayout:["windows.german","linux.german"],ifMode:"math",command:["insert","^"]},{key:"[IntlBackslash]",ifLayout:["apple.german"],ifMode:"math",command:["insert","^"]}],eh={"\\sqrt":["alt+v","ctrl+[Digit2]"],"\\pi":"alt+p","\\infty":"alt+[Digit5]","\\differentialD":"alt+d","\\partial":"shift+alt+d","\\frac":"Slash","\\emptyset":"alt+o","\\varnothing":"shift+alt+o","\\~":"~"};function Ye(t){var e;return((e=t.element)==null?void 0:e.mathfield)===t}function Jf(t){var e,r;return(r=(e=t.querySelector(".ML__caret"))!=null?e:t.querySelector(".ML__text-caret"))!=null?r:t.querySelector(".ML__latex-caret")}function tn(t){let e=Jf(t);if(!e)return null;let r=e.getBoundingClientRect();return{x:r.right,y:r.bottom,height:r.height}}function Xf(t){var r;if(!t.parent)return"root";let e=(r=t.parent.id)!=null?r:"";return e+=typeof t.parentBranch=="string"?"-"+t.parentBranch:`-${t.parentBranch[0]}/${t.parentBranch[0]}`,e}function hc(t,e,r){if(!e)return null;let i=t.field.getBoundingClientRect(),n=e.right-e.left,o=e.bottom-e.top,a=Math.ceil(e.left-i.left+t.field.scrollLeft*r),s=Math.ceil(e.top-i.top);return{left:a,right:a+n,top:s,bottom:s+o}}function mc(t){let e=t,r=e.getBoundingClientRect();for(;r.bottom===r.top&&e.parentElement instanceof Element&&(e=e.parentElement,r=e.getBoundingClientRect(),r.bottom===r.top););let i=getComputedStyle(e),n=parseInt(i.marginRight),o=r.right-r.left,a=r.bottom-r.top;if(o===0||!Number.isFinite(o)){let l=parseFloat(i.width);Number.isFinite(l)&&l>0?o=l:e instanceof HTMLElement&&e.offsetWidth>0&&(o=e.offsetWidth)}if(a===0||!Number.isFinite(a)){let l=parseFloat(i.height);Number.isFinite(l)&&l>0?a=l:e instanceof HTMLElement&&e.offsetHeight>0&&(a=e.offsetHeight)}let s={top:r.top-1,bottom:r.top-1+a,left:r.left,right:r.left+o-1+n};if(t.children.length===0||t.tagName.toUpperCase()==="SVG")return s;for(let l of t.children)if(l.nodeType===1&&"atomId"in l.dataset&&!l.classList.contains("ML__pstrut")){let c=mc(l);s.left=Math.min(s.left,c.left),s.right=Math.max(s.right,c.right),s.top=Math.min(s.top,c.top),s.bottom=Math.max(s.bottom,c.bottom)}return s}function ar(t,e){var o,a;if(!e.id)return null;let r=(a=(o=t.atomBoundsCache)==null?void 0:o.get(e.id))!=null?a:null;if(r!==null)return r;let i=t.field.querySelectorAll(`[data-atom-id="${e.id}"]`),n=Array.from(i);if(e.type==="prompt"){for(let s of n)if(s.classList.contains("ML__prompt-atom")){let l=s.querySelector(".ML__prompt");if(l){let c=mc(l);r?(r.left=Math.min(r.left,c.left),r.right=Math.max(r.right,c.right),r.top=Math.min(r.top,c.top),r.bottom=Math.max(r.bottom,c.bottom)):r=c}}}for(let s of n){let l=mc(s);r?(r.left=Math.min(r.left,l.left),r.right=Math.max(r.right,l.right),r.top=Math.min(r.top,l.top),r.bottom=Math.max(r.bottom,l.bottom)):r=l}return t.atomBoundsCache&&(r?t.atomBoundsCache.set(e.id,r):t.atomBoundsCache.delete(e.id)),r!=null?r:null}function th(t,e){let[r,i]=e,n=null;for(let o=r;o<=i;o++){let a=ar(t,t.model.at(o));a&&(n?(n.top=Math.min(n.top,a.top),n.bottom=Math.max(n.bottom,a.bottom),n.left=Math.min(n.left,a.left),n.right=Math.max(n.right,a.right)):n=a)}return n!=null?n:{top:0,bottom:0,left:0,right:0}}function Zf(t,e,r){let i=new Map,n=t.field,o=n.offsetWidth,s=Math.floor(n.getBoundingClientRect().width)/o;s=isNaN(s)?1:s;for(let l of t.model.getAtoms(e,{includeChildren:!0})){if(r!=null&&r.excludeAtomsWithBackground&&l.style.backgroundColor)continue;let c=hc(t,ar(t,l),s);if(c){let u=Xf(l);if(i.has(u)){let d=i.get(u);i.set(u,{left:Math.min(d.left,c.left),right:Math.max(d.right,c.right),top:Math.min(d.top,c.top),bottom:Math.max(d.bottom,c.bottom)})}else i.set(u,c)}}return[...i.values()]}function Qa(t,e){return t.model.selection.ranges.reduce((r,i)=>r.concat(...Zf(t,i,e)),[])}function rn(t,e){return t==="*"||e==="none"?!0:e==="same-origin"?!window.origin||t===window.origin:typeof e=="function"?e(t):!1}function pc(t){let e=0,r=0,i=t.offsetWidth,n=t.offsetHeight;for(;t instanceof HTMLElement;)e+=t.offsetTop,r+=t.offsetLeft,t=t.offsetParent;return new DOMRect(r,e,i,n)}function es(t,e){if(!t)return;let r=t.model.at(e);if(!r)return;let i={},n=ar(t,r);n&&(i.bounds=new DOMRect(n.left,n.top,n.right-n.left,n.bottom-n.top)),i.depth=r.treeDepth-2,i.style=r.style;let o=r;for(;o;){if(o.command==="\\htmlData"&&o.args&&typeof o.args[0]=="string"){let a=o.args[0].split(",");for(let s of a){let l=s.match(/([^=]+)=(.+$)/);if(l){let c=l[1].trim().replace(/ /g,"-");c&&(i.data||(i.data={}),i.data[c]=l[2])}else{let c=s.trim().replace(/ /g,"-");c&&(i.data||(i.data={}),i.data[c]=void 0)}}}(o.command==="\\htmlId"||o.command==="\\cssId")&&!i.id&&o.args&&typeof o.args[0]=="string"&&(i.id=o.args[0]),o=o.parent}return(r.mode==="math"||r.mode==="text")&&(i.latex=x.serialize([r],{defaultMode:"math"})),i}function rh(t,e){let r=t.model.at(e);for(;r;){if(r.command==="\\href"){let i=r.args[0];if(typeof i=="string")return i}r=r.parent}return""}var ih=`@keyframes ML__caret-blink { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0; + } +} +:host { + display: block; +} +.ML__container { + display: inline-flex; + flex-flow: row; + justify-content: space-between; + align-items: flex-end; + min-height: 39px; + /* Need some room for the virtual keyboard toggle */ + width: 100%; + padding: 4px; + box-sizing: border-box; + /* This attribute is necessary to work around a Firefox issue where + where clicking multiple times on the border leads to a focused mathfield that cannot be edited until focus is lost and regained (also fixes the multiple cursor issue on firefox that can occur with the same sequence of events). + */ + pointer-events: auto; + /* Prevent the browser from trying to interpret touch gestures in the field */ + /* "Disabling double-tap to zoom removes the need for browsers to + delay the generation of click events when the user taps the screen." */ + touch-action: none; + --_caret-color: var(--caret-color, hsl(var(--_hue), 40%, 49%)); + --_selection-color: var(--selection-color, #000); + --_selection-background-color: var(--selection-background-color, hsl(var(--_hue), 70%, 85%)); + --_text-highlight-background-color: var(--highlight-text, hsla(var(--_hue), 40%, 50%, 0.1)); + --_contains-highlight-background-color: var(--contains-highlight-background-color, hsl(var(--_hue), 40%, 95%)); + --_smart-fence-color: var(--smart-fence-color, currentColor); + --_smart-fence-opacity: var(--smart-fence-opacity, 0.5); + --_contains-highlight-color: var(--contains-highlight-color, var(--_caret-color)); + --_latex-color: var(--latex-color, hsl(var(--_hue), 80%, 40%)); + --_correct-color: var(--correct-color, #10a000); + --_incorrect-color: var(--incorrect-color, #a01b00); + --_composition-background-color: var(--composition-background-color, #fff1c2); + --_composition-text-color: var(--composition-text-color, black); + --_composition-underline-color: var(--composition-underline-color, transparent); + --_tooltip-border: var(--tooltip-border, 1px solid transparent); + --_tooltip-border-radius: var(--tooltip-border-radius, 8px); + --_tooltip-background-color: var(--tooltip-background-color, #616161); + --_tooltip-color: var(--tooltip-color, #fff); + --_tooltip-box-shadow: var(--tooltip-box-shadow, 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2)); +} +@media (prefers-color-scheme: dark) { + .ML__container { + --_contains-highlight-color: var(--contains-highlight-color, hsl(var(--_hue), 85%, 75%)); + --_caret-color: var(--caret-color, hsl(var(--_hue), 65%, 55%)); + --_selection-color: var(--selection-color, #fff); + --_selection-background-color: var(--selection-background-color, hsl(var(--_hue), 65%, 55%)); + --_text-highlight-background-color: var(--text-highlight-background-color, hsla(var(--_hue), 40%, 50%, 0.6)); + --_contains-highlight-background-color: var(--contains-highlight-background-color, hsl(var(--_hue), 5%, 34%)); + --_latex-color: var(--primary, hsl(var(--_hue), 40%, 50%)); + --_composition-background-color: #69571c; + --_composition-text-color: white; + --_placeholder-color: hsl(var(--_hue), 60%, 69%); + --_smart-fence-color: var(--smart-fence-color, #fff); + --_smart-fence-opacity: var(--smart-fence-opacity, 0.7); + } +} +@media (forced-colors: active) { + .ML__container { + --_caret-color: white; + --_selection-color: white; + --_smart-fence-color: white; + --_latex-color: white; + --_correct-color: white; + --_incorrect-color: white; + --_composition-text-color: white; + } +} +@media (hover: none) and (pointer: coarse) { + :host(:not(:focus)) .ML__container { + pointer-events: none; + } +} +/* This is the actual field content (formula) */ +.ML__content { + display: flex; + align-items: center; + align-self: center; + position: relative; + overflow: hidden; + padding: 2px 3px 2px 1px; + width: 100%; + /* Encourage the browser to use the GPU to render the field. + Weirdly, this is required for prompts to be rendered correctly. + */ + isolation: isolate; + text-shadow: var(--text-shadow); +} +.ML__content .ML__latex { + text-shadow: var(--text-shadow); +} +.ML__content .ML__sqrt-line { + box-shadow: var(--text-shadow); +} +.ML__content .ML__frac-line { + box-shadow: var(--text-shadow); +} +/* Container for the virtual keyboard toggle and menu toggle buttons */ +.ML__toggles { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 0; + align-self: flex-start; +} +/* Vertical layout modifier */ +.ML__toggles--vertical { + flex-direction: column; + align-items: center; + gap: 4px; +} +.ML__toggles--vertical .ML__virtual-keyboard-toggle, +.ML__toggles--vertical .ML__menu-toggle { + margin-right: 0; +} +.ML__virtual-keyboard-toggle, +.ML__menu-toggle { + box-sizing: border-box; + display: flex; + align-self: center; + align-items: center; + flex-shrink: 0; + flex-direction: column; + justify-content: center; + width: 34px; + height: 34px; + padding: 0; + margin-right: 4px; + cursor: pointer; + /* Avoid some weird blinking with :hover */ + border-radius: 8px; + border: 1px solid transparent; + transition: background 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + color: hsl(var(--_hue), 40%, 50%); + fill: currentColor; + background: transparent; +} +.ML__virtual-keyboard-toggle:hover, +.ML__menu-toggle:hover { + background: hsla(0, 0%, 70%, 0.3); + color: #333; + fill: currentColor; +} +.ML__virtual-keyboard-toggle > span, +.ML__menu-toggle > span { + display: flex; + align-self: center; + align-items: center; +} +@media (pointer: coarse) { + .ML__virtual-keyboard-toggle, + .ML__menu-toggle { + min-width: 60px; + min-height: 60px; + } +} +/* The invisible element used to capture keyboard events. We're just trying + really hard to make sure it doesn't show. */ +.ML__keyboard-sink { + display: inline-block; + resize: none; + outline: none; + border: none; + pointer-events: none; + /* Need these for Microsoft Edge */ + position: fixed; + clip: rect(0 0 0 0); + /* Need this to prevent iOS Safari from auto-zooming */ + font-size: 1em; + font-family: KaTeX_Main; + line-height: 0.5; + /* On Chromium, if this is 0, no keyboard events are received */ + /* Preferred over clip */ + clip-path: inset(50%); +} +[part='placeholder'] { + color: var(--neutral-400); +} +.ML__composition { + background: var(--_composition-background-color); + color: var(--_composition-text-color); + text-decoration: underline var(--_composition-underline-color); +} +.ML__caret { + display: inline-block; +} +.ML__caret::after { + content: ''; + visibility: hidden; + width: 0; + display: inline-block; + height: 0.76em; + --_caret-width: clamp(2px, 0.08em, 10px); + border: none; + border-radius: calc(var(--_caret-width) / 2); + border-right: var(--_caret-width) solid var(--_caret-color); + margin-right: calc(-1 * var(--_caret-width)); + position: relative; + left: -0.045em; + bottom: -0.05em; + animation: ML__caret-blink 1.05s step-end forwards infinite; +} +.ML__text-caret::after { + content: ''; + visibility: hidden; + width: 0; + display: inline-block; + height: 0.76em; + --_caret-width: clamp(2px, 0.08em, 10px); + border: none; + border-radius: calc(var(--_caret-width) / 2); + border-right: var(--_caret-width) solid var(--_caret-color); + margin-right: calc(-1 * var(--_caret-width)); + position: relative; + left: -0.045em; + bottom: -0.05em; + animation: ML__caret-blink 1.05s step-end forwards infinite; +} +.ML__latex-caret::after { + content: ''; + visibility: hidden; + --_caret-width: clamp(2px, 0.08em, 10px); + border: none; + border-radius: calc(var(--_caret-width) / 2); + border-right: var(--_caret-width) solid var(--_latex-color); + margin-right: calc(-1 * var(--_caret-width)); + position: relative; + left: -0.019em; + animation: ML__caret-blink 1.05s step-end forwards infinite; +} +.ML__focused .ML__latex-caret::after, +.ML__focused .ML__text-caret::after, +.ML__focused .ML__caret::after { + visibility: visible; +} +.ML__focused .ML__text { + background: var(--_text-highlight-background-color); +} +/* When using smartFence, the anticipated closing fence is displayed +with this style */ +.ML__smart-fence__close { + opacity: var(--_smart-fence-opacity); + color: var(--_smart-fence-color); +} +.ML__focused .ML__selected, +.ML__focused .ML__selected .ML__contains-caret, +.ML__focused .ML__selected .ML__smart-fence__close, +.ML__focused .ML__selected .ML__placeholder { + color: var(--_selection-color); + opacity: 1; +} +.ML__empty-line-anchor::after { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 8px; + height: 20px; + border-radius: 2px; + background: transparent; + opacity: 0; + pointer-events: none; +} +.ML__focused .ML__empty-line-anchor.ML__selected::after { + background: var(--_selection-background-color); + opacity: 1; +} +.ML__selection { + box-sizing: border-box; + background: transparent; +} +:host(:focus) .ML__selection { + background: var(--_selection-background-color) !important; +} +.ML__contains-caret.ML__close, +.ML__contains-caret.ML__open, +.ML__contains-caret > .ML__close, +.ML__contains-caret > .ML__open, +.ML__contains-caret .ML__sqrt-sign, +.ML__contains-caret .ML__sqrt-line { + color: var(--_contains-highlight-color); +} +.ML__contains-highlight { + box-sizing: border-box; + background: transparent; +} +.ML__focused .ML__contains-highlight { + background: var(--_contains-highlight-background-color); +} +.ML__raw-latex { + font-family: 'Berkeley Mono', 'IBM Plex Mono', 'Source Code Pro', Consolas, 'Roboto Mono', Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Courier, monospace; + font-weight: 400; + font-size: 0.8em; + letter-spacing: -0.05em; + color: var(--_latex-color); +} +.ML__suggestion { + color: var(--neutral-500); +} +.ML__virtual-keyboard-toggle.is-visible.is-pressed:hover { + background: hsl(var(--_hue), 25%, 35%); + color: #fafafa; + fill: currentColor; +} +.ML__virtual-keyboard-toggle.is-pressed, +.ML__virtual-keyboard-toggle.is-active:hover, +.ML__virtual-keyboard-toggle.is-active { + background: hsl(var(--_hue), 25%, 35%); + color: #fafafa; + fill: currentColor; +} +/* Add an attribute 'data-tooltip' to automatically show a + tooltip over a element on hover. +*/ +[data-tooltip] { + position: relative; +} +[data-tooltip]::after { + content: attr(data-tooltip); + position: absolute; + display: block; + z-index: 2; + pointer-events: none; + right: auto; + top: calc(-100% - 4px); + width: max-content; + max-width: 200px; + padding: 8px 8px; + border-radius: 4px; + background: #616161; + color: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + text-align: center; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-style: normal; + font-weight: 400; + font-size: 13px; + /* Phone */ + opacity: 0; + transform: scale(0.5); +} +@media only screen and (max-width: 767px) { + [data-tooltip]::after { + padding: 8px 16px; + font-size: 16px; + } +} +menu [data-tooltip]::after { + left: 100%; + top: 0%; +} +menu .ML__base { + cursor: default; +} +/** Don't display if we're tracking, i.e. have the pointer down */ +.tracking [data-tooltip]:hover::after { + /* Use visibility, not display. Display will remove the after from the DOM, and the override below will not work */ + visibility: hidden; +} +/** But do display if tracking and inside a menu */ +.tracking menu li[data-tooltip]:hover::after, +[data-tooltip]:hover::after { + visibility: visible; + opacity: 1; + transform: scale(1); + transition-property: opacity, scale; + transition-duration: 0.15s; + transition-delay: 1s; + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} +.ML__prompt { + border-radius: 2px; +} +.ML__editablePromptBox { + outline: 1px solid #acacac; + border-radius: 2px; + z-index: -1; +} +.ML__focused .ML__focusedPromptBox { + outline: highlight auto 1px; +} +.ML__lockedPromptBox { + background-color: rgba(142, 142, 141, 0.4); + z-index: -1; +} +.ML__correctPromptBox { + outline: 1px solid var(--_correct-color); + box-shadow: 0 0 5px var(--_correct-color); +} +.ML__incorrectPromptBox { + outline: 1px solid var(--_incorrect-color); + box-shadow: 0 0 5px var(--_incorrect-color); +} +.variant-submenu { + display: flex; + flex-direction: column; + padding: 8px; +} +.variant-submenu [part='menu-item'].ML__xl { + font-size: 2rem; + text-align: center; + margin: 0; +} +.ML__center-menu .label { + text-align: center; +} +.insert-matrix-submenu { + /* Grid doesn't work on Safari */ + --_menu-item-size: 25px; + width: calc(5 * var(--_menu-item-size)); + display: flex; + flex-wrap: wrap; + padding: 8px; + align-content: center; + justify-content: center; +} +.insert-matrix-submenu [part='menu-item'] { + width: var(--_menu-item-size); + height: var(--_menu-item-size); + font-size: 21px; + border: none; + border-radius: 0; + line-height: 21px; + text-align: center; + padding: 0; + margin: 0; +} +.border-submenu [part='menu-item'] { + font-size: 2rem; + line-height: 1.2; + text-align: center; +} +.swatches-submenu { + --_swatch-size: 2rem; + --_columns: 4; + display: flex; + flex-flow: wrap; + padding: 8px; + max-width: calc(var(--_columns) * (var(--_swatch-size) + 18px) + 16px); + box-sizing: border-box; +} +.menu-swatch { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: fit-content; + height: fit-content; + margin: 2px; + padding: 0; + background: var(--neutral-200); +} +.menu-swatch > .label { + padding: 0; + margin: 0; + line-height: 0; +} +.menu-swatch > .label > span { + display: inline-block; + margin: 6px; + min-width: var(--_swatch-size); + min-height: var(--_swatch-size); + border-radius: 50%; +} +.menu-swatch.active { + background: var(--neutral-100); + z-index: 1; + scale: 1.4; +} +.menu-swatch.active > .label > span { + border-radius: 2px; +} +.menu-swatch .ui-checkmark, +.menu-swatch .ui-mixedmark { + position: absolute; + margin: 0; + padding: 0; + color: white; +} +.menu-swatch.dark-contrast .ui-checkmark, +.menu-swatch.dark-contrast .ui-mixedmark { + color: #000; +} +.ML__insert-template { + font-size: 1em; +} +.ML__insert-label { + opacity: 0.5; + margin-left: 2ex; +} +`;var nh=`.ML__container { + min-height: auto !important; + --_hue: var(--hue, 212); + --_placeholder-color: var(--placeholder-color, hsl(var(--_hue), 40%, 49%)); + --_placeholder-opacity: var(--placeholder-opacity, 0.4); + --_text-font-family: var(--text-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif); +} +.ML__sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + clip-path: inset(50%); + white-space: nowrap; + border: 0; +} +.ML__is-inline { + display: inline-block; +} +.ML__base { + visibility: inherit; + display: inline-block; + position: relative; + cursor: text; + padding: 0; + margin: 0; + box-sizing: content-box; + border: 0; + outline: 0; + vertical-align: baseline; + font-weight: inherit; + font-family: inherit; + font-style: inherit; + text-decoration: none; + width: min-content; +} +.ML__strut, +.ML__strut--bottom { + display: inline-block; + min-height: 0.5em; +} +.ML__small-delim { + font-family: KaTeX_Main; +} +/* Text mode */ +.ML__text { + font-family: var(--_text-font-family); + white-space: pre; +} +/* Use cmr for 'math upright' */ +.ML__cmr { + font-family: KaTeX_Main; + font-style: normal; +} +.ML__mathit { + font-family: KaTeX_Math; + /* The KaTeX_Math font is italic by default, so the font-style below is only + useful when a fallback font is used + */ + font-style: italic; +} +.ML__mathbf { + font-family: KaTeX_Main; + font-weight: bold; +} +/* Lowercase greek symbols should stick to math font when \\mathbf is applied + to match TeX idiosyncratic behavior */ +.lcGreek.ML__mathbf { + font-family: KaTeX_Math; +} +.ML__mathbfit { + font-family: KaTeX_Math; + font-weight: bold; + font-style: italic; +} +.ML__ams { + font-family: KaTeX_AMS; +} +/* Blackboard */ +.ML__bb { + font-family: KaTeX_AMS; +} +.ML__cal { + font-family: KaTeX_Caligraphic; +} +.ML__frak { + font-family: KaTeX_Fraktur; +} +.ML__tt { + font-family: KaTeX_Typewriter; +} +.ML__script { + font-family: KaTeX_Script; +} +.ML__sans { + font-family: KaTeX_SansSerif; +} +.ML__series_ul { + font-weight: 100; +} +.ML__series_el { + font-weight: 100; +} +.ML__series_l { + font-weight: 200; +} +.ML__series_sl { + font-weight: 300; +} +.ML__series_sb { + font-weight: 500; +} +.ML__bold { + font-weight: 700; +} +.ML__series_eb { + font-weight: 800; +} +.ML__series_ub { + font-weight: 900; +} +.ML__series_uc { + font-stretch: ultra-condensed; +} +.ML__series_ec { + font-stretch: extra-condensed; +} +.ML__series_c { + font-stretch: condensed; +} +.ML__series_sc { + font-stretch: semi-condensed; +} +.ML__series_sx { + font-stretch: semi-expanded; +} +.ML__series_x { + font-stretch: expanded; +} +.ML__series_ex { + font-stretch: extra-expanded; +} +.ML__series_ux { + font-stretch: ultra-expanded; +} +.ML__it { + font-style: italic; +} +.ML__shape_ol { + -webkit-text-stroke: 1px black; + text-stroke: 1px black; + color: transparent; +} +.ML__shape_sc { + font-variant: small-caps; +} +.ML__shape_sl { + font-style: oblique; +} +/* First level emphasis */ +.ML__emph { + color: #bc2612; +} +/* Second level emphasis */ +.ML__emph .ML__emph { + color: #0c7f99; +} +.ML__highlight { + color: #007cb2; + background: #edd1b0; +} +.ML__center { + text-align: center; +} +.ML__left { + text-align: left; +} +.ML__right { + text-align: right; +} +.ML__label_padding { + padding: 0 0.5em; +} +.ML__frac-line { + width: 100%; + min-height: 1px; +} +.ML__frac-line:after { + content: ''; + display: block; + /* A custom bar thickness, for example from \`\\genfrac\`, sets the + \`--frac-line-thickness\` variable on the element. The bar then fills + the element, so \`--frac-line-margin\` is set to 0. */ + margin-top: var(--frac-line-margin, max(-1px, -0.04em)); + min-height: var(--frac-line-thickness, max(1px, 0.04em)); + /* Ensure the line is visible when printing even if "turn off background images" is on*/ + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + /* There's a bug since Chrome 62 where + sub-pixel border lines don't draw at some zoom + levels (110%, 90%). + Setting the min-height used to work around it, but that workaround + broke in Chrome 84 or so. + Setting the background (and the min-height) seems to work for now. + */ + background: currentColor; + box-sizing: content-box; + /* Vuetify sets the box-sizing to inherit + causes the fraction line to not draw at all sizes (see #26) */ + /* On some versions of Firefox on Windows, the line fails to + draw at some zoom levels, but setting the transform triggers + the hardware accelerated path, which works */ + transform: translate(0, 0); + forced-color-adjust: preserve-parent-color; +} +@media (forced-colors: active) { + .ML__frac-line { + min-height: 0px; + } +} +.ML__sqrt { + display: inline-block; +} +.ML__sqrt-sign { + display: inline-block; + position: relative; +} +.ML__sqrt-line { + display: inline-block; + height: max(1px, 0.04em); + width: 100%; +} +.ML__sqrt-line:before { + content: ''; + display: block; + margin-top: min(-1px, -0.04em); + min-height: max(1px, 0.04em); + /* Ensure the line is visible when printing even if "turn off background images" is on*/ + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + background: currentColor; + /* On some versions of Firefox on Windows, the line fails to + draw at some zoom levels, but setting the transform triggers + the hardware accelerated path, which works */ + transform: translate(0, 0); + forced-color-adjust: preserve-parent-color; +} +@media (forced-colors: active) { + .ML__sqrt-line:after { + background: white !important; + } +} +.ML__sqrt-line:after { + border-bottom-width: 1px; + content: ' '; + display: block; + margin-top: -0.1em; +} +.ML__sqrt-index { + margin-left: 0.27777778em; + margin-right: -0.55555556em; +} +.ML__delim-size1 { + font-family: KaTeX_Size1; +} +.ML__delim-size2 { + font-family: KaTeX_Size2; +} +.ML__delim-size3 { + font-family: KaTeX_Size3; +} +.ML__delim-size4 { + font-family: KaTeX_Size4; +} +.ML__delim-mult .delim-size1 > span { + font-family: KaTeX_Size1; +} +.ML__delim-mult .delim-size4 > span { + font-family: KaTeX_Size4; +} +.ML__accent-body { + font-family: KaTeX_Main; +} +.ML__accent-combining-char { + position: relative; + left: 0.24em; +} +/** The markup for a LaTeX formula, either in an editable mathfield or + in a static display. +*/ +.ML__latex { + display: inline-block; + direction: ltr; + text-align: left; + text-indent: 0; + text-rendering: auto; + font-family: inherit; + font-style: normal; + font-size-adjust: none; + font-stretch: normal; + font-variant-caps: normal; + letter-spacing: normal; + line-height: 1.2; + word-wrap: normal; + word-spacing: normal; + white-space: nowrap; + text-shadow: none; + -webkit-user-select: none; + user-select: none; + width: min-content; + forced-color-adjust: preserve-parent-color; +} +.ML__latex .style-wrap { + position: relative; +} +.ML__latex .ML__mfrac { + display: inline-block; +} +.ML__latex .ML__left-right { + display: inline-block; +} +.ML__latex .ML__vlist-t { + display: inline-table; + table-layout: fixed; + border-collapse: collapse; +} +.ML__latex .ML__vlist-r { + display: table-row; +} +.ML__latex .ML__vlist { + display: table-cell; + vertical-align: bottom; + position: relative; +} +.ML__latex .ML__vlist > span { + display: block; + height: 0; + position: relative; +} +.ML__latex .ML__vlist > span > span { + display: inline-block; +} +.ML__latex .ML__vlist > span > .ML__pstrut { + overflow: hidden; + width: 0; +} +.ML__latex .ML__vlist-t2 { + margin-right: -2px; +} +.ML__latex .ML__vlist-s { + display: table-cell; + vertical-align: bottom; + font-size: 1px; + width: 2px; + min-width: 2px; +} +.ML__latex .ML__msubsup { + text-align: left; +} +.ML__latex .ML__negativethinspace { + display: inline-block; + margin-left: -0.16667em; + height: 0.71em; +} +.ML__latex .ML__thinspace { + display: inline-block; + width: 0.16667em; + height: 0.71em; +} +.ML__latex .ML__mediumspace { + display: inline-block; + width: 0.22222em; + height: 0.71em; +} +.ML__latex .ML__thickspace { + display: inline-block; + width: 0.27778em; + height: 0.71em; +} +.ML__latex .ML__enspace { + display: inline-block; + width: 0.5em; + height: 0.71em; +} +.ML__latex .ML__quad { + display: inline-block; + width: 1em; + height: 0.71em; +} +.ML__latex .ML__qquad { + display: inline-block; + width: 2em; + height: 0.71em; +} +.ML__latex .ML__llap, +.ML__latex .ML__rlap { + width: 0; + position: relative; + display: inline-block; +} +.ML__latex .ML__llap > .ML__inner, +.ML__latex .ML__rlap > .ML__inner { + position: absolute; +} +.ML__latex .ML__llap > .ML__fix, +.ML__latex .ML__rlap > .ML__fix { + display: inline-block; +} +.ML__latex .ML__llap > .ML__inner { + right: 0; +} +.ML__latex .ML__rlap > .ML__inner { + left: 0; +} +.ML__latex .ML__rule { + display: inline-block; + border: solid 0; + position: relative; + box-sizing: border-box; +} +.ML__latex .overline .overline-line, +.ML__latex .underline .underline-line { + width: 100%; +} +.ML__latex .overline .overline-line:before, +.ML__latex .underline .underline-line:before { + content: ''; + border-bottom-style: solid; + border-bottom-width: max(1px, 0.04em); + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: block; +} +.ML__latex .overline .overline-line:after, +.ML__latex .underline .underline-line:after { + border-bottom-style: solid; + border-bottom-width: max(1px, 0.04em); + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + content: ''; + display: block; + margin-top: -1px; +} +.ML__latex .ML__stretchy { + display: block; + position: absolute; + width: 100%; + left: 0; + overflow: hidden; +} +.ML__latex .ML__stretchy:before, +.ML__latex .ML__stretchy:after { + content: ''; +} +.ML__latex .ML__stretchy svg { + display: block; + position: absolute; + width: 100%; + height: inherit; + fill: currentColor; + stroke: currentColor; + fill-rule: nonzero; + fill-opacity: 1; + stroke-width: 1; + stroke-linecap: butt; + stroke-linejoin: miter; + stroke-miterlimit: 4; + stroke-dasharray: none; + stroke-dashoffset: 0; + stroke-opacity: 1; +} +.ML__latex .slice-1-of-2 { + display: inline-flex; + position: absolute; + left: 0; + width: 50.2%; + overflow: hidden; +} +.ML__latex .slice-2-of-2 { + display: inline-flex; + position: absolute; + right: 0; + width: 50.2%; + overflow: hidden; +} +.ML__latex .slice-1-of-3 { + display: inline-flex; + position: absolute; + left: 0; + width: 25.1%; + overflow: hidden; +} +.ML__latex .slice-2-of-3 { + display: inline-flex; + position: absolute; + left: 25%; + width: 50%; + overflow: hidden; +} +.ML__latex .slice-3-of-3 { + display: inline-flex; + position: absolute; + right: 0; + width: 25.1%; + overflow: hidden; +} +.ML__latex .slice-1-of-1 { + display: inline-flex; + position: absolute; + width: 100%; + left: 0; + overflow: hidden; +} +.ML__latex .ML__nulldelimiter { + display: inline-block; +} +.ML__latex .ML__op-group { + display: inline-block; +} +.ML__latex .ML__op-symbol { + position: relative; +} +.ML__latex .ML__op-symbol.ML__small-op { + font-family: KaTeX_Size1; +} +.ML__latex .ML__op-symbol.ML__large-op { + font-family: KaTeX_Size2; +} +.ML__latex:has(.ML__center_environment), +.ML__latex:has(.ML__multiline_environment), +.ML__latex:has(.ML__align_environment), +.ML__latex:has(.ML__eqnarray_environment), +.ML__latex:has(.ML__gather_environment) { + width: 100%; +} +.ML__latex .ML__multiline_environment { + display: inline-flex; + width: 100%; +} +.ML__latex .ML__center_environment { + display: inline-flex; + width: 100%; + justify-content: center; +} +.ML__latex .ML__align_environment, +.ML__latex .ML__eqnarray_environment, +.ML__latex .ML__gather_environment { + display: inline-block; +} +.ML__latex .ML__mtable .ML__vertical-separator { + display: inline-block; + min-width: 1px; + box-sizing: border-box; +} +.ML__latex .ML__mtable .ML__arraycolsep { + display: inline-block; +} +.ML__latex .ML__mtable .col-align-m > .ML__vlist-t { + text-align: center; +} +.ML__latex .ML__mtable .col-align-c > .ML__vlist-t { + text-align: center; +} +.ML__latex .ML__mtable .col-align-l > .ML__vlist-t { + text-align: left; +} +.ML__latex .ML__mtable .col-align-r > .ML__vlist-t { + text-align: right; +} +[data-href] { + cursor: pointer; +} +.ML__error { + display: inline-block; + background-image: radial-gradient(ellipse at center, hsl(341, 100%, 40%), rgba(0, 0, 0, 0) 70%); + background-color: hsla(341, 100%, 40%, 0.1); + background-repeat: repeat-x; + background-size: 3px 3px; + padding-bottom: 3px; + background-position: 0 100%; +} +.ML__error > .ML__error { + background: transparent; + padding: 0; +} +.ML__placeholder { + color: var(--_placeholder-color); + opacity: var(--_placeholder-opacity); + padding-left: 0.4ex; + padding-right: 0.4ex; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; +} +.ML__notation { + position: absolute; + box-sizing: border-box; + line-height: 0; +} +/* This class is used to implement the \`\\mathtip\` and \`\\texttip\` commands + For UI elements, see \`[data-ML__tooltip]\` +*/ +.ML__tooltip-container { + position: relative; + transform: scale(0); +} +.ML__tooltip-container .ML__tooltip-content { + position: fixed; + display: inline-table; + visibility: hidden; + z-index: 2; + width: max-content; + max-width: 400px; + padding: 12px 12px; + border: var(--_tooltip-border); + border-radius: var(--_tooltip-border-radius); + background: var(--_tooltip-background-color); + --_selection-color: var(--_tooltip-color); + color: var(--_tooltip-color); + box-shadow: var(--_tooltip-box-shadow); + opacity: 0; + transition: opacity 0.15s cubic-bezier(0.4, 0, 1, 1); +} +.ML__tooltip-container .ML__tooltip-content .ML__text { + white-space: normal; +} +.ML__tooltip-container .ML__tooltip-content .ML__base { + display: contents; +} +.ML__tooltip-container:hover .ML__tooltip-content { + visibility: visible; + opacity: 1; + font-size: 0.75em; + transform: scale(1) translate(0, 3em); +} +.ML__bg { + background-color: transparent !important; +} +.ML__bg::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--bg-color); + z-index: -1; + box-sizing: border-box; +} +`;var oh=`#mathlive-environment-popover.is-visible { + visibility: visible; +} +#mathlive-environment-popover { + --_environment-panel-height: var(--environment-panel-height, 70px); + --_accent-color: var(--accent-color, #aaa); + --_background: var(--environment-panel-background, #fff); + --_button-background: var(--environment-panel-button-background, white); + --_button-background-hover: var(--environment-panel-button-background-hover, #f5f5f7); + --_button-background-active: var(--environment-panel-button-background-active, #f5f5f7); + --_button-text: var(--environment-panel-button-text, #e3e4e8); + position: absolute; + width: calc(var(--_environment-panel-height) * 2); + height: var(--_environment-panel-height); + border-radius: 4px; + border: 1.5px solid var(--_accent-color); + background-color: var(--_background); + box-shadow: 0 0 30px 0 var(--environment-shadow, rgba(0, 0, 0, 0.4)); + pointer-events: all; + visibility: hidden; +} +#mathlive-environment-popover .MLEP__array-buttons { + height: calc(var(--_environment-panel-height) * 5/4); + width: calc(var(--_environment-panel-height) * 5/4); + margin-left: calc(0px - var(--_environment-panel-height) * 0.16); + margin-top: calc(0px - var(--_environment-panel-height) * 0.19); +} +#mathlive-environment-popover .MLEP__array-buttons .font { + fill: white; +} +#mathlive-environment-popover .MLEP__array-buttons circle { + fill: #7f7f7f; + transition: fill 300ms; +} +#mathlive-environment-popover .MLEP__array-buttons .MLEP__array-insert-background { + fill-opacity: 1; + fill: var(--_background); + stroke: var(--_accent-color); + stroke-width: 3px; +} +#mathlive-environment-popover .MLEP__array-buttons line { + stroke: var(--_accent-color); + stroke-opacity: 0; + stroke-width: 40; + pointer-events: none; + transition: stroke-opacity 300ms; + stroke-linecap: round; +} +#mathlive-environment-popover .MLEP__array-buttons g[data-command]:hover circle { + fill: var(--_accent-color); +} +#mathlive-environment-popover .MLEP__array-buttons g[data-command]:hover line { + stroke-opacity: 1; +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls { + height: 100%; + width: 50%; +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options { + width: var(--_environment-panel-height); + height: var(--_environment-panel-height); + display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: space-around; +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg { + pointer-events: all; + margin-top: 2px; + width: calc(var(--_environment-panel-height) / 3 * 28 / 24); + height: calc(var(--_environment-panel-height) / 3 - 2px); + border-radius: calc(var(--_environment-panel-height) / 25); + background-color: var(--_button-background); +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg:hover { + background-color: var(--_button-background-hover); +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg path, +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg line { + stroke: var(--_button-text); + stroke-width: 2; + stroke-linecap: round; +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg rect, +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg path { + fill-opacity: 0; +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg.active { + pointer-events: none; + background-color: var(--_button-background-active); +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg.active path, +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg.active line { + stroke: var(--_accent-color); +} +#mathlive-environment-popover .MLEP__environment-delimiter-controls .MLEP__array-delimiter-options svg.active circle { + fill: var(--_accent-color); +} +`;var ah=`/* The element that display info while in latex mode */ +#mathlive-suggestion-popover { + --_suggestion-zindex: var(--suggestion-zindex, 100); + background-color: rgba(97, 97, 97); + color: #fff; + text-align: center; + border-radius: 8px; + position: fixed; + z-index: var(--_suggestion-zindex); + display: none; + flex-direction: column; + justify-content: center; + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} +#mathlive-suggestion-popover.top-tip::after { + content: ''; + position: absolute; + top: -15px; + left: calc(50% - 15px); + width: 0; + height: 0; + border-left: 15px solid transparent; + border-right: 15px solid transparent; + border-bottom: 15px solid rgba(97, 97, 97); + font-size: 1rem; +} +#mathlive-suggestion-popover.bottom-tip::after { + content: ''; + position: absolute; + bottom: -15px; + left: calc(50% - 15px); + width: 0; + height: 0; + border-left: 15px solid transparent; + border-right: 15px solid transparent; + border-top: 15px solid rgba(97, 97, 97); + font-size: 1rem; +} +#mathlive-suggestion-popover.is-animated { + transition: all 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + animation: ML__fade-in cubic-bezier(0, 0, 0.2, 1) 0.15s; +} +#mathlive-suggestion-popover.is-visible { + display: flex; +} +@keyframes ML__fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +/* The wrapper class for the entire content of the popover panel */ +#mathlive-suggestion-popover ul { + display: flex; + flex-flow: column; + list-style: none; + margin: 0; + padding: 0; + align-items: flex-start; + max-height: 400px; + overflow-y: auto; +} +#mathlive-suggestion-popover li { + display: flex; + flex-direction: row; + justify-content: space-between; + margin: 8px; + padding: 8px; + width: calc(100% - 16px - 16px); + column-gap: 1em; + border-radius: 8px; + cursor: pointer; + /* Since the content can be clicked on, provide feedback on hover */ +} +#mathlive-suggestion-popover li a { + color: #5ea6fd; + padding-top: 0.3em; + margin-top: 0.4em; + display: block; +} +#mathlive-suggestion-popover li a:hover { + color: #5ea6fd; + text-decoration: underline; +} +#mathlive-suggestion-popover li:hover, +#mathlive-suggestion-popover li.is-pressed, +#mathlive-suggestion-popover li.is-active { + background: rgba(255, 255, 255, 0.1); +} +/* The command inside a popover (inside a #mathlive-suggestion-popover) */ +.ML__popover__command { + font-size: 1.6rem; + font-family: KaTeX_Main; +} +.ML__popover__current { + background: #5ea6fd; + color: #fff; +} +.ML__popover__latex { + font-family: 'IBM Plex Mono', 'Source Code Pro', Consolas, 'Roboto Mono', Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Courier, monospace; + align-self: center; +} +/* The keyboard shortcuts for a symbol as displayed in the popover */ +.ML__popover__keybinding { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 0.8em; + opacity: 0.7; +} +/* Style for the character that joins the modifiers of a keyboard shortcut +(usually a "+" sign)*/ +.ML__shortcut-join { + opacity: 0.5; +} +`;var sh=`/* The element that displays the keys as the user type them */ +#mathlive-keystroke-caption-panel { + visibility: hidden; + /*min-width: 160px;*/ + /*background-color: rgba(97, 97, 200, .95);*/ + background: var(--secondary, hsl(var(--_hue), 19%, 26%)); + border-color: var(--secondary-border, hsl(0, 0%, 91%)); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); + text-align: center; + border-radius: 6px; + padding: 16px; + position: absolute; + z-index: 1; + display: flex; + flex-direction: row-reverse; + justify-content: center; + --keystroke: white; + --on-keystroke: #555; + --keystroke-border: #f7f7f7; +} +@media (prefers-color-scheme: dark) { + body:not([theme='light']) #mathlive-keystroke-caption-panel { + --keystroke: hsl(var(--_hue), 50%, 30%); + --on-keystroke: hsl(0, 0%, 98%); + --keystroke-border: hsl(var(--_hue), 50%, 25%); + } +} +body[theme='dark'] #mathlive-keystroke-caption-panel { + --keystroke: hsl(var(--_hue), 50%, 30%); + --on-keystroke: hsl(0, 0%, 98%); + --keystroke-border: hsl(var(--_hue), 50%, 25%); +} +#mathlive-keystroke-caption-panel > span { + min-width: 14px; + /*height: 8px;*/ + margin: 0 8px 0 0; + padding: 4px; + background-color: var(--keystroke); + color: var(--on-keystroke); + fill: currentColor; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 1em; + border-radius: 6px; + border: 2px solid var(--keystroke-border); + /*box-shadow: 0 7px 14px rgba(0,0,0,0.25), 0 5px 5px rgba(0,0,0,0.22);*/ +} +`;var lh=`.ML__keyboard { + --_keyboard-height: 0; + --_keyboard-zindex: var(--keyboard-zindex, 105); + --_accent-color: var(--keyboard-accent-color, #0c75d8); + --_background: var(--keyboard-background, #cacfd7); + --_border: var(--keyboard-border, #ddd); + --_padding-horizontal: var(--keyboard-padding-horizontal, 0px); + --_padding-top: var(--keyboard-padding-top, 5px); + --_padding-bottom: var(--keyboard-padding-bottom, 0px); + --_row-padding-left: var(--keyboard-row-padding-left, 0px); + --_row-padding-right: var(--keyboard-row-padding-right, 0px); + --_toolbar-text: var(--keyboard-toolbar-text, #2c2e2f); + --_toolbar-text-active: var(--keyboard-toolbar-text-active, var(--_accent-color)); + --_toolbar-background: var(--keyboard-toolbar-background, transparent); + --_toolbar-background-hover: var(--keyboard-toolbar-background-hover, #eee); + --_toolbar-background-selected: var(--keyboard-toolbar-background-selected, transparent); + --_toolbar-font-size: var(--keyboard-toolbar-font-size, '135%'); + --_horizontal-rule: var(--keyboard-horizontal-rule, 1px solid #fff); + --_keycap-background: var(--keycap-background, #f0f0f0); + --_keycap-background-hover: var(--keycap-background-hover, #f5f5f7); + --_keycap-background-active: var(--keycap-background-active, var(--_accent-color)); + --_keycap-background-pressed: var(--keycap-background-pressed, var(--_accent-color)); + --_keycap-border: var(--keycap-border, #e5e6e9); + --_keycap-border-bottom: var(--keycap-border-bottom, #8d8f92); + --_keycap-text: var(--keycap-text, #000); + --_keycap-text-active: var(--keycap-text-active, #fff); + --_keycap-text-hover: var(--keycap-text-hover, var(--_keycap-text)); + --_keycap-text-pressed: var(--keycap-text-pressed, #fff); + --_keycap-shift-text: var(--keycap-shift-text, var(--_accent-color)); + --_keycap-primary-background: var(--keycap-primary-background, var(--_accent-color)); + --_keycap-primary-text: var(--keycap-primary-text, #ddd); + --_keycap-primary-background-hover: var(--keycap-primary-background-hover, #0d80f2); + --_keycap-secondary-background: var(--keycap-secondary-background, #a0a9b8); + --_keycap-secondary-background-hover: var(--keycap-secondary-background-hover, #7d8795); + --_keycap-secondary-text: var(--keycap-secondary-text, #060707); + --_keycap-secondary-border: var(--keycap-secondary-border, #c5c9d0); + --_keycap-secondary-border-bottom: var(--keycap-secondary-border-bottom, #989da6); + --_keycap-height: var(--keycap-height, 60px); + /* Keycap width (incl. margin) */ + --_keycap-max-width: var(--keycap-max-width, 100px); + --_keycap-gap: var(--keycap-gap, 8px); + --_keycap-font-size: var(--keycap-font-size, clamp(16px, 4cqw, 24px)); + --_keycap-small-font-size: var(--keycap-small-font-size, calc(var(--keycap-font-size) * 0.8)); + --_keycap-extra-small-font-size: var(--keycap-extra-small-font-size, calc(var(--keycap-font-size) / 1.42)); + --_variant-panel-background: var(--variant-panel-background, #f0f0f0); + --_variant-keycap-text: var(--variant-keycap-text, var(--_keycap-text)); + --_variant-keycap-text-active: var(--variant-keycap-text-active, var(--_keycap-text-active)); + --_variant-keycap-background-active: var(--variant-keycap-background-active, var(--_accent-color)); + --_variant-keycap-length: var(--variant-keycap-length, 70px); + --_variant-keycap-font-size: var(--variant-keycap-font-size, 30px); + --_variant-keycap-aside-font-size: var(--variant-keycap-aside-font-size, 12px); + --_keycap-shift-font-size: var(--keycap-shift-font-size, 16px); + --_keycap-shift-color: var(--keycap-shift-color, var(--_accent-color)); + --_box-placeholder-color: var(--box-placeholder-color, var(--_accent-color)); + --_box-placeholder-pressed-color: var(--box-placeholder-pressed-color, var(--keycap-text-pressed)); + --_keycap-glyph-size: var(--keycap-glyph-size, 20px); + --_keycap-glyph-size-lg: var(--keycap-glyph-size-lg, 24px); + --_keycap-glyph-size-xl: var(--keycap-glyph-size-xl, 50px); +} +.is-math-mode .MLK__rows .if-text-mode, +.is-text-mode .MLK__rows .if-math-mode { + display: none; +} +.if-can-undo, +.if-can-redo, +.if-can-copy, +.if-can-cut, +.if-can-paste { + opacity: 0.4; + pointer-events: none; +} +.can-undo .if-can-undo, +.can-redo .if-can-redo, +.can-copy .if-can-copy, +.can-cut .if-can-cut, +.can-paste .if-can-paste { + opacity: 1; + pointer-events: all; +} +body > .ML__keyboard { + position: fixed; + --_padding-bottom: calc(var(--keyboard-padding-bottom, 0px) + env(safe-area-inset-bottom, 0)); +} +body > .ML__keyboard.is-visible > .MLK__backdrop { + box-shadow: 0 -5px 6px rgba(0, 0, 0, 0.08); + border-top: 1px solid var(--_border); +} +body > .ML__keyboard.backdrop-is-transparent.is-visible > .MLK__backdrop { + box-shadow: none; + border: none; +} +body > .ML__keyboard.is-visible.animate > .MLK__backdrop { + transition: 0.28s cubic-bezier(0, 0, 0.2, 1); + transition-property: transform, opacity; + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} +.ML__keyboard { + position: relative; + overflow: hidden; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: var(--_keyboard-zindex); + box-sizing: border-box; + outline: none; + border: none; + margin: 0; + padding: 0; + line-height: 1; + overflow-wrap: unset; + text-align: left; + vertical-align: baseline; + cursor: auto; + white-space: pre; + box-shadow: none; + opacity: 1; + transform: none; + pointer-events: none; +} +.ML__keyboard :where(div) { + box-sizing: border-box; + outline: none; + border: none; + margin: 0; + padding: 0; + line-height: 1; + overflow-wrap: unset; + text-align: left; + vertical-align: baseline; + cursor: auto; + white-space: pre; + box-shadow: none; + transform: none; +} +.MLK__backdrop { + position: absolute; + bottom: calc(-1 * var(--_keyboard-height)); + width: 100%; + height: var(--_keyboard-height); + box-sizing: border-box; + padding-top: var(--_padding-top); + padding-bottom: var(--_padding-bottom); + padding-left: var(--_padding-horizontal); + padding-right: var(--_padding-horizontal); + opacity: 0; + visibility: hidden; + transform: translate(0, 0); + background: var(--_background); +} +.backdrop-is-transparent .MLK__backdrop { + background: transparent; +} +/* If a custom layout has a custom container/backdrop + (backdrop-is-transparent), make sure to let pointer event go through. */ +.backdrop-is-transparent .MLK__plate { + background: transparent; + pointer-events: none; +} +/* If a custom layout has a custom container/backdrop, make sure to + allow pointer events on it. */ +.backdrop-is-transparent .MLK__layer > div > div { + pointer-events: all; +} +.ML__keyboard.is-visible > .MLK__backdrop { + transform: translate(0, calc(-1 * var(--_keyboard-height))); + opacity: 1; + visibility: visible; +} +.caps-lock-indicator { + display: none; + width: 8px; + height: 8px; + background: #0cbc0c; + box-shadow: inset 0 0 4px 0 #13ca13, 0 0 4px 0 #a9ef48; + border-radius: 8px; + right: 8px; + top: 8px; + position: absolute; +} +.ML__keyboard.is-caps-lock .caps-lock-indicator { + display: block; +} +.ML__keyboard.is-caps-lock .shift { + background: var(--_keycap-background-active); + color: var(--_keycap-text-active); +} +.MLK__plate { + position: absolute; + top: var(--_padding-top); + left: var(--_padding-horizontal); + width: calc(100% - 2 * var(--_padding-horizontal)); + margin: 0; + padding: 0; + box-sizing: border-box; + container-type: inline-size; + touch-action: none; + -webkit-user-select: none; + user-select: none; + pointer-events: all; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 16px; + /* Size of toolbar labels */ + font-weight: 400; + text-shadow: none; +} +.ML__box-placeholder { + color: var(--_box-placeholder-color); +} +.MLK__tex { + font-family: KaTeX_Main, KaTeX_Math, 'Cambria Math', 'Asana Math', OpenSymbol, Symbola, STIX, Times, serif !important; +} +.MLK__tex-math { + font-family: KaTeX_Math, KaTeX_Main, 'Cambria Math', 'Asana Math', OpenSymbol, Symbola, STIX, Times, serif !important; + font-style: italic; +} +.MLK__layer { + display: none; + outline: none; +} +.MLK__layer.is-visible { + display: flex; + flex-flow: column; +} +/* Keyboard layouts are made or rows of keys... */ +.MLK__rows { + --_keycap-width: var(--keycap-width, min(var(--_keycap-max-width), 10cqw)); + display: flex; + flex-flow: column; + align-items: center; + border-collapse: separate; + clear: both; + border: 0; + margin: 0; + margin-bottom: var(--_keycap-gap); + gap: var(--_keycap-gap); + /* If the styling include, e.g., some shadows, they will be + cut off by the overflow. In that case, set the padding to + compensate. */ + padding-left: var(--_row-padding-left); + padding-right: var(--_row-padding-right); + overflow: visible; + touch-action: none; +} +.MLK__rows > .MLK__row { + display: flex; + flex-flow: row; + justify-content: center; + width: 100%; + gap: var(--_keycap-gap); + margin: 0; + padding: 0; + /* For the alignment of the text on some modifiers (e.g. shift) */ + /* Extra spacing between two adjacent keys */ +} +.MLK__rows > .MLK__row .tex { + font-family: KaTeX_Math, KaTeX_Main, 'Cambria Math', 'Asana Math', OpenSymbol, Symbola, STIX, Times, serif !important; +} +.MLK__rows > .MLK__row .tex-math { + font-family: KaTeX_Math, 'Cambria Math', 'Asana Math', OpenSymbol, Symbola, STIX, Times, serif !important; +} +.MLK__rows > .MLK__row .big-op { + font-size: calc(1.25 * var(--_keycap-font-size)); +} +.MLK__rows > .MLK__row .small { + font-size: var(--_keycap-small-font-size); +} +.MLK__rows > .MLK__row .bottom { + justify-content: flex-end; +} +.MLK__rows > .MLK__row .left { + align-items: flex-start; + padding-left: 12px; +} +.MLK__rows > .MLK__row .right { + align-items: flex-end; + padding-right: 12px; +} +.MLK__rows > .MLK__row .w0 { + width: 0; +} +.MLK__rows > .MLK__row .w5 { + width: calc(0.5 * var(--_keycap-width) - var(--_keycap-gap)); +} +.MLK__rows > .MLK__row .w15 { + width: calc(1.5 * var(--_keycap-width) - var(--_keycap-gap)); +} +.MLK__rows > .MLK__row .w20 { + width: calc(2 * var(--_keycap-width) - var(--_keycap-gap)); +} +.MLK__rows > .MLK__row .w40 { + width: calc(4 * var(--_keycap-width) - var(--_keycap-gap)); +} +.MLK__rows > .MLK__row .w50 { + width: calc(5 * var(--_keycap-width) - var(--_keycap-gap)); +} +.MLK__rows > .MLK__row .MLK__keycap.w50 { + font-size: 80%; + padding-top: 10px; + font-weight: 100; +} +.MLK__rows > .MLK__row .separator { + background: transparent; + border: none; + pointer-events: none; +} +.MLK__rows > .MLK__row .horizontal-rule { + height: 6px; + margin-top: 3px; + margin-bottom: 0; + width: 100%; + border-radius: 0; + border-top: var(--_horizontal-rule); +} +.MLK__rows > .MLK__row .ghost { + background: var(--_toolbar-background); + border: none; + color: var(--_toolbar-text); +} +.MLK__rows > .MLK__row .ghost:hover { + background: var(--_toolbar-background-hover); +} +.MLK__rows > .MLK__row .bigfnbutton { + font-size: var(--_keycap-extra-small-font-size); +} +.MLK__rows > .MLK__row .shift, +.MLK__rows > .MLK__row .action { + color: var(--_keycap-secondary-text); + background: var(--_keycap-secondary-background); + border-color: var(--_keycap-secondary-border); + border-bottom-color: var(--_keycap-secondary-border-bottom); + line-height: 0.8; + font-size: min(1rem, var(--_keycap-small-font-size)); + font-weight: 600; + padding: 8px 12px 8px 12px; +} +.MLK__rows > .MLK__row .shift:hover, +.MLK__rows > .MLK__row .action:hover { + background: var(--_keycap-secondary-background-hover); +} +.MLK__rows > .MLK__row .action.primary { + background: var(--_keycap-primary-background); + color: var(--_keycap-primary-text); +} +.MLK__rows > .MLK__row .action.primary:hover { + background: var(--_keycap-primary-background-hover); + color: var(--_keycap-primary-text); +} +.MLK__rows > .MLK__row .shift.selected, +.MLK__rows > .MLK__row .action.selected { + color: var(--_toolbar-text-active); +} +.MLK__rows > .MLK__row .shift.selected.is-pressed, +.MLK__rows > .MLK__row .action.selected.is-pressed, +.MLK__rows > .MLK__row .shift.selected.is-active, +.MLK__rows > .MLK__row .action.selected.is-active { + color: white; +} +.MLK__rows > .MLK__row .warning { + background: #cd0030; + color: white; +} +.MLK__rows > .MLK__row .warning svg.svg-glyph { + width: var(--_keycap-glyph-size-lg); + height: var(--_keycap-glyph-size-lg); + min-height: var(--_keycap-glyph-size-lg); +} +/** A regular keycap + * Use the :where() pseudo-class to give it a very low specifity, + * so that it can be overriden by custom style. + */ +:where(.MLK__rows > .MLK__row div) { + display: flex; + flex-flow: column; + align-items: center; + justify-content: space-evenly; + width: calc(var(--_keycap-width) - var(--_keycap-gap)); + height: var(--_keycap-height); + box-sizing: border-box; + padding: 0; + vertical-align: top; + text-align: center; + float: left; + color: var(--_keycap-text); + fill: currentColor; + font-size: var(--_keycap-font-size); + background: var(--_keycap-background); + border: 1px solid var(--_keycap-border); + border-bottom-color: var(--_keycap-border-bottom); + border-radius: 6px; + cursor: pointer; + touch-action: none; + /* Keys with a variants panel */ + position: relative; + overflow: hidden; + -webkit-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; +} +:where(.MLK__rows > .MLK__row div):hover { + overflow: visible; + background: var(--_keycap-background-hover); + color: var(--_keycap-text-hover); +} +:where(.MLK__rows > .MLK__row div) .ML__latex { + pointer-events: none; + touch-action: none; +} +:where(.MLK__rows > .MLK__row div) svg.svg-glyph { + margin: 8px 0; + width: var(--_keycap-glyph-size); + height: var(--_keycap-glyph-size); + min-height: var(--_keycap-glyph-size); +} +:where(.MLK__rows > .MLK__row div) svg.svg-glyph-lg { + margin: 8px 0; + width: var(--_keycap-glyph-size-lg); + height: var(--_keycap-glyph-size-lg); + min-height: var(--_keycap-glyph-size-lg); +} +:where(.MLK__rows > .MLK__row div).MLK__tex-math { + font-size: 25px; +} +:where(.MLK__rows > .MLK__row div).is-pressed { + background: var(--_keycap-background-pressed); + color: var(--_keycap-text-pressed); + --_box-placeholder-color: var(--_box-placeholder-pressed-color); +} +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-active, +:where(.MLK__rows > .MLK__row div).action.is-active, +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-pressed, +:where(.MLK__rows > .MLK__row div).action.is-pressed { + z-index: calc(var(--_keyboard-zindex) - 5); +} +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-active aside, +:where(.MLK__rows > .MLK__row div).action.is-active aside, +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-pressed aside, +:where(.MLK__rows > .MLK__row div).action.is-pressed aside { + display: none; +} +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-active .MLK__shift, +:where(.MLK__rows > .MLK__row div).action.is-active .MLK__shift, +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-pressed .MLK__shift, +:where(.MLK__rows > .MLK__row div).action.is-pressed .MLK__shift { + display: none; +} +:where(.MLK__rows > .MLK__row div).shift.is-pressed, +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-pressed, +:where(.MLK__rows > .MLK__row div).action.is-pressed { + background: var(--_keycap-background-pressed); + color: var(--_keycap-text-pressed); +} +:where(.MLK__rows > .MLK__row div).shift.is-active, +:where(.MLK__rows > .MLK__row div).MLK__keycap.is-active, +:where(.MLK__rows > .MLK__row div).action.is-active { + background: var(--_keycap-background-active); + color: var(--_keycap-text-active); + --_box-placeholder-color: var(--_box-placeholder-pressed-color); +} +:where(.MLK__rows > .MLK__row div) small { + color: var(--_keycap-secondary-text); +} +:where(.MLK__rows > .MLK__row div) aside { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 10px; + line-height: 10px; + color: var(--_keycap-secondary-text); +} +/* Add an attribute 'data-tooltip' to display a tooltip on hover. +Note there are a different set of tooltip rules for the keyboard toggle +(it's in a different CSS tree) */ +.ML__keyboard [data-tooltip] { + position: relative; +} +.ML__keyboard [data-tooltip]::after { + position: absolute; + display: inline-table; + content: attr(data-tooltip); + top: inherit; + bottom: 100%; + width: max-content; + max-width: 200px; + padding: 8px 8px; + background: #616161; + color: #fff; + text-align: center; + z-index: 2; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + border-radius: 2px; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-weight: 400; + font-size: 12px; + transition: all 0.15s cubic-bezier(0.4, 0, 1, 1) 1s; + opacity: 0; + transform: scale(0.5); +} +.ML__keyboard [data-tooltip]:hover { + position: relative; +} +.ML__keyboard [data-tooltip]:hover::after { + opacity: 1; + transform: scale(1); +} +.MLK__toolbar { + align-self: center; + display: flex; + flex-flow: row; + justify-content: space-between; + width: 100%; + max-width: 996px; + min-height: 32px; + /* Icons for undo/redo, etc. */ +} +.MLK__toolbar svg { + height: 20px; + width: 20px; +} +.MLK__toolbar > .left { + position: relative; + display: flex; + justify-content: flex-start; + flex-flow: row; +} +.MLK__toolbar > .right { + display: flex; + justify-content: flex-end; + flex-flow: row; +} +.MLK__toolbar > div > div { + /* "button" in the toolbar */ + display: flex; + align-items: center; + justify-content: center; + color: var(--_toolbar-text); + fill: currentColor; + background: var(--_toolbar-background); + font-size: var(--_toolbar-font-size); + padding: 4px 15px; + cursor: pointer; + width: max-content; + min-width: 42px; + min-height: 34px; + border: none; + padding-left: 10px; + padding-right: 10px; + padding-bottom: 8px; + padding-top: 8px; + margin-top: 0; + margin-bottom: 4px; + margin-left: 4px; + margin-right: 4px; + border-radius: 8px; + box-shadow: none; + border-bottom: 2px solid transparent; +} +.MLK__toolbar > div > div:not(.disabled):not(.selected):hover { + background: var(--_toolbar-background-hover); +} +.MLK__toolbar > div > div.disabled svg, +.MLK__toolbar > div > div.disabled:hover svg, +.MLK__toolbar > div > div.disabled.is-pressed svg { + color: var(--_toolbar-text); + opacity: 0.2; +} +.MLK__toolbar > div > div:hover, +.MLK__toolbar > div > div:active, +.MLK__toolbar > div > div.is-pressed, +.MLK__toolbar > div > div.is-active { + color: var(--_toolbar-text-active); +} +.MLK__toolbar > div > div.selected { + color: var(--_toolbar-text-active); + background: var(--_toolbar-background-selected); + border-radius: 0; + border-bottom-color: var(--_toolbar-text-active); + padding-bottom: 4px; + margin-bottom: 8px; +} +/* This is the element that displays variants on press+hold */ +.MLK__variant-panel { + visibility: hidden; + position: fixed; + display: flex; + flex-flow: row wrap-reverse; + justify-content: center; + align-content: center; + margin: 0; + padding: 0; + bottom: auto; + top: 0; + box-sizing: content-box; + transform: none; + z-index: calc(var(--_keyboard-zindex) + 1); + touch-action: none; + max-width: 350px; + background: var(--_variant-panel-background); + text-align: center; + border-radius: 6px; + padding: 6px; + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); + transition: none; +} +.MLK__variant-panel.is-visible { + visibility: visible; +} +.MLK__variant-panel.compact { + --_variant-keycap-length: var(--variant-keycap-length, 50px); + --_variant-keycap-font-size: var(--variant-keycap-font-size, 24px); + --_variant-keycap-aside-font-size: var(--variant-keycap-aside-font-size, 10px); +} +.MLK__variant-panel .item { + display: flex; + flex-flow: column; + align-items: center; + justify-content: center; + font-size: var(--_variant-keycap-font-size); + height: var(--_variant-keycap-length); + width: var(--_variant-keycap-length); + margin: 0; + box-sizing: border-box; + border-radius: 5px; + border: 1px solid transparent; + background: transparent; + pointer-events: all; + cursor: pointer; + color: var(--_variant-keycap-text); + fill: currentColor; +} +@media (max-height: 412px) { + .MLK__variant-panel .item { + --_variant-keycap-font-size: var(--variant-keycap-font-size, 24px); + --_variant-keycap-length: var(--variant-keycap-length, 50px); + } +} +.MLK__variant-panel .item .ML__latex { + pointer-events: none; +} +.MLK__variant-panel .item:hover { + color: var(--_keycap-text-hover); +} +.MLK__variant-panel .item.is-active { + background: var(--_variant-keycap-background-active); + color: var(--_variant-keycap-text-active); + --_box-placeholder-color: var(--_box-placeholder-pressed-color); +} +.MLK__variant-panel .item.is-pressed { + background: var(--_variant-keycap-background-pressed); + color: var(--_variant-keycap-text-pressed); + --_box-placeholder-color: var(--_box-placeholder-pressed-color); +} +.MLK__variant-panel .item.small { + font-size: var(--_keycap-small-font-size); +} +.MLK__variant-panel .item.swatch-button { + box-sizing: border-box; + background: #fbfbfb; +} +.MLK__variant-panel .item.swatch-button > span { + display: inline-block; + margin: 6px; + width: calc(100% - 12px); + height: calc(100% - 12px); + border-radius: 50%; +} +.MLK__variant-panel .item.swatch-button:hover { + background: #f0f0f0; +} +.MLK__variant-panel .item.swatch-button:hover > span { + border-radius: 2px; +} +.MLK__variant-panel .item.box > div, +.MLK__variant-panel .item.box > span { + border: 1px dashed rgba(0, 0, 0, 0.24); +} +.MLK__variant-panel .item .warning { + min-height: 60px; + min-width: 60px; + background: #cd0030; + color: white; + padding: 5px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 5px; +} +.MLK__variant-panel .item .warning.is-pressed, +.MLK__variant-panel .item .warning.is-active { + background: red; +} +.MLK__variant-panel .item .warning svg.svg-glyph { + width: var(--_keycap-glyph-size-xl); + height: var(--_keycap-glyph-size-xl); +} +.MLK__variant-panel .item aside { + font-size: var(--_variant-keycap-aside-font-size); + line-height: 12px; + opacity: 0.78; + padding-top: 2px; + width: 100%; + text-align: center; + text-wrap: wrap; +} +.MLK__keycap { + position: relative; +} +.MLK__shift { + display: block; + position: absolute; + right: 4px; + top: 4px; + font-size: var(--_keycap-shift-font-size); + color: var(--_keycap-shift-color); +} +.hide-shift .MLK__shift { + display: none; +} +@media (max-width: 414px) { + .MLK__variant-panel { + max-width: 350px; + --_variant-keycap-font-size: var(--variant-keycap-font-size, 24px); + --_variant-keycap-length: var(--variant-keycap-length, 50px); + } +} +/* @xs breakpoint: iPhone 5 */ +@container (max-width: 414px) { + .MLK__rows { + --_keycap-gap: max(var(--_keycap-gap, 2px), 2px); + --_keycap-height: var(--keycap-height, 42px); + --_keycap-width: var(--keycap-width, min(min(var(--_keycap-max-width)), 10cqw), 62px)); + } + .MLK__toolbar > div > div { + font-size: 100%; + margin-left: 2px; + margin-right: 2px; + } + .MLK__rows .shift, + .MLK__rows .action { + font-size: 65%; + } + .MLK__rows .warning svg.svg-glyph { + width: 14px; + height: 14px; + min-height: 14px; + } +} +@container (max-width: 744px) { + .MLK__rows { + --_keycap-gap: max(var(--keycap-gap, 2px), 2px); + --_keycap-height: var(--keycap-height, 52px); + --_keycap-width: var(--keycap-width, min(min(var(--_keycap-max-width), 10cqw), 62px)); + } + .MLK__toolbar > div > div { + padding-left: 0; + padding-right: 0; + } + .MLK__tooltip::after { + padding: 8px 16px; + font-size: 16px; + } + .MLK__rows > .MLK__row > div.fnbutton { + font-size: 16px; + } + .MLK__rows > .MLK__row > div.bigfnbutton { + font-size: calc(var(--_keycap-extra-small-font-size) / 1.55); + } + .MLK__rows > .MLK__row > div.small { + font-size: 13px; + } + .MLK__rows > .MLK__row > div > aside { + display: none; + } + .MLK__shift { + display: none; + } +} +/* Medium breakpoint: larger phones */ +@container (max-width: 768px) { + .MLK__rows { + --_keycap-height: var(--keycap-height, 42px); + } + .MLK__rows > .MLK__row > div > small { + font-size: 14px; + } +} +@media (max-height: 768px) { + .MLK__rows { + --_keycap-height: var(--keycap-height, 42px); + } + .MLK__rows > .MLK__row > div > small { + font-size: 14px; + } +} +@container (max-width: 1444px) { + .MLK__rows .if-wide { + display: none; + } +} +@media (prefers-color-scheme: dark) { + .ML__keyboard { + --_accent-color: var(--keyboard-accent-color, #0b5c9c); + --_background: var(--keyboard-background, #151515); + --_border: var(--keyboard-border, transparent); + --_toolbar-text: var(--keyboard-toolbar-text, #e3e4e8); + --_toolbar-background-hover: var(--keyboard-toolbar-background-hover, #303030); + --keyboard-toolbar-background-hover: #303030; + --_horizontal-rule: var(--keyboard-horizontal-rule, 1px solid #303030); + --_keycap-background: var(--keycap-background, #1f2022); + --_keycap-background-hover: var(--keycap-background-hover, #2f3032); + --_keycap-border: var(--_keycap-border, transparent); + --_keycap-border-bottom: var(--_keycap-border-bottom, transparent); + --_keycap-text: var(--keycap-text, #e3e4e8); + --_keycap-secondary-background: var(--keycap-secondary-background, #3d4144); + --_keycap-secondary-background-hover: var(--keycap-secondary-background-hover, #4d5154); + --_keycap-secondary-text: var(--keycap-secondary-text, #e7ebee); + --keycap-secondary-border: transparent; + --keycap-secondary-border-bottom: transparent; + --_keycap-secondary-border: var(--keycap-secondary-border, transparent); + --_keycap-secondary-border-bottom: var(--keycap-secondary-border-bottom, transparent); + --_variant-panel-background: var(--variant-panel-background, #303030); + --_variant-keycap-text-active: var(--variant-keycap-text-active, #fff); + } +} +/* Same as the media query, but with a class */ +[theme='dark'] .ML__keyboard { + --_accent-color: var(--keyboard-accent-color, #0b5c9c); + --_background: var(--keyboard-background, #151515); + --_border: var(--keyboard-border, transparent); + --_toolbar-text: var(--keyboard-toolbar-text, #e3e4e8); + --_toolbar-background-hover: var(--keyboard-toolbar-background-hover, #303030); + --keyboard-toolbar-background-hover: #303030; + --_horizontal-rule: var(--keyboard-horizontal-rule, 1px solid #303030); + --_keycap-background: var(--keycap-background, #1f2022); + --_keycap-background-hover: var(--keycap-background-hover, #2f3032); + --_keycap-border: var(--_keycap-border, transparent); + --_keycap-border-bottom: var(--_keycap-border-bottom, transparent); + --_keycap-text: var(--keycap-text, #e3e4e8); + --_keycap-secondary-background: var(--keycap-secondary-background, #3d4144); + --_keycap-secondary-background-hover: var(--keycap-secondary-background-hover, #4d5154); + --_keycap-secondary-text: var(--keycap-secondary-text, #e7ebee); + --keycap-secondary-border: transparent; + --keycap-secondary-border-bottom: transparent; + --_keycap-secondary-border: var(--keycap-secondary-border, transparent); + --_keycap-secondary-border-bottom: var(--keycap-secondary-border-bottom, transparent); + --_variant-panel-background: var(--variant-panel-background, #303030); + --_variant-keycap-text-active: var(--variant-keycap-text-active, #fff); +} +[theme='light'] .ML__keyboard { + --_accent-color: var(--keyboard-accent-color, #0c75d8); + --_background: var(--keyboard-background, #cacfd7); + --_border: var(--keyboard-border, #ddd); + --_toolbar-text: var(--keyboard-toolbar-text, #2c2e2f); + --_toolbar-background: var(--keyboard-toolbar-background, transparent); + --_toolbar-background-hover: var(--keyboard-toolbar-background-hover, #eee); + --_toolbar-background-selected: var(--keyboard-toolbar-background-selected, transparent); + --_horizontal-rule: var(--keyboard-horizontal-rule, 1px solid #fff); + --_keycap-background: var(--keycap-background, white); + --_keycap-background-hover: var(--keycap-background-hover, #f5f5f7); + --_keycap-background-active: var(--keycap-background-active, var(--_accent-color)); + --_keycap-background-pressed: var(--keycap-background-pressed, var(--_accent-color)); + --_keycap-border: var(--_keycap-border, #e5e6e9); + --_keycap-border-bottom: var(--_keycap-border-bottom, #8d8f92); + --_keycap-text: var(--keycap-text, #000); + --_keycap-text-active: var(--keycap-text-active, #fff); + --_keycap-text-hover: var(--keycap-text-hover, var(--_keycap-text)); + --_keycap-text-pressed: var(--keycap-text-pressed, #fff); + --_keycap-shift-text: var(--keycap-shift-text, var(--_accent-color)); + --_keycap-secondary-background: var(--keycap-secondary-background, #a0a9b8); + --_keycap-secondary-background-hover: var(--keycap-secondary-background-hover, #7d8795); + --_keycap-secondary-text: var(--keycap-secondary-text, #060707); + --_keycap-secondary-border: var(--keycap-secondary-border, #c5c9d0); + --_keycap-secondary-border-bottom: var(--keycap-secondary-border-bottom, #989da6); + --_variant-panel-background: var(--variant-panel-background, #f0f0f0); + --_variant-keycap-text: var(--variant-keycap-textvar, var(--_keycap-text)); + --_variant-keycap-text-active: var(--variant-keycap-text-active, var(--_keycap-text-active)); + --_variant-keycap-background-active: var(--variant-keycap-background-active, var(--_accent-color)); +} +`;var ch=`:host { + --primary-color: #5898ff; + --primary-color-dimmed: #c0c0f0; + --primary-color-dark: var(--blue-500); + --primary-color-light: var(--blue-100); + --primary-color-reverse: #ffffff; + --secondary-color: #ff8a65; + --secondary-color-dimmed: #f0d5c5; + --secondary-color-dark: var(--orange-500); + --secondary-color-light: var(--orange-100); + --secondary-color-reverse: #ffffff; + --link-color: #5898ff; + --link-color-dimmed: #c5c5c5; + --link-color-dark: #121212; + --link-color-light: #e2e2e2; + --link-color-reverse: #ffffff; + --semantic-blue: var(--blue-700); + --semantic-red: var(--red-400); + --semantic-orange: var(--orange-400); + --semantic-green: var(--green-700); + --neutral-100: #f5f5f5; + --neutral-200: #eeeeee; + --neutral-300: #e0e0e0; + --neutral-400: #bdbdbd; + --neutral-500: #9e9e9e; + --neutral-600: #757575; + --neutral-700: #616161; + --neutral-800: #424242; + --neutral-900: #212121; + --red-25: #fff8f7; + --red-50: #fff1ef; + --red-100: #ffeae6; + --red-200: #ffcac1; + --red-300: #ffa495; + --red-400: #ff7865; + --red-500: #f21c0d; + --red-600: #e50018; + --red-700: #d30024; + --red-800: #bd002c; + --red-900: #a1002f; + --orange-25: #fffbf8; + --orange-50: #fff7f1; + --orange-100: #fff3ea; + --orange-200: #ffe1c9; + --orange-300: #ffcca2; + --orange-400: #ffb677; + --orange-500: #fe9310; + --orange-600: #f58700; + --orange-700: #ea7c00; + --orange-800: #dc6d00; + --orange-900: #ca5b00; + --brown-25: #fff8ef; + --brown-50: #fff1df; + --brown-100: #ffe9ce; + --brown-200: #ebcca6; + --brown-300: #cdaf8a; + --brown-400: #af936f; + --brown-500: #856a47; + --brown-600: #7f5e34; + --brown-700: #78511f; + --brown-800: #6e4200; + --brown-900: #593200; + --yellow-25: #fffdf9; + --yellow-50: #fffcf2; + --yellow-100: #fffaec; + --yellow-200: #fff2ce; + --yellow-300: #ffe8ab; + --yellow-400: #ffdf85; + --yellow-500: #ffcf33; + --yellow-600: #f1c000; + --yellow-700: #dfb200; + --yellow-800: #c9a000; + --yellow-900: #ad8a00; + --lime-25: #f4ffee; + --lime-50: #e9ffdd; + --lime-100: #ddffca; + --lime-200: #a8fb6f; + --lime-300: #94e659; + --lime-400: #80d142; + --lime-500: #63b215; + --lime-600: #45a000; + --lime-700: #268e00; + --lime-800: #007417; + --lime-900: #005321; + --green-25: #f5fff5; + --green-50: #ebffea; + --green-100: #e0ffdf; + --green-200: #a7ffa7; + --green-300: #5afa65; + --green-400: #45e953; + --green-500: #17cf36; + --green-600: #00b944; + --green-700: #00a34a; + --green-800: #008749; + --green-900: #00653e; + --teal-25: #f3ffff; + --teal-50: #e6fffe; + --teal-100: #d9fffe; + --teal-200: #8dfffe; + --teal-300: #57f4f4; + --teal-400: #43e5e5; + --teal-500: #17cfcf; + --teal-600: #00c2c0; + --teal-700: #00b5b1; + --teal-800: #00a49e; + --teal-900: #009087; + --cyan-25: #f7fcff; + --cyan-50: #eff8ff; + --cyan-100: #e7f5ff; + --cyan-200: #c2e6ff; + --cyan-300: #95d5ff; + --cyan-400: #61c4ff; + --cyan-500: #13a7ec; + --cyan-600: #069eda; + --cyan-700: #0095c9; + --cyan-800: #0088b2; + --cyan-900: #0a7897; + --blue-25: #f7faff; + --blue-50: #eef5ff; + --blue-100: #e5f1ff; + --blue-200: #bfdbff; + --blue-300: #92c2ff; + --blue-400: #63a8ff; + --blue-500: #0d80f2; + --blue-600: #0077db; + --blue-700: #006dc4; + --blue-800: #0060a7; + --blue-900: #005086; + --indigo-25: #f8f7ff; + --indigo-50: #f1efff; + --indigo-100: #eae7ff; + --indigo-200: #ccc3ff; + --indigo-300: #ac99ff; + --indigo-400: #916aff; + --indigo-500: #63c; + --indigo-600: #5a21b2; + --indigo-700: #4e0b99; + --indigo-800: #3b0071; + --indigo-900: #220040; + --purple-25: #fbf7ff; + --purple-50: #f8f0ff; + --purple-100: #f4e8ff; + --purple-200: #e4c4ff; + --purple-300: #d49aff; + --purple-400: #c36aff; + --purple-500: #a219e6; + --purple-600: #9000c4; + --purple-700: #7c009f; + --purple-800: #600073; + --purple-900: #3d0043; + --magenta-25: #fff8fb; + --magenta-50: #fff2f6; + --magenta-100: #ffebf2; + --magenta-200: #ffcddf; + --magenta-300: #ffa8cb; + --magenta-400: #ff7fb7; + --magenta-500: #eb4799; + --magenta-600: #da3689; + --magenta-700: #c82179; + --magenta-800: #b00065; + --magenta-900: #8a004c; +} +@media (prefers-color-scheme: dark) { + :host { + --semantic-blue: var(--blue-700); + --semantic-red: var(--red-400); + --semantic-orange: var(--orange-400); + --semantic-green: var(--green-700); + --semantic-bg-blue: var(--blue-25); + --semantic-bg-red: var(--red-25); + --semantic-bg-orange: var(--orange-25); + --semantic-bg-green: var(--green-25); + --neutral-100: #121212; + --neutral-200: #424242; + --neutral-300: #616161; + --neutral-400: #757575; + --neutral-500: #9e9e9e; + --neutral-600: #bdbdbd; + --neutral-700: #e0e0e0; + --neutral-800: #eeeeee; + --neutral-900: #f5f5f5; + } +} +:host([theme='dark']) { + --semantic-blue: var(--blue-700); + --semantic-red: var(--red-400); + --semantic-orange: var(--orange-400); + --semantic-green: var(--green-700); + --semantic-bg-blue: var(--blue-25); + --semantic-bg-red: var(--red-25); + --semantic-bg-orange: var(--orange-25); + --semantic-bg-green: var(--green-25); + --neutral-100: #121212; + --neutral-200: #424242; + --neutral-300: #616161; + --neutral-400: #757575; + --neutral-500: #9e9e9e; + --neutral-600: #bdbdbd; + --neutral-700: #e0e0e0; + --neutral-800: #eeeeee; + --neutral-900: #f5f5f5; +} +/* @media (prefers-color-scheme: dark) { + :host { + --label-color: #fff; + --active-label-color: #000; + --menu-bg: #525252; + --active-bg: #5898ff; + --active-bg-dimmed: #5c5c5c; + } +} */ +:host { + --ui-font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + --ui-font-size: 14px; + --ui-line-height: 1.5; + --ui-letter-spacing: 0.007em; + --mono-font-family: 'Berkeley Mono', 'JetBrains Mono', 'IBM Plex Mono', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace; + --ui-layer-1: var(--neutral-100); + --ui-layer-2: var(--neutral-200); + --ui-layer-3: var(--neutral-300); + --ui-layer-4: var(--neutral-400); + --ui-layer-5: var(--neutral-500); + --ui-layer-6: var(--neutral-600); + --ui-border-color: var(--primary-color); + --ui-border-radius: 4px; + --ui-text: var(--neutral-900); + --ui-text-secondary: var(--neutral-700); + --ui-text-placeholder: var(--neutral-500); + --ui-text-muted: var(--neutral-300); + /** A field is a UI element in which a user can type data, for + * example an input or textarea element. + */ + --ui-field-bg: var(--neutral-100); + --ui-field-bg-hover: var(--neutral-100); + --ui-field-bg-disabled: var(--neutral-300); + --ui-field-bg-invalid: var(--red-100); + --ui-field-bg-focus: var(--neutral-100); + --ui-field-border: 0.5px solid var(--border-color); + --ui-field-border-hover: 0.5px solid var(--border-color); + --ui-field-border-disabled: 0.5px solid var(--border-color); + --ui-field-border-invalid: 0.5px solid var(--border-color); + --ui-field-border-focus: 0.5px solid var(--border-color); + --ui-menu-bg: var(--neutral-100); + --ui-menu-text: var(--neutral-900); + --ui-menu-bg-hover: var(--neutral-200); + --ui-menu-text-hover: var(--neutral-900); + /** The \`active\` state is used for the state of menu items + * when they are selected. + */ + --ui-menu-bg-active: var(--primary-color); + --ui-menu-text-active: var(--primary-color-reverse); + /** The \`active-muted\` set is used for the state of + * submenus when they are open. + */ + --ui-menu-bg-active-muted: var(--neutral-300); + --ui-menu-text-active-muted: var(--neutral-900); + /* --ui-menu-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.302), +0 2px 6px 2px rgba(60, 64, 67, 0.149); */ + --ui-menu-shadow: 0 0 2px rgba(0, 0, 0, 0.5), 0 0 20px rgba(0, 0, 0, 0.2); + --ui-menu-divider: 0.5px solid #c7c7c7; + /* var(--neutral-300); */ + --ui-menu-z-index: 10000; + --page-bg: var(--neutral-100); + --content-bg: var(--neutral-200); +} +@media (prefers-color-scheme: dark) { + :host { + --ui-menu-bg: var(--neutral-200); + } +} +:host([theme='dark']) { + --ui-menu-bg: var(--neutral-200); +} +/* PingFang SC is a macOS font. Microsoft Yahei is a Windows font. + Noto is a Linux/Android font. +*/ +:lang(zh-cn), +:lang(zh-sg), +:lang(zh-my), +:lang(zh) { + --ui-font-family: -apple-system, system-ui, 'PingFang SC', 'Hiragino Sans GB', 'Noto Sans CJK SC', 'Noto Sans SC', 'Noto Sans', 'Microsoft Yahei UI', 'Microsoft YaHei New', 'Microsoft Yahei', '\u5FAE\u8F6F\u96C5\u9ED1', SimSun, '\u5B8B\u4F53', STXihei, '\u534E\u6587\u7EC6\u9ED1', sans-serif; +} +:lang(zh-tw), +:lang(zh-hk), +:lang(zh-mo) { + --ui-font-family: -apple-system, system-ui, 'Noto Sans', 'Microsoft JhengHei UI', 'Microsoft JhengHei', '\u5FAE\u8EDF\u6B63\u9ED1\u9AD4', '\u65B0\u7D30\u660E\u9AD4', 'PMingLiU', '\u7D30\u660E\u9AD4', 'MingLiU', sans-serif; +} +:lang(ja), +:lang(ja-jp), +:lang(ja-jp-mac) { + --ui-font-family: -apple-system, system-ui, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Noto Sans CJK JP', 'Noto Sans JP', 'Noto Sans', '\u6E38\u30B4\u30B7\u30C3\u30AF', '\u6E38\u30B4\u30B7\u30C3\u30AF\u4F53', YuGothic, 'Yu Gothic', '\u30E1\u30A4\u30EA\u30AA', Meiryo, '\uFF2D\uFF33 \uFF30\u30B4\u30B7\u30C3\u30AF', 'MS PGothic', sans-serif; +} +:lang(ko), +:lang(ko-kr), +:lang(ko-kr-std) { + --ui-font-family: -apple-system, system-ui, 'Noto Sans CJK KR', 'Noto Sans KR', 'Noto Sans', 'Malgun Gothic', '\uB9D1\uC740 \uACE0\uB515', 'Apple SD Gothic Neo', '\uC560\uD50C SD \uC0B0\uB3CC\uACE0\uB515 Neo', 'Apple SD \uC0B0\uB3CC\uACE0\uB515 Neo', '\uB3CB\uC6C0', Dotum, sans-serif; +} +:lang(ko-kr-apple) { + --ui-font-family: -apple-system, system-ui, 'Noto Sans CJK KR', 'Noto Sans KR', 'Noto Sans', 'Apple SD Gothic Neo', '\uC560\uD50C SD \uC0B0\uB3CC\uACE0\uB515 Neo', 'Apple SD \uC0B0\uB3CC\uACE0\uB515 Neo', '\uB3CB\uC6C0', Dotum, sans-serif; +} +:lang(zh-cn), +:lang(zh-sg), +:lang(zh-my), +:lang(zh), +:lang(zh-tw), +:lang(zh-hk), +:lang(zh-mo), +:lang(ja), +:lang(ja-jp), +:lang(ja-jp-mac), +:lang(ko), +:lang(ko-kr), +:lang(ko-kr-std), +:lang(ko-kr-apple) { + --ui-font-size: 1rem; + --ui-line-height: 1.7; + --ui-letter-spacing: 0; +} +:dir(rtl) { + --ui-line-height: auto; + --ui-letter-spacing: 0; +} +`;var uh=`.ui-menu *, +.ui-menu ::before, +.ui-menu ::after { + box-sizing: border-box; +} +.ui-menu { + display: none; + color-scheme: light dark; + -webkit-user-select: none; + /* Important: Safari iOS doesn't respect user-select */ + user-select: none; + cursor: default; + -webkit-touch-callout: none; + -webkit-tap-highlight-color: rgba(0 0 0 0); + --active-label-color: #fff; + /* ui-menu-text-active */ + --label-color: #121212; + /* ui-menu-text */ + --menu-bg: #e2e2e2; + /* ui-menu-background */ + --active-bg: #5898ff; + /* ui-menu-background-active */ + --active-bg-dimmed: #c5c5c5; + /* ui-menu-background-active-muted */ +} +/** Use the :where pseudo selector to make the specificity of the + * selector 0, so that it can be overridden by the user. + */ +:where(.ui-menu-container) { + position: absolute; + overflow: visible; + width: auto; + height: auto; + z-index: 10000; + border-radius: 8px; + background: var(--ui-menu-bg); + box-shadow: var(--ui-menu-shadow); + list-style: none; + padding: 6px 0 6px 0; + margin: 0; + user-select: none; + cursor: default; + color: var(--ui-menu-text); + font-weight: normal; + font-style: normal; + text-shadow: none; + text-transform: none; + letter-spacing: 0; + outline: none; + opacity: 1; + /* The [popover] elements have a 1px solid black border. Ugh. */ + border: none; + width: fit-content; + height: fit-content; +} +:where(.ui-menu-container > li) { + display: flex; + flex-flow: row; + align-items: center; + padding: 1px 7px 1px 7px; + margin-top: 0; + margin-left: 6px; + margin-right: 6px; + border-radius: 4px; + white-space: nowrap; + position: relative; + outline: none; + fill: currentColor; + user-select: none; + cursor: default; + text-align: left; + color: inherit; + font-family: var(--ui-font-family); + font-size: var(--ui-font-size); + line-height: var(--ui-line-height); + letter-spacing: var(--ui-letter-spacing); +} +:where(.ui-menu-container > li > .label) { + display: flex; + align-items: center; + justify-content: space-between; + appearance: none; + background: none; + outline: none; + width: 100%; + margin: 0; + padding: 1px 2px 1px 1px; + overflow: visible; + border: 1px solid transparent; + white-space: nowrap; + text-align: start; + align-content: center; +} +:where(.ui-menu-container > li:has(.heading)) { + margin-top: 0.5em; +} +:where(.ui-menu-container > li > .label.heading) { + font-weight: bold; + opacity: 0.4; +} +:where(.ui-menu-container > li.indent > .label) { + margin-inline-start: 12px; +} +:where(.ui-menu-container > li > .label.indent) { + margin-inline-start: 12px; +} +:where(.ui-menu-container > li[role='divider']) { + border-bottom: 1px solid var(--ui-menu-divider); + border-radius: 0; + padding: 0; + margin-left: 15px; + margin-right: 15px; + padding-top: 5px; + margin-bottom: 5px; + width: calc(100% - 30px); + /** 100% - (margin-left + margin-right) */ +} +:where(.ui-menu-container > li[aria-disabled='true']) { + opacity: 0.5; +} +:where(.ui-menu-container > li.active) { + background: var(--ui-menu-bg-active); + background: -apple-system-control-accent; + color: var(--ui-menu-text-active); +} +:where(.ui-menu-container > li.active.is-submenu-open) { + background: var(--ui-menu-bg-active-muted); + color: inherit; +} +:where(.ui-menu-container > li[aria-haspopup='true'] > .label) { + padding-inline-end: 0; +} +:where(.ui-menu-container > li[aria-haspopup='true'].active::after) { + color: var(--ui-menu-text-active); +} +/** Keyboard shortcut */ +:where(.ui-menu-container > li > kbd) { + font-family: var(--ui-font-family); + margin-inline-start: 12px; + opacity: 0.4; +} +:where(.ui-menu-container > li.active > kbd) { + opacity: 0.85; +} +.ui-trailing-chevron { + display: flex; + margin-inline-start: 24px; + width: 10px; + height: 10px; + margin-bottom: 4px; +} +.ui-trailing-chevron:dir(rtl) { + transform: scaleX(-1); +} +.ui-checkmark { + display: flex; + margin-inline-end: -11px; + margin-inline-start: -4px; + margin-top: 2px; + width: 16px; + height: 16px; +} +.ui-mixedmark { + display: flex; + margin-inline-end: -11px; + margin-inline-start: -4px; + margin-top: 2px; + width: 16px; + height: 16px; +} +`;var zr;function Ft(t){let e="";switch(t){case"mathfield-element":e=` + :host { display: inline-block; background-color: field; color: fieldtext; border-width: 1px; border-style: solid; border-color: #acacac; border-radius: 2px;} + :host([hidden]) { display: none; } + :host([disabled]), :host([disabled]:focus), :host([disabled]:focus-within) { outline: none; opacity: .5; } + :host(:focus), :host(:focus-within) { + outline: Highlight auto 1px; /* For Firefox */ + outline: -webkit-focus-ring-color auto 1px; + } + :host([readonly]:focus), :host([readonly]:focus-within), + :host([read-only]:focus), :host([read-only]:focus-within) { + outline: none; + }`;break;case"core":e=nh;break;case"mathfield":e=ih;break;case"environment-popover":e=oh;break;case"suggestion-popover":e=ah;break;case"keystroke-caption":e=sh;break;case"virtual-keyboard":e=lh;break;case"ui":e=ch;break;case"menu":e=uh;break;default:}return e}function sr(t){return zr||(zr={}),zr[t]||(zr[t]=new CSSStyleSheet,zr[t].replaceSync(Ft(t))),zr[t]}var Nt;function Ge(t){var e;try{if(!("adoptedStyleSheets"in document)){if(window.document.getElementById(`mathlive-style-${t}`))return;let r=window.document.createElement("style");r.id=`mathlive-style-${t}`,r.append(window.document.createTextNode(Ft(t))),window.document.head.appendChild(r);return}if(Nt||(Nt={}),((e=Nt[t])!=null?e:0)!==0)Nt[t]+=1;else{let r=sr(t);document.adoptedStyleSheets=[...document.adoptedStyleSheets,r],Nt[t]=1}}catch(r){console.error("Error injecting stylesheet",t,r)}}function ot(t){if("adoptedStyleSheets"in document&&Nt!=null&&Nt[t]&&(Nt[t]-=1,Nt[t]<=0)){let e=zr[t];document.adoptedStyleSheets=document.adoptedStyleSheets.filter(r=>r!==e)}}var Nr=class t extends x{constructor(e){var r;super(g(h({},e),{type:"accent",body:(r=e.body)!=null?r:void 0})),e.accentChar?this.accent=e.accentChar:this.svgAccent=e==null?void 0:e.svgAccent,this.skipBoundary=!0,this.captureSelection=!0}static fromJson(e){return new t(e)}toJson(){return g(h({},super.toJson()),{accentChar:this.accent,svgAccent:this.svgAccent})}render(e){var c;let r=new P({parent:e,mathstyle:"cramp"},this.style),i=(c=x.createBox(r,this.body))!=null?c:new w("\u25A1",{style:this.style}),n=0;!this.hasEmptyBranch("body")&&this.body.length===2&&this.body[1].isCharacterBox()&&(n=i.skew);let o=Math.min(i.height,Xe),a;if(this.svgAccent)a=Zi(this.svgAccent),o=r.metrics.bigOpSpacing1-o;else if(this.accent){let u=new w(this.accent,{fontFamily:"Main-Regular"});u.italic=0;let d=this.accent===8407||this.accent===8411||this.accent===8412?" ML__accent-combining-char":"";a=new w(u,{classes:"ML__accent-body"+d})}let s=(i.width-a.width)/2+i.left+2*n;a=new te({shift:0,children:[{box:new w(i)},-o,{box:a,marginLeft:s,classes:["ML__center"]}]});let l=new w(a,{type:"ord"});return this.caret&&(l.caret=this.caret),this.bind(r,l.wrap(r)),this.attachSupsub(r,{base:l})}};var nn={"(":")","{":"}","[":"]","|":"|","\\lbrace":"\\rbrace","\\lparen":"\\rparen","\\{":"\\}","\\langle":"\\rangle","\\lfloor":"\\rfloor","\\lceil":"\\rceil","\\vert":"\\vert","\\lvert":"\\rvert","\\Vert":"\\Vert","\\lVert":"\\rVert","\\lbrack":"\\rbrack","\\ulcorner":"\\urcorner","\\llcorner":"\\lrcorner","\\lgroup":"\\rgroup","\\lmoustache":"\\rmoustache"},on=Object.fromEntries(Object.entries(nn).map(([t,e])=>[e,t]));function ts(t){var e;return(e={"[":91,"]":93,"(":40,")":41,"\\mid":8739,"|":8739,"\u2223":8739,"\u2225":8741,"\\|":8739,"\\{":123,"\\}":125,"\\lbrace":123,"\\rbrace":125,"\\lparen":40,"\\rparen":41,"\\lbrack":91,"\\rbrack":93,"\\vert":8739,"\\lvert":8739,"\\mvert":8739,"\\rvert":8739,"\\Vert":8741,"\\lVert":8741,"\\mVert":8741,"\\rVert":8741,"\\parallel":8741,"\\shortparallel":8741,"\\langle":10216,"\\rangle":10217,"\\lfloor":8970,"\\rfloor":8971,"\\lceil":8968,"\\rceil":8969,"\\ulcorner":9484,"\\urcorner":9488,"\\llcorner":9492,"\\lrcorner":9496,"\\lgroup":10222,"\\rgroup":10223,"\\lmoustache":9136,"\\rmoustache":9137,"\\surd":8730}[t])!=null?e:t.codePointAt(0)}function ag(t,e,r,i){var a;let o=new w(ts(t),{fontFamily:"Main-Regular",isSelected:i.isSelected,classes:"ML__small-delim "+((a=i.classes)!=null?a:"")}).wrap(e);return r&&o.setTop((1-e.scalingFactor)*Ie),o}function dh(t,e,r,i,n){var s,l;let o=new P({parent:i,mathstyle:"textstyle"},n==null?void 0:n.style),a=new w(ts(t),{fontFamily:`Size${e}-Regular`,isSelected:n.isSelected,classes:((s=n.classes)!=null?s:"")+` ML__delim-size${e}`,type:(l=n.type)!=null?l:"ignore"}).wrap(o);return r&&a.setTop((1-o.scalingFactor)*Ie),a}function mh(t,e,r,i,n){var j;let o,a,s,l;o=s=l=ts(t),a=null;let c="Size1-Regular";t==="\\vert"||t==="\\lvert"||t==="\\rvert"||t==="\\mvert"||t==="\\mid"?s=o=l=8739:t==="\\Vert"||t==="\\lVert"||t==="\\rVert"||t==="\\mVert"||t==="\\|"?s=o=l=8741:t==="\\uparrow"?s=l=9168:t==="\\Uparrow"?s=l=8214:t==="\\downarrow"?o=s=9168:t==="\\Downarrow"?o=s=8214:t==="\\updownarrow"?(o=8593,s=9168,l=8595):t==="\\Updownarrow"?(o=8657,s=8214,l=8659):t==="["||t==="\\lbrack"?(o=9121,s=9122,l=9123,c="Size4-Regular"):t==="]"||t==="\\rbrack"?(o=9124,s=9125,l=9126,c="Size4-Regular"):t==="\\lfloor"||t==="\u230A"?(s=o=9122,l=9123,c="Size4-Regular"):t==="\\lceil"||t==="\u2308"?(o=9121,s=l=9122,c="Size4-Regular"):t==="\\rfloor"||t==="\u230B"?(s=o=9125,l=9126,c="Size4-Regular"):t==="\\rceil"||t==="\u2309"?(o=9124,s=l=9125,c="Size4-Regular"):t==="("||t==="\\lparen"?(o=9115,s=9116,l=9117,c="Size4-Regular"):t===")"||t==="\\rparen"?(o=9118,s=9119,l=9120,c="Size4-Regular"):t==="\\{"||t==="\\lbrace"?(o=9127,a=9128,l=9129,s=9130,c="Size4-Regular"):t==="\\}"||t==="\\rbrace"?(o=9131,a=9132,l=9133,s=9130,c="Size4-Regular"):t==="\\lgroup"||t==="\u27EE"?(o=9127,l=9129,s=9130,c="Size4-Regular"):t==="\\rgroup"||t==="\u27EF"?(o=9131,l=9133,s=9130,c="Size4-Regular"):t==="\\lmoustache"||t==="\u23B0"?(o=9127,l=9133,s=9130,c="Size4-Regular"):t==="\\rmoustache"||t==="\u23B1"?(o=9131,l=9129,s=9130,c="Size4-Regular"):t==="\\surd"?(o=57345,l=9143,s=57344,c="Size4-Regular"):t==="\\ulcorner"?(o=9484,s=l=32):t==="\\urcorner"?(o=9488,s=l=32):t==="\\llcorner"?(l=9492,s=o=32):t==="\\lrcorner"&&(o=9496,s=o=32);let u=Tr(o,c),d=u.height+u.depth,m=Tr(s,c),p=m.height+m.depth,f=Tr(l,c),y=f.height+f.depth,v=0,b=1;if(a!==null){let D=Tr(a,c);v=D.height+D.depth,b=2}let k=d+y+v,S=Math.max(0,Math.ceil((e-k)/(b*p))),A=k+S*b*p,E=Ie;r&&(E=E*i.scalingFactor);let C=A/2-E,_=.008,O=[];O.push({box:new w(l,{fontFamily:c})}),O.push(-_);let I=new w(s,{fontFamily:c});if(a===null)for(let D=0;D","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"]),lg=[0,1.2,1.8,2.4,3];function fh(t,e,r,i){return t===void 0||t==="."?lr(r,i.classes):(t==="<"||t==="\\lt"||t==="\u27E8"?t="\\langle":(t===">"||t==="\\gt"||t==="\u27E9")&&(t="\\rangle"),hh.has(t)||ph.has(t)?dh(t,e,!1,r,i):sg.has(t)?mh(t,lg[e],!1,r,i):(""+t,null))}var cg=[{type:"small",mathstyle:"scriptscriptstyle"},{type:"small",mathstyle:"scriptstyle"},{type:"small",mathstyle:"textstyle"},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],ug=[{type:"small",mathstyle:"scriptscriptstyle"},{type:"small",mathstyle:"scriptscriptstyle"},{type:"small",mathstyle:"textstyle"},{type:"stack"}],dg=[{type:"small",mathstyle:"scriptscriptstyle"},{type:"small",mathstyle:"scriptstyle"},{type:"small",mathstyle:"textstyle"},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}];function mg(t){return t.type==="small"?"Main-Regular":t.type==="large"?"Size"+t.size+"-Regular":(t.type,"Size4-Regular")}function hg(t,e,r,i){let n={"-4":0,"-3":1,0:2}[i.mathstyle.sizeDelta];for(let o=n;oe)return r[o]}return r[r.length-1]}function an(t,e,r,i,n,o){if(!e||e.length===0||e===".")return lr(n);e==="<"||e==="\\lt"?e="\\langle":(e===">"||e==="\\gt")&&(e="\\rangle");let a;ph.has(e)?a=cg:hh.has(e)?a=dg:a=ug;let s=hg(ts(e),r,a,n),l=new P({parent:n,mathstyle:s.mathstyle},o==null?void 0:o.style);return s.type==="small"?ag(e,l,i,g(h({},o),{type:t})):s.type==="large"?dh(e,s.size,i,l,g(h({},o),{type:t})):(s.type,mh(e,r,i,l,g(h({},o),{type:t})))}function hi(t,e,r,i,n,o){if(e===".")return lr(n,o==null?void 0:o.classes);let a=Ie*n.scalingFactor,s=901,l=5/Rt,c=Math.max(r-a,i+a),u=Math.max(c/500*s,2*c-l);return an(t,e,u,!0,n,o)}function lr(t,e){let r=new w(null,{classes:" ML__nulldelimiter "+(e!=null?e:""),type:"ignore"});return r.width=t.getRegisterAsEm("nulldelimiterspace"),r.wrap(new P({parent:t,mathstyle:"textstyle"}))}var Me=class t extends x{constructor(e){var r;super({type:"placeholder",command:"\\placeholder",mode:(r=e==null?void 0:e.mode)!=null?r:"math",style:e==null?void 0:e.style}),this.captureSelection=!0}static fromJson(e){return new t(e)}toJson(){return super.toJson()}render(e){let r;return this.value=e.placeholderSymbol,typeof e.renderPlaceholder=="function"?r=e.renderPlaceholder(e):r=this.createBox(e),this.caret&&(r.classes+=" ML__placeholder-selected"),r}_serialize(e){return e.skipPlaceholders?"":"\\placeholder{}"}};var gh=["matrix","matrix*","pmatrix","pmatrix*","bmatrix","bmatrix*","Bmatrix","Bmatrix*","vmatrix","vmatrix*","Vmatrix","Vmatrix*"],fc=["cases","dcases","rcases"],bh=["align","align*","aligned","gather","gather*","gathered","split"],pg=["array","subequations","eqnarray"];function yh(t){return bh.includes(t)||fc.includes(t)||fc.includes(t)||gh.includes(t)||pg.includes(t)}function rs(t){return gh.includes(t)}function xh(t){return fc.includes(t)}function vh(t){return bh.includes(t)}function fg(t,e,r){let i=0;for(let c of r.columns)"align"in c&&(i+=1);i=Math.max(i,r.minColumns);let n=0,o=[];for(let c of e){n=Math.max(n,Math.min(c.length,i));let u=0;for(;u0&&o[o.length-1].length===1&&xg(o[o.length-1][0])&&o.pop();let a=[];for(let c of o){if(c.length!==n)for(let u=c.length;u0&&t.every(e=>e.type==="first")}function bg(t,e,r){let i=new w(null,{classes:"ML__empty-line-anchor"}),n=t[0];n&&(n.id||(n.id=e.makeID()),i.atomID=n.id),i.setStyle("display","inline-block"),i.setStyle("width",0),i.setStyle("position","relative"),i.setStyle("height",Math.max(0,r.height+r.depth),"em"),i.setStyle("vertical-align",-r.depth,"em"),i.height=r.height,i.depth=r.depth;let o=t.find(a=>a.caret);return o!=null&&o.caret&&(i.caret=o.caret),t.some(a=>a.isSelected)&&i.selected(!0),i}function yg(t,e){return t.length===0?[new x({type:"first",mode:e})]:t[0].type!=="first"?[new x({type:"first",mode:e}),...t]:(t.slice(1).some(r=>r.type==="first"),t)}function xg(t){return t.length===1&&t[0].type==="first"}var z=class t extends x{get isMultiline(){let e=this.environmentName;return["lines","multline","multline*","align","split","gather","gathered"].includes(e)}constructor(e,r,i,n={}){var o,a,s,l;if(super({type:"array",isRoot:n.isRoot}),this.environmentName=e,n.columns)n.columns.length===0?this.colFormat=[{align:"l"}]:this.colFormat=[...n.columns];else if(n.minColumns){let c=[];for(let u=0;ur.map(i=>i.map(n=>n.toJson()))),rowGaps:this.rowGaps,columns:this.colFormat,colSeparationType:this.colSeparationType,minColumns:this.minColumns,minRows:this.minRows,maxRows:this.maxRows});return this.arraystretch!==void 0&&(e.arraystretch=this.arraystretch),this.arraycolsep!==void 0&&(e.arraycolsep=this.arraycolsep),this.leftDelim&&(e.leftDelim=this.leftDelim),this.rightDelim&&(e.rightDelim=this.rightDelim),this.isRoot&&(e.isRoot=!0),e.minColumns=this.minColumns,e.minRows=this.minRows,e.maxRows=this.maxRows,this.mathstyleName&&(e.mathstyleName=this.mathstyleName),this.classes.length>0&&(e.classes=this.classes),e}branch(e){var r;if(Ze(e))return(r=this._rows[e[0]][e[1]])!=null?r:void 0}createBranch(e){var r;return Ze(e)?(this.isDirty=!0,(r=this.branch(e))!=null?r:[]):[]}get rowCount(){return this._rows.length}get colCount(){return this._rows[0].length}get maxColumns(){return this.colFormat.filter(e=>!!e.align).length}removeBranch(e){if(Rr(e))return super.removeBranch(e);let[r,...i]=this.branch(e);return r.type,this._rows[e[0]][e[1]]=void 0,i.forEach(n=>{n.parent=void 0,n.parentBranch=void 0}),this.isDirty=!0,i}get hasChildren(){return this.children.length>0}get children(){let e=[];for(let r of this._rows)for(let i of r)if(i)for(let n of i)e.push(...n.children),e.push(n);return[...e,...super.children]}render(e){var K,N,j,D,W,ie;let r=new P({parent:e,mathstyle:this.mathstyleName},this.style),i=r.getRegisterAsEm("arrayrulewidth"),n=r.getRegisterAsEm("arraycolsep"),o=r.getRegisterAsEm("doublerulesep"),a=(N=(K=this.arraystretch)!=null?K:r.getRegisterAsNumber("arraystretch"))!=null?N:1,s=typeof this.arraycolsep=="number"?this.arraycolsep:n;this.colSeparationType==="small"&&(s=.2778*(new P({parent:e,mathstyle:"scriptstyle"}).scalingFactor/e.scalingFactor));let l=a*P0,c=.7*l,u=.3*l,d=0,m=[],p=0,f=this._rows.length;for(let X=0;X0&&(we+=u,Ct=Math.max(Ct,we),we=0),X0&&v.push(new te({individualShift:ye}))}let b=[],k=!1,S=!1,A=0,E=!this.leftDelim,{colFormat:C}=this;for(let X of C){if("align"in X&&A>=v.length)break;if("align"in X)k?b.push(ns(2*s)):(S||E)&&b.push(ns(s)),b.push(new w(v[A],{classes:"col-align-"+X.align})),A++,k=!0,S=!1,E=!1;else if("gap"in X){if(typeof X.gap=="number")b.push(ns(X.gap));else{let ye=vg(e,m,y,X.gap);ye&&b.push(ye)}k=!1,S=!1,E=!1}else if("separator"in X){let ye=new w(null,{classes:"ML__vertical-separator"});ye.height=d,ye.setStyle("height",d,"em"),ye.setStyle("border-right",`${i}em ${X.separator} currentColor`),ye.setStyle("vertical-align",-(d-y),"em");let xe=0;S?xe=o-i:k&&(xe=s-i),ye.left=xe,b.push(ye),k=!1,S=!0,E=!1}}k&&!this.rightDelim&&b.push(ns(s));let _=new w(b,{classes:["ML__mtable",...this.classes].join(" ")});if(this.environmentName==="array"&&!this.isMultiline&&(_.height=m[0].height,_.depth=d-m[0].height),(!this.leftDelim||this.leftDelim===".")&&(!this.rightDelim||this.rightDelim==="."))return this.caret&&(_.caret=this.caret),this.bind(e,_);let O=_.height,I=_.depth,V=this.bind(e,new w([this.bind(e,hi("open",(W=this.leftDelim)!=null?W:".",O,I,r,{isSelected:this.isSelected})),_,this.bind(e,hi("close",(ie=this.rightDelim)!=null?ie:".",O,I,r,{isSelected:this.isSelected}))],{type:"ord"}));return V?(V.setStyle("display","inline-block"),this.caret&&(V.caret=this.caret),this.bind(e,this.attachSupsub(e,{base:V}))):null}_serialize(e){var i;let r=[];if(this.environmentName==="lines"&&this._rows.length>1?r.push("\\displaylines{"):this.environmentName!=="lines"&&r.push(`\\begin{${this.environmentName}}`),this.environmentName==="array"){if(r.push("{"),this.colFormat!==void 0)for(let n of this.colFormat)"align"in n&&typeof n.align=="string"?r.push(n.align):"separator"in n&&n.separator==="solid"?r.push("|"):"separator"in n&&n.separator==="dashed"&&r.push(":");r.push("}")}for(let n=0;n0&&r.push(" & "),r.push(x.serialize(this._rows[n][o],e));if(n1?r.push("}"):this.environmentName!=="lines"&&r.push(`\\end{${this.environmentName}}`),R(r)}forEachCell(e){for(let r=0;ro.type!=="first")];this._rows[e][r]=n,pi(this),this.isDirty=!0}addRowBefore(e){this.type==="array"&&Array.isArray(this._rows),this._rows.splice(e,0,Array.from({length:this.colCount},()=>is(this,!this.isMultiline))),pi(this),this.isDirty=!0}addRowAfter(e){this.type==="array"&&Array.isArray(this._rows),this._rows.splice(e+1,0,Array.from({length:this.colCount},()=>is(this,!this.isMultiline))),pi(this),this.isDirty=!0}removeRow(e){this.type==="array"&&Array.isArray(this._rows)&&this.rowCount>e;let r=this._rows.splice(e,1);for(let i of r)for(let n of i)if(n)for(let o of n)o.parent=void 0,o.parentBranch=void 0;pi(this),this.isDirty=!0}addColumnBefore(e){this.type==="array"&&Array.isArray(this._rows);for(let r of this._rows)r.splice(e,0,is(this));pi(this),this.isDirty=!0}addColumnAfter(e){this.type==="array"&&Array.isArray(this._rows);for(let r of this._rows)r.splice(e+1,0,is(this));pi(this),this.isDirty=!0}addColumn(){this.addColumnAfter(this.colCount-1)}removeColumn(e){this.type==="array"&&Array.isArray(this._rows)&&this.colCount>e;for(let r of this._rows){let i=r.splice(e,1);for(let n of i)if(n)for(let o of n)o.parent=void 0,o.parentBranch=void 0}pi(this),this.isDirty=!0}get cells(){let e=[];for(let r of this._rows)for(let i of r)i&&e.push(i.filter(n=>n.type!=="first"));return e}get rows(){return this._rows}};function is(t,e=!1){let r=new x({type:"first",mode:t.mode});r.parent=t;let i=[r];if(e){let n=new Me;n.parent=t,i.push(n)}return i}function pi(t){for(let e=0;e0?i:0),l.depth=r.depth+o+(i<0?-i:0),l.setStyle("padding-left",o,"em"),l.setStyle("padding-right",o,"em"),l.setStyle("height",Math.floor(100*(r.height+r.depth+2*o+Math.abs(i)))/100,"em"),l.setStyle("margin-top",-o,"em"),l.setStyle("top",Math.floor(100*(r.depth-r.height+2*o-i))/100,"em"),l.setStyle("vertical-align",Math.floor(100*(r.depth+2*o))/100,"em"),this.caret&&(l.caret=this.caret),this.attachSupsub(e,{base:l})}_serialize(e){return e.skipStyles?R([this.bodyToLatex(e),this.supsubToLatex(e)]):super._serialize(e)}};var sn=class t extends x{constructor(e,r){var i;super({type:"composition",mode:(i=r==null?void 0:r.mode)!=null?i:"math",value:e})}static fromJson(e){return new t(e.value,e)}toJson(){return super.toJson()}render(e){let r=new w(this.value,{classes:"ML__composition",type:"composition"});return this.bind(e,r),this.caret&&(r.caret=this.caret),r}_serialize(e){return""}};var bt=class t extends x{constructor(e){super({type:"error",value:e,command:e,mode:"math"}),this.verbatimLatex=e}static fromJson(e){return new t(e.command)}toJson(){return super.toJson()}render(e){let r=this.createBox(e,{classes:"ML__error"});return this.caret&&(r.caret=this.caret),r}};var ln=class t extends x{constructor(e,r){super({type:"group",mode:r}),this.body=e,this.boxType=e.length>1?"ord":"ignore",this.skipBoundary=!0,this.displayContainsHighlight=!1,(e==null?void 0:e.length)===1&&e[0].command===","&&(this.captureSelection=!0)}static fromJson(e){return new t(e.body,e.mode)}render(e){let r=x.createBox(e,this.body,{type:this.boxType});return r?(this.caret&&(r.caret=this.caret),this.bind(e,r)):null}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);return r!=null&&r.serialize?r.serialize(this,e):`{${this.bodyToLatex(e)}}`}};var J=class t extends x{constructor(e,r,i){super({type:"leftright",style:i.style,displayContainsHighlight:!0}),this.variant=e,this.body=r,this.leftDelim=i.leftDelim,this.rightDelim=i.rightDelim}static fromJson(e){var r;return new t((r=e.variant)!=null?r:"",e.body,e)}toJson(){let e=super.toJson();return this.variant&&(e.variant=this.variant),this.leftDelim&&(e.leftDelim=this.leftDelim),this.rightDelim&&(e.rightDelim=this.rightDelim),e}_serialize(e){var i,n;let r=this.matchingRightDelim();return this.variant==="left...right"?R(["\\left",(i=this.leftDelim)!=null?i:".",this.bodyToLatex(e),"\\right",r]):this.variant==="mleft...mright"?R(["\\mleft",(n=this.leftDelim)!=null?n:".",this.bodyToLatex(e),"\\mright",r]):R([!this.leftDelim||this.leftDelim==="."?"":this.leftDelim,this.bodyToLatex(e),r])}matchingRightDelim(){var r,i;if(this.rightDelim&&this.rightDelim!=="?")return this.rightDelim;let e=(r=this.leftDelim)!=null?r:".";return(i=nn[e])!=null?i:e}render(e){var d,m;let r=new P({parent:e},this.style);this.body;let i=new P({parent:e,mathstyle:"textstyle"},this.style),n=(d=x.createBox(r,this.body,{type:"inner"}))!=null?d:new w(null,{type:"inner"}),o=n.height/i.scalingFactor,a=n.depth/i.scalingFactor,s=[];if(this.leftDelim&&s.push(this.bind(i,hi("open",this.leftDelim,o,a,i,{isSelected:this.isSelected,classes:"ML__open"+(this.containsCaret?" ML__contains-caret":""),mode:this.mode,style:this.style}))),n&&(_h(n.children,this,r,o,a),s.push(n)),this.rightDelim){let p=this.containsCaret?" ML__contains-caret":"",f=this.rightDelim;f==="?"&&(r.smartFence?(f=this.matchingRightDelim(),p+=" ML__smart-fence__close"):f="."),s.push(this.bind(i,hi("close",f,o,a,i,{isSelected:this.isSelected,classes:p+" ML__close",mode:this.mode,style:this.style})))}let l=this.variant==="mleft...mright",c=this.leftSibling;c&&(!l&&c.isFunction&&(l=!0),!l&&c.type==="subsup"&&((m=c.leftSibling)!=null&&m.isFunction)&&(l=!0));let u=new w(s,{type:l?"close":"inner",classes:"ML__left-right"});return u.setStyle("margin-top",`${-n.depth}em`),u.setStyle("height",`${n.height+n.depth}em`),this.caret&&(u.caret=this.caret),this.bind(r,u.wrap(r))}};function _h(t,e,r,i,n){if(t)for(let o=0;or.type!=="first").map(r=>r.toJson())),this.correctness&&(e.correctness=this.correctness),e.locked=this.locked,e}render(e){var C,_,O,I,V;let r=new P({parent:e}),i=r.getRegisterAsEm("fboxsep"),n=i,o=i,a=x.createBox(e,this.body);if(!a)return null;let l=!this.body||this.body.length===0||this.body.every(K=>K.type==="first")?new Me({mode:this.mode,style:this.style}).render(new P({parent:e,isPhantom:!0})):null,c=(C=l==null?void 0:l.height)!=null?C:r.metrics.xHeight,u=(_=l==null?void 0:l.depth)!=null?_:c/2,d=Math.max((O=a.height)!=null?O:0,c),m=Math.max((I=a.depth)!=null?I:0,u);a.setStyle("vertical-align",`calc(-${d}em + 2px)`),this.correctness==="correct"?a.setStyle("color","var(--correct-color, var(--ML__correct-color))"):this.correctness==="incorrect"&&a.setStyle("color","var(--incorrect-color, var(--ML__incorrect-color))");let f=d+m+2*o-2*n,y=new w(a,{type:"ord"});y.setStyle("display","inline-block"),y.height=d,y.depth=m,y.setStyle("height",d+m,"em"),y.setStyle("vertical-align",-o,"em"),((V=a.width)!=null?V:0)'),k&&(b.svgOverlay=k);let S=new w([b,y],{classes:"ML__prompt-atom"});y.setStyle("line-height",1),S.setStyle("position","relative"),S.setStyle("display","inline-block"),S.setStyle("line-height",0),S.height=d+o+.2,S.depth=m+o,S.left=n,S.right=n,S.setStyle("height",d+2*o,"em"),S.setStyle("top",m-d-o/2,"em"),S.setStyle("vertical-align",y.depth,"em"),S.setStyle("margin-left",.5,"em"),S.setStyle("margin-right",.5,"em"),this.caret&&(S.caret=this.caret);let A=this.attachSupsub(e,{base:S}),E=this.bind(r,A);return E&&this.id&&(b.atomID=this.id,y.atomID=this.id,S.atomID=this.id),E}_serialize(e){var n;let r=(n=this.bodyToLatex(e))!=null?n:"";if(e.skipPlaceholders)return r;let i="\\placeholder";return this.placeholderId&&(i+=`[${this.placeholderId}]`),this.correctness==="correct"?i+="[correct]":this.correctness==="incorrect"&&(i+="[incorrect]"),this.locked&&(i+="[locked]"),U(i,r)}};var cr=class t extends x{constructor(e){super({type:"subsup",style:e==null?void 0:e.style}),this.subsupPlacement="auto"}get children(){if(!this._children){let e=[],r=this.branch("subscript");if(r)for(let n of r)e.push(...n.children),e.push(n);let i=this.branch("superscript");if(i)for(let n of i)e.push(...n.children),e.push(n);this._children=e}return this._children}static fromJson(e){let r=new t(e);for(let i of Ir)e[i]&&r.setChildren(e[i],i);return r}render(e){var a;let r=new P({parent:e,isPhantom:!0}),i=this.leftSibling,n=(a=i.render(r))!=null?a:new w(null),o=new w(null);return o.height=n.height,o.depth=n.depth,this.attachSupsub(e,{base:o,isCharacterBox:i.isCharacterBox(),type:"ignore"})}_serialize(e){return this.supsubToLatex(e)}};function dn(t){return t?!/^(<$$>|<$>||<{>|<}>|#[0-9\?]|\\.+)$/.test(t):!1}var as=class{constructor(e,r,i){this.errors=[];this.index=0;this.endCount=0;var n,o,a,s;i!=null||(i={}),this.tokens=e,this.context=r instanceof P&&!(i!=null&&i.parseMode)&&!i.mathstyle?r:new P({from:r,mathstyle:i.mathstyle},i.style),this.args=(n=i.args)!=null?n:void 0,this.smartFence=this.context.smartFence,this.parsingContext={parent:void 0,mathlist:[],style:(o=i.style)!=null?o:{},parseMode:(a=i.parseMode)!=null?a:"math",mathstyle:(s=i.mathstyle)!=null?s:"displaystyle",tabular:!1}}beginContext(e){var n,o,a,s,l,c;if(e!=null&&e.root){this.parsingContext={parent:this.parsingContext.parent,mathlist:[],style:{},parseMode:(n=e==null?void 0:e.mode)!=null?n:"math",mathstyle:(o=e==null?void 0:e.mathstyle)!=null?o:"displaystyle",tabular:(a=e==null?void 0:e.tabular)!=null?a:!1};return}let r=this.parsingContext,i={parent:r,mathlist:[],style:h({},r.style),parseMode:(s=e==null?void 0:e.mode)!=null?s:r.parseMode,mathstyle:(l=e==null?void 0:e.mathstyle)!=null?l:r.mathstyle,tabular:(c=e==null?void 0:e.tabular)!=null?c:!1};this.parsingContext=i}endContext(){this.parsingContext=this.parsingContext.parent}onError(e){this.errors.push(h({before:Dr(this.tokens.slice(this.index,this.index+10)),after:Dr(this.tokens.slice(Math.max(0,this.index-10),this.index))},e))}get mathlist(){return this.parsingContext.mathlist}set mathlist(e){this.parsingContext.mathlist=e}get parseMode(){return this.parsingContext.parseMode}set parseMode(e){this.parsingContext.parseMode=e}get tabularMode(){return this.parsingContext.tabular}get style(){let e=this.parsingContext;for(;e;){if(e.style)return h({},e.style);e=e.parent}return{}}set style(e){this.parsingContext.style=e}end(){return this.endCount++,this.index>=this.tokens.length||this.endCount>1e3}next(){this.index+=1}get(){return this.endCount=0,this.index0&&(e=this.mathlist[this.mathlist.length-1],e.type==="subsup"||e.subsupPlacement!==void 0)||(e=new cr({style:this.style}),this.mathlist.push(e)),e}hasPattern(e){return e.test(this.tokens[this.index])}hasInfixCommand(){var r;let{index:e}=this;if(e"););}skipUntilToken(e){let r=this.tokens[this.index];for(;r&&r!==e;)r=this.tokens[++this.index];r===e&&this.index++}skipFiller(){for(;this.match("\\relax")||this.match(""););}matchKeyword(e){let r=this.index,i=this.end(),n="";for(;!i;){let a=this.get();dn(a)?(n+=a,i=this.end()||n.length>=e.length):i=!0}let o=e.toUpperCase()===n.toUpperCase();return o||(this.index=r),o}scanString(){let e="";for(;!this.end();){let r=this.peek();if(r==="]")return e;if(r==="")e+=" ";else if(r.startsWith("\\"))this.onError({code:"unexpected-command-in-string"}),e+=r.substring(1);else if(dn(r))e+=r;else return e;this.next()}return e}scanBalancedString(){let e="",r=this.end(),i=1;for(;!r;){let n=this.get();n===""?e+=" ":n==="<{>"?(e+="{",i+=1):n==="<}>"?(i-=1,i>0?e+="}":this.index-=1):n==="<$>"?e+="$":n==="<$$>"?e+="$$":e+=n,r=i===0||this.end()}return e}scanLiteralGroup(){var i;if(!this.match("<{>"))return"";let e="",r=1;for(;r>0&&!this.end();){let n=this.get();n==="<}>"?(r-=1,r>0&&(e+="}")):n==="<{>"?(r+=1,e+="{"):(/\\[a-zA-Z]+$/.test(e)&&/^[a-zA-Z]/.test(n)&&(e+=" "),e+=(i={"":" ","<$$>":"$$","<$>":"$"}[n])!=null?i:n)}return e}scanNumber(e=!0){var l,c;let r=!1,i=this.peek();for(;i===""||i==="+"||i==="-";)this.get(),i==="-"&&(r=!r),i=this.peek();e=!!e;let n=10,o=/\d/;if(this.match("'"))n=8,o=/[0-7]/,e=!0;else if(this.match('"'))n=16,o=/[\dA-F]/,e=!0;else if(this.match("x"))n=16,o=/[\dA-Fa-f]/,e=!0;else if(this.match("`"))return i=this.get(),i?i.length===2&&i.startsWith("\\")?{number:(r?-1:1)*((l=i.codePointAt(1))!=null?l:0),base:"alpha"}:{number:(r?-1:1)*((c=i.codePointAt(0))!=null?c:0),base:"alpha"}:null;let a="";for(;this.hasPattern(o);)a+=this.get();if(!e&&(this.match(".")||this.match(",")))for(a+=".";this.hasPattern(o);)a+=this.get();let s=e?Number.parseInt(a,n):Number.parseFloat(a);return Number.isNaN(s)?null:{number:r?-s:s,base:n===16?"hexadecimal":n===8?"octal":"decimal"}}scanRegister(){var o;let e=this.index,r=this.scanNumber(!1);if(this.skipWhitespace(),this.match("\\relax"))return r;let i=!1;if(r===null)for(;;){let a=this.peek();if(a==="-")i=!i;else if(a!=="+")break;this.next(),this.skipWhitespace()}if(this.match("\\global")){this.skipWhitespace();let a=this.get();return a.startsWith("\\")?r?{register:a,global:!0,factor:(i?-1:1)*r.number}:i?{register:a,global:!0,factor:-1}:{register:a,global:!0}:(this.index=e,null)}let n=this.get();return n!=null&&n.startsWith("\\")?(n=n.substring(1),this.context.registers[n]?!i||r!==null?{register:n,factor:(i?-1:1)*((o=r==null?void 0:r.number)!=null?o:1)}:{register:n}:(this.index=e,null)):(this.index=e,null)}scanValue(){let e=this.scanRegister();if(e)return e;let r=this.index,i=this.scanGlueOrDimen();if(i&&("unit"in i||"glue"in i&&"unit"in i.glue))return i;this.index=r;let n=this.scanNumber();if(n)return n;if(this.end()||!dn(this.peek()))return null;let o=this.scanString();return o.length>0?{string:o}:null}scanDimen(){let e=this.scanNumber(!1);if(e===null)return null;let r=e.number;this.skipWhitespace(),this.matchKeyword("true"),this.skipWhitespace();let i;return this.matchKeyword("pt")?i="pt":this.matchKeyword("mm")?i="mm":this.matchKeyword("cm")?i="cm":this.matchKeyword("ex")?i="ex":this.matchKeyword("px")?i="px":this.matchKeyword("em")?i="em":this.matchKeyword("bp")?i="bp":this.matchKeyword("dd")?i="dd":this.matchKeyword("pc")?i="pc":this.matchKeyword("in")?i="in":this.matchKeyword("mu")&&(i="mu"),i?{dimension:r,unit:i}:{dimension:r}}scanGlueOrDimen(){let e=this.scanDimen();if(e===null)return null;if(this.skipWhitespace(),this.match("\\relax"))return e;let r={glue:e};if(this.matchKeyword("plus")){let i=this.scanDimen();if(i)r.grow=i;else return r}if(this.skipWhitespace(),this.match("\\relax"))return r;if(this.skipWhitespace(),this.matchKeyword("minus")){let i=this.scanDimen();if(i)r.shrink=i;else return r}return!r.grow&&!r.shrink?e:r}scanColspec(){this.skipWhitespace();let e=[];for(;!this.end()&&!(this.peek()==="<}>"||this.peek()==="]");){let r=this.get();r==="c"||r==="r"||r==="l"?e.push({align:r}):r==="|"?e.push({separator:"solid"}):r===":"?e.push({separator:"dashed"}):r==="@"&&(this.match("<{>")&&(this.beginContext({mode:"math"}),e.push({gap:this.scan(i=>i==="<}>")}),this.endContext()),this.match("<}>")||this.onError({code:"unbalanced-braces"}))}return e}scanModeSet(){let e;if(this.match("\\(")&&(e="textstyle"),!e&&this.match("\\[")&&(e="displaystyle"),!e)return null;this.beginContext({mode:"math",mathstyle:e});let r=this.scan(i=>i===(e==="displaystyle"?"\\]":"\\)"));return this.match(e==="displaystyle"?"\\]":"\\)")||this.onError({code:"unbalanced-mode-shift"}),this.endContext(),r}scanModeShift(){let e="";if(this.match("<$>")&&(e="<$>"),!e&&this.match("<$$>")&&(e="<$$>"),!e)return null;this.beginContext({mode:"math",mathstyle:e==="<$>"?"textstyle":"displaystyle"});let r=this.scan(i=>i===e);return this.match(e)||this.onError({code:"unbalanced-mode-shift"}),this.endContext(),r}scanEnvironment(){if(!this.match("\\begin"))return null;let e=this.scanArgument("string");if(!e)return null;let r=Vu(e);if(!r)return this.onError({code:"unknown-environment",arg:e}),null;let i=[];if(r.params)for(let l of r.params)if(l.isOptional)i.push(this.scanOptionalArgument(l.type));else{let c=this.scanArgument(l.type);c||this.onError({code:"missing-argument",arg:e}),i.push(c)}this.beginContext({tabular:r.tabular,root:r.rootOnly});let n=[],o=[],a=[],s=!1;do if(this.end()&&(this.onError({code:"unbalanced-environment",arg:e}),s=!0),!s&&this.match("\\end")&&(this.scanArgument("string")!==e&&this.onError({code:"unbalanced-environment",arg:e}),s=!0),!s)if(this.matchColumnSeparator())a.push(this.mathlist),this.mathlist=[];else if(this.matchRowSeparator()){a.push(this.mathlist),this.mathlist=[];let l=null;this.skipWhitespace(),this.match("[")&&(l=this.scanDimen(),this.skipWhitespace(),this.match("]")),o.push(l!=null?l:{dimension:0}),n.push(a),a=[]}else this.mathlist.push(...this.scan(l=>["<}>","&","\\end","\\cr","\\\\","\\tabularnewline"].includes(l)));while(!s);return a.push(this.mathlist),a.length>0&&n.push(a),this.endContext(),r.rootOnly&&(this.index=this.tokens.length),r.createAtom(e,n,o,i,this.context.maxMatrixCols)}scanExpression(){let e=this.mathlist;if(this.mathlist=[],this.parseExpression()){let r=this.mathlist;return this.mathlist=e,r}return this.mathlist=e,null}scan(e){this.beginContext(),e||(e=s=>s==="<}>");let r="",i=null,n=[],o=null;for(;!this.end()&&!e(this.peek());)this.hasInfixCommand()&&!r?(r=this.get(),i=ne(r,"math"),i&&(n=this.scanArguments(i)[1]),o=this.mathlist,this.mathlist=[]):this.parseExpression();let a;return r?(n.unshift(this.mathlist),o&&n.unshift(o),a=[i.createAtom({command:r,args:n,style:this.style,mode:this.parseMode})]):a=this.mathlist,this.endContext(),a}scanGroup(){let e=this.index;if(!this.match("<{>"))return null;let r=this.scan(n=>n==="<}>");if(this.match("<}>")||this.onError({code:"unbalanced-braces"}),r.length===1&&r[0].type==="placeholder")return r[0];let i=new ln(r,this.parseMode);return i.verbatimLatex=Dr(this.tokens.slice(e,this.index)),i}scanSmartFence(){if(this.skipWhitespace(),!this.match("("))return null;this.beginContext();let e=1;for(;!this.end()&&e!==0;)this.match("(")&&(e+=1),this.match(")")&&(e-=1),e!==0&&this.parseExpression();let r=new J("",this.mathlist,{leftDelim:"(",rightDelim:e===0?")":"?"});return this.endContext(),r}scanDelim(){this.skipWhitespace();let e=this.peek();if(!e)return this.onError({code:"unexpected-end-of-string"}),null;if(!dn(e)&&!e.startsWith("\\"))return null;this.next();let r=ne(e,"math");return r?r.definitionType==="function"&&r.ifMode&&!r.ifMode.includes(this.parseMode)?(this.onError({code:"unexpected-delimiter",arg:e}),null):r.definitionType==="symbol"&&(r.type==="mopen"||r.type==="mclose")||/^(\.|\?|\||<|>|\\vert|\\Vert|\\\||\\surd|\\uparrow|\\downarrow|\\Uparrow|\\Downarrow|\\updownarrow|\\Updownarrow|\\mid|\\mvert|\\mVert)$/.test(e)?e:(this.onError({code:"unexpected-delimiter",arg:e}),null):(this.onError({code:"unknown-command",arg:e}),null)}scanLeftRight(){var o;if(this.match("\\right"))return this.onError({code:"unbalanced-braces"}),new bt("\\right");if(this.match("\\mright"))return this.onError({code:"unbalanced-braces"}),new bt("\\mright");let e="\\right";if(!this.match("\\left")){if(!this.match("\\mleft"))return null;e="\\mright"}let r=this.scanDelim();if(!r)return this.onError({code:"unexpected-delimiter"}),new bt(e==="\\right"?"\\left":"\\mleft");for(this.beginContext();!this.end()&&!this.match(e);)this.parseExpression();let i=this.mathlist;this.endContext();let n=(o=this.scanDelim())!=null?o:".";return new J(e==="\\right"?"left...right":"mleft...mright",i,{leftDelim:r,rightDelim:n,style:this.style})}parseSupSub(){if(this.parseMode!=="math")return!1;let e=this.peek();if(e!=="^"&&e!=="_"&&e!=="'")return!1;let r=this.lastSubsupAtom();for(;e==="^"||e==="_"||e==="'";)this.match("'")?this.match("'")?r.addChild(new x({type:"mord",command:"\\doubleprime",mode:"math",value:"\u2032\u2032"}),"superscript"):r.addChild(new x({type:"mord",command:"\\prime",mode:"math",value:"\u2032"}),"superscript"):(this.match("^")||this.match("_"))&&r.addChildren(T(this.scanArgument("expression")),e==="_"?"subscript":"superscript"),e=this.peek();return!0}parseLimits(){if(this.parseMode!=="math")return!1;let e=this.match("\\limits"),r=!e&&this.match("\\nolimits"),i=!r&&!e&&this.match("\\displaylimits");if(!e&&!r&&!i)return!1;let n=this.mathlist.length>0?this.mathlist[this.mathlist.length-1]:null;return n===null?!1:(n.explicitSubsupPlacement=!0,e&&(n.subsupPlacement="over-under"),r&&(n.subsupPlacement="adjacent"),i&&(n.subsupPlacement="auto"),!0)}scanArguments(e){if(!(e!=null&&e.params))return[void 0,[]];let r,i=[],n=e.infix?2:0;for(;n["<}>","&","\\end","\\cr","\\\\","\\tabularnewline","\\right"].includes(a))):o.isOptional?i.push(this.scanOptionalArgument(o.type)):o.type.endsWith("*")?r=o.type.slice(0,-1):i.push(this.scanArgument(o.type)),n+=1}return[r,i]}scanSymbolOrLiteral(){let e=this.peek();if(!e)return null;this.next();let r;if(dn(e)){let i=_e.createAtom(this.parseMode,e,h({},this.style));return i?[i]:null}if(r=this.scanMacro(e),r)return[r];if(e.startsWith("\\")){let i=ne(e,this.parseMode);if(!i)return this.onError({code:"unknown-command",arg:e}),[new bt(e)];if(i.definitionType==="symbol"){let n=h({},this.style);i.variant&&(n.variant=i.variant),r=new x({type:i.type,command:e,style:n,value:String.fromCodePoint(i.codepoint),mode:this.parseMode,verbatimLatex:e})}else{if(i.applyMode||i.applyStyle||i.infix)return this.onError({code:"invalid-command",arg:e}),[new bt(e)];i.createAtom&&(r=i.createAtom({command:e,args:[],style:this.style,mode:this.parseMode}))}}return r?[r]:null}scanArgument(e){var n,o;this.skipFiller();let r=this.parseMode;if(e==="auto"&&(e=r),!this.match("<{>")){if(e==="string")return this.scanString();if(e==="value")return this.scanValue();if(e==="delim")return(n=this.scanDelim())!=null?n:".";if(e==="expression")return this.scanExpression();if(e==="math"){e!==r&&this.beginContext({mode:"math"});let a=this.scanSymbolOrLiteral();return e!==r&&this.endContext(),a}if(e==="text"){e!==r&&this.beginContext({mode:"text"});let a=this.scanSymbolOrLiteral();return e!==r&&this.endContext(),a}return e==="balanced-string"?null:e==="rest"?this.scan(a=>["<}>","&","\\end","\\cr","\\\\","\\tabularnewline","\\right"].includes(a)):null}if(e==="text"){this.beginContext({mode:"text"});do this.mathlist.push(...this.scan());while(!this.match("<}>")&&!this.end());let a=this.mathlist;return this.endContext(),{group:a}}if(e==="math"){this.beginContext({mode:"math"});do this.mathlist.push(...this.scan());while(!this.match("<}>")&&!this.end());let a=this.mathlist;return this.endContext(),{group:a}}if(e==="rest"){let a=this.scan();return this.match("<}>")||this.onError({code:"unbalanced-braces"}),{group:a}}let i=null;if(e==="expression"){this.beginContext({mode:"math"});do this.mathlist.push(...this.scan());while(!this.match("<}>")&&!this.end());let a=this.mathlist;return this.endContext(),{group:a}}return e==="string"?i=this.scanString():e==="balanced-string"?i=this.scanBalancedString():e==="colspec"?i=this.scanColspec():e==="value"?i=this.scanValue():e==="delim"&&(i=this.peek()==="<}>"?".":(o=this.scanDelim())!=null?o:"."),this.skipUntilToken("<}>"),i}scanOptionalArgument(e){if(e=e==="auto"?this.parseMode:e,this.skipFiller(),!this.match("["))return null;let r=null;for(;!this.end()&&!this.match("]");)if(e==="string")r=this.scanString();else if(e==="value")r=this.scanValue();else if(e==="colspec")r=this.scanColspec();else if(e==="bbox"){let i={},n=this.scanString().toLowerCase().trim().split(/,(?![^(]*\)(?:(?:[^(]*\)){2})*[^"]*$)/);for(let o of n){let a=o.match(/^\s*([\d.]+)\s*([a-z]{2})/);if(a)i.padding={dimension:Number.parseFloat(a[1]),unit:a[2]};else{let s=o.match(/^\s*border\s*:\s*(.*)/);s?i.border=s[1]:i.backgroundcolor={string:o}}}r=i}else e==="math"&&(this.beginContext({mode:"math"}),r=this.mathlist.concat(this.scan(i=>i==="]")),this.endContext());return r}scanSymbolOrCommand(e){var o,a,s;if(e==="\\placeholder"){let l=this.scanOptionalArgument("string"),c=this.scanOptionalArgument("math"),u=x.serialize(c,{defaultMode:"math"}),d=[],m;!m&&u==="correct"?m="correct":!m&&u==="incorrect"?m="incorrect":u!==""&&(d=c);let p=this.scanOptionalArgument("string")==="locked",f=this.scanArgument("auto"),y;return f&&Array.isArray(f)&&f.length>0?y=f:f&&typeof f=="object"&&"group"in f?y=f.group:y=d,l?[new un(l,m,p,y!=null?y:d,{mode:this.parseMode,style:this.style})]:[new Me({mode:this.parseMode,style:this.style})]}if(e==="\\renewcommand"||e==="\\newcommand"||e==="\\providecommand"||e==="\\def"){let l=this.index,c=this.scanLiteralGroup()||this.next();if(!c)return null;if(this.context.registers[c.substring(1)]){let u=this.scanArgument("string");u!==null&&(this.context.registers[c.substring(1)]=u);let d=R([e,Dr(this.tokens.slice(l,this.index))]);return[new x({type:"text",value:"",verbatimLatex:d})]}}let r=this.scanMacro(e);if(r)return[r];let i=ne(e,this.parseMode);if(!i)return this.parseMode==="text"?(/[a-zA-Z]/.test((o=this.peek())!=null?o:"")&&(e+=" "),[...e].map(l=>new x({type:"text",value:l,mode:"text",style:this.style}))):(this.onError({code:"unknown-command",arg:e}),[new bt(e)]);let n=this.index;if(i.definitionType==="symbol"){let l=h({},this.style);i.variant&&(l.variant=i.variant),r=new x({type:i.type,command:e,style:l,value:String.fromCodePoint(i.codepoint),mode:this.parseMode})}else{if(i.ifMode&&!i.ifMode.includes(this.parseMode))return[];let l=this.parseMode;i.applyMode&&(this.parseMode=i.applyMode);let c,u=[];if(i.parse?u=i.parse(this):[c,u]=this.scanArguments(i),this.parseMode=l,i.applyMode&&!i.applyStyle&&!i.createAtom)return T(u[0]);if(i.infix)return this.onError({code:"too-many-infix-commands",arg:e}),null;if(typeof i.createAtom=="function")r=i.createAtom({command:e,args:u,style:this.style,mode:this.parseMode}),c&&(r.body=T(this.scanArgument(c)));else if(typeof i.applyStyle=="function"){let d=i.applyStyle(this.style,e,u,this.context),m=this.parseMode;if(i.applyMode&&(this.parseMode=i.applyMode),c){let p=this.style;this.style=d;let f=this.scanArgument(c);return this.style=p,this.parseMode=m,T(f)}this.style=d}else r=new x({type:"mord",command:(a=i.command)!=null?a:e,style:h({},this.style),value:e,mode:(s=i.applyMode)!=null?s:this.parseMode})}if(!r)return null;if(r instanceof x&&r.verbatimLatex===void 0&&!/^\\(llap|rlap|class|cssId|htmlData)$/.test(e)){let l=R([e,Dr(this.tokens.slice(n,this.index))]);l&&(r.verbatimLatex=l)}if(r.verbatimLatex===null&&(r.verbatimLatex=void 0),r.isFunction&&this.smartFence){let l=this.scanSmartFence();if(l)return[r,l]}return[r]}scanSymbolCommandOrLiteral(){this.expandUnicode();let e=this.get();if(!e)return null;if(dn(e)){let r=_e.createAtom(this.parseMode,e,h({},this.style));if(!r)return null;if(r.isFunction&&this.smartFence){let i=this.scanSmartFence();if(i)return[r,i]}return[r]}return e.startsWith("\\")?this.scanSymbolOrCommand(e):e===""?this.parseMode==="text"?[new We(" "," ",this.style)]:null:(e==="<}>"?this.onError({latex:"",code:"unbalanced-braces"}):this.onError({latex:"",code:"unexpected-token",arg:e}),null)}scanMacro(e){var a;let r=this.context.getMacro(e);if(!r)return null;let i=this.index,n=r.args,o={"?":(a=this.args)==null?void 0:a.call(this,"?")};for(let s=1;s<=n;s++){let l=this.scanLiteralGroup();if(!l){let c=this.index;this.scanExpression(),l=Dr(this.tokens.slice(c,this.index))}o[s]=l}return new cn(e,{expand:r.expand,captureSelection:r.captureSelection,args:i===this.index?null:Dr(this.tokens.slice(i,this.index)),style:this.parsingContext.style,body:be(r.def,{context:this.context,parseMode:this.parseMode,args:s=>o[s],mathstyle:this.parsingContext.mathstyle,style:this.parsingContext.style})})}parseExpression(){var r,i,n,o;let e=(o=(n=(i=(r=this.scanEnvironment())!=null?r:this.scanModeShift())!=null?i:this.scanModeSet())!=null?n:this.scanGroup())!=null?o:this.scanLeftRight();if(e===null){if(this.parseSupSub()||this.parseLimits())return!0;e=this.scanSymbolCommandOrLiteral()}return e?(ee(e)?this.mathlist.push(...e):this.mathlist.push(e),!0):!1}};function be(t,e){var o,a,s,l;let r=(o=e==null?void 0:e.args)!=null?o:void 0,i=new as(Ji(t,r),e==null?void 0:e.context,{args:r,mathstyle:(a=e==null?void 0:e.mathstyle)!=null?a:"displaystyle",parseMode:(s=e==null?void 0:e.parseMode)!=null?s:"math",style:(l=e==null?void 0:e.style)!=null?l:{}}),n=[];for(;!i.end();)n.push(...i.scan(()=>!1));return n}function ss(t,e){var i;let r=new as(Ji(t,null),e==null?void 0:e.context,{mathstyle:"displaystyle",parseMode:(i=e==null?void 0:e.parseMode)!=null?i:"math"});for(;!r.end();)r.scan();return r.errors}var to=class t extends x{constructor(e,r){super({type:"chem"},{command:e,mode:"math"});let i=me.go(L.go(r,e==="\\pu"?"pu":"ce"),!1);this.body=be(i),this._verbatimLatex=e+"{"+r+"}",this.arg=r,this.captureSelection=!0}static fromJson(e){return new t(e.command,e.arg)}set verbatimLatex(e){}get verbatimLatex(){return this._verbatimLatex}toJson(){return g(h({},super.toJson()),{arg:this.arg})}render(e){let r=x.createBox(e,this.body,{type:"inner"});return this.caret&&(r.caret=this.caret),this.bind(e,r)}_serialize(e){return this.verbatimLatex,this.verbatimLatex}};M(["ce","pu"],"{chemformula:balanced-string}",{createAtom:t=>{var e;return new to(t.command,(e=t.args[0])!=null?e:"")}});var L={go:function(t,e){if(!t)return[];e===void 0&&(e="ce");var r="0",i={};i.parenthesisLevel=0,t=t.replace(/\n/g," "),t=t.replace(/[\u2212\u2013\u2014\u2010]/g,"-"),t=t.replace(/[\u2026]/g,"...");for(var n,o=10,a=[];;){n!==t?(o=10,n=t):o--;var s=L.stateMachines[e],l=s.transitions[r]||s.transitions["*"];e:for(var c=0;c0){if(d.revisit||(t=u.remainder),!d.toContinue)break e}else return a}}if(o<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(t,e){if(e)if(Object.prototype.toString.call(e)==="[object Array]")for(var r=0;r":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(t){return L.patterns.findObserveGroups(t,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(t){return L.patterns.findObserveGroups(t,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(t){return L.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(t){return L.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(t){return L.patterns.findObserveGroups(t,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(t){return L.patterns.findObserveGroups(t,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(t){return L.patterns.findObserveGroups(t,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(t){return L.patterns.findObserveGroups(t,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(t){return L.patterns.findObserveGroups(t,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(t){return L.patterns.findObserveGroups(t,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(t){return L.patterns.findObserveGroups(t,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(t){return L.patterns.findObserveGroups(t,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(t){var e;if(e=t.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/),e)return{match_:e[0],remainder:t.substr(e[0].length)};var r=L.patterns.findObserveGroups(t,"","$","$","");return r&&(e=r.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/),e)?{match_:e[0],remainder:t.substr(e[0].length)}:null},amount2:function(t){return this.amount(t)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(t){if(t.match(/^\([a-z]+\)$/))return null;var e=t.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:t.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(t,e,r,i,n,o,a,s,l,c){var u=function(b,k){if(typeof k=="string")return b.indexOf(k)!==0?null:k;var S=b.match(k);return S?S[0]:null},d=function(b,k,S){for(var A=0;k0,null},m=u(t,e);if(m===null||(t=t.substr(m.length),m=u(t,r),m===null))return null;var p=d(t,m.length,i||n);if(p===null)return null;var f=t.substring(0,i?p.endMatchEnd:p.endMatchBegin);if(o||a){var y=this.findObserveGroups(t.substr(p.endMatchEnd),o,a,s,l);if(y===null)return null;var v=[f,y.match_];return{match_:c?v.join(""):v,remainder:y.remainder}}else return{match_:f,remainder:t.substr(p.endMatchEnd)}},match_:function(t,e){var r=L.patterns.patterns[t];if(r===void 0)throw["MhchemBugP","mhchem bug P. Please report. ("+t+")"];if(typeof r=="function")return L.patterns.patterns[t](e);var i=e.match(r);if(i){var n;return i[2]?n=[i[1],i[2]]:i[1]?n=i[1]:n=i[0],{match_:n,remainder:e.substr(i[0].length)}}return null}},actions:{"a=":function(t,e){t.a=(t.a||"")+e},"b=":function(t,e){t.b=(t.b||"")+e},"p=":function(t,e){t.p=(t.p||"")+e},"o=":function(t,e){t.o=(t.o||"")+e},"q=":function(t,e){t.q=(t.q||"")+e},"d=":function(t,e){t.d=(t.d||"")+e},"rm=":function(t,e){t.rm=(t.rm||"")+e},"text=":function(t,e){t.text_=(t.text_||"")+e},insert:function(t,e,r){return{type_:r}},"insert+p1":function(t,e,r){return{type_:r,p1:e}},"insert+p1+p2":function(t,e,r){return{type_:r,p1:e[0],p2:e[1]}},copy:function(t,e){return e},rm:function(t,e){return{type_:"rm",p1:e||""}},text:function(t,e){return L.go(e,"text")},"{text}":function(t,e){var r=["{"];return L.concatArray(r,L.go(e,"text")),r.push("}"),r},"tex-math":function(t,e){return L.go(e,"tex-math")},"tex-math tight":function(t,e){return L.go(e,"tex-math tight")},bond:function(t,e,r){return{type_:"bond",kind_:r||e}},"color0-output":function(t,e){return{type_:"color0",color:e[0]}},ce:function(t,e){return L.go(e)},"1/2":function(t,e){var r=[];e.match(/^[+\-]/)&&(r.push(e.substr(0,1)),e=e.substr(1));var i=e.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);return i[1]=i[1].replace(/\$/g,""),r.push({type_:"frac",p1:i[1],p2:i[2]}),i[3]&&(i[3]=i[3].replace(/\$/g,""),r.push({type_:"tex-math",p1:i[3]})),r},"9,9":function(t,e){return L.go(e,"9,9")}},createTransitions:function(t){var e,r,i,n,o={};for(e in t)for(r in t[e])for(i=r.split("|"),t[e][r].stateArray=i,n=0;n":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(t,e){var r;if((t.d||"").match(/^[0-9]+$/)){var i=t.d;t.d=void 0,r=this.output(t),t.b=i}else r=this.output(t);return L.actions["o="](t,e),r},"d= kv":function(t,e){t.d=e,t.dType="kv"},"charge or bond":function(t,e){if(t.beginsWithBond){var r=[];return L.concatArray(r,this.output(t)),L.concatArray(r,L.actions.bond(t,e,"-")),r}else t.d=e},"- after o/d":function(t,e,r){var i=L.patterns.match_("orbital",t.o||""),n=L.patterns.match_("one lowercase greek letter $",t.o||""),o=L.patterns.match_("one lowercase latin letter $",t.o||""),a=L.patterns.match_("$one lowercase latin letter$ $",t.o||""),s=e==="-"&&(i&&i.remainder===""||n||o||a);s&&!t.a&&!t.b&&!t.p&&!t.d&&!t.q&&!i&&o&&(t.o="$"+t.o+"$");var l=[];return s?(L.concatArray(l,this.output(t)),l.push({type_:"hyphen"})):(i=L.patterns.match_("digits",t.d||""),r&&i&&i.remainder===""?(L.concatArray(l,L.actions["d="](t,e)),L.concatArray(l,this.output(t))):(L.concatArray(l,this.output(t)),L.concatArray(l,L.actions.bond(t,e,"-")))),l},"a to o":function(t){t.o=t.a,t.a=void 0},"sb=true":function(t){t.sb=!0},"sb=false":function(t){t.sb=!1},"beginsWithBond=true":function(t){t.beginsWithBond=!0},"beginsWithBond=false":function(t){t.beginsWithBond=!1},"parenthesisLevel++":function(t){t.parenthesisLevel++},"parenthesisLevel--":function(t){t.parenthesisLevel--},"state of aggregation":function(t,e){return{type_:"state of aggregation",p1:L.go(e,"o")}},comma:function(t,e){var r=e.replace(/\s*$/,""),i=r!==e;return i&&t.parenthesisLevel===0?{type_:"comma enumeration L",p1:r}:{type_:"comma enumeration M",p1:r}},output:function(t,e,r){var i;if(!t.r)i=[],!t.a&&!t.b&&!t.p&&!t.o&&!t.q&&!t.d&&!r||(t.sb&&i.push({type_:"entitySkip"}),!t.o&&!t.q&&!t.d&&!t.b&&!t.p&&r!==2?(t.o=t.a,t.a=void 0):!t.o&&!t.q&&!t.d&&(t.b||t.p)?(t.o=t.a,t.d=t.b,t.q=t.p,t.a=t.b=t.p=void 0):t.o&&t.dType==="kv"&&L.patterns.match_("d-oxidation$",t.d||"")?t.dType="oxidation":t.o&&t.dType==="kv"&&!t.q&&(t.dType=void 0),i.push({type_:"chemfive",a:L.go(t.a,"a"),b:L.go(t.b,"bd"),p:L.go(t.p,"pq"),o:L.go(t.o,"o"),q:L.go(t.q,"pq"),d:L.go(t.d,t.dType==="oxidation"?"oxidation":"bd"),dType:t.dType}));else{var n;t.rdt==="M"?n=L.go(t.rd,"tex-math"):t.rdt==="T"?n=[{type_:"text",p1:t.rd||""}]:n=L.go(t.rd);var o;t.rqt==="M"?o=L.go(t.rq,"tex-math"):t.rqt==="T"?o=[{type_:"text",p1:t.rq||""}]:o=L.go(t.rq),i={type_:"arrow",r:t.r,rd:n,rq:o}}for(var a in t)a!=="parenthesisLevel"&&a!=="beginsWithBond"&&delete t[a];return i},"oxidation-output":function(t,e){var r=["{"];return L.concatArray(r,L.go(e,"oxidation")),r.push("}"),r},"frac-output":function(t,e){return{type_:"frac-ce",p1:L.go(e[0]),p2:L.go(e[1])}},"overset-output":function(t,e){return{type_:"overset",p1:L.go(e[0]),p2:L.go(e[1])}},"underset-output":function(t,e){return{type_:"underset",p1:L.go(e[0]),p2:L.go(e[1])}},"underbrace-output":function(t,e){return{type_:"underbrace",p1:L.go(e[0]),p2:L.go(e[1])}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:L.go(e[1])}},"r=":function(t,e){t.r=e},"rdt=":function(t,e){t.rdt=e},"rd=":function(t,e){t.rd=e},"rqt=":function(t,e){t.rqt=e},"rq=":function(t,e){t.rq=e},operator:function(t,e,r){return{type_:"operator",kind_:r||e}}}},a:{transitions:L.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:L.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:L.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(t){if(t.text_){var e={type_:"text",p1:t.text_};for(var r in t)delete t[r];return e}}}},pq:{transitions:L.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(t,e){return{type_:"state of aggregation subscript",p1:L.go(e,"o")}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:L.go(e[1],"pq")}}}},bd:{transitions:L.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(t,e){return{type_:"color",color1:e[0],color2:L.go(e[1],"bd")}}}},oxidation:{transitions:L.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(t,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:L.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var r in t)delete t[r];return e}}}},"tex-math tight":{transitions:L.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(t,e){t.o=(t.o||"")+"{"+e+"}"},output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var r in t)delete t[r];return e}}}},"9,9":{transitions:L.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:L.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(t,e){var r=[];return e[0]==="+-"||e[0]==="+/-"?r.push("\\pm "):e[0]&&r.push(e[0]),e[1]&&(L.concatArray(r,L.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?L.concatArray(r,L.go(e[2],"pu-9,9")):r.push(e[2])),(e[3]||e[4])&&(e[3]==="e"||e[4]==="*"?r.push({type_:"cdot"}):r.push({type_:"times"}))),e[5]&&r.push("10^{"+e[5]+"}"),r},"number^":function(t,e){var r=[];return e[0]==="+-"||e[0]==="+/-"?r.push("\\pm "):e[0]&&r.push(e[0]),L.concatArray(r,L.go(e[1],"pu-9,9")),r.push("^{"+e[2]+"}"),r},operator:function(t,e,r){return{type_:"operator",kind_:r||e}},space:function(){return{type_:"pu-space-1"}},output:function(t){var e,r=L.patterns.match_("{(...)}",t.d||"");r&&r.remainder===""&&(t.d=r.match_);var i=L.patterns.match_("{(...)}",t.q||"");if(i&&i.remainder===""&&(t.q=i.match_),t.d&&(t.d=t.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.d=t.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),t.q){t.q=t.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.q=t.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var n={d:L.go(t.d,"pu"),q:L.go(t.q,"pu")};t.o==="//"?e={type_:"pu-frac",p1:n.d,p2:n.q}:(e=n.d,n.d.length>1||n.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),L.concatArray(e,n.q))}else e=L.go(t.d,"pu-2");for(var o in t)delete t[o];return e}}},"pu-2":{transitions:L.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(t,e){t.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(t){var e=[];if(t.rm){var r=L.patterns.match_("{(...)}",t.rm||"");r&&r.remainder===""?e=L.go(r.match_,"pu"):e={type_:"rm",p1:t.rm}}for(var i in t)delete t[i];return e}}},"pu-9,9":{transitions:L.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){var r=t.text_.length%3;r===0&&(r=3);for(var i=t.text_.length-3;i>0;i-=3)e.push(t.text_.substr(i,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(0,r)),e.reverse()}else e.push(t.text_);for(var n in t)delete t[n];return e},"output-o":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){for(var r=t.text_.length-3,i=0;i"||t.r==="<=>>"||t.r==="<<=>"||t.r==="<-->"?(a="\\long"+a,o.rd&&(a="\\overset{"+o.rd+"}{"+a+"}"),o.rq&&(t.r==="<-->"?a="\\underset{\\lower2mu{"+o.rq+"}}{"+a+"}":a="\\underset{\\lower6mu{"+o.rq+"}}{"+a+"}"),a=" {}\\mathrel{"+a+"}{} "):(o.rq&&(a+="[{"+o.rq+"}]"),a+="{"+o.rd+"}",a=" {}\\mathrel{\\x"+a+"}{} "):a=" {}\\mathrel{\\long"+a+"}{} ",e=a;break;case"operator":e=me._getOperator(t.kind_);break;case"1st-level escape":e=t.p1+" ";break;case"space":e=" ";break;case"entitySkip":e="~";break;case"pu-space-1":e="~";break;case"pu-space-2":e="\\mkern3mu ";break;case"1000 separator":e="\\mkern2mu ";break;case"commaDecimal":e="{,}";break;case"comma enumeration L":e="{"+t.p1+"}\\mkern6mu ";break;case"comma enumeration M":e="{"+t.p1+"}\\mkern3mu ";break;case"comma enumeration S":e="{"+t.p1+"}\\mkern1mu ";break;case"hyphen":e="\\text{-}";break;case"addition compound":e="\\,{\\cdot}\\,";break;case"electron dot":e="\\mkern1mu \\bullet\\mkern1mu ";break;case"KV x":e="{\\times}";break;case"prime":e="\\prime ";break;case"cdot":e="\\cdot ";break;case"tight cdot":e="\\mkern1mu{\\cdot}\\mkern1mu ";break;case"times":e="\\times ";break;case"circa":e="{\\sim}";break;case"^":e="uparrow";break;case"v":e="downarrow";break;case"ellipsis":e="\\ldots ";break;case"/":e="/";break;case" / ":e="\\,/\\,";break;default:throw["MhchemBugT","mhchem bug T. Please report."]}return e},_getArrow:function(t){switch(t){case"->":return"rightarrow";case"\u2192":return"rightarrow";case"\u27F6":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<-->":return"leftrightarrows";case"<=>":return"rightleftharpoons";case"\u21CC":return"rightleftharpoons";case"<=>>":return"Rightleftharpoons";case"<<=>":return"Leftrightharpoons";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(t){switch(t){case"-":return"{-}";case"1":return"{-}";case"=":return"{=}";case"2":return"{=}";case"#":return"{\\equiv}";case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\rlap{\\lower.1em{-}}\\raise.1em{\\tripledash}}";case"~=":return"{\\rlap{\\lower.2em{-}}\\rlap{\\raise.2em{\\tripledash}}-}";case"~--":return"{\\rlap{\\lower.2em{-}}\\rlap{\\raise.2em{\\tripledash}}-}";case"-~-":return"{\\rlap{\\lower.2em{-}}\\rlap{\\raise.2em{-}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(t){switch(t){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":return" {}\\approx{} ";case"$\\approx$":return" {}\\approx{} ";case"v":return" \\downarrow{} ";case"(v)":return" \\downarrow{} ";case"^":return" \\uparrow{} ";case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}};var mn=class t extends x{constructor(e){super(g(h({},e),{type:"delim"})),this.value=e.delim,this.size=e.size}static fromJson(e){return new t(e)}toJson(){return g(h({},super.toJson()),{delim:this.value,size:this.size})}render(e){return new w(this.value,{type:"middle"})}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);return r!=null&&r.serialize?r.serialize(this,e):U(this.command,this.value)}},hn=class t extends x{constructor(e){super(g(h({},e),{type:"sizeddelim",value:e.delim})),this.delimType=e.delimType,this.size=e.size}static fromJson(e){return new t(e)}toJson(){return g(h({},super.toJson()),{delim:this.value,size:this.size,delimType:this.delimType})}render(e){let r=fh(this.value,this.size,e,{classes:{open:"ML__open",close:"ML__close"}[this.delimType],type:this.delimType,isSelected:this.isSelected});return r?(r=this.bind(e,r),this.caret&&(r.caret=this.caret),r):null}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);return r!=null&&r.serialize?r.serialize(this,e):U(this.command,this.value)}};function ro(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}var ur=class t extends x{constructor(e,r,i,n){var o,a,s,l,c,u;super({type:"enclose",command:e,style:n.style}),this.body=r,i.updiagonalarrow&&(i.updiagonalstrike=!1),i.box&&(i.left=!1,i.right=!1,i.bottom=!1,i.top=!1),this.notation=i,this.shadow=(o=n.shadow)!=null?o:"none",this.strokeWidth=(a=W0(n.strokeWidth))!=null?a:"0.06em",this.strokeStyle=/^(solid|dashed|dotted|double|none)$/.test((s=n.strokeStyle)!=null?s:"")?n.strokeStyle:"solid",this.svgStrokeStyle=n.svgStrokeStyle,this.strokeColor=(l=Yi(n.strokeColor))!=null?l:"currentColor",this.backgroundcolor=(c=Yi(n.backgroundcolor))!=null?c:"transparent",this.borderStyle=(u=Ga(n.borderStyle))!=null?u:`${this.strokeWidth} ${this.strokeStyle} ${this.strokeColor}`,this.padding=n.padding,this.captureSelection=!1}static fromJson(e){return new t(e.command,e.body,e.notation,e)}toJson(){return g(h({},super.toJson()),{notation:this.notation,shadow:this.shadow,strokeWidth:this.strokeWidth,strokeStyle:this.strokeStyle,svgStrokeStyle:this.svgStrokeStyle,strokeColor:this.strokeColor,borderStyle:this.borderStyle,padding:this.padding})}_serialize(e){var n;if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);if(r!=null&&r.serialize)return r.serialize(this,e);let i=(n=this.command)!=null?n:"";if(this.command==="\\enclose"){i+="{"+Object.keys(this.notation).join(" ")+"}";let o="",a="";this.backgroundcolor&&this.backgroundcolor!=="transparent"&&(o+=a+'mathbackground="'+this.backgroundcolor+'"',a=","),this.shadow&&this.shadow!=="auto"&&(o+=a+'shadow="'+this.shadow+'"',a=","),this.strokeWidth||this.strokeStyle!=="solid"?(o+=a+this.borderStyle,a=","):this.strokeColor&&this.strokeColor!=="currentColor"&&(o+=a+'mathcolor="'+this.strokeColor+'"',a=","),o&&(i+=`[${o}]`)}return U(i,this.bodyToLatex(e))}render(e){var p,f,y,v;let r=new P({parent:e},this.style),i=x.createBox(r,this.body);if(!i)return null;let n=_g(this.borderStyle),o=r.toEm(!this.padding||this.padding==="auto"?{register:"fboxsep"}:{string:this.padding});i.setStyle("position","relative"),i.setStyle("display","inline-block"),i.setStyle("height",i.height+i.depth,"em"),i.setStyle("width",i.width,"em");let a=new w(null,{classes:"ML__notation"}),s=i.height+i.depth+2*o,l=i.width+2*o,c="",u=Math.min(o*.2,.05);if(this.notation.horizontalstrike){let b=2*o+i.height-Xe/2;c+=this.line((o+u).toString(),b.toString(),(o+i.width-u).toString(),b.toString())}if(this.notation.verticalstrike){let b=o+i.width/2;c+=this.line(b.toString(),(o+u).toString(),b.toString(),(s-o-u).toString())}if(this.notation.updiagonalstrike&&(c+=this.line((o+u).toString(),(s-o-u).toString(),(o+i.width-u).toString(),(o+u).toString())),this.notation.downdiagonalstrike&&(c+=this.line((o+u).toString(),(o+u).toString(),(o+i.width-u).toString(),(s-o-u).toString())),this.notation.updiagonalarrow){c+=this.line(o.toString(),(2*o+i.depth+i.height).toString(),(o+i.width).toString(),o.toString());let S=.03*Math.sqrt(l*l+s*s)*1,A=i.width*S,E=(i.depth+i.height)*S,C=o+i.width,_=o;_+E-.4*A<0&&(_=.4*A-E),c+='`}};function ls(t){return typeof t=="number"?`${Math.floor(100*t)/100}%`:t}function _g(t){if(!t)return"1px";let e=t.match(/([0-9][a-zA-Z\%]+)/);return e===null?"1px":e[1]}function Mg(t){return(Math.floor(100*t.metrics.sqrtRuleThickness/t.scalingFactor)/100/10).toString()+"em"}function Mh(t){let e=t.isDisplayStyle?Xe:t.metrics.defaultRuleThickness;return t.metrics.defaultRuleThickness+t.scalingFactor*e/4}var pn={fractionNavigationOrder:"numerator-denominator"};var st=class t extends x{constructor(e,r,i){var n,o,a;super(g(h({},i),{type:"genfrac",displayContainsHighlight:!0})),this.above=e,this.below=r,this.hasBarLine=(n=i==null?void 0:i.hasBarLine)!=null?n:!0,this.continuousFraction=(o=i==null?void 0:i.continuousFraction)!=null?o:!1,this.align=(a=i==null?void 0:i.align)!=null?a:"center",this.numerPrefix=i==null?void 0:i.numerPrefix,this.denomPrefix=i==null?void 0:i.denomPrefix,this.mathstyleName=i==null?void 0:i.mathstyleName,this.leftDelim=i==null?void 0:i.leftDelim,this.rightDelim=i==null?void 0:i.rightDelim,this.barThickness=i==null?void 0:i.barThickness}static fromJson(e){return new t(e.above,e.below,e)}toJson(){let e={};return this.continuousFraction&&(e.continuousFraction=!0),this.align!=="center"&&(e.align=this.align),this.numerPrefix&&(e.numerPrefix=this.numerPrefix),this.denomPrefix&&(e.denomPrefix=this.denomPrefix),this.leftDelim&&(e.leftDelim=this.leftDelim),this.rightDelim&&(e.rightDelim=this.rightDelim),this.hasBarLine||(e.hasBarLine=!1),this.barThickness&&(e.barThickness=this.barThickness),this.mathstyleName&&(e.mathstyleName=this.mathstyleName),h(h({},super.toJson()),e)}get children(){if(this._children)return this._children;let e=[];if(pn.fractionNavigationOrder==="denominator-numerator"){for(let r of this.below)e.push(...r.children),e.push(r);for(let r of this.above)e.push(...r.children),e.push(r)}else{for(let r of this.above)e.push(...r.children),e.push(r);for(let r of this.below)e.push(...r.children),e.push(r)}return this._children=e,e}render(e){var E,C;let r=new P({parent:e,mathstyle:this.mathstyleName},this.style),i=r.metrics,n=new P({parent:r,mathstyle:this.continuousFraction?"":"numerator"},this.style),o=this.numerPrefix?new w([new w(this.numerPrefix),x.createBox(n,this.above)],{isTight:n.isTight,type:"ignore"}):(E=x.createBox(n,this.above,{type:"ignore"}))!=null?E:new w(null,{type:"ignore"}),a=new P({parent:r,mathstyle:this.continuousFraction?"":"denominator"},this.style),s=this.denomPrefix?new w([new w(this.denomPrefix),x.createBox(a,this.below,{type:"ignore"})]):(C=x.createBox(a,this.below,{type:"ignore"}))!=null?C:new w(null,{type:"ignore"}),l=0;this.hasBarLine&&(l=this.barThickness?r.toEm(this.barThickness):i.defaultRuleThickness);let c,u=0,d;r.isDisplayStyle?(c=n.metrics.num1,u=l>0?3*l:7*l,d=a.metrics.denom1):(l>0?(c=n.metrics.num2,u=l):(c=n.metrics.num3,u=3*i.defaultRuleThickness),d=a.metrics.denom2);let m=[];this.isSelected&&m.push("ML__selected");let p=o.depth,f=s.height,y;if(l<=0){let _=c-p-(f-d);_new he(r)),this.skipBoundary=!0}static fromJson(e){return new t}toJson(){return super.toJson()}render(e){let r=x.createBox(e,this.body);return r?(this.caret&&(r.caret=this.caret),this.bind(e,r)):null}_serialize(e){var r,i;return(i=(r=this.body)==null?void 0:r.map(n=>n.value).join(""))!=null?i:""}};var fi=class t extends x{constructor(e,r){super(g(h({},r),{type:"extensible-symbol",isFunction:r==null?void 0:r.isFunction})),this.value=e,this.variant=r==null?void 0:r.variant,this.subsupPlacement=r==null?void 0:r.limits}static fromJson(e){return new t(e.symbol,e)}toJson(){let e=super.toJson();return this.variant&&(e.variant=this.variant),this.subsupPlacement&&(e.limits=this.subsupPlacement),this.value&&(e.symbol=this.value),e}render(e){var s;let r=e.isDisplayStyle&&this.value!=="\\smallint",i=new w(this.value,{fontFamily:r?"Size2-Regular":"Size1-Regular",classes:"ML__op-symbol "+(r?"ML__large-op":"ML__small-op"),type:"op",maxFontSize:e.scalingFactor,isSelected:this.isSelected});if(!i)return null;i.right=i.italic;let n=(i.height-i.depth)/2-Ie*e.scalingFactor,o=i.italic;i.setTop(n);let a=i;if(this.superscript||this.subscript){let l=(s=this.subsupPlacement)!=null?s:"auto";l==="auto"&&e.isDisplayStyle&&(l="over-under"),a=l==="over-under"?this.attachLimits(e,{base:i,baseShift:n,slant:o}):this.attachSupsub(e,{base:i})}return new w(this.bind(e,a),{type:"op",caret:this.caret,isSelected:this.isSelected,classes:"ML__op-group"}).wrap(e)}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);if(r!=null&&r.serialize)return r.serialize(this,e);let i=[];return i.push(this.command),this.explicitSubsupPlacement&&(this.subsupPlacement==="over-under"&&i.push("\\limits"),this.subsupPlacement==="adjacent"&&i.push("\\nolimits"),this.subsupPlacement==="auto"&&i.push("\\displaylimits")),i.push(this.supsubToLatex(e)),R(i)}};var yt=class t extends x{constructor(e){let r=e.body;super(g(h({},e),{type:"overlap",body:typeof r=="string"?[new x({value:r})]:r,style:e==null?void 0:e.style})),this.skipBoundary=!0,this.align=e==null?void 0:e.align,this.boxType=e==null?void 0:e.boxType}static fromJson(e){return new t(e)}toJson(){let e={};return this.align&&(e.align=this.align),this.boxType&&(e.boxType=this.boxType),h(h({},super.toJson()),e)}render(e){let r=x.createBox(e,this.body,{classes:"ML__inner"});return r?(this.caret&&(r.caret=this.caret),this.bind(e,new w([r,new w(null,{classes:"ML__fix"})],{classes:this.align==="right"?"ML__rlap":"ML__llap",type:this.boxType}))):null}};var Ae=class t extends x{constructor(e){var r,i,n,o;super({type:"overunder",command:e.command,style:e.style,mode:e.mode,body:e.body,skipBoundary:(r=e.skipBoundary)!=null?r:!0}),this.subsupPlacement=e.supsubPlacement,this.svgAbove=e.svgAbove,this.svgBelow=e.svgBelow,this.svgBody=e.svgBody,this.above=e.above,this.below=e.below,this.boxType=(i=e.boxType)!=null?i:"ord",this.paddedBody=(n=e.paddedBody)!=null?n:!1,this.paddedLabels=(o=e.paddedLabels)!=null?o:!1}static fromJson(e){return new t(e)}toJson(){let e=super.toJson();return this.skipBoundary||(e.skipBoundary=!1),this.subsupPlacement&&(e.subsupPlacement=this.subsupPlacement),this.svgAbove&&(e.svgAbove=this.svgAbove),this.svgBelow&&(e.svgBelow=this.svgBelow),this.svgBody&&(e.svgBody=this.svgBody),this.boxType!=="ord"&&(e.boxType=this.boxType),this.paddedBody&&(e.paddedBody=!0),this.paddedLabels&&(e.paddedLabels=!0),e}render(e){let r=this.svgBody?Zi(this.svgBody):x.createBox(e,this.body,{type:"ignore"}),i=new P({parent:e,mathstyle:"scriptstyle"},this.style),n=null;this.svgAbove?n=Zi(this.svgAbove):this.above&&(n=x.createBox(i,this.above,{type:"ignore"}));let o=null;this.svgBelow?o=Zi(this.svgBelow):this.below&&(o=x.createBox(i,this.below,{type:"ignore"})),this.paddedBody&&(r=new w([lr(e,"ML__open"),r,lr(e,"ML__close")],{type:"ignore"}));let a=wg(e,{base:r,above:n,below:o,type:this.boxType==="bin"||this.boxType==="rel"?this.boxType:"ord",paddedAboveBelow:this.paddedLabels});return a?(this.subsupPlacement==="over-under"?a=this.attachLimits(e,{base:a,type:a.type}):a=this.attachSupsub(e,{base:a}),this.caret&&(a.caret=this.caret),this.bind(e,a)):null}};function wg(t,e){if(!e.base)return null;if(!e.above&&!e.below){let s=new w(e.base,{type:e.type});return s.setStyle("position","relative"),s}let r=0;e.above&&(r=t.metrics.bigOpSpacing5);let i=null,n=e.base,o=0,a=["ML__center"];if(e.paddedAboveBelow&&a.push("ML__label_padding"),e.below&&e.above){let s=t.metrics.bigOpSpacing5+e.below.height+e.below.depth+n.depth+o;i=new te({bottom:s,children:[t.metrics.bigOpSpacing5,{box:e.below,classes:a},{box:n,classes:["ML__center"]},r,{box:e.above,classes:a},t.metrics.bigOpSpacing5]})}else e.below?i=new te({top:n.height-o,children:[t.metrics.bigOpSpacing5,{box:e.below,classes:a},{box:n,classes:["ML__center"]}]}):e.above&&(i=new te({bottom:n.depth+o,children:[{box:n,classes:["ML__center"]},r,{box:e.above,classes:a},t.metrics.bigOpSpacing5]}));return new w(i,{type:e.type})}var Vt=class t extends x{constructor(e){var r,i,n,o;super(g(h({},e),{type:"phantom"})),this.captureSelection=!0,this.isInvisible=(r=e.isInvisible)!=null?r:!1,this.smashDepth=(i=e.smashDepth)!=null?i:!1,this.smashHeight=(n=e.smashHeight)!=null?n:!1,this.smashWidth=(o=e.smashWidth)!=null?o:!1}static fromJson(e){return new t(e)}toJson(){let e={};return this.isInvisible&&(e.isInvisible=!0),this.smashDepth&&(e.smashDepth=!0),this.smashHeight&&(e.smashHeight=!0),this.smashWidth&&(e.smashWidth=!0),h(h({},super.toJson()),e)}render(e){let r=new P({parent:e,isPhantom:!0});if(!this.smashDepth&&!this.smashHeight&&!this.smashWidth)return this.isInvisible,x.createBox(r,this.body,{classes:"ML__inner"});let i=x.createBox(this.isInvisible?r:e,this.body);if(!i)return null;if(this.smashWidth){let n=new w(null,{classes:"ML__fix"});return new w([i,n],{classes:"ML__rlap"}).wrap(e)}if(!this.smashHeight&&!this.smashDepth)return i;if(this.smashHeight&&(i.height=0),this.smashDepth&&(i.depth=0),i.children)for(let n of i.children)this.smashHeight&&(n.height=0),this.smashDepth&&(n.depth=0);return new te({firstBaseline:[{box:i}]},{type:i.type}).wrap(e)}};var qt=class t extends x{constructor(e){var r;super(h({type:"spacing"},e)),this.width=e==null?void 0:e.width,this._braced=(r=e==null?void 0:e.braced)!=null?r:!1}static fromJson(e){return new t(e)}toJson(){let e=super.toJson();return this.width!==void 0&&(e.width=this.width),this._braced&&(e.braced=!0),e}render(e){var i;if(this.command==="space")return new w(this.mode==="math"?null:" ");let r;if(this.width!==void 0)r=new w(null,{classes:"ML__mspace"}),r.left=e.toEm(this.width);else{let n=(i={"\\qquad":"ML__qquad","\\quad":"ML__quad","\\enspace":"ML__enspace","\\;":"ML__thickspace","\\:":"ML__mediumspace","\\>":"ML__mediumspace","\\,":"ML__thinspace","\\!":"ML__negativethinspace"}[this.command])!=null?i:"ML__mediumspace";r=new w(null,{classes:n})}return r=this.bind(e,r),this.caret&&(r.caret=this.caret),r}_serialize(e){var n;if(!e.expandMacro&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);if(r!=null&&r.serialize)return r.serialize(this,e);let i=(n=this.command)!=null?n:"";return this.width===void 0?i:this._braced&&!("register"in this.width)?`${i}{${ge(this.width)}}`:`${i}${ge(this.width)}`}};var fn=class t extends x{constructor(e){var r;super(g(h({},e),{type:"surd",mode:(r=e.mode)!=null?r:"math",style:e.style,displayContainsHighlight:!0,body:e.body})),this.above=e.index}static fromJson(e){return new t(g(h({},e),{index:e.above}))}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);if(r!=null&&r.serialize)return r.serialize(this,e);let i=this.command,n=this.bodyToLatex(e);return this.above&&!this.hasEmptyBranch("above")?U(`${i}[${this.aboveToLatex(e)}]`,n):/^[0-9]$/.test(n)?`${i}${n}`:U(i,n)}get children(){if(this._children)return this._children;let e=[];if(this.above)for(let r of this.above)e.push(...r.children),e.push(r);if(this.body)for(let r of this.body)e.push(...r.children),e.push(r);return this._children=e,e}render(e){var k;let r=new P({parent:e,mathstyle:"cramp"},this.style),i=(k=x.createBox(r,this.body,{type:"inner"}))!=null?k:new w(null),n=r.scalingFactor,o=r.metrics.defaultRuleThickness/n,a=e.isDisplayStyle?Xe:o,s=new w(null,{classes:"ML__sqrt-line",style:this.style});s.height=o,s.softWidth=i.width;let l=n*(o+a/4),u=Math.max(n*2*a,i.height+i.depth)+l+o,d=new P({parent:e},this.style),m=this.bind(d,new w(an("inner","\\surd",u,!1,d,{isSelected:this.isSelected}),{isSelected:this.isSelected,classes:"ML__sqrt-sign",style:this.style}));if(!m)return null;let p=m.height+m.depth-o;p>i.height+i.depth+l&&(l=(l+p-(i.height+i.depth))/2),m.setTop(m.height-i.height-l);let f=this.bind(e,new te({firstBaseline:[{box:new w(i)},l-2*o,{box:s},o]})),y=x.createBox(new P({parent:e,mathstyle:"scriptscriptstyle"}),this.above,{type:"ignore"});if(!y){let S=new w([m,f],{classes:this.containsCaret?"ML__contains-caret":"",type:"inner"});return S.setStyle("display","inline-block"),S.setStyle("height",S.height+S.depth,"em"),this.caret&&(S.caret=this.caret),this.bind(e,S)}let v=new te({shift:-.6*(Math.max(m.height,f.height)-Math.max(m.depth,f.depth)),children:[{box:y}]}),b=new w([new w(v,{classes:"ML__sqrt-index",type:"ignore"}),m,f],{type:"inner",classes:this.containsCaret?"ML__contains-caret":""});return b.height=m.height,b.depth=m.depth,this.caret&&(b.caret=this.caret),this.bind(e,b)}};var gc=class extends w{constructor(e){super(null,{type:"skip"}),this._width=e}toMarkup(){return``}};function io(t,e){if(!t.parent)return;let r=t.parent.children,i=r.indexOf(t),n=i-1;for(;n>=0&&r[n].type==="ignore";)n-=1;if(n<0&&t.parent.parent&&t.parent.type==="lift"){io(t.parent,e);return}i>0&&r[i-1].type==="skip"?r[i-1].width+=e:r.splice(i,0,new gc(e))}var Sg={ord:{op:3,bin:4,rel:5,inner:3},op:{ord:3,op:3,rel:5,inner:3},bin:{ord:4,op:4,open:4,inner:4},rel:{ord:5,op:5,open:5,inner:5},close:{op:3,bin:4,rel:5,inner:3},punct:{ord:3,op:3,rel:3,open:3,punct:3,inner:3},inner:{ord:3,op:3,bin:4,rel:5,open:3,punct:3,inner:3}},kg={ord:{op:3},op:{ord:3,op:3},close:{op:3},inner:{op:3}};function Lg(t){no(t,(e,r)=>{r.type==="bin"&&(!e||/^(middle|bin|op|rel|open|punct)$/.test(e.type))&&(r.type="ord"),(e==null?void 0:e.type)==="bin"&&/^(rel|close|punct)$/.test(r.type)&&(e.type="ord"),r.type!=="ignore"&&(e=r)})}function Ht(t,e){if(!t.children)return t;let r=t.children;Lg(r);let i=e.getRegisterAsEm("thinmuskip"),n=e.getRegisterAsEm("medmuskip"),o=e.getRegisterAsEm("thickmuskip");return no(r,(a,s)=>{var d,m,p;if(!a)return;let l=a.type,c=s.isTight?(d=kg[l])!=null?d:null:(m=Sg[l])!=null?m:null,u=(p=c==null?void 0:c[s.type])!=null?p:null;u===3&&io(s,i),u===4&&io(s,n),u===5&&io(s,o)}),t}function no(t,e,r=void 0){if(!t)return r;t=[...t];for(let i of t)i.type==="lift"?r=no(i.children,e,r):i.type==="ignore"?no(i.children,e):(e(r,i),no(i.children,e),r=i);return r}var gi=class t extends x{constructor(e){super({type:"tooltip",command:e.command,mode:e.mode,style:e.style,body:e.body,displayContainsHighlight:!0}),this.tooltip=new x({type:"root",mode:e.content,body:e.tooltip,style:{}}),this.skipBoundary=!0,this.captureSelection=!1}static fromJson(e){return new t(g(h({},e),{tooltip:xt(e.tooltip)}))}toJson(){var r;let e=(r=this.tooltip.body)==null?void 0:r.filter(i=>i.type!=="first").map(i=>i.toJson());return g(h({},super.toJson()),{tooltip:e})}render(e){let r=x.createBox(e,this.body);if(!r)return null;let i=new P({parent:e,mathstyle:"displaystyle"},{fontSize:ji}),n=Or(Ht(new w(this.tooltip.render(i),{classes:"ML__tooltip-content"}),i)),o=new w([n,r],{classes:"ML__tooltip-container"});return this.caret&&(o.caret=this.caret),this.bind(e,o)}};var vt=class t extends x{constructor(e,r){super(g(h({},r),{type:"operator",isFunction:r==null?void 0:r.isFunction})),this.value=e,this.variant=r==null?void 0:r.variant,this.variantStyle=r==null?void 0:r.variantStyle,this.subsupPlacement=r==null?void 0:r.limits}static fromJson(e){return new t(e.symbol,e)}toJson(){let e=super.toJson();return this.variant&&(e.variant=this.variant),this.variantStyle&&(e.variantStyle=this.variantStyle),this.subsupPlacement&&(e.limits=this.subsupPlacement),this.value&&(e.symbol=this.value),e}render(e){var n;let r=new w(this.value,{type:"op",mode:"math",maxFontSize:e.scalingFactor,style:{variant:this.variant,variantStyle:this.variantStyle},isSelected:this.isSelected,letterShapeStyle:e.letterShapeStyle}),i=r;if(this.superscript||this.subscript){let o=(n=this.subsupPlacement)!=null?n:"auto";i=o==="over-under"||o==="auto"&&e.isDisplayStyle?this.attachLimits(e,{base:r}):this.attachSupsub(e,{base:r})}return new w(this.bind(e,i),{type:"op",caret:this.caret,isSelected:this.isSelected,classes:"ML__op-group"}).wrap(e)}_serialize(e){if(!(e.expandMacro||e.skipStyles||e.skipPlaceholders)&&typeof this.verbatimLatex=="string")return this.verbatimLatex;let r=ne(this.command,this.mode);if(r!=null&&r.serialize)return r.serialize(this,e);let i=[this.command];return this.explicitSubsupPlacement&&(this.subsupPlacement==="over-under"&&i.push("\\limits"),this.subsupPlacement==="adjacent"&&i.push("\\nolimits"),this.subsupPlacement==="auto"&&i.push("\\displaylimits")),i.push(this.supsubToLatex(e)),R(i)}};function xt(t){if(ee(t))return t.map(i=>xt(i));if(typeof t=="string")return x.fromJson(t);t=h({},t);for(let i of Ir)t[i]&&(t[i]=xt(t[i]));t.args&&(t.args=Ag(t.args)),t.array&&(t.array=xt(t.array));let e=t.type,r;e==="accent"&&(r=Nr.fromJson(t)),e==="array"&&(r=z.fromJson(t)),e==="box"&&(r=at.fromJson(t)),e==="chem"&&(r=to.fromJson(t)),e==="composition"&&(r=sn.fromJson(t)),e==="delim"&&(r=mn.fromJson(t)),e==="enclose"&&(r=ur.fromJson(t)),e==="error"&&(r=bt.fromJson(t)),e==="extensible-symbol"&&(r=fi.fromJson(t)),e==="genfrac"&&(r=st.fromJson(t)),e==="group"&&(r=ln.fromJson(t)),e==="latex"&&(r=he.fromJson(t)),e==="latexgroup"&&(r=$t.fromJson(t)),e==="leftright"&&(r=J.fromJson(t)),e==="macro"&&(r=cn.fromJson(t)),e==="macro-argument"&&(r=os.fromJson(t)),e==="operator"&&(r=vt.fromJson(t)),e==="overlap"&&(r=yt.fromJson(t)),e==="overunder"&&(r=Ae.fromJson(t)),e==="placeholder"&&(r=Me.fromJson(t)),e==="prompt"&&(r=un.fromJson(t)),e==="phantom"&&(r=Vt.fromJson(t)),e==="sizeddelim"&&(r=hn.fromJson(t)),e==="spacing"&&(r=qt.fromJson(t)),e==="subsup"&&(r=cr.fromJson(t)),e==="surd"&&(r=fn.fromJson(t)),e==="text"&&(r=We.fromJson(t)),e==="tooltip"&&(r=gi.fromJson(t)),r||(!e||["first","mbin","mrel","mclose","minner","mop","mopen","mord","mpunct","root","space"].includes(e),`${e}`,r=x.fromJson(t));for(let i of Ir)t[i]&&r.setChildren(t[i],i);return t.verbatimLatex!==void 0&&(r.verbatimLatex=t.verbatimLatex),t.subsupPlacement&&(r.subsupPlacement=t.subsupPlacement),t.explicitSubsupPlacement&&(r.explicitSubsupPlacement=!0),t.isFunction&&(r.isFunction=!0),t.skipBoundary&&(r.skipBoundary=!0),t.captureSelection&&(r.captureSelection=!0),r}function Ag(t){if(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(e=>e===""?null:typeof e=="object"&&"group"in e?{group:e.group.map(r=>xt(r))}:typeof e=="object"&&"atoms"in e?e.atoms.map(r=>xt(r)):e)}}function oo(t,e){!t||!e||(ee(t)?t.forEach(r=>oo(r,e)):typeof t=="object"&&t.applyStyle(e,{unstyledOnly:!0}))}function ao(t,e,r,i){function n(a,s){for(let l of o)if(l.style[a]!==s)return!1;return!0}if(e=t.normalizeRange(e),e[0]===e[1])return!1;let o=t.getAtoms(e,{includeChildren:!0});i.operation==="toggle"&&(r.color&&n("color",r.color)&&(r.color="none",delete r.verbatimColor),r.backgroundColor&&n("backgroundColor",r.backgroundColor)&&(r.backgroundColor="none",delete r.verbatimBackgroundColor),r.fontFamily&&n("fontFamily",r.fontFamily)&&(r.fontFamily="none"),r.fontSeries&&n("fontSeries",r.fontSeries)&&(r.fontSeries="auto"),r.fontShape&&n("fontShape",r.fontShape)&&(r.fontShape="auto"),r.fontSize&&n("fontSize",r.fontSize)&&(r.fontSize=ji),r.variant&&n("variant",r.variant)&&(r.variant="normal"),r.variantStyle&&n("variantStyle",r.variantStyle)&&(r.variantStyle=""));for(let a of o)a.applyStyle(r);return!0}function wh(t){return{up:"italic",bold:"bolditalic",italic:"italic",bolditalic:"bolditalic","":"italic"}[t!=null?t:""]}function so(t){return{up:"up",bold:"bold",italic:void 0,bolditalic:"bold","":void 0}[t!=null?t:""]}var Sh={acute:714,grave:715,dot:729,ddot:168,dddot:8411,ddddot:8412,mathring:730,tilde:126,bar:713,breve:728,check:711,hat:94,vec:8407};M(Object.keys(Sh),"{body:auto}",{createAtom:t=>new Nr(g(h({},t),{body:T(t.args[0]),accentChar:Sh[t.command.slice(1)]}))});M(["widehat","widecheck","widetilde"],"{body:auto}",{createAtom:t=>{let e=bl(T(t.args[0]));return new Nr(g(h({},t),{body:T(t.args[0]),svgAccent:t.command.slice(1)+(e.length>5?"4":["1","1","2","2","3","3"][e.length])}))}});M(["overarc","overparen","wideparen"],"{body:auto}",{createAtom:t=>new Nr(g(h({},t),{body:T(t.args[0]),svgAccent:"overarc"}))});M(["underarc","underparen"],"{body:auto}",{createAtom:t=>new Ae(g(h({},t),{body:T(t.args[0]),svgBelow:"underarc"}))});M("utilde","{body:auto}",{createAtom:t=>{let e=T(t.args[0]),r=bl(e),i="widetilde"+(r.length>5?"4":["1","1","2","2","3","3"][r.length]);return new Ae(g(h({},t),{body:e,svgBelow:i,boxType:ci(e)}))}});M("^","{:string}",{createAtom:t=>{var e;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:t.args[0]&&(e={a:"\xE2",e:"\xEA",i:"\xEE",o:"\xF4",u:"\xFB",A:"\xC2",E:"\xCA",I:"\xCE",O:"\xD4",U:"\xDB"}[t.args[0]])!=null?e:"^"}))}});M("`","{:string}",{createAtom:t=>{var e;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:t.args[0]&&(e={a:"\xE0",e:"\xE8",i:"\xEC",o:"\xF2",u:"\xF9",A:"\xC0",E:"\xC8",I:"\xCC",O:"\xD2",U:"\xD9"}[t.args[0]])!=null?e:"`"}))}});M("'","{:string}",{createAtom:t=>{var e;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:t.args[0]&&(e={a:"\xE1",e:"\xE9",i:"\xED",o:"\xF3",u:"\xFA",A:"\xC1",E:"\xC9",I:"\xCD",O:"\xD3",U:"\xDA"}[t.args[0]])!=null?e:"'"}))}});M('"',"{:string}",{createAtom:t=>{var e,r;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:(e=t.args)!=null&&e[0]?(r={a:"\xE4",e:"\xEB",i:"\xEF",o:"\xF6",u:"\xFC",A:"\xC4",E:"\xCB",I:"\xCB",O:"\xD6",U:"\xDC"}[t.args[0]])!=null?r:'"'+t.args[0]:'"'}))}});M(".","{:string}",{createAtom:t=>{var e,r;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:(e=t.args)!=null&&e[0]?(r={a:"\u0227",e:"\u0117",i:"\u0307i",o:"\u022F",u:"\u0307u",A:"\u0226",E:"\u0116",I:"\u0130",O:"\u022E",U:"\u0307U"}[t.args[0]])!=null?r:"."+t.args[0]:"."}))}});M("=","{:string}",{createAtom:t=>{var e,r;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:(e=t.args)!=null&&e[0]?(r={a:"\u0101",e:"\u0113",i:"\u012B",o:"\u014D",u:"\u016B",A:"\u0100",E:"\u0112",I:"\u012A",O:"\u014C",U:"\u016A"}[t.args[0]])!=null?r:"="+t.args[0]:"="}))}});M("~","{:string}",{createAtom:t=>{var e;return new x(g(h({type:"mord"},t),{isFunction:!1,limits:"adjacent",value:t.args[0]&&(e={n:"\xF1",N:"\xD1",a:"\xE3",o:"\xF5",A:"\xC3",O:"\xD5"}[t.args[0]])!=null?e:"\xB4"}))}});M("c","{:string}",{createAtom:t=>{var e;return new x(g(h({},t),{type:"mord",isFunction:!1,limits:"adjacent",value:t.args[0]&&(e={c:"\xE7",C:"\xC7"}[t.args[0]])!=null?e:""}))}});var Cg=new Set(["downdiagonalstrike","updiagonalstrike","verticalstrike","horizontalstrike","updiagonalarrow","right","bottom","left","top","circle","roundedbox","madruwb","actuarial","box","phasorangle","longdiv"]);function Eg(t,e){let r=[],i=0,n=!1,o="";for(let a of t)a==='"'?n=!n:!n&&a==="("?i+=1:!n&&a===")"&&(i=Math.max(0,i-1)),a===e&&i===0&&!n?(o.length>0&&r.push(o),o=""):o+=a;return o.length>0&&r.push(o),r}M("enclose","{notation:string}[style:string]{body:auto}",{createAtom:t=>{var n,o;let e=t.args,r={strokeColor:"currentColor",strokeWidth:"",strokeStyle:"solid",backgroundcolor:"transparent",padding:"auto",shadow:"none",svgStrokeStyle:void 0,borderStyle:void 0,style:(n=t.style)!=null?n:{}};if(e[1]){let a=Eg(e[1],",");for(let s of a){let l=s.match(/^\s*([a-z]*)\s*=\s*"(.*)"\s*$/);if(l)l[1]==="mathbackground"?r.backgroundcolor=l[2]:l[1]==="mathcolor"?r.strokeColor=l[2]:l[1]==="padding"?r.padding=l[2]:l[1]==="shadow"&&(r.shadow=l[2]);else{let c=s.match(/\s*(\S+)\s+(\S+)\s+(.*)/);c&&(r.strokeWidth=c[1],r.strokeStyle=c[2],r.strokeColor=c[3])}}r.strokeStyle==="dashed"?r.svgStrokeStyle="5,5":r.strokeStyle==="dotted"&&(r.svgStrokeStyle="1,5")}r.borderStyle=`${r.strokeWidth} ${r.strokeStyle} ${r.strokeColor}`;let i={};return((o=e[0])!=null?o:"").split(/[, ]/).filter(a=>a.length>0).forEach(a=>{let s=a.toLowerCase();Cg.has(s)&&(i[s]=!0)}),new ur(t.command,T(e[2]),i,r)}});M("cancel","{body:auto}",{createAtom:t=>{var e;return new ur(t.command,T(t.args[0]),{updiagonalstrike:!0},{strokeColor:"currentColor",strokeWidth:"",strokeStyle:"solid",borderStyle:"1px solid currentColor",backgroundcolor:"transparent",padding:"auto",shadow:"none",style:(e=t.style)!=null?e:{}})}});M("bcancel","{body:auto}",{createAtom:t=>{var e;return new ur(t.command,T(t.args[0]),{downdiagonalstrike:!0},{strokeColor:"currentColor",strokeWidth:"",strokeStyle:"solid",borderStyle:"1px solid currentColor",backgroundcolor:"transparent",padding:"auto",shadow:"none",style:(e=t.style)!=null?e:{}})}});M("xcancel","{body:auto}",{createAtom:t=>{var e;return new ur(t.command,T(t.args[0]),{updiagonalstrike:!0,downdiagonalstrike:!0},{strokeColor:"currentColor",strokeWidth:"",strokeStyle:"solid",borderStyle:"1px solid currentColor",backgroundcolor:"transparent",padding:"auto",shadow:"none",style:(e=t.style)!=null?e:{}})}});Qo(["math","displaymath"],ze);Qo("center",ze);Tt(["multline","multline*"],"",ze);M("displaylines","",{parse:t=>{if(t.skipWhitespace(),!t.match("<{>"))return[];let e=[],r=[];t.mathlist.length>0&&e.push([t.mathlist]),t.beginContext({tabular:!0,root:!0});do{if(t.end()||t.match("<}>"))break;t.matchColumnSeparator()||t.matchRowSeparator()?(e.push([r]),r=[]):r.push(...t.scan(n=>["<}>","&","\\cr","\\\\","\\tabularnewline"].includes(n)))}while(!0);t.endContext(),e.push([r]);let i=t.scan();return i.length>0&&e.push([i]),e},createAtom:t=>new z("lines",t.args,[],{leftDelim:".",rightDelim:".",columns:[{align:"l"}],classes:["ML__multiline_environment"],isRoot:!0,minColumns:1,maxColumns:1,minRows:1})});Tt("split","",ze);Tt(["gather","gather*","gathered"],"",ze);Tt(["equation","equation*","subequations"],"",ze);Qo(["align","align*","eqnarray"],ze,{tabular:!0});Tt(["aligned"],"",ze);Tt("array","{columns:colspec}",(t,e,r,i)=>new z(t,e,r,{columns:i[0],mathstyleName:"textstyle"}));Tt(["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],"[columns:colspec]",ze);Tt(["smallmatrix","smallmatrix*"],"[columns:colspec]",ze);Tt(["cases","dcases","rcases"],"",ze);function ze(t,e=[[[]]],r=[],i=[],n){switch(t){case"math":return new z(t,e,r,{mathstyleName:"textstyle",isRoot:!0,minColumns:1,maxColumns:1,minRows:1,maxRows:1});case"displaymath":return new z(t,e,r,{mathstyleName:"textstyle",isRoot:!0,minColumns:1,maxColumns:1,minRows:1,maxRows:1});case"center":return new z(t,e,r,{columns:[{align:"c"}],classes:["ML__center_environment"],isRoot:!0,minColumns:1,maxColumns:1,minRows:1,maxRows:1});case"multline":case"multline*":return new z(t,e,r,{columns:[{align:"m"}],leftDelim:".",rightDelim:".",isRoot:!0,minColumns:1,maxColumns:1,minRows:1});case"split":return new z(t,e,r,{columns:[{align:"r"},{align:"l"}],minColumns:2,minRows:1,isRoot:!1});case"gather":case"gather*":return new z(t,e,r,{columns:[{gap:.25},{align:"c"},{gap:0}],minColumns:1,maxColumns:1,minRows:1,isRoot:!0,classes:["ML__gather_environment"]});case"gathered":return new z(t,e,r,{columns:[{gap:.25},{align:"c"},{gap:0}],minColumns:1,maxColumns:1,minRows:1});case"equation":case"equation*":case"subequations":return new z(t,e,r,{columns:[{align:"c"}],isRoot:!0,minColumns:1,maxColumns:1,minRows:1});case"aligned":{let o=0;for(let l of e)o=Math.max(o,l.length);let a=[{gap:0},{align:"r"},{gap:.25},{align:"l"}],s=2;for(;s0&&e.push({gap:1}),e.push({align:"l"});return e}M(["overrightarrow","overleftarrow","Overrightarrow","overleftharpoon","overrightharpoon","overleftrightarrow","overlinesegment","overgroup"],"{:auto}",{createAtom:t=>{var e;return new Ae(g(h({},t),{body:T((e=t.args)==null?void 0:e[0]),skipBoundary:!1,supsubPlacement:"over-under",paddedBody:!0,boxType:"rel",svgAbove:t.command.slice(1)}))}});M("overbrace","{:auto}",{createAtom:t=>new Ae(g(h({},t),{body:T(t.args[0]),skipBoundary:!1,supsubPlacement:"over-under",paddedBody:!0,boxType:"ord",svgAbove:t.command.slice(1)}))});M(["underrightarrow","underleftarrow","underleftrightarrow","underlinesegment","undergroup"],"{:auto}",{createAtom:t=>new Ae(g(h({},t),{body:T(t.args[0]),skipBoundary:!1,supsubPlacement:"over-under",paddedBody:!0,boxType:"rel",svgBelow:t.command.slice(1)}))});M(["underbrace"],"{:auto}",{createAtom:t=>new Ae(g(h({},t),{body:T(t.args[0]),skipBoundary:!1,supsubPlacement:"over-under",paddedBody:!0,boxType:"ord",svgBelow:t.command.slice(1)}))});M(["xrightarrow","longrightarrow","xleftarrow","longleftarrow","xRightarrow","xLeftarrow","xleftharpoonup","xleftharpoondown","xrightharpoonup","xrightharpoondown","xlongequal","xtwoheadleftarrow","xtwoheadrightarrow","xleftrightarrow","longleftrightarrow","xLeftrightarrow","xrightleftharpoons","longrightleftharpoons","xleftrightharpoons","xhookleftarrow","xhookrightarrow","xmapsto","xtofrom","xleftrightarrows","longleftrightarrows","xRightleftharpoons","longRightleftharpoons","xLeftrightharpoons","longLeftrightharpoons"],"[:auto]{:auto}",{createAtom:t=>{var e,r,i,n,o;return new Ae(g(h({},t),{svgBody:t.command.slice(1),above:((r=T((e=t.args)==null?void 0:e[1]))==null?void 0:r.length)===0?void 0:T((i=t.args)==null?void 0:i[1]),below:(o=T((n=t.args)==null?void 0:n[0]))!=null?o:null,skipBoundary:!1,supsubPlacement:"over-under",paddedBody:!0,paddedLabels:!0,boxType:"rel"}))},serialize:(t,e)=>t.command+(t.hasEmptyBranch("below")?"":`[${t.belowToLatex(e)}]`)+`{${t.aboveToLatex(e)}}${t.supsubToLatex(e)}`});M(["arccos","arcsin","arctan","arctg","arcctg","arg","ch","cos","cosh","cot","cotg","coth","ctg","cth","csc","cosec","deg","dim","exp","gcd","hom","inf","ker","lb","lg","ln","log","Pr","sec","sh","sin","sinh","sup","tan","tanh","tg","th","arcsec","arccsc","arsinh","arcosh","artanh","arcsech","arccsch"],"",{isFunction:!0,ifMode:"math",createAtom:t=>new vt(t.command.slice(1),g(h({},t),{limits:"adjacent",isFunction:!0,variant:"main",variantStyle:"up"}))});M(["liminf","limsup"],"",{ifMode:"math",createAtom:t=>new vt({"\\liminf":"lim inf","\\limsup":"lim sup"}[t.command],g(h({},t),{limits:"over-under",variant:"main"}))});M(["lim","mod"],"",{ifMode:"math",createAtom:t=>new vt(t.command.slice(1),g(h({},t),{limits:"over-under",variant:"main"}))});M(["det","max","min"],"",{ifMode:"math",isFunction:!0,createAtom:t=>new vt(t.command.slice(1),g(h({},t),{limits:"over-under",isFunction:!0,variant:"main"}))});M("ang","{:math}",{ifMode:"math",createAtom:t=>new x(g(h({},t),{body:T(t.args[0])})),serialize:(t,e)=>`\\ang{${t.bodyToLatex(e)}}`,render:(t,e)=>{let r=t.createBox(e),i=r.caret;r.caret=void 0;let n=new w("\xB0",{style:g(h({},t.style),{variant:"normal",variantStyle:"up"})});return new w([r,n],{type:"inner",isSelected:t.isSelected,caret:i})}});M("sqrt","[index:auto]{radicand:expression}",{ifMode:"math",createAtom:t=>new fn(g(h({},t),{body:T(t.args[1]),index:t.args[0]?T(t.args[0]):void 0}))});M(["frac","dfrac","tfrac","binom","dbinom","tbinom"],"{:expression}{:expression}",{ifMode:"math",createAtom:t=>{let e=h({},t),r=t.command,i=t.args;switch(r){case"\\dfrac":case"\\frac":case"\\tfrac":e.hasBarLine=!0;break;case"\\atopfrac":e.hasBarLine=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":e.hasBarLine=!1,e.leftDelim="(",e.rightDelim=")";break;case"\\cfrac":e.hasBarLine=!0,e.continuousFraction=!0;break;default:}switch(r){case"\\dfrac":case"\\dbinom":e.mathstyleName="displaystyle";break;case"\\tfrac":case"\\tbinom":e.mathstyleName="textstyle";break;default:}return new st(i[0]?T(i[0]):[new Me],i[1]?T(i[1]):[new Me],e)},serialize:(t,e)=>{let r=t.aboveToLatex(e),i=t.belowToLatex(e);return/^[0-9]$/.test(r)&&/^[0-9]$/.test(i)?`${t.command}${r}${i}`:U(t.command,r,i)}});M(["cfrac"],"[:string]{:expression}{:expression}",{ifMode:"math",createAtom:t=>{let e=h({},t),r=t.args;return e.hasBarLine=!0,e.continuousFraction=!0,r[0]==="r"&&(e.align="right"),r[0]==="l"&&(e.align="left"),new st(r[1]?T(r[1]):[new Me],r[2]?T(r[2]):[new Me],e)},serialize:(t,e)=>{let r=t.aboveToLatex(e),i=t.belowToLatex(e);return U(t.command,r,i)}});var Lh=["displaystyle","textstyle","scriptstyle","scriptscriptstyle"];M("genfrac","{left-delim:delim}{right-delim:delim}{thickness:value}{mathstyle:string}{numerator:expression}{denominator:expression}",{ifMode:"math",createAtom:t=>{let[e,r,i,n,o,a]=t.args,s=h({},t);e&&e!=="."&&(s.leftDelim=e),r&&r!=="."&&(s.rightDelim=r),i?(s.barThickness=i,s.hasBarLine=!Tg(i)):s.hasBarLine=!0;let l=n==null?void 0:n.trim();return l&&/^[0-3]$/.test(l)&&(s.mathstyleName=Lh[Number(l)]),new st(o?T(o):[new Me],a?T(a):[new Me],s)},serialize:(t,e)=>{var i,n,o;let r=t.mathstyleName?Lh.indexOf(t.mathstyleName):-1;return U(t.command,(i=t.leftDelim)!=null?i:"",(n=t.rightDelim)!=null?n:"",(o=ge(t.barThickness))!=null?o:"",r>=0?r.toString():"",t.aboveToLatex(e),t.belowToLatex(e))}});function Tg(t){return"dimension"in t?t.dimension===0:"glue"in t?t.glue.dimension===0:"number"in t?t.number===0:"string"in t?parseFloat(t.string)===0:!1}M(["brace","brack"],"",{infix:!0,createAtom:t=>new st(T(t.args[0]),T(t.args[1]),g(h({},t),{hasBarLine:!1,leftDelim:t.command==="\\brace"?"\\lbrace":"\\lbrack",rightDelim:t.command==="\\brace"?"\\rbrace":"\\rbrack"})),serialize:(t,e)=>R([t.aboveToLatex(e),t.command,t.belowToLatex(e)])});M(["over","atop","choose"],"",{infix:!0,createAtom:t=>{let e,r,i=t.args;return t.command==="\\choose"&&(e="(",r=")"),new st(T(i[0]),T(i[1]),g(h({},t),{hasBarLine:t.command==="\\over",leftDelim:e,rightDelim:r}))},serialize:(t,e)=>R([t.aboveToLatex(e),t.command,t.belowToLatex(e)])});M(["overwithdelims","atopwithdelims"],"{numer:auto}{denom:auto}{left-delim:delim}{right-delim:delim}",{infix:!0,createAtom:t=>{var r,i;let e=t.args;return new st(T(e[0]),T(e[1]),g(h({},t),{leftDelim:(r=e[2])!=null?r:".",rightDelim:(i=e[3])!=null?i:".",hasBarLine:!1}))},serialize:(t,e)=>`${t.aboveToLatex(e)} ${t.command}${t.leftDelim}${t.rightDelim}${t.belowToLatex(e)}`});M("pdiff","{numerator}{denominator}",{ifMode:"math",createAtom:t=>new st(T(t.args[0]),T(t.args[1]),g(h({},t),{hasBarLine:!0,numerPrefix:"\u2202",denomPrefix:"\u2202"})),serialize:(t,e)=>R([t.aboveToLatex(e),t.command,t.belowToLatex(e)])});M(["sum","prod","bigcup","bigcap","coprod","bigvee","bigwedge","biguplus","bigotimes","bigoplus","bigodot","bigsqcup","intop"],"",{ifMode:"math",createAtom:t=>new fi({coprod:"\u2210",bigvee:"\u22C1",bigwedge:"\u22C0",biguplus:"\u2A04",bigcap:"\u22C2",bigcup:"\u22C3",intop:"\u222B",prod:"\u220F",sum:"\u2211",bigotimes:"\u2A02",bigoplus:"\u2A01",bigodot:"\u2A00",bigsqcup:"\u2A06",smallint:"\u222B"}[t.command.slice(1)],g(h({},t),{limits:"auto",variant:"main"}))});M("smallint","",{ifMode:"math",createAtom:t=>new vt("\u222B",g(h({},t),{limits:"adjacent",variant:"main"}))});var Ah={int:"\u222B",iint:"\u222C",iiint:"\u222D",oint:"\u222E",oiint:"\u222F",oiiint:"\u2230",intclockwise:"\u2231",varointclockwise:"\u2232",ointctrclockwise:"\u2233",intctrclockwise:"\u2A11",sqcup:"\u2294",sqcap:"\u2293",uplus:"\u228E",wr:"\u2240",amalg:"\u2A3F",Cap:"\u22D2",Cup:"\u22D3",doublecap:"\u22D2",doublecup:"\u22D3"};M(Object.keys(Ah),"",{ifMode:"math",createAtom:t=>{let e=t.command,r=Ah[e.slice(1)];return new fi(r,g(h({},t),{limits:"adjacent",variant:{"\u22D2":"ams","\u22D3":"ams"}[r]}))}});M(["Re","Im"],"",{ifMode:"math",createAtom:t=>new vt({"\\Re":"\u211C","\\Im":"\u2111"}[t.command],g(h({},t),{limits:"adjacent",isFunction:!0,variant:"fraktur"}))});M("middle","{:delim}",{ifMode:"math",createAtom:t=>{var e;return new mn(g(h({},t),{delim:(e=t.args[0])!=null?e:"|",size:1}))}});M("the","{:value}",{createAtom:t=>new x(g(h({},t),{captureSelection:!0,verbatimLatex:null})),render:(t,e)=>{var o;let r=new P({parent:e},t.style),i="";t.isSelected&&(i+=" ML__selected");let n=r.evaluate(t.args[0]);return new w(((o=ge(n))!=null?o:"").split("").map(a=>new w(a,{type:"ord",classes:i,mode:t.mode,isSelected:t.isSelected,style:h({variant:"main"},t.style)})),{type:"lift",style:t.style,caret:t.caret,isSelected:t.isSelected,classes:i}).wrap(r)},serialize:t=>{var e;return`\\the${(e=ge(t.args[0]))!=null?e:"\\relax"}`}});M("mathtip","{:auto}{:math}",{createAtom:t=>new gi(g(h({},t),{body:T(t.args[0]),tooltip:T(t.args[1]),content:"math"})),serialize:(t,e)=>e.skipStyles?t.bodyToLatex(e):`\\mathtip{${t.bodyToLatex(e)}}{${x.serialize([t.tooltip],g(h({},e),{defaultMode:"math"}))}}`});M("texttip","{:auto}{:text}",{createAtom:t=>new gi(g(h({},t),{body:T(t.args[0]),tooltip:T(t.args[1]),content:"text"})),serialize:(t,e)=>e.skipStyles?t.bodyToLatex(e):`\\texttip{${t.bodyToLatex(e)}}{${x.serialize([t.tooltip],g(h({},e),{defaultMode:"text"}))}}`});M("error","{:math}",{createAtom:t=>new x(g(h({},t),{body:T(t.args[0])})),serialize:(t,e)=>`\\error{${t.bodyToLatex(e)}}`,render:(t,e)=>t.createBox(e,{classes:"ML__error"})});M("ensuremath","{:math}",{createAtom:t=>new x(g(h({},t),{body:T(t.args[0])})),serialize:(t,e)=>`${t.command}{${t.bodyToLatex(g(h({},e),{defaultMode:"math"}))}}`});M("color","{:value}",{applyStyle:(t,e,r,i)=>{var n,o;return g(h({},t),{verbatimColor:(n=ge(r[0]))!=null?n:void 0,color:i.toColor((o=r[0])!=null?o:{string:"red"})})}});M("textcolor","{:value}{content:auto*}",{applyStyle:(t,e,r,i)=>{var n,o;return g(h({},t),{verbatimColor:(n=ge(r[0]))!=null?n:void 0,color:i.toColor((o=r[0])!=null?o:{string:"red"})})}});M("boxed","{content:math}",{createAtom:t=>new at(g(h({},t),{body:T(t.args[0]),framecolor:{string:"black"}}))});M("colorbox","{:value}{:text*}",{applyStyle:(t,e,r,i)=>{var n,o;return g(h({},t),{verbatimBackgroundColor:(n=ge(r[0]))!=null?n:void 0,backgroundColor:i.toBackgroundColor((o=r[0])!=null?o:{string:"yellow"})})}});M("fcolorbox","{frame-color:value}{background-color:value}{content:text}",{applyMode:"text",createAtom:t=>{var e,r;return new at(g(h({},t),{body:T(t.args[2]),framecolor:(e=t.args[0])!=null?e:{string:"blue"},backgroundcolor:(r=t.args[1])!=null?r:{string:"yellow"}}))},serialize:(t,e)=>{var r,i;return e.skipStyles?t.bodyToLatex(g(h({},e),{defaultMode:"text"})):U(t.command,(r=ge(t.framecolor))!=null?r:"",(i=ge(t.backgroundcolor))!=null?i:"",t.bodyToLatex(g(h({},e),{defaultMode:"text"})))}});M("bbox","[:bbox]{body:auto}",{createAtom:t=>{var i;let e=t.args[0],r=T(t.args[1]);return e?new at(g(h({},t),{body:r,padding:e.padding,border:e.border,backgroundcolor:(i=e.backgroundcolor)!=null?i:void 0})):new at(g(h({},t),{body:r}))},serialize:(t,e)=>{var i,n;if(e.skipStyles)return t.bodyToLatex(e);let r=t.command;if(Number.isFinite(t.padding)||t.border!==void 0||t.backgroundcolor!==void 0){let o=[];t.padding&&o.push((i=ge(t.padding))!=null?i:""),t.border&&o.push(`border: ${t.border}`),t.backgroundcolor&&o.push((n=ge(t.backgroundcolor))!=null?n:""),r+=`[${o.join(",")}]`}return U(r,t.bodyToLatex(e))}});M(["displaystyle","textstyle","scriptstyle","scriptscriptstyle"],"{:rest}",{createAtom:t=>new x(g(h({},t),{body:T(t.args[0])})),render:(t,e)=>{let r=new P({parent:e,mathstyle:t.command.slice(1)},t.style),i=x.createBox(r,t.body,{type:"lift"});return t.caret&&(i.caret=t.caret),t.bind(e,i)},serialize:(t,e)=>e.skipStyles?t.bodyToLatex(e):`{${R([t.command,t.bodyToLatex(e)])}}`});M(["tiny","scriptsize","footnotesize","small","normalsize","large","Large","LARGE","huge","Huge"],"",{applyStyle:(t,e)=>g(h({},t),{fontSize:{"\\tiny":1,"\\scriptsize":2,"\\footnotesize":3,"\\small":4,"\\normalsize":5,"\\large":6,"\\Large":7,"\\LARGE":8,"\\huge":9,"\\Huge":10}[e]})});M("fontseries","{:string}",{ifMode:"text",applyStyle:(t,e,r)=>{var i;return g(h({},t),{fontSeries:(i=r[0])!=null?i:"auto"})}});M("fontshape","{:string}",{ifMode:"text",applyStyle:(t,e,r)=>{var i;return g(h({},t),{fontShape:(i=r[0])!=null?i:"auto"})}});M("fontfamily","{:string}",{ifMode:"text",applyStyle:(t,e,r)=>{var i;return g(h({},t),{fontFamily:(i=r[0])!=null?i:"roman"})}});M("selectfont","",{ifMode:"text",applyStyle:t=>t});M("bf","{:rest*}",{applyStyle:t=>g(h({},t),{fontSeries:"b",fontShape:"n",fontFamily:"roman"})});M(["boldsymbol","bm","bold"],"{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variantStyle:"bold"})});M("bfseries","{:rest*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontSeries:"b"})});M("mdseries","{:rest*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontSeries:"m"})});M("upshape","{:rest*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"n"})});M("slshape","{:rest*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"sl"})});M("scshape","{:rest*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"sc"})});M("textbf","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontSeries:"b"})});M("textmd","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontSeries:"m"})});M("textup","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"n"})});M("textnormal","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"n",fontSeries:"m"})});M("textsl","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"sl"})});M("textit","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"it"})});M("textsc","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontShape:"sc"})});M("textrm","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontFamily:"roman"})});M("textsf","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontFamily:"sans-serif"})});M("texttt","{:text*}",{applyMode:"text",applyStyle:t=>g(h({},t),{fontFamily:"monospace"})});M("mathbf","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"normal",variantStyle:"bold"})});M("mathit","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"main",variantStyle:"italic"})});M("mathnormal","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"normal",variantStyle:"italic"})});M("mathbfit","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"main",variantStyle:"bolditalic"})});M("mathrm","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"normal",variantStyle:"up"})});M("mathsf","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"sans-serif",variantStyle:"up"})});M("mathtt","{:math*}",{applyMode:"math",applyStyle:t=>g(h({},t),{variant:"monospace",variantStyle:"up"})});M("it","{:rest*}",{applyStyle:t=>g(h({},t),{fontSeries:"m",fontShape:"it",fontFamily:"roman",variantStyle:"italic"})});M("rmfamily","{:rest*}",{applyStyle:t=>g(h({},t),{fontFamily:"roman"})});M("sffamily","{:rest*}",{applyStyle:t=>g(h({},t),{fontFamily:"sans-serif"})});M("ttfamily","{:rest*}",{applyStyle:t=>g(h({},t),{fontFamily:"monospace"})});M(["Bbb","mathbb"],"{:math*}",{applyStyle:t=>g(h({},t),{variant:"double-struck",variantStyle:so(t.variantStyle)})});M(["frak","mathfrak"],"{:math*}",{applyStyle:t=>g(h({},t),{variant:"fraktur",variantStyle:so(t.variantStyle)})});M("mathcal","{:math*}",{applyStyle:t=>g(h({},t),{variant:"calligraphic",variantStyle:so(t.variantStyle)})});M("mathscr","{:math*}",{applyStyle:t=>g(h({},t),{variant:"script",variantStyle:so(t.variantStyle)})});M("mbox","{:text}",{ifMode:"math",createAtom:t=>new x(g(h({},t),{type:"mord",body:T(t.args[0]),mode:"math"})),serialize:(t,e)=>U("\\mbox",t.bodyToLatex(g(h({},e),{defaultMode:"text"})))});M("text","{:text}",{ifMode:"math",applyMode:"text"});M(["class","htmlClass"],"{name:string}{content:auto*}",{createAtom:t=>new x(g(h({},t),{type:"mord",body:T(t.args[1])})),serialize:(t,e)=>!t.args[0]||e.skipStyles?t.bodyToLatex(e):`${t.command}{${t.args[0]}}{${t.bodyToLatex(e)}}`,render:(t,e)=>{var r;return t.createBox(e,{classes:(r=t.args[0])!=null?r:"",boxType:"lift"})}});M(["cssId","htmlId"],"{id:string}{content:auto*}",{createAtom:t=>new x(g(h({},t),{type:"mord",body:T(t.args[1])})),serialize:(t,e)=>{var r;return!((r=t.args)!=null&&r[0])||e.skipStyles?t.bodyToLatex(e):`${t.command}{${t.args[0]}}{${t.bodyToLatex(e)}}`},render:(t,e)=>{var i;let r=t.createBox(e);return r.cssId=(i=t.args[0])!=null?i:"",r}});M("htmlData","{data:string}{content:auto*}",{createAtom:t=>new x(g(h({},t),{type:"mord",body:T(t.args[1])})),serialize:(t,e)=>{var r;return!((r=t.args)!=null&&r[0])||e.skipStyles?t.bodyToLatex(e):`\\htmlData{${t.args[0]}}{${t.bodyToLatex(e)}}`},render:(t,e)=>{var i;let r=t.createBox(e);return r.htmlData=(i=t.args[0])!=null?i:"",r}});M(["style","htmlStyle"],"{data:string}{content:auto*}",{createAtom:t=>new x(g(h({},t),{type:"mord",body:T(t.args[1])})),serialize:(t,e)=>{var r;return!((r=t.args)!=null&&r[0])||e.skipStyles?t.bodyToLatex(e):`${t.command}{${t.args[0]}}{${t.bodyToLatex(e)}}`},render:(t,e)=>{var i;let r=t.createBox(e);return r.htmlStyle=(i=t.args[0])!=null?i:"",r}});M("href","{url:string}{content:auto*}",{createAtom:t=>new x(g(h({},t),{type:"mord",body:T(t.args[1])})),render:(t,e)=>{var n;let r=t.createBox(e),i=(n=t.args[0])!=null?n:"";return i&&(r.htmlData=`href=${i}`),r}});M("em","{:rest}",{createAtom:t=>new x(g(h({},t),{body:T(t.args[0])})),serialize:(t,e)=>e.skipStyles?t.bodyToLatex(e):`{\\em ${t.bodyToLatex(e)}}`,render:(t,e)=>t.createBox(e,{classes:"ML__emph",boxType:"lift"})});M("emph","{:auto}",{createAtom:t=>new x(g(h({},t),{body:T(t.args[1])})),serialize:(t,e)=>e.skipStyles?t.bodyToLatex(e):`\\emph{${t.bodyToLatex(e)}}`,render:(t,e)=>t.createBox(e,{classes:"ML__emph",boxType:"lift"})});var Ch={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}};M(["bigl","Bigl","biggl","Biggl","bigr","Bigr","biggr","Biggr","bigm","Bigm","biggm","Biggm","big","Big","bigg","Bigg"],"{:delim}",{createAtom:t=>{var e;return new hn(g(h({},t),{delim:(e=t.args[0])!=null?e:".",size:Ch[t.command].size,delimType:Ch[t.command].mclass}))},serialize:(t,e)=>R([t.command,/^[a-zA-Z]/.test(t.value)?`{${t.value}}`:t.value])});M(["hspace","hspace*"],"{width:value}",{createAtom:t=>{var e;return new qt(g(h({},t),{width:(e=t.args[0])!=null?e:{dimension:0}}))}});M(["mkern","kern","mskip","hskip","mspace"],"{width:value}",{createAtom:t=>{var e;return new qt(g(h({},t),{width:(e=t.args[0])!=null?e:{dimension:0}}))}});M("mathchoice","{:math}{:math}{:math}{:math}",{createAtom:t=>new x(t),render:(t,e)=>{let r=0,i=e.mathstyle.id;(i===Yn||i===Kr)&&(r=1),(i===ui||i===He)&&(r=2),(i===Pr||i===Ee)&&(r=3);let n=T(t.args[r]);return x.createBox(e,n)},serialize:(t,e)=>`\\mathchoice{${x.serialize(t.args[0],e)}}{${x.serialize(t.args[1],e)}}{${x.serialize(t.args[2],e)}}{${x.serialize(t.args[3],e)}}`});M("mathop","{:auto}",{createAtom:t=>new x(g(h({},t),{type:"mop",body:T(t.args[0]),limits:"over-under",isFunction:!0,captureSelection:!0})),render:(t,e)=>{var i;let r=x.createBox(e,t.body);if(t.superscript||t.subscript){let n=(i=t.subsupPlacement)!=null?i:"auto";r=n==="over-under"||n==="auto"&&e.isDisplayStyle?t.attachLimits(e,{base:r}):t.attachSupsub(e,{base:r})}return t.caret&&(r.caret=t.caret),new w(t.bind(e,r),{type:"op",isSelected:t.isSelected,classes:"ML__op-group"})},serialize:(t,e)=>{let r=[U(t.command,t.bodyToLatex(e))];return t.explicitSubsupPlacement&&(t.subsupPlacement==="over-under"&&r.push("\\limits"),t.subsupPlacement==="adjacent"&&r.push("\\nolimits"),t.subsupPlacement==="auto"&&r.push("\\displaylimits")),r.push(t.supsubToLatex(e)),R(r)}});M(["mathbin","mathrel","mathopen","mathclose","mathpunct","mathord","mathinner"],"{:auto}",{createAtom:t=>new x(g(h({},t),{type:{"\\mathbin":"mbin","\\mathrel":"mrel","\\mathopen":"mopen","\\mathclose":"mclose","\\mathpunct":"mpunct","\\mathord":"mord","\\mathinner":"minner"}[t.command],body:T(t.args[0])}))});M(["operatorname","operatorname*"],"{operator:math}",{createAtom:t=>{let e=T(t.args[0]).map(r=>{var i;return r.type!=="first"&&(r.type="mord",r.value=(i={"\u2217":"*","\u2212":"-"}[r.value])!=null?i:r.value,r.isFunction=!1,!r.style.variant&&!r.style.variantStyle&&(r.style.variant="main",r.style.variantStyle="up")),r});return new x(g(h({},t),{type:"mop",body:e,isFunction:!0,limits:t.command==="\\operatorname"?"adjacent":"over-under"}))},render:(t,e)=>{var i;let r=x.createBox(e,t.body);if(t.superscript||t.subscript){let n=(i=t.subsupPlacement)!=null?i:"auto";r=n==="over-under"||n==="auto"&&e.isDisplayStyle?t.attachLimits(e,{base:r}):t.attachSupsub(e,{base:r})}return t.caret&&(r.caret=t.caret),new w(t.bind(e,r),{type:"op",isSelected:t.isSelected,classes:"ML__op-group"})},serialize:(t,e)=>{let r=[U(t.command,t.bodyToLatex(e))];return t.explicitSubsupPlacement&&(t.subsupPlacement==="over-under"&&r.push("\\limits"),t.subsupPlacement==="adjacent"&&r.push("\\nolimits"),t.subsupPlacement==="auto"&&r.push("\\displaylimits")),r.push(t.supsubToLatex(e)),R(r)}});M(["char","unicode"],"{charcode:value}",{createAtom:t=>new x(g(h({},t),{type:t.mode==="text"?"text":"mord"})),serialize:t=>{var e;return`${t.command}${ge((e=t.args[0])!=null?e:{number:10067,base:"hexadecimal"})}`},render:(t,e)=>{let r=e.evaluate(t.args[0]);return(!r||!("number"in r))&&(r={number:10067,base:"hexadecimal"}),t.value=String.fromCodePoint(r.number),t.createBox(e)}});M("rule","[raise:value]{width:value}{thickness:value}",{createAtom:t=>new x(t),render:(t,e)=>{var s,l,c;let r=new P({parent:e,mathstyle:"textstyle"},t.style),i=r.toEm((s=t.args[0])!=null?s:{dimension:0}),n=r.toEm((l=t.args[1])!=null?l:{dimension:10}),o=r.toEm((c=t.args[2])!=null?c:{dimension:10}),a=new w(null,{classes:"ML__rule",type:"ord"});return a.width=n,a.height=o+i,a.depth=-i,a.setStyle("border-right-width",n,"em"),a.setStyle("border-top-width",o,"em"),a.setStyle("border-color",t.style.color),a.setStyle("vertical-align",i,"em"),t.isSelected&&a.setStyle("opacity","50%"),t.bind(r,a),t.caret&&(a.caret=t.caret),a.wrap(e)},serialize:t=>`\\rule${t.args[0]?`[${ge(t.args[0])}]`:""}{${ge(t.args[1])}}{${ge(t.args[2])}}`});M(["overline","underline"],"{:auto}",{createAtom:t=>new x(g(h({},t),{body:T(t.args[0])})),render:(t,e)=>{let r=t.command.substring(1),i=new P({parent:e,mathstyle:"cramp"},t.style),n=x.createBox(i,t.body);if(!n)return null;let o=i.metrics.defaultRuleThickness/i.scalingFactor,a=new w(null,{classes:r+"-line"});a.height=o,a.maxFontSize=o*1.125*i.scalingFactor;let s;return r==="overline"?s=new te({shift:0,children:[{box:n},3*o,{box:a},o]}):s=new te({top:n.height,children:[o,{box:a},3*o,{box:n}]}),t.caret&&(s.caret=t.caret),new w(s,{classes:r,type:"ignore"})}});M("overset","{:auto}{base:auto}",{createAtom:t=>{let e=T(t.args[1]);return new Ae(g(h({},t),{above:T(t.args[0]),body:e,skipBoundary:!1,boxType:ci(e)}))},serialize:(t,e)=>U(t.command,t.aboveToLatex(e),t.bodyToLatex(e))});M("underset","{:auto}{base:auto}",{createAtom:t=>{let e=T(t.args[1]);return new Ae(g(h({},t),{below:T(t.args[0]),body:e,skipBoundary:!1,boxType:ci(e)}))},serialize:(t,e)=>U(t.command,t.belowToLatex(e),t.bodyToLatex(e))});M("overunderset","{above:auto}{below:auto}{base:auto}",{createAtom:t=>{let e=T(t.args[2]);return new Ae(g(h({},t),{above:T(t.args[0]),below:T(t.args[1]),body:e,skipBoundary:!1,boxType:ci(e)}))},serialize:(t,e)=>U(t.command,t.belowToLatex(e),t.bodyToLatex(e))});M(["stackrel","stackbin"],"[below:auto]{above:auto}{base:auto}",{createAtom:t=>new Ae(g(h({},t),{body:T(t.args[2]),above:T(t.args[1]),below:T(t.args[0]),skipBoundary:!1,boxType:t.command==="\\stackrel"?"rel":"bin"})),serialize:(t,e)=>U(t.command,t.aboveToLatex(e),t.bodyToLatex(e))});M("smash","[:string]{:auto}",{createAtom:t=>{var e,r,i,n;return new Vt(g(h({},t),{body:T(t.args[1]),smashHeight:(r=(e=t.args[0])==null?void 0:e.includes("t"))!=null?r:!0,smashDepth:(n=(i=t.args[0])==null?void 0:i.includes("b"))!=null?n:!0}))}});M("vphantom","{:auto}",{createAtom:t=>new Vt(g(h({},t),{body:T(t.args[0]),isInvisible:!0,smashWidth:!0}))});M("hphantom","{:auto}",{createAtom:t=>new Vt(g(h({},t),{body:T(t.args[0]),isInvisible:!0,smashHeight:!0,smashDepth:!0}))});M("phantom","{:auto}",{createAtom:t=>new Vt(g(h({},t),{body:T(t.args[0]),isInvisible:!0}))});M("mathstrut","",{createAtom:t=>new Vt(g(h({},t),{body:[new x({value:"("})],isInvisible:!0}))});M("not","{:math}",{createAtom:t=>{let e=T(t.args[0]);return e.length===0?new x(g(h({},t),{type:"mrel",value:"\uE020"})):new x(g(h({},t),{body:[new yt(g(h({},t),{body:"\uE020",align:"right"})),...e],captureSelection:!0}))},serialize:(t,e)=>{let r=t.args[0],i=r&&typeof r=="object"&&"group"in r;return t.value!=="\uE020"?i?`\\not{${x.serialize(r.group,e)}}`:`\\not${x.serialize(r,e)}`:i?"\\not{}":"\\not"},render:(t,e)=>{if(t.value)return t.createBox(e);let i=t.args[0]&&typeof t.args[0]=="object"&&"group"in t.args[0]?"ord":ci(T(t.args[0])),n=x.createBox(e,t.body,{type:i});return t.caret&&(n.caret=t.caret),t.bind(e,n)}});M(["ne","neq"],"",{createAtom:t=>new x(g(h({},t),{type:"mrel",body:[new yt(g(h({},t),{body:"\uE020",align:"right",boxType:"rel"})),new x(g(h({},t),{value:"="}))],captureSelection:!0})),serialize:t=>t.command});M("rlap","{:auto}",{createAtom:t=>new yt(g(h({},t),{body:T(t.args[0]),align:"right"}))});M("llap","{:auto}",{createAtom:t=>new yt(g(h({},t),{body:T(t.args[0]),align:"left"}))});M("mathrlap","{:math}",{createAtom:t=>new yt(g(h({},t),{body:T(t.args[0]),align:"right"}))});M("mathllap","{:math}",{createAtom:t=>new yt(g(h({},t),{body:T(t.args[0]),align:"left"}))});M("raisebox","{:value}{:text}",{createAtom:t=>{var e;return new at(g(h({},t),{body:T(t.args[1]),padding:{dimension:0},offset:(e=t.args[0])!=null?e:{dimension:0}}))},serialize:(t,e)=>{var r;return U("\\raisebox",(r=ge(t.offset))!=null?r:"0pt",t.bodyToLatex(e))}});M("raise","{:value}{:auto}",{createAtom:t=>{var e;return new at(g(h({},t),{body:T(t.args[1]),padding:{dimension:0},offset:(e=t.args[0])!=null?e:{dimension:0}}))},serialize:(t,e)=>{var r;return U("\\raise",(r=ge(t.offset))!=null?r:"0pt",t.bodyToLatex(e))}});M("lower","{:value}{:auto}",{createAtom:t=>{var e;return new at(g(h({},t),{body:T(t.args[1]),padding:{dimension:0},offset:(e=gt(t.args[0],-1))!=null?e:{dimension:0}}))},serialize:(t,e)=>{var r,i;return U("\\lower",(i=ge(gt((r=t.offset)!=null?r:{dimension:0},-1)))!=null?i:"0pt",t.bodyToLatex(e))}});Se("0123456789/@.?!");gl(65,90);gl(97,122);Se([["\\forall",8704],["\\exists",8707],["\\nexists",8708,"mord","ams"],["\\mid",8739,"mrel"],["\\top",8868],["\\bot",8869]]);Se([["\\#",35],["\\&",38],["\\parallelogram",9649],["\\spadesuit",9824],["\\heartsuit",9825],["\\diamondsuit",9826],["\\clubsuit",9827],["\\flat",9837],["\\natural",9838],["\\sharp",9839]]);Se([["\\backslash",92],["\\nabla",8711],["\\partial",8706],["\\ell",8467],["\\hbar",8463],["\\pounds",163],["\\euro",8364]]);Se([["\\rightarrow",8594],["\\to",8594],["\\leftarrow",8592],["\\gets",8592],["\\Rightarrow",8658],["\\Leftarrow",8656],["\\longrightarrow",10230],["\\longleftarrow",10229],["\\Longrightarrow",10233],["\\implies",10233],["\\Longleftarrow",10232],["\\impliedby",10232],["\\longleftrightarrow",10231],["\\biconditional",10231],["\\Longleftrightarrow",10234],["\\mapsto",8614],["\\longmapsto",10236],["\\uparrow",8593],["\\downarrow",8595],["\\Uparrow",8657],["\\Downarrow",8659],["\\updownarrow",8597],["\\Updownarrow",8661],["\\hookrightarrow",8618],["\\hookleftarrow",8617],["\\rightharpoonup",8640],["\\leftharpoonup",8636],["\\rightharpoondown",8641],["\\leftharpoondown",8637],["\\searrow",8600],["\\nearrow",8599],["\\swarrow",8601],["\\nwarrow",8598],["\\originalof",8886],["\\laplace",8886],["\\imageof",8887],["\\Laplace",8887]],"mrel");Se([["\\mapsfrom",8612,"mrel"],["\\Mapsfrom",10502,"mrel"],["\\MapsTo",10503,"mrel"],["\\Yup",8516,"mord"],["\\lightning",8623,"mrel"],["\\leftarrowtriangle",8701,"mrel"],["\\rightarrowtriangle",8702,"mrel"],["\\leftrightarrowtriangle",8703,"mrel"],["\\boxdot",8865,"mbin"],["\\bigtriangleup",9651,"mbin"],["\\bigtriangledown",9661,"mbin"],["\\boxbar",9707,"mbin"],["\\Lbag",10181,"mopen"],["\\Rbag",10182,"mclose"],["\\llbracket",10214,"mopen"],["\\rrbracket",10215,"mclose"],["\\longmapsfrom",10235,"mrel"],["\\Longmapsfrom",10237,"mrel"],["\\Longmapsto",10238,"mrel"],["\\boxslash",10692,"mbin"],["\\boxbslash",10693,"mbin"],["\\boxast",10694,"mbin"],["\\boxcircle",10695,"mbin"],["\\boxbox",10696,"mbin"],["\\fatsemi",10783,"mop"],["\\leftslice",10918,"mrel"],["\\rightslice",10919,"mrel"],["\\interleave",10996,"mbin"],["\\biginterleave",11004,"mop"],["\\sslash",11005,"mbin"],["\\talloblong",11006,"mbin"]]);Se([["\\lbrace",123,"mopen"],["\\rbrace",125,"mclose"],["\\lparen",40,"mopen"],["\\rparen",41,"mclose"],["\\langle",10216,"mopen"],["\\rangle",10217,"mclose"],["\\lfloor",8970,"mopen"],["\\rfloor",8971,"mclose"],["\\lceil",8968,"mopen"],["\\rceil",8969,"mclose"],["\\vert",8739],["\\lvert",8739,"mopen"],["\\rvert",8739,"mclose"],["\\|",8741],["\\Vert",8741],["\\mVert",8741],["\\lVert",8741,"mopen"],["\\rVert",8741,"mclose"],["\\lbrack",91,"mopen"],["\\rbrack",93,"mclose"],["\\{",123,"mopen"],["\\}",125,"mclose"],["(",40,"mopen"],[")",41,"mclose"],["[",91,"mopen"],["]",93,"mclose"],["\\ulcorner",9484,"mopen","ams"],["\\urcorner",9488,"mclose","ams"],["\\llcorner",9492,"mopen","ams"],["\\lrcorner",9496,"mclose","ams"],["\\lgroup",10222,"mopen"],["\\rgroup",10223,"mclose"],["\\lmoustache",9136,"mopen"],["\\rmoustache",9137,"mclose"]]);Se([["\\dashrightarrow",8674],["\\dashleftarrow",8672],["\\Rrightarrow",8667],["\\Lleftarrow",8666],["\\leftrightarrows",8646],["\\rightleftarrows",8644],["\\curvearrowright",8631],["\\curvearrowleft",8630],["\\rightrightarrows",8649],["\\leftleftarrows",8647],["\\upuparrows",8648],["\\downdownarrows",8650],["\\vartriangle",9651],["\\triangleq",8796],["\\vartriangleleft",8882],["\\trianglelefteq",8884],["\\ntriangleleft",8938],["\\ntrianglelefteq",8940],["\\vartriangleright",8883],["\\trianglerighteq",8885],["\\ntriangleright",8939],["\\ntrianglerighteq",8941],["\\blacktriangleleft",9664],["\\blacktriangleright",9654],["\\leftarrowtail",8610],["\\rightarrowtail",8611],["\\looparrowright",8620],["\\looparrowleft",8619],["\\twoheadleftarrow",8606],["\\twoheadrightarrow",8608],["\\twoheadrightarrowtail",10518],["\\rightleftharpoons",8652],["\\leftrightharpoons",8651],["\\Rsh",8625],["\\Lsh",8624],["\\circlearrowright",8635],["\\circlearrowleft",8634],["\\restriction",8638],["\\upharpoonright",8638],["\\upharpoonleft",8639],["\\downharpoonright",8642],["\\downharpoonleft",8643],["\\rightsquigarrow",8669],["\\leadsto",8669],["\\leftrightsquigarrow",8621],["\\multimap",8888],["\\nleftarrow",8602],["\\nrightarrow",8603],["\\nRightarrow",8655],["\\nLeftarrow",8653],["\\nleftrightarrow",8622],["\\nLeftrightarrow",8654],["\\nvrightarrow",8696],["\\nvtwoheadrightarrow",10496],["\\nvrightarrowtail",10516],["\\nvtwoheadrightarrowtail",10519],["\\shortparallel",8741],["\\nless",8814],["\\nleqslant",57360],["\\lneq",10887],["\\lneqq",8808],["\\nleqq",57361],["\\lvertneqq",57356],["\\lnsim",8934],["\\lnapprox",10889],["\\nprec",8832],["\\npreceq",8928],["\\precnsim",8936],["\\precnapprox",10937],["\\nsim",8769],["\\nshortmid",57350],["\\nmid",8740],["\\nvdash",8876],["\\nvDash",8877],["\\ngtr",8815],["\\ngeqslant",57359],["\\ngeqq",57358],["\\gneq",10888],["\\gneqq",8809],["\\gvertneqq",57357],["\\gnsim",8935],["\\gnapprox",10890],["\\nsucc",8833],["\\nsucceq",8929],["\\succnsim",8937],["\\succnapprox",10938],["\\ncong",8774],["\\nshortparallel",57351],["\\nparallel",8742],["\\nVDash",8879],["\\nsupseteqq",57368],["\\supsetneq",8843],["\\varsupsetneq",57371],["\\supsetneqq",10956],["\\varsupsetneqq",57369],["\\nVdash",8878],["\\precneqq",10933],["\\succneqq",10934],["\\nsubseteqq",57366],["\\leqslant",10877],["\\geqslant",10878],["\\gtrsim",8819],["\\approxeq",8778],["\\thickapprox",8776],["\\lessapprox",10885],["\\gtrapprox",10886],["\\precapprox",10935],["\\succapprox",10936],["\\thicksim",8764],["\\succsim",8831],["\\precsim",8830],["\\backsim",8765],["\\eqsim",8770],["\\backsimeq",8909],["\\lesssim",8818],["\\nleq",8816],["\\ngeq",8817],["\\smallsmile",8995],["\\smallfrown",8994],["\\leqq",8806],["\\eqslantless",10901],["\\lll",8920],["\\lessgtr",8822],["\\lesseqgtr",8922],["\\lesseqqgtr",10891],["\\risingdotseq",8787],["\\fallingdotseq",8786],["\\subseteqq",10949],["\\Subset",8912],["\\sqsubset",8847],["\\preccurlyeq",8828],["\\curlyeqprec",8926],["\\vDash",8872],["\\Vvdash",8874],["\\bumpeq",8783],["\\Bumpeq",8782],["\\geqq",8807],["\\eqslantgtr",10902],["\\ggg",8921],["\\gtrless",8823],["\\gtreqless",8923],["\\gtreqqless",10892],["\\supseteqq",10950],["\\Supset",8913],["\\sqsupset",8848],["\\succcurlyeq",8829],["\\curlyeqsucc",8927],["\\Vdash",8873],["\\shortmid",8739],["\\between",8812],["\\pitchfork",8916],["\\varpropto",8733],["\\backepsilon",8717],["\\llless",8920],["\\gggtr",8921],["\\doteqdot",8785],["\\Doteq",8785],["\\eqcirc",8790],["\\circeq",8791],["\\therefore",8756],["\\because",8757]],"mrel","ams");Se([["+",43],["-",8722],["\u2212",8722],["\\pm",177],["\\mp",8723],["*",8727],["\\times",215],["\\div",247],["\\divides",8739],["\\cdot",8901],["\\cap",8745],["\\cup",8746],["\\setminus",8726],["\\land",8743],["\\wedge",8743],["\\lor",8744],["\\vee",8744],["\\circ",8728],["\\bigcirc",9711],["\\bullet",8729],["\\oplus",8853],["\\ominus",8854],["\\otimes",8855],["\\odot",8857],["\\oslash",8856],["\\bigtriangleup",9651],["\\bigtriangledown",9661],["\\triangleleft",9667],["\\triangleright",9657],["\\And",38],["\\dagger",8224],["\\dag",8224],["\\ddag",8225],["\\ddagger",8225],["\\ast",8727],["\\star",8902],["\\bigstar",9733],["\\diamond",8900]],"mbin");Se([["\\lhd",8882],["\\rhd",8883],["\\lessdot",8918],["\\gtrdot",8919],["\\ltimes",8905],["\\rtimes",8906],["\\leftthreetimes",8907],["\\rightthreetimes",8908],["\\intercal",8890],["\\dotplus",8724],["\\doublebarwedge",10846],["\\divideontimes",8903],["\\centerdot",8901],["\\smallsetminus",8726],["\\barwedge",8892],["\\veebar",8891],["\\nor",8891],["\\curlywedge",8911],["\\curlyvee",8910],["\\boxminus",8863],["\\boxplus",8862],["\\boxtimes",8864],["\\boxdot",8865],["\\circleddash",8861],["\\circledast",8859],["\\circledcirc",8858],["\\unlhd",8884],["\\unrhd",8885]],"mbin","ams");Se([["\\surd",8730],["\\S",167],["\\infty",8734],["\\prime",8242],["\\doubleprime",8243],["\\angle",8736],["`",8216],["\\$",36],["\\%",37],["\\_",95],["\\alpha",945],["\\beta",946],["\\gamma",947],["\\delta",948],["\\epsilon",1013],["\\varepsilon",949],["\\zeta",950],["\\eta",951],["\\theta",952],["\\vartheta",977],["\\iota",953],["\\kappa",954],["\\varkappa",1008,"mord","ams"],["\\lambda",955],["\\mu",956],["\\nu",957],["\\xi",958],["\\omicron",111],["\\pi",960],["\\varpi",982],["\\rho",961],["\\varrho",1009],["\\sigma",963],["\\varsigma",962],["\\tau",964],["\\phi",981],["\\varphi",966],["\\upsilon",965],["\\chi",967],["\\psi",968],["\\omega",969],["\\Gamma",915],["\\Delta",916],["\\Theta",920],["\\Lambda",923],["\\Xi",926],["\\Pi",928],["\\Sigma",931],["\\Upsilon",933],["\\Phi",934],["\\Psi",936],["\\Omega",937],["\\digamma",989,"mord","ams"],["\\varkappa",1008,"mord","ams"],["\\coppa",985,"mord","ams"],["\\koppa",985,"mord","ams"],["\\Coppa",984,"mord","ams"],["\\Koppa",984,"mord","ams"],["\\sampi",993,"mord","ams"],["\\Sampi",992,"mord","ams"],["\\emptyset",8709]]);Se([["=",61],["<",60],["\\lt",60],[">",62],["\\gt",62],["\\le",8804],["\\leq",8804],["\\ge",8805],["\\geq",8805],["\\ll",8810],["\\gg",8811],["\\coloneq",8788],["\\coloneqq",8788],["\\colonequals",8788],["\\measeq",8797],["\\eqdef",8798],["\\questeq",8799],[":",58],["\\cong",8773],["\\equiv",8801],["\\prec",8826],["\\preceq",10927],["\\succ",8827],["\\succeq",10928],["\\perp",10178],["\\propto",8733],["\\Colon",8759],["\\smile",8995],["\\frown",8994],["\\sim",8764],["\\doteq",8784],["\\bowtie",8904],["\\Join",8904],["\\asymp",8781],["\\sqsubseteq",8849],["\\sqsupseteq",8850],["\\approx",8776],["\\~",126],["\\leftrightarrow",8596],["\\Leftrightarrow",8660],["\\models",8872],["\\vdash",8866],["\\dashv",8867],["\\roundimplies",10608],["\\in",8712],["\\notin",8713],["\\ni",8715],["\\owns",8715],["\\subset",8834],["\\supset",8835],["\\subseteq",8838],["\\supseteq",8839],["\\differencedelta",8710],["\\mvert",8739],["\\parallel",8741],["\\simeq",8771]],"mrel");Se([["\\lnot",172],["\\neg",172],["\\triangle",9651],["\\subsetneq",8842],["\\varsubsetneq",57370],["\\subsetneqq",10955],["\\varsubsetneqq",57367],["\\nsubset",8836],["\\nsupset",8837],["\\nsubseteq",8840],["\\nsupseteq",8841]],"mrel","ams");Se([["\\wp",8472],["\\aleph",8501]]);Se([["\\blacktriangle",9650],["\\hslash",8463],["\\Finv",8498],["\\Game",8513],["\\eth",240],["\\mho",8487],["\\Bbbk",107],["\\yen",165],["\\square",9633],["\\Box",9633],["\\blacksquare",9632],["\\circledS",9416],["\\circledR",174],["\\triangledown",9661],["\\blacktriangledown",9660],["\\checkmark",10003],["\\diagup",9585],["\\measuredangle",8737],["\\sphericalangle",8738],["\\backprime",8245],["\\backdoubleprime",8246],["\\Diamond",9674],["\\lozenge",9674],["\\blacklozenge",10731],["\\varnothing",8709],["\\complement",8705],["\\maltese",10016],["\\beth",8502],["\\daleth",8504],["\\gimel",8503]],"mord","ams");Se([["\\ ",160],["~",160]],"space");M(["!",",",":",";",">","enskip","enspace","quad","qquad"],"",{createAtom:t=>new qt(t)});M("space","",{createAtom:t=>new qt(t)});Se([["\\colon",58],["\\cdotp",8901],["\\vdots",8942,"mord"],["\\ldotp",46],[",",44],[";",59]],"mpunct");Se([["\\cdots",8943],["\\ddots",8945],["\\ldots",8230],["\\mathellipsis",8230]],"minner");Se([["\\/",47],["|",8739,"mord"],["\\imath",305],["\\jmath",567],["\\degree",176],["'",8242],['"',8221]]);var us={main:["Main-Regular","ML__cmr"],"main-italic":["Main-Italic","ML__cmr ML__it"],"main-bold":["Main-Bold","ML__cmr ML__bold"],"main-bolditalic":["Main-BoldItalic","ML__cmr ML__bold ML__it"],normal:["Main-Regular","ML__cmr"],"normal-bold":["Main-Bold","ML__mathbf"],"normal-italic":["Math-Italic","ML__mathit"],"normal-bolditalic":["Math-BoldItalic","ML__mathbfit"],roman:["Main-Regular","ML__cmr"],"roman-bold":["Main-Bold","ML__mathbf"],"roman-italic":["Math-Italic","ML__mathit"],"roman-bolditalic":["Math-BoldItalic","ML__mathbfit"],ams:["AMS-Regular","ML__ams"],"ams-bold":["AMS-Regular","ML__ams ML__bold"],"ams-italic":["AMS-Regular","ML__ams ML__it"],"ams-bolditalic":["AMS-Regular","ML__ams ML__bold ML__it"],"sans-serif":["SansSerif-Regular","ML__sans"],"sans-serif-bold":["SansSerif-Regular","ML__sans ML__bold"],"sans-serif-italic":["SansSerif-Regular","ML__sans ML__it"],"sans-serif-bolditalic":["SansSerif-Regular","ML__sans ML__bold ML__it"],calligraphic:["Caligraphic-Regular","ML__cal"],"calligraphic-bold":["Caligraphic-Regular","ML__cal ML__bold"],"calligraphic-italic":["Caligraphic-Regular","ML__cal ML__it"],"calligraphic-bolditalic":["Caligraphic-Regular","ML__cal ML__bold ML__it"],script:["Script-Regular","ML__script"],"script-bold":["Script-Regular","ML__script ML__bold"],"script-italic":["Script-Regular","ML__script ML__it"],"script-bolditalic":["Script-Regular","ML__script ML__bold ML__it"],fraktur:["Fraktur-Regular","ML__frak"],"fraktur-bold":["Fraktur-Regular","ML__frak ML__bold"],"fraktur-italic":["Fraktur-Regular","ML__frak ML__it"],"fraktur-bolditalic":["Fraktur-Regular","ML__frak ML__bold ML__it"],monospace:["Typewriter-Regular","ML__tt"],"monospace-bold":["Typewriter-Regular","ML__tt ML__bold"],"monospace-italic":["Typewriter-Regular","ML__tt ML__it"],"monospace-bolditalic":["Typewriter-Regular","ML__tt ML__bold ML__it"],"double-struck":["AMS-Regular","ML__bb"],"double-struck-bold":["AMS-Regular","ML__bb ML__bold"],"double-struck-italic":["AMS-Regular","ML__bb ML_italic"],"double-struck-bolditalic":["AMS-Regular","ML__bb ML_bolditalic"]},ms={"double-struck":/^[A-Z ]$/,script:/^[A-Z ]$/,calligraphic:/^[\dA-Z ]$/,fraktur:/^[\dA-Za-z ]$|^[!"#$%&'()*+,\-./:;=?[]^’‘]$/,monospace:/^[\dA-Za-z ]$|^[!"&'()*+,\-./:;=?@[\]^_~\u0131\u0237\u0393\u0394\u0398\u039B\u039E\u03A0\u03A3\u03A5\u03A8\u03A9]$/,"sans-serif":/^[\dA-Za-z ]$|^[!"&'()*+,\-./:;=?@[\]^_~\u0131\u0237\u0393\u0394\u0398\u039B\u039E\u03A0\u03A3\u03A5\u03A8\u03A9]$/},Eh=/^[\u03B1-\u03C9]|\u03D1|\u03D5|\u03D6|\u03F1|\u03F5]$/,Dg=/^[\u0393|\u0394\u0398\u039B\u039E\u03A0\u03A3\u03A5\u03A6\u03A8\u03A9]$/,Og=[/^[a-z]$/,/^[A-Z]$/,Eh,Dg],Bg={iso:["it","it","it","it"],tex:["it","it","it","up"],french:["it","up","up","up"],upright:["up","up","up","up"]},bc=class extends _e{constructor(){super("math")}createAtom(e,r,i){var a,s,l,c,u,d;if(r===null)return new x({type:"mord",mode:"math",command:e,value:e,style:i});let n;try{n=(l=(s=globalThis.MathfieldElement)==null?void 0:s.isFunction((a=r.command)!=null?a:e))!=null?l:!1}catch(m){n=!1}if(r.definitionType==="symbol"){let m=new x({type:(c=r.type)!=null?c:"mord",mode:"math",command:(u=r.command)!=null?u:e,value:String.fromCodePoint(r.codepoint),isFunction:n,style:i});return e.startsWith("\\")&&(m.verbatimLatex=e),m}let o=new x({type:"mord",mode:"math",command:(d=r.command)!=null?d:e,value:e,isFunction:n,style:i});return e.startsWith("\\")&&(o.verbatimLatex=e),o}serialize(e,r){let i=Kg(e,g(h({},r),{defaultMode:"math"}));return i.length===0||r.defaultMode!=="text"?i:["$ ",...i," $"]}getFont(e,r){var l,c,u;if(r.variant,r.fontFamily){let d=r.fontFamily;r.fontSeries==="b"&&r.fontShape==="it"?d+="-bolditalic":r.fontSeries==="b"?d+="-bold":r.fontShape==="it"&&(d+="-italic");let m=(l=us[d])!=null?l:us[r.fontFamily];if(!m)return console.error(`Unknown font family variant: ${d}`),null;let[p,f]=m;return f&&(e.classes+=" "+f),p}let{variant:i}=r,{variantStyle:n}=r;if(i==="normal"&&!n&&/[\u00A3\u0131\u0237]/.test(e.value)&&(i="main",n="italic"),i==="normal"&&!n&&e.value.length===1){let d=!1;Og.forEach((m,p)=>{var f;m.test(e.value)&&Bg[(f=r.letterShapeStyle)!=null?f:"tex"][p]==="it"&&(d=!0)}),d&&(n=wh(n))}n==="up"&&(n=void 0);let o=n?i+"-"+n:i;us[o];let[a,s]=us[o];if(ms[i]&&!ms[i].test(e.value)){let d=Bn(e.value,i,n);return d||(d=(c=Bn(e.value,i))!=null?c:e.value,e.classes+=(u={bold:" ML__bold",italic:" ML__it","bold-italic":" ML__bold ML__it"}[n!=null?n:""])!=null?u:""),e.value=d,null}return Eh.test(e.value)&&(e.classes+=" lcGreek"),s&&(e.classes+=" "+s),a}};function Kg(t,e){return pt(t,"bold").map(r=>{if(Ha(r[0])!=="bold")return R(ds(r,e));if(Ha(r[0].parent)==="bold")return R(ds(r,e));let n=R(r.map(o=>{var a;return(a=o.value)!=null?a:""}));return/^[a-zA-Z0-9]+$/.test(n)?U("\\mathbf",R(ds(r,e))):U("\\bm",R(ds(r,e)))})}function ds(t,e){let{parent:r}=t[0],i=Wa(r);return pt(t,"variant").map(n=>{let o=Wa(n[0]),a="";o&&o!==i&&(a={calligraphic:"\\mathcal","calligraphic-uo":"\\mathcal",fraktur:"\\mathfrak","fraktur-uo":"\\mathfrak","double-struck":"\\mathbb","double-struck-uo":"\\mathbb",script:"\\mathscr","script-uo":"\\mathscr",monospace:"\\mathtt","monospace-uo":"\\mathtt","sans-serif":"\\mathsf","sans-serif-uo":"\\mathsf",normal:"","normal-up":"\\mathrm","normal-italic":"\\mathnormal","normal-bold":"","normal-bolditalic":"\\mathbfit",ams:"","ams-up":"\\mathrm","ams-italic":"\\mathit","ams-bold":"","ams-bolditalic":"\\mathbfit",main:"","main-up":"\\mathrm","main-italic":"\\mathit","main-bold":"","main-bolditalic":"\\mathbfit"}[o]);let s="",l=n[n.length-1],c=a&&n.length>0&&(l.branch("subscript")!==void 0||l.branch("superscript")!==void 0);c&&(s=l.supsubToLatex(e));let u=R(n.map((d,m)=>{if(c&&m===n.length-1){let p=ne(d.command,d.mode);return p!=null&&p.serialize?p.serialize(d,e):d.body&&d.command?U(d.command,d.bodyToLatex(e)):d.body?d.bodyToLatex(e):!d.value||d.value==="\u200B"?"":d.command||d.value}return d._serialize(e)}));return a?U(a,u)+s:u})}new bc;function Pg(t,e){return t.map(r=>r._serialize(e))}function Rg(t,e){return pt(t,"fontShape").map(r=>{let i=Pg(r,e),{fontShape:n}=r[0].style,o="";return n==="it"&&(o="\\textit"),n==="sl"&&(o="\\textsl"),n==="sc"&&(o="\\textsc"),n==="n"&&(o="\\textup"),!o&&n?`{${U("\\fontshape",n)}${R(i)}}`:o?U(o,R(i)):R(i)})}function Ig(t,e){return pt(t,"fontSeries").map(r=>{let i=Rg(r,e),{fontSeries:n}=r[0].style,o="";return n==="b"&&(o="\\textbf"),n==="l"&&(o="\\textlf"),n==="m"&&(o="\\textmd"),n&&!o?`{${U("\\fontseries",n)}${R(i)}}`:o?U(o,R(i)):R(i)})}function zg(t,e){return pt(t,"fontSize").map(r=>{var o,a;let i=Ig(r,e),n=(a=["","\\tiny","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"][(o=r[0].style.fontSize)!=null?o:""])!=null?a:"";return n?`${n} ${R(i)}`:R(i)})}function Ng(t,e,r){return pt(t,"fontFamily").map(i=>{var s;r=r&&!i.every(l=>l.style.fontFamily||l.style.fontShape||l.style.fontSeries||l.style.fontSize);let n=zg(i,e),{fontFamily:o}=i[0].style,a=(s={roman:"textrm",monospace:"texttt","sans-serif":"textsf"}[o!=null?o:""])!=null?s:"";return a?`\\${a}{${R(n)}}`:o?`{\\fontfamily{${i[0].style.fontFamily}} ${R(n)}}`:r?`\\text{${R(n)}}`:R(n)})}var Th={roman:"","sans-serif":"ML__sans",monospace:"ML__tt"},yc=class extends _e{constructor(){super("text")}createAtom(e,r,i){return r&&r.definitionType==="symbol"?new We(e,String.fromCodePoint(r.codepoint),i!=null?i:{}):null}serialize(e,r){return Ng(e,g(h({},r),{defaultMode:"text"}),r.defaultMode!=="text")}getFont(e,r){var n,o,a,s,l;let{fontFamily:i}=r;if(Th[i])e.classes+=" "+Th[i];else if(i){let c=G0(i);c&&e.setStyle("font-family",c)}if(r.fontShape&&(e.classes+=" ",e.classes+=(n={it:"ML__it",sl:"ML__shape_sl",sc:"ML__shape_sc",ol:"ML__shape_ol"}[r.fontShape])!=null?n:""),r.fontSeries){let c=r.fontSeries.match(/(.?[lbm])?(.?[cx])?/);c&&(e.classes+=" ",e.classes+=(a={ul:"ML__series_ul",el:"ML__series_el",l:"ML__series_l",sl:"ML__series_sl",m:"",sb:"ML__series_sb",b:"ML__bold",eb:"ML__series_eb",ub:"ML__series_ub"}[(o=c[1])!=null?o:""])!=null?a:"",e.classes+=" ",e.classes+=(l={uc:"ML__series_uc",ec:"ML__series_ec",c:"ML__series_c",sc:"ML__series_sc",n:"",sx:"ML__series_sx",x:"ML__series_x",ex:"ML__series_ex",ux:"ML__series_ux"}[(s=c[2])!=null?s:""])!=null?l:"")}return"Main-Regular"}};new yc;var xc=class extends _e{constructor(){super("latex")}createAtom(e){return new he(e)}serialize(e,r){return e.filter(i=>i instanceof he&&!i.isSuggestion).map(i=>i.value)}getFont(){return null}};new xc;function gn(t){var n;let e=/macos|ios/.test(Et()),r=t.split("+"),i="";for(let o of r)i&&(i+=e?"\u2009":'+'),o.startsWith("[Key")?i+=o.slice(4,5):o.startsWith("Key")?i+=o.slice(3,4):o.startsWith("[Digit")?i+=o.slice(6,7):o.startsWith("Digit")?i+=o.slice(5,6):i+=(n={cmd:"\u2318",meta:e?"\u2318":"Ctrl",shift:e?"\u21E7":"Shift",alt:e?"\u2325":"Alt",ctrl:e?"\u2303":"Ctrl","\n":e?"\u23CE":"Return","[return]":e?"\u23CE":"Return","[enter]":e?"\u2324":"Enter","[tab]":e?"\u21E5":"Tab","[escape]":"Esc","[backspace]":e?"\u232B":"Backspace","[delete]":e?"\u2326":"Del","[pageup]":e?"\u21DE":"Page Up","[pagedown]":e?"\u21DF":"Page Down","[home]":e?"\u2912":"Home","[end]":e?"\u2913":"End","[space]":"Space","[equal]":"=","[minus]":"-","[comma]":",","[slash]":"/","[backslash]":"\\","[bracketleft]":"[","[bracketright]":"]",semicolon:";",period:".",comma:",",minus:"-",equal:"=",quote:"'",backslash:"\\",intlbackslash:"\\",backquote:"`",slash:"/",numpadmultiply:"* 🔢",numpaddivide:"/ 🔢",numpadsubtract:"- 🔢",numpadadd:"+ 🔢",numpaddecimal:". 🔢",numpadcomma:", 🔢",help:"help",left:"\u21E0",up:"\u21E1",right:"\u21E2",down:"\u21E3","[arrowleft]":"\u21E0","[arrowup]":"\u21E1","[arrowright]":"\u21E2","[arrowdown]":"\u21E3"}[o.toLowerCase()])!=null?n:o.toUpperCase();return i}function bn(t){if(t instanceof MouseEvent||t instanceof PointerEvent)return{x:t.clientX,y:t.clientY};if(typeof TouchEvent!="undefined"&&t instanceof TouchEvent){let e=[...t.touches].reduce((i,n)=>({x:i.x+n.clientX,y:i.y+n.clientY}),{x:0,y:0}),r=t.touches.length;return{x:e.x/r,y:e.y/r}}}function Wt(t){let e={alt:!1,control:!1,shift:!1,meta:!1};return(t instanceof MouseEvent||t instanceof PointerEvent||typeof TouchEvent!="undefined"&&t instanceof TouchEvent||t instanceof KeyboardEvent)&&(t.altKey&&(e.alt=!0),t.ctrlKey&&(e.control=!0),t.metaKey&&(e.meta=!0),t.shiftKey&&(e.shift=!0)),e}function Dh(t,e){return!t&&e||t&&!e?!1:!t||!e?!0:t.alt===e.alt&&t.control===e.control&&t.shift===e.shift&&t.meta===e.meta}var Fg=new Set(["Backquote","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","Minus","Equal","IntlYen","KeyQ","KeyW","KeyE","KeyR","KeyT","KeyY","KeyU","KeyI","KeyO","KeyP","BracketLeft","BracketRight","Backslash","KeyA","KeyS","KeyD","KeyF","KeyG","KeyH","KeyJ","KeyK","KeyL","Semicolon","Quote","IntlBackslash","KeyZ","KeyX","KeyC","KeyV","KeyB","KeyN","KeyM","Comma","Period","Slash","IntlRo","Space","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadComma","NumpadDecimal","NumpadDivide","NumpadEqual","NumpadHash","NumpadMultiply","NumpadParenLeft","NumpadParenRight","NumpadStar","NumpadSubstract"]);function dr(t){return t.ctrlKey||t.metaKey||["Dead","Process"].includes(t.key)?!1:t.code===""?!0:Fg.has(t.code)}function Ut(){var e;let t=document.activeElement;for(;(e=t==null?void 0:t.shadowRoot)!=null&&e.activeElement;)t=t.shadowRoot.activeElement;return t}var Te=class t{static get scrim(){return t._scrim||(t._scrim=new t),t._scrim}static open(e){t.scrim.open(e)}static close(){t.scrim.close()}static get state(){return t.scrim.state}static get element(){return t.scrim.element}constructor(e){var r,i;this.lightDismiss=(r=e==null?void 0:e.lightDismiss)!=null?r:!0,this.translucent=(i=e==null?void 0:e.translucent)!=null?i:!1,this.state="closed"}get element(){if(this._element)return this._element;let e=document.createElement("div");return e.setAttribute("role","presentation"),e.style.position="fixed",e.style.contain="content",e.style.top="0",e.style.left="0",e.style.right="0",e.style.bottom="0",e.style.zIndex="var(--scrim-zindex, 10099)",e.style.outline="none",this.translucent?(e.style.background="rgba(255, 255, 255, .2)",e.style.backdropFilter="contrast(40%)"):e.style.background="transparent",this._element=e,e}open(e){var a;if(this.state!=="closed")return;this.state="opening",this.onDismiss=e==null?void 0:e.onDismiss,this.savedActiveElement=Ut();let{element:r}=this;((a=e==null?void 0:e.root)!=null?a:document.body).appendChild(r),r.addEventListener("click",this),document.addEventListener("touchmove",this,!1),document.addEventListener("scroll",this,!1);let i=window.innerWidth-document.documentElement.clientWidth;this.savedMarginRight=document.body.style.marginRight,this.savedOverflow=document.body.style.overflow,document.body.style.overflow="hidden";let n=Number.parseFloat(getComputedStyle(document.body).marginRight);document.body.style.marginRight=`${n+i}px`;let o=document.querySelector(".MLK__plate");if(o instanceof HTMLElement){this.savedMlkPaddingRight=o.style.paddingRight;let s=Number.parseFloat(getComputedStyle(o).paddingRight);o.style.paddingRight=`${s+i}px`}e!=null&&e.child&&r.append(e.child),this.state="open"}close(){var i,n,o,a,s;if(this.state!=="open"){this.element.parentElement;return}this.state="closing",typeof this.onDismiss=="function"&&this.onDismiss(),this.onDismiss=void 0;let{element:e}=this;e.removeEventListener("click",this),document.removeEventListener("touchmove",this,!1),document.removeEventListener("scroll",this,!1),e.remove(),document.body.style.overflow=(i=this.savedOverflow)!=null?i:"",document.body.style.marginRight=(n=this.savedMarginRight)!=null?n:"";let r=document.querySelector(".MLK__plate");r instanceof HTMLElement&&(r.style.paddingRight=(o=this.savedMlkPaddingRight)!=null?o:""),Ut()!==this.savedActiveElement&&((s=(a=this.savedActiveElement)==null?void 0:a.focus)==null||s.call(a)),e.innerHTML="",this.state="closed"}handleEvent(e){this.lightDismiss&&(e.target===this._element&&e.type==="click"?(this.close(),e.preventDefault(),e.stopPropagation()):e.target===document&&(e.type==="touchmove"||e.type==="scroll")&&(this.close(),e.preventDefault(),e.stopPropagation()))}};function Oh(t,e,r){let i=null,n=null,o=!1,a=!1,s=!1,l=new AbortController,c=l.signal;return t.addEventListener("keydown",u=>{if(o||u.key==="Process"||u.code==="CapsLock"||/(Control|Meta|Alt|Shift)(Left|Right)/.test(u.code)){i=null;return}i=u,n=null,r.onKeystroke(u)?t.textContent="":i=null},{capture:!0,signal:c}),t.addEventListener("keypress",u=>{o||(i&&n&&r.onKeystroke(i),n=u)},{capture:!0,signal:c}),t.addEventListener("compositionstart",u=>{t.textContent="",o=!0,r.onCompositionStart(u.data)},{capture:!0,signal:c}),t.addEventListener("compositionupdate",u=>{o&&r.onCompositionUpdate(u.data)},{capture:!0,signal:c}),t.addEventListener("compositionend",u=>{t.textContent="",o&&(o=!1,r.onCompositionEnd(u.data))},{capture:!0,signal:c}),t.addEventListener("beforeinput",u=>u.stopImmediatePropagation(),{signal:c}),t.addEventListener("input",u=>{var d;if(!o&&(t.textContent="",u.inputType!=="insertCompositionText")){if(u.inputType==="insertFromPaste"){u.preventDefault(),u.stopPropagation();return}r.onInput((d=u.data)!=null?d:""),u.preventDefault(),u.stopPropagation()}},{signal:c}),t.addEventListener("paste",u=>{t.focus({preventScroll:!0}),t.textContent="",r.onPaste(u)||u.preventDefault(),u.stopImmediatePropagation()},{signal:c}),t.addEventListener("cut",u=>r.onCut(u),{capture:!0,signal:c}),t.addEventListener("copy",u=>r.onCopy(u),{capture:!0,signal:c}),t.addEventListener("blur",u=>{var f,y;if(((y=(f=u.relatedTarget)==null?void 0:f._mathfield)==null?void 0:y.element)===e){t.focus({preventScroll:!0}),u.preventDefault(),u.stopPropagation();return}let d=!1,m=u.relatedTarget;for(;m;){if(m.classList.contains("ML__keyboard")){d=!0;break}m=m.parentElement}if(d){t.focus({preventScroll:!0}),u.preventDefault(),u.stopPropagation();return}let p=Te.state;if(p==="open"||p==="opening"){u.preventDefault(),u.stopPropagation();return}if(u.relatedTarget===u.target.getRootNode().host){u.preventDefault(),u.stopPropagation();return}s||a||(s=!0,i=null,n=null,r.onBlur(),s=!1)},{capture:!0,signal:c}),t.addEventListener("focus",u=>{s||a||(a=!0,r.onFocus(),a=!1)},{capture:!0,signal:c}),{dispose:()=>l.abort(),cancelComposition:()=>{o&&(typeof t.blur=="function"&&t.blur(),requestAnimationFrame(()=>t.focus({preventScroll:!0})))},blur:()=>{typeof t.blur=="function"&&(s=!0,t.blur(),s=!1)},focus:()=>{!a&&typeof t.focus=="function"&&(a=!0,t.focus({preventScroll:!0}),a=!1)},hasFocus:()=>Ut()===t,setAriaLabel:u=>t.setAttribute("aria-label",u),setAriaReadOnly:u=>{u?t.setAttribute("aria-readonly","true"):t.removeAttribute("aria-readonly")},setValue:u=>{var d;t.textContent!==u&&(t.textContent=u,t.style.left="-1000px",(d=window.getSelection())==null||d.selectAllChildren(t))},moveTo:(u,d)=>{t.style.top=`${d}px`,t.style.left=`${u}px`}}}function Fr(t){var r;if(!t||!dr(t))return"";let e;return t.key==="Unidentified"&&t.target&&(e=t.target.value),e=(r=e!=null?e:t.key)!=null?r:t.code,/^(Dead|Return|Enter|Tab|Escape|Delete|PageUp|PageDown|Home|End|Help|ArrowLeft|ArrowRight|ArrowUp|ArrowDown)$/.test(e)&&(e=""),e}function hs(t){t=Cu(t);let e=[];return t.ctrlKey&&e.push("ctrl"),t.metaKey&&e.push("meta"),t.altKey&&e.push("alt"),t.shiftKey&&e.push("shift"),e.length===0?`[${t.code}]`:(e.push(`[${t.code}]`),e.join("+"))}function $g(t){if(Le()){let e=Et(),r=t.startsWith("!"),i=t.endsWith(e);if(r&&!i||!r&&i)return!0}return t==="!other"?!1:t==="other"}function Kh(t,e,r){if(t.length===0)return"";let i=Zr(ll(hs(r))),n=Zr({key:r.key,shift:r.shiftKey,alt:r.altKey,ctrl:r.ctrlKey,meta:r.metaKey||r.ctrlKey&&/macos|ios/.test(Et()),cmd:!1,win:!1});for(let o=t.length-1;o>=0;o--)if((t[o].key===i||t[o].key===n)&&(!t[o].ifMode||t[o].ifMode===e))return t[o].command;return""}function Bh(t){let e=t;return ee(e)&&(e=e.length>0?e[0]+"("+e.slice(1).join("")+")":""),e}function Ph(t,e){let r=[];if(typeof e=="string"){let o=eh[e];ee(o)?r=o.slice():o&&r.push(o)}let i=Bh(e),n=new RegExp("^"+i.replace("\\","\\\\").replace("|","\\|").replace("*","\\*").replace("$","\\$").replace("^","\\^")+"([^*a-zA-Z]|$)");for(let o of t)n.test(Bh(o.command))&&r.push(o.key);return r.map(gn)}function Vg(t,e){if(t.ifPlatform&&!/^!?(macos|windows|android|ios|chromeos|other)$/.test(t.ifPlatform))throw new Error(`Unexpected platform "${t.ifPlatform}" for keybinding ${t.key}`);if(t.ifLayout!==void 0&&(e.score===0||!t.ifLayout.includes(e.id)))return;let r=ll(t.key),i=t.ifPlatform;if(r.cmd){if(i&&i!=="macos"&&i!=="ios")throw new Error('Unexpected "cmd" modifier with platform "'+i+`" +"cmd" modifier can only be used with macOS or iOS platform.`);i||(i=Et()==="ios"?"ios":"macos"),r.win=!1,r.cmd=!1,r.meta=!0}if(r.win){if(i&&i!=="windows")throw new Error('Unexpected "win" modifier with platform "'+i+`" +"win" modifier can only be used with Windows platform.`);i="windows",r.win=!1,r.cmd=!1,r.meta=!0}if(i&&!$g(i))return;if(/^\[.+\]$/.test(r.key))return g(h({},t),{key:Zr(r)});let n=Au(r.key,e);if(!n)return g(h({},t),{key:Zr(r)});if(n.shift&&r.shift||n.alt&&r.alt)throw new Error(`The keybinding ${t.key} (${vc(t.command)}) is conflicting with the key combination ${Zr(n)} using the ${e.displayName} keyboard layout`);return n.shift=n.shift||r.shift,n.alt=n.alt||r.alt,n.meta=r.meta,n.ctrl=r.ctrl,g(h({},t),{key:Zr(n)})}function vc(t){if(Array.isArray(t)){let e=[...t];return e.shift()+"("+e.map(r=>typeof r=="string"?`"${r}"`:r.toString()).join(", ")+")"}return t}function Rh(t,e){let r=[],i=[];for(let n of t)try{let o=Vg(n,e);if(!o)continue;let a=i.find(s=>s.key===o.key&&s.ifMode===o.ifMode);if(a)throw new Error(`Ambiguous key binding ${n.key} (${vc(n.command)}) matches ${a.key} (${vc(a.command)}) with the ${e.displayName} keyboard layout`);i.push(o)}catch(o){o instanceof Error&&r.push(o.message)}return[i,r]}var _c=class extends H{constructor(){super("latex")}createAtom(e){return new he(e)}onPaste(e,r){if(!r)return!1;let i=typeof r=="string"?r:r.getData("application/x-latex")||r.getData("text/plain");return i&&e.model.contentWillChange({inputType:"insertFromPaste",data:i})?(e.stopCoalescingUndo(),e.stopRecording(),this.insert(e.model,i)&&(e.startRecording(),e.snapshot("paste"),e.model.contentDidChange({inputType:"insertFromPaste"}),Y(e)),e.startRecording(),!0):!1}insert(e,r,i){if(!e.contentWillChange({data:r,inputType:"insertText"}))return!1;i||(i={}),i.insertionMode||(i.insertionMode="replaceSelection"),i.selectionMode||(i.selectionMode="placeholder");let{silenceNotifications:n}=e;i.silenceNotifications&&(e.silenceNotifications=!0);let o=e.silenceNotifications;e.silenceNotifications=!0,i.insertionMode==="replaceSelection"&&!e.selectionIsCollapsed?e.deleteAtoms(de(e.selection)):i.insertionMode==="replaceAll"?(e.root.setChildren([],"body"),e.position=0):i.insertionMode==="insertBefore"?e.collapseSelection("backward"):i.insertionMode==="insertAfter"&&e.collapseSelection("forward");let a=[];for(let c of r)$u.test(c)&&a.push(new he(c));let s=e.at(e.position);if(s instanceof $t&&(s=s.lastChild),!(s.parent instanceof $t)){let c=new $t;s.parent.addChildAfter(c,s),s=c.firstChild}let l=s.parent.addChildrenAfter(a,s);return e.silenceNotifications=o,i.selectionMode==="before"||(i.selectionMode==="item"?e.setSelection(e.anchor,e.offsetOf(l)):l&&(e.position=e.offsetOf(l))),e.contentDidChange({data:r,inputType:"insertText"}),e.silenceNotifications=n,!0}};function lo(t){return t.atoms.find(e=>e.type==="latexgroup")}function yi(t){var r,i;let e=lo(t);return(i=(r=e==null?void 0:e.body)==null?void 0:r.filter(n=>n.type==="latex"))!=null?i:[]}function ps(t,e){var s;let r=0,i=!1,n=Number.isFinite(e==null?void 0:e.before)?(s=e==null?void 0:e.before)!=null?s:0:t.lastOffset;for(;r<=n&&!i;){let l=t.at(r);i=l instanceof he&&l.isSuggestion,i||r++}if(!i)return[void 0,void 0];let o=r,a=!1;for(;o<=n&&!a;){let l=t.at(o);a=!(l instanceof he&&l.isSuggestion),a||o++}return[r-1,o-1]}new _c;function qg(t,e){t.flushInlineShortcutBuffer(),t.stopCoalescingUndo();let r=fs(t,e),{model:i}=t;return i.selectionIsCollapsed?(t.defaultStyle.fontSeries&&r.fontSeries===t.defaultStyle.fontSeries&&(r.fontSeries="auto"),r.fontShape&&r.fontShape===t.defaultStyle.fontShape&&(r.fontShape="auto"),r.color&&r.color===t.defaultStyle.color&&(r.color="none"),r.backgroundColor&&r.backgroundColor===t.defaultStyle.backgroundColor&&(r.backgroundColor="none"),r.fontSize&&r.fontSize===t.defaultStyle.fontSize&&(r.fontSize="auto"),t.defaultStyle=h(h({},t.defaultStyle),r)):t.model.deferNotifications({content:!0,type:"insertText"},()=>{i.selection.ranges.forEach(n=>ao(i,n,r,{operation:"toggle"})),t.snapshot("style-change")}),!0}fe({applyStyle:qg},{target:"mathfield",canUndo:!0,changeContent:!0});function fs(t,e){var n,o,a,s,l,c,u,d,m,p;let r={};if(typeof e.color=="string"){let f=(o=t.colorMap((n=e.color)!=null?n:e.verbatimColor))!=null?o:"none";f!==e.color&&(r.verbatimColor=(a=e.verbatimColor)!=null?a:e.color),r.color=f}if(typeof e.backgroundColor=="string"){let f=(l=t.backgroundColorMap((s=e.backgroundColor)!=null?s:e.verbatimBackgroundColor))!=null?l:"none";f!==e.backgroundColor&&(r.verbatimBackgroundColor=(c=e.verbatimBackgroundColor)!=null?c:e.backgroundColor),r.backgroundColor=f}typeof e.fontFamily=="string"&&(r.fontFamily=e.fontFamily),typeof e.series=="string"&&(r.fontSeries=e.series),typeof e.fontSeries=="string"&&(r.fontSeries=e.fontSeries.toLowerCase()),r.fontSeries&&(r.fontSeries=(u={bold:"b",medium:"m",normal:"m"}[r.fontSeries])!=null?u:r.fontSeries),typeof e.shape=="string"&&(r.fontShape=e.shape),typeof e.fontShape=="string"&&(r.fontShape=e.fontShape.toLowerCase()),r.fontShape&&(r.fontShape=(d={italic:"it",up:"n",upright:"n",normal:"n"}[r.fontShape])!=null?d:r.fontShape),e.variant&&(r.variant=e.variant.toLowerCase()),e.variantStyle!==void 0&&(r.variantStyle=typeof e.variantStyle=="string"&&e.variantStyle!==""?e.variantStyle.toLowerCase():e.variantStyle);let i=(m=e.size)!=null?m:e.fontSize;return typeof i=="number"?r.fontSize=Math.max(1,Math.min(10,i)):typeof i=="string"&&(r.fontSize=(p={size1:1,size2:2,size3:3,size4:4,size5:5,size6:6,size7:7,size8:8,size9:9,size10:10}[i.toLowerCase()])!=null?p:{tiny:1,scriptsize:2,footnotesize:3,small:4,normal:5,normalsize:5,large:6,Large:7,LARGE:8,huge:9,Huge:10}[i]),r}function co(t,e,r){var o,a;let i=t.model;if(i.mode==="latex")return{};let n=t.styleBias;if(n==="none")return t.defaultStyle;if(i.mode==="text")return(a=(o=i.at(n==="right"?r.after:r.before))==null?void 0:o.style)!=null?a:t.defaultStyle;if(i.mode==="math"){let s=i.at(n==="right"?r.after:r.before);return h(s?g(h({},s.style),{variant:"normal"}):{variant:"normal"},t.defaultStyle)}return{}}function Gt(t){let e=t.options.onInsertStyle;if(e===null)return{};e===void 0&&(e=co);let r=t.model,i=t.styleBias,n=r.at(r.position),o=Ih(r,n,i),a=Ih(r,n.rightSibling,i);return e(t,r.position,{before:o,after:a})}function Ih(t,e,r){var i;return!e||e.type==="first"&&r!=="right"?-1:e.type!=="group"?t.offsetOf(e):!e.body||e.body.length<2?-1:((i=e.body)==null?void 0:i.length)===1||r!=="right"?t.offsetOf(e.body[0]):t.offsetOf(e.body[e.body.length-1])}function xi(t){let e=yi(t.model).filter(r=>r.isSuggestion);if(e.length!==0){t.model.position=t.model.offsetOf(e[0].leftSibling);for(let r of e)r.parent.removeChild(r)}}function Vr(t,e){var c;let{model:r}=t;xi(t);for(let u of yi(r))u.isError=!1;if(!r.selectionIsCollapsed||t.options.popoverPolicy==="off"){$r(t);return}let i=[],n=r.at(r.position);for(;n&&n instanceof he&&/^[a-zA-Z\*]$/.test(n.value);)n=n.leftSibling;if(n&&n instanceof he&&n.value==="\\")for(i.push(n),n=n.rightSibling;n&&n instanceof he&&/^[a-zA-Z\*]$/.test(n.value);)i.push(n),n=n.rightSibling;let o=i.map(u=>u.value).join(""),a=qu(t,o);if(a.length===0){if(/^\\[a-zA-Z\*]+$/.test(o))for(let u of i)u.isError=!0;$r(t);return}let s=(c=e==null?void 0:e.atIndex)!=null?c:0;t.suggestionIndex=s<0?a.length-1:s%a.length;let l=a[t.suggestionIndex];if(l!==o){let u=i[i.length-1];u.parent.addChildrenAfter([...l.slice(o.length-l.length)].map(d=>new he(d,{isSuggestion:!0})),u),_t(t,{interactive:!0})}zh(t,a)}function gs(t){let[e,r]=ps(t,{before:t.position});if(e===void 0||r===void 0)return!1;let i=!1;return t.getAtoms([e,r]).forEach(n=>{n.isSuggestion&&(n.isSuggestion=!1,i=!0)}),i}function Qe(t,e="accept",r){var l,c;$r(t);let i=lo(t.model);if(!i)return!1;if(e==="accept-suggestion"||e==="accept-all"){let u=yi(t.model).filter(d=>d.isSuggestion);if(u.length!==0){for(let d of u)d.isSuggestion=!1;t.model.position=t.model.offsetOf(u[u.length-1])}if(e==="accept-suggestion")return u.length!==0}let o=yi(t.model).filter(u=>!u.isSuggestion).map(u=>u.value).join(""),a=i.leftSibling;if(i.parent.removeChild(i),t.model.position=t.model.offsetOf(a),t.switchMode((l=r==null?void 0:r.mode)!=null?l:"math"),e==="reject")return!0;let s=h({},Gt(t));return!/^[a-zA-Z0-9]$/.test(o)&&t.styleBias!=="none"&&(s.variant="normal",s.variantStyle=void 0),H.insert(t.model,o,{selectionMode:(c=r==null?void 0:r.selectItem)!=null&&c?"item":"placeholder",format:"latex",mode:"math",style:s}),t.snapshot(),t.model.announce("replacement"),t.switchMode("math"),!0}function vi(t){var r;let e=document.getElementById(t);return e?e.dataset.refcount=Number(Number.parseInt((r=e.dataset.refcount)!=null?r:"0")+1).toString():(e=document.createElement("div"),e.setAttribute("aria-hidden","true"),e.dataset.refcount="1",e.id=t,document.body.append(e)),e}function qr(t){var i;let e=document.getElementById(t);if(!e)return;let r=Number.parseInt((i=e.getAttribute("data-refcount"))!=null?i:"0");r<=1?e.remove():e.dataset.refcount=Number(r-1).toString()}function Nh(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function Hg(t,e){let r=new P({from:t.context}),i=new x({mode:"math",type:"root",body:be(e,{context:r})}),n=Or(Ht(new w(i.render(r),{classes:"ML__base"}),r));return Br(n,{classes:"ML__latex"}).toMarkup()}function zh(t,e){var n;if(e.length===0){$r(t);return}let r="";for(let[o,a]of e.entries()){let s=a,l=Hg(t,a),c=Ph(t.keybindings,s).join("
");r+=`

  • ${Nh(s)}${l}`,c&&(r+=`${c}`),r+="
  • "}let i=Wg(t,`
      ${r}
    `);Mc()&&((n=i.querySelector(".ML__popover__current"))==null||n.scrollIntoView({block:"nearest",inline:"nearest"})),setTimeout(()=>{var o;i&&!Mc()&&(i.classList.add("is-visible"),yn(t),(o=i.querySelector(".ML__popover__current"))==null||o.scrollIntoView({block:"nearest",inline:"nearest"}))},32)}function Mc(){let t=document.getElementById("mathlive-suggestion-popover");return t?t.classList.contains("is-visible"):!1}function yn(t,e){var d,m,p;if(!t.element||t.element.mathfield!==t||!Mc())return;if(((d=t.model.at(t.model.position))==null?void 0:d.type)!=="latex"){$r(t);return}if(e!=null&&e.deferred){setTimeout(()=>yn(t),32);return}let r=tn(t.field);if(!r)return;let i=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,n=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,o=window.innerWidth-document.documentElement.clientWidth,a=window.innerHeight-document.documentElement.clientHeight,s=(p=(m=window.mathVirtualKeyboard)==null?void 0:m.boundingRect.height)!=null?p:0,l=document.getElementById("mathlive-suggestion-popover");r.x+l.offsetWidth/2>n-o?l.style.left=`${n-l.offsetWidth-o}px`:r.x-l.offsetWidth/2<0?l.style.left="0":l.style.left=`${r.x-l.offsetWidth/2}px`;let c=r.y-r.height;i-a-s-r.yi.preventDefault()),r.addEventListener("click",i=>{let n=i.target;for(;n&&!n.dataset.command;)n=n.parentElement;n&&(Qe(t,"reject"),H.insert(t.model,n.dataset.command,{selectionMode:"placeholder",format:"latex",mode:"math"}),t.dirty=!0,t.focus())}),r.innerHTML=globalThis.MathfieldElement.createHTML(e),r}function Fh(){document.getElementById("mathlive-suggestion-popover")&&(qr("mathlive-suggestion-popover"),ot("suggestion-popover"),ot("core"))}function Ug(){let t=String(new Error().stack).replace(/^Error.*\n/,"").split(` +`);if(t.length===0)return console.error(`Can't use relative paths to specify assets location because the sourcefile location could not be determined (unexpected stack trace format "${new Error().stack}").`),"";let e=t[1],r=e.match(/http.*\.ts[\?:]/);return r&&(e=t[2]),r=e.match(/(https?:.*):[0-9]+:[0-9]+/),r||(r=e.match(/at (.*(\.ts))[\?:]/),r||(r=e.match(/at (.*(\.mjs|\.js))[\?:]/))),r?r[1]:(console.error(t),console.error(`Can't use relative paths to specify assets location because the source file location could not be determined (unexpected location "${e}").`),"")}var mr=null,$h,Vh,wc=((Vh=($h=globalThis==null?void 0:globalThis.document)==null?void 0:$h.currentScript)==null?void 0:Vh.src)||Ug();async function bs(t){if(/^(?:[a-z+]+:)?\/\//i.test(t)){try{return new URL(t).href}catch(e){}if(t.startsWith("//"))try{return new URL(`${window.location.protocol}${t}`).href}catch(e){}return t}if(mr===null)try{let e=await fetch(wc,{method:"HEAD"});e.status===200&&(mr=e.url,mr=mr.replace(/\/\+esm$/,"/"),mr.includes("jsdelivr.net/")&&(mr+="/"))}catch(e){console.error(`Invalid URL "${t}" (relative to "${wc}")`)}return new URL(t,mr!=null?mr:wc).href}function Gg(t,e,r={}){return new FontFace(t,`url(${e}.woff2) format('woff2')`,r)}var Ne="not-loaded";async function qh(){return Ne="not-loaded",hr()}async function hr(){var e;if(Ne!=="not-loaded")return;if(Ne="loading",(e=getComputedStyle(document.documentElement).getPropertyValue("--ML__static-fonts"))!=null?e:!1){Ne="ready";return}if(document.body.classList.remove("ML__fonts-did-not-load"),"fonts"in document){let r=["KaTeX_Main","KaTeX_Math","KaTeX_AMS","KaTeX_Caligraphic","KaTeX_Fraktur","KaTeX_SansSerif","KaTeX_Script","KaTeX_Typewriter","KaTeX_Size1","KaTeX_Size2","KaTeX_Size3","KaTeX_Size4"],i=Array.from(document.fonts).map(a=>a.family);if(r.every(a=>i.includes(a))){Ne="ready";return}if(!globalThis.MathfieldElement.fontsDirectory){Ne="not-loaded";return}let n=await bs(globalThis.MathfieldElement.fontsDirectory);if(!n){document.body.classList.add("ML__fonts-did-not-load"),Ne="error";return}n.endsWith("/")&&(n=n.slice(0,-1));let o=[["KaTeX_Main-Regular"],["KaTeX_Main-BoldItalic",{style:"italic",weight:"bold"}],["KaTeX_Main-Bold",{weight:"bold"}],["KaTeX_Main-Italic",{style:"italic"}],["KaTeX_Math-Italic",{style:"italic"}],["KaTeX_Math-BoldItalic",{style:"italic",weight:"bold"}],["KaTeX_AMS-Regular"],["KaTeX_Caligraphic-Regular"],["KaTeX_Caligraphic-Bold",{weight:"bold"}],["KaTeX_Fraktur-Regular"],["KaTeX_Fraktur-Bold",{weight:"bold"}],["KaTeX_SansSerif-Regular"],["KaTeX_SansSerif-Bold",{weight:"bold"}],["KaTeX_SansSerif-Italic",{style:"italic"}],["KaTeX_Script-Regular"],["KaTeX_Typewriter-Regular"],["KaTeX_Size1-Regular"],["KaTeX_Size2-Regular"],["KaTeX_Size3-Regular"],["KaTeX_Size4-Regular"]].map(a=>Gg(a[0].replace(/-[a-zA-Z]+$/,""),`${n}/${a[0]}`,a[1]));try{(await Promise.all(o.map(s=>{try{return s.load()}catch(l){}}))).forEach(s=>document.fonts.add(s)),Ne="ready";return}catch(a){console.error(`MathLive 0.111.1: The math fonts could not be loaded from "${n}"`,{cause:a}),document.body.classList.add("ML__fonts-did-not-load")}Ne="error"}}function Hh(t,e=0){let r=3735928559^e,i=1103547991^e;for(let n=0;n>>16,2246822507),r^=Math.imul(i^i>>>13,3266489909),i=Math.imul(i^i>>>16,2246822507),i^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&i)+(r>>>0)}function Y(t,e){!t||t.dirty||!t.field||(t.resizeObserver.unobserve(t.field),t.dirty=!0,requestAnimationFrame(()=>{Ye(t)&&t.dirty&&(t.atomBoundsCache=new Map,_t(t,e),t.resizeObserver.observe(t.field),t.resizeObserverStarted=!0)}))}function jg(t,e){var o;e=e!=null?e:{};let r=new P({from:g(h({},t.context),{atomIdsSettings:{seed:e.forHighlighting?Hh(x.serialize([t.model.root],{expandMacro:!1,defaultMode:t.options.defaultMode})):"random",groupNumbers:(o=e.forHighlighting)!=null?o:!1},letterShapeStyle:t.options.letterShapeStyle}),mathstyle:t.options.defaultMode==="inline-math"?"textstyle":"displaystyle"}),i=t.model.root.render(r);return Br(Ht(i,r),{classes:t.hasEditablePrompts?"ML__latex ML__prompting":"ML__latex",attributes:{translate:"no","aria-hidden":"true"}})}function Sc(t,e){try{let{model:r}=t;r.root.caret=void 0,r.root.isSelected=!1,r.root.containsCaret=!0;for(let n of r.atoms)n.caret=void 0,n.isSelected=!1,n.containsCaret=!1;if(r.selectionIsCollapsed){let n=r.at(r.position);n.caret=t.model.mode;let o=n.parent;for(;o;)o.containsCaret=!0,o=o.parent}else{let n=r.getAtoms(r.selection,{includeChildren:!0,includeFirstAtoms:!0});for(let o of n)o.isSelected=!0}return jg(t,e).toMarkup()}catch(r){return console.error(r),''}}function _t(t,e){if(!Ye(t))return;e!=null||(e={});let r=t.element.querySelector("[part=virtual-keyboard-toggle]");r&&(r.style.display=t.hasEditableContent?"":"none");let i=t.field;if(!i)return;let n=t.isSelectionEditable&&t.hasFocus(),o=i.classList.contains("ML__focused");o&&!n?i.classList.remove("ML__focused"):!o&&n&&i.classList.add("ML__focused");let a=Sc(t,e),s=t.element.querySelector("[part=menu-toggle]");if(s){let l=!1;(t.disabled||t.readOnly&&!t.hasEditableContent||t.userSelect==="none")&&(l=!0),!l&&t.element.offsetWidth<50&&(l=!0),s.style.display=l?"none":""}if(t.model.atoms.length<=1){let l=t.options.contentPlaceholder;l&&(a+=`${pe(l)}`)}i.innerHTML=globalThis.MathfieldElement.createHTML(a),uo(t,e.interactive),t.updateToggleLayout(),t.dirty=!1}function uo(t,e){var l;let r=t.field;if(!r)return;for(let c of r.querySelectorAll(".ML__selection, .ML__contains-highlight"))c.remove();if(!(e!=null&&e)&&Ne!=="error"&&Ne!=="ready"){setTimeout(()=>{Ne==="ready"?uo(t):setTimeout(()=>uo(t),128)},32);return}let i=t.model;(l=t.atomBoundsCache)==null||l.clear();let n,o=()=>{if(n!==void 0)return n;let c=r.offsetWidth,u=r.getBoundingClientRect().width;return n=Math.floor(u)/c,isNaN(n)&&(n=1),n};if(i.selectionIsCollapsed){yn(t,{deferred:!0});let c=i.at(i.position);for(;c&&c.type!=="prompt"&&!(c.containsCaret&&c.displayContainsHighlight);)c=c.parent;if(c!=null&&c.containsCaret&&c.displayContainsHighlight){let u=o(),d=hc(t,ar(t,c),u);if(d){d.left/=u,d.right/=u,d.top/=u,d.bottom/=u;let m=document.createElement("div");m.classList.add("ML__contains-highlight"),m.style.position="absolute",m.style.left=`${d.left+1}px`,m.style.top=`${Math.ceil(d.top)}px`,m.style.width=`${Math.ceil(d.right-d.left)}px`,m.style.height=`${Math.ceil(d.bottom-d.top)}px`,r.insertBefore(m,r.childNodes[0])}}return}let a=o(),s=Jg(Qa(t,{excludeAtomsWithBackground:!0}));for(let c of s){c.left/=a,c.right/=a,c.top/=a,c.bottom/=a;let u=document.createElement("div");u.classList.add("ML__selection"),u.style.position="absolute",u.style.left=`${c.left}px`,u.style.top=`${c.top}px`,u.style.width=`${Math.ceil(c.right-c.left)}px`,u.style.height=`${Math.max(1,Math.ceil(c.bottom-c.top-1))}px`,r.insertBefore(u,r.childNodes[0])}}function Jg(t){let e=[];for(let r of t){let i=!1;for(let n of e)if(r.left===n.left&&r.right===n.right&&r.top===n.top&&r.bottom===n.bottom){i=!0;break}i||e.push(r)}t=e,e=[];for(let r of t){let i=0;for(let n of t)if(r.left>=n.left&&r.right<=n.right&&r.top>=n.top&&r.bottom<=n.bottom&&(i+=1,i>1))break;i===1&&e.push(r)}return e}function kc(t){if(!t)return;let e=t.model,r=e.selection,i=x.serialize([e.root],{expandMacro:!1,defaultMode:t.options.defaultMode});H.insert(e,i,{insertionMode:"replaceAll",selectionMode:"after",format:"latex",silenceNotifications:!0,mode:"math"});let n=e.silenceNotifications;e.silenceNotifications=!0,e.selection=r,e.silenceNotifications=n,Y(t)}function Lc(){for(let t of document.querySelectorAll(".ML__mathfield"))"_mathfield"in t&&kc(t._mathfield)}var mo=3,Mt;function fe(t,e){e=h({target:"mathfield",canUndo:!1,audioFeedback:void 0,changeContent:!1,changeSelection:!1},e!=null?e:{}),Mt||(Mt={});for(let r of Object.keys(t))Mt[r],Mt[r]=g(h({},e),{fn:t[r]})}function Ac(t){let e;if(Array.isArray(t)){if(t[0]==="performWithFeedback")return Ac(t[1]);e=t[0]}else e=t;return Mt[e]}function pr(t){var e;return(e=Ac(t))==null?void 0:e.target}function Wh(t,e){var l,c;if(e=_i(e),!e)return!1;let r,i=[],n=!1,o=!1;ee(e)?(r=e[0],i=e.slice(1)):r=e;let a=Mt[r],s=a==null?void 0:a.target;if(s==="model"){if(!t.isSelectionEditable&&(a!=null&&a.changeContent))return t.model.announce("plonk"),!1;/^(delete|add)/.test(r)&&(r!=="deleteBackward"&&t.flushInlineShortcutBuffer(),t.snapshot(r)),/^complete/.test(r)||xi(t),Mt[r].fn(t.model,...i),Vr(t),o=!0,n=!0}else if(s==="virtual-keyboard")o=(c=(l=window.mathVirtualKeyboard)==null?void 0:l.executeCommand(e))!=null?c:!1,n=!0;else if(Mt[r]){if(!t.isSelectionEditable&&(a!=null&&a.changeContent))return t.model.announce("plonk"),!1;/^(undo|redo)/.test(r)&&t.flushInlineShortcutBuffer(),o=Mt[r].fn(t,...i),n=!0}else throw new Error(`Unknown command "${r}"`);return s!=="virtual-keyboard"&&(!t.model.selectionIsCollapsed||a!=null&&a.changeSelection&&r!=="deleteBackward")&&(t.flushInlineShortcutBuffer(),a!=null&&a.changeContent||t.stopCoalescingUndo(),t.defaultStyle={}),o&&(a!=null&&a.changeSelection&&n?(t.dirty=!0,t.scrollIntoView()):Y(t)),n}function Xg(t,e){var n;if(!t)return!1;t.focus(),xn.keypressVibration&&Di()&&navigator.vibrate(mo);let r=Ac(e);globalThis.MathfieldElement.playSound((n=r==null?void 0:r.audioFeedback)!=null?n:"keypress");let i=t.executeCommand(e);return t.scrollIntoView(),i}fe({performWithFeedback:(t,e)=>Xg(t,e)});function Zg(t){return Vr(t,{atIndex:t.suggestionIndex+1}),!1}function Yg(t){return Vr(t,{atIndex:t.suggestionIndex-1}),!1}fe({complete:Qe},{target:"mathfield",audioFeedback:"return",canUndo:!0,changeContent:!0,changeSelection:!0});fe({dispatchEvent:(t,e,r)=>{var i,n;return(n=(i=t.host)==null?void 0:i.dispatchEvent(new CustomEvent(e,{detail:r})))!=null?n:!1}},{target:"mathfield"});fe({nextSuggestion:Zg,previousSuggestion:Yg},{target:"mathfield",audioFeedback:"keypress",changeSelection:!0});function _i(t){if(!t)return;if(ee(t)&&t.length>0){let i=t[0];return i=i.replace(/-\w/g,n=>n[1].toUpperCase()),i==="performWithFeedback"&&t.length===2?[i,_i(t[1])]:[i,...t.slice(1)]}if(typeof t!="string")return;let e=t.trim().match(/^([a-zA-Z0-9-]+)\((.*)\)$/);if(e){let i=e[1].replace(/-\w/g,o=>o[1].toUpperCase()),n=e[2].split(",").map(o=>o.trim());return[i,...n.map(o=>{if(/"[^"]*"/.test(o)||/'[^']*'/.test(o))return o.slice(1,-1);if(/^true$/.test(o))return!0;if(/^false$/.test(o))return!1;if(/^[-]?\d+$/.test(o))return parseInt(o,10);if(/^\{.*\}$/.test(o))try{return JSON.parse(o)}catch(a){return console.error("Invalid argument:",o),o}return _i(o)})]}return t.replace(/-\w/g,i=>i[1].toUpperCase())}var po="mathlive#virtual-keyboard-message";function fo(t){var r;return t.type!=="message"?!1:((r=t.data)==null?void 0:r.type)===po}var ho=class t{constructor(){this.targetOrigin=window.origin;this.originValidator="none";this.targetWindow=window.top;this._boundingRect=new DOMRect(0,0,0,0);this._isShifted=!1;window.addEventListener("message",this),this.sendMessage("proxy-created"),this.listeners={}}static get singleton(){return this._singleton||(this._singleton=new t),this._singleton}getKeycap(e){}setKeycap(e,r){this.sendMessage("update-setting",{setKeycap:{keycap:e,value:r}})}set alphabeticLayout(e){this.sendMessage("update-setting",{alphabeticLayout:e})}set layouts(e){this.sendMessage("update-setting",{layouts:e})}get normalizedLayouts(){return[]}set editToolbar(e){this.sendMessage("update-setting",{editToolbar:e})}set container(e){throw new Error("Container inside an iframe cannot be changed")}show(e){this.dispatchEvent(new CustomEvent("before-virtual-keyboard-toggle",{detail:{visible:!0},bubbles:!0,cancelable:!0,composed:!0}))&&(this.sendMessage("show",e),this.dispatchEvent(new Event("virtual-keyboard-toggle")))}hide(e){this.dispatchEvent(new CustomEvent("before-virtual-keyboard-toggle",{detail:{visible:!1},bubbles:!0,cancelable:!0,composed:!0}))&&(this.sendMessage("hide",e),this.dispatchEvent(new Event("virtual-keyboard-toggle")))}get isShifted(){return this._isShifted}get visible(){return this._boundingRect.height>0}set visible(e){e?this.show():this.hide()}get boundingRect(){return this._boundingRect}executeCommand(e){return this.sendMessage("execute-command",{command:e}),!0}updateToolbar(e){this.sendMessage("update-toolbar",e)}update(e){this.sendMessage("update-setting",e)}connect(){this.sendMessage("connect")}disconnect(){this.sendMessage("disconnect")}addEventListener(e,r,i){this.listeners[e]||(this.listeners[e]=new Set),this.listeners[e].has(r)||this.listeners[e].add(r)}dispatchEvent(e){return!this.listeners[e.type]||this.listeners[e.type].size===0?!0:(this.listeners[e.type].forEach(r=>{typeof r=="function"?r(e):r==null||r.handleEvent(e)}),!e.defaultPrevented)}removeEventListener(e,r,i){this.listeners[e]&&this.listeners[e].delete(r)}handleEvent(e){if(fo(e)){if(!rn(e.origin,this.originValidator))throw new DOMException(`Message from unknown origin (${e.origin}) cannot be handled`,"SecurityError");this.handleMessage(e.data)}}handleMessage(e){let{action:r}=e;if(r==="execute-command"){let{command:i}=e;pr(i)==="virtual-keyboard"&&this.executeCommand(i);return}if(r==="synchronize-proxy"){this._boundingRect=e.boundingRect,this._isShifted=e.isShifted;return}if(r==="geometry-changed"){this._boundingRect=e.boundingRect,this.dispatchEvent(new Event("geometrychange"));return}}sendMessage(e,r={}){if(!this.targetWindow)throw new DOMException("A frame does not have access to the top window and can't communicate with the keyboard.","SecurityError");this.targetWindow.postMessage(h({type:po,action:e},r),this.targetOrigin)}};var Cc={numeric:{label:"123",labelClass:"MLK__tex-math",tooltip:"keyboard.tooltip.numeric",rows:[[{latex:"x",shift:"y",variants:["y","z","t","r","x^2","x^n","x^{#?}","x_n","x_i","x_{#?}",{latex:"f(#?)",class:"small"},{latex:"g(#?)",class:"small"}]},{latex:"n",shift:"a",variants:["i","j","p","k","a","u"]},"[separator-5]","[7]","[8]","[9]","[/]","[separator-5]",{latex:"\\exponentialE",shift:"\\ln",variants:["\\exp","\\times 10^{#?}","\\ln","\\log_{10}","\\log","\\lg","\\operatorname{lb}"]},{latex:"\\imaginaryI",variants:["\\Re","\\Im","\\imaginaryJ","\\Vert #0 \\Vert"]},{latex:"\\pi",shift:"\\sin",variants:["\\prod",{latex:"\\theta",aside:"theta"},{latex:"\\rho",aside:"rho"},{latex:"\\tau",aside:"tau"},"\\sin","\\cos","\\tan"]}],[{label:"<",latex:"<",class:"hide-shift",shift:{latex:"\\le",label:"\u2264"}},{label:">",latex:">",class:"hide-shift",shift:{latex:"\\ge",label:"\u2265"}},"[separator-5]","[4]","[5]","[6]","[*]","[separator-5]",{class:"hide-shift",latex:"#@^2}",shift:"#@^{\\prime}}"},{latex:"#@^{#0}}",class:"hide-shift",shift:"#@_{#?}"},{class:"hide-shift",latex:"\\sqrt{#0}",shift:{latex:"\\sqrt[#0]{#?}}"}}],["[(]","[)]","[separator-5]","[1]","[2]","[3]","[-]","[separator-5]",{latex:"\\int^{\\infty}_{0}\\!#?\\,\\mathrm{d}x",class:"small hide-shift",shift:"\\int",variants:[{latex:"\\int_{#?}^{#?}",class:"small"},{latex:"\\int",class:"small"},{latex:"\\iint",class:"small"},{latex:"\\iiint",class:"small"},{latex:"\\oint",class:"small"},"\\mathrm{d}x",{latex:"\\dfrac{\\mathrm{d}}{\\mathrm{d} x}",class:"small"},{latex:"\\frac{\\partial}{\\partial x}",class:"small"},"\\partial"]},{class:"hide-shift",latex:"\\forall",shift:"\\exists"},{label:"[backspace]",width:1}],[{label:"[shift]",width:2},"[separator-5]","[0]","[.]","[=]","[+]","[separator-5]","[left]","[right]",{label:"[action]",width:1}]]},greek:{label:"αβγ",labelClass:"MLK__tex-math",tooltip:"keyboard.tooltip.greek",rows:[[{label:"φ",class:"MLK__tex hide-shift",insert:"\\varphi",aside:"phi var.",shift:"\\Phi"},{label:"ς",class:"MLK__tex hide-shift",insert:"\\varsigma",aside:"sigma var.",shift:"\\Sigma"},{label:"ϵ",class:"MLK__tex hide-shift",insert:"\\epsilon",aside:"epsilon",shift:'\\char"0190'},{label:"ρ",class:"MLK__tex hide-shift",insert:"\\rho",aside:"rho",shift:'\\char"3A1'},{label:"τ",class:"MLK__tex hide-shift",insert:"\\tau",aside:"tau",shift:'\\char"3A4'},{label:"υ",class:"MLK__tex hide-shift",insert:"\\upsilon",aside:"upsilon",shift:"\\Upsilon"},{label:"θ",class:"MLK__tex hide-shift",insert:"\\theta",aside:"theta",shift:"\\Theta"},{label:"ι",class:"MLK__tex hide-shift",insert:"\\iota",aside:"iota",shift:'\\char"399'},{label:"ο",class:"MLK__tex hide-shift",insert:"\\omicron",aside:"omicron",shift:'\\char"39F'},{label:"π",class:"MLK__tex hide-shift",insert:"\\pi",aside:"pi",shift:"\\Pi"}],["[separator-5]",{label:"α",class:"MLK__tex hide-shift",insert:"\\alpha",aside:"alpha",shift:'\\char"391'},{label:"σ",class:"MLK__tex hide-shift",insert:"\\sigma",aside:"sigma",shift:"\\Sigma"},{label:"δ",class:"MLK__tex hide-shift",insert:"\\delta",aside:"delta",shift:"\\Delta"},{latex:"\\phi",class:"MLK__tex hide-shift",insert:"\\phi",aside:"phi",shift:"\\Phi"},{label:"γ",class:"MLK__tex hide-shift",insert:"\\gamma",aside:"gamma",shift:"\\Gamma"},{label:"η",class:"MLK__tex hide-shift",insert:"\\eta",aside:"eta",shift:'\\char"397'},{label:"ξ",class:"MLK__tex hide-shift",insert:"\\xi",aside:"xi",shift:"\\Xi"},{label:"κ",class:"MLK__tex hide-shift",insert:"\\kappa",aside:"kappa",shift:"\\Kappa"},{label:"λ",class:"MLK__tex hide-shift",insert:"\\lambda",aside:"lambda",shift:"\\Lambda"},"[separator-5]"],["[shift]",{label:"ζ",class:"MLK__tex hide-shift",insert:"\\zeta",aside:"zeta",shift:'\\char"396'},{label:"χ",class:"MLK__tex hide-shift",insert:"\\chi",aside:"chi",shift:'\\char"3A7'},{label:"ψ",class:"MLK__tex hide-shift",insert:"\\psi",aside:"psi",shift:"\\Psi"},{label:"ω",class:"MLK__tex hide-shift",insert:"\\omega",aside:"omega",shift:"\\Omega"},{label:"β",class:"MLK__tex hide-shift",insert:"\\beta",aside:"beta",shift:'\\char"392'},{label:"ν",class:"MLK__tex hide-shift",insert:"\\nu",aside:"nu",shift:'\\char"39D'},{label:"μ",class:"MLK__tex hide-shift",insert:"\\mu",aside:"mu",shift:'\\char"39C'},"[backspace]"],["[separator]",{label:"ε",class:"MLK__tex",insert:"\\varepsilon",aside:"epsilon var."},{label:"ϑ",class:"MLK__tex",insert:"\\vartheta",aside:"theta var."},{label:"ϰ",class:"MLK__tex",insert:"\\varkappa",aside:"kappa var."},{label:"ϖ",class:"MLK__tex",insert:"\\varpi",aside:"pi var."},{label:"ϱ",class:"MLK__tex",insert:"\\varrho",aside:"rho var."},"[left]","[right]","[action]"]]},symbols:{label:"∞\u2260\u2208",labelClass:"MLK__tex",tooltip:"keyboard.tooltip.symbols",rows:[[{latex:"\\sin",shift:"\\sin^{-1}",variants:[{class:"small",latex:"\\sinh"},{class:"small",latex:"\\sin^{-1}"},{class:"small",latex:"\\operatorname{arsinh}"}]},"\\ln",{latex:"\\mathrm{abs}",insert:"\\mathrm{abs}\\left(#0\\right)"},{latex:"\\rightarrow",shift:"\\Rightarrow",variants:[{latex:"\\implies",aside:"implies"},{latex:"\\to",aside:"to"},"\\dashv",{latex:"\\roundimplies",aside:"round implies"}]},{latex:"\\exists",variants:["\\nexists"],shift:"\\nexists"},{latex:"\\in",shift:"\\notin",variants:["\\notin","\\owns"]},"\\cup",{latex:"\\overrightarrow{#@}",shift:"\\overleftarrow{#@}",variants:["\\overleftarrow{#@}","\\bar{#@}","\\vec{#@}","\\hat{#@}","\\check{#@}","\\dot{#@}","\\ddot{#@}","\\mathring{#@}","\\breve{#@}","\\acute{#@}","\\tilde{#@}","\\grave{#@}"]},{class:"small hide-shift",latex:"\\lim_{#?}",shift:"\\lim_{x\\to\\infty}",variants:[{class:"small",latex:"\\liminf_{#?}"},{class:"small",latex:"\\limsup_{#?}"}]},"\\exponentialE"],[{latex:"\\cos",shift:"\\cos^{-1}",variants:[{class:"small",latex:"\\cosh"},{class:"small",latex:"\\cos^{-1}"},{class:"small",latex:"\\operatorname{arcosh}"}]},{latex:"\\log",shift:"\\log_{10}",variants:["\\log_{#0}","\\log_{10}"]},"\\left\\vert#0\\right\\vert",{latex:"\\larr",shift:"\\lArr",variants:[{latex:"\\impliedby",aside:"implied by"},{latex:"\\gets",aside:"gets"},"\\lArr","\\vdash",{latex:"\\models",aside:"models"}]},{latex:"\\forall",shift:"\\lnot",variants:[{latex:"\\land",aside:"and"},{latex:"\\lor",aside:"or"},{latex:"\\oplus",aside:"xor"},{latex:"\\lnot",aside:"not"},{latex:"\\downarrow",aside:"nor"},{latex:"\\uparrow",aside:"nand"},{latex:"\\curlywedge",aside:"nor"},{latex:"\\bar\\curlywedge",aside:"nand"}]},{latex:"\\ni",shift:"\\not\\owns"},"\\cap",{latex:"\\overline{#@}",shift:"\\underline{#@}",variants:["\\overbrace{#@}","\\overlinesegment{#@}","\\overleftrightarrow{#@}","\\overrightarrow{#@}","\\overleftarrow{#@}","\\overgroup{#@}","\\underbrace{#@}","\\underlinesegment{#@}","\\underleftrightarrow{#@}","\\underrightarrow{#@}","\\underleftarrow{#@}","\\undergroup{#@}"]},{class:"hide-shift small",latex:"\\int",shift:"\\iint",variants:[{latex:"\\int_{#?}^{#?}",class:"small"},{latex:"\\int",class:"small"},{latex:"\\smallint",class:"small"},{latex:"\\iint",class:"small"},{latex:"\\iiint",class:"small"},{latex:"\\oint",class:"small"},"\\intop","\\iiint","\\oiint","\\oiiint","\\intclockwise","\\varointclockwise","\\ointctrclockwise","\\intctrclockwise"]},{latex:"\\pi",shift:"\\tau",variants:["\\tau"]}],[{latex:"\\tan",shift:"\\tan^{-1}",variants:[{class:"small",latex:"\\tanh"},{class:"small",latex:"\\tan^{-1}"},{class:"small",latex:"\\operatorname{artanh}"},{class:"small",latex:"\\arctan"},{class:"small",latex:"\\operatorname{arctg}"},{class:"small",latex:"\\operatorname{tg}"}]},{latex:"\\exp",insert:"\\exp\\left(#0\\right)",variants:["\\exponentialE^{#0}"]},"\\left\\Vert#0\\right\\Vert",{latex:"\\lrArr",shift:"\\leftrightarrow",variants:[{latex:"\\iff",aside:"if and only if"},"\\leftrightarrow","\\leftrightarrows","\\Leftrightarrow",{latex:"^\\biconditional",aside:"biconditional"}]},{latex:"\\vert",shift:"!"},{latex:"#@^{\\complement}",aside:"complement",variants:[{latex:"\\setminus",aside:"set minus"},{latex:"\\smallsetminus",aside:"small set minus"}]},{latex:"\\subset",shift:"\\subseteq",variants:["\\subset","\\subseteq","\\subsetneq","\\varsubsetneq","\\subsetneqq","\\nsubset","\\nsubseteq","\\supset","\\supseteq","\\supsetneq","\\supsetneqq","\\nsupset","\\nsupseteq"]},{latex:"#@^{\\prime}",shift:"#@^{\\doubleprime}",variants:["#@^{\\doubleprime}","#@\\degree"]},{latex:"\\mathrm{d}",shift:"\\partial",variants:["\\mathrm{d}x",{latex:"\\dfrac{\\mathrm{d}}{\\mathrm{d} x}",class:"small"},{latex:"\\frac{\\partial}{\\partial x}",class:"small"},"\\partial"]},{latex:"\\infty",variants:["\\aleph_0","\\aleph_1","\\omega","\\mathfrak{m}"]}],[{label:"[shift]",width:2},{class:"box",latex:",",shift:";",variants:[";","?"]},{class:"box",latex:"\\colon",shift:"\\Colon",variants:[{latex:"\\Colon",aside:"such that",class:"box"},{latex:":",aside:"ratio",class:"box"},{latex:"\\vdots",aside:"",class:"box"},{latex:"\\ddots",aside:"",class:"box"},{latex:"\\ldotp",aside:"low dot",class:"box"},{latex:"\\cdotp",aside:"center dot",class:"box"},{latex:"\\ldots",aside:"low ellipsis",class:"box"},{latex:"\\cdots",aside:"center ellipsis",class:"box"},{latex:"\\therefore",aside:"therefore",class:"box"},{latex:"\\because",aside:"because",class:"box"}]},{class:"box",latex:"\\cdot",aside:"centered dot",shift:"\\ast",variants:["\\circ","\\bigcirc","\\bullet","\\odot","\\oslash","\\circledcirc","\\ast","\\star","\\times","\\doteq","\\doteqdot"]},"[separator]","[left]","[right]",{label:"[backspace]",width:1,class:"action hide-shift"},{label:"[action]",width:1}]]},compact:{label:"compact",rows:[["[+]","[-]","[*]","[/]","[=]","[.]","[(]","[)]","\\sqrt{#0}","#@^{#?}"],["[1]","[2]","[3]","[4]","[5]","[6]","[7]","[8]","[9]","[0]"],["[hr]"],["[undo]","[redo]","[separator]","[separator]","[separator]","[left]","[right]",{label:"[backspace]",class:"action hide-shift"},"[hide-keyboard]"]]},minimalist:{label:"minimalist",layers:[{style:` + div.minimalist-backdrop { + display: flex; + justify-content: center; + } + div.minimalist-container { + --keycap-height: 40px; + --keycap-max-width: 53px; + --keycap-small-font-size: 12px; + background: var(--keyboard-background); + padding: 20px 20px 0px 20px; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + border: 1px solid var(--keyboard-border); + box-shadow: 0 0 32px rgb(0 0 0 / 30%); + } + `,backdrop:"minimalist-backdrop",container:"minimalist-container",rows:[["+","-","\\times",{latex:"\\frac{#@}{#0}",class:"small"},"=","[.]","(",")",{latex:"\\sqrt{#0}",class:"small"},{latex:"#@^{#?}",class:"small"}],["1","2","3","4","5","6","7","8","9","0"],["[hr]"],["[undo]","[redo]","[separator]","[separator]","[separator]","[left]","[right]",{label:"[backspace]",class:"action hide-shift"},"[hide-keyboard]"]]}]},"numeric-only":{label:"123",labelClass:"MLK__tex-math",tooltip:"keyboard.tooltip.numeric",id:"numeric-only",rows:[["7","8","9","[separator]",{label:"[backspace]",width:2}],["4","5","6","[separator]","[separator]","[separator]"],["1","2","3","[separator]","[separator]","[separator]"],["0",{label:"[.]",variants:[]},"-","[separator]","[left]","[right]"]]}};var ys={0:["\\varnothing","\\infty"],1:["\\frac{1}{#@}","#@^{-1}","\\times 10^{#?}","\\phi","\\imaginaryI"],2:["\\frac{1}{2}","#@^2","\\sqrt2","\\exponentialE"],3:["\\frac{1}{3}","#@^3","\\sqrt3","\\pi"],4:["\\frac{1}{4}","#@^4"],5:["\\frac{1}{5}","#@^5","\\sqrt5"],6:["\\frac{1}{6}","#@^6"],7:["\\frac{1}{7}","#@^7"],8:["\\frac{1}{8}","#@^8"],9:["\\frac{1}{9}","#@^9"],".":[".",",",";","\\colon"],",":["{,}",".",";","\\colon"],a:[{latex:"\\aleph",aside:"aleph"},{latex:"\\forall",aside:"for all"},"\xE5","\xE0","\xE1","\xE2","\xE4","\xE6"],A:[{latex:"\\aleph",aside:"aleph"},{latex:"\\forall",aside:"for all"},"\xC5","\xC0","\xC1","\xC2","\xC4","\xC6"],b:[{latex:"\\beth",aside:"beth"}],c:[{latex:"\\C",aside:"set of complex numbers"},"\xE7"],d:[{latex:"\\daleth",aside:"daleth"}],e:[{latex:"\\exponentialE",aside:"exponential e"},{latex:"\\exists",aside:"there is"},{latex:"\\nexists",aside:"there isn\u2019t"},"\xE8","\xE9","\xEA","\xEB"],E:[{latex:"\\exponentialE",aside:"exponential e"},{latex:"\\exists",aside:"there is"},{latex:"\\nexists",aside:"there isn\u2019t"},"\xC8","\xC9","\xCA","\xCB"],g:[{latex:"\\gimel",aside:"gimel"}],h:[{latex:"\\hbar",aside:"h bar"},{latex:"\\hslash",aside:"h slash"}],i:[{latex:"\\imaginaryI",aside:"imaginary i"},"\xEC","\xED","\xEE","\xEF"],I:[{latex:"\\imaginaryI",aside:"imaginary i"},"\xCC","\xCD","\xCE","\xCF"],j:[{latex:"\\imaginaryJ",aside:"imaginary j"}],l:[{latex:"\\ell",aside:"ell"}],n:[{latex:"\\mathbb{N}",aside:"set of natural numbers"},"\xF1"],o:["\xF8","\u0153","\xF2","\xF3","\xF4","\xF6"],O:["\xF8","\u0152","\xD2","\xD3","\xD4","\xD6"],p:[{latex:"\\mathbb{P}",aside:"set of primes"}],q:[{latex:"\\mathbb{Q}",aside:"set of rational numbers"}],r:[{latex:"\\mathbb{R}",aside:"set of real numbers"}],u:["\xF9","\xFA","\xFB","\xFC"],U:["\xD9","\xDA","\xDB","\xDC"],z:[{latex:"\\mathbb{Z}",aside:"set of integers"}],y:["\xFD","\xFF"],Y:["\u0178"],space:[{latex:'\\char"203A\\!\\char"2039',insert:"\\!",aside:"negative thin space
    \u207B\xB3\u29F8\u2081\u2088 em"},{latex:'\\char"203A\\,\\char"2039',insert:"\\,",aside:"thin space
    \xB3\u29F8\u2081\u2088 em"},{latex:'\\char"203A\\:\\char"2039',insert:"\\:",aside:"medium space
    \u2074\u29F8\u2081\u2088 em"},{latex:'\\char"203A\\;\\char"2039',insert:"\\;",aside:"thick space
    \u2075\u29F8\u2081\u2088 em"},{latex:'\\char"203A\\ \\char"2039',insert:"\\ ",aside:"\u2153 em"},{latex:'\\char"203A\\enspace\\char"2039',insert:"\\enspace",aside:"\xBD em"},{latex:'\\char"203A\\quad\\char"2039',insert:"\\quad",aside:"1 em"},{latex:'\\char"203A\\qquad\\char"2039',insert:"\\qquad",aside:"2 em"}]},vn;function xs(t,e){var m,p,f,y,v;let r=Fe.singleton;if(!r)return;let i=Mi(t),n="";if(window.mathVirtualKeyboard.isShifted){let b=(m=r.getKeycap(i==null?void 0:i.id))==null?void 0:m.shift;typeof b=="object"&&"variants"in b&&(n=(p=b.variants)!=null?p:"")}else n=(y=(f=r.getKeycap(i==null?void 0:i.id))==null?void 0:f.variants)!=null?y:"";if(typeof n=="string"&&!vs(n)||Array.isArray(n)&&n.length===0){e==null||e();return}let o={},a="";for(let b of eb(n)){let k=go(b),S=Date.now().toString(36).slice(-2)+Math.floor(Math.random()*1e5).toString(36);o[S]=k;let[A,E]=_n(k);a+=`
    ${A}
    `}let s=document.createElement("div");s.setAttribute("aria-hidden","true"),s.className="MLK__variant-panel",s.style.height="auto";let l=Object.keys(o).length,c=5;l===1?c=1:l===2||l===4?c=2:l===3||l===5||l===6?c=3:l>=7&&l<14&&(c=4),s.style.width=`calc(var(--variant-keycap-length) * ${c} + 12px)`,s.innerHTML=xn.createHTML(a),Te.open({root:(v=r==null?void 0:r.container)==null?void 0:v.querySelector(".ML__keyboard"),child:s}),vn=new AbortController;let{signal:u}=vn,d=t==null?void 0:t.getBoundingClientRect();if(d){d.top-s.clientHeight<0&&(s.style.width="auto",l<=6?s.style.height="56px":l<=12?s.style.height="108px":l<=18?s.style.height="205px":s.classList.add("compact"));let b=Math.max(0,Math.min(window.innerWidth-s.offsetWidth,(d.left+d.right-s.offsetWidth)/2)),k=d.top-s.clientHeight+5;s.style.left=`${b}px`,s.style.top=`${k}px`,s.classList.add("is-visible"),requestAnimationFrame(()=>{var S;s.addEventListener("pointerup",A=>{let E=Mi(A.target);!(E!=null&&E.id)||!o[E.id]||(_s(o[E.id]),Hr(),e==null||e(),A.preventDefault())},{capture:!0,passive:!1,signal:u}),s.addEventListener("pointerenter",A=>{let E=Mi(A.target);!(E!=null&&E.id)||!o[E.id]||E.classList.add("is-active")},{capture:!0,signal:u}),s.addEventListener("pointerleave",A=>{let E=Mi(A.target);A.target&&"tagName"in A.target&&typeof A.target.tagName=="string"&&A.target.tagName.toUpperCase()==="ASIDE"||!(E!=null&&E.id)||!o[E.id]||E.classList.remove("is-active")},{capture:!0,signal:u}),(S=r.getKeycap(i==null?void 0:i.id))!=null&&S.stickyVariantPanel?window.addEventListener("pointerdown",A=>{if(!(A.target instanceof Node))return;let E=s.contains(A.target);A.target===s||E||(Hr(),e==null||e())},{signal:u}):(window.addEventListener("pointercancel",()=>{Hr(),e==null||e()},{signal:u}),window.addEventListener("pointerup",()=>{Hr(),e==null||e()},{signal:u}))})}}function Hr(){vn==null||vn.abort(),vn=null,Te.state==="open"&&Te.close()}function Qg(t){if(t==="foreground-color"){let e=[];for(let r of Object.keys(er))e.push({class:"swatch-button",label:'',command:["applyStyle",{color:r}]});return e}if(t==="background-color"){let e=[];for(let r of Object.keys(Qt))e.push({class:"swatch-button",label:'',command:["applyStyle",{backgroundColor:r}]});return e}}function vs(t){return ys[t]!==void 0}function eb(t){var e;return typeof t!="string"?t:(ys[t]||(ys[t]=(e=Qg(t))!=null?e:[]),ys[t])}function tb(t){return typeof t=="string"?t:Object.entries(t).map(([e,r])=>`${e}:${r} !important`).join(";")}function rb(t){return Object.keys(t).map(e=>`${e} {${tb(t[e])}}`).join("")}function bo(t){if(!t)return"";let e=new P,r=new x({mode:"math",type:"root",body:be(t,{context:e,args:n=>n==="@"?"{\\class{ML__box-placeholder}{\\blacksquare}}":"\\placeholder{}"})}),i=Or(Ht(new w(r.render(e),{classes:"ML__base"}),e));return Br(i,{classes:"ML__latex"}).toMarkup()}function Ms(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function ib(t){return t.replace(/<\/?[^>]+(>|$)/g," ")}function nb(t){var i,n,o,a;let e=(a=(o=(n=(i=t.tooltip)!=null?i:typeof t.label=="string"?ib(t.label):void 0)!=null?n:t.insert)!=null?o:t.latex)!=null?a:t.key;return e&&e.replace(/\s+/g," ").trim()||null}function ob(t){if(typeof t=="undefined"||t===null)return null;try{return JSON.stringify(t)}catch(e){return null}}function ab(t){var r,i;let e=(i=(r=t.insert)!=null?r:t.latex)!=null?i:t.key;return e!=null?e:null}function yo(t){var r;if(Array.isArray(t))return t.map(i=>yo(i)).flat();let e=typeof t=="string"?{markup:t}:t;return"rows"in e&&Array.isArray(e.rows)&&(e.rows=e.rows.map(i=>i.map(n=>go(n)))),(r=e.id)!=null||(e.id="ML__layer_"+Date.now().toString(36).slice(-2)+Math.floor(Math.random()*1e5).toString(36)),[e]}function sb(){var o,a;let e=window.mathVirtualKeyboard.alphabeticLayout;if(e==="auto"){let s=yr();s&&(e=s.virtualLayout),(!e||e==="auto")&&(e=(o={fr:"azerty",be:"azerty",al:"qwertz",ba:"qwertz",cz:"qwertz",de:"qwertz",hu:"qwertz",sk:"qwertz",ch:"qwertz"}[F.locale.slice(0,2)])!=null?o:"qwerty")}let r={qwerty:["qwertyuiop"," asdfghjkl ","^zxcvbnm~"],azerty:["azertyuiop","qsdfghjklm","^ wxcvbn ~"],qwertz:["qwertzuiop"," asdfghjkl ","^yxcvbnm~"],dvorak:["^ pyfgcrl ","aoeuidhtns","qjkxbmwvz~"],colemak:[" qwfpgjluy ","arstdhneio","^zxcvbkm~"]},i=(a=r[e])!=null?a:r.qwerty,n=e==="azerty"?[[{label:"1",variants:"1"},{label:"2",shift:{latex:"\xE9"},variants:"2"},{label:"3",shift:{latex:"\xF9"},variants:"3"},{label:"4",variants:"4"},{label:"5",shift:{label:"(",latex:"("},variants:"5"},{label:"6",shift:{label:")",latex:")"},variants:"6"},{label:"7",shift:{latex:"\xE8"},variants:"7"},{label:"8",shift:{latex:"\xEA"},variants:"8"},{label:"9",shift:{latex:"\xE7"},variants:"9"},{label:"0",shift:{latex:"\xE0"},variants:"0"}]]:[[{label:"1",variants:"1"},{label:"2",variants:"2"},{label:"3",variants:"3"},{label:"4",variants:"4"},{label:"5",shift:{latex:"\\frac{#@}{#?}"},variants:"5"},{label:"6",shift:{latex:"#@^#?"},variants:"6"},{label:"7",variants:"7"},{label:"8",shift:{latex:"\\times"},variants:"8"},{label:"9",shift:{label:"(",latex:"("},variants:"9"},{label:"0",shift:{label:")",latex:")"},variants:"0"}]];for(let s of i){let l=[];for(let c of s)/[a-z]/.test(c)?l.push({label:c,class:"hide-shift",shift:{label:c.toUpperCase(),variants:vs(c.toUpperCase())?c.toUpperCase():void 0},variants:vs(c)?c:void 0}):c==="~"?e!=="dvorak"?l.push("[backspace]"):l.push({label:"[backspace]",width:1}):c==="^"?l.push("[shift]"):c===" "&&l.push("[separator-5]");n.push(l)}return n.push(["[-]","[+]","[=]",{label:" ",width:1.5},{label:",",shift:";",variants:".",class:"hide-shift"},"[.]","[left]","[right]",{label:"[action]",width:1.5}]),{label:"abc",labelClass:"MLK__tex-math",tooltip:"keyboard.tooltip.alphabetic",layers:yo({rows:n})}}function Ec(t){if(t==="alphabetic")return sb();if(typeof t=="string")return Cc[t],`${t}`,Ec(Cc[t]);let e;if("rows"in t&&Array.isArray(t.rows)){"layers"in t||"markup"in t;let n=t,{rows:a}=n,s=Ti(n,["rows"]);e=g(h({},s),{layers:yo({rows:t.rows})})}else if("markup"in t&&typeof t.markup=="string"){let o=t,{markup:a}=o,s=Ti(o,["markup"]);e=g(h({},s),{layers:yo(t.markup)})}else e=h({},t),"layers"in t?e.layers=yo(t.layers):console.error('MathLive 0.111.1: provide either a "rows", "markup" or "layers" property');let r=!1,i=!1;for(let a of e.layers)if(a.rows)for(let s of a.rows.flat()){Mn(s)&&(r=!0);let l=s.command;typeof l=="string"&&["undo","redo","cut","copy","paste"].includes(l)&&(i=!0)}return(!("displayShiftedKeycaps"in t)||t.displayShiftedKeycaps===void 0)&&(e.displayShiftedKeycaps=r),(!("displayEditToolbar"in t)||t.displayEditToolbar===void 0)&&(e.displayEditToolbar=!i),e}function lb(t,e){var i,n;let r='
    ';if(t.normalizedLayouts.length>1)for(let[o,a]of t.normalizedLayouts.entries()){let s=a,l=[o===e?"selected":"layer-switch"];s.tooltip&&l.push("MLK__tooltip"),s.labelClass&&l.push(...s.labelClass.split(" ")),r+=`
    ${(n=s.label)!=null?n:"untitled"}
    `}return r+="
    ",r}function Uh(t,e){let r="";if(t.editToolbar==="none")return"";let n=[];e.selectionIsCollapsed?n.push("undo","redo","pasteFromClipboard"):n.push("cutToClipboard","copyToClipboard","pasteFromClipboard");let o={undo:`
    + +
    `,redo:`
    + +
    `,cutToClipboard:` +
    + +
    + `,copyToClipboard:` +
    + +
    + `,pasteFromClipboard:` +
    + +
    + `};return r+=n.map(a=>o[a]).join(""),r}function cb(t){for(let e of t)ub(e)}function ub(t){let e=Fe.singleton;if(!e)return;let r={};if(!t.id){if(t.hasAttribute("data-label")&&(r.label=t.dataset.label),t.hasAttribute("data-latex")&&(r.latex=t.dataset.latex),t.hasAttribute("data-key")&&(r.key=t.dataset.key),t.hasAttribute("data-insert")&&(r.insert=t.dataset.insert),t.hasAttribute("data-variants")&&(r.variants=t.dataset.variants),t.hasAttribute("data-aside")&&(r.aside=t.dataset.aside),t.className&&(r.class=t.className),!r.label&&!r.latex&&!r.key&&!r.insert&&(r.latex=t.innerText,r.label=t.innerHTML),t.hasAttribute("data-command"))try{r.command=JSON.parse(t.dataset.command)}catch(i){console.warn("Invalid JSON in data-command attribute",i)}t.id=e.registerKeycap(r)}if(!t.innerHTML){let[i,n]=_n(r);t.innerHTML=globalThis.MathfieldElement.createHTML(i)}}function db(){Ge("virtual-keyboard"),Ge("core"),hr()}function Gh(){ot("core"),ot("virtual-keyboard")}var mb=` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`;function jh(t){t.resetKeycapRegistry(),db();let e=document.createElement("div");e.className="ML__keyboard";let r=document.createElement("div");r.className="MLK__plate",r.innerHTML=globalThis.MathfieldElement.createHTML(mb+t.normalizedLayouts.map((a,s)=>hb(t,a,s)).join(""));let i=document.createElement("div");i.className="MLK__backdrop",i.appendChild(r),e.appendChild(i),e.addEventListener("pointerdown",fb,{passive:!1});let n=e.querySelectorAll(".ML__edit-toolbar");if(n)for(let a of n)a.addEventListener("click",s=>{var u,d;let l=s.target,c="";for(;l&&!c;)c=(u=l==null?void 0:l.getAttribute("data-command"))!=null?u:"",l=(d=l==null?void 0:l.parentElement)!=null?d:null;c&&t.executeCommand(JSON.parse(c))});cb(e.querySelectorAll(".MLK__keycap, .action, .fnbutton, .bigfnbutton"));let o=e.querySelectorAll(".MLK__layer");o.length>0;for(let a of o)a.addEventListener("pointerdown",s=>s.preventDefault());return t.currentLayer=t.latentLayer,e}function hb(t,e,r){var n;let i=[];if(!("layers"in e))return"";for(let o of e.layers)i.push(`
    `),(t.normalizedLayouts.length>1||e.displayEditToolbar)&&(i.push("")),i.push(pb(t,o)),i.push("
    ");return i.join("")}function pb(t,e){if(typeof e=="string")return e;let r="";if(typeof e.style=="string"?r+=``:typeof e.style=="object"&&(r+=``),e.backdrop&&(r+=`
    `),e.container&&(r+=`
    `),e.rows){r+="
    ";for(let i of e.rows){r+='
    ';for(let n of i)if(n){let o=t.registerKeycap(n),[a,s]=_n(n);/(^|\s)separator/.test(s)?r+=`
    ${a}
    `}r+="
    "}r+="
    "}else e.markup&&(r+=e.markup);return e.container&&(r+="
    "),e.backdrop&&(r+="
    "),r}function _n(t,e={shifted:!1}){var n,o,a,s,l,c,u;let r="",i=(n=t.class)!=null?n:"";if(e.shifted&&Mn(t)&&(i+=" is-active"),e.shifted&&"shift"in t)typeof t.shift=="string"?r=bo(t.shift):typeof t.shift=="object"&&(r=t.shift.label?t.shift.label:(o=bo(t.shift.latex||t.shift.insert||"")||t.shift.key)!=null?o:""),typeof t.shift=="object"&&(i=(s=(a=t.shift.class)!=null?a:t.class)!=null?s:"");else{if(r=t.label?t.label:(l=bo(t.latex||t.insert||"")||t.key)!=null?l:"",t.shift){let d;typeof t.shift=="string"?d=bo(t.shift):t.shift.label?d=t.shift.label:d=(c=bo(t.shift.latex||t.shift.insert||"")||t.shift.key)!=null?c:"",r+=`${d}`}t.aside&&(r+=``)}return t.layer&&!/layer-switch/.test(i)&&(i+=" layer-switch"),/(^|\s)(separator|action|shift|fnbutton|bigfnbutton)($|\s)/.test(i)||(i+=" MLK__keycap"),!/\bw[0-9]+\b/.test(i)&&t.width&&(i+=(u={0:" w0",.5:" w5",1.5:" w15",2:" w20",5:" w50"}[t.width])!=null?u:""),[r,i||"MLK__keycap"]}var jt={"[left]":{class:"action hide-shift",label:"",command:"performWithFeedback(moveToPreviousChar)",shift:{label:"",command:"performWithFeedback(extendSelectionBackward)"}},"[right]":{class:"action hide-shift",label:"",command:"performWithFeedback(moveToNextChar)",shift:{label:"",command:"performWithFeedback(extendSelectionForward)"}},"[up]":{class:"action hide-shift",label:"\u2191",command:"performWithFeedback(moveUp)",shift:{label:"\u219F",command:"performWithFeedback(extendSelectionUpward)"}},"[down]":{class:"action hide-shift",label:"\u2193",command:"performWithFeedback(moveDown)",shift:{label:"\u21A1",command:"performWithFeedback(extendSelectionDownward)"}},"[return]":{class:"action hide-shift",command:"performWithFeedback(commit)",shift:{command:"performWithFeedback(addRowAfter)"},width:1.5,label:""},"[action]":{class:"action hide-shift",command:"performWithFeedback(commit)",shift:{label:"",command:"performWithFeedback(addRowAfter)"},width:1.5,label:""},"[hr]":{class:"separator horizontal-rule"},"[hide-keyboard]":{class:"action",command:["hideVirtualKeyboard"],width:1.5,label:""},"[.]":{variants:".",command:"performWithFeedback(insertDecimalSeparator)",shift:",",class:"big-op hide-shift",label:"."},"[,]":{variants:",",command:"performWithFeedback(insertDecimalSeparator)",shift:".",class:"big-op hide-shift",label:","},"[+]":{variants:[{latex:"\\sum_{#0}^{#0}",class:"small"},"\\oplus"],latex:"+",label:"+",class:"big-op hide-shift",shift:{latex:"\\sum",insert:"\\sum",class:"small"}},"[-]":{variants:["\\pm","\\ominus"],latex:"-",label:"−",shift:"\\pm",class:"big-op hide-shift"},"[/]":{class:"big-op hide-shift",shift:{class:"",latex:"\\frac{1}{#@}"},variants:["/","\\div","\\%","\\oslash"],latex:"\\frac{#@}{#?}",label:"÷"},"[*]":{variants:[{latex:"\\prod_{#0}^{#0}",class:"small"},"\\otimes","\\cdot"],latex:"\\cdot",label:"×",shift:{latex:"\\times"},class:"big-op hide-shift"},"[=]":{variants:["\\neq","\\equiv","\\varpropto","\\thickapprox","\\lt","\\gt","\\le","\\ge"],latex:"=",label:"=",shift:{label:"\u2260",latex:"\\ne"},class:"big-op hide-shift"},"[backspace]":{class:"action bottom right hide-shift",width:1.5,command:"performWithFeedback(deleteBackward)",label:"",shift:{class:"action warning",label:"",command:"deleteAll"}},"[undo]":{class:"ghost if-can-undo",command:"undo",label:"",tooltip:"tooltip.undo"},"[redo]":{class:"ghost if-can-redo",command:"redo",label:"",tooltip:"tooltip.redo"},"[(]":{variants:[{latex:"\\lbrack",key:"["},"\\langle","\\lfloor","\\lceil",{latex:"\\lbrace",key:"{"}],key:"(",label:"(",shift:{label:"[",key:"["},class:"hide-shift"},"[)]":{variants:[{latex:"\\rbrack",key:"]"},"\\rangle","\\rfloor","\\rceil",{latex:"\\rbrace",key:"}"}],key:")",label:")",shift:{label:"]",latex:"\\rbrack"},class:"hide-shift"},"[0]":{variants:"0",latex:"0",label:"0",shift:"\\infty",class:"hide-shift"},"[1]":{variants:"1",latex:"1",label:"1",shift:"#@^{-1}",class:"hide-shift"},"[2]":{variants:"2",latex:"2",label:"2",shift:"#@^2",class:"hide-shift"},"[3]":{variants:"3",latex:"3",label:"3",shift:"#@^3",class:"hide-shift"},"[4]":{variants:"4",latex:"4",label:"4",shift:"#@^4",class:"hide-shift"},"[5]":{variants:"5",latex:"5",label:"5",shift:"#@^5",class:"hide-shift"},"[6]":{variants:"6",latex:"6",label:"6",shift:"#@^6",class:"hide-shift"},"[7]":{variants:"7",latex:"7",label:"7",shift:"#@^7",class:"hide-shift"},"[8]":{variants:"8",latex:"8",label:"8",shift:"#@^8",class:"hide-shift"},"[9]":{variants:"9",latex:"9",label:"9",shift:"#@^9",class:"hide-shift"},"[separator-5]":{class:"separator",width:.5},"[separator]":{class:"separator"},"[separator-10]":{class:"separator"},"[separator-15]":{class:"separator",width:1.5},"[separator-20]":{class:"separator",width:2},"[separator-50]":{class:"separator",width:5},"[shift]":{class:"shift bottom left",width:1.5,label:""},"[foreground-color]":{variants:"foreground-color",command:["applyStyle",{color:"red"}],label:""},"[background-color]":{variants:"background-color",command:["applyStyle",{backgroundColor:"yellow"}],label:""}};function go(t){var r;if(typeof t=="string"){if(t==="[.]"&&globalThis.MathfieldElement.decimalSeparator===","&&(t="[,]"),!jt[t])return{latex:t};t={label:t}}let e;return"label"in t&&t.label&&jt[t.label]&&(e=g(h(h({},jt[t.label]),t),{label:jt[t.label].label})),"key"in t&&t.key&&jt[t.key]&&(e=g(h(h({},jt[t.key]),t),{key:jt[t.key].key})),e?(e.command==="insertDecimalSeparator"&&(e.label=(r=globalThis.MathfieldElement.decimalSeparator)!=null?r:"."),(e.tooltip===void 0||e.tooltip===null||e.tooltip===!1)&&delete e.tooltip,(e.tooltip===void 0||e.tooltip===null||e.tooltip===!1)&&delete e.tooltip,(e.aside===void 0||e.aside===null||e.aside===!1)&&delete e.aside,(e.variants===void 0||e.variants===null||e.variants===!1)&&delete e.variants,(e.shift===void 0||e.shift===null||e.shift===!1)&&delete e.shift,e):t}var xo;function fb(t){var l,c,u,d;if(t.button!==0)return;let e=Fe.singleton;if(!e)return;let r=t.target;for(;r&&!r.getAttribute("data-layer");)r=r.parentElement;if(r){e.currentLayer=(l=r.getAttribute("data-layer"))!=null?l:"",t.preventDefault();return}let i=Mi(t.target);if(!(i!=null&&i.id))return;let n=e.getKeycap(i.id);if(!n)return;t.type;let o=e;if(!o.connectedMathfieldWindow){let m=(c=window.focusedMathfield)==null?void 0:c.call(window);if(m){let p=(d=(u=m.element)==null?void 0:u.ownerDocument)==null?void 0:d.defaultView;p&&p!==window&&(o.connectedMathfieldWindow=p)}}let a=new AbortController,s=a.signal;i.classList.add("is-pressed"),i.addEventListener("pointerenter",ws(a),{capture:!0,signal:s}),i.addEventListener("pointerleave",ws(a),{capture:!0,signal:s}),i.addEventListener("pointercancel",ws(a),{signal:s}),i.addEventListener("pointerup",ws(a),{signal:s}),Mn(n)&&(i.classList.add("is-active"),e.shiftPressCount++),n.variants&&(xo&&clearTimeout(xo),xo=setTimeout(()=>{i.classList.contains("is-pressed")&&(i.classList.remove("is-pressed"),i.classList.add("is-active"),t.target&&"releasePointerCapture"in t.target&&t.target.releasePointerCapture(t.pointerId),xs(i,()=>{a.abort(),i==null||i.classList.remove("is-active")}))},n.stickyVariantPanel?0:300)),t.preventDefault()}function ws(t){return e=>{let r=Mi(e.target);if(!(r!=null&&r.id))return;let i=Fe.singleton;if(!i)return;let n=i.getKeycap(r.id);if(n){if(e.type==="pointerenter"&&e.target===r&&e.isPrimary&&r.classList.add("is-pressed"),e.type==="pointercancel"){r.classList.remove("is-pressed"),Mn(n)&&(i.shiftPressCount--,r.classList.toggle("is-active",i.isShifted)),t.abort();return}if(e.type==="pointerleave"&&e.target===r){r.classList.remove("is-pressed"),Mn(n)&&(i.shiftPressCount--,r.classList.toggle("is-active",i.isShifted));return}if(e.type==="pointerup"){xo&&clearTimeout(xo),Mn(n)?r.classList.toggle("is-active",i.isShifted):r.classList.contains("is-pressed")&&(r.classList.remove("is-pressed"),i.isShifted&&n.shift?typeof n.shift=="string"?i.executeCommand(["insert",n.shift,{focus:!0,feedback:!0,scrollIntoView:!0,mode:"math",format:"latex"}]):_s(n.shift):_s(n),i.shiftPressCount===1&&!e.shiftKey&&(i.shiftPressCount=0)),t.abort(),e.preventDefault();return}}}}function _s(t){let e=t.command;!e&&t.insert&&(e=["insert",t.insert,{focus:!0,feedback:!0,scrollIntoView:!0,mode:"math",format:"latex"}]),!e&&t.key&&(e=["typedText",t.key,{focus:!0,feedback:!0,simulateKeystroke:!0}]),!e&&t.latex&&(e=["insert",t.latex,{focus:!0,feedback:!0,scrollIntoView:!0,mode:"math",format:"latex"}]),e||(e=["typedText",t.label,{focus:!0,feedback:!0,simulateKeystroke:!0}]),Fe.singleton&&Fe.singleton.executeCommand(e)}function gb(t){if(t.nodeType!==1)return!1;let e=t.classList;return e.contains("MLK__keycap")||e.contains("shift")||e.contains("action")||e.contains("fnbutton")||e.contains("bigfnbutton")}function Mi(t){if(!t)return;let e=t;for(;e&&!gb(e);)e=e.parentElement;return e!=null?e:void 0}function Mn(t){return!!t.class&&/(^|\s)shift($|\s)/.test(t.class)}var Fe=class t{constructor(){this.originalContainerBottomPadding=null;this.keycapRegistry={};this._shiftPressCount=0;this.isSandbox=!1;var e;this.targetOrigin=window.origin,this.originValidator="none",this._alphabeticLayout="auto",this._layouts=Object.freeze(["default"]),this._editToolbar="default",this._container=void 0,this._visible=!1,this._rebuilding=!1,this.observer=new ResizeObserver(r=>{this.adjustBoundingRect(),this.dispatchEvent(new Event("geometrychange")),this.sendMessage("geometry-changed",{boundingRect:this.boundingRect})}),this.listeners={};try{(e=window.top)==null||e.addEventListener("message",this)}catch(r){window.addEventListener("message",this)}Uo()&&document.addEventListener("focusin",r=>{let i=r.target;i!=null&&i.isConnected&&setTimeout(()=>{let n=Jh();n&&n.mathVirtualKeyboardPolicy==="auto"&&n.hasEditableContent&&this.show({animate:!0})},300)}),document.addEventListener("focusout",r=>{r.target instanceof lt&&r.target.mathVirtualKeyboardPolicy!=="manual"&&setTimeout(()=>{Jh()||this.hide()},300)})}get currentLayer(){var e,r,i;return(i=(r=(e=this._element)==null?void 0:e.querySelector(".MLK__layer.is-visible"))==null?void 0:r.id)!=null?i:""}set currentLayer(e){var i;if(!this._element){this.latentLayer=e;return}let r=e?this._element.querySelector(`#${e}.MLK__layer`):null;r||(r=this._element.querySelector(".MLK__layer")),r&&((i=this._element.querySelector(".MLK__layer.is-visible"))==null||i.classList.remove("is-visible"),r.classList.add("is-visible")),this.render()}get shiftPressCount(){return this._shiftPressCount}set shiftPressCount(e){var r;this._shiftPressCount=e>2||e<0?0:e,(r=this._element)==null||r.classList.toggle("is-caps-lock",this.shiftPressCount===2),this.render()}get isShifted(){return this._shiftPressCount>0}resetKeycapRegistry(){this.keycapRegistry={}}registerKeycap(e){let r="ML__k"+Date.now().toString(36).slice(-2)+Math.floor(Math.random()*1e5).toString(36);return this.keycapRegistry[r]=e,r}setKeycap(e,r){jt[e]=go(r),this.rebuild()}getKeycap(e){var r;return e?(r=jt[e])!=null?r:this.keycapRegistry[e]:void 0}getLayer(e){let r=this.normalizedLayouts;for(let i of r)for(let n of i.layers)if(n.id===e)return n}get alphabeticLayout(){return this._alphabeticLayout}set alphabeticLayout(e){this._alphabeticLayout=e,this._normalizedLayouts=void 0,this.rebuild()}get layouts(){return this._layouts}set layouts(e){this.updateNormalizedLayouts(e),this.rebuild()}updateNormalizedLayouts(e){let r=Array.isArray(e)?[...e]:[e],i=r.findIndex(n=>n==="default");i>=0&&r.splice(i,1,"numeric","symbols","alphabetic","greek"),this._layouts=Object.freeze(r),this._normalizedLayouts=r.map(n=>Ec(n))}get normalizedLayouts(){return this._normalizedLayouts||this.updateNormalizedLayouts(this._layouts),this._normalizedLayouts}get editToolbar(){return this._editToolbar}set editToolbar(e){this._editToolbar=e,this.rebuild()}get container(){return this._container===void 0?window.document.body:this._container}set container(e){this._container=e,this.rebuild()}static get singleton(){if(this._singleton===void 0)try{this._singleton=new t}catch(e){this._singleton=null}return this._singleton}get style(){return this._style}addEventListener(e,r,i){this.listeners[e]||(this.listeners[e]=new Set),this.listeners[e].has(r)||this.listeners[e].add(r)}dispatchEvent(e){return!this.listeners[e.type]||this.listeners[e.type].size===0?!0:(this.listeners[e.type].forEach(r=>{typeof r=="function"?r(e):r==null||r.handleEvent(e)}),!e.defaultPrevented)}removeEventListener(e,r,i){this.listeners[e]&&this.listeners[e].delete(r)}get element(){return this._element}set element(e){var r;this._element!==e&&((r=this._element)==null||r.remove(),this._element=e)}get visible(){return this._visible}set visible(e){e?this.show():this.hide()}get boundingRect(){var r;if(!this._visible)return new DOMRect;let e=(r=this._element)==null?void 0:r.getElementsByClassName("MLK__plate")[0];return e?e.getBoundingClientRect():new DOMRect}adjustBoundingRect(){if(!this._element)return;let e=this.boundingRect.height;if(this.container===document.body){this._element.style.setProperty("--_keyboard-height",`calc(${e}px + var(--_padding-top) + var(--_padding-bottom))`);let r=e-1;this.container.style.paddingBottom=this.originalContainerBottomPadding?`calc(${this.originalContainerBottomPadding} + ${r}px)`:`${r}px`}else this._element.style.setProperty("--_keyboard-height",`${e}px`)}rebuild(){if(this._rebuilding||!this._element)return;this._rebuilding=!0;let e=this.currentLayer;requestAnimationFrame(()=>{this._rebuilding=!1,this._element&&(this._element.remove(),this._element=void 0),this.visible&&(this.buildAndAttachElement(),this.currentLayer=e,this.render(),this.adjustBoundingRect(),this._element.classList.add("is-visible"))})}render(){var n;if(!this._element)return;let e=this.getLayer(this.currentLayer);this._element.classList.toggle("backdrop-is-transparent",!!(e&&(e.backdrop||e.container)));let r=this._element.querySelectorAll(".MLK__layer.is-visible .MLK__keycap, .MLK__layer.is-visible .action, .fnbutton, .MLK__layer.is-visible .bigfnbutton, .MLK__layer.is-visible .shift");if(!r)return;let i=this.isShifted;for(let o of r){let a=this.getKeycap(o.id);if(a){let[s,l]=_n(a,{shifted:i});o.innerHTML=globalThis.MathfieldElement.createHTML(s),o.className=l,i&&typeof a.shift=="object"&&((n=a.shift)!=null&&n.tooltip)?o.dataset.tooltip=a.shift.tooltip:!i&&a.tooltip&&(o.dataset.tooltip=a.tooltip)}}}show(e){var i;if(this._visible)return;let r=this.container;if(r&&window.mathVirtualKeyboard&&this.stateWillChange(!0)){if(this._element||(this.buildAndAttachElement(),this.adjustBoundingRect()),!this._visible){let n=this._element.getElementsByClassName("MLK__plate")[0];if(n&&this.observer.observe(n),r===window.document.body){let o=r.style.paddingBottom;this.originalContainerBottomPadding=o;let a=n.offsetHeight-1;r.style.paddingBottom=o?`calc(${o} + ${a}px)`:`${a}px`}window.addEventListener("mouseup",this),window.addEventListener("blur",this),window.addEventListener("keydown",this,{capture:!0}),window.addEventListener("keyup",this,{capture:!0}),(i=this._element)==null||i.classList.toggle("is-caps-lock",this.shiftPressCount===2),this.currentLayer=this.latentLayer}this._visible=!0,e!=null&&e.animate?requestAnimationFrame(()=>{this._element&&(this._element.classList.add("animate"),this._element.addEventListener("transitionend",()=>{var n;return(n=this._element)==null?void 0:n.classList.remove("animate")},{once:!0}),this._element.classList.add("is-visible"),this.stateChanged())}):(this._element.classList.add("is-visible"),this.stateChanged())}}hide(e){var i;let r=this.container;if(r&&this._visible&&this.stateWillChange(!1)){if(this._visible=!1,this._element){this.latentLayer=this.currentLayer;let n=this._element.getElementsByClassName("MLK__plate")[0];n&&this.observer.unobserve(n),window.removeEventListener("mouseup",this),window.removeEventListener("blur",this),window.removeEventListener("keydown",this,{capture:!0}),window.removeEventListener("keyup",this,{capture:!0}),window.removeEventListener("contextmenu",this,{capture:!0}),Hr(),Gh(),(i=this._element)==null||i.remove(),this._element=void 0,this.originalContainerBottomPadding!==null&&(r.style.paddingBottom=this.originalContainerBottomPadding)}this.stateChanged()}}get height(){var e,r;return(r=(e=this.element)==null?void 0:e.offsetHeight)!=null?r:0}buildAndAttachElement(){var e;this.element,this.element=jh(this),window.addEventListener("contextmenu",this,{capture:!0}),this.element.addEventListener("contextmenu",r=>{r.shiftKey||((r.ctrlKey||r.button===2)&&xs(r.target),r.preventDefault(),r.stopPropagation())},{capture:!0}),(e=this.container)==null||e.appendChild(this.element)}handleEvent(e){if(fo(e)){if(!rn(e.origin,this.originValidator))throw new DOMException(`Message from unknown origin (${e.origin}) cannot be handled`,"SecurityError");if(e.data.action==="disconnect"){if(this._visible)return;this.connectedMathfieldWindow=void 0}else e.data.action!=="update-setting"&&e.data.action!=="proxy-created"&&e.data.action!=="execute-command"&&(e.source,this.connectedMathfieldWindow=e.source);this.handleMessage(e.data,e.source)}if(this._element)switch(e.type){case"mouseup":case"blur":document.body.style.userSelect="",this.shiftPressCount=0;break;case"contextmenu":e.button!==2&&e.preventDefault();break;case"keydown":{e.key==="Shift"&&!e.repeat&&(this.shiftPressCount=1);break}case"keyup":{(e.key==="Shift"||!e.getModifierState("Shift")&&this.shiftPressCount!==2)&&(this.shiftPressCount=0);break}}}handleMessage(e,r){let{action:i}=e;if(i==="execute-command"){let{command:n}=e,o=pr(n);if(window===window.top&&r!==window||r===window&&o!=="virtual-keyboard")return;this.executeCommand(n);return}if((i==="connect"||i==="show")&&this.sendMessage("synchronize-proxy",{boundingRect:this.boundingRect,alphabeticLayout:this._alphabeticLayout,layouts:this._layouts,editToolbar:this._editToolbar},r),i!=="disconnect"&&!this.isSandbox){if(i==="show"){typeof e.animate!="undefined"?this.show({animate:e.animate}):this.show();return}if(i==="hide"){typeof e.animate!="undefined"?this.hide({animate:e.animate}):this.hide();return}if(i==="update-setting"){if(e.alphabeticLayout&&(this.alphabeticLayout=e.alphabeticLayout),e.layouts&&(this.layouts=e.layouts),e.editToolbar&&(this.editToolbar=e.editToolbar),e.setKeycap){let{keycap:n,value:o}=e.setKeycap;this.setKeycap(n,o),this.render()}return}if(i==="proxy-created"){this.sendMessage("synchronize-proxy",{boundingRect:this.boundingRect,alphabeticLayout:this._alphabeticLayout,layouts:this._layouts,editToolbar:this._editToolbar},r);return}}}sendMessage(e,r,i){if(r.command&&this.dispatchEvent(new CustomEvent("math-virtual-keyboard-command",{detail:r.command})),i||(i=this.connectedMathfieldWindow),this.targetOrigin===null||this.targetOrigin==="null"||i===window){window.dispatchEvent(new MessageEvent("message",{source:window,origin:window.origin,data:h({type:po,action:e},r)}));return}if(i)i.postMessage(h({type:po,action:e},r),{targetOrigin:this.targetOrigin});else if(e==="execute-command"&&Array.isArray(r.command)&&r.command[0]==="insert"){let n=r.command[1].split("");for(let o of n)this.dispatchEvent(new KeyboardEvent("keydown",{key:o,bubbles:!0})),this.dispatchEvent(new KeyboardEvent("keyup",{key:o,bubbles:!0}))}}stateWillChange(e){return this.dispatchEvent(new CustomEvent("before-virtual-keyboard-toggle",{detail:{visible:e},bubbles:!0,cancelable:!0,composed:!0}))}stateChanged(){this.dispatchEvent(new Event("virtual-keyboard-toggle")),this._visible||(this.dispatchEvent(new Event("geometrychange")),this.sendMessage("geometry-changed",{boundingRect:this.boundingRect}))}focus(){this.sendMessage("focus",{})}blur(){this.sendMessage("blur",{})}updateToolbar(e){let r=this._element;if(!r)return;r.classList.toggle("is-math-mode",e.mode==="math"),r.classList.toggle("is-text-mode",e.mode==="text"),r.classList.toggle("can-undo",e.canUndo),r.classList.toggle("can-redo",e.canRedo),r.classList.toggle("can-copy",!e.selectionIsCollapsed),r.classList.toggle("can-cut",!e.selectionIsCollapsed),r.classList.toggle("can-paste",!0);let i=r.querySelectorAll(".ML__edit-toolbar");if(i)for(let n of i)n.innerHTML=Uh(this,e)}update(e){this._style=e.style,this.updateToolbar(e)}connect(){this.connectedMathfieldWindow=window}disconnect(){this._visible||(this.connectedMathfieldWindow=void 0)}executeCommand(e){if(e=_i(e),!e)return!1;let r,i=[],n=pr(e);return ee(e)?(r=e[0],r==="performWithFeedback"&&(n=pr(e.slice(1))),i=e.slice(1)):r=e,n==="virtual-keyboard"?Mt[r].fn(void 0,...i):(this.sendMessage("execute-command",{command:e}),!1)}dispose(){window.removeEventListener("mouseup",this),window.removeEventListener("blur",this),window.removeEventListener("message",this)}};function Jh(){let t=Ut(),e=null;for(;t;){if("host"in t&&t.host instanceof lt){e=t.host;break}t=t.parentNode}return e}Le()&&!("mathVirtualKeyboard"in window)&&(window===window.top?vo():Object.defineProperty(window,"mathVirtualKeyboard",{get:()=>ho.singleton,configurable:!0}));function vo(){let t=Fe.singleton;return window.mathVirtualKeyboard!==t&&Object.defineProperty(window,"mathVirtualKeyboard",{get:()=>t}),t}function wn(t){let e={};for(let r of Object.keys(t))switch(r){case"scriptDepth":let i=t.scriptDepth;if(ee(i))e.scriptDepth=[i[0],i[1]];else if(typeof i=="number")e.scriptDepth=[i,i];else if(typeof i=="string"){let[o,a]=i.split(",").map(s=>parseInt(s.trim()));e.scriptDepth=[o,a]}else throw new TypeError("Unexpected value for scriptDepth");break;case"mathVirtualKeyboardPolicy":let n=t.mathVirtualKeyboardPolicy.toLowerCase();if(n==="sandboxed"){let o=vo();o&&(o.isSandbox=!0),n="manual"}e.mathVirtualKeyboardPolicy=n;break;case"letterShapeStyle":t.letterShapeStyle==="auto"?F.locale.startsWith("fr")?e.letterShapeStyle="french":e.letterShapeStyle="tex":e.letterShapeStyle=t.letterShapeStyle;break;case"defaultMode":["text","math","inline-math"].includes(t.defaultMode)?e.defaultMode=t.defaultMode:(console.error('MathLive 0.111.1: valid values for defaultMode are "text", "math" or "inline-math"'),e.defaultMode="math");break;case"macros":e.macros=ei(t.macros);break;default:ee(t[r])?e[r]=[...t[r]]:typeof t[r]=="object"&&!(t[r]instanceof Element)&&r!=="computeEngine"?e[r]=h({},t[r]):e[r]=t[r]}return e}function fr(t,e){let r;typeof e=="string"?r=[e]:e===void 0?r=Object.keys(t):r=e;let i={};for(let n of r)t[n]===null?i[n]=null:ee(t[n])?i[n]=[...t[n]]:typeof t[n]=="object"&&!(t[n]instanceof Element)&&n!=="computeEngine"?i[n]=h({},t[n]):i[n]=t[n];return typeof e=="string"?i[e]:i}function Sn(){return{readOnly:!1,defaultMode:"math",macros:{},registers:{},colorMap:Yr,backgroundColorMap:Bi,letterShapeStyle:F.locale.startsWith("fr")?"french":"tex",minFontScale:0,maxMatrixCols:10,smartMode:!1,smartFence:!0,smartSuperscript:!0,scriptDepth:[1/0,1/0],removeExtraneousParentheses:!0,isImplicitFunction:t=>["\\sin","\\cos","\\tan","\\arcsin","\\arccos","\\arctan","\\arcsec","\\arccsc","\\arsinh","\\arcosh","\\artanh","\\arcsech","\\arccsch","\\arg","\\ch","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\sec","\\sinh","\\sh","\\tanh","\\tg","\\th","\\lg","\\lb","\\log","\\ln"].includes(t),mathModeSpace:"",placeholderSymbol:"\u25A2",contentPlaceholder:"",popoverPolicy:"auto",environmentPopoverPolicy:"off",keybindings:Q0,inlineShortcuts:Za,inlineShortcutTimeout:0,mathVirtualKeyboardPolicy:"auto",originValidator:"none",onInsertStyle:co,onInlineShortcut:()=>"",onScrollIntoView:null,onExport:Y0,value:""}}function Tc(t){return t.defaultMode==="inline-math"?"math":t.defaultMode}var Xh="⁡",Ss="⁢";function De(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function re(t,e){return!t||!e.generateID?"":` extid="${t}"`}function bb(t,e,r){var d,m,p,f,y,v,b,k;let i=!1;e=e!=null?e:t.atoms.length;let n="",o="",a=t.atoms[t.index],s=(d=a.style)==null?void 0:d.variant,l=(m=a.style)==null?void 0:m.variantStyle,c="";if(a.value&&(s||l)){let S=(p=Bn(a.value,s,l))!=null?p:a.value;if(S!==a.value)return t.index+=1,n=`${S}`,Jt(n,t,r)||(t.mathML+=n,t.lastType="mi"),!0;c=(f={upnormal:"normal",boldnormal:"bold",italicmain:"italic",bolditalicmain:"bold-italic","updouble-struck":"double-struck","double-struck":"double-struck",boldfraktur:"bold-fraktur",calligraphic:"script",upcalligraphic:"script",script:"script",boldscript:"bold-script",boldcalligraphic:"bold-script",fraktur:"fraktur","upsans-serif":"sans-serif","boldsans-serif":"bold-sans-serif","italicsans-serif":"sans-serif-italic","bolditalicsans-serif":"sans-serif-bold-italic",monospace:"monospace"}[(l!=null?l:"")+(s!=null?s:"")])!=null?f:"",c&&(c=` mathvariant="${c}"`)}let u={"\\exponentialE":"ⅇ","\\imaginaryI":"ⅈ","\\differentialD":"ⅆ","\\capitalDifferentialD":"ⅅ","\\alpha":"α","\\pi":"π","\\infty":"∞","\\forall":"∀","\\nexists":"∄","\\exists":"∃","\\hbar":"\u210F","\\cdotp":"\u22C5","\\ldots":"\u2026","\\cdots":"\u22EF","\\ddots":"\u22F1","\\vdots":"\u22EE","\\ldotp":"."};if(a.command==="!")return t.index+=1,n="!",Jt(n,t,r)||(t.mathML+=n,t.lastType="mo"),!0;if(u[a.command]){t.index+=1;let S=`${u[a.command]}`;return(t.lastType==="mi"||t.lastType==="mn"||t.lastType==="mtext"||t.lastType==="fence")&&(S=Ss+S),Jt(S,t,r)||(t.mathML+=S,t.lastType="mi"),!0}if(a.command==="\\operatorname")o=kn(a.body),t.index+=1;else if(s||l)for(;t.index0){i=!0,n=`${o}`;let S=t.lastType;n.endsWith(">f")||n.endsWith(">g")?(n+=Xh,t.lastType="applyfunction"):t.lastType=/^(.*)<\/mo>$/.test(n)?"mo":"mi",Jt(n,t,r)||((S==="mi"||S==="mn"||S==="mtext"||S==="fence")&&(n=Ss+n),t.mathML+=n)}return i}function Zh(t){return t.index${t}${a}${o}`:o?s=`${t}${o}`:a&&(s=`${t}${a}`),e.mathML+=s,e.lastType="",!0}function yb(t,e,r){e=e!=null?e:t.atoms.length;let i=t.index,n="",o=Yh(t);for(o>=0&&o0?(n=`${De(n)}`,o<0&&Zh(t)&&(o=t.index,t.index+=1),Jt(n,t,r)||(t.mathML+=n,t.lastType="mtext"),!0):!1}function xb(t,e,r){e=e!=null?e:t.atoms.length;let i=t.index,n="",o=Yh(t);for(o>=0&&o"+n+"",o<0&&Zh(t)&&(o=t.index,t.index+=1),Jt(n,t,r)||(t.mathML+=n,t.lastType="mn"),!0)}function vb(t,e,r){let i=!1;e=e!=null?e:t.atoms.length;let n="",o="";if(t.index",n+=wi(t.atoms[l],r),n+=G(t.atoms,r,l+1,c),n+=wi(t.atoms[c],r),n+="",t.index=c+1,(t.lastType==="mi"||t.lastType==="mn"||t.lastType==="mfrac"||t.lastType==="fence")&&(t.mathML+=Ss),Jt(n,t,r)&&(i=!0,t.lastType="",n=""),o="fence")}return n.length>0&&(i=!0,t.mathML+=n,t.lastType=o),i}function _b(t,e,r){let i=!1;e=e!=null?e:t.atoms.length;let n="",o="",a=t.atoms[t.index];if(!a)return!1;let s={"\\ne":"≠","\\neq":"≠","\\pm":"±","\\times":"×","\\colon":":","\\vert":"|","\\Vert":"\u2225","\\mid":"\u2223","\\{":"{","\\}":"}","\\lbrace":"{","\\rbrace":"}","\\lbrack":"[","\\rbrack":"]","\\lparen":"(","\\rparen":")","\\langle":"\u27E8","\\rangle":"\u27E9","\\lfloor":"\u230A","\\rfloor":"\u230B","\\lceil":"\u2308","\\rceil":"\u2309"};if(s[a.command]){t.index+=1;let l=`${s[a.command]}`;return Jt(l,t,r)||(t.mathML+=l,t.lastType="mo"),!0}if(t.index"):a.superscript?(n+=""+l,n+=G(a.superscript,r),n+=""):a.subscript&&(n+=""+l,n+=G(a.subscript,r),n+=""),t.mathML+=n,t.lastType="mo",t.index+=1,!0}{let l=t.atoms[t.index],c=l.value==="\\operatorname",u=c?'"+kn(l.value)+"":wi(l,r);n+=u,!c&&!/^(.*)<\/mo>$/.test(u)?(n+=Xh,o="applyfunction"):o=c?"mi":"mo"}(t.lastType==="mi"||t.lastType==="mn")&&!/^(.*)<\/mo>$/.test(n)&&(n=Ss+n),t.index+=1}return n.length>0&&(i=!0,Jt(n,t,r)||(t.mathML+=n,t.lastType=o)),i}function G(t,e,r,i){e!=null||(e={});let n={atoms:[],index:r!=null?r:0,mathML:"",lastType:""};if(typeof t=="number"||typeof t=="boolean")n.mathML=t.toString();else if(typeof t=="string")n.mathML=t;else if(t instanceof x)n.mathML=Dc(t,e);else if(Array.isArray(t)){n.atoms=t;let o=0;for(i=i||(t?t.length:0);n.index0&&n.atoms[n.index].type==="genfrac"&&(a="⁤"+a),n.atoms[n.index].type==="genfrac"?n.lastType="mfrac":n.lastType="",n.index+=1,Jt(a,n,e)?o+=1:a.length>0&&(n.mathML+=a,o+=1)}o>1&&(n.mathML=""+n.mathML+"")}return n.mathML}function wi(t,e){let r="",i=kn(t.value);return i&&(r=""+i+""),r}function kn(t){if(!t)return"";if(typeof t=="string")return De(t);if(!Array.isArray(t)&&typeof t.body=="string")return De(t.body);let e="";for(let r of t)typeof r.value=="string"&&(e+=r.value);return De(e)}function Dc(t,e){var y,v,b,k,S,A,E,C,_,O,I,V,K,N,j,D,W,ie,X,ye,xe,Pe,Ct;if(t.mode==="text")return`${De(t.value)}`;let r={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",longleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",longrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",longrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xleftrightarrows:"\u21C4",xRightleftharpoons:"\u21CC",longRightleftharpoons:"\u21CC",xLeftrightharpoons:"\u21CB",longLeftrightharpoons:"\u21CB"},i={"\\!":-3/18,"\\ ":6/18,"\\,":3/18,"\\:":4/18,"\\>":4/18,"\\;":5/18,"\\enspace":.5,"\\quad":1,"\\qquad":2,"\\enskip":.5},n="",o="",a,s,l,c,u,d,{command:m}=t;if(t.command==="\\error")return`${G(t.body,e)}`;let p={"\\vert":"|","\\Vert":"\u2225","\\mid":"\u2223","\\lbrack":"[","\\rbrack":"]","\\{":"{","\\}":"}","\\lbrace":"{","\\rbrace":"}","\\lparen":"(","\\rparen":")","\\langle":"\u27E8","\\rangle":"\u27E9","\\lfloor":"\u230A","\\rfloor":"\u230B","\\lceil":"\u2308","\\rceil":"\u2309"},f={"\\vec":"⃗","\\acute":"´","\\grave":"`","\\dot":"˙","\\ddot":"¨","\\tilde":"~","\\bar":"¯","\\breve":"˘","\\check":"ˇ","\\hat":"^"};switch(t.type){case"first":break;case"error":if(t.command==="\\\\")break;n=`${G(t.body,e)}`;break;case"group":case"root":n=G(t.body,e);break;case"array":let ue=t;if((ue.leftDelim&&ue.leftDelim!=="."||ue.rightDelim&&ue.rightDelim!==".")&&(n+="",ue.leftDelim&&ue.leftDelim!=="."&&(n+=`${De(p[ue.leftDelim]||ue.leftDelim)}`)),n+="",a=0;a"+G(ue.rows[s][a],e)+"";n+=""}n+="",(ue.leftDelim&&ue.leftDelim!=="."||ue.rightDelim&&ue.rightDelim!==".")&&(ue.rightDelim&&ue.rightDelim!=="."&&(n+=`${De(p[ue.rightDelim]||ue.rightDelim)}`),n+="");break;case"genfrac":let we=t;if((we.leftDelim||we.rightDelim)&&(n+=""),we.leftDelim&&we.leftDelim!=="."&&(n+=""+De(p[we.leftDelim]||we.leftDelim)+""),we.hasBarLine){let Oe=we.barThickness;Oe&&"dimension"in Oe?n+=``:n+="",n+=G(t.above,e)||" ",n+=G(t.below,e)||" ",n+=""}else n+="",n+=""+G(t.above,e)+"",n+=""+G(t.below,e)+"",n+="";we.rightDelim&&we.rightDelim!=="."&&(n+=""+De(p[we.rightDelim]||we.rightDelim)+""),(we.leftDelim||we.rightDelim)&&(n+="");break;case"surd":t.hasEmptyBranch("above")?(n+="",n+=G(t.body,e),n+=""):(n+="",n+=G(t.body,e),n+=G(t.above,e),n+="");break;case"leftright":let Xr=t,br=Xr.leftDelim;n="",br&&br!=="."&&(n+=`${De((y=p[br])!=null?y:br)}`),t.body&&(n+=G(t.body,e));let Vo=Xr.matchingRightDelim();Vo&&Vo!=="."&&(n+=`${De((v=p[Vo])!=null?v:Vo)}`),n+="";break;case"sizeddelim":case"delim":n+=`${De(p[t.value]||t.value)}`;break;case"accent":let nf=t;n+='",n+=G(t.body,e),n+=""+(f[m]||nf.accent)+"",n+="";break;case"line":case"overlap":break;case"overunder":let je=t;u=t.above,c=t.below,(je.svgAbove||u)&&(je.svgBelow||c)?d=t.body:u&&u.length>0?(d=t.body,(k=(b=t.body)==null?void 0:b[0])!=null&&k.below?(c=t.body[0].below,d=t.body[0].body):((A=(S=t.body)==null?void 0:S[0])==null?void 0:A.type)==="first"&&((C=(E=t.body)==null?void 0:E[1])!=null&&C.below)&&(c=t.body[1].below,d=t.body[1].body)):c&&c.length>0&&(d=t.body,(O=(_=t.body)==null?void 0:_[0])!=null&&O.above?(u=t.body[0].above,d=t.body[0].body):((V=(I=t.body)==null?void 0:I[0])==null?void 0:V.type)==="first"&&((N=(K=t.body)==null?void 0:K[1])!=null&&N.above)&&(u=t.body[1].above,d=t.body[1].body)),(je.svgAbove||u)&&(je.svgBelow||c)?(n+=``,n+=(j=r[je.svgBody])!=null?j:G(d,e),n+=(D=r[je.svgBelow])!=null?D:G(c,e),n+=(W=r[je.svgAbove])!=null?W:G(u,e),n+=""):je.svgAbove||u?(n+=``+((ie=r[je.svgBody])!=null?ie:G(d,e)),n+=(X=r[je.svgAbove])!=null?X:G(u,e),n+=""):(je.svgBelow||c)&&(n+=``+((ye=r[je.svgBody])!=null?ye:G(d,e)),n+=(xe=r[je.svgBelow])!=null?xe:G(c,e),n+="");break;case"placeholder":n+="?";break;case"mord":{if(n=typeof t.value=="string"?t.value:m,n.length>0&&n.startsWith("\\"))typeof t.value=="string"&&t.value.charCodeAt(0)>255?n=String.fromCodePoint(t.value.codePointAt(0)):typeof t.value=="string"&&(n=t.value.charAt(0));else if(t.command==="\\char"){let rl=(Pe=t.args)==null?void 0:Pe[0];if(rl!==void 0&&"number"in rl){let qo=rl.number;typeof qo=="number"&&qo>=0&&qo<=1114111&&(n=String.fromCodePoint(qo))}}else typeof t.value=="string"?n=t.value:(console.error("Did not expect this"),n="");let Oe=/\d/.test(n)?"mn":"mi";n=`<${Oe}${re(t.id,e)}>${De(n)}`;break}case"mbin":case"mrel":case"minner":n=wi(t,e);break;case"mpunct":n='"+m+"";break;case"mop":case"operator":case"extensible-symbol":t.value!=="\u200B"&&(n="",n+=m==="\\operatorname"?t.body:m||t.body,n+="");break;case"box":let el=t;n='"+G(t.body,e)+"";break;case"spacing":n+='';break;case"enclose":let tl=t;n=''+G(t.body,e)+"";break;case"prompt":n=''+G(t.body,e)+"";break;case"space":n+=" ";break;case"subsup":break;case"phantom":break;case"composition":break;case"rule":break;case"chem":break;case"mopen":n+=wi(t,e);break;case"mclose":n+=wi(t,e);break;case"macro":{let Oe=t.command+kn(t.macroArgs);Oe&&(n+=`${Oe}`)}break;case"latexgroup":n+=G(t.body,e);break;case"latex":n+=""+De(t.value)+"";break;case"tooltip":n+=G(t.body,e);break;case"text":n+=`${De(t.value)}`;break;default:if(t.command==="\\displaystyle")return`${G(t.body,e)}`;if(t.command==="\\textstyle")return`${G(t.body,e)}`;console.info("Unexpected element in conversion to MathML:",t)}return n}var Ln={"\\alpha":"alpha ","\\mu":"mew ","\\sigma":"sigma ","\\pi":"pie ","\\imaginaryI":"imaginary eye ","\\imaginaryJ":"imaginary jay ","\\sum":"Summation ","\\prod":"Product ","+":"plus ","-":"minus ",";":' semi-colon ',",":' comma ',"|":'Vertical bar',"(":'Open paren. ',")":' Close paren. ',"=":"equals ","<":"is less than ","\\lt":"is less than ","<=":"is less than or equal to ","\\le":"is less than or equal to ","\\gt":"is greater than ",">":"is greater than ","\\pm":"plus or minus","\\mp":"minus or plus","\\ge":"is greater than or equal to ","\\geq":"is greater than or equal to ","\\leq":"is less than or equal to ","\\ne":"is not equal to ","\\neq":"is not equal to ","!":"factorial ","\\sin":"sine ","\\cos":"cosine ","\u200B":"","\u2212":"minus ",":":' such that ',"\\colon":' such that ',"\\hbar":"etch bar ","\\iff":'if, and only if, ',"\\Longleftrightarrow":'if, and only if, ',"\\land":"and ","\\lor":"or ","\\neg":"not ","\\div":"divided by ","\\forall":"for all ","\\exists":"there exists ","\\nexists":"there does not exists ","\\in":"element of ","\\N":'the set n',"\\C":'the set c',"\\Z":'the set z',"\\Q":'the set q',"\\infty":"infinity ","\\nabla":"nabla ","\\partial":"partial derivative of ","\\cdot":"times ","\\cdots":"dot dot dot ","\\Rightarrow":"implies ","\\lparen":'open paren',"\\rparen":'close paren',"\\lbrace":'open brace',"\\{":'open brace',"\\rbrace":'close brace',"\\}":'close brace',"\\langle":'left angle bracket',"\\rangle":'right angle bracket',"\\lfloor":'open floor',"\\rfloor":'close floor',"\\lceil":'open ceiling',"\\rceil":'close ceiling',"\\vert":'vertical bar',"\\mvert":'divides',"\\lvert":'left vertical bar',"\\rvert":'right vertical bar',"\\lbrack":' open square bracket ',"\\rbrack":' close square bracket ',mm:"millimeters",cm:"centimeters",km:"kilometers",kg:"kilograms"},Oc={array:"array",matrix:"matrix",pmatrix:"parenthesis matrix",bmatrix:"square brackets matrix",Bmatrix:"braces matrix",vmatrix:"bars matrix",Vmatrix:"double bars matrix","matrix*":"matrix",smallmatrix:"small matrix"};function Mb(t){let e="";return t.startsWith("\\")&&(e=" "+t.replace("\\","")+" "),e}function _o(t){let e=0;if(ee(t))for(let r of t)r.type!=="first"&&(e+=1);return e===1}function wb(t){if(ee(t)){for(let e of t)if(e.type!=="first"&&e.id)return e.id.toString()}return""}function Qh(t){let e="";if(ee(t))for(let r of t)r.type!=="first"&&typeof r.value=="string"&&(e+=r.value);return e}function Sb(t){return t?t.map(e=>e.value).join(""):""}function ks(t){if(t&&!t.some(e=>e.type!=="first"&&e.value===void 0))return t.map(e=>e.value).join("")}function Bc(t){return`${t}`}function kb(t,e){var o;let r="",i=!1,n=!1;for(let a=0;a/g,">"):t:""}function q(t,e){var c,u,d,m,p,f,y,v;function r(b){return globalThis.MathfieldElement.textToSpeechMarkup?/[a-z]/.test(b)?` ${b}`:/[A-Z]/.test(b)?`capital ${b.toLowerCase()}`:b:/[a-z]/.test(b)?" '"+b.toUpperCase()+"'":/[A-Z]/.test(b)?" 'capital "+b.toUpperCase()+"'":b}if(!e)return"";if(ee(e))return kb(t,e);let i="";if(e.id&&t==="math"&&(i+=''),e.mode==="text")return i+ep(e.value);let n="",o="",a="",s=!1,{command:l}=e;switch(l){case"\\vec":return"vector "+q(t,e.body);case"\\acute":return q(t,e.body)+" acute";case"\\grave":return q(t,e.body)+" grave";case"\\dot":return"dot over"+q(t,e.body);case"\\ddot":return"double dot over"+q(t,e.body);case"\\mathring":return"ring over"+q(t,e.body);case"\\tilde":case"\\widetilde":return"tilde over"+q(t,e.body);case"\\bar":return q(t,e.body)+" bar";case"\\breve":return q(t,e.body)+" breve";case"\\check":case"\\widecheck":return"check over "+q(t,e.body);case"\\hat":case"\\widehat":return"hat over"+q(t,e.body);case"\\overarc":case"\\overparen":case"\\wideparen":return"arc over "+q(t,e.body);case"\\underarc":case"\\underparen":return"arc under "+q(t,e.body);case"\\mathop":return(c=ks(e.body))!=null?c:q(t,e.body);case"\\mathit":return(u=ks(e.body))!=null?u:q(t,e.body);case"\\mathrm":return(d=ks(e.body))!=null?d:q(t,e.body);case"\\mathbb":return"blackboard"+((m=ks(e.body))!=null?m:q(t,e.body))}switch(e.type){case"prompt":let b=e.body.length>1?'start input . '+q(t,e.body)+'. end input':"blank";i+=' '+b+'. '+((p=e.correctness)!=null?p:"")+' . ';break;case"array":let k=e.rows,S=e.environmentName;if(Object.keys(Oc).includes(S)){i+=` begin ${Oc[S]} `;for(let C=0;C0&&(i+=","),i+=` row ${C+1} `;for(let _=0;_0&&(i+=","),i+=` column ${_+1}: `,i+=q("math",k[C][_])}i+=` end ${Oc[S]} `}break;case"group":l==="\\ne"?i+=" not equal ":(l==="\\not"&&(i+=" not "),i+=q("math",e.body));break;case"root":i+=q("math",e.body);break;case"genfrac":if(n=q("math",e.above),o=q("math",e.below),_o(e.above)&&_o(e.below)){let _={"1/2":" half ","1/3":" one third ","2/3":" two third","1/4":" one quarter ","3/4":" three quarter ","1/5":" one fifth ","2/5":" two fifths ","3/5":" three fifths ","4/5":" four fifths ","1/6":" one sixth ","5/6":" five sixths ","1/8":" one eight ","3/8":" three eights ","5/8":" five eights ","7/8":" seven eights ","1/9":" one ninth ","2/9":" two ninths ","4/9":" four ninths ","5/9":" five ninths ","7/9":" seven ninths ","8/9":" eight ninths "}[Qh(e.above)+"/"+Qh(e.below)];_?i=_:i+=n+" over "+o}else i+=' the fraction '+n+' over '+o+'. End fraction.';break;case"surd":if(a=q("math",e.body),e.hasEmptyBranch("above"))i+=_o(e.body)?" the square root of "+a+" , ":' the square root of '+a+'. End square root';else{let C=q("math",e.above);C=C.trim();let _=C.replace(//g,"");_==="3"?i+=' the cube root of '+a+'. End cube root':_==="n"?i+=' the nth root of '+a+'. End root':i+=' the root with index: '+C+', of '+a+'. End root'}break;case"leftright":{let C=e;i+=(f=C.leftDelim?Ln[C.leftDelim]:void 0)!=null?f:C.leftDelim,i+=q("math",e.body),i+=(y=C.rightDelim?Ln[C.rightDelim]:void 0)!=null?y:C.rightDelim}break;case"rule":break;case"overunder":break;case"overlap":break;case"macro":let A=l.replace(/^\\/g,""),E=Ri()[A];E!=null&&E.expand?i+=q("math",e.body):i+=`${A} `;break;case"placeholder":i+="placeholder ";break;case"delim":case"sizeddelim":case"mord":case"minner":case"mbin":case"mrel":case"mpunct":case"mopen":case"mclose":{if(l==="\\mathbin"||l==="\\mathrel"||l==="\\mathopen"||l==="\\mathclose"||l==="\\mathpunct"||l==="\\mathord"||l==="\\mathinner"){i=q(t,e.body);break}let C=e.isDigit()?e.asDigit():e.value,_=e.command;if((e.type==="delim"||e.type==="sizeddelim")&&(_=e.value,C=_),t==="text")i+=ep(C);else{if(e.type==="mbin"&&(i+=''),C){let O=Ln[C]||(_?Ln[_.trim()]:"");if(O)i+=" "+O;else{let I=_?Mb(_.trim()):"";i+=I||r(C)}}else i+=q("math",e.body);e.type==="mbin"&&(i+='')}break}case"mop":case"operator":case"extensible-symbol":if(e.value!=="\u200B"){let C=e.command;if(C==="\\sum")if(!e.hasEmptyBranch("superscript")&&!e.hasEmptyBranch("subscript")){let _=q("math",e.superscript);_=_.trim();let O=q("math",e.subscript);O=O.trim(),i+=' the summation from '+O+' to '+_+' of ',s=!0}else if(e.hasEmptyBranch("subscript"))i+=" the summation of";else{let _=q("math",e.subscript);_=_.trim(),i+=' the summation from '+_+' of ',s=!0}else if(C==="\\prod")if(!e.hasEmptyBranch("superscript")&&!e.hasEmptyBranch("subscript")){let _=q("math",e.superscript);_=_.trim();let O=q("math",e.subscript);O=O.trim(),i+=' the product from '+O+' to '+_+' of ',s=!0}else if(e.hasEmptyBranch("subscript"))i+=" the product of ";else{let _=q("math",e.subscript);_=_.trim(),i+=' the product from '+_+' of ',s=!0}else if(C==="\\int")if(!e.hasEmptyBranch("superscript")&&!e.hasEmptyBranch("subscript")){let _=q("math",e.superscript);_=_.trim();let O=q("math",e.subscript);O=O.trim(),i+=' the integral from '+Bc(O)+' to '+Bc(_)+' of ',s=!0}else i+=' the integral of ';else if(C==="\\operatorname"||C==="\\operatorname*")i+=Sb(e.body)+" ";else if(typeof e.value=="string"){let _=(v=Ln[e.value])!=null?v:e.command?Ln[e.command]:void 0;i+=_||" "+e.value}else e.command&&(e.command==="\\mathop"?i+=q("math",e.body):i+=e.command.startsWith("\\")?" "+e.command.slice(1):" "+e.command)}break;case"enclose":a=q("math",e.body),i+=" crossed out "+a+". End crossed out.";break;case"space":case"spacing":break}if(!s&&!e.hasEmptyBranch("superscript")){let b=q(t,e.superscript);b=b.trim();let k=b.replace(/<[^>]*>/g,"");if(_o(e.superscript)){if(t==="math"){let S=wb(e.superscript);S&&(i+='')}k==="\u2032"?i+=" prime ":k==="2"?i+=" squared ":k==="3"?i+=" cubed ":Number.isNaN(Number.parseInt(k))?i+=" to the "+b+"; ":i+=' to the '+k+" power; "}else Number.isNaN(Number.parseInt(k))?i+=" raised to the "+b+"; ":i+=' raised to the '+k+" power; "}if(!s&&!e.hasEmptyBranch("subscript")){let b=q("math",e.subscript);b=b.trim(),i+=_o(e.subscript)?" sub "+b:" subscript "+b+". End subscript. "}return i}function wt(t){var i,n;let e=globalThis.MathfieldElement;if(e.textToSpeechRules==="sre"&&("sre"in window||"SRE"in window)){let o=G(t);if(o){e.textToSpeechMarkup&&(e.textToSpeechRulesOptions=(i=e.textToSpeechRulesOptions)!=null?i:{},e.textToSpeechRulesOptions=g(h({},e.textToSpeechRulesOptions),{markup:e.textToSpeechMarkup}),e.textToSpeechRulesOptions.markup==="ssml"&&(e.textToSpeechRulesOptions=g(h({},e.textToSpeechRulesOptions),{markup:"ssml_step"})),e.textToSpeechRulesOptions=g(h({},e.textToSpeechRulesOptions),{rate:e.speechEngineRate}));let a=(n=window.SRE)!=null?n:globalThis.sre.System.getInstance();e.textToSpeechRulesOptions&&a.setupEngine(e.textToSpeechRulesOptions);let s="";try{s=a.toSpeech(o)}catch(l){console.error("MathLive 0.111.1: `SRE.toSpeech()` runtime error",l)}return s}return""}let r=q("math",t);if(e.textToSpeechMarkup==="ssml"){let o="";e.speechEngineRate&&(o=''),r=''+o+"

    "+r+"

    "+(o?"
    ":"")+""}else e.textToSpeechMarkup==="mac"&&Et()==="macos"?r=r.replace(//g,"").replace(//g,"[[emph+]]").replace(/<\/emphasis>/g,"").replace(//g,"[[slc $1]]").replace(/]*>/g,"").replace(/<\/say-as>/g,""):r=r.replace(/<[^>]*>/g,"").replace(/\s{2,}/g," ");return r}function Wr(t,e){return typeof t=="string"?t+wt(e):wt(t)}var tp="math input field";function Kc(t,e){var i;if(t===e)return"";if(t.nodeType===Node.TEXT_NODE)return(i=t.textContent)!=null?i:"";let r="";for(let n of Array.from(t.childNodes))r+=Kc(n,e);return r}function Rc(t){var l;if(!t)return tp;let e=t.getRootNode(),r=c=>(c!=null?c:"").replace(/\s+/g," ").trim(),i=t.getAttribute("aria-labelledby");if(i&&typeof e.getElementById=="function"){let c=r(i.split(/\s+/).map(u=>e.getElementById(u)).map(u=>u?Kc(u,t):"").join(" "));if(c)return c}let n=r(t.getAttribute("aria-label"));if(n)return n;let o=[];if(t.id&&typeof e.querySelectorAll=="function")for(let c of Array.from(e.querySelectorAll("label[for]")))c.getAttribute("for")===t.id&&o.push(c);let a=(l=t.parentElement)==null?void 0:l.closest("label");a&&o.push(a);let s=r(o.map(c=>Kc(c,t)).join(" "));return s||r(t.getAttribute("title"))||tp}function Pc(t){var r;let e;if(t.parent.type==="prompt")t.parentBranch==="body"&&(e="prompt");else if(t.parentBranch==="body"){if(t.type==="first"&&(t.parent.type==="root"?e="mathfield":t.parent.type==="surd"?e="radicand":t.parent.type==="genfrac"?e="fraction":t.parent.type==="sizeddelim"&&(e="delimiter"),e))return e;t.type==="subsup"?t.superscript&&t.subscript?e="superscript and subscript":t.superscript?e="superscript":t.subscript&&(e="subscript"):t.type&&(e=(r={accent:"accented",array:"array",box:"box",chem:"chemical formula",delim:"delimiter",enclose:"cross out","extensible-symbol":"extensible symbol",error:"error",first:"first",genfrac:"fraction",group:"group",latex:"LaTeX",leftright:"delimiter",line:"line",subsup:"subscript-superscript",operator:"operator",overunder:"over-under",placeholder:"placeholder",rule:"rule",sizeddelim:"delimiter",space:"space",spacing:"spacing",surd:"square root",text:"text",prompt:"prompt",root:"math field",mop:"operator"}[t.type])!=null?r:"parent")}else if(t.parent.type==="genfrac"){if(t.parentBranch==="above")return"numerator";if(t.parentBranch==="below")return"denominator"}else t.parent.type==="surd"?t.parentBranch==="above"&&(e="index"):t.parentBranch==="superscript"?e="superscript":t.parentBranch==="subscript"&&(e="subscript");return e!=null?e:"parent"}function rp(t,e,r,i){let n="";if(e==="plonk"){globalThis.MathfieldElement.playSound("plonk"),t.flushInlineShortcutBuffer();return}if(e==="delete")n=Wr("deleted: ",i);else if(e==="focus"||e.includes("move"))n=Lb(t.model,r),n+=Ab(t.model);else if(e==="replacement")n=Wr(t.model.at(t.model.position));else if(e==="line"){let o=Wr(t.model.root).trim(),a=Rc(t.host);t.keyboardDelegate.setAriaLabel(o?`${a}: ${o}`:a)}else n=i?Wr(e+" ",i):e;if(n&&t.ariaLiveText){let o=t.ariaLiveText.textContent.includes("\xA0")?" \u202F ":" \xA0 ";t.ariaLiveText.textContent=n+o}}function Lb(t,e){if(Number.isNaN(e))return"";let r=t.at(e);if(!r||r.treeDepth<=t.at(t.position).treeDepth)return"";let i="",n=r.parent,o=t.at(t.position).parent;for(;n!==t.root&&n!==o;)i+=`out of ${Pc(n)};`,n=n.parent;return i}function Ab(t){if(!t.selectionIsCollapsed)return`selected: ${Wr(t.getAtoms(t.selection))}`;let e="",r=t.at(t.position);if(r.isFirstSibling&&(e=`start of ${Pc(r)}: `),r.isLastSibling){if(!r.isFirstSibling){if(!r.parent.parent)return`${Wr(r)}; end of mathfield`;e=`${Wr(r)}; end of ${Pc(r)}`}}else e+=Wr(r);return e}function ip(t,e){let r=t.at(t.position);if(r.type==="composition")r.value=e;else{let{caret:i}=r;r.caret=void 0;let n=new sn(e,{mode:r.mode});n.caret=i,r.parent.addChildAfter(n,r),t.position+=1}}function np(t){let e=t.at(t.position);e.type==="composition"&&(e.parent.removeChild(e),t.position-=1)}function Cb(t){let e=t.at(t.position);for(;e&&!Ze(e.parentBranch);)e=e.parent;return[e.firstSibling,e.lastSibling]}function Eb(t,e){let r=t.at(t.position);for(;r&&!(r.parent instanceof z);)r=r.parent;if((r==null?void 0:r.type)==="array"&&r.environmentName,!r||!(r.parent instanceof z)){let i=t.at(t.position);if(r=i,!r.parent.parent){let n=t.extractAtoms([t.position,t.lastOffset]),o=t.extractAtoms([0,t.position]),a;return e.endsWith("column")?(o.length===0&&(o=As()),n.length===0&&(n=As()),a=ze("split",[[o,n]]),t.root=a,Mo(a,0,0)?An(t,a,0,0):Mo(a,0,1)?An(t,a,0,1):t.position=t.offsetOf(i)):(a=ze("lines",[[o],[n]]),t.root=a,An(t,a,1,0)),[void 0,[0,0]]}if(r.parent instanceof J){let n=r.parent,o=t.extractAtoms([t.position,t.offsetOf(n.lastChild)]),a=t.extractAtoms([t.offsetOf(n.firstChild),t.position]);a.length===0&&(a=As()),o.length===0&&(o=As());let s="pmatrix",l=n.leftDelim,c=n.rightDelim;l==="("&&(c===")"||c==="?")?s="pmatrix":(l==="["||l==="\\lbrack")&&(c==="]"||c==="\\rbrack"||c==="?")?s="bmatrix":l==="\\vert"&&c==="\\vert"?s="vmatrix":l==="\\Vert"&&c==="\\Vert"?s="Vmatrix":(l==="{"||l==="\\lbrace")&&(c==="."||c==="?")&&(s="cases");let u=ze(s,e.endsWith("column")?[[a,o]]:[[a],[o]]);return n.parent.addChildBefore(u,n),n.parent.removeChild(n),Mo(u,0,0)?An(t,u,0,0):e.endsWith("column")?Mo(u,0,1)?An(t,u,0,1):t.position=t.offsetOf(r):Mo(u,1,0)?An(t,u,1,0):t.position=t.offsetOf(r),[void 0,[0,0]]}}return r&&r.parent instanceof z?[r.parent,r.parentBranch]:[void 0,[0,0]]}function Mo(t,e,r){let i=t.getCell(e,r);return(i==null?void 0:i.length)!==2?!1:i[1].type==="placeholder"}function Tb(t,e,r,i){let n=e.getCell(r,i);return n?[t.offsetOf(n[0]),t.offsetOf(n[n.length-1])]:-1}function An(t,e,r,i){let n=Tb(t,e,r,i);typeof n!="number"&&t.setSelection(n)}function Ls(t,e,r,i,n){let o=e.getCell(r,i);o&&t.setPositionHandlingPlaceholder(t.offsetOf(o[n==="start"?0:o.length-1]))}function wo(t,e){let[r,[i,n]]=Eb(t,e);if(r)switch(e){case"after row":r.addRowAfter(i),Ls(t,r,i+1,0,"end");break;case"after column":if(r.maxColumns<=r.colCount){t.announce("plonk");return}r.addColumnAfter(n),Ls(t,r,i,n+1,"end");break;case"before row":r.addRowBefore(i),Ls(t,r,i,0,"start");break;case"before column":if(r.maxColumns<=r.colCount){t.announce("plonk");return}r.addColumnBefore(n),Ls(t,r,i,n,"start");break}}function Ic(t){var r;let e=t.at(t.position);if(!Ze(e.parentBranch)&&e.parent!==t.root&&t.root.type!=="root")return t.announce("plonk"),!1;if(!t.contentWillChange({inputType:"insertText"}))return!1;if((r=t.parentEnvironment)!=null&&r.isMultiline){t.selectionIsCollapsed||t.deleteAtoms(de(t.selection));let[i,n]=Cb(t),o=t.extractAtoms([t.position,t.offsetOf(n)]),a=t.extractAtoms([t.offsetOf(i),t.position]),s=i.parent,[l,c]=i.parentBranch;return s.setCell(l,c,a),wo(t,"after row"),s.setCell(l+1,c,o),t.position=t.offsetOf(s.getCell(l+1,c)[0]),t.contentDidChange({inputType:"insertText"}),!0}return wo(t,"after row"),t.contentDidChange({inputType:"insertText"}),!0}function Db(t){return t.contentWillChange({inputType:"insertText"})?(wo(t,"before row"),t.contentDidChange({inputType:"insertText"}),!0):!1}function zc(t){return t.contentWillChange({inputType:"insertText"})?(wo(t,"after column"),t.contentDidChange({inputType:"insertText"}),!0):!1}function Ob(t){return t.contentWillChange({inputType:"insertText"})?(wo(t,"before column"),t.contentDidChange({inputType:"insertText"}),!0):!1}function Nc(t,e){if(!t.contentWillChange({}))return!1;t.mathfield.snapshot();let r=".",i=".";switch(e){case"pmatrix":case"pmatrix*":r="(",i=")";break;case"bmatrix":case"bmatrix*":r="[",i="]";break;case"Bmatrix":case"Bmatrix*":r="\\lbrace",i="\\rbrace";break;case"vmatrix":case"vmatrix*":r="\\vert",i="\\vert";break;case"Vmatrix":case"Vmatrix*":r="\\Vert",i="\\Vert";break;case"matrix":case"matrix*":r=".",i=".";break;case"cases":case"dcases":r="\\lbrace";break;case"rcases":i="\\rbrace";break}let n=t.at(t.position),o=n.type==="array"?n:t.parentEnvironment;return o.environmentName=e,o.leftDelim=r,o.rightDelim=i,t.contentDidChange({}),!0}function op(t,e){let r=t.at(t.position);for(;r&&!(Array.isArray(r.parentBranch)&&r.parent instanceof z);)r=r.parent;if(Array.isArray(r==null?void 0:r.parentBranch)&&(r==null?void 0:r.parent)instanceof z){let i=r.parent,n=r.parentBranch,o;switch(e){case"row":if(i.rowCount>1){i.removeRow(n[0]);let a=i.getCell(Math.max(0,n[0]-1),n[1]);o=t.offsetOf(a[a.length-1])}break;case"column":if(i.colCount>i.minColumns){i.removeColumn(n[1]);let a=i.getCell(n[0],Math.max(0,n[1]-1));o=t.offsetOf(a[a.length-1])}break}o!==void 0&&t.setPositionHandlingPlaceholder(o)}}function Bb(t){return t.contentWillChange({inputType:"deleteContent"})?(op(t,"row"),t.contentDidChange({inputType:"deleteContent"}),!0):!1}function Kb(t){return t.contentWillChange({inputType:"deleteContent"})?(op(t,"column"),t.contentDidChange({inputType:"deleteContent"}),!0):!1}fe({addRowAfter:Ic,addColumnAfter:zc,addRowBefore:Db,addColumnBefore:Ob,removeRow:Bb,removeColumn:Kb,setEnvironment:Nc},{target:"model",canUndo:!0,changeContent:!0,changeSelection:!0});function As(){return[new Me]}var Es=class Es{constructor(e){this.recording=!1;this.model=e,this.reset()}reset(){this.stack=[],this.index=-1,this.lastOp=""}startRecording(){this.recording=!0}stopRecording(){this.recording=!1}canUndo(){return this.index-1>=0}canRedo(){return this.stack.length-1>this.index}stopCoalescing(e){e&&this.index>=0&&(this.stack[this.index].selection=e),this.lastOp=""}undo(){if(!this.canUndo())return!1;let e=this.stack[this.index-1];return this.index-=1,this.lastOp="",this.model.setState(e,{silenceNotifications:!1,type:"undo"}),!0}redo(){if(!this.canRedo())return!1;let e=this.stack[this.index+1];return this.index+=1,this.lastOp="",this.model.setState(e,{silenceNotifications:!1,type:"redo"}),!0}pop(){this.canUndo()&&(this.stack.splice(this.index,this.stack.length-this.index),this.index-=1)}snapshot(e){return this.recording?(e&&e===this.lastOp&&this.pop(),this.stack.splice(this.index+1,this.stack.length-this.index-1),this.stack.push(this.model.getState()),this.index+=1,this.stack.length>Es.maximumDepth&&(this.stack.shift(),this.index-=1),this.lastOp=e!=null?e:"",!0):!1}};Es.maximumDepth=1e3;var Cs=Es;function So(t,e,r,i){var o,a,s,l,c,u;let n=r.parent;if(Ze(i)&&r instanceof z&&r.isMultiline&&Pb(t,r,i[0],e))return!0;if(n&&r instanceof J){let d=!i&&e==="forward"||i==="body"&&e==="backward",m=d?t.offsetOf(r.firstChild):t.offsetOf(r.lastChild);return d?r.rightDelim!=="?"&&r.rightDelim!=="."?(r.leftDelim=".",r.isDirty=!0):(n.addChildrenAfter(r.removeBranch("body"),r),n.removeChild(r),m--):r.leftDelim!=="?"&&r.leftDelim!=="."?(r.rightDelim=".",r.isDirty=!0):(n.addChildrenAfter(r.removeBranch("body"),r),n.removeChild(r),m--),t.position=m,!0}if(n&&r.type==="surd"){if(e==="forward"&&!i||e==="backward"&&i==="body"){let d=r.leftSibling;r.hasChildren&&n.addChildrenAfter(r.removeBranch("body"),r),n.removeChild(r),t.position=t.offsetOf(d)}else e==="forward"&&i==="body"?t.position=t.offsetOf(r):!i&&e==="backward"?r.hasChildren?t.position=t.offsetOf(r.lastChild):(t.position=Math.max(0,t.offsetOf(r)-1),n.removeChild(r)):i==="above"&&(r.hasEmptyBranch("above")&&r.removeBranch("above"),e==="backward"?t.position=t.offsetOf(r.leftSibling):t.position=t.offsetOf(r.body[0]));return!0}if(n&&(r.type==="box"||r.type==="enclose")){let d=i&&e==="backward"||!i&&e==="forward"?r.leftSibling:r.lastChild;return n.addChildrenAfter(r.removeBranch("body"),r),n.removeChild(r),t.position=t.offsetOf(d),!0}if(r.type==="genfrac"||r.type==="overunder"){if(!i)return r.type==="overunder"&&r.hasEmptyBranch("body")||r.type==="genfrac"&&r.hasEmptyBranch("below")&&r.hasEmptyBranch("above")?!1:(t.position=t.offsetOf(e==="forward"?r.firstChild:r.lastChild),!0);let d=lt.fractionNavigationOrder==="numerator-denominator"?"above":"below",m=d==="above"?"below":"above";if(n&&(e==="forward"&&i===d||e==="backward"&&i===m)){let p=r.removeBranch(d),f=r.removeBranch(m);return n.addChildrenAfter([...p,...f],r),n.removeChild(r),t.position=t.offsetOf(p.length>0?p[p.length-1]:f[0]),!0}return e==="backward"?t.position=t.offsetOf(r.leftSibling):t.position=t.offsetOf(r),!0}if(r.type==="extensible-symbol"||r.type==="subsup"||r.type==="operator"){if(!i&&e==="forward")return!1;if(!i){if(r.subscript||r.superscript){let d=e==="forward"?(s=(o=r.subscript)==null?void 0:o[0])!=null?s:(a=r.superscript)==null?void 0:a[0]:(u=(l=r.superscript)==null?void 0:l[0].lastSibling)!=null?u:(c=r.subscript)==null?void 0:c[0].lastSibling;return d&&(t.position=t.offsetOf(d)),!0}return!1}if(!r.hasChildren&&r.type==="subsup"){let d=e==="forward"?t.offsetOf(r):Math.max(0,t.offsetOf(r)-1);return r.parent.removeChild(r),t.position=d,!0}if(i&&r.hasEmptyBranch(i)){if(r.removeBranch(i),r.type==="subsup"&&!r.subscript&&!r.superscript){let d=e==="forward"?t.offsetOf(r):Math.max(0,t.offsetOf(r)-1);return r.parent.removeChild(r),t.position=d,!0}return i==="subscript"&&e==="backward"?t.position=t.offsetOf(r.firstChild)-1:i==="superscript"&&e==="backward"?r.subscript?t.position=t.offsetOf(r.subscript[0].lastSibling):t.position=t.offsetOf(r.firstChild)-1:t.position=t.offsetOf(r),!0}if(i==="subscript")if(e==="backward"){let d=t.offsetOf(r.firstChild)-1;d>=0,t.position=d}else r.superscript?t.position=t.offsetOf(r.superscript[0]):t.position=t.offsetOf(r);else i==="superscript"&&(e==="backward"&&r.subscript?t.position=t.offsetOf(r.subscript[0].lastSibling):e==="backward"?t.position=t.offsetOf(r.firstChild)-1:t.position=t.offsetOf(r));return!0}if((n==null?void 0:n.type)==="genfrac"&&!i&&r.type!=="first"){let d=t.offsetOf(r.leftSibling);return n.removeChild(r),n.hasEmptyBranch("above")&&n.hasEmptyBranch("below")?(d=t.offsetOf(n.leftSibling),n.parent.removeChild(n),t.announce("delete",void 0,[n]),t.position=d,!0):(t.announce("delete",void 0,[r]),t.position=d,!0)}if(e==="backward"&&((n==null?void 0:n.command)==="\\ln"||(n==null?void 0:n.command)==="\\log")&&r.parentBranch!=="body"){let d=t.offsetOf(n.leftSibling);return n.parent.removeChild(n),t.announce("delete",void 0,[n]),t.position=d,!0}return!1}function ap(t){return!t.mathfield.isSelectionEditable||!t.contentWillChange({inputType:"deleteContentBackward"})?!1:t.selectionIsCollapsed?t.deferNotifications({content:!0,selection:!0,type:"deleteContentBackward"},()=>{var i;let e=t.at(t.position);if(e&&So(t,"backward",e))return;if(e!=null&&e.isFirstSibling){if(So(t,"backward",e.parent,e.parentBranch))return;e=null}if(!e){t.announce("plonk");return}let r=e.parent;if(t.position=t.offsetOf(e.leftSibling),r.removeChild(e),t.announce("delete",void 0,[e]),r.type==="latexgroup"&&r.hasEmptyBranch("body")){let n=t.offsetOf(r.leftSibling);(i=r.parent)==null||i.removeChild(r),t.position=Math.max(0,n)}t.root.hasEmptyBranch("body")&&t.mathfield.flushInlineShortcutBuffer()}):ct(t,de(t.selection),"deleteContentBackward")}function sp(t){return!t.mathfield.isSelectionEditable||!t.contentWillChange({inputType:"deleteContentForward"})?!1:t.selectionIsCollapsed?t.deferNotifications({content:!0,selection:!0,type:"deleteContentForward"},()=>{var n,o,a;let e=t.at(t.position).rightSibling;if(e&&So(t,"forward",e))return;if(e){if(t.at(t.position).isLastSibling&&So(t,"forward",e.parent,e.parentBranch))return}else{if(e=t.at(t.position),e.isLastSibling&&So(t,"forward",e.parent,e.parentBranch))return;e=void 0}if(t.position===t.lastOffset||!e){t.announce("plonk");return}let r=e.parent;r.removeChild(e);let i=(n=t.at(t.position))==null?void 0:n.rightSibling;for(;(i==null?void 0:i.type)==="subsup";)i.parent.removeChild(i),i=(o=t.at(t.position))==null?void 0:o.rightSibling;if(t.announce("delete",void 0,[e]),r.type==="latexgroup"&&r.hasEmptyBranch("body")){let s=t.offsetOf(r.leftSibling);(a=r.parent)==null||a.removeChild(r),t.position=Math.max(0,s)}t.root.hasEmptyBranch("body")&&t.mathfield.flushInlineShortcutBuffer()}):ct(t,de(t.selection),"deleteContentForward")}function ct(t,e,r){let i=t.getAtoms(e);if(i.length>0&&i[0].parent){let n=i[0];for(;n&&!(n instanceof z);)n=n.parent;let o=i[i.length-1];for(;o&&!(o instanceof z);)o=o.parent;if(n&&n instanceof z){let u=n;if(u&&o===u&&u.isMultiline){let[d,m]=[Math.min(t.position,t.anchor),Math.max(t.position,t.anchor)],[p,f]=t.at(d).parentBranch,[y,v]=t.at(m).parentBranch;if(y-p+1>=2)return t.deferNotifications({content:!0,selection:!0,type:r},()=>{var _;let k=u.getCell(p,f),S=u.getCell(y,v);if(!k||!S)return;t.extractAtoms([d,m]);let A=u.getCell(p,f),E=u.getCell(y,v);for(let O=y-1;O>p;O--)u.removeRow(O);if(p!==y){let O=u.getCell(p+1,f);if(A&&O){let I=[...A.filter(V=>V.type!=="first"),...O.filter(V=>V.type!=="first")];u.setCell(p,f,I),u.removeRow(p+1)}}let C=u.getCell(p,f);if(C){let O=A?A.filter(I=>I.type!=="first").length:0;t.position=t.offsetOf((_=C[O])!=null?_:C[0])}else t.position=d;u.isDirty=!0})}}let a=i[0].parent.firstChild;a.type==="first"&&(a=a.rightSibling);let s=i[i.length-1].parent.lastChild,l=i[0];l.type==="first"&&(l=l.rightSibling);let c=i[i.length-1];if(l===a&&c===s){let u=i[0].parent;u.parent&&u.type!=="prompt"&&(e=[t.offsetOf(u.leftSibling),t.offsetOf(u)])}if(i.length===1&&i[0].type==="placeholder"&&i[0].parent.type==="genfrac"){let u=i[0].parent,d=i[0].parentBranch==="below"?"above":"below",m=t.offsetOf(u.leftSibling);return t.deferNotifications({content:!0,selection:!0,type:r},()=>{var f,y;let p=u.removeBranch(d);if(p.length===1&&p[0].type==="placeholder")(y=u.parent)==null||y.removeChild(u),t.position=Math.max(0,m);else{let v=u.parent.addChildrenAfter(p,u);(f=u.parent)==null||f.removeChild(u),t.position=t.offsetOf(v)}})}}return t.deferNotifications({content:!0,selection:!0,type:r},()=>{let n=new Map;if(i.length>0){let a=i[0],s=i[i.length-1],l=new Set,c=a.parent;for(;c;)(c.type==="surd"||c.type==="box"||c.type==="enclose"||c.type==="leftright"||c.type==="genfrac"||c.type==="overunder")&&c.parent&&l.add(c),c=c.parent;let u=new Set;for(c=s.parent;c;)(c.type==="surd"||c.type==="box"||c.type==="enclose"||c.type==="leftright"||c.type==="genfrac"||c.type==="overunder")&&c.parent&&u.add(c),c=c.parent;for(let d of i)for(c=d.parent;c;){if((c.type==="surd"||c.type==="box"||c.type==="enclose"||c.type==="leftright"||c.type==="genfrac"||c.type==="overunder")&&c.parent){n.has(c)||n.set(c,{containsStart:l.has(c),containsEnd:u.has(c)});break}c=c.parent}}let o=Math.min(...e);t.deleteAtoms(e);for(let[a,s]of n){if(!a.parent)continue;let l=s.containsStart!==s.containsEnd;if(a.type==="surd"||a.type==="box"||a.type==="enclose"||a.type==="leftright"){let c=a.branch("body");if(!c||c.length===0||c.length===1&&c[0].type==="placeholder"){let d=t.offsetOf(a.leftSibling);a.parent.removeChild(a),t.position=Math.max(0,d)}else if(l&&!s.containsStart&&s.containsEnd){let d=t.offsetOf(a.leftSibling),m=a.removeBranch("body");m&&m.length>0&&a.parent.addChildrenAfter(m,a),a.parent.removeChild(a),t.position=Math.max(0,d)}}if(a.type==="genfrac"){let c=a.branch("above"),u=a.branch("below"),d=!c||c.length===0||c.length===1&&c[0].type==="placeholder",m=!u||u.length===0||u.length===1&&u[0].type==="placeholder";if(d&&m){let p=t.offsetOf(a.leftSibling);a.parent.removeChild(a),t.position=Math.max(0,p)}else if(d&&!m){let p=t.offsetOf(a.leftSibling),f=a.removeBranch("below");f&&f.length>0&&a.parent.addChildrenAfter(f,a),a.parent.removeChild(a),t.position=Math.max(0,p)}else if(!d&&m){let p=t.offsetOf(a.leftSibling),f=a.removeBranch("above");f&&f.length>0&&a.parent.addChildrenAfter(f,a),a.parent.removeChild(a),t.position=Math.max(0,p)}else if(l&&!s.containsStart&&s.containsEnd&&!d&&!m){let p=t.offsetOf(a.leftSibling),f=a.removeBranch("above");f&&f.length>0&&a.parent.addChildrenAfter(f,a),a.parent.removeChild(a),t.position=Math.max(0,p)}}}n.size===0&&(t.position=o),t.root.hasEmptyBranch("body")&&t.mathfield.flushInlineShortcutBuffer()})}function Pb(t,e,r,i){if(!(e instanceof z)||!e.isMultiline||e.rows.length===1||e.rows[r].length>1)return!1;let n=e.getCell(r,0);if(!n)return!1;if(e.removeRow(r),i==="backward"){let o=e.getCell(r-1,0);if(!o)return t.position=t.offsetOf(e),!0;o.length>0?t.position=t.offsetOf(o[o.length-1]):t.position=t.offsetOf(e),e.setCell(r-1,0,[...o,...n])}else{let o=e.getCell(r,0);if(!o)return t.position=t.offsetOf(e),!0;o.length>0?t.position=t.offsetOf(o[0]):t.position=t.offsetOf(e),e.setCell(r,0,[...n,...o])}return!0}function Rb(t,e,r){var o,a;if(t.at(e).mode!=="text")return e;let i=r==="backward"?-1:1,n;if(Qr.test(t.at(e).value)){let s=e,l;do l=t.at(s).mode==="text"&&Qr.test(t.at(s).value),s+=i;while(t.at(s)&&l);n=t.at(s)?s-2*i:s-i}else if(/\s/.test(t.at(e).value)){let s=e;for(;((o=t.at(s))==null?void 0:o.mode)==="text"&&/\s/.test(t.at(s).value);)s+=i;if(!t.at(s))n=s-i;else{let l=!0;do l=t.at(s).mode==="text"&&!/\s/.test(t.at(s).value),s+=i;while(t.at(s)&&l);n=t.at(s)?s-2*i:s-i}}else{let s=e;for(;((a=t.at(s))==null?void 0:a.mode)==="text"&&!/\s/.test(t.at(s).value);)s+=i;n=t.at(s)?s:s-i;let l=!0;for(;t.at(s)&&l;)l=t.at(s).mode==="text"&&/\s/.test(t.at(s).value),l&&(n=s),s+=i;n=t.at(s)?s-2*i:s-i}return n-(i>0?0:1)}function St(t,e,r){var a,s,l,c,u,d,m,p;let i=t.position;(a=r==null?void 0:r.extend)!=null&&a||t.collapseSelection(e);let n=t.at(t.position);if(e==="forward"&&(n.type==="subsup"?(n=n.rightSibling,n||(n=t.at(t.position+1))):n=t.at(t.position+1)),!n)return t.announce("plonk"),!1;let o=t.offsetOf(n);if(n instanceof We)o=Rb(t,o,e);else if(n instanceof he)if(n.isSuggestion)for(;n&&n instanceof he;)n.isSuggestion=!1,o=t.offsetOf(n),n=n.rightSibling;else if(e==="forward"){if(n=n.rightSibling,!n||!(n instanceof he))return t.announce("plonk"),!1;for(;n&&n instanceof he&&/[a-zA-Z\*]/.test(n.value);)o=t.offsetOf(n),n=n.rightSibling}else{if(n=n.leftSibling,!n||!(n instanceof he))return t.announce("plonk"),!1;for(;n&&n instanceof he&&/[a-zA-Z\*]/.test(n.value);)o=t.offsetOf(n),n=n.leftSibling}else if(e==="forward"&&n.type==="mopen"){let f=0;do n.type==="mopen"?f+=1:n.type==="mclose"&&(f-=1),n=n.rightSibling;while(!n.isLastSibling&&f!==0);o=t.offsetOf(n.leftSibling)}else if(e==="backward"&&n.type==="mclose"){let f=0;do n.type==="mopen"?f+=1:n.type==="mclose"&&(f-=1),n=n.leftSibling;while(!n.isFirstSibling&&f!==0);o=t.offsetOf(n)}else if(e==="backward")if(n.type==="first")for(;o>0&&n.type==="first";)o-=1,n=t.at(o);else{let f=n.type;n.type==="subsup"&&(o=t.offsetOf(t.at(o).leftSibling)),o-=1;let y=(s=t.at(o))==null?void 0:s.type;for(;o>=0&&y===f;)((l=t.at(o))==null?void 0:l.type)==="subsup"?o=t.offsetOf(t.at(o).leftSibling):o-=1,y=t.at(o).type}else{let{type:f}=n,y=(c=t.at(o))==null?void 0:c.type,{lastOffset:v}=t;for(;o<=v&&(y===f||y==="subsup");){for(;((u=t.at(o).rightSibling)==null?void 0:u.type)==="subsup";)o=t.offsetOf(t.at(o).rightSibling);o+=1,y=(d=t.at(o))==null?void 0:d.type}o-=1}if((m=r==null?void 0:r.extend)!=null&&m){if(!t.setSelection(t.anchor,o))return t.announce("plonk"),!1;t.announce("move",i)}else{if(o===t.position)return t.announce("plonk"),!1;(p=r==null?void 0:r.delete)!=null&&p?e==="forward"?ct(t,[i,o],"deleteWordForward"):(ct(t,[i,o],"deleteWordBackward"),t.position=o):(t.position=o,t.announce("move",i))}return t.mathfield.stopCoalescingUndo(),!0}function ut(t,e,r){var o,a;if(r=r!=null?r:{extend:!1},t.mathfield.styleBias=e==="backward"?"right":"left",e!=="forward"){let[s,l]=ps(t);s!==void 0&&l!==void 0&&t.deleteAtoms([s,l])}if(e==="upward")return zb(t,r);if(e==="downward")return Nb(t,r);if(r.extend){let s=Ts(t,t.position,e);s<0&&(s=0),s>t.lastOffset&&(s=t.lastOffset);let l=t.setSelection(t.anchor,s);return t.mathfield.stopCoalescingUndo(),l}if(t.selectionIsPlaceholder){t.collapseSelection(e);let s=ut(t,e);return t.mathfield.stopCoalescingUndo(),s}let i=t.position,n=i;if(t.collapseSelection(e)?(i=t.position,lp(t,i)||(i=Ts(t,i,e))):i=Ts(t,i,e),i<0||i>t.lastOffset){let s=!0;return t.silenceNotifications||(s=(a=(o=t.mathfield.host)==null?void 0:o.dispatchEvent(new CustomEvent("move-out",{detail:{direction:e},cancelable:!0,bubbles:!0,composed:!0})))!=null?a:!0),s&&t.announce("plonk"),s}return t.setPositionHandlingPlaceholder(i),t.mathfield.stopCoalescingUndo(),t.announce("move",n),!0}function Ts(t,e,r){return e=e+(r==="forward"?1:-1),e<0||e>t.lastOffset||lp(t,e)?e:Ts(t,e,r)}function lp(t,e){var n;let r=t.at(e),i=r.parent;for(;i&&!i.inCaptureSelection;)i=i.parent;return!(i!=null&&i.inCaptureSelection||(n=r.parent)!=null&&n.skipBoundary&&(!r.isFirstSibling&&r.isLastSibling||r.type==="first")||t.mathfield.hasEditablePrompts&&!r.parentPrompt)}function Ib(t,e,r){let i=1/0,n=0;for(;nc.type==="prompt"&&!c.captureSelection):r,s=pc(t.mathfield.getHTMLElement(e)).right,l=t.offsetOf(Ib(t.mathfield,a,s))-(o?1:0);if(i){let[c,u]=t.selection.ranges[0],d;l<(n==="up"?c:u)?d={ranges:[[l,u]],direction:"backward"}:d={ranges:[[c,l]],direction:"forward"},t.setSelection(d)}else t.setPositionHandlingPlaceholder(l);t.announce(`move ${n}`)}function zb(t,e){var a,s;let r=(a=e==null?void 0:e.extend)!=null?a:!1;r||t.collapseSelection("backward");let i=()=>{var c,u;let l=!0;return t.silenceNotifications||(l=(u=(c=t.mathfield.host)==null?void 0:c.dispatchEvent(new CustomEvent("move-out",{detail:{direction:"upward"},cancelable:!0,bubbles:!0,composed:!0})))!=null?u:!0),t.announce(l?"line":"plonk"),l},n=t.at(t.position),o=n;for(;o&&o.parentBranch!=="below"&&!(Array.isArray(o.parentBranch)&&o.parent instanceof z);)o=o.parent;if(Array.isArray(o==null?void 0:o.parentBranch)&&o.parent instanceof z){let l=o.parent;if(o.parentBranch[0]<1)return i();let c=o.parentBranch[0]-1,u=l.getCell(c,o.parentBranch[1]);if(!u.some(m=>m.type==="prompt"&&!m.captureSelection)&&t.mathfield.hasEditablePrompts)return i();Ds(t,n,u,r,"up")}else if(o){let l=(s=o.parent.branch("above"))!=null?s:o.parent.createBranch("above");if(!l.some(u=>u.type==="prompt"&&u.placeholderId)&&t.mathfield.hasEditablePrompts)return i();Ds(t,n,l,r,"up")}else return i();return t.mathfield.stopCoalescingUndo(),!0}function Nb(t,e){var a,s;let r=(a=e==null?void 0:e.extend)!=null?a:!1;r||t.collapseSelection("forward");let i=()=>{var c,u;let l=!0;return t.silenceNotifications||(l=(u=(c=t.mathfield.host)==null?void 0:c.dispatchEvent(new CustomEvent("move-out",{detail:{direction:"downward"},cancelable:!0,bubbles:!0,composed:!0})))!=null?u:!0),t.announce(l?"line":"plonk"),l},n=t.at(t.position),o=n;for(;o&&o.parentBranch!=="above"&&!(Ze(o.parentBranch)&&o.parent instanceof z);)o=o.parent;if(Ze(o==null?void 0:o.parentBranch)&&o.parent instanceof z){let l=o.parent;if(o.parentBranch[0]+1>l.rows.length-1)return i();let c=o.parentBranch[0]+1,u=l.getCell(c,o.parentBranch[1]);if(!u.some(m=>m.type==="prompt"&&!m.captureSelection)&&t.mathfield.hasEditablePrompts)return i();Ds(t,n,u,r,"down")}else if(o){let l=(s=o.parent.branch("below"))!=null?s:o.parent.createBranch("below");if(!l.some(u=>u.type==="prompt")&&t.mathfield.hasEditablePrompts)return i();Ds(t,n,l,r,"down")}else return i();return!0}function $c(t){let e=t.position,r=t.at(e).parent;return r!=null&&r.parent?(t.position=t.offsetOf(r),t.mathfield.stopCoalescingUndo(),t.announce("move",e),!0):(t.announce("plonk"),!1)}function Fb(t){let e=0,r=t.at(t.position),i=!1;for(;r;)r.hasEmptyBranch("superscript")?r.hasEmptyBranch("subscript")||(i=!1):(e+=1,i=!0),r=r.parent;return i?e:0}function $b(t){let e=0,r=t.at(t.position),i=!1;for(;r;)r.hasEmptyBranch("subscript")?r.hasEmptyBranch("superscript")||(i=!1):(e+=1,i=!0),r=r.parent;return i?e:0}function cp(t){if(t.collapseSelection(),Fb(t)>=t.mathfield.options.scriptDepth[1])return t.announce("plonk"),!1;let e=t.at(t.position);if(e.subsupPlacement===void 0){let r=e.rightSibling;(r==null?void 0:r.type)!=="subsup"&&(r=new cr({style:e.style}),e.parent.addChildAfter(r,e)),e=r}return e.createBranch("superscript"),t.setSelection(t.getSiblingsRange(t.offsetOf(e.superscript[0]))),!0}function up(t){if(t.collapseSelection(),$b(t)>=t.mathfield.options.scriptDepth[0])return t.announce("plonk"),!1;let e=t.at(t.position);if(e.subsupPlacement===void 0){let r=e.rightSibling;(r==null?void 0:r.type)!=="subsup"&&(r=new cr({style:e.style}),e.parent.addChildAfter(r,e)),e=r}return e.createBranch("subscript"),t.setSelection(t.getSiblingsRange(t.offsetOf(e.subscript[0]))),!0}function Vb(){function t(l){let c=[],u=[];return[...l.querySelectorAll(`input, select, textarea, a[href], button, + [tabindex], audio[controls], video[controls], + [contenteditable]:not([contenteditable="false"]), details>summary`)].filter(e).forEach((m,p)=>{let f=i(m);f===0?c.push(m):u.push({documentOrder:p,tabIndex:f,node:m})}),u.sort((m,p)=>m.tabIndex===p.tabIndex?m.documentOrder-p.documentOrder:m.tabIndex-p.tabIndex).map(m=>m.node).concat(c)}function e(l){return!(!r(l)||n(l)||i(l)<0)}function r(l){return!(l.disabled||l.type==="hidden"&&l.tagName.toUpperCase()==="INPUT"||s(l))}function i(l){var u;let c=Number.parseInt((u=l.getAttribute("tabindex"))!=null?u:"NaN",10);return Number.isNaN(c)?l.contentEditable==="true"||(l.nodeName==="AUDIO"||l.nodeName==="VIDEO")&&l.getAttribute("tabindex")===null?0:l.tabIndex:c}function n(l){return l.tagName.toUpperCase()==="INPUT"&&l.type==="radio"&&!a(l)}function o(l,c){for(let u of l)if(u.checked&&u.form===c)return u;return null}function a(l){var m;if(!l.name)return!0;let u=((m=l.form)!=null?m:l.ownerDocument).querySelectorAll('input[type="radio"][name="'+l.name+'"]'),d=o(u,l.form);return!d||d===l}function s(l){if(!Le()||l===document.activeElement||l.contains(document.activeElement))return!1;if(getComputedStyle(l).visibility==="hidden")return!0;let c=l.getBoundingClientRect();if(c.width===0||c.height===0)return!0;for(;l;){if(getComputedStyle(l).display==="none")return!0;l=l.parentElement}return!1}return Le()?t(document.body):[]}function Ke(t,e,r="forward"){let i=t.position;if(ee(e)){let n=t.offsetOf(e[0]),o=t.offsetOf(e[e.length-1]);return r==="forward"?t.setSelection(n,o):t.setSelection(o,n),t.announce("move",i),t.mathfield.stopCoalescingUndo(),!0}return r==="forward"?Ke(t,[e.leftSibling,e]):Ke(t,[e,e.leftSibling])}function kt(t,e){let r=t.position;if(typeof e=="number"&&(e=t.at(e)),e.type==="prompt")t.setSelection(t.offsetOf(e.firstChild),t.offsetOf(e.lastChild));else{let i=t.offsetOf(e);e.type==="placeholder"?t.setSelection(i-1,i):t.position=i}return t.announce("move",r),t.mathfield.stopCoalescingUndo(),!0}function Cn(t,e){var a,s;let r=e==="forward"?1:-1;t.at(t.anchor).type==="placeholder"&&ut(t,e);let i,n=t.at(t.anchor).parentPrompt;n?e==="forward"?i=t.offsetOf(n)+1:i=t.offsetOf(n.leftSibling):i=Math.max(t.position+r,0);let o=Fc(t,i,e);if(!o||e==="forward"&&t.offsetOf(o)i){if(!((s=(a=t.mathfield.host)==null?void 0:a.dispatchEvent(new CustomEvent("move-out",{detail:{direction:e},cancelable:!0,bubbles:!0,composed:!0})))!=null?s:!0))return t.announce("plonk"),!1;let c=Vb();if(!document.activeElement||c.length<=1)return t.announce("plonk"),!1;let u=c.indexOf(document.activeElement)+r;return u<0&&(u=c.length-1),u>=c.length&&(u=0),c[u].focus(),t.mathfield.stopCoalescingUndo(),!0}return kt(t,o),!0}function Fc(t,e=0,r="forward"){return t.findAtom(i=>i.type==="placeholder"||i.type==="prompt"||!t.mathfield.readOnly&&i.treeDepth>2&&i.isFirstSibling&&i.isLastSibling,e,r)}fe({moveToOpposite:t=>{let e={superscript:"subscript",subscript:"superscript",above:"below",below:"above"},r=t.at(t.position),{parent:i}=r;if(!i)return t.announce("plonk"),!1;let n=r.parentBranch,o;if(typeof n=="string"&&(o=e[n]),!o){let s=r.subsupPlacement?up(t):cp(t);return t.mathfield.stopCoalescingUndo(),s}i.branch(o)||i.createBranch(o);let a=t.setSelection(t.getBranchRange(t.offsetOf(i),o));return t.mathfield.stopCoalescingUndo(),a},moveBeforeParent:t=>{let{parent:e}=t.at(t.position);return e?(t.position=t.offsetOf(e),t.mathfield.stopCoalescingUndo(),!0):(t.announce("plonk"),!1)},moveAfterParent:t=>$c(t),moveToNextChar:t=>ut(t,"forward"),moveToPreviousChar:t=>ut(t,"backward"),moveUp:t=>ut(t,"upward"),moveDown:t=>ut(t,"downward"),moveToNextWord:t=>St(t,"forward"),moveToPreviousWord:t=>St(t,"backward"),moveToGroupStart:t=>{let e=t.offsetOf(t.at(t.position).firstSibling);return e===t.position?(t.announce("plonk"),!1):(t.position=e,t.mathfield.stopCoalescingUndo(),!0)},moveToGroupEnd:t=>{let e=t.offsetOf(t.at(t.position).lastSibling);return e===t.position?(t.announce("plonk"),!1):(t.position=e,t.mathfield.stopCoalescingUndo(),!0)},moveToNextGroup:t=>{var l,c,u,d;if(t.position===t.lastOffset&&t.anchor===t.lastOffset)return Cn(t,"forward");let e=t.at(t.position);if(e.mode==="text"){if(t.selectionIsCollapsed){let m=e;for(;(m==null?void 0:m.mode)==="text";)m=m.leftSibling;let p=e;for(;((l=p.rightSibling)==null?void 0:l.mode)==="text";)p=p.rightSibling;if(m&&p)return Ke(t,[m,p])}if(e.rightSibling.mode==="text"){let m=e;for(;(m==null?void 0:m.mode)==="text";)m=m.rightSibling;return m?(kt(t,(c=m.leftSibling)!=null?c:m),t.mathfield.switchMode("math"),!0):kt(t,t.lastOffset)}}let i=t.at(t.anchor).parentPrompt,n=i?t.offsetOf(i)+1:Math.max(t.position+1,0),o=Fc(t,n,"forward");if(o&&t.offsetOf(o)m.type==="leftright"||m.type==="text","forward");if(a){if(a.mode==="text"){let m=a;for(;(m==null?void 0:m.mode)==="text";)m=m.rightSibling;return Ke(t,[(u=a.leftSibling)!=null?u:a,(d=m.leftSibling)!=null?d:m])}return Ke(t,a)}let s=e.parent;if(s){if(s.type==="leftright"||s.type==="surd")return Ke(t,s);if(e.parentBranch==="subscript"&&s.superscript)return Ke(t,s.superscript);if(e.parentBranch==="above"&&s.below)return Ke(t,s.below);if(e.parentBranch==="superscript"||e.parentBranch==="subscript")return kt(t,s);if(e.parentBranch==="above"||e.parentBranch==="below")return Ke(t,s)}return kt(t,t.lastOffset)},moveToPreviousGroup:t=>{var a;if(t.position===0&&t.anchor===0)return Cn(t,"backward");let e=t.at(t.position),r=e.mode;if(r==="text"){if(t.selectionIsCollapsed){let s=e;for(;(s==null?void 0:s.mode)==="text";)s=s.leftSibling;let l=e;for(;((a=l.rightSibling)==null?void 0:a.mode)==="text";)l=l.rightSibling;if(s&&l)return Ke(t,[s,l])}for(;(e==null?void 0:e.mode)==="text";)e=e.leftSibling;return e?kt(t,e):kt(t,0)}let i=t.at(t.anchor).parentPrompt,n=i?t.offsetOf(i.leftSibling):Math.max(t.position-1,0),o=Fc(t,n,"backward");if(o&&t.offsetOf(o)>n)return Cn(t,"backward");if(o)return kt(t,o);if(r==="math"){let s=dp(t,e,c=>c.type==="leftright"||c.type==="text","backward");if(s){if(s.mode==="text"){let c=s;for(;(c==null?void 0:c.mode)==="text";)c=c.leftSibling;return Ke(t,[s,c])}return Ke(t,s)}let l=e.parent;if(l){if(l.type==="leftright"||l.type==="surd")return Ke(t,l);if(e.parentBranch==="superscript"&&l.subscript)return Ke(t,l.subscript);if(e.parentBranch==="below"&&l.above)return Ke(t,l.above);if(e.parentBranch==="superscript"||e.parentBranch==="subscript")return kt(t,l);if(e.parentBranch==="above"||e.parentBranch==="below")return Ke(t,l)}return kt(t,0)}return!1},moveToMathfieldStart:t=>t.selectionIsCollapsed&&t.position===0?(t.announce("plonk"),!1):(t.position=0,t.mathfield.stopCoalescingUndo(),!0),moveToMathfieldEnd:t=>t.selectionIsCollapsed&&t.position===t.lastOffset?(t.announce("plonk"),!1):(t.position=t.lastOffset,t.mathfield.stopCoalescingUndo(),!0),moveToSuperscript:cp,moveToSubscript:up},{target:"model",changeSelection:!0});fe({moveToNextPlaceholder:t=>Cn(t,"forward"),moveToPreviousPlaceholder:t=>Cn(t,"backward")},{target:"model",changeSelection:!0,audioFeedback:"return"});function dp(t,e,r,i){if(i==="forward"){let o=e.rightSibling;for(;o&&!r(o);)o=o.rightSibling;return o}let n=e.leftSibling;for(;n&&!r(n);)n=n.leftSibling;return n}function Os(t,e,r){typeof e=="function"&&(r=e,e=1/0),e===void 0&&(e=1/0);let i=t.position,n=!1,o="";for(;!n;){let a=t.at(i);n=e===0||a===void 0||a.type==="first"||a.mode!=="math"||!(a.type&&/mord|mpunct|operator/.test(a.type)||a.type==="mop"&&/[a-zA-Z ]+/.test(a.value))||!a.hasEmptyBranch("superscript")||!a.hasEmptyBranch("subscript")||typeof r=="function"&&!r(a),n||(a.mode="text",a.command=a.value,a.verbatimLatex=void 0,o+=a.value),i-=1,e-=1}t.contentDidChange({data:o,inputType:"insertText"})}function Si(t,e,r){typeof e=="function"&&(r=e,e=1/0),e===void 0&&(e=1/0);let i=t.position,n=!1,o=[];for(;!n;){let a=t.at(i);n=e===0||!a||a.type==="first"||a.isFirstSibling||a.mode!=="text"||a.value===" "||typeof r=="function"&&!r(a),n||(o.push(x.serialize([a],{defaultMode:"math"})),a.mode="math"),i-=1,e-=1}Bs(t),t.contentDidChange({data:R(o),inputType:"insertText"})}function Bs(t){var r;let e=t.position-1;for(;e>=0&&((r=t.at(e))==null?void 0:r.mode)==="math";)e-=1;if(!(e<0)&&t.at(e).mode==="text"&&t.at(e).value===" "&&t.at(e-1).mode==="math"){t.at(e-1).parent.removeChild(t.at(e-1));let i=t.silenceNotifications;t.silenceNotifications=!0,t.position-=1,t.silenceNotifications=i,t.contentDidChange({inputType:"deleteContent"})}}function qb(t){let e="",r=t.position,i=!1;for(;!i;){let n=t.at(r);i=!(n&&(n.mode==="text"||n.mode==="math"&&n.type&&/mord|mpunct/.test(n.type))),i||(e=n.value+e),r-=1}return e}function mp(t,e,r){let{model:i}=t;if(i.mode==="latex"||!i.at(i.position).isLastSibling||!r||!dr(r))return!1;let n=Fr(r);if(!i.selectionIsCollapsed)return!!(t.model.mode==="text"&&/[/_^]/.test(n));let o=qb(i)+n;if(t.model.mode==="text"){if(e==="Esc"||/[/\\]/.test(n))return!0;if(/[\^_]/.test(n))return/(^|\s)[a-zA-Z][^_]$/.test(o)&&Si(i,1),!0;let a={")":"(","}":"{","]":"["}[n],{parent:s}=i.at(i.position);if(a&&s instanceof J&&s.leftDelim===a)return!0;if(/(^|[^a-zA-Z])(a|I) $/.test(o))return!1;if(/[$€£₤₺¥¤฿¢₡₧₨₹₩₱]/u.test(n))return!0;if(/(^|[^a-zA-Z'’])[a-zA-Z] $/.test(o))return Si(i,1),!1;if(/\D\.[^\d\s]$/.test(o)){Si(i,1);let l=i.at(i.position);return l.value="\u22C5",l.style.variant="normal",l.command="\\cdot",l.verbatimLatex=void 0,i.contentDidChange({data:"\\cdot",inputType:"insertText"}),!0}if(/(^|\s)[a-zA-Z][^a-zA-Z]$/.test(o)||/\.\d$/.test(o)||/\([\d+\-.]$/.test(o))return Si(i,1),!0;if(/\([a-z][,;]$/.test(o))return Si(i,2),!0;if(/[\d+\-=><*|]$/.test(n))return Bs(i),!0}else{if(e==="[Space]")return Os(i,void 0,a=>/[a-z][:,;.]$/.test(a.value)),!0;if(/[a-zA-Z]{3,}$/.test(o)&&!/(dxd|abc|xyz|uvw)$/.test(o))return Os(i,void 0,a=>/[a-zA-Z]/.test(a.value)),!0;if(/(^|\W)(if)$/i.test(o))return Os(i,1),!0;if(/(\u0393|\u0394|\u0398|\u039B|\u039E|\u03A0|\u03A3|\u03A5|\u03A6|\u03A8|\u03A9|[\u03B1-\u03C9]|\u03D1|\u03D5|\u03D6|\u03F1|\u03F5){3,}$/u.test(o)&&!/(αβγ)$/.test(o))return Os(i,void 0,a=>/(:|,|;|.|\u0393|\u0394|\u0398|\u039B|\u039E|\u03A0|\u03A3|\u03A5|\u03A6|\u03A8|\u03A9|[\u03B1-\u03C9]|\u03D1|\u03D5|\u03D6|\u03F1|\u03F5)/u.test(a.value)),!0;if(n==="?"||n==="."&&!/[\d-+]\.$/.test(o))return!0}return!1}function hp(t,e){if(!t.isSelectionEditable||!t.keystrokeCaptionVisible)return;let r=fp(),i=t.element.getBoundingClientRect();r.style.left=`${i.left}px`,r.style.top=`${i.top-64}px`,r.innerHTML=globalThis.MathfieldElement.createHTML(""+(gn(e)||e)+""+r.innerHTML),r.style.visibility="visible",setTimeout(()=>{r.childNodes.length>0&&r.childNodes[r.childNodes.length-1].remove(),r.childNodes.length===0&&(r.style.visibility="hidden")},3e3)}function pp(t){if(t.keystrokeCaptionVisible=!t.keystrokeCaptionVisible,t.keystrokeCaptionVisible){let e=fp();e.innerHTML=""}else{let e=vi("mathlive-keystroke-caption-panel");e.style.visibility="hidden"}return!1}function fp(){let t=document.getElementById("mathlive-keystroke-caption-panel");return t||(Ge("keystroke-caption"),Ge("core"),vi("mathlive-keystroke-caption-panel"))}function gp(){document.getElementById("mathlive-keystroke-caption-panel")&&(qr("mathlive-keystroke-caption-panel"),ot("core"),ot("keystroke-caption"))}function qc(t,e){var m,p,f,y;let{model:r}=t,i=hs(e);if(e.isTrusted){Eu(e);let v=yr();t.keyboardLayout!==v.id&&(t.keyboardLayout=v.id,t._keybindings=void 0)}if(clearTimeout(t.inlineShortcutBufferFlushTimer),t.inlineShortcutBufferFlushTimer=0,hp(t,i),e.isTrusted&&e.defaultPrevented)return t.flushInlineShortcutBuffer(),!1;let n,o=0,a="",s=0,l=t.inlineShortcutBuffer,c=!1;if(t.isSelectionEditable&&r.selectionIsPlaceholder&&dr(e)&&(t.flushInlineShortcutBuffer(),r.deleteAtoms(de(r.selection)),t.snapshot("delete"),c=!0),t.isSelectionEditable){if(r.mode==="math"&&(!r.selectionIsPlaceholder||c))if(i==="[Backspace]")t.undoManager.lastOp==="insert-shortcut"?a="undo":l.pop();else if(!dr(e))t.flushInlineShortcutBuffer();else{let v=Fr(e),b=[...(p=(m=l[l.length-1])==null?void 0:m.keystrokes)!=null?p:[],v];l.push({state:r.getState(),keystrokes:b,leftSiblings:Ub(t)}),o=0;let k="";for(;!n&&o(H.insert(r,n,{format:"latex",style:v}),Bs(t.model),n.endsWith(" ")&&(t.switchMode("text"),H.insert(r," ",{style:v,mode:"text"})),t.snapshot(),r.selectionIsCollapsed||t.flushInlineShortcutBuffer(),!0)),t.dirty=!0,r.announce("replacement")}return t.scrollIntoView(),e.preventDefault&&e.preventDefault(),!1}function Hb(t){var p,f;let{position:e}=t,r=e,i=[];for(;r>0;){let y=t.at(r),v=y.value;if(y.type==="mord"||y.type==="mbin"&&(v==="+"||v==="-"||v==="\u2212"))i.unshift(y),r--;else break}if(i.length===0)return null;let n=i.map(y=>y.value).join(""),a=((f=(p=globalThis.MathfieldElement)==null?void 0:p.decimalSeparator)!=null?f:".")==="."?"\\.":",",s=new RegExp(`^(\\d+(?:${a}\\d*)?)[eE]([+\\-\u2212]?)(\\d+)$`),l=n.match(s);if(!l)return null;let c=l[1],u=l[2],d=l[3],m=u+d;return{startOffset:r,endOffset:e,significand:c,exponent:m}}function Wb(t,e){var n;let r=(n=globalThis.MathfieldElement)==null?void 0:n.scientificNotationTemplate;if(!r||r===""||!r.includes("#1")||!r.includes("#2"))return null;let i=r.replace("#1",t);return i=i.replace("#2",e),i}function bp(t){let{model:e}=t;if(e.mode!=="math")return!1;let r=Hb(e);if(!r)return!1;let i=Wb(r.significand,r.exponent);return i?(e.deferNotifications({content:!0,selection:!0,type:"insertText"},()=>{e.selection={ranges:[[r.startOffset,r.endOffset]],direction:"forward"},H.insert(e,i,{insertionMode:"replaceSelection",selectionMode:"after"})}),t.snapshot("format-scientific-notation"),t.dirty=!0,t.scrollIntoView(),!0):!1}function ko(t,e,r){let{model:i}=t;if(!t.isSelectionEditable){i.announce("plonk");return}r!=null||(r={}),r.focus&&t.focus(),r.feedback&&(globalThis.MathfieldElement.keypressVibration&&Di()&&navigator.vibrate(mo),globalThis.MathfieldElement.playSound("keypress")),typeof r.mode=="string"&&(t.switchMode(r.mode),t.snapshot());let n=qa(e),o=window.mathVirtualKeyboard;if(o!=null&&o.isShifted&&(n=typeof n=="string"?n.toUpperCase():n.map(a=>a.toUpperCase())),r.simulateKeystroke){let a=!0;for(let s of n)qc(t,new KeyboardEvent("keypress",{key:s}))&&(a=!1);if(a)return}if(i.mode==="latex"){if(i.deferNotifications({content:!0,selection:!0,data:e,type:"insertText"},()=>{xi(t);for(let a of n)H.insert(i,a,{insertionMode:"replaceSelection"});t.snapshot("insert-latex"),Vr(t)}),e==="}"){let s=yi(i).map(c=>c.value).join(""),l=s.match(/^\\([a-zA-Z]+)/);if(l){let c="\\"+l[1],u=ne(c,"math");if((u==null?void 0:u.definitionType)==="function"){let d=u.params.filter(m=>!m.isOptional).length;if(d>0){let m=0,p=0,f=!0;for(let y=0;y0?t.options.inlineShortcutTimeout:1e3;clearTimeout(t.scientificNotationTimer),t.scientificNotationTimer=setTimeout(()=>{bp(t)},l)}}function jb(t){var r,i,n,o;if(t.selectionIsCollapsed)return(i=(r=t.at(t.position))==null?void 0:r.style)!=null?i:{};let e=de(t.selection)[0];return(o=(n=t.at(e+1))==null?void 0:n.style)!=null?o:{}}function xp(t,e,r){var l;if(!e||t.mode!=="math")return!1;let i=t.at(t.position),{parent:n}=i,o={"(":"(",")":")","{":"\\lbrace","}":"\\rbrace","[":"\\lbrack","]":"\\rbrack","|":"|"}[e];if(!o)return!1;let a=on[o],s=nn[o];if(!t.selectionIsCollapsed){t.mathfield.snapshot();let[c,u]=de(t.selection),d=t.extractAtoms([c,u]);d=d.filter(p=>p.type!=="first");let m=n.addChildrenAfter([new J("left...right",d,{leftDelim:o,rightDelim:s})],t.at(c));return t.setSelection(t.offsetOf(m.firstChild),t.offsetOf(m.lastChild)),t.mathfield.snapshot("insert-fence"),t.contentDidChange({data:o,inputType:"insertText"}),!0}if(o==="|"){let c=n instanceof J?n.leftDelim+n.rightDelim:"";if(c==="\\lbrace\\rbrace"||c==="\\{\\}"||c==="\\lbrace?")return t.mathfield.snapshot(),H.insert(t,"\\,\\middle\\vert\\,",{format:"latex",style:r}),t.mathfield.snapshot("insert-fence"),t.contentDidChange({data:o,inputType:"insertText"}),!0}if(s){if(n instanceof J&&n.firstChild===i&&(n.leftDelim==="?"||n.leftDelim==="."))return n.leftDelim=o,n.isDirty=!0,t.mathfield.snapshot(),t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0;if(!(n instanceof J)){let m=i;for(;m&&!(m.type==="mclose"&&m.value===s);)m=m.rightSibling;if(m){t.mathfield.snapshot();let p=t.extractAtoms([t.offsetOf(i),t.offsetOf(m)]);p.pop(),p=p.filter(y=>y.type!=="first");let f=new J("left...right",p,{leftDelim:o,rightDelim:s});return n.addChildrenAfter([f],i),t.position=t.offsetOf(f.firstChild),t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0}}let c=t.offsetOf(i.lastSibling),u;for(u=t.position;u<=c;u++){let m=t.at(u);if(m instanceof J&&(m.leftDelim==="?"||m.leftDelim===".")&&yp(o,m.rightDelim))break}let d=t.at(u);if(u<=c&&d instanceof J){d.leftDelim=o,t.mathfield.snapshot();let m=t.extractAtoms([t.position,u-1]);return m=m.filter(p=>p.type!=="first"),d.addChildren(m,d.parentBranch),t.position+=1,t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0}if(n instanceof J&&(n.leftDelim==="?"||n.leftDelim===".")&&yp(o,n.rightDelim)){n.isDirty=!0,n.leftDelim=o,t.mathfield.snapshot();let m=t.extractAtoms([t.offsetOf(i.firstSibling),t.position]);for(let p of m)n.parent.addChildBefore(p,n);return t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0}if(!(n instanceof J&&n.leftDelim==="|")){if(o==="("){let m=t.position-1,p=!1;for(;m>=0;){let f=t.at(m);if(f.type==="first")break;if(f.type==="mord"&&f.value&&/^[\d]$/.test(f.value)){m-=1;continue}if(f.type==="group"&&((l=f.body)==null?void 0:l.length)===2&&f.body[0].type==="first"&&f.body[1].value===","){p=!0;break}if(f.type==="mord"&&(f.value===","||f.value===".")){p=!0;break}break}if(p)return!1}if(t.mathfield.snapshot(),H.insert(t,`\\left${o}\\right?`,{format:"latex",style:r}),i.lastSibling.type!=="first"){let m=t.offsetOf(i.lastSibling),p=t.extractAtoms([t.position,m]);t.at(t.position).body=p,t.position-=1}return t.mathfield.snapshot("insert-fence"),!0}}if(a){if(o===")"){let f=t.position-1,y=!1;for(;f>=0;){let v=t.at(f);if(v.type==="first")break;if(v.type==="mord"&&v.value&&/^[\d]$/.test(v.value)){y=!0,f-=1;continue}break}if(y&&t.at(f).type==="mopen"&&t.at(f).value==="(")return!1}let c=i;for(;c;){if(c.type==="mopen"&&c.value===a){t.mathfield.snapshot();let f=c.leftSibling,y=t.extractAtoms([t.offsetOf(c.leftSibling),t.offsetOf(i)]);[,...y]=y;let v=new J("left...right",y,{leftDelim:a,rightDelim:o});return n.addChildrenAfter([v],f),t.position=t.offsetOf(v),t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0}c=c.leftSibling}if(n instanceof J&&i.isLastSibling&&Vc(n.leftDelim,o))return t.mathfield.snapshot(),n.isDirty=!0,n.rightDelim=o,t.position+=1,t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0;let u=t.offsetOf(i.firstSibling),d;for(d=t.position;d>=u;d--){let f=t.at(d);if(f instanceof J&&(f.rightDelim==="?"||f.rightDelim===".")&&Vc(f.leftDelim,o))break}let m=t.at(d);if(d>=u&&m instanceof J)return t.mathfield.snapshot(),m.rightDelim=o,m.addChildren(t.extractAtoms([d,t.position]),m.parentBranch),t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0;if(n instanceof J&&(n.rightDelim==="?"||n.rightDelim===".")&&Vc(n.leftDelim,o))return t.mathfield.snapshot(),n.isDirty=!0,n.rightDelim=o,n.parent.addChildren(t.extractAtoms([t.position,t.offsetOf(i.lastSibling)]),n.parentBranch),t.position=t.offsetOf(n),t.contentDidChange({data:o,inputType:"insertText"}),t.mathfield.snapshot("insert-fence"),!0;let p=n.parent;return p instanceof J&&(p.rightDelim==="?"||p.rightDelim===".")&&t.at(t.position).isLastSibling?(t.position=t.offsetOf(p),xp(t,o,r)):!1}return!1}function Vc(t,e){return t?["(","\\lparen","{","\\{","\\lbrace","[","\\lbrack"].includes(t)?[")","\\rparen","}","\\}","\\rbrace","]","\\rbrack"].includes(e):nn[t]===e:!0}function yp(t,e){return e?[")","\\rparen","}","\\}","\\rbrace","]","\\rbrack"].includes(e)?["(","\\lparen","{","\\{","\\lbrace","[","\\lbrack"].includes(t):on[e]===t:!0}fe({scrollIntoView:t=>(t.scrollIntoView(),!0),scrollToStart:t=>(t.field.scroll(0,0),!0),scrollToEnd:t=>{let e=t.field.getBoundingClientRect();return t.field.scroll(e.left-window.scrollX,0),!0},toggleKeystrokeCaption:pp,toggleContextMenu:t=>{let e=t.toggleContextMenu();return e||t.model.announce("plonk"),e},plonk:t=>(t.model.announce("plonk"),!0),switchMode:(t,e,r,i)=>(t.switchMode(e,r,i),!0)});fe({undo:t=>(t.undo(),!0),redo:t=>(t.redo(),!0)},{target:"mathfield",changeContent:!0});fe({insert:(t,e,r)=>t.insert(e,r),typedText:(t,e,r)=>(ko(t,e,r),!0),insertDecimalSeparator:t=>{let e=t.model;return e.mode==="math"&&globalThis.MathfieldElement.decimalSeparator===","&&e.at(Math.max(e.position,e.anchor)).isDigit()?(t.insert("{,}",{format:"latex"}),t.snapshot("insert-mord"),!0):(t.insert("."),!0)},commit:t=>{var r,i;let e=t.model;return e.contentWillChange({inputType:"insertLineBreak"})&&((r=t.host)==null||r.dispatchEvent(new Event("change",{bubbles:!0,composed:!0})),(i=e.parentEnvironment)!=null&&i.isMultiline&&t.executeCommand("addRowAfter"),e.contentDidChange({inputType:"insertLineBreak"})),!0},insertPrompt:(t,e,r)=>{let i=t.getPrompts(),n="prompt-"+Date.now().toString(36).slice(-2)+Math.floor(Math.random()*1e5).toString(36),o=0;for(;i.includes(n)&&o<100;){if(o===99)return console.error("could not find a unique ID after 100 tries"),!1;n="prompt-"+Date.now().toString(36).slice(-2)+Math.floor(Math.random()*1e5).toString(36),o++}return t.insert(`\\placeholder[${e!=null?e:n}]{}`,r),!0}},{target:"mathfield",canUndo:!0,changeContent:!0,changeSelection:!0});fe({copyToClipboard:t=>(t.focus(),t.model.selectionIsCollapsed&&t.select(),"queryCommandSupported"in document&&document.queryCommandSupported("copy")&&document.execCommand("copy")||t.element.querySelector(".ML__keyboard-sink").dispatchEvent(new ClipboardEvent("copy",{bubbles:!0,composed:!0})),!1)},{target:"mathfield"});fe({cutToClipboard:t=>(t.focus(),"queryCommandSupported"in document&&document.queryCommandSupported("cut")&&document.execCommand("cut")||t.element.querySelector(".ML__keyboard-sink").dispatchEvent(new ClipboardEvent("cut",{bubbles:!0,composed:!0})),!0),pasteFromClipboard:t=>(t.focus(),"queryCommandSupported"in document&&document.queryCommandSupported("paste")?(document.execCommand("paste"),!0):(navigator.clipboard.readText().then(e=>{e&&t.model.contentWillChange({inputType:"insertFromPaste",data:e})?(t.stopCoalescingUndo(),t.stopRecording(),t.insert(e,{mode:t.model.mode})&&(Vr(t),t.startRecording(),t.snapshot("paste"),t.model.contentDidChange({inputType:"insertFromPaste"}),Y(t))):t.model.announce("plonk"),t.startRecording()}).catch(()=>{t.model.announce("plonk"),t.startRecording()}),!0))},{target:"mathfield",canUndo:!0,changeContent:!0,changeSelection:!0});function Ks(t){let[e,r]=de(t.selection);if(e=vp(t,e,"backward"),r=vp(t,r,"forward"),e===r){let i=t.at(e);if(i.type==="leftright")return t.setSelection(t.offsetOf(i.firstChild)-1,r);if(i.type==="first"&&(i.parent.type==="leftright"||i.parent.type==="surd"))return t.setSelection(e-1,t.offsetOf(i.parent.lastChild)+1);t.setSelection(e-1,r)}else t.setSelection(e,r);return!0}function vp(t,e,r){var o;let i=t.at(e);if(!i)return e;let n=r==="forward"?1:-1;if(i.mode==="text"){for(;i&&!(i.mode!=="text"||!Qr.test(i.value));)e+=n,i=t.at(e);return r==="backward"?e-1:e}if(i.mode==="latex"){if(/[a-zA-Z\\*]/.test(i.value))if(r==="backward")for(;(i==null?void 0:i.mode)==="latex"&&i.value!=="\\"&&/[a-zA-Z]/.test(i.value);)e+=n,i=t.at(e);else for(;(i==null?void 0:i.mode)==="latex"&&/[a-zA-Z\\*]/.test(i.value);)e+=n,i=t.at(e);else if(i.value==="{"){if(r==="forward"){for(;(i==null?void 0:i.mode)==="latex"&&i.value!=="}";)e+=n,i=t.at(e);return e}return e-1}else if(i.value==="}"){if(r==="backward"){for(;(i==null?void 0:i.mode)==="latex"&&i.value!=="{";)e+=n,i=t.at(e);return e-1}return e}return e-1}if(i.mode==="math"){if(i.isDigit()){for(;(o=t.at(e+n))!=null&&o.isDigit();)e+=n;return r==="backward"?e-1:e}if(i.style.variant||i.style.variantStyle){let a=i.style.variant,s=i.style.variantStyle;for(;;){let l=t.at(e+n);if(!l||l.style.variant!==a||l.style.variantStyle!==s)break;e+=n}return r==="backward"?e-1:e}return e}return e}fe({selectGroup:t=>{let e=Ks(t);return e||t.announce("plonk"),e},selectAll:t=>t.setSelection(0,t.lastOffset),extendSelectionForward:t=>ut(t,"forward",{extend:!0}),extendSelectionBackward:t=>ut(t,"backward",{extend:!0}),extendToNextWord:t=>St(t,"forward",{extend:!0}),extendToPreviousWord:t=>St(t,"backward",{extend:!0}),extendSelectionUpward:t=>ut(t,"upward",{extend:!0}),extendSelectionDownward:t=>ut(t,"downward",{extend:!0}),extendToNextBoundary:t=>St(t,"forward",{extend:!0}),extendToPreviousBoundary:t=>St(t,"backward",{extend:!0}),extendToGroupStart:t=>{let e=t.setSelection(t.anchor,t.offsetOf(t.at(t.position).firstSibling));return e||t.announce("plonk"),e},extendToGroupEnd:t=>{let e=t.setSelection(t.anchor,t.offsetOf(t.at(t.position).lastSibling));return e||t.announce("plonk"),e},extendToMathFieldStart:t=>{let e=t.setSelection(t.anchor,0);return e||t.announce("plonk"),e},extendToMathFieldEnd:t=>{let e=t.setSelection(t.anchor,t.lastOffset);return e||t.announce("plonk"),e}},{target:"model",changeSelection:!0});var ki=null,Lo=0,Li=class t{static start(e,r,i,n){var a;t.element=e,(a=t.controller)==null||a.abort(),t.controller=new AbortController;let o={signal:t.controller.signal};"PointerEvent"in window?(e.addEventListener("pointermove",i,o),e.addEventListener("pointerup",n,o),e.addEventListener("pointercancel",n,o),Wc(r)&&(t.pointerId=r.pointerId,e.setPointerCapture(r.pointerId))):(window.addEventListener("mousemove",i,o),window.addEventListener("blur",n,o),window.addEventListener("mouseup",n,o))}static stop(){var e;(e=t.controller)==null||e.abort(),t.controller=void 0,typeof t.pointerId=="number"&&(t.element.releasePointerCapture(t.pointerId),t.pointerId=void 0)}};function Wc(t){return t!==null&&globalThis.PointerEvent!==void 0&&t instanceof PointerEvent}function Hc(t,e,r){return t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom}function _p(t,e,r){return tr?r:t}function Uc(t,e){var O,I,V,K,N,j;if(e.buttons>1)return;t.atomBoundsCache?t.atomBoundsCache.clear():t.atomBoundsCache=new Map;let r=t,i,n=!1,o=!1,a="none",s=!1,l=!1,c=e.clientX,u=e.clientY,d=Date.now(),m=r.field,p=setInterval(()=>{s?m.scroll({top:0,left:m.scrollLeft-16}):l&&m.scroll({top:0,left:m.scrollLeft+16})},32);function f(){Li.stop(),n=!1,clearInterval(p),t.element.classList.remove("tracking"),e&&e.preventDefault()}function y(D){if(!r.hasFocus()){f();return}let W=D.clientX,ie=D.clientY,X=Wc(D)&&D.pointerType==="touch"?20:5;if(Date.now()ye.right,s=W=0&&Pe>=0&&(r.model.extendSelectionTo(xe,Pe),Y(t)),o&&Ks(r.model)}ki&&Math.abs(ki.x-c)<5&&Math.abs(ki.y-u)<5&&Date.now()=0){if(t.element.classList.add("tracking"),e.shiftKey){let D=t.model.selectionIsCollapsed;t.model.extendSelectionTo(t.model.anchor,i),gs(t.model)||D?a="all":a="selection"}else if(t.model.at(i).type==="placeholder"||t.model.at(i).type==="prompt"){let D=t.model.at(i);D.hasChildren&&D.firstChild?t.model.position=t.model.offsetOf(D.firstChild):t.model.setSelection(i-1,i),a="selection"}else if(((N=t.model.at(i).rightSibling)==null?void 0:N.type)==="placeholder"||((j=t.model.at(i).rightSibling)==null?void 0:j.type)==="prompt"){let D=t.model.at(i).rightSibling;D.hasChildren&&D.firstChild?t.model.position=t.model.offsetOf(D.firstChild):t.model.setSelection(i,i+1),a="selection"}else{let D=t.model.at(i);if(D.captureSelection&&D.hasChildren&&D.body&&D.body.length>0){let W=D.body.find(ie=>ie.type!=="first");W&&(W.type==="placeholder"||W.type==="prompt")&&W.hasChildren&&W.firstChild?(t.model.position=t.model.offsetOf(W.firstChild),a="selection"):(t.model.position=i,gs(t.model)?a="all":a="selection")}else t.model.position=i,gs(t.model)?a="all":a="selection"}e.detail===3||Lo>2?(f(),(e.detail===3||Lo===3)&&(t.model.selection={ranges:[[0,t.model.lastOffset]]},a="all")):n||(n=!0,Li.start(m,e,y,f),(e.detail===2||Lo===2)&&(o=!0,Ks(t.model),a="all"))}t.hasFocus()||(a="none",t.onFocus(),t.model.announce("line"))}else ki=null;t.stopCoalescingUndo(),a!=="none"&&(t.model.selectionIsCollapsed&&(a="all"),Y(t)),e.preventDefault()}function Jb(t,e,r){if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)return 0;let i=t-(r.left+r.right)/2,n=e-(r.top+r.bottom)/2;return i*i+n*n}function Ao(t,e,r,i,n){if(!r.id)return[1/0,null];if(e.has(r.id))return e.get(r.id);let o=ar(t,r);if(!o)return[1/0,null];let a=[1/0,null],s=t.model;if(r instanceof z){let l=-1,c=1/0;for(let d=0;df?y=n-f:y=0,y=0?[r.rows[l]]:r.rows;for(let d of u)for(let m of d)if(m)for(let p of m){let f=Ao(t,e,p,i,n);f[0]<=a[0]&&(a=f)}if(!r.isMultiline)for(let d of r.children){let m=Ao(t,e,d,i,n);m[0]<=a[0]&&(a=m)}}else if(r.hasChildren&&!r.captureSelection&&i>=o.left&&i<=o.right){let l=r.children;for(let c of l){let u=Ao(t,e,c,i,n);u[0]<=a[0]&&(a=u)}for(let c of r.branches){let u=r.branch(c);if(!u||u.length===0)continue;let d=[s.offsetOf(u[0]),s.offsetOf(u[u.length-1])],m=th(t,d);if(n>=m.top&&n<=m.bottom)for(let p of u){let f=Ao(t,e,p,i,n);f[0]<=a[0]&&(a=f)}}}return a[1]||(a=[Jb(i,n,o),r]),e.set(r.id,a),a}function Xb(t,e,r){let[,i]=Ao(t,new Map,t.model.root,e,r);return i}function Co(t,e,r,i){var c;let n=t.field.querySelector(".ML__latex").getBoundingClientRect();if(!n)return 0;if(e>n.right||r>n.bottom+8)return t.model.lastOffset;if(e0?(u.push(d),d=[y]):d.push(y);d.length>0&&u.push(d);let m=Number(c.parentBranch[0]),p=Number(c.parentBranch[1]),f=c.parent.maxColumns;for(;c.parent.colCount-p=f&&(p=0,c.parent.addRowAfter(m),m++),c.parent.setCell(m,p,u[y])}else c.parent.addChildrenAfter(s.filter(u=>u.type!=="first"),c);return l.position=l.offsetOf(s[s.length-1]),l.contentDidChange({inputType:"insertFromPaste"}),Y(e),!0}}catch(a){}if(o=typeof r!="string"?r.getData("application/json"):"",o&&globalThis.MathfieldElement.computeEngine)try{let a=JSON.parse(o);if(typeof a=="object"&&"latex"in a&&a.latex&&(i=a.latex),!i){let s=globalThis.MathfieldElement.computeEngine.box(a);s&&!s.has("Error")&&(i=s.latex)}i||(n="latex")}catch(a){}if(!i&&typeof r!="string"&&(i=r.getData("application/x-latex"),i&&(n="latex")),i||(i=typeof r=="string"?r:r.getData("text/plain")),i){let a;return[a,i]=Ya(i),n==="auto"&&a&&(n="latex"),e.stopCoalescingUndo(),e.stopRecording(),this.insert(e.model,i,{format:n})&&(e.startRecording(),e.snapshot("paste"),Y(e)),e.startRecording(),!0}return!1}insert(e,r,i){var k,S,A,E;let n=typeof r=="string"?r:(S=(k=globalThis.MathfieldElement.computeEngine)==null?void 0:k.box(r).latex)!=null?S:"";if(!i.silenceNotifications&&!e.contentWillChange({data:n,inputType:"insertText"}))return!1;i.insertionMode||(i.insertionMode="replaceSelection"),i.selectionMode||(i.selectionMode="placeholder"),i.format||(i.format="auto");let{silenceNotifications:o}=e;i.silenceNotifications&&(e.silenceNotifications=!0);let a=e.silenceNotifications;e.silenceNotifications=!0;let s={"?":"\\placeholder{}","@":"\\placeholder{}"};s[0]=i.insertionMode==="replaceAll"?"":e.getValue(e.selection,"latex-unstyled"),i.insertionMode==="replaceSelection"?e.deleteAtoms(de(e.selection)):i.insertionMode==="replaceAll"?e.deleteAtoms():i.insertionMode==="insertBefore"?e.collapseSelection("backward"):i.insertionMode==="insertAfter"&&e.collapseSelection("forward");let l=e.at(e.position);l&&!l.isLastSibling&&((A=e.at(e.position+1))==null?void 0:A.type)==="placeholder"?e.deleteAtoms([e.position,e.position+1]):(l==null?void 0:l.type)==="placeholder"&&e.deleteAtoms([e.position-1,e.position]);let c=-1;s[0]?s["@"]=s[0]:typeof r=="string"&&/(^|[^\\])#@/.test(r)&&(c=Zb(e),c>=0&&(s["@"]=e.getValue(c,e.position,"latex"))),s[0]||(s[0]=s["?"]);let u=!1,d=C=>(u=!0,s[C]),[m,p]=Mp(e,r,d,i);if(!p)return!1;let f=p.length===1&&p[0].type==="genfrac",y=e.at(e.position);f&&c>=0&&typeof e.mathfield.options.isImplicitFunction=="function"&&y&&e.mathfield.options.isImplicitFunction(y.command)&&(s["@"]=s["?"],u=!1,[m,p]=Mp(e,r,d,i));let v=e.position;if(p.length===1&&p[0].isRoot)e.root=p[0];else{let C=e.at(e.position),_=(E=C==null?void 0:C.parent)!=null?E:e.root,O=_.hasEmptyBranch("body");if(f&&m!=="latex"&&e.mathfield.options.removeExtraneousParentheses&&_ instanceof J&&_.leftDelim==="("&&O){let V=_.parent,K=_.parentBranch;V.removeChild(_),V.setChildren(p,K)}let I=e.at(e.position);if(I)I.parent.addChildrenAfter(p,I);else{let V=_.branch("body"),K=V==null?void 0:V[0];K?_.addChildrenAfter(p,K):_.setChildren(p,"body")}if(c>=0){e.deleteAtoms([c,v]);let V=e.root.branch("body");if(V)for(let K of V)K.parent!==e.root&&(K.parent=e.root,K.parentBranch="body")}m==="latex"&&typeof r=="string"&&(_==null?void 0:_.type)==="root"&&O&&!u&&(_.verbatimLatex=r)}e.silenceNotifications=a;let b=p[p.length-1];if(i.selectionMode==="placeholder"){let C;if(p.length===1&&p[0].type==="genfrac"){let _=p[0].branch("above");if(C=_==null?void 0:_.find(O=>O.type==="placeholder"),!C){let O=p[0].branch("below");C=O==null?void 0:O.find(I=>I.type==="placeholder")}}if(C||(C=p.flatMap(_=>[_,..._.children]).find(_=>_.type==="placeholder")),C){let _=e.offsetOf(C);e.setSelection(_-1,_),e.announce("move")}else if(b){let _=b.body,O=b.hasEmptyBranch("body");_&&O?e.setSelection(e.offsetOf(_[0]),e.offsetOf(_[_.length-1])+1):e.position=e.offsetOf(b)}}else i.selectionMode==="before"||(i.selectionMode==="after"?b&&(e.position=e.offsetOf(b)):i.selectionMode==="item"&&e.setSelection(e.anchor,e.offsetOf(b)));return e.contentDidChange({data:n,inputType:"insertText"}),e.silenceNotifications=o,!0}};function Mp(t,e,r,i){var a;let n,o=[];if(typeof e!="string"){let s=globalThis.MathfieldElement.computeEngine;if(!s)return["latex",[]];[n,e]=["latex",s.box(e).latex],o=be(e,{context:t.mathfield.context})}else typeof e=="string"&&i.format==="ascii-math"?([n,e]=or(e,{format:"ascii-math",inlineShortcuts:t.mathfield.options.inlineShortcuts}),o=be(e,{context:t.mathfield.context}),n!=="latex"&&t.mathfield.options.removeExtraneousParentheses&&(o=o.map(s=>Ps(s)))):(i.format==="auto"||(a=i.format)!=null&&a.startsWith("latex"))&&(i.format==="auto"&&([n,e]=or(e,{format:"auto",inlineShortcuts:t.mathfield.options.inlineShortcuts})),i.format==="latex"&&([,e]=Ya(e)),o=be(e,{context:t.mathfield.context,args:r}),i.format!=="latex"&&t.mathfield.options.removeExtraneousParentheses&&(o=o.map(s=>Ps(s))));return oo(o,i.style),[n!=null?n:"latex",o]}function Ps(t){var e;if(t instanceof J&&t.leftDelim!=="("&&t.rightDelim===")"){let r=(e=t.body)==null?void 0:e.filter(i=>i.type!=="first");if((r==null?void 0:r.length)===1&&r[0].type==="genfrac")return r[0]}for(let r of t.branches)t.hasEmptyBranch(r)||t.setChildren(t.branch(r).map(i=>Ps(i)),r);return t instanceof z&&t.forEachCell((r,i,n)=>{t.setCell(i,n,r.map(o=>Ps(o)))}),t}function Zb(t){let e=t.at(t.position);if(!e)return-1;if(e.mode==="text"){for(;!e.isFirstSibling&&e.mode==="text";)e=e.leftSibling;return t.offsetOf(e)}let r=e,i=!1;if(e.type==="mclose"){let n=on[e.value];for(;!e.isFirstSibling&&!(e.type==="mopen"&&e.value===n);){let o=e.leftSibling;if(!o)break;e=o}if(!e.isFirstSibling){let o=e.leftSibling;o&&(e=o)}i=!0}else if(e.type==="leftright"){let n=e.leftSibling;n&&(e=n),i=!0}if(i)for(;!e.isFirstSibling&&(e.isFunction||wp(e));){let n=e.leftSibling;if(!n)break;e=n}else{let n=[];for(;!e.isFirstSibling&&(wp(e)||n.length>0);){e.type==="mclose"&&n.unshift(e.value),e.type==="mopen"&&n.length>0&&e.value===on[n[0]]&&n.shift();let o=e.leftSibling;if(!o)break;e=o}}return r===e?-1:t.offsetOf(e)}function Yb(t){if(t.type==="mord"&&t.value==="e"){let e=t.leftSibling;if(e&&e.isDigit())return!0}if(t.type==="mbin"&&(t.value==="+"||t.value==="-"||t.value==="\u2212")){let e=t.leftSibling,r=t.rightSibling;if((e==null?void 0:e.type)==="mord"&&e.value==="e"&&r&&r.isDigit()){let i=e.leftSibling;if(i&&i.isDigit())return!0}}if(t.type==="subsup"){let e=t.leftSibling;if(e&&e.isDigit()&&e.value==="0"){let r=e.leftSibling;if(r&&r.isDigit()&&r.value==="1"){let i=r.leftSibling;if((i==null?void 0:i.type)==="mbin"&&(i.value==="\xD7"||i.value==="\\times")){let n=i.leftSibling;if(n&&n.isDigit())return!0}}}}if(t.isDigit()&&t.value==="0"){let e=t.leftSibling,r=t.rightSibling;if(e&&e.isDigit()&&e.value==="1"&&(r==null?void 0:r.type)==="subsup"){let i=e.leftSibling;if((i==null?void 0:i.type)==="mbin"&&(i.value==="\xD7"||i.value==="\\times")){let n=i.leftSibling;if(n&&n.isDigit())return!0}}}if(t.isDigit()&&t.value==="1"){let e=t.rightSibling;if(e&&e.isDigit()&&e.value==="0"){let r=e.rightSibling;if((r==null?void 0:r.type)==="subsup"){let i=t.leftSibling;if((i==null?void 0:i.type)==="mbin"&&(i.value==="\xD7"||i.value==="\\times")){let n=i.leftSibling;if(n&&n.isDigit())return!0}}}}if(t.type==="mbin"&&(t.value==="\xD7"||t.value==="\\times")){let e=t.leftSibling,r=t.rightSibling;if(e&&e.isDigit()&&r&&r.isDigit()&&r.value==="1"){let i=r.rightSibling;if(i&&i.isDigit()&&i.value==="0"){let n=i.rightSibling;if((n==null?void 0:n.type)==="subsup")return!0}}}return!1}function wp(t){return t.isDigit()||Yb(t)?!0:t.type&&/^(mord|surd|subsup|leftright|mop|mclose)$/.test(t.type)?t.type!=="extensible-symbol":!1}new Gc;var jc=class extends H{constructor(){super("text")}onPaste(e,r){if(!r)return!1;let i=typeof r=="string"?r:r.getData("text/plain");return i&&e.model.contentWillChange({inputType:"insertFromPaste",data:i})?(e.stopCoalescingUndo(),e.stopRecording(),this.insert(e.model,i)&&(e.model.contentDidChange({inputType:"insertFromPaste"}),e.startRecording(),e.snapshot("paste"),Y(e)),e.startRecording(),!0):!1}insert(e,r,i={}){if(!e.contentWillChange({data:r,inputType:"insertText"}))return!1;i.insertionMode||(i.insertionMode="replaceSelection"),i.selectionMode||(i.selectionMode="placeholder"),i.format||(i.format="auto");let{silenceNotifications:n}=e;i.silenceNotifications&&(e.silenceNotifications=!0);let o=e.silenceNotifications;e.silenceNotifications=!0,i.insertionMode==="replaceSelection"&&!e.selectionIsCollapsed?e.deleteAtoms(de(e.selection)):i.insertionMode==="replaceAll"?(e.root.setChildren([],"body"),e.position=0):i.insertionMode==="insertBefore"?e.collapseSelection("backward"):i.insertionMode==="insertAfter"&&e.collapseSelection("forward");let a=Qb(r,e.mathfield.context);if(oo(a,i.style),!a)return!1;let s=e.at(e.position),l=s.parent.addChildrenAfter(a,s);return e.silenceNotifications=o,i.selectionMode==="before"||(i.selectionMode==="item"?e.setSelection(e.anchor,e.offsetOf(l)):l&&(e.position=e.offsetOf(l))),e.contentDidChange({data:r,inputType:"insertText"}),e.silenceNotifications=n,!0}};function Qb(t,e){if(t.includes("$")){let r=[],i=0,n=!1,o="";for(;i` + + + + + `,Sp=(t,e)=>` + + + + + `,zs=(t,e,r)=>` + + + + + + `,ty=` + + + + + ${zs(2*(se+ve),2*se+3*ve,0)} + + + ${zs(2*(se+ve),2*se+ve,180)} + + + ${zs(2*se+3*ve,2*(se+ve),-90)} + + + ${zs(2*se+ve,2*(se+ve),90)} + + + + + ${Is(2*se+ve,se)} + + + ${Sp(2*se+2*ve,se)} + + + ${Is(2*se+3*ve,se)} + + + ${Is(se,2*se+ve)} + + + ${Sp(se,2*se+2*ve)} + + + ${Is(se,2*se+3*ve)} + +`,ry=t=>` + + + + + `,iy=t=>` + + + + + + + `,kp=t=>` + + + + + + + +`,ny=t=>` + + + + + + + +`,oy=t=>` + + + + + + + +`,ay=t=>` + + + + + + + + + +`,sy=t=>` + + + + + + + +`,ly=t=>` + + + + + + + +`,Jc={matrix:ry,pmatrix:iy,bmatrix:ny,Bmatrix:kp,vmatrix:oy,Vmatrix:ay},Xc={cases:sy,rcases:ly,Bmatrix:kp};function cy(t){var m,y;let e=(m=t.model.parentEnvironment)==null?void 0:m.rows;if(!e)return;let r=0;e.forEach(v=>{(!r||v.length>r)&&(r=v.length)});let i=document.getElementById("mathlive-environment-popover");i||(i=vi("mathlive-environment-popover"),Ge("environment-popover"),Ge("core"),i.setAttribute("aria-hidden","true"));let n,o=i.querySelector(".MLEP__environment-controls");o?n=o:(n=document.createElement("div"),i.innerHTML="",i.appendChild(n)),n.className="MLEP__environment-controls",n.style.display="flex",n.style.width="100%",n.style.height="100%",n.style.boxSizing="border-box",n.innerHTML=ty;let a=[],s="",l=t.model.parentEnvironment.environmentName;if(rs(l)){let v=uy(l);s=Jc[v]("active");let p=Jc,{[v]:b}=p,k=Ti(p,[nl(v)]);a=Object.values(k).map(S=>S("inactive"))}else if(xh(l)){let v=dy(l);s=Xc[v]("active");let f=Xc,{[v]:b}=f,k=Ti(f,[nl(v)]);a=Object.values(k).map(S=>S("inactive"))}else vh(l)&&(s=Jc.matrix("active"),a=Object.values(Xc).map(v=>v("inactive")));let c=document.createElement("div");c.className="MLEP__environment-delimiter-controls",c.style.display="flex",c.style.flexDirection="column",c.innerHTML=` +
    + ${s} + ${a.join("")} +
    `,s&&n.appendChild(c),n.querySelectorAll("[data-command]").forEach(v=>{let b=v.dataset.command,k=b;try{k=JSON.parse(b)}catch(S){}v.addEventListener("mousedown",S=>S.preventDefault()),k&&v.addEventListener("click",()=>t.executeCommand(k))});let d=(y=t.field)==null?void 0:y.getBoundingClientRect();d&&(i.style.top=`${window.scrollY+(d.top-i.clientHeight-15)}px`,i.style.left=`${d.left+20}px`,i.classList.add("is-visible"))}function Ns(){let t=document.getElementById("mathlive-environment-popover");t==null||t.classList.remove("is-visible")}function Lp(){document.getElementById("mathlive-environment-popover")&&(qr("mathlive-environment-popover"),ot("environment-popover"),ot("core"))}function Eo(t){if(!t.hasFocus())return;let e=!1;if(t.model.mode==="math"){let r=t.model.parentEnvironment;if(r!=null&&r.rows&&yh(r.environmentName)){let i=t.options.environmentPopoverPolicy;e=i==="auto"||i==="on"}}e?cy(t):Ns()}function uy(t){return t.replace("*","")}function dy(t){return t==="dcases"?"cases":t}function Fs(t){let e=getComputedStyle(t).direction;return e==="ltr"||e==="rtl"?e:"ltr"}function Yc(t,e,r){return e==="left"||e==="leading"&&r==="ltr"||e==="trailing"&&r==="rtl"?t.left:t.right}function Zc(t,e,r,i){return r==="middle"?t-e/2:r==="start"&&i==="rtl"||r==="end"&&i==="ltr"||r==="top"||r==="right"?Math.max(0,t-e):t}function my(t,e,r,i){return r==="middle"?t-e/2:r==="start"&&i==="ltr"||r==="end"&&i==="rtl"||r==="top"||r==="right"?t:t-e}function Ap(t,e){var u,d,m;let r=(u=Fs(t))!=null?u:"ltr";t.style.position="fixed",t.style.left="",t.style.top="",t.style.right="",t.style.bottom="",t.style.height="",t.style.width="";let i=t.getBoundingClientRect(),n=Number.isFinite(e.maxHeight)?Math.min(e.maxHeight,window.innerHeight):window.innerHeight,o=Math.min(n,(d=e.height)!=null?d:i.height),a=Zc(e.location.y,o,e.verticalPos,r);a+o>window.innerHeight-8&&(e.alternateLocation?(a=Zc(e.alternateLocation.y,o,e.verticalPos,r),a+o>window.innerHeight-8&&(a=void 0)):a=void 0),Number.isFinite(a)||(a=Math.max(8,window.innerHeight-8-o),8+o>window.innerHeight-8&&(t.style.bottom="8px")),o=Math.min(a+o,window.innerHeight-8)-a;let s=Number.isFinite(e.maxWidth)?Math.min(e.maxWidth,window.innerWidth):window.innerWidth,l=Math.min(s,(m=e.width)!=null?m:i.width),c=Zc(e.location.x,l,e.horizontalPos,r);c+l>window.innerWidth-8&&(e.alternateLocation?(c=my(e.alternateLocation.x,l,e.verticalPos,r),c+l>window.innerWidth-8&&(c=void 0)):c=void 0),Number.isFinite(c)||(c=Math.max(8,window.innerWidth-8-l),8+l>window.innerWidth-8&&(t.style.right="8px")),l=Math.min(c+l,window.innerWidth-8)-c,r==="rtl"?t.style.right=`${Math.ceil(window.innerWidth-c-l).toString()}px`:t.style.left=`${Math.ceil(c).toString()}px`,t.style.top=`${Math.ceil(a).toString()}px`,o!==i.height&&(t.style.height=`${Math.ceil(o).toString()}px`),l!==i.width&&(t.style.width=`${Math.ceil(l).toString()}px`)}function Cp(t,e){return Math.hypot(e.x-t.x,e.y-t.y)}function Ur(t){return"submenu"in t}function Lt(t){return"type"in t&&t.type==="command"||"onMenuSelect"in t||"id"in t}function To(t){return"type"in t&&t.type==="divider"}function $s(t){return"type"in t&&t.type==="heading"}var Ep={};function Vs(t){let e=Ep[t];if(!e){let r;switch(t){case"checkmark":r=``;break;case"trailing-chevron":r='';break;case"mixedmark":r=''}if(r){let i=document.createElement("template");i.innerHTML=r,Ep[t]=i,e=i}}if(e){if("content"in e)return e.content.cloneNode(!0);let r=document.createElement("svg");return r.innerHTML=e.innerHTML,r}}var Tp=80,En=class{constructor(e,r){this._className="";this._element=null;var i;this.parentMenu=r,this._declaration=e,Object.freeze(this._declaration),Ur(e)?(this.type="submenu",this.submenu=new Tn(e.submenu,{parentMenu:r,submenuClass:e.submenuClass,columnCount:e.columnCount})):this.type=(i=e.type)!=null?i:"command",this.hasCheck=Lt(e)&&e.checked!==void 0}get rootMenu(){return this.parentMenu.rootMenu}get abortController(){return this._abortController||(this._abortController=new AbortController),this._abortController}dispose(){var e,r;(e=this._abortController)==null||e.abort(),this._abortController=void 0,(r=this._element)==null||r.remove(),this._element=null,this.submenu&&this.submenu.dispose(),this.submenu=void 0}get menuItem(){return this._declaration}get label(){var e;return(e=this._label)!=null?e:""}set label(e){e===void 0&&(e=""),e!==this._label&&(this._label=e,this.dirty=!0)}get visible(){return this._visible}set visible(e){e!==this._visible&&(this._visible=e,this.dirty=!0)}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this.element&&(e?this.element.removeAttribute("aria-disabled"):this.element.setAttribute("aria-disabled","true")),this.dirty=!0}get checked(){return this._checked}set checked(e){this._checked=e,this.dirty=!0}get tooltip(){return this._tooltip}set tooltip(e){e!==this._tooltip&&(this._tooltip=e,this.dirty=!0)}get ariaLabel(){return this._ariaLabel}set ariaLabel(e){e!==this._ariaLabel&&(this._ariaLabel=e,this.dirty=!0)}get active(){var e,r;return(r=(e=this.element)==null?void 0:e.classList.contains("active"))!=null?r:!1}set active(e){this.element&&this.element.classList.toggle("active",e)}updateState(e){var i,n,o;let r=this._declaration;if(To(r)){this.enabled=!1,this.checked=!1;return}$s(r)&&(this.enabled=!1,this.checked=!1,this.visible=!0),Lt(r)&&(this.checked=(i=Ai(r.checked,e))!=null?i:!1),(Lt(r)||Ur(r))&&(this.enabled=(n=Ai(r.enabled,e))!=null?n:!0,this.visible=(o=Ai(r.visible,e))!=null?o:!0,this.visible&&this.enabled&&this.submenu&&(this.submenu.updateState(e),this.submenu.visible||(this.visible=!1))),(Lt(r)||$s(r)||Ur(r))&&(this.label=Ai(r.label,e),this._className=Ai(r.class,e),this.tooltip=Ai(r.tooltip,e),this.ariaLabel=Ai(r.ariaLabel,e)),this._element&&this.updateElement()}set dirty(e){e&&this.parentMenu&&(this.parentMenu.dirty=!0)}updateElement(){var i;if(!this.visible||!this.element)return;let e=this.element;e.textContent="",e.className="",e.className=(i=this._className)!=null?i:"",this.enabled?e.removeAttribute("aria-disabled"):e.setAttribute("aria-disabled","true"),this.checked===!0?(e.setAttribute("aria-checked","true"),e.append(Vs("checkmark"))):this.checked==="mixed"?(e.setAttribute("aria-checked","mixed"),e.append(Vs("mixedmark"))):e.removeAttribute("aria-checked"),this.ariaLabel&&e.setAttribute("aria-label",this.ariaLabel);let r=document.createElement("span");if(r.className=this.parentMenu.hasCheck?"label indent":"label",this.type==="heading"&&r.classList.add("heading"),r.innerHTML=this.label,e.append(r),this._tooltip&&e.setAttribute("data-tooltip",this._tooltip),Lt(this._declaration)&&this._declaration.keyboardShortcut){let n=document.createElement("kbd");n.innerHTML=gn(this._declaration.keyboardShortcut),e.append(n)}this.type==="submenu"&&e.append(Vs("trailing-chevron"))}get element(){if(this._element)return this._element;if(To(this._declaration)){let i=document.createElement("li");return i.setAttribute("part","menu-divider"),i.setAttribute("role","divider"),this._element=i,i}let e=document.createElement("li");this._element=e,(Lt(this._declaration)||$s(this._declaration)||Ur(this._declaration))&&e.setAttribute("part","menu-item"),e.setAttribute("tabindex","-1"),this.hasCheck?e.setAttribute("role","menuitemcheckbox"):e.setAttribute("role","menuitem"),this.type==="submenu"&&(e.setAttribute("aria-haspopup","true"),e.setAttribute("aria-expanded","false"));let r=this.abortController.signal;return e.addEventListener("pointerenter",this,{signal:r}),e.addEventListener("pointerleave",this,{signal:r}),e.addEventListener("pointerup",this,{signal:r}),e.addEventListener("click",this,{signal:r}),this._element}dispatchSelect(){var i;if(!Lt(this._declaration))return;let e=new CustomEvent("menu-select",{cancelable:!0,bubbles:!0,detail:{modifiers:this.rootMenu.modifiers,id:this._declaration.id,data:this._declaration.data}});this.parentMenu.dispatchEvent(e)&&typeof this._declaration.onMenuSelect=="function"&&this._declaration.onMenuSelect({target:(i=this.parentMenu.host)!=null?i:void 0,modifiers:this.rootMenu.modifiers,id:this._declaration.id,data:this._declaration.data})}handleEvent(e){var r;if(!(!this.visible||!this.enabled)){if(e.type==="click"){this.rootMenu.state==="modal"&&this.select(),e.stopPropagation(),e.preventDefault();return}if(e.type==="pointerenter"){let i=e;this.rootMenu.cancelDelayedOperation(),this.parentMenu.isSubmenuOpen&&((r=this.parentMenu.activeMenuItem)!=null&&r.movingTowardSubmenu(i))?this.rootMenu.scheduleOperation(()=>{this.parentMenu.activeMenuItem=this,this.openSubmenu()}):(this.parentMenu.activeMenuItem=this,this.openSubmenu({withDelay:!0}));return}if(e.type==="pointerleave"){this.rootMenu.activeSubmenu===this.parentMenu&&(this.parentMenu.activeMenuItem=null);return}if(e.type==="pointerup"){this.rootMenu.state!=="modal"&&this.select(),e.stopPropagation(),e.preventDefault();return}}}select(){if(this.rootMenu.cancelDelayedOperation(),this.type==="submenu"){this.openSubmenu();return}this.active=!1,setTimeout(()=>{this.active=!0,setTimeout(()=>{this.active=!1,this.rootMenu.hide(),this.dispatchSelect()},Tp)},Tp)}openSubmenu(e){var n;if(this.type!=="submenu"||!this.element)return;if((n=e==null?void 0:e.withDelay)!=null&&n){this.rootMenu.scheduleOperation(()=>this.openSubmenu());return}let r=this.element.getBoundingClientRect(),i=Fs(this.element);this.submenu.show({container:this.rootMenu.element.parentNode,location:{x:Yc(r,"trailing",i),y:r.top-4},alternateLocation:{x:Yc(r,"leading",i),y:r.top-4}})}movingTowardSubmenu(e){if(!this.element||this.type!=="submenu")return!1;let r=this.rootMenu.lastMoveEvent;if(!r)return!1;let i=e.timeStamp-r.timeStamp;if(i>500)return!1;let n=e.clientX-r.clientX;if(hy(n,r.clientY-e.clientY,i)<=.2)return!1;let a="right";if(this.submenu.element){let s=this.submenu.element.getBoundingClientRect(),l=this.element.getBoundingClientRect();s.left0:n<0}};function hy(t,e,r){return Math.hypot(t,e)/r}function Ai(t,e){return t===void 0||typeof t!="function"?t:(e!=null||(e={alt:!1,control:!1,shift:!1,meta:!1}),t(e))}var Tn=class t{constructor(e,r){this._element=null;this._activeMenuItem=null;this._dirty=!0;var i,n;this.parentMenu=(i=r==null?void 0:r.parentMenu)!=null?i:null,this._submenuClass=r==null?void 0:r.submenuClass,this.columnCount=(n=r==null?void 0:r.columnCount)!=null?n:1,this.isSubmenuOpen=!1,this.menuItems=e}get children(){return Object.freeze([...this._menuItems])}set menuItems(e){let r=this.parentMenu;this.dispose(),this.parentMenu=r,e=[...e],this._menuItems=e.map(i=>i.onCreate?i.onCreate(i,this):new En(i,this)),this.hasCheck=void 0,this.dirty=!0}dispose(){var e;this.hide(),this._element&&this._element.remove(),this._abortController&&this._abortController.abort(),(e=this._menuItems)==null||e.forEach(r=>r.dispose()),this._menuItems=[],this._activeMenuItem=null,this.parentMenu=null}handleEvent(e){if(e.type==="wheel"&&this._element){let r=e;this._element.scrollBy(0,r.deltaY),e.stopPropagation()}}dispatchEvent(e){return this.rootMenu.dispatchEvent(e)}get host(){return this.rootMenu.host}get rootMenu(){return this.parentMenu.rootMenu}updateState(e){var a,s,l;this._menuItems.forEach(c=>c.updateState(e));let r=this.hasCheck;this.hasCheck=this._menuItems.some(c=>c.visible&&c.hasCheck),this.hasCheck!==r&&this._menuItems.forEach(c=>c.updateState(e));let i,n=0;for(let c of this._menuItems)c.type==="heading"?(i&&n===0&&(i.visible=!1),i=c,n=0):c.type==="divider"&&i?(i.visible=n>0,i=void 0,n=0):i&&c.visible&&(n+=1);i&&(i.visible=n>0);let o=!0;for(let c of this._menuItems)c.type==="divider"?(c.visible=!o,o=!0):c.visible&&(o=!1);(a=this.activeMenuItem)!=null&&a.visible||(this.activeMenuItem=null),!((s=this.activeMenuItem)!=null&&s.enabled)&&((l=this.activeMenuItem)==null?void 0:l.type)==="submenu"&&this._activeMenuItem.submenu.hide(),this._dirty=!1}get enabled(){return this.updateIfDirty(),this._menuItems.some(e=>e.type!=="divider"&&e.visible&&e.enabled)}get visible(){return this.updateIfDirty(),this._menuItems.some(e=>e.type!=="divider"&&e.visible)}set dirty(e){this._dirty!==e&&e&&this.parentMenu&&(this._dirty=!0,this.parentMenu.dirty=!0)}updateIfDirty(){this._dirty&&this.updateState(this.rootMenu.modifiers)}updateElement(){var e;if(this._element){this._element.textContent="";for(let{element:r,visible:i}of this._menuItems)r&&i&&this._element.append(r);(e=this._element.querySelector("li:first-of-type"))==null||e.setAttribute("tabindex","0")}}get element(){if(this._element)return this._element;let e=document.createElement("menu");e.setAttribute("role","menu"),e.setAttribute("tabindex","-1"),e.setAttribute("aria-orientation","vertical"),e.setAttribute("part","ui-menu-container"),this._submenuClass&&e.classList.add(this._submenuClass),e.classList.add("ui-menu-container"),this._abortController||(this._abortController=new AbortController);let r=this._abortController.signal;return e.addEventListener("focus",this,{signal:r}),e.addEventListener("wheel",this,{passive:!0,signal:r}),this._element=e,this.updateElement(),e}get activeMenuItem(){return this._activeMenuItem}set activeMenuItem(e){var r,i,n,o;if(this.rootMenu.cancelDelayedOperation(),e!==this._activeMenuItem){if(this.activeMenuItem){let a=this.activeMenuItem;a.active=!1,(r=a.submenu)==null||r.hide()}if(!((i=e==null?void 0:e.visible)==null||i)){this._activeMenuItem=null;return}this._activeMenuItem=e,e&&(e.active=!0)}e?(n=e.element)==null||n.focus({preventScroll:!0}):(o=this._element)==null||o.focus({preventScroll:!0})}get firstMenuItem(){this.updateIfDirty();let e=0,r=!1,i=this._menuItems;for(;!r&&e<=i.length-1;){let n=i[e];r=n.type!=="divider"&&n.visible&&n.enabled,e+=1}return r?i[e-1]:null}get lastMenuItem(){this.updateIfDirty();let e=this._menuItems,r=e.length-1,i=!1;for(;!i&&r>=0;){let n=e[r];i=n.type!=="divider"&&n.visible&&n.enabled,r-=1}return i?e[r+1]:null}nextMenuItem(e){if(e===0)return this._activeMenuItem;if(!this._activeMenuItem)return e>0?this.firstMenuItem:this.lastMenuItem;if(!this.firstMenuItem||!this.lastMenuItem||!this._activeMenuItem)return null;this.updateIfDirty();let r=this._menuItems.indexOf(this.firstMenuItem),i=this._menuItems.indexOf(this.lastMenuItem),n=this._menuItems.indexOf(this._activeMenuItem),o=1;for(;n>=r&&n<=i;){n+=e>0?1:-1;let a=this._menuItems[n];if(!a)break;if(a.visible&&a.enabled){if(o===Math.abs(e))return this._menuItems[n];o+=1}}return e>0?this.lastMenuItem:this.firstMenuItem}getMenuItemColumn(e){this.updateIfDirty();let i=this._menuItems.filter(n=>n.visible&&n.enabled).indexOf(e);return i<0?-1:i%this.columnCount}static get collator(){return t._collator||(t._collator=new Intl.Collator(void 0,{usage:"search",sensitivity:"base"})),t._collator}findMenuItem(e){var a;this.updateIfDirty();let r=this._menuItems.filter(s=>s.type!=="divider"&&s.visible&&s.enabled);if(r.length===0)return null;let i=Math.max(...r.map(s=>s.label.length))-e.length;if(i<0)return null;let n=null,o=0;for(;ot.collator.compare(e,s.label.substring(o,e.length))===0))!=null?a:null,o++;return n}show(e){return!this.visible||!e.container?!1:(this.updateElement(),e.container.appendChild(this.element),ol()&&(this.element.popover="manual",this.element.showPopover()),e.location&&Ap(this.element,{location:e.location,alternateLocation:e.alternateLocation,verticalPos:"bottom",horizontalPos:"start"}),Dp(),this.element.focus({preventScroll:!0}),Op(),this.parentMenu&&(this.parentMenu.openSubmenu=this),!0)}hide(){var e,r,i,n,o,a;this.openSubmenu=null,this.activeMenuItem=null,this.parentMenu&&(this.parentMenu.openSubmenu=null),!(!((e=this._element)!=null&&e.isConnected)||!this._element.parentElement)&&(ol()&&((r=this._element)!=null&&r.popover)&&this._element.hidePopover(),Dp(),(n=(i=this.parentMenu)==null?void 0:i.element)==null||n.focus(),(a=(o=this._element)==null?void 0:o.parentNode)==null||a.removeChild(this._element),Op())}set openSubmenu(e){var i,n,o,a;let r=e!==null;((i=this.activeMenuItem)==null?void 0:i.type)==="submenu"&&((n=this.activeMenuItem.element)==null||n.setAttribute("aria-expanded",r.toString())),(a=(o=this.activeMenuItem)==null?void 0:o.element)==null||a.classList.toggle("is-submenu-open",r),this.isSubmenuOpen=r}};function Dp(){document.addEventListener("focusin",Gr,!0),document.addEventListener("focusout",Gr,!0),document.addEventListener("focus",Gr,!0),document.addEventListener("blur",Gr,!0)}function Gr(t){t.stopImmediatePropagation(),t.preventDefault()}function Op(){document.removeEventListener("focusin",Gr,!0),document.removeEventListener("focusout",Gr,!0),document.removeEventListener("focus",Gr,!0),document.removeEventListener("blur",Gr,!0)}var qs=class qs extends Tn{constructor(r,i){var n;super(r);this.state="closed";this.typingBufferResetTimer=0;this.hysteresisTimer=0;this._updating=!1;this._host=(n=i==null?void 0:i.host)!=null?n:null,this.isDynamic=r.some(Bp),this._modifiers={shift:!1,control:!1,alt:!1,meta:!1},this.typingBuffer="",this.state="closed"}get modifiers(){return this._modifiers}set modifiers(r){Dh(this._modifiers,r)||(this._modifiers=r,this.dirty=!0)}get activeSubmenu(){let r=this;for(;r.isSubmenuOpen;)r=r.activeMenuItem.submenu;return r}set dirty(r){this._updating||this._dirty!==r&&(this._dirty=!0,r&&setTimeout(()=>{this.updateState(this.modifiers),this.updateElement()}))}updateState(r){this._updating=!0,this.modifiers=r!=null?r:this.modifiers,super.updateState(this.modifiers),this._updating=!1}handleKeyupEvent(r){this.isDynamic&&(this.modifiers=Wt(r)),r.stopImmediatePropagation()}handleKeydownEvent(r){var a,s,l;if(r.key==="Tab"||r.key==="Escape"){this.hide();return}this.isDynamic&&(this.modifiers=Wt(r));let i=!0,n=this.activeSubmenu,o=n.activeMenuItem;switch(r.key){case" ":case"Space":case"Return":case"Enter":o==null||o.select(Wt(r));break;case"ArrowRight":if((o==null?void 0:o.type)==="submenu")o.select(Wt(r)),this.activeSubmenu.activeMenuItem=this.activeSubmenu.firstMenuItem;else if(!o)n.activeMenuItem=n.firstMenuItem;else{let c=(a=n.getMenuItemColumn(o))!=null?a:-1;if(c>=0&&c<((s=n.columnCount)!=null?s:1)-1){let u=n.nextMenuItem(1);u&&(n.activeMenuItem=u)}}break;case"ArrowLeft":if(n===this.rootMenu)o||(n.activeMenuItem=n.firstMenuItem);else if((o&&(l=n.getMenuItemColumn(o))!=null?l:-1)<=0||!o){n.hide();let u=n.parentMenu.activeMenuItem;if(u){let{element:d}=u;d==null||d.focus(),d==null||d.classList.remove("is-submenu-open")}}else{let u=n.nextMenuItem(-1);u&&(n.activeMenuItem=u)}break;case"ArrowDown":n.activeMenuItem=n.nextMenuItem(n.columnCount);break;case"ArrowUp":n.activeMenuItem=n.nextMenuItem(-n.columnCount);break;case"Home":case"PageUp":n.activeMenuItem=n.firstMenuItem;break;case"End":case"PageDown":n.activeMenuItem=n.lastMenuItem;break;case"Backspace":if(this.typingBuffer&&(this.typingBuffer=this.typingBuffer.slice(0,-1),this.typingBuffer)){clearTimeout(this.typingBufferResetTimer);let c=n.findMenuItem(this.typingBuffer);c&&(n.activeMenuItem=c),this.typingBufferResetTimer=setTimeout(()=>{this.typingBuffer=""},500)}break;default:if(dr(r)){isFinite(this.typingBufferResetTimer)&&clearTimeout(this.typingBufferResetTimer),this.typingBuffer+=r.key;let c=n.findMenuItem(this.typingBuffer);c&&(n.activeMenuItem=c),this.typingBufferResetTimer=setTimeout(()=>{this.typingBuffer=""},500)}else i=!1}i&&(r.preventDefault(),r.stopPropagation())}handleEvent(r){if(r.type==="keydown")this.handleKeydownEvent(r);else if(r.type==="keyup")this.handleKeyupEvent(r);else if(r.type==="pointermove")this.lastMoveEvent=r;else if(r.type==="pointerup")Number.isFinite(this.rootMenu._openTimestamp)&&Date.now()-this.rootMenu._openTimestamp<120?this.state="modal":this.state==="modal"&&r.target===this.scrim&&this.hide();else if(r.type==="contextmenu"){r.preventDefault(),r.stopPropagation();return}super.handleEvent(r)}dispatchEvent(r){return this._host?this._host.dispatchEvent(r):!0}get host(){return this._host}get scrim(){return Te.element}connectScrim(r){let i=this.scrim;i.addEventListener("pointerup",this,!0),i.addEventListener("contextmenu",this),i.addEventListener("keydown",this),i.addEventListener("keyup",this),i.addEventListener("pointermove",this),Te.open({root:r,onDismiss:()=>this.hide()})}disconnectScrim(){let r=this.scrim;r.removeEventListener("pointerup",this,!0),r.removeEventListener("contextmenu",this),r.removeEventListener("keydown",this),r.removeEventListener("keyup",this),r.removeEventListener("pointermove",this),Te.state==="open"&&Te.scrim.close()}get rootMenu(){return this}show(r){return this._onDismiss=r==null?void 0:r.onDismiss,r!=null&&r.modifiers&&(this.modifiers=r.modifiers),this.updateState(),this.connectScrim(r==null?void 0:r.target),super.show(g(h({},r),{container:this.scrim}))?(this._openTimestamp=Date.now(),this.state="open",!0):(this.disconnectScrim(),!1)}hide(){this.cancelDelayedOperation(),this.state!==void 0&&(this.state!=="closed"&&(this.activeMenuItem=null,Te.element.parentElement.focus(),super.hide(),this.state="closed",this.disconnectScrim()),this._onDismiss&&(this._onDismiss(),this._onDismiss=void 0))}scheduleOperation(r){this.cancelDelayedOperation();let i=qs.SUBMENU_DELAY;if(i<=0){r();return}this.hysteresisTimer=setTimeout(()=>{this.hysteresisTimer=0,r()},i)}cancelDelayedOperation(){this.hysteresisTimer&&(clearTimeout(this.hysteresisTimer),this.hysteresisTimer=0)}};qs.SUBMENU_DELAY=120;var Do=qs;function Bp(t){return To(t)?!1:typeof t.label=="function"||typeof t.ariaLabel=="function"||typeof t.tooltip=="function"||(Lt(t)||Ur(t))&&(typeof t.enabled=="function"||typeof t.visible=="function")||Lt(t)&&typeof t.checked=="function"?!0:Ur(t)?t.submenu.some(Bp):!1}var Dn=class{};Dn.DELAY=300,Dn.MAX_DISTANCE=10;function Kp(t){return new Promise((e,r)=>{let i=bn(t);i||e(!1);let n=i,o=setTimeout(()=>{a.abort(),e(Cp(n,i){if(c.type==="pointerup"||c.type==="pointercancel")clearTimeout(o),a.abort(),e(!1);else if(c.type==="pointermove"){let u=bn(c);u&&(n=u)}},{passive:!0,signal:s})})}async function Qc(t,e,r){if(t.defaultPrevented)return!1;if(t.type==="contextmenu"){let i=t;if(t.preventDefault(),t.stopPropagation(),r.show({target:e,location:bn(i),modifiers:Wt(i)}))return!0}if(t.type==="keydown"){let i=t;if(i.code==="ContextMenu"||i.code==="F10"&&i.shiftKey){let n=e==null?void 0:e.getBoundingClientRect();if(Pp(e)&&n&&r.show({target:e,location:{x:Math.ceil(n.left+n.width/2),y:Math.ceil(n.top+n.height/2)},modifiers:Wt(i)}))return t.preventDefault(),t.stopPropagation(),!0}}if(t.type==="pointerdown"&&t.pointerType!=="mouse"&&t.button===0){let i=t.target;for(;i&&e!==i;)i=i.parentNode;if(!i||!r.visible)return!1;let n=bn(t);if(await Kp(t))return r.state!=="closed"||!Pp(e)?!1:(r.show({target:e,location:n}),!0)}return!1}function Pp(t){return t.dispatchEvent(new Event("contextmenu",{cancelable:!0}))}var Zt={"\\ne":"\u2260","\\neq":"\u2260","\u2212":"-","-":"-","\\alpha":"alpha","\\beta":"beta","\\gamma":"gamma","\\delta":"delta","\\epsilon":"epsilon","\\varepsilon":"varepsilon","\\zeta":"zeta","\\eta":"eta","\\theta":"theta","\\vartheta":"vartheta","\\iota":"iota","\\kappa":"kappa","\\lambda":"lambda","\\mu":"mu","\\nu":"nu","\\xi":"xi","\\pi":"pi","\\rho":"rho","\\sigma":"sigma","\\tau":"tau","\\upsilon":"upsilon","\\phi":"phi","\\varphi":"varphi","\\chi":"chi","\\psi":"psi","\\omega":"omega","\\Gamma":"Gamma","\\Delta":"Delta","\\Theta":"Theta","\\Lambda":"Lambda","\\Xi":"Xi","\\Pi":"Pi","\\Sigma":"Sigma","\\Phi":"Phi","\\Psi":"Psi","\\Omega":"Omega","\\exponentialE":"e","\\imaginaryI":"i","\\imaginaryJ":"j","\\!":" ","\\,":" ","\\:":" ","\\>":" ","\\;":" ","\\enskip":" ","\\enspace":" ","\\qquad":" ","\\quad":" ","\\infty":"oo","\\R":"RR","\\mathbb{R}":"RR","\\N":"NN","\\mathbb{N}":"NN","\\Z":"ZZ","\\mathbb{Z}":"ZZ","\\Q":"QQ","\\mathbb{Q}":"QQ","\\C":"CC","\\mathbb{C}":"CC","\\emptyset":"O/","\\varnothing":"O/","\\varDelta":"Delta","\\varTheta":"Theta","\\varLambda":"Lambda","\\varXi":"Xi","\\varPi":"Pi","\\varSigma":"Sigma","\\varUpsilon":"Upsilon","\\varPhi":"Phi","\\varPsi":"Psi","\\varOmega":"Omega"},Oo={"\\pm":"+-","\\colon":" : ","\\sum":" sum ","\\prod":" prod ","\\bigcap":" nnn ","\\bigcup":" uuu ","\\int":" int ","\\oint":" oint ","\\ge":">=","\\le":"<=","\\ne":"!=","\\neq":"!=","\\lt":"<","\\gt":">","\\gets":"<-","\\to":"->","\\land":" and ","\\lor":" or ","\\lnot":" not ","\\forall":" AA ","\\exists":" EE ","\\in":" in ","\\notin":" !in ","\\mapsto":"|->","\\implies":"=>","\\iff":"<=>","\\cdot":" * ","\\ast":" ** ","\\star":" *** ","\\times":" * ","\\div":" -: ","\\ltimes":" |>< ","\\rtimes":" ><| ","\\bowtie":" |><| ","\\circ":"@"},Hs={"\\vert":"|","\\Vert":"||","\\mid":"|","\\lbrack":"[","\\rbrack":"]","\\lbrace":"{","\\rbrace":"}","\\lparen":"(","\\rparen":")","\\langle":"(:","\\rangle":":)"};function py(t){let e="";for(let r of t){let i=e[e.length-1];i!==void 0&&(/\d$/.test(i)&&/^\d/.test(r)||/[a-zA-Z]$/.test(i)&&/^[a-zA-Z]/.test(r))&&(e+=" "),e+=r}return e}function le(t,e){var a,s,l,c,u,d,m,p,f,y,v,b,k,S,A,E,C,_,O;if(!t)return"";if(ee(t)){if(t.length===0)return"";if(t[0].mode==="latex")return t.map(K=>le(K)).join("");if(t[0].mode==="text"){let K=0,N="";for(;((a=t[K])==null?void 0:a.mode)==="text";)N+=t[K].body?le(t[K].body,e):t[K].value,K++;return e!=null&&e.plain?N+le(t.slice(K),e):`"${N}" ${le(t.slice(K))}`}let I=0,V=[];for(;((s=t[I])==null?void 0:s.mode)==="math";){let K="";for(;((l=t[I])==null?void 0:l.type)==="mord"&&/\d/.test(t[I].value);)K+=t[I++].value;K?V.push(K):V.push(le(t[I++],e))}return V.push(le(t.slice(I),e)),py(V)}if(t.mode==="text")return e!=null&&e.plain?t.value:`"${t.value}"`;let r="",{command:i}=t,n;if(i==="\\placeholder")return`(${le(t.body,e)})`;let o=x.serialize([t],{expandMacro:!1,defaultMode:"math"});switch(t.type){case"accent":let I={"\\vec":"vec","\\dot":"dot","\\ddot":"ddot","\\bar":"bar","\\hat":"hat","\\acute":"acute;","\\grave":"grave","\\tilde":"tilde","\\breve":"breave","\\check":"check"}[i];r=`${I!=null?I:""} ${le(t.body,e)} `;break;case"first":return"";case"latexgroup":return t.body.map(K=>K.value).join("");case"group":case"root":r=(c=Zt[i])!=null?c:le(t.body,e);break;case"genfrac":{let K=t;(K.leftDelim||K.rightDelim)&&(r=K.leftDelim==="."||!K.leftDelim?"{:":K.leftDelim),K.hasBarLine?(r+="(",r+=le(K.above,e),r+=")/(",r+=le(K.below,e),r+=")"):(r+="((",r+=le(K.above,e),r+=") choose (",r+=le(K.below,e),r+="))"),(K.leftDelim||K.rightDelim)&&(r+=K.rightDelim==="."||!K.rightDelim?"{:":K.rightDelim)}break;case"surd":t.hasEmptyBranch("above")?r+=`sqrt(${le(t.body,e)})`:r+=`root(${le(t.above,e)})(${le(t.body,e)})`;break;case"latex":r=t.value;break;case"leftright":{let K=t,N=K.leftDelim;N&&Hs[N]&&(N=Hs[N]),r+=N==="."||!N?"{:":N,r+=le(K.body,e);let j=K.matchingRightDelim();j&&Hs[j]&&(j=Hs[j]),r+=j==="."||!j?":}":j}break;case"sizeddelim":case"delim":r=t.value;break;case"overlap":break;case"overunder":break;case"mord":if(Zt[o])return Zt[o];r=(m=(d=(u=Zt[i])!=null?u:i)!=null?d:i)!=null?m:typeof t.value=="string"?t.value:"",r.startsWith("\\")&&(r+=" "),n=i?i.match(/{?\\char"([\dabcdefABCDEF]+)}?/):null,n?r=String.fromCodePoint(Number.parseInt("0x"+n[1])):r.length>0&&r.startsWith("\\")&&(r=typeof t.value=="string"?t.value.charAt(0):t.command),r=fy(r,t.style);break;case"mbin":case"mrel":case"minner":r=(y=(f=(p=Zt[o])!=null?p:Zt[i])!=null?f:Oo[i])!=null?y:t.value;break;case"mopen":case"mclose":r=t.value;break;case"mpunct":r=(v=Oo[i])!=null?v:i;break;case"mop":case"operator":case"extensible-symbol":t.value!=="\u200B"&&(Oo[i]?r=Oo[i]:r=i==="\\operatorname"?le(t.body,e):(b=t.value)!=null?b:i,r+=" ");break;case"array":let V=t.environmentName;if(t.isMultiline)r=t.rows.map(N=>N.map(j=>le(j,e)).join("")).join(` +`);else{let K=(k={bmatrix:["[","]"],"bmatrix*":["[","]"]}[V])!=null?k:["(",")"],N=[],j=t.rows;for(let W of j){let ie=[];for(let X of W)ie.push(le(X,e));N.push(K[0]+ie.join(",")+K[1])}let D=(S={bmatrix:["[","]"],"bmatrix*":["[","]"],cases:["{",":}"]}[V])!=null?S:["(",")"];r=D[0]+N.join(",")+D[1]}break;case"box":break;case"spacing":r=(E=(A=Zt[o])!=null?A:Zt[i])!=null?E:" ";break;case"enclose":r="("+le(t.body,e)+")";break;case"space":r=" ";break;case"subsup":r="";break;case"macro":r=(O=(_=(C=Zt[o])!=null?C:Zt[i])!=null?_:Oo[i])!=null?O:le(t.body,e);break}if(!t.hasEmptyBranch("subscript")){r+="_";let I=le(t.subscript,e);r+=I.length!==1?`(${I})`:I}if(!t.hasEmptyBranch("superscript")){r+="^";let I=le(t.superscript,e);r+=I.length!==1?`(${I})`:I}return r}function fy(t,e){if(!e)return t;let r=t;return e.variant==="double-struck"&&(r=`bbb "${r}"`),e.variant==="script"&&(r=`cc "${r}"`),e.variant==="fraktur"&&(r=`fr "${r}"`),e.variant==="sans-serif"&&(r=`sf "${r}"`),e.variant==="monospace"&&(r=`tt "${r}"`),e.variantStyle==="bold"&&(r=`bb "${r}"`),e.color?`color({${e.color}})(${r})`:r}function pe(t,e){var u;let r=g(h({},Qn()),{renderPlaceholder:()=>new w(160,{maxFontSize:1})});if(e!=null&&e.letterShapeStyle&&(e==null?void 0:e.letterShapeStyle)!=="auto"&&(r.letterShapeStyle=e.letterShapeStyle),e!=null&&e.macros){let d=ei(e==null?void 0:e.macros);r.getMacro=m=>ti(m,d)}e!=null&&e.registers&&(r.registers=h(h({},r.registers),e.registers));let i=(u=e==null?void 0:e.defaultMode)!=null?u:"math",n="math",o="displaystyle";i==="inline-math"?o="textstyle":i==="math"?o="displaystyle":i==="text"&&(o="textstyle",n="text");let a=new P({from:r}),l=new x({type:"root",mode:n,body:be(t,{context:a,parseMode:n,mathstyle:o})}).render(a);return l?(Or(Ht(l,a)),Br(l,{classes:"ML__latex"}).toMarkup()):""}function gy(t,e){let r=h({},Qn());if(e!=null&&e.macros){let i=ei(e.macros);r.getMacro=n=>ti(n,i)}return ss(t,{context:r})}function Bo(t,e={}){return G(be(t,{parseMode:"math",args:()=>"",mathstyle:"displaystyle"}),e)}function Ko(t){let e=be(t,{parseMode:"math",mathstyle:"displaystyle"});return wt(e)}function by(t,e="math"){return le(new x({type:"root",body:be(t,{parseMode:e})}))}function eu(t){return or(t,{format:"ascii-math"})[1]}function Po(t){if(typeof t=="string"){let e=yy(t);if(!e)throw new Error(`Invalid color: ${t}`);return e}return"C"in t?vy(t):"a"in t?Rp(t):t}function Ci(t){return t<0?0:t>255?255:Math.round(t)}function yy(t){if(!t||t[0]!=="#")return;t=t.slice(1);let e;return t.length<=4?(e={r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16)},t.length===4&&(e.a=parseInt(t[3]+t[3],16)/255)):(e={r:parseInt(t[0]+t[1],16),g:parseInt(t[2]+t[3],16),b:parseInt(t[4]+t[5],16)},t.length===8&&(e.a=parseInt(t[6]+t[7],16)/255)),typeof(e==null?void 0:e.a)=="undefined"&&(e.a=1),e}function nu(t){let[e,r,i]=[t.L,t.C,t.H],n=i*Math.PI/180,o={L:e,a:r*Math.cos(n),b:r*Math.sin(n)};return t.alpha!==void 0&&(o.alpha=t.alpha),o}function xy(t){let[e,r,i]=[t.L,t.a,t.b],n=Math.sqrt(r*r+i*i),a=Math.atan2(i,r)*180/Math.PI,s={L:e,C:n,H:a};return t.alpha!==void 0&&(s.alpha=t.alpha),s}function tu(t){let[e,r,i]=[t.L,t.a,t.b],n=Math.pow(.9999999984505198*e+.39633779217376786*r+.2158037580607588*i,3),o=Math.pow(1.00000000888176*e-.10556134232365635*r-.0638541747717059*i,3),a=Math.pow(e*1.000000054672411-.0894841820949657*r-1.2914855378640917*i,3),s=4.076741661347994*n-3.307711590408193*o+.230969928729428*a,l=-1.2684380040921763*n+2.6097574006633715*o-.3413193963102197*a,c=-.004196086541837188*n-.7034186144594493*o+1.7076147009309444*a,u=d=>{let m=Math.abs(d);return m<=.0031308?d*12.92:(Math.sign(d)||1)*(1.055*Math.pow(m,1/2.4)-.055)};return[u(s),u(l),u(c)]}function ru(t){let[e,r,i]=t;return e>=0&&e<=1&&r>=0&&r<=1&&i>=0&&i<=1}function iu(t,e){let[r,i,n]=t;return r=Ci(r*255),i=Ci(i*255),n=Ci(n*255),e!==void 0?{r,g:i,b:n,alpha:e}:{r,g:i,b:n}}function Rp(t){let[e,r,i]=tu(t);if(ru([e,r,i]))return iu([e,r,i],t.alpha);let n=xy(t);if(n.C=0,[e,r,i]=tu(nu(n)),!ru([e,r,i]))return iu([e,r,i],t.alpha);let o=0,a=t.L,s=(o+a)/2;n.C=s;let l=.36/Math.pow(2,12);for(;a-o>l;)s=(o+a)/2,n.C=s,[e,r,i]=tu(nu(n)),ru([e,r,i])?o=s:a=s;return iu([e,r,i],t.alpha)}function vy(t){return Rp(nu(t))}function Ip(t,e){let r=Po(t),i=Po(e),n=.56,o=.57,a=.62,s=.65,l=.022,c=1.414,u=.1,d=5e-4,m=1.14,p=.027,f=1.14,y=.027;function v(_){return _>=l?_:_+(l-_)**c}function b(_){return(_<0?-1:1)*Math.pow(Math.abs(_),2.4)}let k=v(b(i.r/255)*.2126729+b(i.g/255)*.7151522+b(i.b/255)*.072175),S=v(b(r.r/255)*.2126729+b(r.g/255)*.7151522+b(r.b/255)*.072175),A,E,C;return Math.abs(S-k)k?(A=S**n-k**o,E=A*m):(A=S**s-k**a,E=A*f),Math.abs(E)0?C=E-y:C=E+p,C*100}function ou(t,e,r){r!=null||(r="#fff"),e!=null||(e="#000");let i=Ip(t,r),n=Ip(t,e);return Math.abs(i)>Math.abs(n)?r:e}function zp(t){let e=Po(t),r=((1<<24)+(Ci(e.r)<<16)+(Ci(e.g)<<8)+Ci(e.b)).toString(16).slice(1);return e.alpha!==void 0&&e.alpha<1&&(r+=("00"+Math.round(e.alpha*255).toString(16)).slice(-2)),r[0]===r[1]&&r[2]===r[3]&&r[4]===r[5]&&r[6]===r[7]&&(r=r[0]+r[2]+r[4]+(e.alpha!==void 0&&e.alpha<1?r[6]:"")),"#"+r}function oe(t){let e=Np(t),r="";for(let i of e){if(typeof i.value!="string")return"";r+=i.value}return r}function Np(t){let r=t.model.selection.ranges;if(r.length!==1)return[];let i=t.model.getAtoms(r[0]);return i.length===1&&i[0].isRoot&&(i=i[0].children),i.filter(n=>n.type!=="first")}function _y(t,e){let r=Np(t);if(r.length!==1)return!1;let i=ms[e];return i?!!i.test(r[0].value):!1}function My(t){return[su(t,"double-struck","mathbb","tooltip.blackboard"),su(t,"fraktur","mathfrak","tooltip.fraktur"),su(t,"calligraphic","mathcal","tooltip.caligraphic"),lu(t,"up","mathrm","tooltip.roman-upright"),lu(t,"bold","bm","tooltip.bold"),lu(t,"italic","mathit","tooltip.italic")]}function wy(t){return[{id:"accent-vec",class:"ML__center-menu",label:()=>pe(`\\vec{${oe(t)}}`),visible:()=>oe(t).length===1,onMenuSelect:()=>t.insert("\\vec{#@}",{selectionMode:"item"})},{id:"accent-overrightarrow",class:"ML__center-menu",label:()=>pe(`\\overrightarrow{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\overrightarrow{#@}",{selectionMode:"item"})},{id:"accent-overleftarrow",class:"ML__center-menu",label:()=>pe(`\\overleftarrow{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\overleftarrow{#@}",{selectionMode:"item"})},{id:"accent-dot",class:"ML__center-menu",label:()=>pe(`\\dot{${oe(t)}}`),visible:()=>oe(t).length===1,onMenuSelect:()=>t.insert("\\dot{#@}",{selectionMode:"item"})},{id:"accent-ddot",class:"ML__center-menu",label:()=>pe(`\\ddot{${oe(t)}}`),visible:()=>oe(t).length===1,onMenuSelect:()=>t.insert("\\ddot{#@}",{selectionMode:"item"})},{id:"accent-bar",class:"ML__center-menu",label:()=>pe(`\\bar{${oe(t)}}`),visible:()=>oe(t).length===1,onMenuSelect:()=>t.insert("\\bar{#@}",{selectionMode:"item"})},{id:"accent-overline",class:"ML__center-menu",label:()=>pe(`\\overline{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\overline{#@}",{selectionMode:"item"})},{id:"accent-overgroup",class:"ML__center-menu",label:()=>pe(`\\overgroup{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\overgroup{#@}",{selectionMode:"item"})},{id:"accent-overbrace",class:"ML__center-menu",label:()=>pe(`\\overbrace{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\overbrace{#@}",{selectionMode:"item"})},{id:"accent-underline",class:"ML__center-menu",label:()=>pe(`\\underline{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\underline{#@}",{selectionMode:"item"})},{id:"accent-undergroup",class:"ML__center-menu",label:()=>pe(`\\undergroup{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\undergroup{#@}",{selectionMode:"item"})},{id:"accent-underbrace",class:"ML__center-menu",label:()=>pe(`\\underbrace{${oe(t)}}`),visible:()=>oe(t).length>0,onMenuSelect:()=>t.insert("\\underbrace{#@}",{selectionMode:"item"})}]}function Sy(t){return[{id:"decoration-boxed",label:()=>pe(`\\boxed{${t.getValue(t.model.selection)}}}`),onMenuSelect:()=>t.insert("\\boxed{#@}",{selectionMode:"item"})},{id:"decoration-red-box",label:()=>pe(`\\bbox[5px, border: 2px solid red]{${t.getValue(t.model.selection)}}`),onMenuSelect:()=>t.insert("\\bbox[5px, border: 2px solid red]{#@}",{selectionMode:"item"})},{id:"decoration-dashed-black-box",label:()=>pe(`\\bbox[5px, border: 2px dashed black]{${t.getValue(t.model.selection)}}`),onMenuSelect:()=>t.insert("\\bbox[5px, border: 2px dashed black]{#@}",{selectionMode:"item"})}]}function ky(t){let e=[];for(let r of Object.keys(Qt))e.push({id:`background-color-${r}`,class:(zp(ou(Qt[r]))==="#000"?"dark-contrast":"light-contrast")+" menu-swatch",label:``,ariaLabel:()=>{var i;return(i=$(r))!=null?i:r},checked:()=>{var i;return(i={some:"mixed",all:!0}[t.queryStyle({backgroundColor:r})])!=null?i:!1},onMenuSelect:()=>t.applyStyle({backgroundColor:r},{operation:"toggle"})});return e}function Ly(t){let e=[];for(let r of Object.keys(er))e.push({id:`color-${r}`,class:(ou(er[r])==="#000"?"dark-contrast":"light-contrast")+" menu-swatch",label:``,ariaLabel:()=>{var i;return(i=$(r))!=null?i:r},checked:()=>{var i;return(i={some:"mixed",all:!0}[t.queryStyle({color:r})])!=null?i:!1},onMenuSelect:()=>t.applyStyle({color:r},{operation:"toggle"})});return e}var cu=class extends En{constructor(e,r,i,n){super(e,r),this.row=i,this.col=n}set active(e){let r=this.parentMenu.children;if(e)for(let i of r)i.element.classList.toggle("active",i.row<=this.row&&i.col<=this.col);else for(let i of r)i.element.classList.remove("active")}};function Ay(t){let e=[];for(let r=1;r<=5;r++)for(let i=1;i<=5;i++)e.push({id:`insert-matrix-${r}x${i}`,onCreate:(n,o)=>new cu(n,o,r,i),label:"\u2610",tooltip:()=>$("tooltip.row-by-col",r,i),data:{row:r,col:i},onMenuSelect:()=>{t.insert(`\\begin{pmatrix}${Array(r).fill(Array(i).fill("#?").join(" & ")).join("\\\\")}\\end{pmatrix}`,{selectionMode:"item"})}});return e}function Fp(t){return[{label:()=>$("menu.array.add row above"),id:"add-row-above",onMenuSelect:()=>t.executeCommand("addRowBefore"),keyboardShortcut:"shift+alt+[Return]",visible:()=>{if(!t.isSelectionEditable||!Ei(t))return!1;let[e,r]=jr(t),[i,n]=On(t);return e!==i}},{label:()=>$("menu.array.add row below"),id:"add-row-below",onMenuSelect:()=>t.executeCommand("addRowAfter"),keyboardShortcut:"alt+[Return]",visible:()=>{if(!t.isSelectionEditable||!Ei(t))return!1;let[e,r]=jr(t),[i,n]=On(t);return e!==i}},{label:()=>$("menu.array.add column before"),id:"add-column-before",onMenuSelect:()=>t.executeCommand("addColumnBefore"),visible:()=>{if(!t.isSelectionEditable||!Ei(t))return!1;let[e,r]=jr(t),[i,n]=On(t);return r!==n},keyboardShortcut:"shift+alt+[Tab]",enabled:()=>{let e=t.model.parentEnvironment;if(!e)return!1;let[r,i]=au(t);return r$("menu.array.add column after"),id:"add-column-after",onMenuSelect:()=>t.executeCommand("addColumnAfter"),keyboardShortcut:"alt+[Tab]",visible:()=>{if(!t.isSelectionEditable||!Ei(t))return!1;let[e,r]=jr(t),[i,n]=On(t);return r!==n}},{type:"divider"},{label:()=>$("menu.array.delete row"),id:"delete-row",onMenuSelect:()=>t.executeCommand("removeRow"),enabled:()=>{let[e,r]=jr(t),[i,n]=au(t);return i>e},visible:()=>{if(!t.isSelectionEditable||!Ei(t))return!1;let[e,r]=jr(t),[i,n]=On(t);return e!==i}},{label:()=>$("menu.array.delete column"),id:"delete-column",onMenuSelect:()=>t.executeCommand("removeColumn"),enabled:()=>{let[e,r]=jr(t),[i,n]=au(t);return n>r},visible:()=>{if(!t.isSelectionEditable||!Ei(t))return!1;let[e,r]=jr(t),[i,n]=On(t);return r!==n}},{type:"divider"},{label:()=>$("menu.borders"),visible:()=>(Cy(t)||Ei(t))&&t.isSelectionEditable,submenu:[{label:" \u22F1 ",id:"environment-no-border",onMenuSelect:()=>Ro(t,"matrix")},{label:"(\u22F1)",id:"environment-parentheses",onMenuSelect:()=>Ro(t,"pmatrix")},{label:"[\u22F1]",id:"environment-brackets",onMenuSelect:()=>Ro(t,"bmatrix")},{label:"|\u22F1|",id:"environment-bar",onMenuSelect:()=>Ro(t,"vmatrix")},{label:"{\u22F1}",id:"environment-braces",onMenuSelect:()=>Ro(t,"Bmatrix")}],submenuClass:"border-submenu"},{type:"divider"},{label:()=>$("menu.insert matrix"),id:"insert-matrix",visible:()=>t.isSelectionEditable,submenu:Ay(t),submenuClass:"insert-matrix-submenu",columnCount:5},{type:"divider"},{label:()=>$("menu.insert"),id:"insert",submenu:Ey(t)},{type:"divider"},{label:()=>$("menu.mode"),id:"mode",visible:()=>t.isSelectionEditable&&t.model.selectionIsCollapsed,submenu:[{label:()=>$("menu.mode-math"),id:"mode-math",onMenuSelect:()=>{Qe(t,"accept-all"),t.executeCommand(["switchMode","math"])},checked:()=>t.model.mode==="math"},{label:()=>$("menu.mode-text"),id:"mode-text",onMenuSelect:()=>{Qe(t,"accept-all"),t.executeCommand(["switchMode","text"])},checked:()=>t.model.mode==="text"},{label:()=>$("menu.mode-latex"),id:"mode-latex",onMenuSelect:()=>t.executeCommand(["switchMode","latex"]),checked:()=>t.model.mode==="latex"}]},{type:"divider"},{label:()=>$("menu.font-style"),id:"variant",visible:()=>t.isSelectionEditable,submenu:My(t),submenuClass:"variant-submenu"},{label:()=>$("menu.color"),id:"color",visible:()=>t.isSelectionEditable,submenu:Ly(t),columnCount:4,submenuClass:"swatches-submenu"},{label:()=>$("menu.background-color"),id:"background-color",visible:()=>t.isSelectionEditable,submenu:ky(t),columnCount:4,submenuClass:"swatches-submenu"},{label:()=>$("menu.accent"),id:"accent",visible:()=>t.isSelectionEditable,submenu:wy(t),submenuClass:"variant-submenu"},{label:()=>$("menu.decoration"),id:"decoration",visible:()=>t.isSelectionEditable&&oe(t).length>0,submenu:Sy(t),submenuClass:"variant-submenu"},{type:"divider"},{label:()=>$("menu.cut"),id:"cut",onMenuSelect:()=>t.executeCommand("cutToClipboard"),visible:()=>!t.options.readOnly&&t.isSelectionEditable,keyboardShortcut:"meta+X"},{label:()=>$("menu.copy"),id:"copy",submenu:[{label:()=>$("menu.copy-as-latex"),id:"copy-latex",onMenuSelect:()=>H.copyToClipboard(t,"latex"),keyboardShortcut:"meta+C"},{label:()=>$("menu.copy-as-typst"),id:"copy-latex",onMenuSelect:()=>H.copyToClipboard(t,"typst")},{label:()=>$("menu.copy-as-ascii-math"),id:"copy-ascii-math",onMenuSelect:()=>H.copyToClipboard(t,"ascii-math")},{label:()=>$("menu.copy-as-mathml"),id:"copy-math-ml",onMenuSelect:()=>H.copyToClipboard(t,"math-ml")}]},{label:()=>$("menu.paste"),id:"paste",onMenuSelect:()=>t.executeCommand("pasteFromClipboard"),visible:()=>t.hasEditableContent,keyboardShortcut:"meta+V"},{label:()=>$("menu.select-all"),id:"select-all",keyboardShortcut:"meta+A",onMenuSelect:()=>t.executeCommand("selectAll")}]}function Ei(t){var r,i;let e=(i=(r=t.model.parentEnvironment)==null?void 0:r.environmentName)!=null?i:"";return["array","matrix","pmatrix","bmatrix","vmatrix","Bmatrix","cases","dcases","rcases"].includes(e)}function Cy(t){let e=t.model.at(t.model.position);if(e.type!=="array")return!1;let r=e.environmentName;return["matrix","pmatrix","bmatrix","vmatrix","Bmatrix"].includes(r)}function au(t){var r;let e=(r=t.model.parentEnvironment)==null?void 0:r.rows;return e?[e.length,e.reduce((i,n)=>Math.max(i,n.length),0)]:[0,0]}function jr(t){let e=t.model.parentEnvironment;return e?[e.minRows,e.minColumns]:[0,0]}function On(t){let e=t.model.parentEnvironment;return e?[e.maxRows,e.maxColumns]:[0,0]}function Ro(t,e){xi(t),t.flushInlineShortcutBuffer(),Nc(t.model,e),Y(t)}function su(t,e,r,i){return{id:`variant-${e}`,label:()=>{var o;return oe(t).length<12?pe(`\\${r}{${oe(t)}}`):(o=$(i))!=null?o:i},class:"ML__xl",tooltip:()=>{var n;return(n=$(i))!=null?n:i},visible:()=>_y(t,e),checked:()=>{var n;return(n={some:"mixed",all:!0}[t.queryStyle({variant:e})])!=null?n:!1},onMenuSelect:()=>t.applyStyle({variant:e},{operation:"toggle"})}}function lu(t,e,r,i){return{id:`variant-style-${e}`,label:()=>{var o;let n=oe(t);return n.length>0&&n.length<12?pe(`\\${r}{${oe(t)}}`):(o=$(i))!=null?o:i},class:()=>{let n=oe(t);return n.length>0&&n.length<12?"ML__xl":""},tooltip:()=>{var n;return(n=$(i))!=null?n:i},visible:!0,checked:()=>{var n;return(n={some:"mixed",all:!0}[t.queryStyle({variantStyle:e})])!=null?n:!1},onMenuSelect:()=>t.applyStyle({variantStyle:e},{operation:"toggle"})}}function Ey(t){return[{label:()=>et("abs"),id:"insert-abs",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("|#?|")},{label:()=>et("nth-root"),id:"insert-nth-root",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\sqrt[#?]{#?}")},{label:()=>et("log-base"),id:"insert-log-base",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\log_{#?}{#?}")},{type:"heading",label:()=>$("menu.insert.heading-calculus")},{label:()=>et("derivative"),id:"insert-derivative",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\dfrac{\\mathrm{d}}{\\mathrm{d}x}#?\\bigm|_{x=#?}")},{label:()=>et("nth-derivative"),id:"insert-nth-derivative",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\dfrac{\\mathrm{d}^#?}{\\mathrm{d}x^#?}#?\\bigm|_{x=#?}")},{label:()=>et("integral"),id:"insert-integral",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\int_#?^#?#?\\,\\mathrm{d}#?")},{label:()=>et("sum"),id:"insert-sum",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\sum_#?^#?#?")},{label:()=>et("product"),id:"insert-product",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\prod_#?^#?#?")},{type:"heading",label:()=>$("menu.insert.heading-complex-numbers")},{label:()=>et("modulus"),id:"insert-modulus",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\lvert#?\\rvert")},{label:()=>et("argument"),id:"insert-argument",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\arg(#?)")},{label:()=>et("real-part"),id:"insert-real-part",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\Re(#?)")},{label:()=>et("imaginary-part"),id:"insert-imaginary-part",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\Im(#?)")},{label:()=>et("conjugate"),id:"insert-conjugate",visible:()=>t.isSelectionEditable,onMenuSelect:()=>t.insert("\\overline{#?}")}]}function et(t){return` ${pe($(`menu.insert.${t}-template`))}${$(`menu.insert.${t}`)}`}var Ve={"\\ne":"!=","\\neq":"!=","\u2212":"-","-":"-","\\alpha":"alpha","\\beta":"beta","\\gamma":"gamma","\\delta":"delta","\\epsilon":"epsilon.alt","\\varepsilon":"epsilon","\\zeta":"zeta","\\eta":"eta","\\theta":"theta.alt","\\vartheta":"theta","\\iota":"iota","\\kappa":"kappa","\\lambda":"lambda","\\mu":"mu","\\nu":"nu","\\xi":"xi","\\pi":"pi","\\rho":"rho","\\sigma":"sigma","\\tau":"tau","\\upsilon":"upsilon","\\phi":"phi.alt","\\varphi":"phi","\\chi":"chi","\\psi":"psi","\\omega":"omega","\\Gamma":"Gamma","\\Delta":"Delta","\\Theta":"Theta","\\Lambda":"Lambda","\\Xi":"Xi","\\Pi":"Pi","\\Sigma":"Sigma","\\Phi":"Phi","\\Psi":"Psi","\\Omega":"Omega","\\exponentialE":"e","\\imaginaryI":"i","\\imaginaryJ":"j","\\!":" #h(-1em/6) ","\\,":" thin ","\\:":" med ","\\>":" med ","\\;":" thick ","\\enskip":"space.en","\\enspace":"space.en","\\qquad":"space.quad space.quad","\\quad":"space.quad","\\infty":"infinity","\\R":"RR","\\mathbb{R}":"RR","\\N":"NN","\\mathbb{N}":"NN","\\Z":"ZZ","\\mathbb{Z}":"ZZ","\\Q":"QQ","\\mathbb{Q}":"QQ","\\C":"CC","\\mathbb{C}":"CC","\\emptyset":"emptyset","\\varnothing":"nothing","\\varDelta":"Delta","\\varTheta":"Theta","\\varLambda":"Lambda","\\varXi":"Xi","\\varPi":"Pi","\\varSigma":"Sigma","\\varUpsilon":"Upsilon","\\varPhi":"Phi","\\varPsi":"Psi","\\varOmega":"Omega","\\vert":" | ","\\Vert":" || ","\\mid":" divides ","\\lbrack":" bracket.l ","\\rbrack":" bracket.r ","\\lbrace":" brace.l ","\\rbrace":" brace.r ","\\lparen":" paren.l ","\\rparen":" paren.r ","\\langle":" angle.l ","\\rangle":" angle.r ","\\differentialD":" dif ","\\diamond":" diamond.stroked.small ","\\square":" square.stroked.small ","\\lceil":" ceil.l ","\\rceil":" ceil.r ","\\lfloor":" floor.l ","\\rfloor":" floor.r ","\\aleph":" aleph ","\\bet":" bet ","\\gimel":" gimel ","\\dalet":" dalet ","\\mod":" mod ","\\equiv":" equiv ","\\subset":" subset ","\\supset":" supset ","\\subseteq":" subset.eq ","\\supseteq":" supset.eq ","\\subsetneq":" subset.neq ","\\supsetneq":" supset.neq ","\\supsetneqq":" supset.neq ","\\nsubset":" subset.not ","\\nsupset":" supset.not ","\\nsubseteq":" subset.eq.not ","\\nsupseteq":" supset.eq.not ","\\approx":" approx ","\\uparrow":" arrow.t ","\\downarrow":" arrow.b ","\\rightarrow":" arrow.r ","\\leftarrow":" arrow.l ","\\longmapsto":" mapsto.long ","\\longmapsfrom":" arrow.l.bar.long ","/":"\\/","&":"&"},$p={"[":" bracket.l ","]":" bracket.r ","{":" brace.l ","}":" brace.r ","(":" paren.l ",")":" paren.r ","<":" angle.l ",">":" angle.r ",".":""},Vp={" bracket.l ":"["," bracket.r ":"]"," brace.l ":"{"," brace.r ":"}"," paren.l ":"("," paren.r ":")"," angle.l ":" angle.l "," angle.r ":" angle.r "},Io={"\\pm":"plus.minus","\\colon":" : ","\\sum":" sum ","\\prod":" product ","\\bigcap":" inter.big ","\\bigcup":" union.big ","\\int":" integral ","\\iint":" integral.double ","\\iiint":" integral.triple ","\\intop":" integral ","\\oint":" integral.cont ","\\oiint":" integral.surf ","\\oiiint":" integral.vol ","\\setminus":" without ","\\vdots":" without ","\\ddots":" dots.down ","\\ge":">=","\\le":"<=","\\ne":"!=","\\neq":"!=","\\lt":"<","\\gt":">","\\gets":"<-","\\to":"->","\\land":" and ","\\lor":" or ","\\lnot":" not ","\\forall":" forall ","\\exists":" exists ","\\in":" in ","\\notin":" in.not ","\\mapsto":"|->","\\implies":"==>","\\iff":"<==>","\\cdot":" dot.op ","\\ast":" * ","\\star":" star.op ","\\times":" times ","\\div":" div ","\\ltimes":" times.l ","\\rtimes":" times.r ","\\bowtie":" \u22C8 ","\\circ":" circle.stroked.small "},Ty={underarc:"underparen",underparen:"underparen",underbrace:"underbrace",underline:"underline",overarc:"overparen",overparen:"overparen",overbrace:"overbrace",overline:"overline",cancel:"cancel",displaystyle:"display",textstyle:"inline"},Dy={longrightarrow:t=>`arrow.r.long^(${ae(t.above)})`,longleftarrow:t=>`arrow.l.long^(${ae(t.above)})`};function Oy(t){let e="";for(let r of t){let i=e[e.length-1];i!==void 0&&(/\d$/.test(i)&&/^\d/.test(r)||/[a-zA-Z]$/.test(i)&&/^[a-zA-Z]/.test(r))&&(e+=" "),e+=r}return e}function ae(t){var o,a,s,l,c,u,d,m,p,f,y,v,b,k,S,A,E,C,_,O,I,V,K;if(!t)return"";if(ee(t)){if(t.length===0)return"";if(t[0].mode==="latex")return t.map(D=>ae(D)).join("");if(t[0].mode==="text"){let D=0,W="";for(;((o=t[D])==null?void 0:o.mode)==="text";)W+=t[D].body?ae(t[D].body):t[D].value,D++;return` "${W}" ${ae(t.slice(D))}`}let N=0,j=[];for(;((a=t[N])==null?void 0:a.mode)==="math";){let D="";for(;((s=t[N])==null?void 0:s.type)==="mord"&&/\d/.test(t[N].value);)D+=t[N++].value;D?j.push(D):j.push(ae(t[N++]))}return j.push(ae(t.slice(N))),Oy(j)}if(t.mode==="text")return`"${t.value}"`;let e="",{command:r}=t,i;if(r==="\\placeholder")return`"${ae(t.body)}"`;let n=x.serialize([t],{expandMacro:!0,defaultMode:"math"});switch(t.type){case"accent":let N={"\\vec":"arrow","\\dot":"dot","\\ddot":"dot.double","\\bar":"overline","\\hat":"hat","\\acute":"acute","\\grave":"grave","\\tilde":"tilde","\\breve":"breve","\\check":"caron"}[r];e=`${N!=null?N:""}(${ae(t.body)}) `;break;case"first":return"";case"latexgroup":return t.body.map(D=>D.value).join("");case"group":case"root":e=(l=Ve[r])!=null?l:ae(t.body);break;case"genfrac":{let D=t;D.hasBarLine?(e+="(",e+=ae(D.above),e+=")/(",e+=ae(D.below),e+=")"):e+=`binom(${ae(D.above)}, ${ae(D.below)})`}break;case"surd":t.hasEmptyBranch("above")?e+=`sqrt(${ae(t.body)})`:e+=`root(${ae(t.above)}, ${ae(t.body)})`;break;case"latex":e=t.value;break;case"leftright":{let D=t,W=D.leftDelim;W&&Ve[W]&&(W=Ve[W]);let ie=D.matchingRightDelim();ie&&Ve[ie]&&(ie=Ve[ie]),W&&(W=(c=$p[W])!=null?c:W),ie&&(ie=(u=$p[ie])!=null?u:ie),W&&ie?e=`lr(${(d=Vp[W])!=null?d:W}${ae(D.body)}${(m=Vp[ie])!=null?m:ie})`:e=`lr(${W}${ae(D.body)}${ie})`}break;case"sizeddelim":case"delim":e=t.value;break;case"overlap":break;case"mord":if(Ve[n])return Ve[n];e=(y=(f=(p=Ve[r])!=null?p:r)!=null?f:r)!=null?y:typeof t.value=="string"?t.value:"",e.startsWith("\\")&&(e+=" "),i=r?r.match(/{?\\char"([\dabcdefABCDEF]+)}?/):null,i?e=String.fromCodePoint(Number.parseInt("0x"+i[1])):e.length>0&&e.startsWith("\\")&&(e=typeof t.value=="string"?t.value.charAt(0):t.command),e=By(e,t.style),e=` ${e} `;break;case"mbin":case"mrel":case"minner":e=(k=(b=(v=Ve[n])!=null?v:Ve[r])!=null?b:Io[r])!=null?k:t.value;break;case"mopen":case"mclose":e=(S=Ve[n])!=null?S:t.value;break;case"mpunct":e=(A=Io[r])!=null?A:r;break;case"mop":case"operator":case"extensible-symbol":t.value!=="\u200B"&&(Io[r]?e=Io[r]:e=r==="\\operatorname"?ae(t.body):(E=t.value)!=null?E:r,e+=" ");break;case"array":let j=t.environmentName;if(t.isMultiline)e=t.rows.map(W=>W.map(ie=>ae(ie)).join("")).join(` +`);else{let D=t.rows,W=D.map(X=>X.map(ae).join(", ")),ie={pmatrix:'"("',bmatrix:'"["',"bmatrix*":'"["',Bmatrix:'"{"',vmatrix:'"|"',matrix:"#none"}[j];ie?e=`mat(delim: ${ie}, ${W.join(" ; ")})`:j==="cases"||j==="rcases"?e=`cases(reverse: #${j==="rcases"}, ${W.join(", ")})`:j==="aligned"?e=D.map(X=>X.map(ae).join(" & ")).join(" \\ "):e=D.map(X=>X.map(ae).join("")).join("")}break;case"box":break;case"spacing":e=(_=(C=Ve[n])!=null?C:Ve[r])!=null?_:" ";break;case"space":e=" ";break;case"subsup":e=(O=t.leftSibling)!=null&&O.value?"":'""';break;case"macro":e=(K=(V=(I=Ve[n])!=null?I:Ve[r])!=null?V:Io[r])!=null?K:ae(t.body);break;case"overunder":break}if(!e){let N=Ty[t.command.slice(1)];N&&(e=`${N}(${ae(t.body)})`)}if(!e){let N=Dy[t.command.slice(1)];N&&(e=N(t))}if(!t.hasEmptyBranch("subscript")){e+="_";let N=ae(t.subscript);e+=N.length!==1?`(${N})`:N}if(!t.hasEmptyBranch("superscript")){e+="^";let N=ae(t.superscript);e+=N.length!==1?`(${N})`:N}return e}function By(t,e){if(!e)return t;let r=t;return e.variant==="double-struck"&&(r=`bb(${r})`),e.variant==="script"&&(r=`cal(${r})`),e.variant==="fraktur"&&(r=`frak(${r})`),e.variant==="sans-serif"&&(r=`sans(${r})`),e.variant==="monospace"&&(r=`mono(${r})`),e.variantStyle==="bold"&&(r=`bold(${r})`),r}var Us=class{constructor(e,r,i){this.mathfield=e,this.mode=r,this.silenceNotifications=!1,this._selection={ranges:[[0,0]],direction:"none"},this._anchor=0,this._position=0,this.root=i}dispose(){this.mathfield=void 0}getState(){let e={ranges:[...this._selection.ranges]};return this.selection.direction&&this.selection.direction!=="none"&&(e.direction=this.selection.direction),{content:this.root.toJson(),selection:e,mode:this.mode}}setState(e,r){var o;let i=this.silenceNotifications;this.silenceNotifications=(o=r==null?void 0:r.silenceNotifications)!=null?o:!0;let n={};if((r==null?void 0:r.type)==="undo"&&(n={inputType:"historyUndo"}),(r==null?void 0:r.type)==="redo"&&(n={inputType:"historyRedo"}),this.contentWillChange(n)){let a=this.silenceNotifications;this.silenceNotifications=!0,this.mode=e.mode,this.root=xt(e.content),this.selection=e.selection,this.silenceNotifications=a,this.contentDidChange(n),this.selectionDidChange()}this.silenceNotifications=i}get atoms(){return this.root.children}get selection(){return this._selection}set selection(e){this.setSelection(e)}setSelection(e,r){return!this.mathfield.contentEditable&&this.mathfield.userSelect==="none"?!1:this.deferNotifications({selection:!0,content:!0},()=>{var c,u,d,m;let i=this.normalizeSelection(e,r);if(i===void 0)throw new TypeError("Invalid selection");if(i.ranges.length===1&&i.ranges[0][0]===i.ranges[0][1]){let p=i.ranges[0][0];if(!this.mathfield.dirty&&!((c=this.at(p))!=null&&c.parentPrompt)&&this.mathfield.hasEditablePrompts){if((u=this.at(p-1))!=null&&u.parentPrompt){this._anchor=this.normalizeOffset(p-1),this._position=this._anchor,this._selection=this.normalizeSelection(this._anchor);return}if((d=this.at(p+1))!=null&&d.parentPrompt){this._anchor=this.normalizeOffset(p+1),this._position=this._anchor,this._selection=this.normalizeSelection(this._anchor);return}this._anchor=0,this._position=0,this._selection={ranges:[[0,0]]};return}this._anchor=p,this._position=p,this._selection=i;return}let n=de(i);n=Ky(this,n),i.direction==="backward"?[this._position,this._anchor]=n:[this._anchor,this._position]=n;let o=n[0]+1;for(;o<=this.lastOffset&&((m=this.at(o))==null?void 0:m.type)==="first"&&o=0&&this._position<=this.lastOffset})}setPositionHandlingPlaceholder(e){var i;let r=this.at(e);(r==null?void 0:r.type)==="placeholder"?this.setSelection(e-1,e):((i=r==null?void 0:r.rightSibling)==null?void 0:i.type)==="placeholder"?this.setSelection(e,e+1):this.position=e,r instanceof he&&r.isSuggestion&&(r.isSuggestion=!1),this.mathfield.stopCoalescingUndo()}get position(){return this._position}set position(e){this.setSelection(e,e)}get anchor(){return this._anchor}get selectionIsCollapsed(){return this._anchor===this._position}get selectionIsPlaceholder(){return Math.abs(this._anchor-this._position)===1?this.at(Math.max(this._anchor,this._position)).type==="placeholder":!1}collapseSelection(e="forward"){return this._anchor===this._position?!1:(e==="backward"?this.position=Math.min(this._anchor,this._position):this.position=Math.max(this._anchor,this._position),!0)}get lastOffset(){return this.atoms.length-1}at(e){return this.atoms[e]}offsetOf(e){return this.atoms.indexOf(e)}getSiblingsRange(e){let r=this.at(e),{parent:i}=r;if(!i)return[0,this.lastOffset];let n=r.parent.branch(r.parentBranch);return[this.offsetOf(n[0]),this.offsetOf(n[n.length-1])]}getBranchRange(e,r){let i=this.at(e).branch(r);return[this.offsetOf(i[0]),this.offsetOf(i[i.length-1])]}getCellRange(e){var n,o;let r=this.getParentCell(e),i=this.at(e);if(i){for(;i&&((n=i.parent)==null?void 0:n.type)!=="array";)i=i.parent;if(((o=i==null?void 0:i.parent)==null?void 0:o.type)==="array")return[this.offsetOf(i.firstSibling),this.offsetOf(i.lastSibling)]}}getAtoms(e,r,i){let n=i!=null?i:{};if(Qi(e)){if(n=r!=null?r:{},e.ranges.length>1)return e.ranges.reduce((m,p)=>[...m,...this.getAtoms(p,n)],[]);e=e.ranges[0]}let o,a;if(zt(e)){if(o=e,!zt(r))return[];a=r}else[o,a]=e,Object.keys(n).length===0&&(n=r!=null?r:{});if(!Number.isFinite(o))return[];n.includeChildren===void 0&&(n.includeChildren=!1),o<0&&(o=this.lastOffset-o+1),a<0&&(a=this.lastOffset+a+1);let s=Math.min(o,a),l=Math.max(o,a),c=s===0?0:s+1,u=l;if(!n.includeChildren&&s===0&&l===this.lastOffset)return[this.root];let d=[];for(let m=c;m<=u;m++){let p=this.atoms[m];qp(this,p,c,u,n.includeFirstAtoms)&&d.push(p)}return n.includeChildren||(d=d.filter(m=>{let p=!1,{parent:f}=m;for(;f&&!p;)p=qp(this,f,c,u,n.includeFirstAtoms),f=f.parent;return!p})),d}findAtom(e,r=0,i="forward"){let n,o=this.lastOffset;if(i==="forward"){for(let a=r;a<=o;a++)if(n=this.atoms[a],e(n))return n;for(let a=0;a=0;a--)if(n=this.atoms[a],e(n))return n;for(let a=o;a>r;a--)if(n=this.atoms[a],e(n))return n}extractAtoms(e){var i;let r=this.getAtoms(e);r.length===1&&!r[0].parent&&r[0].isRoot&&(r[0]instanceof z?r=r[0].rows.flatMap(n=>n.flatMap(o=>o)):r=[...(i=r[0].body)!=null?i:r[0].children],r=r.filter(n=>n.type!=="first"));for(let n of r)n.parent.removeChild(n);return r}deleteAtoms(e){if(e!=null||(e=[0,-1]),this.extractAtoms(e),e[0]===0&&e[1]===-1&&this.root instanceof z)for(;this.root.rowCount>1;)this.root.removeRow(1);this.position=e[0]}atomToString(e,r){let i=r!=null?r:"latex";if(i.startsWith("latex"))return x.serialize([e],{expandMacro:i==="latex-expanded",skipStyles:i==="latex-unstyled",skipPlaceholders:i==="latex-without-placeholders",defaultMode:this.mathfield.options.defaultMode});if(i==="math-ml")return G(e);if(i==="spoken")return wt(e);if(i==="spoken-text"){let n=globalThis.MathfieldElement.textToSpeechMarkup;globalThis.MathfieldElement.textToSpeechMarkup="";let o=wt(e);return globalThis.MathfieldElement.textToSpeechMarkup=n,o}if(i==="spoken-ssml"||i==="spoken-ssml-with-highlighting"){let n=globalThis.MathfieldElement.textToSpeechMarkup;globalThis.MathfieldElement.textToSpeechMarkup="ssml";let o=wt(e);return globalThis.MathfieldElement.textToSpeechMarkup=n,o}return i==="typst"?ae(e):i==="plain-text"?le(e,{plain:!0}):i==="ascii-math"?le(e):(console.error(`MathLive 0.111.1: Unexpected format "${i}`),"")}getValue(e,r,i){if(e===void 0)return this.atomToString(this.root,"latex");if(typeof e=="string")return this.atomToString(this.root,e);let n,o;if(zt(e)&&zt(r)?(n=[this.normalizeRange([e,r])],o=i):di(e)?(n=[this.normalizeRange(e)],o=r):Qi(e)?(n=e.ranges,o=r):(n=[this.normalizeRange([0,-1])],o="latex"),o!=null||(o="latex"),o.startsWith("latex")){let a={expandMacro:o==="latex-expanded",skipStyles:o==="latex-unstyled",skipPlaceholders:o==="latex-without-placeholders",defaultMode:this.mathfield.options.defaultMode};return R(n.map(s=>x.serialize(this.getAtoms(s),a)))}return n.map(a=>this.getAtoms(a).map(s=>this.atomToString(s,o)).join("")).join("")}extendSelectionTo(e,r){return!this.mathfield.contentEditable&&this.mathfield.userSelect==="none"?!1:this.deferNotifications({selection:!0},()=>{let i=this.normalizeRange([e,r]),[n,o]=i,a=new Set(["genfrac","subsup","accent","box","overlap","overunder"]),{parent:s}=this.at(o);if(s!=null&&s.type&&a.has(s.type))for(;s!=null&&s.type&&a.has(s.type)&&Ws(this,s,[n,o]);)o=this.offsetOf(s),s=s.parent;for(s=this.at(n).parent;s!=null&&s.type&&a.has(s.type)&&Ws(this,s,[n,o]);)n=this.offsetOf(s.leftSibling),s=s.parent;if(s=this.at(o).parent,s!=null&&s.type&&a.has(s.type))for(;s!=null&&s.type&&a.has(s.type)&&Ws(this,s,[n,o]);)o=this.offsetOf(s),o>=0,s=s.parent;this._position=this.normalizeOffset(r),this._selection={ranges:[[n,o]],direction:"none"}})}announce(e,r,i=[]){var o,a;((a=(o=this.mathfield.host)==null?void 0:o.dispatchEvent(new CustomEvent("announce",{detail:{command:e,previousPosition:r,atoms:i},cancelable:!0,bubbles:!0,composed:!0})))==null||a)&&rp(this.mathfield,e,r,i)}deferNotifications(e,r){let i=this._selection,n=this._anchor,o=this._position,a=this.silenceNotifications;this.silenceNotifications=!0;let s=this.root.changeCounter;r(),this.silenceNotifications=a;let l=n!==this._anchor||o!==this._position||j0(this._selection,i)==="different";e.selection&&l&&this.selectionDidChange();let c=this.root.changeCounter!==s;return e.content&&c&&this.contentDidChange({inputType:e.type}),c||l}normalizeOffset(e){return e>0?e=Math.min(e,this.lastOffset):e<0&&(e=this.lastOffset+e+1),e}normalizeRange(e){let[r,i]=e;return r=this.normalizeOffset(r),i=this.normalizeOffset(i),rthis.normalizeRange(o)),direction:(n=e.direction)!=null?n:"none"});return i}get parentEnvironment(){let e=this.at(this.position).parent;if(e){for(;e.parent&&e.type!=="array";)e=e.parent;if(e.type==="array")return e}}get parentCell(){return this.getParentCell(this.position)}getParentCell(e){var i,n;let r=this.at(e);if(r){for(;r&&((i=r.parent)==null?void 0:i.type)!=="array";)r=r.parent;if(((n=r==null?void 0:r.parent)==null?void 0:n.type)==="array")return r.parentBranch}}contentWillChange(e={}){if(this.silenceNotifications||!this.mathfield)return!0;let r=this.silenceNotifications;this.silenceNotifications=!0;let i=this.mathfield.onContentWillChange(e);return this.silenceNotifications=r,i}contentDidChange(e){var i;if(window.mathVirtualKeyboard.visible&&window.mathVirtualKeyboard.update(Xt(this.mathfield)),this.silenceNotifications||!((i=this.mathfield)!=null&&i.host))return;let r=this.silenceNotifications;this.silenceNotifications=!0,setTimeout(()=>{var n;!this.mathfield||!Ye(this.mathfield)||!this.mathfield.host||this.mathfield.host.dispatchEvent(new InputEvent("input",g(h({},e),{data:e.data?e.data:(n=e.inputType)!=null?n:"",bubbles:!0,composed:!0})))},0),this.silenceNotifications=r}selectionDidChange(){if(!this.mathfield)return;let e=this.silenceNotifications;e||(this.silenceNotifications=!0,this.mathfield.onSelectionDidChange()),this.silenceNotifications=e}};function qp(t,e,r,i,n){let o=t.offsetOf(e);if(oi)return!1;if(!e.hasChildren)return!0;let a=n?e.firstChild:Hp(e);if(!a)return!0;let s=n?e.lastChild:Wp(e);if(!s)return!0;let l=t.offsetOf(a);if(l>=r&&l<=i){let c=t.offsetOf(s);if(c>=r&&c<=i)return!0}return!1}function Ws(t,e,r){if(!(e!=null&&e.hasChildren))return!1;let[i,n]=r,o=Hp(e);if(!o)return!1;let a=Wp(e);if(!a)return!1;let s=t.offsetOf(o),l=t.offsetOf(a);return s>=i&&s<=n&&l>=s&&l<=n}function Ky(t,e){let[r,i]=e,n=i+1;if(n>t.lastOffset)return e;let o=t.at(n);return Py(t,o,r,i)&&(i=t.offsetOf(o)),[r,i]}function Py(t,e,r,i){if((e==null?void 0:e.type)!=="subsup"||!Ws(t,e,[r,i]))return!1;let n=e.leftSibling;if(!n)return!1;let o=t.offsetOf(n);return o>r&&o<=i}function Hp(t){for(let e of t.children)if(e.type!=="first")return e}function Wp(t){let{children:e}=t;for(let r=e.length-1;r>=0;r--)if(e[r].type!=="first")return e[r]}fe({deleteAll:t=>t.contentWillChange({inputType:"deleteContent"})&&ct(t,[0,-1],"deleteContent"),deleteForward:t=>sp(t),deleteBackward:t=>ap(t),deleteNextWord:t=>t.contentWillChange({inputType:"deleteWordForward"})&&St(t,"forward",{delete:!0}),deletePreviousWord:t=>t.contentWillChange({inputType:"deleteWordBackward"})&&St(t,"backward",{delete:!0}),deleteToGroupStart:t=>{if(!t.contentWillChange({inputType:"deleteSoftLineBackward"}))return!1;let e=t.offsetOf(t.at(t.position).firstSibling);return e===t.position?(t.announce("plonk"),!1):(t.deferNotifications({content:!0,selection:!0,type:"deleteSoftLineBackward"},()=>t.deleteAtoms([t.anchor,e])),t.position=e,!0)},deleteToGroupEnd:t=>{if(!t.contentWillChange({inputType:"deleteSoftLineForward"}))return!1;let e=t.offsetOf(t.at(t.position).lastSibling);return e===t.position?(t.announce("plonk"),!1):(t.deferNotifications({content:!0,selection:!0,type:"deleteSoftLineForward"},()=>t.deleteAtoms([t.anchor,e])),!0)},deleteToMathFieldStart:t=>t.contentWillChange({inputType:"deleteHardLineBackward"})&&ct(t,[t.anchor,0],"deleteHardLineBackward"),deleteToMathFieldEnd:t=>t.contentWillChange({inputType:"deleteHardLineForward"})&&ct(t,[t.anchor,-1],"deleteHardLineForward")},{target:"model",audioFeedback:"delete",canUndo:!0,changeContent:!0,changeSelection:!0});var Ry=``,Iy=``,Gs=class t{constructor(e,r){this.focusBlurInProgress=!1;this.programmaticFocusInProgress=!1;this.connectedToVirtualKeyboard=!1;var m,p,f;this.options=h(g(h({},Sn()),{macros:Ri(),registers:Xa()}),wn(r)),this.eventController=new AbortController;let i=this.eventController.signal;r.eventSink&&(this.host=r.eventSink),this.element=e,e.mathfield=this,this.blurred=!0,this.keystrokeCaptionVisible=!1,this.suggestionIndex=0,this.inlineShortcutBuffer=[],this.inlineShortcutBufferFlushTimer=0,this.scientificNotationTimer=0,this.defaultStyle={},this.styleBias="left",this.options.defaultMode==="inline-math"?this.element.classList.add("ML__is-inline"):this.element.classList.remove("ML__is-inline"),this.dirty=!1;let n=(p=(m=r.value)!=null?m:this.element.textContent)!=null?p:"";n=n.trim();let o=Tc(this.options),a=be(n,{context:this.context}),s;a.length===1&&a[0].isRoot?s=a[0]:s=new x({type:"root",mode:o,body:a}),this.model=new Us(this,o,s),this.undoManager=new Cs(this.model);let l=[];if(l.push(""),l.push('"),l.push(""),l.push(""),l.push(""),this.element.innerHTML=globalThis.MathfieldElement.createHTML(l.join("")),!this.element.children){console.error("%cMathLive 0.111.1: Something went wrong and the mathfield could not be created.%c\nIf you are using Vue, this may be because you are using the runtime-only build of Vue. Make sure to include `runtimeCompiler: true` in your Vue configuration. There may a warning from Vue in the log above.","color:red;font-family:system-ui;font-size:1.2rem;font-weight:bold","color:inherit;font-family:system-ui;font-size:inherit;font-weight:inherit");return}this._l10Subscription=F.subscribe(()=>F.update(this.element)),F.update(this.element),this.container=this.element.querySelector("[part=container]"),this.field=this.container.querySelector("[part=content]"),this.field.addEventListener("click",y=>y.stopImmediatePropagation(),{capture:!1,signal:i}),this.field.addEventListener("wheel",this,{passive:!1,signal:i});let c=this.element;if("PointerEvent"in window?c.addEventListener("pointerdown",this,{signal:i}):c.addEventListener("mousedown",this,{signal:i}),this.host){let y=v=>{v.target===this.host&&this.handleEvent(v)};"PointerEvent"in window?this.host.addEventListener("pointerdown",y,{signal:i}):this.host.addEventListener("mousedown",y,{signal:i})}let u=this.element.querySelector("[part=virtual-keyboard-toggle]");u==null||u.addEventListener("pointerdown",y=>{y.currentTarget===u&&(window.mathVirtualKeyboard.visible?window.mathVirtualKeyboard.hide():(window.mathVirtualKeyboard.show({animate:!0}),window.mathVirtualKeyboard.update(Xt(this)),setTimeout(()=>this.scrollIntoView(),300)),y.preventDefault(),y.stopPropagation(),this.hasFocus()||this.focus({preventScroll:!0}))},{signal:i}),this.field.addEventListener("contextmenu",this,{signal:i});let d=this.element.querySelector("[part=menu-toggle]");d==null||d.addEventListener("pointerdown",y=>{if(y.currentTarget!==d)return;let v=this.menu;if(v.state!=="closed")return;this.element.classList.add("tracking");let b=d.getBoundingClientRect();v.modifiers=Wt(y),v.show({target:d,location:{x:b.left,y:b.bottom},onDismiss:()=>this.element.classList.remove("tracking")}),y.preventDefault(),y.stopPropagation()},{signal:i}),(this.disabled||this.readOnly&&!this.hasEditableContent||this.userSelect==="none")&&(d.style.display="none"),this.ariaLiveText=(f=this.element.querySelector("[role=status]"))!=null?f:void 0,this.keyboardDelegate=Oh(this.element.querySelector(".ML__keyboard-sink"),this.element,this),this.updateAccessibleName(),this.updateAccessibleReadOnly(),window.addEventListener("resize",this,{signal:i}),document.addEventListener("scroll",this,{signal:i}),this.resizeObserver=new ResizeObserver(y=>{if(this.resizeObserverStarted){this.resizeObserverStarted=!1;return}this.updateToggleLayout(),Y(this)}),this.resizeObserverStarted=!0,this.resizeObserver.observe(this.field),this.resizeObserver.observe(this.container),setTimeout(()=>this.updateToggleLayout(),100),window.mathVirtualKeyboard.addEventListener("virtual-keyboard-toggle",this,{signal:i}),Yt&&!F.locale.startsWith(Yt.locale)&&jo(F.locale),Ne!=="ready"&&document.fonts.ready.then(()=>uo(this)),e.querySelector("[part=container]").style.removeProperty("visibility"),this.undoManager.startRecording(),this.undoManager.snapshot("set-value"),Y(this)}connectToVirtualKeyboard(){this.connectedToVirtualKeyboard||(this.connectedToVirtualKeyboard=!0,window.addEventListener("message",this,{signal:this.eventController.signal}),window.mathVirtualKeyboard.connect(),window.mathVirtualKeyboard.visible&&window.mathVirtualKeyboard.update(Xt(this)),Eo(this))}disconnectFromVirtualKeyboard(){this.connectedToVirtualKeyboard&&(window.removeEventListener("message",this),window.mathVirtualKeyboard.disconnect(),this.connectedToVirtualKeyboard=!1,Ns())}showMenu(e){var o,a;let r=(a=(o=e==null?void 0:e.location)!=null?o:tn(this.field))!=null?a:void 0,i=e==null?void 0:e.modifiers,n=this.element.querySelector("[part=container]");return this._menu.show({target:n,location:r,modifiers:i})}get colorMap(){return e=>{var r,i,n;return(n=(i=(r=this.options).colorMap)==null?void 0:i.call(r,e))!=null?n:Yr(e)}}get backgroundColorMap(){return e=>{var r,i,n,o,a,s;return(s=(a=(i=(r=this.options).backgroundColorMap)==null?void 0:i.call(r,e))!=null?a:(o=(n=this.options).colorMap)==null?void 0:o.call(n,e))!=null?s:Bi(e)}}get smartFence(){var e;return(e=this.options.smartFence)!=null?e:!1}get readOnly(){var e;return(e=this.options.readOnly)!=null?e:!1}updateAccessibleName(){var e;(e=this.keyboardDelegate)==null||e.setAriaLabel(Rc(this.host))}updateAccessibleReadOnly(){var e;(e=this.keyboardDelegate)==null||e.setAriaReadOnly(this.readOnly&&!this.hasEditablePrompts)}get disabled(){var e,r;return(r=(e=this.host)==null?void 0:e.disabled)!=null?r:!1}get contentEditable(){return this.host?this.host.getAttribute("contenteditable")!=="false":!1}get userSelect(){if(!this.host)return"";let e=getComputedStyle(this.host);return e.getPropertyValue("user-select")||e.getPropertyValue("-webkit-user-select")}get hasEditableContent(){return this.disabled||!this.contentEditable?!1:!this.readOnly||this.hasEditablePrompts}get hasEditablePrompts(){return this.readOnly&&!this.disabled&&this.contentEditable&&this.model.findAtom(e=>e.type==="prompt"&&!e.locked)!==void 0}get isSelectionEditable(){if(this.disabled||!this.contentEditable)return!1;if(!this.readOnly)return!0;let e=this.model.at(this.model.anchor),r=this.model.at(this.model.position),i=x.commonAncestor(e,r);return!!((i==null?void 0:i.type)==="prompt"||i!=null&&i.parentPrompt)}get letterShapeStyle(){var e;return(e=this.options.letterShapeStyle)!=null?e:"tex"}get minFontScale(){return this.options.minFontScale}get maxMatrixCols(){return this.options.maxMatrixCols}queryStyle(e){let r=fs(this,e);"verbatimColor"in r&&delete r.verbatimColor,"verbatimBackgroundColor"in r&&delete r.verbatimBackgroundColor;let i=Object.keys(r).length;if(i===0)return"all";if(i>1){for(let c of Object.keys(r)){let u=this.queryStyle({[c]:r[c]});if(u==="none")return"none";if(u==="some")return"some"}return"all"}let n=Object.keys(r)[0],o=r[n];if(this.model.selectionIsCollapsed)return Gt(this)[n]===o?"all":"none";let a=this.model.getAtoms(this.model.selection,{includeChildren:!0}),s=a.length;if(s===0)return"none";let l=0;for(let c of a){if(c.type==="first"){s-=1;continue}c.style[n]===o&&(l+=1)}return l===0?"none":l===s?"all":"some"}get keybindings(){var i,n;if(this._keybindings)return this._keybindings;let[e,r]=Rh(this.options.keybindings,(i=yr())!=null?i:Du());return((n=yr())==null?void 0:n.score)>0&&(this._keybindings=e,r.length>0&&console.error("MathLive 0.111.1: Invalid keybindings for current keyboard layout",r)),e}get menu(){var e;return(e=this._menu)!=null||(this._menu=new Do(Fp(this),{host:this.host})),this._menu}set menuItems(e){this._menu?this._menu.menuItems=e:this._menu=new Do(e,{host:this.host})}setOptions(e){var n;this.options=h(h({},this.options),wn(e)),this._keybindings=void 0,this.options.defaultMode==="inline-math"?this.element.classList.add("ML__is-inline"):this.element.classList.remove("ML__is-inline");let r=this.options.defaultMode;r==="inline-math"&&(r="math"),((n=this.model.root.firstChild)==null?void 0:n.mode)!==r&&(this.model.root.firstChild.mode=r),this.options.readOnly&&this.hasFocus()&&window.mathVirtualKeyboard.visible&&this.executeCommand("hideVirtualKeyboard"),"readOnly"in e&&this.updateAccessibleReadOnly();let i=x.serialize([this.model.root],{expandMacro:!1,defaultMode:this.options.defaultMode});("macros"in e||this.model.getValue()!==i)&&kc(this),("value"in e||"registers"in e||"colorMap"in e||"backgroundColorMap"in e||"letterShapeStyle"in e||"minFontScale"in e||"maxMatrixCols"in e||"readOnly"in e||"contentPlaceholder"in e||"placeholderSymbol"in e)&&Y(this)}getOptions(e){return fr(this.options,e)}getOption(e){return fr(this.options,e)}async handleEvent(e){var r,i,n;if(Ye(this)){if(fo(e)){if(!rn(e.origin,(r=this.options.originValidator)!=null?r:"none"))throw new DOMException(`Message from unknown origin (${e.origin}) cannot be handled`,"SecurityError");let{action:o}=e.data;if(o==="execute-command"){let a=_i(e.data.command);if(!a||pr(a)==="virtual-keyboard")return;this.executeCommand(a)}else o==="update-state"||(o==="focus"?this.focus({preventScroll:!0}):o==="blur"&&this.blur());return}switch(e.type){case"focus":this.programmaticFocusInProgress||this.onFocus({suppressEvents:!0});break;case"blur":this.onBlur({dispatchEvents:!1});break;case"mousedown":this.userSelect!=="none"&&!((i=e.target)!=null&&i.closest("[part=virtual-keyboard-toggle],[part=menu-toggle]"))&&Uc(this,e);break;case"pointerdown":!e.defaultPrevented&&this.userSelect!=="none"&&!((n=e.target)!=null&&n.closest("[part=virtual-keyboard-toggle],[part=menu-toggle]"))&&(Uc(this,e),e.shiftKey===!1&&await Qc(e,this.container,this.menu)&&Li.stop());break;case"contextmenu":this.userSelect!=="none"&&e.shiftKey===!1&&await Qc(e,this.container,this.menu)&&Li.stop();break;case"virtual-keyboard-toggle":this.hasFocus()&&Eo(this),this.hasFocus()&&this.options.mathVirtualKeyboardPolicy!=="manual"&&(this.focusBlurInProgress=!0,this.keyboardDelegate.blur(),this.keyboardDelegate.focus(),this.focusBlurInProgress=!1);break;case"resize":this.geometryChangeTimer&&cancelAnimationFrame(this.geometryChangeTimer),this.geometryChangeTimer=requestAnimationFrame(()=>Ye(this)&&this.onGeometryChange());break;case"scroll":this.geometryChangeTimer&&cancelAnimationFrame(this.geometryChangeTimer),this.geometryChangeTimer=requestAnimationFrame(()=>Ye(this)&&this.onGeometryChange());break;case"wheel":this.onWheel(e);break;case"message":break;default:console.warn("Unexpected event type",e.type)}}}updateToggleLayout(){if(!this.element||!this.host)return;let e=this.element.querySelector(".ML__toggles");if(!e)return;let r=this.host.offsetHeight,i=e.classList.contains("ML__toggles--vertical");r>=100&&!i?e.classList.add("ML__toggles--vertical"):r<100&&i&&e.classList.remove("ML__toggles--vertical")}dispose(){if(!Ye(this))return;t._globallyFocusedMathfield===this&&(t._globallyFocusedMathfield=void 0),F.unsubscribe(this._l10Subscription),this.keyboardDelegate.dispose(),this.keyboardDelegate=void 0,this.eventController.abort(),this.eventController=void 0,this.resizeObserver.disconnect(),window.mathVirtualKeyboard.removeEventListener("virtual-keyboard-toggle",this),this.disconnectFromVirtualKeyboard(),this.model.dispose();let e=this.element;delete e.mathfield,this.element=void 0,this.host=void 0,this.field=void 0,this.ariaLiveText=void 0,gp(),Fh(),Lp()}flushInlineShortcutBuffer(e){if(e!=null||(e={defer:!1}),!e.defer){this.inlineShortcutBuffer.length=0,clearTimeout(this.inlineShortcutBufferFlushTimer),this.inlineShortcutBufferFlushTimer=0;return}this.options.inlineShortcutTimeout>0&&(clearTimeout(this.inlineShortcutBufferFlushTimer),this.inlineShortcutBufferFlushTimer=setTimeout(()=>this.flushInlineShortcutBuffer(),this.options.inlineShortcutTimeout))}executeCommand(e){return pr(e)==="virtual-keyboard"?(this.focus({preventScroll:!0}),window.mathVirtualKeyboard.executeCommand(e),requestAnimationFrame(()=>window.mathVirtualKeyboard.update(Xt(this))),!1):Wh(this,e)}get errors(){return ss(this.model.getValue(),{context:this.context})}getValue(e,r,i){return this.model.getValue(e,r,i)}setValue(e,r){var n;r=r!=null?r:{mode:"math"},r.insertionMode===void 0&&(r.insertionMode="replaceAll"),(r.format===void 0||r.format==="auto")&&(r.format="latex"),(r.mode===void 0||r.mode==="auto")&&(r.mode=(n=J0(this.model,this.model.position))!=null?n:"math");let i=this.undoManager.canUndo();H.insert(this.model,e,r)&&(Y(this),i||this.undoManager.reset(),this.undoManager.snapshot("set-value"))}scrollIntoView(){var i;if(!this.element)return;if(this.host){if(this.options.onScrollIntoView)this.options.onScrollIntoView(this);else if(this.host.scrollIntoView({block:"nearest",inline:"nearest"}),window.mathVirtualKeyboard.visible&&window.mathVirtualKeyboard.container===window.document.body){let n=window.mathVirtualKeyboard.boundingRect,o=this.host.getBoundingClientRect();o.bottom>n.top&&((i=window.document.scrollingElement)==null||i.scrollBy(0,o.bottom-n.top+8))}}this.dirty&&_t(this,{interactive:!0});let e=this.field.getBoundingClientRect(),r=null;if(this.model.selectionIsCollapsed)r=tn(this.field);else{let n=Qa(this);if(n.length>0){let o=-1/0,a=1/0,s=-1/0;for(let c of n)c.right>o&&(o=c.right),c.tops&&(s=c.bottom);let l=s-a;r={x:o+e.left-this.field.scrollLeft,y:a+e.top-this.field.scrollTop,height:l}}}if(this.host&&r){let n=this.host.getBoundingClientRect(),o=20,a=r.y,s=r.y+r.height,l=this.host.scrollTop;an.bottom-o&&(l=s-n.bottom+this.host.scrollTop+o),l!==this.host.scrollTop&&this.host.scroll({top:l,behavior:"auto"})}if(r){let n=r.x-window.scrollX,o=this.field.scrollLeft;ne.right&&(o=n-e.right+this.field.scrollLeft+20),this.field.scroll({top:this.field.scrollTop,left:o})}}insert(e,r){if(typeof e!="string"||e.length===0&&((r==null?void 0:r.insertionMode)==="insertBefore"||(r==null?void 0:r.insertionMode)==="insertAfter")||e.length===0&&this.model.selectionIsCollapsed)return!1;if(this.flushInlineShortcutBuffer(),r=r!=null?r:{mode:"math"},r.focus&&this.focus(),r.feedback&&(globalThis.MathfieldElement.keypressVibration&&Di()&&navigator.vibrate(mo),globalThis.MathfieldElement.playSound("keypress")),e==="\\\\")Ic(this.model);else if(e==="&")zc(this.model);else if(this.model.selectionIsCollapsed){let i=h({},Gt(this));!/^[a-zA-Z0-9]$/.test(e)&&this.styleBias!=="none"&&(i.variant="normal",i.variantStyle=void 0),H.insert(this.model,e,h({style:i},r))}else H.insert(this.model,e,r);return this.snapshot(`insert-${this.model.at(this.model.position).type}`),Y(this),r.scrollIntoView&&this.scrollIntoView(),!0}switchMode(e,r="",i=""){if(this.model.mode===e||!this.hasEditableContent||!this.contentEditable||this.disabled)return;let{model:n}=this,o=n.mode;if(n.mode=e,this.host&&!this.host.dispatchEvent(new Event("mode-change",{bubbles:!0,composed:!0,cancelable:!0}))){n.mode=o;return}n.mode=o,n.deferNotifications({content:!!i||!!r,selection:!0,type:"insertText"},()=>{let a=n.at(n.position),s=(d,m)=>{if(!d)return;let p=n.mode==="math"?be(or(d,{format:"ascii-math"})[1],{context:this.context}):[...d].map(f=>new We(f,f,{}));if(m.select){let f=a.parent.addChildrenAfter(p,a);n.setSelection(n.offsetOf(p[0].leftSibling),n.offsetOf(f))}else n.position=n.offsetOf(a.parent.addChildrenAfter(p,a));u=!0},l=(d,m)=>{let p=new $t(d);a.parent.addChildAfter(p,a),m.select?n.setSelection(n.offsetOf(p.firstChild),n.offsetOf(p.lastChild)):n.position=n.offsetOf(p.lastChild),u=!0},c=()=>{let d=e==="latex"?"latex":e==="math"?"plain-text":"ascii-math",m=de(n.selection),p=this.model.getValue(m,d),f=this.model.extractAtoms(m);return f.length===1&&f[0].type==="placeholder"&&(p=i),a=n.at(m[0]),p},u=!1;if(this.flushInlineShortcutBuffer(),this.stopCoalescingUndo(),Qe(this,"accept"),n.selectionIsCollapsed)s(r,{select:!1}),n.mode=e,e==="latex"?l(i,{select:!1}):s(i,{select:!1});else{let d=c();n.mode=e,e==="latex"?l(d,{select:!0}):s(d,{select:!0})}return Y(this),this.undoManager.snapshot(e==="latex"?"insert-latex":"insert"),u}),n.mode=e,window.mathVirtualKeyboard.update(Xt(this))}hasFocus(){return!this.blurred}focus(e){var r;this.disabled||this.focusBlurInProgress||(this.hasFocus()||(this.programmaticFocusInProgress=!0,this.onFocus(),this.model.announce("line")),(r=e==null?void 0:e.preventScroll)!=null&&r||this.scrollIntoView())}blur(){this.disconnectFromVirtualKeyboard(),this.hasFocus()&&this.keyboardDelegate.blur()}select(){this.model.selection={ranges:[[0,this.model.lastOffset]]},this.focus()}applyStyle(e,r={}){var s;let i,n="set",o=!1;di(r)?i=r:(r.operation==="toggle"&&(n="toggle"),i=r.range,o=(s=r.silenceNotifications)!=null?s:!1),i&&(i=this.model.normalizeRange(i)),i&&i[0]===i[1]&&(i=void 0);let a=fs(this,e);if(i===void 0&&this.model.selectionIsCollapsed){if(n==="set"){let u=h({},this.defaultStyle);"color"in a&&delete u.verbatimColor,"backgroundColor"in a&&delete u.verbatimBackgroundColor,this.defaultStyle=h(h({},u),a),this.styleBias="none";return}let l=Gt(this),c=h({},this.defaultStyle);for(let u of Object.keys(a))l[u]===a[u]?(u==="color"&&delete c.verbatimColor,u==="backgroundColor"&&delete c.verbatimBackgroundColor,delete c[u]):c[u]=a[u];this.defaultStyle=c,this.styleBias="none";return}this.model.deferNotifications({content:!o,type:"insertText"},()=>{if(i===void 0)for(let l of this.model.selection.ranges)ao(this.model,l,a,{operation:n});else ao(this.model,i,a,{operation:n})}),Y(this)}toggleContextMenu(){var n;let e=this.menu;if(!e.visible)return!1;if(e.state==="open")return e.hide(),!0;let r=(n=es(this,this.model.position))==null?void 0:n.bounds;if(!r)return!1;let i={x:r.right,y:r.bottom};return e.show({target:this.element.querySelector("[part=container]"),location:i,onDismiss:()=>{var o;return(o=this.element)==null?void 0:o.focus()}}),!0}getPrompt(e){let r=this.model.findAtom(i=>i.type==="prompt"&&i.placeholderId===e);return r}getPromptValue(e,r){let i=this.getPrompt(e);if(!i)return"";let n=this.model.offsetOf(i.firstChild),o=this.model.offsetOf(i.lastChild);return this.model.getValue(n,o,r)}getPrompts(e){return this.model.atoms.filter(r=>r.type!=="prompt"?!1:e?!(e.id&&r.placeholderId!==e.id||e.locked&&r.locked!==e.locked||e.correctness==="undefined"&&r.correctness||e.correctness&&r.correctness!==e.correctness):!0).map(r=>r.placeholderId)}setPromptValue(e,r,i){if(r!==void 0){let n=this.getPrompt(e);if(!n){console.error(`MathLive 0.111.1: unknown prompt ${e}`);return}let o=this.model.getBranchRange(this.model.offsetOf(n),"body");this.model.setSelection(o),this.insert(r,g(h({},i),{insertionMode:"replaceSelection"}))}i!=null&&i.silenceNotifications&&(this.valueOnFocus=this.getValue()),Y(this)}setPromptState(e,r,i){let n=this.getPrompt(e);if(!n){console.error(`MathLive 0.111.1: unknown prompt ${e}`);return}r==="undefined"?n.correctness=void 0:typeof r=="string"&&(n.correctness=r),typeof i=="boolean"&&(n.locked=i,n.captureSelection=i),Y(this)}getPromptState(e){let r=this.getPrompt(e);return r?[r.correctness,r.locked]:(console.error(`MathLive 0.111.1: unknown prompt ${e}`),[void 0,!0])}getPromptRange(e){let r=this.getPrompt(e);return r?this.model.getBranchRange(this.model.offsetOf(r),"body"):(console.error(`MathLive 0.111.1: unknown prompt ${e}`),[0,0])}canUndo(){return this.undoManager.canUndo()}canRedo(){return this.undoManager.canRedo()}popUndoStack(){this.undoManager.pop(),window.mathVirtualKeyboard.visible&&window.mathVirtualKeyboard.update(Xt(this))}snapshot(e){var r;this.undoManager.snapshot(e)&&(window.mathVirtualKeyboard.visible&&window.mathVirtualKeyboard.update(Xt(this)),(r=this.host)==null||r.dispatchEvent(new CustomEvent("undo-state-change",{bubbles:!0,composed:!0,detail:{type:"snapshot"}})))}stopCoalescingUndo(){this.undoManager.stopCoalescing(this.model.selection)}stopRecording(){this.undoManager.stopRecording()}startRecording(){this.undoManager.startRecording()}undo(){var e;this.undoManager.undo()&&((e=this.host)==null||e.dispatchEvent(new CustomEvent("undo-state-change",{bubbles:!0,composed:!0,detail:{type:"undo"}})))}redo(){var e;this.undoManager.redo()&&((e=this.host)==null||e.dispatchEvent(new CustomEvent("undo-state-change",{bubbles:!0,composed:!0,detail:{type:"redo"}})))}resetUndo(){var e;(e=this.undoManager)==null||e.reset()}onSelectionDidChange(){var r,i;let e=this.model;if(e.mathfield.hasFocus()&&this.keyboardDelegate.setValue(e.getValue(e.selection,"latex-expanded")),e.selectionIsCollapsed){let n=lo(e),o=e.position,a=e.at(o),s=(r=a.mode)!=null?r:Tc(this.options);if(n&&(oe.offsetOf(n.lastChild))){Qe(this,"accept",{mode:s});let l=e.offsetOf(a);l>=0&&(e.position=l)}else{let l=e.at(o+1);(l==null?void 0:l.type)==="first"&&l.mode==="latex"?e.position=o+1:n&&(l==null?void 0:l.mode)!=="latex"?e.position=o-1:this.switchMode(s)}}(i=this.host)==null||i.dispatchEvent(new Event("selection-change",{bubbles:!0,composed:!0})),window.mathVirtualKeyboard.visible&&window.mathVirtualKeyboard.update(Xt(this)),Eo(this)}onContentWillChange(e){var r,i,n;return(n=(i=this.host)==null?void 0:i.dispatchEvent(new InputEvent("beforeinput",g(h({},e),{data:e.data?e.data:(r=e.inputType)!=null?r:"",cancelable:!0,bubbles:!0,composed:!0}))))!=null?n:!0}onFocus(e){if(this.disabled||this.focusBlurInProgress||!this.blurred)return;let r=t._globallyFocusedMathfield;r&&r!==this&&Ye(r)&&!r.disabled&&r.hasFocus()&&r.onBlur({dispatchEvents:!0}),this.focusBlurInProgress=!0,this.blurred=!1,this.updateAccessibleName(),this.updateAccessibleReadOnly(),t._globallyFocusedMathfield=this,this.stopCoalescingUndo(),this.valueOnFocus=this.model.getValue(),this.hasEditablePrompts&&!this.model.at(this.model.anchor).parentPrompt&&this.executeCommand("moveToNextPlaceholder"),_t(this,{interactive:!0});let i=Ut();setTimeout(()=>{var s,l,c,u,d;if(!Ye(this))return;let n=Ut(),o=((s=this.element)==null?void 0:s.contains(n))||((c=(l=this.element)==null?void 0:l.shadowRoot)==null?void 0:c.contains(n));if(t._globallyFocusedMathfield!==this||n!==i&&!o){this.focusBlurInProgress=!1,this.programmaticFocusInProgress=!1,this.onBlur({dispatchEvents:!1});return}if((u=e==null?void 0:e.suppressEvents)!=null?u:!1){let m=new AbortController,p=m.signal,f=y=>{y.preventDefault(),y.stopPropagation()};for(let y of["focus","focusin"])(d=this.host)==null||d.addEventListener(y,f,{capture:!0,signal:p});this.focusBlurInProgress=!1,this.keyboardDelegate.focus(),this.connectToVirtualKeyboard(),setTimeout(()=>m.abort(),0)}else this.focusBlurInProgress=!1,this.keyboardDelegate.focus(),this.connectToVirtualKeyboard(),setTimeout(()=>{this.programmaticFocusInProgress=!1},0)},60)}onBlur(e){var i,n,o,a;if(this.focusBlurInProgress||this.blurred)return;if(this.focusBlurInProgress=!0,this.stopCoalescingUndo(),this.blurred=!0,t._globallyFocusedMathfield===this&&(t._globallyFocusedMathfield=void 0),this.ariaLiveText&&(this.ariaLiveText.textContent=""),$r(this),this.model.getValue()!==this.valueOnFocus&&((i=this.host)==null||i.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))),this.disconnectFromVirtualKeyboard(),((n=e==null?void 0:e.dispatchEvents)==null||n)&&((o=this.host)==null||o.dispatchEvent(new Event("blur",{bubbles:!1,composed:!0})),(a=this.host)==null||a.dispatchEvent(new UIEvent("focusout",{bubbles:!0,composed:!0}))),Y(this),this.focusBlurInProgress=!1,Ns(),xn.restoreFocusWhenDocumentFocused){let s=new AbortController,l=s.signal;window.addEventListener("blur",()=>{window.addEventListener("focus",()=>{Ye(this)&&this.focus({preventScroll:!0})},{once:!0,signal:l})},{once:!0,signal:l}),document.addEventListener("focusin",()=>s.abort(),{once:!0}),document.addEventListener("click",()=>s.abort(),{once:!0})}}onInput(e){ko(this,e)}onKeystroke(e){return qc(this,e)}onCompositionStart(e){ct(this.model,de(this.model.selection),"insertText");let r=tn(this.field);r&&requestAnimationFrame(()=>{_t(this),this.keyboardDelegate.moveTo(r.x,r.y-r.height)})}onCompositionUpdate(e){ip(this.model,e),Y(this)}onCompositionEnd(e){np(this.model),ko(this,e,{simulateKeystroke:!0})}onCut(e){if(!this.isSelectionEditable){this.model.announce("plonk");return}this.model.contentWillChange({inputType:"deleteByCut"})&&(this.stopCoalescingUndo(),e.clipboardData?H.onCopy(this,e):H.copyToClipboard(this,"latex"),ct(this.model,de(this.model.selection),"deleteByCut"),this.snapshot("cut"),Y(this))}onCopy(e){e.clipboardData?H.onCopy(this,e):H.copyToClipboard(this,"latex")}onPaste(e){let r=this.isSelectionEditable;return r&&(r=H.onPaste(this.model.at(this.model.position).mode,this,e.clipboardData)),r||this.model.announce("plonk"),e.preventDefault(),e.stopPropagation(),r}onGeometryChange(){var e;(e=this._menu)==null||e.hide(),yn(this),Eo(this)}onWheel(e){let r=5*e.deltaX;if(!Number.isFinite(r)||r===0)return;let i=this.field;r<0&&i.scrollLeft===0||r>0&&i.offsetWidth+i.scrollLeft>=i.scrollWidth||(i.scrollBy({top:0,left:r}),e.preventDefault(),e.stopPropagation())}getHTMLElement(e){let r=e;for(;!r.id&&r.hasChildren;)r=e.children[0];return this.field.querySelector(`[data-atom-id="${r.id}"]`)}get context(){var e,r;return{registers:(e=this.options.registers)!=null?e:{},smartFence:this.smartFence,letterShapeStyle:this.letterShapeStyle,minFontScale:this.minFontScale,maxMatrixCols:this.maxMatrixCols,placeholderSymbol:(r=this.options.placeholderSymbol)!=null?r:"\u25A2",colorMap:i=>this.colorMap(i),backgroundColorMap:i=>this.backgroundColorMap(i),getMacro:i=>ti(i,this.options.macros),atomIdsSettings:{seed:"random",groupNumbers:!1}}}};fe({speak:(t,e,r)=>zy(t,e,r)},{target:"mathfield"});function zy(t,e,r){var c;r=r!=null?r:{withHighlighting:!1};let{model:i}=t;function n(u){let d=null;switch(u){case"all":d=i.root;break;case"selection":d=i.getAtoms(i.selection);break;case"left":{d=i.getAtoms(i.offsetOf(i.at(i.position).leftSibling),i.position);break}case"right":{d=i.getAtoms(i.position,i.offsetOf(i.at(i.position).rightSibling));break}case"group":d=i.getAtoms(i.getSiblingsRange(i.position));break;case"parent":{let{parent:m}=i.at(i.position);m!=null&&m.parent?d=m:d=i.root;break}default:d=i.root}return d}function o(u){let d="";switch(u){case"all":console.error("Internal failure: speak all failed");break;case"selection":d="no selection";break;case"left":d="at start";break;case"right":d="at end";break;case"group":console.error("Internal failure: speak group failed");break;case"parent":d="no parent";break;default:console.error('unknown speak_ param value: "'+u+'"');break}return d}let a=globalThis.MathfieldElement,s=n(e);if(s===null)return(c=a.speakHook)==null||c.call(a,o(e)),!1;(r.withHighlighting||a.speechEngine==="amazon")&&(a.textToSpeechMarkup=globalThis.sre&&a.textToSpeechRules==="sre"?"ssml_step":"ssml");let l=wt(s);return Le()&&r.withHighlighting?(At().readAloudMathfield=t,_t(t,{forHighlighting:!0}),a.readAloudHook&&a.readAloudHook(t.field,l)):a.speakHook&&a.speakHook(l),!1}function Up(t){var r,i;if(!Le())return;let e=globalThis.MathfieldElement;if(!e.speechEngine||e.speechEngine==="local"){let n=new SpeechSynthesisUtterance(t);globalThis.speechSynthesis.speak(n)}else if(e.speechEngine==="amazon")if(!("AWS"in window))console.error("MathLive 0.111.1: AWS SDK not loaded. See https://www.npmjs.com/package/aws-sdk");else{let n=new globalThis.AWS.Polly({apiVersion:"2016-06-10"}),o={OutputFormat:"mp3",VoiceId:(r=e.speechEngineVoice)!=null?r:"Joanna",Engine:["Amy","Emma","Brian","Ivy","Joanna","Kendra","Kimberly","Salli","Joey","Justin","Matthew"].includes((i=e.speechEngineVoice)!=null?i:"Joanna")?"neural":"standard",Text:t,TextType:"ssml"};n.synthesizeSpeech(o,(a,s)=>{if(a)console.trace(`MathLive 0.111.1: \`polly.synthesizeSpeech()\` error: ${a}`);else if(s!=null&&s.AudioStream){let l=new Uint8Array(s.AudioStream),c=new Blob([l.buffer],{type:"audio/mpeg"}),u=URL.createObjectURL(c);new Audio(u).play().catch(m=>console.error(m))}})}else e.speechEngine==="google"&&console.error("MathLive 0.111.1: The Google speech engine is not supported yet. Please come again.")}function Gp(t){if(t&&(t.classList.remove("ML__highlight"),t.children))for(let e of t.children)Gp(e)}function uu(t,e){var r;t&&(!e||((r=t.dataset)==null?void 0:r.atomId)===e?(t.classList.add("ML__highlight"),t.children&&t.children.length>0&&[...t.children].forEach(i=>{i instanceof HTMLElement&&uu(i)})):(t.classList.remove("ML__highlight"),t.children&&t.children.length>0&&[...t.children].forEach(i=>{i instanceof HTMLElement&&uu(i,e)})))}function jp(t,e){var n;if(!Le())return;if(globalThis.MathfieldElement.speechEngine!=="amazon"){console.error("MathLive 0.111.1: Use Amazon TTS Engine for synchronized highlighting"),typeof globalThis.MathfieldElement.speakHook=="function"&&globalThis.MathfieldElement.speakHook(e);return}if(!globalThis.AWS){console.error("MathLive 0.111.1: AWS SDK not loaded. See https://www.npmjs.com/package/aws-sdk");return}let r=new globalThis.AWS.Polly({apiVersion:"2016-06-10"}),i={OutputFormat:"json",VoiceId:(n=globalThis.MathfieldElement.speechEngineVoice)!=null?n:"Joanna",Engine:"standard",Text:e,TextType:"ssml",SpeechMarkTypes:["ssml"]};At().readAloudElement=t,r.synthesizeSpeech(i,(o,a)=>{if(o){console.trace(`MathLive 0.111.1: \`polly.synthesizeSpeech()\` error: ${o}`);return}if(!(a!=null&&a.AudioStream))return;let s=new TextDecoder("utf-8").decode(new Uint8Array(a.AudioStream));At().readAloudMarks=s.split(` +`).map(l=>l?JSON.parse(l):{}),At().readAloudTokens=[];for(let l of At().readAloudMarks)l.value&&At().readAloudTokens.push(l.value);At().readAloudCurrentMark="",i.OutputFormat="mp3",i.SpeechMarkTypes=[],r.synthesizeSpeech(i,(l,c)=>{if(l){console.trace(`MathLive 0.111.1: \`polly.synthesizeSpeech("${e}") error:${l}`);return}if(!(c!=null&&c.AudioStream))return;let u=new Uint8Array(c.AudioStream),d=new Blob([u.buffer],{type:"audio/mpeg"}),m=URL.createObjectURL(d),p=At();p.readAloudAudio?p.readAloudAudio.pause():(p.readAloudAudio=new Audio,p.readAloudAudio.addEventListener("ended",()=>{let f=p.readAloudMathfield;p.readAloudStatus="ended",document.body.dispatchEvent(new Event("read-aloud-status-change",{bubbles:!0,composed:!0})),f?(_t(f),p.readAloudElement=null,p.readAloudMathfield=null,p.readAloudTokens=[],p.readAloudMarks=[],p.readAloudCurrentMark=""):Gp(p.readAloudElement)}),p.readAloudAudio.addEventListener("timeupdate",()=>{let f="",y=p.readAloudAudio.currentTime*1e3+100;for(let v of p.readAloudMarks)v.time0){console.group("%cMathLive 0.111.1: %cInvalid Options","color:#12b; font-size: 1.1rem","color:#db1111; font-size: 1.1rem"),console.warn("Some of the options passed to `new MathfieldElement(...)` are invalid. \n See mathfield/changelog/ for details.");for(let n of i)console.warn(n);console.groupEnd()}}if(Js()&&(this._internals=this.attachInternals(),this._internals.role="group"),this.attachShadow({mode:"open",delegatesFocus:!0}),this.shadowRoot&&"adoptedStyleSheets"in this.shadowRoot){this.shadowRoot.adoptedStyleSheets=[sr("core"),sr("mathfield"),sr("mathfield-element"),sr("ui"),sr("menu")],this.shadowRoot.appendChild(document.createElement("span"));let i=document.createElement("slot");i.style.display="none",this.shadowRoot.appendChild(i)}else this.shadowRoot.innerHTML="';r&&this._setOptions(r)}static get formAssociated(){return Js()}static get optionsAttributes(){return{"default-mode":"string","letter-shape-style":"string","min-font-scale":"number","max-matrix-cols":"number","popover-policy":"string","math-mode-space":"string","read-only":"boolean","remove-extraneous-parentheses":"on/off","smart-fence":"on/off","smart-mode":"on/off","smart-superscript":"on/off","inline-shortcut-timeout":"string","script-depth":"string",placeholder:"string","virtual-keyboard-target-origin":"string","math-virtual-keyboard-policy":"string"}}static get observedAttributes(){return[...Object.keys(this.optionsAttributes),"contenteditable","disabled","readonly","read-only","aria-label","aria-labelledby","title"]}static get fontsDirectory(){return this._fontsDirectory}static set fontsDirectory(r){r!==this._fontsDirectory&&(this._fontsDirectory=r,qh())}get fontsDirectory(){throw new Error("Use MathfieldElement.fontsDirectory instead")}set fontsDirectory(r){throw new Error("Use MathfieldElement.fontsDirectory instead")}static get soundsDirectory(){return this._soundsDirectory}static set soundsDirectory(r){this._soundsDirectory=r,this.audioBuffers={}}get soundsDirectory(){throw new Error("Use MathfieldElement.soundsDirectory instead")}set soundsDirectory(r){throw new Error("Use MathfieldElement.soundsDirectory instead")}static get keypressSound(){return this._keypressSound}static set keypressSound(r){var i,n,o;this.audioBuffers={},r===null?this._keypressSound={spacebar:null,return:null,delete:null,default:null}:typeof r=="string"?this._keypressSound={spacebar:r,return:r,delete:r,default:r}:typeof r=="object"&&"default"in r&&(this._keypressSound={spacebar:(i=r.spacebar)!=null?i:r.default,return:(n=r.return)!=null?n:r.default,delete:(o=r.delete)!=null?o:r.default,default:r.default})}static get plonkSound(){return this._plonkSound}static set plonkSound(r){this.audioBuffers={},this._plonkSound=r}static get audioContext(){return this._audioContext||(this._audioContext=new AudioContext),this._audioContext}static get speechEngine(){return this._speechEngine}static set speechEngine(r){this._speechEngine=r}static get speechEngineRate(){return this._speechEngineRate}static set speechEngineRate(r){this._speechEngineRate=r}static get speechEngineVoice(){return this._speechEngineVoice}static set speechEngineVoice(r){this._speechEngineVoice=r}static get textToSpeechMarkup(){return this._textToSpeechMarkup}static set textToSpeechMarkup(r){this._textToSpeechMarkup=r}static get textToSpeechRules(){return this._textToSpeechRules}static set textToSpeechRules(r){this._textToSpeechRules=r}static get textToSpeechRulesOptions(){return this._textToSpeechRulesOptions}static set textToSpeechRulesOptions(r){this._textToSpeechRulesOptions=r}static get locale(){return F.locale}static set locale(r){r==="auto"&&(r=navigator.language.slice(0,5)),F.locale=r}get locale(){throw new Error("Use MathfieldElement.locale instead")}set locale(r){throw new Error("Use MathfieldElement.locale instead")}static get strings(){return F.strings}static set strings(r){F.merge(r)}get strings(){throw new Error("Use MathfieldElement.strings instead")}set strings(r){throw new Error("Use MathfieldElement.strings instead")}static get decimalSeparator(){return this._decimalSeparator}static set decimalSeparator(r){this._decimalSeparator=r,this._computeEngine&&console.warn("MathLive 0.111.1: setting MathfieldElement.decimalSeparator after the Compute Engine has been created has no effect on the engine. Reassign MathfieldElement.computeEngine with a freshly configured instance to apply the new separator.")}get decimalSeparator(){throw new Error("Use MathfieldElement.decimalSeparator instead")}set decimalSeparator(r){throw new Error("Use MathfieldElement.decimalSeparator instead")}static set scientificNotationTemplate(r){this._scientificNotationTemplate=r}static get scientificNotationTemplate(){return this._scientificNotationTemplate}static get fractionNavigationOrder(){return pn.fractionNavigationOrder}static set fractionNavigationOrder(r){if(r!=="numerator-denominator"&&r!=="denominator-numerator")throw new Error("Invalid value");pn.fractionNavigationOrder!==r&&(pn.fractionNavigationOrder=r,Lc())}static get computeEngine(){var r,i;if(this._computeEngine===void 0){let n=window[Symbol.for("io.cortexjs.compute-engine")],o=n==null?void 0:n.ComputeEngine;if(!o)return null;if(this._computeEngine=new o,this._computeEngine&&this.decimalSeparator===","){let[a,s]=String((r=n==null?void 0:n.version)!=null?r:"").split(".").map(l=>parseInt(l,10));(a>0||a===0&&s>=58)&&(this._computeEngine.latexOptions=g(h({},this._computeEngine.latexOptions),{decimalSeparator:"{,}"}))}}return(i=this._computeEngine)!=null?i:null}static set computeEngine(r){this._computeEngine=r}get computeEngine(){throw new Error("Use MathfieldElement.computeEngine instead")}set computeEngine(r){throw new Error("Use MathfieldElement.computeEngine instead")}static get isFunction(){return typeof this._isFunction!="function"?()=>!1:this._isFunction}static set isFunction(r){this._isFunction=r,Lc()}static async loadSound(r){delete this.audioBuffers[r];let i="";switch(r){case"keypress":i=this._keypressSound.default;break;case"return":i=this._keypressSound.return;break;case"spacebar":i=this._keypressSound.spacebar;break;case"delete":i=this._keypressSound.delete;break;case"plonk":i=this.plonkSound;break}if(typeof i!="string")return;i=i.trim();let n=this.soundsDirectory;if(!(n==null||n==="null"||i==="none"||i==="null"))try{let a=await(await fetch(await bs(`${n}/${i}`))).arrayBuffer(),s=await this.audioContext.decodeAudioData(a);this.audioBuffers[r]=s}catch(o){}}static async playSound(r){if((this.audioContext.state==="suspended"||this.audioContext.state==="interrupted")&&await this.audioContext.resume(),this.audioBuffers[r]||await this.loadSound(r),!this.audioBuffers[r])return;let i=this.audioContext.createBufferSource();i.buffer=this.audioBuffers[r];let n=this.audioContext.createGain();n.gain.value=Ny,i.connect(n).connect(this.audioContext.destination),i.start()}showMenu(r){var i,n;return(n=(i=this._mathfield)==null?void 0:i.showMenu(r))!=null?n:!1}get mathVirtualKeyboard(){throw new Error("The `mathVirtualKeyboard` property is not available on the MathfieldElement. Use `window.mathVirtualKeyboard` instead.")}onPointerDown(){window.addEventListener("pointerup",r=>{let i=this._mathfield;if(i&&r.target===this&&!i.disabled){this.dispatchEvent(new MouseEvent("click",{altKey:r.altKey,button:r.button,buttons:r.buttons,clientX:r.clientX,clientY:r.clientY,ctrlKey:r.ctrlKey,metaKey:r.metaKey,movementX:r.movementX,movementY:r.movementY,relatedTarget:r.relatedTarget,screenX:r.screenX,screenY:r.screenY,shiftKey:r.shiftKey}));let n=this.getOffsetFromPoint(r.clientX,r.clientY);n>=0&&ce.openUrl(rh(i,n)),r.pointerType==="touch"&&this.selectionIsCollapsed&&(this.position=n)}},{once:!0})}getPromptValue(r,i){var n,o;return(o=(n=this._mathfield)==null?void 0:n.getPromptValue(r,i))!=null?o:""}setPromptValue(r,i,n){var o;(o=this._mathfield)==null||o.setPromptValue(r,i,n)}getPromptRange(r){var i,n;return(n=(i=this._mathfield)==null?void 0:i.getPromptRange(r))!=null?n:null}getPrompts(r){var i,n;return(n=(i=this._mathfield)==null?void 0:i.getPrompts(r))!=null?n:[]}get hasEditableContent(){var r,i;return(i=(r=this._mathfield)==null?void 0:r.hasEditableContent)!=null?i:!1}get form(){var r;return(r=this._internals)==null?void 0:r.form}get name(){var r;return(r=this.getAttribute("name"))!=null?r:""}get type(){return this.localName}get mode(){var r,i;return(i=(r=this._mathfield)==null?void 0:r.model.mode)!=null?i:this.defaultMode==="text"?"text":"math"}set mode(r){var i;(i=this._mathfield)==null||i.switchMode(r)}get errors(){var r,i;return(i=(r=this._mathfield)==null?void 0:r.errors)!=null?i:[]}_getOptions(r){return this._mathfield?fr(this._mathfield.options,r):Q.has(this)?h({},fr(h(h({},Sn()),wn(Q.get(this).options)),r)):null}getOptions(r){return console.warn("%cMathLive 0.111.1: %cDeprecated Usage%c\n `mf.getOptions()` is deprecated. Read the property directly on the mathfield instead.\n See mathfield/changelog/ for details.","color:#12b; font-size: 1.1rem","color:#db1111; font-size: 1.1rem","color: inherit, font-size: 1rem"),this._mathfield?fr(this._mathfield.options,r):Q.has(this)?fr(h(h({},Sn()),wn(Q.get(this).options)),r):null}reflectAttributes(){let r=Sn(),i=this._getOptions();Object.keys(ce.optionsAttributes).forEach(n=>{let o=n==="placeholder"?"contentPlaceholder":gr(n);ce.optionsAttributes[n]==="on/off"?r[o]!==i[o]?this.setAttribute(n,i[o]?"on":"off"):this.removeAttribute(n):r[o]!==i[o]&&(ce.optionsAttributes[n]==="boolean"?i[o]?this.setAttribute(n,""):this.removeAttribute(n):(typeof i[o]=="string"||typeof i[o]=="number")&&this.setAttribute(n,i[o].toString()))})}getOption(r){return console.warn("%cMathLive 0.111.1: %cDeprecated Usage%c\n `mf.getOption()` is deprecated. Read the property directly on the mathfield instead.\n See mathfield/changelog/ for details.","color:#12b; font-size: 1.1rem","color:#db1111; font-size: 1.1rem","color: inherit, font-size: 1rem"),this._getOptions([r])[r]}_getOption(r){return this._getOptions([r])[r]}_setOptions(r){if(this._mathfield)this._mathfield.setOptions(r);else if(Q.has(this)){let i=h(h({},Q.get(this).options),r);Q.set(this,g(h({},Q.get(this)),{selection:{ranges:i.readOnly?[[0,0]]:[[0,-1]]},options:i}))}else Q.set(this,{value:void 0,selection:{ranges:[[0,0]]},options:r,menuItems:void 0});this.reflectAttributes()}setOptions(r){console.group("%cMathLive 0.111.1: %cDeprecated Usage","color:#12b; font-size: 1.1rem","color:#db1111; font-size: 1.1rem"),console.warn(" `mf.setOptions()` is deprecated. Set the property directly on the mathfield instead.\n See mathfield/changelog/ for details.");for(let i of Object.keys(r))Jr[i]&&console.warn(`\`mf.setOptions({${i}:...})\` -> ${Jr[i]}`);console.groupEnd(),this._setOptions(r)}executeCommand(...r){var n,o;let i;if(r.length===1?i=r[0]:i=[r[0],...r.slice(1)],i)return(o=(n=this._mathfield)==null?void 0:n.executeCommand(i))!=null?o:!1;throw new Error("Invalid selector")}getValue(r,i,n){var o,a;if(this._mathfield)return this._mathfield.model.getValue(r,i,n);if(Q.has(this)){let s,l,c;if(Qi(r)?([s,l]=r.ranges[0],c=i):di(r)?([s,l]=r,c=i):zt(r)&&zt(i)?(s=r,l=i,c=n):(s=0,l=-1,c=r),(c===void 0||c==="latex")&&s===0&&l===-1)return(a=(o=Q.get(this).value)!=null?o:this.textContent)!=null?a:""}return""}setValue(r,i){if(this._mathfield&&r!==void 0){if(this._mathfield.model.getValue()===r)return;i!=null||(i={silenceNotifications:!0,mode:"math"}),this._mathfield.setValue(r,i);return}if(Q.has(this)){let o=Q.get(this).options;Q.set(this,{value:r,selection:{ranges:[[-1,-1]],direction:"forward"},options:o,menuItems:void 0});return}let n=js(this);Q.set(this,{value:r,selection:{ranges:[[-1,-1]],direction:"forward"},options:n,menuItems:void 0})}hasFocus(){var r,i;return(i=(r=this._mathfield)==null?void 0:r.hasFocus())!=null?i:!1}focus(){var r;this.disabled||(r=this._mathfield)==null||r.focus()}blur(){var r;(r=this._mathfield)==null||r.blur()}select(){var r;(r=this._mathfield)==null||r.select()}insert(r,i){var n,o;return(o=(n=this._mathfield)==null?void 0:n.insert(r,i))!=null?o:!1}applyStyle(r,i){var n;return(n=this._mathfield)==null?void 0:n.applyStyle(r,i)}queryStyle(r){var i,n;return(n=(i=this._mathfield)==null?void 0:i.queryStyle(r))!=null?n:"none"}getOffsetFromPoint(r,i,n){return this._mathfield?Co(this._mathfield,r,i,n):-1}getElementInfo(r){return es(this._mathfield,r)}resetUndo(){var r;(r=this._mathfield)==null||r.resetUndo()}canUndo(){return this._mathfield?this._mathfield.canUndo():!1}canRedo(){return this._mathfield?this._mathfield.canRedo():!1}handleEvent(r){var n,o,a,s,l;if(Te.state!=="closed"||((o=(n=this._mathfield)==null?void 0:n.menu)==null?void 0:o.state)!=="closed"||(r.type==="pointerdown"&&this.onPointerDown(),r.type==="focus")||r.type!=="blur")return;let i=Uo();i&&((a=window==null?void 0:window.mathVirtualKeyboard)!=null&&a.visible)||((s=Te.scrim)==null?void 0:s.state)!=="closed"||i&&fu()||(l=this._mathfield)==null||l.onBlur({dispatchEvents:!1})}connectedCallback(){var l,c,u,d;let r=this.shadowRoot,i=r.host,o=window.getComputedStyle(this).userSelect!=="none";if(o)i.addEventListener("pointerdown",this,!0);else{let m=r.querySelector("span");m.style.pointerEvents="none"}i.addEventListener("focus",this,!0),i.addEventListener("blur",this,!0),this._observer=new MutationObserver(()=>{var m;this.value=(m=this.textContent)!=null?m:""}),this._observer.observe(this,{childList:!0,characterData:!0,subtree:!0}),Js()||this.hasAttribute("role")||this.setAttribute("role","group"),o&&!this.hasAttribute("contenteditable")&&this.setAttribute("contenteditable","true"),this.hasAttribute("tabindex")||this.setAttribute("tabindex","0");let a=r.querySelector("slot:not([name])");if(a)try{this._style=a.assignedElements().filter(m=>m.tagName.toLowerCase()==="style").map(m=>m.textContent).join("")}catch(m){console.error(m)}if(this._style){let m=document.createElement("style");m.textContent=this._style,r.appendChild(m)}let s="";if(this.hasAttribute("value")?s=this.getAttribute("value"):s=(l=a==null?void 0:a.assignedNodes().map(m=>m.nodeType===3?m.textContent:"").join("").trim())!=null?l:"",this._mathfield=new Gs(r.querySelector(":host > span"),g(h({},(u=(c=Q.get(this))==null?void 0:c.options)!=null?u:js(this)),{eventSink:this,value:s})),!Q.has(this)){this.upgradeProperty("disabled"),this.upgradeProperty("readonly");for(let m of Object.keys(ce.optionsAttributes))this.upgradeProperty(gr(m))}if(!((d=this._mathfield)!=null&&d.model)){this._mathfield=null;return}if(Q.has(this)){let m=this._mathfield,p=Q.get(this),f=p.menuItems;m.model.deferNotifications({content:!1,selection:!1},()=>{let y=p.value;y!==void 0&&m.setValue(y),m.model.selection=p.selection,Q.delete(this)}),f&&(this.menuItems=f)}window.queueMicrotask(()=>{this.isConnected&&this.dispatchEvent(new Event("mount",{cancelable:!1,bubbles:!0,composed:!0}))}),hr()}disconnectedCallback(){var i,n,o;if(this.shadowRoot.host.removeEventListener("pointerdown",this,!0),!this._mathfield)return;(i=this._observer)==null||i.disconnect(),this._observer=null,this._mathfield.hasFocus()&&this._mathfield.onBlur({dispatchEvents:!0}),window.queueMicrotask(()=>this.dispatchEvent(new Event("unmount",{cancelable:!1,bubbles:!0,composed:!0})));let r=fr(this._mathfield.options,Object.keys(ce.optionsAttributes).map(a=>gr(a)));Q.set(this,{value:this._mathfield.getValue(),selection:this._mathfield.model.selection,menuItems:(o=(n=this._mathfield.menu)==null?void 0:n.menuItems)!=null?o:void 0,options:r}),this._mathfield.dispose(),this._mathfield=null}upgradeProperty(r){if(this.hasOwnProperty(r)){let i=this[r];delete this[r],(r==="readonly"||r==="read-only")&&(r="readOnly"),this[r]=i}}attributeChangedCallback(r,i,n){var a;if(i===n)return;let o=n!==null;switch(r){case"contenteditable":Y(this._mathfield);break;case"aria-label":case"aria-labelledby":case"title":(a=this._mathfield)==null||a.updateAccessibleName();break;case"placeholder":n===!1&&(n=""),this.placeholder=n;break;case"disabled":this.disabled=o;break;case"read-only":case"readonly":this.readOnly=o;break;default:}}get readonly(){return this.hasAttribute("readonly")||this.hasAttribute("read-only")}set readonly(r){let i=!!r;i?this.setAttribute("readonly",""):(this.removeAttribute("readonly"),this.removeAttribute("read-only")),this._setOptions({readOnly:i})}get disabled(){return this.hasAttribute("disabled")}set disabled(r){var n;let i=!!r;i?this.setAttribute("disabled",""):this.removeAttribute("disabled"),Js()?this._internals.ariaDisabled=i?"true":"false":this.setAttribute("aria-disabled",i?"true":"false"),i&&((n=this._mathfield)!=null&&n.hasFocus)&&window.mathVirtualKeyboard.visible&&this._mathfield.executeCommand("hideVirtualKeyboard")}get value(){return this.getValue()}set value(r){this.setValue(r)}get defaultMode(){return this._getOption("defaultMode")}set defaultMode(r){this._setOptions({defaultMode:r})}get macros(){if(!this._mathfield)throw new Error("Mathfield not mounted");return this._getOption("macros")}set macros(r){this._setOptions({macros:r})}get registers(){if(!this._mathfield)throw new Error("Mathfield not mounted");let r=this;return new Proxy({},{get:(i,n)=>{if(typeof n=="string")return r._getOption("registers")[n]},set(i,n,o){return typeof n!="string"?!1:(r._setOptions({registers:g(h({},r._getOption("registers")),{[n]:o})}),!0)},ownKeys:()=>Reflect.ownKeys(r._getOption("registers")),getOwnPropertyDescriptor:(i,n)=>{let o=r._getOption("registers")[n];if(o!==void 0)return{configurable:!0,enumerable:!0,value:o,writable:!0}}})}set registers(r){this._setOptions({registers:r})}get colorMap(){return this._getOption("colorMap")}set colorMap(r){this._setOptions({colorMap:r})}get backgroundColorMap(){return this._getOption("backgroundColorMap")}set backgroundColorMap(r){this._setOptions({backgroundColorMap:r})}get letterShapeStyle(){return this._getOption("letterShapeStyle")}set letterShapeStyle(r){this._setOptions({letterShapeStyle:r})}get minFontScale(){return this._getOption("minFontScale")}set minFontScale(r){this._setOptions({minFontScale:r})}get maxMatrixCols(){return this._getOption("maxMatrixCols")}set maxMatrixCols(r){this._setOptions({maxMatrixCols:r})}get smartMode(){return this._getOption("smartMode")}set smartMode(r){this._setOptions({smartMode:r})}get smartFence(){return this._getOption("smartFence")}set smartFence(r){this._setOptions({smartFence:r})}get smartSuperscript(){return this._getOption("smartSuperscript")}set smartSuperscript(r){this._setOptions({smartSuperscript:r})}get scriptDepth(){return this._getOption("scriptDepth")}set scriptDepth(r){this._setOptions({scriptDepth:r})}get removeExtraneousParentheses(){return this._getOption("removeExtraneousParentheses")}set removeExtraneousParentheses(r){this._setOptions({removeExtraneousParentheses:r})}get mathModeSpace(){return this._getOption("mathModeSpace")}set mathModeSpace(r){this._setOptions({mathModeSpace:r})}get placeholderSymbol(){return this._getOption("placeholderSymbol")}set placeholderSymbol(r){this._setOptions({placeholderSymbol:r})}get placeholder(){return this._getOption("contentPlaceholder")}set placeholder(r){this._setOptions({contentPlaceholder:r})}get popoverPolicy(){return this._getOption("popoverPolicy")}set popoverPolicy(r){this._setOptions({popoverPolicy:r})}get environmentPopoverPolicy(){return this._getOption("environmentPopoverPolicy")}set environmentPopoverPolicy(r){this._setOptions({environmentPopoverPolicy:r})}get menuItems(){var r;if(!this._mathfield)throw new Error("Mathfield not mounted");return(r=this._mathfield.menu._menuItems.map(i=>i.menuItem))!=null?r:[]}set menuItems(r){var i;if(!this._mathfield)throw new Error("Mathfield not mounted");if(this._mathfield){let n=(i=this._mathfield.element)==null?void 0:i.querySelector("[part=menu-toggle]");n&&(n.style.display=r.length===0?"none":""),this._mathfield.menu.menuItems=r}}get mathVirtualKeyboardPolicy(){return this._getOption("mathVirtualKeyboardPolicy")}set mathVirtualKeyboardPolicy(r){this._setOptions({mathVirtualKeyboardPolicy:r})}get inlineShortcuts(){if(!this._mathfield)throw new Error("Mathfield not mounted");return this._getOption("inlineShortcuts")}set inlineShortcuts(r){if(!this._mathfield)throw new Error("Mathfield not mounted");this._setOptions({inlineShortcuts:r})}get inlineShortcutTimeout(){return this._getOption("inlineShortcutTimeout")}set inlineShortcutTimeout(r){this._setOptions({inlineShortcutTimeout:r})}get keybindings(){if(!this._mathfield)throw new Error("Mathfield not mounted");return this._getOption("keybindings")}set keybindings(r){if(!this._mathfield)throw new Error("Mathfield not mounted");this._setOptions({keybindings:r})}get onInsertStyle(){let r=this._getOption("onInsertStyle");return r===void 0?co:r}set onInsertStyle(r){this._setOptions({onInsertStyle:r})}get onInlineShortcut(){return this._getOption("onInlineShortcut")}set onInlineShortcut(r){this._setOptions({onInlineShortcut:r})}get onScrollIntoView(){return this._getOption("onScrollIntoView")}set onScrollIntoView(r){this._setOptions({onScrollIntoView:r})}get onExport(){return this._getOption("onExport")}set onExport(r){this._setOptions({onExport:r})}get readOnly(){return this._getOption("readOnly")}set readOnly(r){this._setOptions({readOnly:r})}get isSelectionEditable(){var r,i;return(i=(r=this._mathfield)==null?void 0:r.isSelectionEditable)!=null?i:!1}setPromptState(r,i,n){var o;(o=this._mathfield)==null||o.setPromptState(r,i,n)}getPromptState(r){var i,n;return(n=(i=this._mathfield)==null?void 0:i.getPromptState(r))!=null?n:[void 0,!0]}get selection(){return this._mathfield?this._mathfield.model.selection:Q.has(this)?Q.get(this).selection:{ranges:[[0,0]],direction:"forward"}}set selection(r){if(typeof r=="number"&&(r={ranges:[[r,r]]}),this._mathfield){this._mathfield.model.selection=r,Y(this._mathfield);return}if(Q.has(this)){Q.set(this,g(h({},Q.get(this)),{selection:r}));return}Q.set(this,{value:void 0,selection:r,options:js(this),menuItems:void 0})}get selectionIsCollapsed(){let r=this.selection;return r.ranges.length===1&&r.ranges[0][0]===r.ranges[0][1]}get position(){return this._mathfield?this._mathfield.model.position:Q.has(this)?Q.get(this).selection.ranges[0][0]:0}set position(r){if(this._mathfield&&(this._mathfield.model.position=r,Y(this._mathfield)),Q.has(this)){Q.set(this,g(h({},Q.get(this)),{selection:{ranges:[[r,r]]}}));return}Q.set(this,{value:void 0,selection:{ranges:[[r,r]]},options:js(this),menuItems:void 0})}get lastOffset(){var r,i;return(i=(r=this._mathfield)==null?void 0:r.model.lastOffset)!=null?i:-1}};ce.version="0.111.1",ce.openUrl=r=>{if(!r)return;let i=new URL(r);if(!["http:","https:","file:"].includes(i.protocol.toLowerCase())){ce.playSound("plonk");return}window.open(i,"_blank")},ce._fontsDirectory="./fonts/",ce._soundsDirectory="./sounds",ce.keypressVibration=!0,ce._keypressSound={spacebar:"keypress-spacebar.wav",return:"keypress-return.wav",delete:"keypress-delete.wav",default:"keypress-standard.wav"},ce._plonkSound="plonk.wav",ce.audioBuffers={},ce.createHTML=r=>r,ce._speechEngineRate="100%",ce._speechEngineVoice="Joanna",ce._textToSpeechMarkup="",ce._textToSpeechRules="mathlive",ce._textToSpeechRulesOptions={},ce.speakHook=Up,ce.readAloudHook=jp,ce.restoreFocusWhenDocumentFocused=!0,ce._decimalSeparator=".",ce._scientificNotationTemplate="#1\\times10^{#2}",ce._isFunction=r=>{var n,o;let i=globalThis.MathfieldElement.computeEngine;return(o=(n=i==null?void 0:i.parse(r).domain)==null?void 0:n.isFunction)!=null?o:!1};var lt=ce;function gr(t){return t.replace(/[^a-zA-Z\d]+(.)/g,(e,r)=>r.toUpperCase())}function js(t){let e={readOnly:!1},r=lt.optionsAttributes;return Object.keys(r).forEach(i=>{var n;if(t.hasAttribute(i)){let o=t.getAttribute(i);i==="placeholder"?e.contentPlaceholder=o!=null?o:"":r[i]==="boolean"?e[gr(i)]=!0:r[i]==="on/off"?(o=(n=o==null?void 0:o.toLowerCase())!=null?n:"",o==="on"||o==="true"?e[gr(i)]=!0:o==="off"||o==="false"?e[gr(i)]=!1:e[gr(i)]=void 0):r[i]==="number"?e[gr(i)]=Number.parseFloat(o!=null?o:"0"):e[gr(i)]=o}}),e}function Js(){return!(!("ElementInternals"in window)||!HTMLElement.prototype.attachInternals||!("role"in window.ElementInternals.prototype))}var xn=lt,Jp,Xp,Zp,Yp;if(Le()&&!((Jp=window.customElements)!=null&&Jp.get("math-field"))){(Zp=window[Xp=Symbol.for("io.cortexjs.mathlive")])!=null||(window[Xp]={});let t=window[Symbol.for("io.cortexjs.mathlive")];t.version="0.111.1",globalThis.MathfieldElement=lt,(Yp=window.customElements)==null||Yp.define("math-field",lt)}var zo;function Xs(t){var e,r;if(!zo){let i=(e=globalThis[Symbol.for("io.cortexjs.compute-engine")])==null?void 0:e.ComputeEngine;i?zo=new i:console.error(`MathLive 0.111.1: The CortexJS Compute Engine library is not available. + + Load the library, for example with: + + import "https://esm.run/@cortex-js/compute-engine"`)}return(r=zo==null?void 0:zo.box(t).latex)!=null?r:""}var Qp=!1,ef=null;function Fy(){Qp||ef||(ef=hr().then(()=>{Qp=!0}))}var Zs=class extends HTMLElement{constructor(){super();this._hasRendered=!1;if(this._shadowRoot=this.attachShadow({mode:"open"}),"adoptedStyleSheets"in this._shadowRoot)this._shadowRoot.adoptedStyleSheets=[sr("core")];else{let r=document.createElement("style");r.textContent=Ft("core"),this._shadowRoot.appendChild(r)}this._contentSlot=document.createElement("div"),this._contentSlot.style.display="none",this._contentSlot.setAttribute("part","content"),this._renderContainer=document.createElement("div"),this._renderContainer.setAttribute("part","render"),this._renderContainer.setAttribute("aria-hidden","true"),this._errorFallback=document.createElement("div"),this._errorFallback.style.display="none",this._errorFallback.setAttribute("part","error"),this._shadowRoot.appendChild(this._contentSlot),this._shadowRoot.appendChild(this._renderContainer),this._shadowRoot.appendChild(this._errorFallback),this.addEventListener("keydown",this._handleKeydown.bind(this))}static get observedAttributes(){return["mode","format","macros","letter-shape-style","min-font-scale","max-matrix-cols"]}connectedCallback(){Fy(),"IntersectionObserver"in window&&!this._hasRendered?(this._observer=new IntersectionObserver(r=>{var i;r[0].isIntersecting&&!this._hasRendered&&(this.render(),(i=this._observer)==null||i.disconnect())},{rootMargin:"50px"}),this._observer.observe(this)):this.render()}disconnectedCallback(){var r;(r=this._observer)==null||r.disconnect()}attributeChangedCallback(r,i,n){i!==n&&this._hasRendered&&this.render()}_handleKeydown(r){if(this.getAttribute("tabindex")!==null&&(r.key===" "||r.key==="Enter")){r.preventDefault();let n=this.getAttribute("aria-label");if(n&&"speechSynthesis"in window){let o=new SpeechSynthesisUtterance(n);speechSynthesis.speak(o)}}}get mode(){let r=this.getAttribute("mode");return r==="textstyle"||r==="displaystyle"?r:this.getDefaultMathstyle()}set mode(r){this.setAttribute("mode",r)}get format(){let r=this.getAttribute("format");return r==="latex"||r==="ascii-math"||r==="math-json"?r:"latex"}set format(r){this.setAttribute("format",r)}get letterShapeStyle(){let r=this.getAttribute("letter-shape-style");if(r==="auto"||r==="tex"||r==="iso"||r==="french"||r==="upright")return r}set letterShapeStyle(r){r===void 0?this.removeAttribute("letter-shape-style"):this.setAttribute("letter-shape-style",r)}get macros(){var r;return(r=this.getAttribute("macros"))!=null?r:void 0}set macros(r){r===void 0?this.removeAttribute("macros"):this.setAttribute("macros",r)}get minFontScale(){let r=this.getAttribute("min-font-scale");return r?parseFloat(r):void 0}set minFontScale(r){r===void 0?this.removeAttribute("min-font-scale"):this.setAttribute("min-font-scale",String(r))}get maxMatrixCols(){let r=this.getAttribute("max-matrix-cols");return r?parseInt(r,10):void 0}set maxMatrixCols(r){r===void 0?this.removeAttribute("max-matrix-cols"):this.setAttribute("max-matrix-cols",String(r))}render(){var r,i,n;try{let o=(i=(r=this.textContent)==null?void 0:r.trim())!=null?i:"";if(!o){this._renderContainer.innerHTML="",this._errorFallback.style.display="none",this._renderContainer.style.display="none",this._removeMathML();return}this._contentSlot.textContent=o;let a,s=this.format;if(s==="ascii-math")a=eu(o);else if(s==="math-json"){let u=JSON.parse(o);a=Xs(u)}else a=o;let l={defaultMode:this.mode==="displaystyle"?"math":"inline-math"};if(this.letterShapeStyle&&(l.letterShapeStyle=this.letterShapeStyle),this.macros)try{l.macros=JSON.parse(this.macros)}catch(u){console.warn("Invalid macros JSON:",u)}this.minFontScale!==void 0&&(l.minFontScale=this.minFontScale),this.maxMatrixCols!==void 0&&(l.maxMatrixCols=this.maxMatrixCols);let c=pe(a,l);this._renderContainer.innerHTML=c,this._renderContainer.style.display=this.getDefaultDisplay(),this._errorFallback.style.display="none",this._updateAccessibility(a),this._hasRendered=!0,this.dispatchEvent(new CustomEvent("render",{bubbles:!0,composed:!0,detail:{format:s,content:a}}))}catch(o){console.error("MathLive static element render error:",o),this._renderContainer.style.display="none",this._errorFallback.textContent=(n=this.textContent)!=null?n:"",this._errorFallback.style.display="block",this._removeMathML(),this.dispatchEvent(new CustomEvent("render-error",{bubbles:!0,composed:!0,detail:{error:o,content:this.textContent}}))}}_updateAccessibility(r){if(!this.hasAttribute("aria-label"))try{let i=Ko(r);this.setAttribute("aria-label",i)}catch(i){console.warn("Could not generate speakable text:",i)}this.hasAttribute("role")||this.setAttribute("role","img"),this._addMathML(r)}_addMathML(r){try{let i=Bo(r);this._mathMLContainer||(this._mathMLContainer=document.createElement("div"),this._mathMLContainer.style.position="absolute",this._mathMLContainer.style.width="1px",this._mathMLContainer.style.height="1px",this._mathMLContainer.style.overflow="hidden",this._mathMLContainer.style.clip="rect(0, 0, 0, 0)",this._mathMLContainer.setAttribute("aria-hidden","false"),this._shadowRoot.appendChild(this._mathMLContainer)),this._mathMLContainer.innerHTML=""+i+""}catch(i){console.warn("Could not generate MathML:",i)}}_removeMathML(){this._mathMLContainer&&(this._mathMLContainer.remove(),this._mathMLContainer=void 0)}},No=class extends Zs{getDefaultMathstyle(){return"textstyle"}getDefaultDisplay(){return"inline-flex"}},Fo=class extends Zs{getDefaultMathstyle(){return"displaystyle"}getDefaultDisplay(){return"flex"}};function $y(){var t,e,r,i;typeof window!="undefined"&&((t=window.customElements)!=null&&t.get("math-span")||(e=window.customElements)==null||e.define("math-span",No),(r=window.customElements)!=null&&r.get("math-div")||(i=window.customElements)==null||i.define("math-div",Fo))}$y();function Vy(t,e,r){let i=r,n=0,o=t.length;for(;i0&&o.push({type:"text",data:s.slice(0,c)}),l=!1);let d=!1;for(;!d;){if(l){if(u=s.indexOf(e,c),u===-1){d=!0;break}c!==u&&o.push({type:"text",data:s.slice(c,u)}),c=u}else{if(u=Vy(r,s,c+e.length),u===-1){d=!0;break}let m=s.slice(c+e.length,u);n==="ascii-math"&&([,m]=or(m,{format:"ascii-math"})),o.push({type:"math",data:m,mathstyle:i}),c=u+r.length}l=!l}c{r=Ys(r,d,m,"displaystyle")}),(a=(o=e.TeX)==null?void 0:o.delimiters)!=null&&a.inline&&e.TeX.delimiters.inline.forEach(([d,m])=>{r=Ys(r,d,m,"textstyle")}),(l=(s=e.asciiMath)==null?void 0:s.delimiters)!=null&&l.inline&&e.asciiMath.delimiters.inline.forEach(([d,m])=>{r=Ys(r,d,m,"textstyle","ascii-math")}),(u=(c=e.asciiMath)==null?void 0:c.delimiters)!=null&&u.display&&e.asciiMath.delimiters.display.forEach(([d,m])=>{r=Ys(r,d,m,"displaystyle","ascii-math")}),r}function qy(t,e){let r=document.createElement("span");r.setAttribute("translate","no");try{let i=""+e.renderToMathML(t)+"";r.innerHTML=globalThis.MathfieldElement.createHTML(i)}catch(i){console.error(`MathLive 0.111.1: Could not convert "${t}"' to MathML with ${i}`),r.textContent=t}return r.className="ML__sr-only",r}function Hy(t,e,r){try{let i=e.renderToMarkup(t,g(h({},e),{defaultMode:r==="displaystyle"?"math":"inline-math"})),n=document.createElement("span");return n.dataset.latex=t,n.style.display=r==="displaystyle"?"flex":"inline-flex",n.setAttribute("aria-hidden","true"),n.setAttribute("translate","no"),n.innerHTML=globalThis.MathfieldElement.createHTML(i),n}catch(i){return console.error("Could not parse'"+t+"' with ",i),document.createTextNode(t)}}function $o(t,e,r){var o;let i=Hy(t,r,e||"textstyle"),n=(o=r.renderAccessibleContent)!=null?o:"";if(/\b(mathml|speakable-text)\b/i.test(n)){let a=document.createElement("span");if(/\bmathml\b/i.test(n)&&r.renderToMathML&&a.append(qy(t,r)),/\bspeakable-text\b/i.test(n)&&r.renderToSpeakableText){let s=document.createElement("span");s.setAttribute("translate","no");let l=r.renderToSpeakableText(t);globalThis.MathfieldElement.textToSpeechMarkup==="ssml"?s.innerHTML=globalThis.MathfieldElement.createHTML(l):s.textContent=l,s.className="ML__sr-only",a.append(s)}return a.append(i),a}return i}function Wy(t,e){var n;if(/^\s*$/.test(t))return null;if((n=e.TeX)!=null&&n.processEnvironments&&/^\s*\\begin/.test(t))return[$o(t,"",e)];let r=tf(t,e);if(r.length===1&&r[0].type==="text")return null;let i=[];for(let o of r)o.type==="text"?i.push(o.data):i.push($o(o.data,o.mathstyle==="textstyle"?"textstyle":"displaystyle",e));return i}function rf(t,e){var i,n,o,a,s,l,c,u,d,m,p,f,y,v,b,k,S,A;if(t.childNodes.length===1&&t.childNodes[0].nodeType===3){let E=(i=t.childNodes[0].textContent)!=null?i:"";if((n=e.TeX)!=null&&n.processEnvironments&&/^\s*\\begin/.test(E)){t.textContent="",t.append($o(E,"",e));return}let C=tf(E,e);if(C.length===1){let _=C[0];if(_.type==="text")return;t.textContent="",t.append($o(_.data,_.mathstyle==="textstyle"?"textstyle":"displaystyle",e));return}}let r=[...t.childNodes];for(let E of r)if(E.nodeType===3){let C=Wy((o=E.textContent)!=null?o:"",e);C&&E.replaceWith(...C)}else if(E.nodeType===1){let C=E.nodeName.toLowerCase();if(C==="script"){let _=E,O=_.type.toLowerCase();if(O==="module"||O==="javascript")continue;let I;if((a=e.processScriptTypePattern)!=null&&a.test(O))I=(s=_.textContent)!=null?s:"";else if((l=e.processMathJSONScriptTypePattern)!=null&&l.test(O))try{I=(u=e.serializeToLatex)==null?void 0:u.call(e,JSON.parse((c=_.textContent)!=null?c:""))}catch(V){console.error(V)}if(I){let V="textstyle";for(let K of O.split(";")){let[N,j]=K.split("=");N.trim()==="mode"&&(V=j.trim()==="display"?"displaystyle":"textstyle")}du(_,I,V,e)}}else{let _=E;if((d=e.texClassDisplayPattern)!=null&&d.test(_.className)){du(_,(m=_.textContent)!=null?m:"","displaystyle",e);continue}if((p=e.texClassInlinePattern)!=null&&p.test(_.className)){du(_,(f=_.textContent)!=null?f:"","textstyle",e);continue}((v=(y=e.processClassPattern)==null?void 0:y.test(_.className))!=null&&v||!((k=(b=e.skipTags)==null?void 0:b.includes(C))!=null&&k||(A=(S=e.ignoreClassPattern)==null?void 0:S.test(_.className))!=null&&A))&&rf(_,e)}}}var Uy={skipTags:["math-field","noscript","style","textarea","pre","code","annotation","annotation-xml"],processScriptType:"math/tex",processMathJSONScriptType:"math/json",ignoreClass:"^(tex2jax_ignore|ML__latex)$",processClass:"tex2jax_process",renderAccessibleContent:"mathml",asciiMath:{delimiters:{inline:[["`","`"]]}},TeX:{processEnvironments:!0,delimiters:{inline:[["\\(","\\)"]],display:[["$$","$$"],["\\[","\\]"]]}}};function mu(t,e){var r,i,n,o,a,s,l,c;try{let u=h(h({},Uy),e);u.ignoreClassPattern=new RegExp((r=u.ignoreClass)!=null?r:""),u.processClassPattern=new RegExp((i=u.processClass)!=null?i:""),u.processScriptTypePattern=new RegExp((n=u.processScriptType)!=null?n:""),u.processMathJSONScriptTypePattern=new RegExp((o=u.processMathJSONScriptType)!=null?o:""),(s=(a=u.TeX)==null?void 0:a.className)!=null&&s.display&&(u.texClassDisplayPattern=new RegExp(u.TeX.className.display)),(c=(l=u.TeX)==null?void 0:l.className)!=null&&c.inline&&(u.texClassInlinePattern=new RegExp(u.TeX.className.inline)),hr(),Ge("core"),rf(t,u)}catch(u){u instanceof Error?console.error("renderMathInElement(): "+u.message):console.error("renderMathInElement(): Could not render math for element",t)}}function du(t,e,r,i){t.parentNode.replaceChild($o(e,r,i),t)}function Gy(t,e){let r=Fe.singleton;return r?(r.show(),Hr(),r.currentLayer=e,r.render(),r.focus(),!0):!1}function jy(){let t=window.mathVirtualKeyboard;return t.visible?t.hide({animate:!0}):t.show({animate:!0}),!1}fe({switchKeyboardLayer:Gy,toggleVirtualKeyboard:jy,hideVirtualKeyboard:()=>(window.mathVirtualKeyboard.hide({animate:!0}),!1),showVirtualKeyboard:()=>(window.mathVirtualKeyboard.show({animate:!0}),!1)},{target:"virtual-keyboard"});function At(){var t,e;return(e=globalThis[t=Symbol.for("io.cortexjs.mathlive")])!=null||(globalThis[t]={}),globalThis[Symbol.for("io.cortexjs.mathlive")]}function Jy(t){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>Qs(document.body,t)):Qs(document.body,t)}function Xy(t){if(typeof t=="string"){let e=document.getElementById(t);if(e===null)throw new Error(`The element with ID "${t}" could not be found.`);return e}return t}function Qs(t,e){var n,o,a,s;if(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",()=>Qs(t,e));return}let r=Xy(t);if(!r)return;let i=e!=null?e:{};(n=i.renderToMarkup)!=null||(i.renderToMarkup=pe),(o=i.renderToMathML)!=null||(i.renderToMathML=Bo),(a=i.renderToSpeakableText)!=null||(i.renderToSpeakableText=Ko),(s=i.serializeToLatex)!=null||(i.serializeToLatex=Xs),mu(r,i)}var Zy={mathlive:"0.111.1"};return df(Yy);})(); +Object.assign(exports, MathLive); Object.defineProperty(exports, '__esModule', { value: true });})); diff --git a/visual-math.css b/visual-math.css new file mode 100644 index 0000000..bf089ea --- /dev/null +++ b/visual-math.css @@ -0,0 +1,15 @@ +.editor-area .formula-inline,.editor-area .formula-block { cursor:pointer; white-space:normal; font-family:inherit; color:inherit; background:#f2f7fc; border:1px solid transparent; border-radius:5px; } +.editor-area .formula-inline { display:inline-block; padding:2px 5px; vertical-align:middle; } +.editor-area .formula-block { display:block; padding:14px; text-align:center; margin:14px 0; overflow-x:auto; } +.editor-area .formula-inline:hover,.editor-area .formula-block:hover,.editor-area .formula-inline:focus-visible,.editor-area .formula-block:focus-visible { border-color:#4385ca; outline:2px solid #4385ca33; } +.visual-math-content { pointer-events:none; font-size:1.1em; } +.visual-math-label { display:block; font:11px/1.5 system-ui,sans-serif; color:#64748b; margin-top:5px; } +#formulaMathField { display:block; min-height:96px; padding:14px; font-size:26px; border:1px solid #a4b7cf; border-radius:8px; background:white; } +#formulaMathField::part(menu-toggle) { display:none; } +.formula-help { color:#64748b; font-size:12px; margin:8px 0 12px; } +#formulaMetadata label { display:block; font-size:13px; margin:10px 0; } +#formulaMetadata input { display:block; box-sizing:border-box; width:100%; margin-top:5px; padding:8px; border:1px solid #cbd5e1; border-radius:5px; } +#formulaError { color:#b42318; font-size:13px; } +.formula-advanced { margin-top:14px; font-size:12px; color:#64748b; } +.formula-advanced textarea { width:100%; box-sizing:border-box; margin-top:8px; } +body .ML__keyboard { z-index:1100; } diff --git a/visual-math.js b/visual-math.js new file mode 100644 index 0000000..9679dfc --- /dev/null +++ b/visual-math.js @@ -0,0 +1,228 @@ +/* Local MathLive adapter. Source attributes, never rendered DOM, are canonical. */ +(function(root) { + 'use strict'; + const unsafe = /\\(?:href|url|html\w*|class|cssId|style|includegraphics)\b/i; + function safe(source) { return typeof source === 'string' && !unsafe.test(source); } + function groupEnd(source, start) { + if (source[start] !== '{') return -1; + let depth = 1; + for (let i = start + 1; i < source.length; i++) { + if (source[i] === '\\') { i++; continue; } + if (source[i] === '%') { const end = source.indexOf('\n', i); if (end < 0) return -1; i = end; continue; } + if (source[i] === '{') depth++; + else if (source[i] === '}' && --depth === 0) return i + 1; + } + return -1; + } + function unwrap(source) { + const opening = /^\s*\\begin\s*\{(aligned|gathered)\}/.exec(source); + if (!opening) return source; + const environment = opening[1]; + let depth = 1; + for (let i = opening[0].length; i < source.length;) { + if (source[i] === '%') { const end = source.indexOf('\n', i); i = end < 0 ? source.length : end + 1; continue; } + if (source[i] !== '\\') { i++; continue; } + const token = /^\\(begin|end)\s*\{(aligned|gathered)\}/.exec(source.slice(i)); + if (!token || token[2] !== environment) { i += 2; continue; } + if (token[1] === 'begin') depth++; + else if (--depth === 0) return /^\s*$/.test(source.slice(i + token[0].length)) ? source.slice(opening[0].length, i) : source; + i += token[0].length; + } + return source; + } + // Labels, explicit tags and comments are editorial metadata. Keep their + // row association outside the mathfield, which normalizes mathematical LaTeX. + function split(source) { + const rows = [''], rawRows = [''], metadata = [], invalidMetadata = []; + let depth = 0; + let unmatchedBrace = false; + const environments = []; + for (let i = 0; i < source.length;) { + const c = source[i]; + if (c === '%') { + let end = source.indexOf('\n', i); if (end < 0) end = source.length; + if (source[end-1] === '\r') end--; + metadata.push({kind:'comment', raw:source.slice(i,end), row:rows.length-1, start:i, end}); + rawRows[rawRows.length-1] += source.slice(i,end); + i = end; continue; + } + if (c === '\\') { + const match = /^\\(label|tag)(\*)?\s*\{/.exec(source.slice(i)); + const argument = match ? i + match[0].length - 1 : -1; + const end = match ? groupEnd(source, argument) : -1; + if (match && end < 0) invalidMetadata.push(i); + if (end >= 0) { + const raw = source.slice(i,end); + metadata.push({kind:match[1], raw, value:source.slice(argument+1,end-1), row:rows.length-1, + start:i, end, valueStart:argument+1, valueEnd:end-1}); + rawRows[rawRows.length-1] += raw; + i = end; continue; + } + const environment = /^\\(begin|end)\s*\{([^{}]+)\}/.exec(source.slice(i)); + if (environment) { + if (environment[1] === 'begin') environments.push(environment[2]); + else if (environments[environments.length-1] === environment[2]) environments.pop(); + rows[rows.length-1] += environment[0]; rawRows[rawRows.length-1] += environment[0]; + i += environment[0].length; continue; + } + if (source[i+1] === '\\' && depth === 0 && environments.length === 0) { + rows.push(''); rawRows.push(''); i += 2; continue; + } + rows[rows.length-1] += source.slice(i,i+2); rawRows[rawRows.length-1] += source.slice(i,i+2); i += 2; continue; + } + if (c === '{') depth++; + if (c === '}' && --depth < 0) unmatchedBrace = true; + rows[rows.length-1] += c; rawRows[rawRows.length-1] += c; i++; + } + return {source, rows, rawRows, metadata, invalidMetadata, balanced:depth === 0 && !unmatchedBrace, clean:rows.join('\\\\')}; + } + function validateValue(kind, value) { + if (typeof value !== 'string' || /[{}\\%\u0000-\u001f\u007f]/.test(value) || + (kind === 'label' && /[\s\[\],#$&^~*]/.test(value))) throw new Error('标签不能包含空白、括号或 LaTeX 控制字符;编号可以包含空格。'); + } + function combine(parts, edited, values = [], dirty = false) { + const changes = parts.metadata.map((entry,i) => { + if (entry.kind === 'comment') return entry.raw; + const value = values[i] === undefined ? entry.value : values[i]; + if (value === entry.value) return entry.raw; + validateValue(entry.kind,value); + return value ? entry.raw.slice(0,entry.valueStart-entry.start)+value+entry.raw.slice(entry.valueEnd-entry.start) : ''; + }); + if (!dirty) { + let result = parts.source; + for (let i = parts.metadata.length-1; i >= 0; i--) { + const entry = parts.metadata[i]; + result = result.slice(0,entry.start)+changes[i]+result.slice(entry.end); + } + return result; + } + if (parts.invalidMetadata.length || !parts.balanced) throw new Error('原公式有不匹配的括号,请先在高级输入中修正后再使用图形编辑。'); + // Only remove a wrapper introduced by mathValue/MathLive. A source-owned + // aligned/gathered environment must remain part of the saved expression. + function wrapperDepth(source) { + let count = 0, body = source; + while (unwrap(body) !== body) { body = unwrap(body); count++; } + return count; + } + const body = wrapperDepth(edited) > wrapperDepth(parts.clean) ? unwrap(edited) : edited; + if (body === parts.clean || edited === parts.clean) return combine(parts,edited,values,false); + const clean = split(body); + const rows = clean.rawRows.slice(); + if (clean.invalidMetadata.length || !clean.balanced) throw new Error('公式或标签包含不匹配的括号,请修正后保存。'); + clean.metadata.forEach(entry => { + if (entry.kind === 'label') { + if (!entry.value) throw new Error('公式标签不能为空。'); + validateValue('label',entry.value); + } + }); + parts.metadata.forEach((entry,i) => { + if (!changes[i]) return; + if (entry.row >= rows.length) throw new Error('被删除的公式行带有标签、编号或注释。请先清空标签和编号;注释可在高级输入中调整,再删除这一行。'); + const current = clean.metadata.filter(item => item.row === entry.row && item.kind === entry.kind); + const value = values[i] === undefined ? entry.value : values[i]; + if (current.some(item => entry.kind === 'comment' ? item.raw === changes[i] : item.value === value)) return; + if (entry.kind === 'tag' && current.length) { + if (value !== entry.value) throw new Error('同一行的公式字段与编号输入包含不同编号,请统一后保存。'); + return; + } + const last = clean.metadata.filter(item => item.row === entry.row).at(-1); + const endsInComment = last?.kind === 'comment' && rows[entry.row].endsWith(last.raw); + rows[entry.row] += entry.kind === 'comment' ? '\n'+changes[i]+'\n' : (endsInComment ? '\n' : '')+changes[i]; + }); + return rows.join('\\\\'); + } + function mathValue(parts, environment) { + if (/^align/.test(environment || '')) return '\\begin{aligned}'+parts.clean+'\\end{aligned}'; + if (/^gather/.test(environment || '')) return '\\begin{gathered}'+parts.clean+'\\end{gathered}'; + return parts.clean; + } + function render(editor) { + if (!editor || !root.customElements?.get('math-span')) return; + editor.querySelectorAll('.formula-inline, .formula-block').forEach(node => { + const source = node.getAttribute('data-formula') || ''; + const env = node.getAttribute('data-environment') || ''; + const fingerprint = JSON.stringify([source,env,node.classList.contains('formula-block')]); + if (node._mathDisplay === fingerprint && node.querySelector('.visual-math-content')) return; + node._mathDisplay = fingerprint; + node.textContent = ''; + const view = document.createElement(safe(source) ? 'math-span' : 'span'); + view.className = 'visual-math-content'; + if (safe(source)) { + view.setAttribute('mode', node.classList.contains('formula-block') ? 'displaystyle' : 'textstyle'); + view.textContent = mathValue(split(source),env); + } else view.textContent = '含特殊排版指令的公式'; + node.appendChild(view); + const labels = split(source).metadata.filter(item => item.kind !== 'comment'); + if (labels.length) { + const badge = document.createElement('span'); badge.className = 'visual-math-label'; + badge.textContent = labels.map(item => (item.kind === 'label' ? '标签:' : '编号:')+item.value).join(' · '); + node.appendChild(badge); + } + node.setAttribute('tabindex','0'); node.setAttribute('role','button'); + node.setAttribute('aria-label','编辑'+(node.classList.contains('formula-block') ? '行间' : '行内')+'公式'+(labels.length ? ','+labels.map(item=>item.value).join(',') : '')); + node.title = '点击编辑公式'; + }); + } + let session = null; + function open(source, node, focus = true) { + const field = document.getElementById('formulaMathField'); + if (!field || !root.customElements?.get('math-field')) return false; + const parts = split(source); + session = {parts, dirty:false, values:[], field, node}; + const error = document.getElementById('formulaError'); error.textContent = ''; + field.readOnly = !safe(source); + field.value = safe(source) ? mathValue(parts,node?.getAttribute('data-environment')) : ''; + if (/^(align|gather)/.test(node?.getAttribute('data-environment') || '')) field.position = Math.max(0,field.lastOffset-1); + if (!safe(source)) error.textContent = '此公式包含网页排版指令,已保留原文。可在下方高级输入中修改。'; + const metadata = document.getElementById('formulaMetadata'); metadata.textContent = ''; + parts.metadata.forEach((entry,i) => { + session.values[i] = entry.value; + if (entry.kind === 'comment') return; + const label = document.createElement('label'); + label.textContent = (entry.kind === 'label' ? '公式标签' : '显示编号')+(parts.rows.length > 1 ? '(第 '+(entry.row+1)+' 行)' : ''); + const input = document.createElement('input'); input.value = entry.value; + input.setAttribute('aria-label',label.textContent); + input.addEventListener('input',()=> { if(session) session.values[i]=input.value; }); + label.appendChild(input); metadata.appendChild(label); + }); + if (focus) field.focus(); + return true; + } + function value() { + if (!session) return document.getElementById('formulaInput').value; + const {parts,field,values,dirty} = session; + return combine(parts,field.value,values,dirty); + } + function initialize() { + if (!root.MathfieldElement) return; + root.MathfieldElement.fontsDirectory = './fonts'; + root.MathfieldElement.soundsDirectory = null; + root.MathfieldElement.computeEngine = null; + const field = document.getElementById('formulaMathField'); + field.mathVirtualKeyboardPolicy = 'manual'; field.keypressVibration = false; + field.addEventListener('input',()=> { + if (!session) return; + session.dirty = true; session.advanced = false; + try { document.getElementById('formulaInput').value = value(); } catch (_) { /* Commit reports row validation. */ } + }); + document.getElementById('formulaInput').addEventListener('input',()=> { + if (!session) return; + const source=document.getElementById('formulaInput').value; + open(source,session.node,false); + session.advanced=true; + }); + field.addEventListener('keydown',event=> { + if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) { + event.preventDefault(); event.stopPropagation(); document.getElementById('btnInsertFormula').click(); + } + }); + } + root.VisualMath = {split,combine,safe,unwrap,mathValue,open,value,initialize, + close(){session=null;}, insert(latex){ + if (!session || session.field.readOnly) return false; + session.field.insert(latex.replace(/\{\}/g,'{#?}'),{selectionMode:'placeholder'}); session.dirty=true; session.advanced=false; + session.field.focus(); return true; + }}; + root.renderVisualMath = render; + if (typeof module !== 'undefined') module.exports=root.VisualMath; +})(typeof globalThis !== 'undefined' ? globalThis : window); diff --git a/visual-references-ui.css b/visual-references-ui.css new file mode 100644 index 0000000..cf980b4 --- /dev/null +++ b/visual-references-ui.css @@ -0,0 +1,21 @@ +.editor-area .tex-cmd[data-visual-reference] { + display: inline-block; max-width: 100%; box-sizing: border-box; vertical-align: baseline; + padding: 2px 6px; border: 1px solid #d1dfe4; border-radius: 5px; + background: #eef5f7; color: #285363; font-family: inherit; font-size: .85em; + line-height: 1.8; white-space: normal; overflow-wrap: anywhere; cursor: pointer; + -webkit-user-select: none; user-select: none; box-decoration-break: clone; +} +.editor-area .tex-cmd[data-visual-reference="label"] { background: #f4f1e6; border-color: #e1d9b9; color: #6c591d; } +.editor-area .tex-cmd[data-visual-reference="citation"] { background: #eef3eb; border-color: #d5e1cc; color: #3e5f31; } +.editor-area .tex-cmd[data-visual-reference]:focus-visible { outline: 2px solid #157f91; outline-offset: 3px; } +.editor-area .tex-cmd[data-visual-reference]:hover { filter: brightness(.97); } +.editor-area .tex-cmd[data-visual-reference][role="note"] { cursor: default; } +#referenceModal[hidden] { display: none; } +.reference-dialog { width: min(560px, 100%); } +.reference-dialog .reference-hint { margin: 0 0 20px; color: #586b76; line-height: 1.65; } +.reference-dialog label { margin: 16px 0 7px; font-size: 14px; font-weight: 600; } +.reference-dialog select { width: 100%; min-height: 42px; padding: 8px 11px; border: 1px solid #91a3b1; border-radius: 6px; background: #fff; color: #203447; font: inherit; } +.reference-dialog select:disabled { color: #687780; background: #f4f6f7; } +.reference-dialog .reference-error { min-height: 1.5em; margin: 10px 0 0; color: #ae3232; font-size: 14px; } +.reference-dialog input[aria-invalid="true"] { border-color: #ae3232; } +.reference-dialog #referenceAccept { background: #20576b; border-color: #20576b; color: #fff; } diff --git a/visual-references-ui.js b/visual-references-ui.js new file mode 100644 index 0000000..2d3a1d8 --- /dev/null +++ b/visual-references-ui.js @@ -0,0 +1,158 @@ +/* Visual reference atoms keep their TeX source separate from their presentation. */ +(function(root) { + 'use strict'; + const names = {citation: '文献引用', reference: '交叉引用', label: '标签', include: '子文件', bibliography: '参考文献文件', style: '参考文献样式'}; + const symbols = {citation: '文献', reference: '引用', label: '标签', include: '文件', bibliography: '文献表', style: '样式'}; + + function decorate(node, app) { + const source = node.getAttribute('data-tex-source') || node.textContent; + const description = root.VisualReferences.describe(source, app.model); + if (!description) return null; + node.setAttribute('data-tex-source', source); + node.setAttribute('data-visual-reference', description.kind); + node.setAttribute('contenteditable', 'false'); + node.setAttribute('role', description.editable === false ? 'note' : 'button'); + if (description.editable === false) node.removeAttribute('tabindex'); + else node.setAttribute('tabindex', '0'); + const label = description.label || description.key || names[description.kind]; + const detail = description.detail || label; + node.setAttribute('aria-label', names[description.kind] + ':' + detail + (description.editable === false ? '' : ',点击编辑')); + node.setAttribute('title', detail + (description.editable === false ? '' : ' · 点击或按 Enter 编辑')); + // Replacing child text on every keystroke would disturb a selection next + // to the atom. Only refresh when the derived presentation changes. + const presentation = symbols[description.kind] + ' ' + label; + if (node.textContent !== presentation) node.textContent = presentation; + return description; + } + + root.renderVisualReferences = function(editor, app) { + if (!root.VisualReferences) return; + for (const node of editor.querySelectorAll('.tex-cmd')) decorate(node, app); + }; + + root.initVisualReferences = function(app, editor, {insertSource} = {}) { + const $ = id => document.getElementById(id); + const overlay = $('referenceModal'); + if (!overlay || !root.VisualReferences) return null; + const input = $('referenceKeys'); + const choice = $('referenceChoice'); + const accept = $('referenceAccept'); + const cancel = $('referenceCancel'); + const error = $('referenceError'); + let pending = null; + + function finish() { + if (!pending) return; + const current = pending; + pending = null; + overlay.hidden = true; + current.background.forEach((node, index) => { if (!current.wasInert[index]) node.removeAttribute('inert'); }); + current.previousFocus?.focus(); + } + function open({node = null, command = null} = {}) { + if (pending) return false; + app.sync(); + const source = node ? node.getAttribute('data-tex-source') || node.textContent : '\\' + command + '{new}'; + const description = root.VisualReferences.describe(source, app.model); + if (!description || description.editable === false) return false; + if (node && (app.mode !== 'visual' || !editor.contains(node))) return false; + const choices = root.VisualReferences.getChoices(description.kind, app.model); + const visual = app.mode === 'visual'; + if (visual) saveEditorSelection(); + const background = Array.from(document.body.childNodes).filter(item => item.nodeType === 1 && item !== overlay); + pending = {node, source, description, model: app.model, path: app.model.activePath, visual, + selection: visual && savedSelection ? savedSelection.cloneRange() : null, + start: app.ui.sourceArea.selectionStart, end: app.ui.sourceArea.selectionEnd, + previousFocus: document.activeElement, background, wasInert: background.map(item => item.getAttribute('inert') !== null)}; + $('referenceTitle').textContent = (node ? '编辑' : '插入') + names[description.kind]; + $('referenceKeysLabel').textContent = description.kind === 'citation' ? '文献键(多个键用逗号分隔)' + : description.kind === 'include' || description.kind === 'bibliography' ? '文件路径' + : description.kind === 'style' ? '样式名称' : '标签名称'; + $('referenceHint').textContent = description.kind === 'citation' ? '选择已有文献,或直接输入文献键。已有的前注和后注会保留。' + : description.kind === 'label' ? '为当前位置设置标签,其他位置可通过交叉引用选择它。' + : description.kind === 'reference' ? '选择项目中的标签,或输入标签名称。引用编号由编译结果确定。' + : '从项目中选择,或直接输入名称;保存后会同步更新文档。'; + input.value = node ? description.key : description.kind === 'label' ? 'sec:new' : choices[0]?.value || ''; + const placeholder = document.createElement('option'); + placeholder.value = ''; placeholder.textContent = choices.length ? '选择已有项目…' : '项目中暂无可选项,请直接输入'; + choice.replaceChildren(placeholder); + for (const item of choices) { + const option = document.createElement('option'); + option.value = item.value; option.textContent = item.label + (item.label.includes(item.value) ? '' : ' · ' + item.value); + if (item.detail) option.title = item.detail; + choice.appendChild(option); + } + choice.value = ''; choice.disabled = choices.length === 0; + error.textContent = ''; input.removeAttribute('aria-invalid'); + background.forEach(item => item.setAttribute('inert', '')); + overlay.hidden = false; + input.focus(); input.select(); + return true; + } + function save() { + if (!pending) return; + try { + const current = pending; + if (app.model !== current.model || app.model.activePath !== current.path || (app.mode === 'visual') !== current.visual + || (current.node && !editor.contains(current.node))) throw new Error('文档已改变,请关闭弹窗后重新选择要编辑的位置。'); + const source = root.VisualReferences.rewrite(current.source, {key: input.value.trim()}); + if (current.node) { + if (source !== current.source) { + current.node.setAttribute('data-tex-source', source); + decorate(current.node, app); + app.changed(false); app.persist(); + } + finish(); + current.node.focus(); + } else if (current.visual) { + // Restore the pre-dialog range, not the dialog input's selection. + savedSelection = current.selection; + restoreEditorSelection(); + const node = document.createElement('span'); + node.className = 'tex-cmd'; node.setAttribute('data-tex-source', source); + decorate(node, app); + if (!insertNodeAtCursor(node)) throw new Error('无法定位插入位置,请在文档中选择位置后重试。'); + app.changed(false); app.persist(); finish(); editor.focus(); + } else { + insertSource(source, current.start, current.end); finish(); app.ui.sourceArea.focus(); + } + } catch (cause) { + error.textContent = cause.message; + input.setAttribute('aria-invalid', 'true'); input.focus(); + } + } + choice.addEventListener('change', () => { + if (!pending || !choice.value) return; + if (pending.description.kind === 'citation') { + const keys = input.value.split(',').map(key => key.trim()).filter(Boolean); + if (!keys.includes(choice.value)) keys.push(choice.value); + input.value = keys.join(','); + } else input.value = pending.description.command.replace(/\*$/, '').toLowerCase() === 'bibliography' + ? choice.value.replace(/\.bib$/i, '') : choice.value; + choice.value = ''; input.focus(); + }); + accept.addEventListener('click', save); + cancel.addEventListener('click', finish); + overlay.addEventListener('keydown', event => { + event.stopPropagation(); + if (event.key === 'Escape') { event.preventDefault(); finish(); } + else if (event.key === 'Enter' && event.target === input && !event.isComposing) { event.preventDefault(); save(); } + else if (event.key === 'Tab') { + const controls = [...(choice.disabled ? [] : [choice]), input, cancel, accept]; + const index = controls.indexOf(document.activeElement); + event.preventDefault(); controls[(index + (event.shiftKey ? -1 : 1) + controls.length) % controls.length].focus(); + } + }); + function activate(event) { + const token = event.target.closest?.('.tex-cmd'); + if (token && editor.contains(token) && open({node: token})) { + event.preventDefault(); event.stopPropagation(); + } + } + editor.addEventListener('click', activate); + editor.addEventListener('keydown', event => { + if ((event.key === 'Enter' || event.key === ' ') && !event.isComposing) activate(event); + }); + return {open: node => open({node}), insert: command => open({command})}; + }; +})(globalThis); diff --git a/visual-references.js b/visual-references.js new file mode 100644 index 0000000..4cbb091 --- /dev/null +++ b/visual-references.js @@ -0,0 +1,326 @@ +/* Semantic reference labels and lossless edits. All output is plain text, never HTML. */ +(function (global) { + 'use strict'; + + const citations = new Set(['cite', 'citep', 'citet', 'citealp', 'citealt', 'citeauthor', 'citeyear', 'citeyearpar', + 'autocite', 'parencite', 'textcite', 'nocite', 'footcite', 'footcitetext', 'smartcite', 'supercite', 'fullcite']); + const references = new Set(['ref', 'eqref', 'autoref', 'pageref', 'nameref', 'cref', 'vref', 'vpageref']); + const headings = new Set(['part', 'chapter', 'section', 'subsection', 'subsubsection', 'paragraph', 'subparagraph']); + const verbatim = new Set(['verbatim', 'Verbatim', 'lstlisting', 'minted', 'comment']); + const cache = new WeakMap(); + + function skipTrivia(text, start) { + let i = start; + while (i < text.length) { + if (/\s/.test(text[i])) { i++; continue; } + if (text[i] === '%') { const end = text.indexOf('\n', i); i = end < 0 ? text.length : end + 1; continue; } + break; + } + return i; + } + + function group(text, start, open = '{', close = '}') { + if (text[start] !== open) return null; + let depth = 1; + let braces = 0; + for (let i = start + 1; i < text.length; i++) { + if (text[i] === '\\') { i++; continue; } + if (text[i] === '%') { const end = text.indexOf('\n', i); if (end < 0) return null; i = end; continue; } + if (open === '[') { + if (text[i] === '{') { braces++; continue; } + if (text[i] === '}') { if (--braces < 0) return null; continue; } + if (braces) continue; + } + if (text[i] === open) depth++; + else if (text[i] === close && --depth === 0) return {start, end: i + 1, content: text.slice(start + 1, i)}; + } + return null; + } + + function commandAt(text, start) { + if (text[start] !== '\\') return null; + const match = /^\\([A-Za-z@]+\*?|[^\r\n])/.exec(text.slice(start)); + return match ? {command: match[1], name: match[1].replace(/\*$/, '').toLowerCase(), end: start + match[0].length} : null; + } + + function kindOf(name) { + if (citations.has(name)) return 'citation'; + if (references.has(name)) return 'reference'; + if (name === 'label') return 'label'; + if (name === 'input' || name === 'include') return 'include'; + if (['bibliography', 'addbibresource', 'printbibliography'].includes(name)) return 'bibliography'; + if (name === 'bibliographystyle') return 'style'; + return null; + } + + function parse(source) { + if (typeof source !== 'string') return null; + const token = commandAt(source, skipTrivia(source, 0)); + if (!token) return null; + const kind = kindOf(token.name); + if (!kind) return null; + let i = skipTrivia(source, token.end); + const options = []; + while (source[i] === '[') { + const option = group(source, i, '[', ']'); + if (!option) return null; + options.push(option); + i = skipTrivia(source, option.end); + } + const argument = token.name === 'printbibliography' ? null : group(source, i); + if (!argument && token.name !== 'printbibliography') return null; + if (skipTrivia(source, argument ? argument.end : i) !== source.length) return null; + const key = argument ? argument.content.trim() : ''; + const multi = kind === 'citation' || token.name === 'bibliography' || ['cref', 'vref'].includes(token.name); + return {...token, kind, options, argument, key, keys: multi ? key.split(',').map(value => value.trim()).filter(Boolean) : key ? [key] : [], multi}; + } + + // This is a readable metadata approximation, not expansion of arbitrary TeX macros. + function plainText(text) { + return String(text || '').replace(/\\(?:[A-Za-z@]+\*?|.)|%[^\r\n]*/g, token => token[0] === '%' ? '' : token).replace(/\\([%&#_$])/g, '$1') + .replace(/\\(?:LaTeX|TeX)\b/g, match => match.slice(1)).replace(/\\[A-Za-z@]+\*?/g, '') + .replace(/\\["'`^~=.]\s*/g, '').replace(/[{}$]/g, '').replace(/\\ /g, ' ').replace(/~/g, ' ') + .replace(/\s+/g, ' ').trim(); + } + + function scanLabels(text, path, output) { + let title = ''; + const environments = []; + let mathDelimiter = ''; + for (let i = 0; i < text.length;) { + if (text[i] === '%') { const end = text.indexOf('\n', i); i = end < 0 ? text.length : end + 1; continue; } + if (text[i] !== '\\') { i++; continue; } + const offset = i; + const token = commandAt(text, i); + if (!token) { i++; continue; } + i = token.end; + if (token.command === '[' || token.command === '(') mathDelimiter = token.command; + else if ((token.command === ']' && mathDelimiter === '[') || (token.command === ')' && mathDelimiter === '(')) mathDelimiter = ''; + if (token.name === 'verb' || token.name === 'lstinline') { + if (token.name === 'lstinline') { + const option = group(text, skipTrivia(text, i), '[', ']'); + if (option) i = option.end; + } + const delimiter = text[i]; + if (delimiter && !/\s/.test(delimiter)) { + const end = text.indexOf(delimiter, i + 1); + const newline = text.indexOf('\n', i + 1); + i = end >= 0 && (newline < 0 || end < newline) ? end + 1 : newline < 0 ? text.length : newline + 1; + } + continue; + } + let cursor = skipTrivia(text, i); + while (text[cursor] === '[') { + const option = group(text, cursor, '[', ']'); + if (!option) break; + cursor = skipTrivia(text, option.end); + } + const argument = group(text, cursor); + if (!argument) continue; + if (token.name === 'begin' && verbatim.has(argument.content)) { + const closing = '\\end{' + argument.content + '}'; + const end = text.indexOf(closing, argument.end); + i = end < 0 ? text.length : end + closing.length; + } else if (token.name === 'begin') { + environments.push(argument.content); + i = argument.end; + } else if (token.name === 'end') { + if (environments[environments.length - 1] === argument.content) environments.pop(); + i = argument.end; + } else if (headings.has(token.name)) { + title = plainText(argument.content); + i = argument.end; + } else if (token.name === 'label') { + const key = argument.content.trim(); + const equation = !!mathDelimiter || environments.some(name => /^(?:equation|align|alignat|flalign|gather|multline|displaymath|math)\*?$/.test(name)); + if (key) output.push({key, path, offset, title, equation}); + i = argument.end; + } + } + } + + function bibEntry(text, start, close) { + let depth = 0; + let quoted = false; + for (let i = start; i < text.length; i++) { + if (text[i] === '\\') { i++; continue; } + if (!quoted && text[i] === '%') { const end = text.indexOf('\n', i); if (end < 0) return null; i = end; continue; } + if (text[i] === '"' && depth === 0) { quoted = !quoted; continue; } + if (text[i] === '{') depth++; + else if (text[i] === '}' && depth) depth--; + else if (!depth && !quoted && text[i] === close) return {content: text.slice(start, i), end: i + 1}; + } + return null; + } + + function splitBibFields(text) { + // Comments can contain arbitrary braces/commas; remove them before splitting fields. + let clean = ''; + let commentDepth = 0; + let commentQuoted = false; + for (let i = 0; i < text.length; i++) { + if (text[i] === '\\') { clean += text.slice(i, i + 2); i++; continue; } + if (text[i] === '%' && !commentQuoted) { + const end = text.indexOf('\n', i); + if (end < 0) break; + clean += '\n'; + i = end; + continue; + } + if (text[i] === '"' && !commentDepth) commentQuoted = !commentQuoted; + if (text[i] === '{') commentDepth++; + else if (text[i] === '}') commentDepth--; + clean += text[i]; + } + text = clean; + const fields = []; + let depth = 0; + let quoted = false; + let start = 0; + for (let i = 0; i < text.length; i++) { + if (text[i] === '\\') { i++; continue; } + if (text[i] === '"' && depth === 0) quoted = !quoted; + else if (text[i] === '{') depth++; + else if (text[i] === '}') depth--; + else if (text[i] === ',' && !depth && !quoted) { fields.push(text.slice(start, i)); start = i + 1; } + } + fields.push(text.slice(start)); + return fields; + } + + function scanBibliography(text, path, output) { + for (let i = 0; i < text.length;) { + if (text[i] === '%') { const end = text.indexOf('\n', i); i = end < 0 ? text.length : end + 1; continue; } + if (text[i] !== '@') { i++; continue; } + const match = /^@([A-Za-z]+)\s*([{(])/.exec(text.slice(i)); + if (!match) { i++; continue; } + const offset = i; + const entry = bibEntry(text, i + match[0].length, match[2] === '{' ? '}' : ')'); + if (!entry) { i += match[0].length; continue; } + i = entry.end; + const type = match[1].toLowerCase(); + if (['comment', 'preamble', 'string'].includes(type)) continue; + const fields = splitBibFields(entry.content); + const key = fields.shift().trim(); + if (!key) continue; + const metadata = {}; + for (const field of fields) { + const pair = /^\s*([A-Za-z]+)\s*=\s*([\s\S]*)$/.exec(field); + if (!pair) continue; + const name = pair[1].toLowerCase(); + if (!['author', 'title', 'year', 'date'].includes(name)) continue; + const value = pair[2].trim().replace(/^"([\s\S]*)"$/, '$1'); + metadata[name] = plainText(value); + } + output.push({key, path, offset, type, ...metadata}); + } + } + + function projectFiles(model) { + if (!model) return []; + const files = typeof model.list === 'function' ? model.list() : Array.isArray(model.files) ? model.files : []; + return files.filter(file => file && typeof file.path === 'string' && typeof file.text === 'string' && file.kind !== 'binary'); + } + + function index(model) { + const files = projectFiles(model); + const previous = model && typeof model === 'object' ? cache.get(model) : null; + if (previous && previous.files.length === files.length && files.every((file, i) => file.path === previous.files[i].path && file.text === previous.files[i].text)) return previous; + const result = {files, labels: [], bibliography: []}; + for (const file of files) { + if (/\.(?:tex|latex|ltx|sty|cls)$/i.test(file.path)) scanLabels(file.text, file.path, result.labels); + else if (/\.bib$/i.test(file.path)) scanBibliography(file.text, file.path, result.bibliography); + } + if (model && typeof model === 'object') cache.set(model, result); + return result; + } + + function bibLabel(entry) { + return [entry.author, entry.title].filter(Boolean).join(' — ') || entry.key; + } + + function describe(source, model) { + const token = parse(source); + if (!token) return null; + const entries = index(model); + const result = {kind: token.kind, command: token.command, cmd: token.command, key: token.key, keys: token.keys, + options: token.options.map(option => option.content), label: '', detail: '', editable: !!token.argument}; + if (token.kind === 'citation') { + const found = token.keys.map(key => entries.bibliography.filter(entry => entry.key === key)); + result.label = token.name === 'nocite' && token.key === '*' ? '收录全部参考文献' : token.keys.map((key, i) => found[i].length === 1 ? bibLabel(found[i][0]) : found[i].length > 1 ? '文献键重复:' + key : '文献:' + key).join(';'); + result.detail = token.keys.map((key, i) => found[i].length === 1 ? [key, found[i][0].year || found[i][0].date, found[i][0].path].filter(Boolean).join(' · ') : key === '*' && token.name === 'nocite' ? '将文献库中全部条目加入参考文献列表' : (found[i].length ? '存在重复文献键:' : '未找到文献:') + key).join(';'); + if (token.name === 'nocite' && token.key !== '*') result.label = '收录文献:' + result.label; + } else if (token.kind === 'reference' || token.kind === 'label') { + const found = token.keys.map(key => entries.labels.filter(entry => entry.key === key)); + const titles = token.keys.map((key, i) => found[i].length === 1 ? found[i][0].equation ? '公式:' + key : found[i][0].title || key : key); + if (token.kind === 'label') result.label = '标签:' + token.key; + else if (['pageref', 'vpageref'].includes(token.name)) result.label = titles.join('、') + ' · 页码待编译'; + else if (token.name === 'eqref') result.label = '公式:' + token.keys.join('、'); + else result.label = titles.join('、') || '未设置引用'; + result.detail = token.keys.map((key, i) => found[i].length === 1 ? [key, found[i][0].title, found[i][0].path].filter(Boolean).join(' · ') : (found[i].length ? '存在重复标签:' : '未找到标签:') + key).join(';'); + } else if (token.kind === 'include') { + result.label = '引入文件:' + token.key; + result.detail = token.name === 'include' ? '独立章节文件,编译时前后分页' : '在当前位置插入文件内容'; + } else if (token.kind === 'bibliography') { + result.label = token.name === 'printbibliography' ? '参考文献列表' : '文献库:' + token.keys.join('、'); + result.detail = token.name === 'printbibliography' ? '编译后显示文献列表' : '用于解析正文引用的参考文献文件'; + } else { + result.label = '文献样式:' + token.key; + result.detail = '控制参考文献的排序与显示格式'; + } + return result; + } + + function getChoices(kind, model) { + const entries = index(model); + if (kind === 'citation') return entries.bibliography.map(entry => ({value: entry.key, label: bibLabel(entry), detail: [entry.key, entry.year || entry.date, entry.path].filter(Boolean).join(' · '), path: entry.path})); + if (kind === 'reference' || kind === 'label') return entries.labels.map(entry => ({value: entry.key, label: entry.equation ? '公式:' + entry.key : entry.title || entry.key, detail: [entry.key, entry.title, entry.path].filter(Boolean).join(' · '), path: entry.path})); + if (kind === 'include' || kind === 'bibliography') return entries.files.filter(file => kind === 'include' ? /\.(?:tex|latex|ltx)$/i.test(file.path) : /\.bib$/i.test(file.path)).map(file => ({value: file.path, label: file.path, detail: kind === 'include' ? '项目章节文件' : '项目文献库', path: file.path})); + if (kind === 'style') return ['plain', 'unsrt', 'alpha', 'abbrv'].map(value => ({value, label: value, detail: 'BibTeX 文献样式'})); + return []; + } + + function validateKeys(values, token) { + if (!values.length || values.some(value => typeof value !== 'string' || !value.trim())) throw new Error('引用键不能为空'); + if (!token.multi && values.length !== 1) throw new Error('此命令只接受一个键'); + return values.map(value => { + const key = value.trim(); + if (/[\\{}\[\],%#$&^~\u0000-\u001f\u007f]/.test(key) || (['citation', 'reference', 'label', 'style'].includes(token.kind) && /\s/.test(key))) throw new Error('引用键不能包含空白、括号、反斜杠或 LaTeX 控制字符'); + if (key.includes('*') && !(token.name === 'nocite' && key === '*')) throw new Error('此命令不支持通配符'); + return key; + }); + } + + function rewrite(source, changes = {}) { + const token = parse(source); + if (!token || !token.argument) throw new Error('此命令不能通过引用编辑器修改'); + const patches = []; + const changedKey = Object.prototype.hasOwnProperty.call(changes, 'keys') || Object.prototype.hasOwnProperty.call(changes, 'key'); + if (changedKey) { + const supplied = Object.prototype.hasOwnProperty.call(changes, 'keys') ? changes.keys : changes.key; + if (!Array.isArray(supplied) && typeof supplied !== 'string') throw new Error('引用键必须是文本'); + const values = validateKeys(Array.isArray(supplied) ? supplied : token.multi ? supplied.split(',') : [supplied], token); + if (values.length !== token.keys.length || values.some((value, i) => value !== token.keys[i])) { + const content = token.argument.content; + patches.push({start: token.argument.start + 1, end: token.argument.end - 1, value: /^\s*/.exec(content)[0] + values.join(', ') + /\s*$/.exec(content)[0]}); + } + } + if (Object.prototype.hasOwnProperty.call(changes, 'options')) { + if (!Array.isArray(changes.options)) throw new Error('可选注必须是文本数组'); + for (const option of changes.options) { + if (typeof option !== 'string') throw new Error('可选注必须是文本'); + const parsed = group('[' + option + ']', 0, '[', ']'); + if (!parsed || parsed.end !== option.length + 2) throw new Error('可选注包含不匹配的括号'); + } + const shared = Math.min(changes.options.length, token.options.length); + for (let i = 0; i < shared; i++) if (changes.options[i] !== token.options[i].content) patches.push({start: token.options[i].start + 1, end: token.options[i].end - 1, value: changes.options[i]}); + for (let i = shared; i < token.options.length; i++) patches.push({start: token.options[i].start, end: token.options[i].end, value: ''}); + if (changes.options.length > shared) patches.push({start: token.argument.start, end: token.argument.start, value: changes.options.slice(shared).map(option => '[' + option + ']').join('')}); + } + let result = source; + for (const patch of patches.sort((a, b) => b.start - a.start)) result = result.slice(0, patch.start) + patch.value + result.slice(patch.end); + return result; + } + + global.VisualReferences = Object.freeze({describe, getChoices, rewrite}); +})(globalThis); diff --git a/workspace.js b/workspace.js index 88b0b5d..d627c6c 100644 --- a/workspace.js +++ b/workspace.js @@ -324,6 +324,7 @@ function initWorkspace() { updatePreview = function() { if (!app.loading) { app.changed(false); scheduleSave(); } }; saveDraft = function() { return !app.loading && app.persist(); }; initFormulaModal(); + const referenceEditor = globalThis.initVisualReferences?.(app, editorArea, {insertSource: sourceEdit}); editorArea.addEventListener('mouseup', saveEditorSelection); editorArea.addEventListener('keyup', saveEditorSelection); editorArea.addEventListener('input', safely(() => { app.changed(true); scheduleSave(); })); @@ -381,7 +382,28 @@ function initWorkspace() { $('referenceList').replaceChildren(); const refs = app.model.references(); for (const item of [...refs.labels, ...refs.bibliography, ...refs.citations, ...(refs.references || [])]) { - $('referenceList').appendChild(button(item.key + ' · ' + item.path, () => jump(item.path, item.offset), 'reference-item')); + $('referenceList').appendChild(button(item.key + ' · ' + item.path, () => { + app.switchFile(item.path); + if (referenceEditor && app.mode === 'visual') { + const source = app.model.get().text; + const offset = source.slice(0, item.offset).replace(/\r\n?/g, '\n').length; + const token = Array.from(editorArea.querySelectorAll('.tex-cmd')).find(node => locateWorkspaceToken(editorArea, node, source) === offset); + if (token && referenceEditor.open(token)) { app.revealEditor?.(); return; } + if (refs.labels.includes(item)) { + const formula = Array.from(editorArea.querySelectorAll('.formula-inline, .formula-block')).find(node => { + const latex = node.getAttribute('data-formula') || ''; + const labels = globalThis.VisualMath?.split ? globalThis.VisualMath.split(latex).metadata + : Array.from(latex.matchAll(/\\label\s*\{([^{}\s]+)\}/g), match => ({kind: 'label', value: match[1]})); + return labels.some(entry => entry.kind === 'label' && entry.value === item.key); + }); + if (formula) { + openFormulaModal(formula.classList.contains('formula-block') ? 'block' : 'inline', formula); + app.revealEditor?.(); return; + } + } + } + jump(item.path, item.offset); + }, 'reference-item')); } if (!$('referenceList').childNodes.length) $('referenceList').textContent = '添加 \\label 或 BibTeX 条目后,可在这里定位。'; } @@ -389,6 +411,10 @@ function initWorkspace() { const file = app.model.get(); const text = file && file.kind === 'text'; const language = file ? ProjectModel.language(file.path) : 'text'; + if (app.mode === 'visual') { + globalThis.renderVisualReferences?.(editorArea, app); + globalThis.renderVisualMath?.(editorArea); + } $('currentPath').textContent = file ? file.path : '选择或新建文件'; $('languageBadge').textContent = file && file.kind === 'binary' ? '资源' : {latex: 'LaTeX', bibtex: 'BibTeX', postscript: 'PostScript', text: '文本'}[language]; // An editor render can happen before a name input loses focus and emits @@ -485,6 +511,7 @@ function initWorkspace() { editorArea.addEventListener('dblclick', safely(event => { const token = event.target.closest && event.target.closest('.tex-cmd'); if (!token) return; + if (referenceEditor && globalThis.VisualReferences.describe(token.getAttribute('data-tex-source') || token.textContent, app.model)) return; app.sync(); const source = convertNodeToLatex(token).replace(/\r\n?/g, '\n'); const offset = locateWorkspaceToken(editorArea, token, app.model.get().text); @@ -496,6 +523,7 @@ function initWorkspace() { })); async function insertReference(kind) { + if (referenceEditor) { referenceEditor.insert(kind); return; } app.setMode('source', {remember: false}); const refs = app.model.references(); const first = kind === 'cite' ? refs.bibliography[0] : refs.labels[0]; From 8f11a3a0c2c1eb7a87f7596b336735e88c7d3b0c Mon Sep 17 00:00:00 2001 From: nisconder <2129048448@qq.com> Date: Wed, 28 Oct 2026 14:22:29 +0800 Subject: [PATCH 6/7] Refine the typesetting workspace and focused editing dialogs --- .github/workflows/build.yml | 2 +- .github/workflows/deploy-pages.yml | 2 +- README.en.md | 4 + README.md | 4 + index.html | 49 +++--- screenshots/studio-formula.jpg | Bin 0 -> 48713 bytes screenshots/studio-workspace.jpg | Bin 0 -> 88197 bytes server.mjs | 3 +- studio-dialogs.css | 236 ++++++++++++++++++++++++++++ studio.css | 202 ++++++++++++++++++++++++ tests/browser-acceptance.md | 2 + tests/helpers/workspace-fixture.mjs | 70 +++++++-- tests/server.test.mjs | 3 +- tests/visual-math-ui.test.mjs | 53 +++++++ tests/workspace-markup.test.mjs | 3 +- visual-math.js | 2 +- visual-references-ui.js | 4 +- 17 files changed, 599 insertions(+), 40 deletions(-) create mode 100644 screenshots/studio-formula.jpg create mode 100644 screenshots/studio-workspace.jpg create mode 100644 studio-dialogs.css create mode 100644 studio.css diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 86700e0..38734a7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: $tag = $env:GITHUB_REF_NAME $name = "VisualLaTeX-$tag" New-Item -ItemType Directory -Path $name -Force | Out-Null - Copy-Item index.html, style.css, workspace.css, preview.css, visual-math.css, visual-references-ui.css, main.js, workspace.js, project-model.js, project-archive.js, preview.js, visual-math.js, visual-references.js, visual-references-ui.js, compiler.mjs, pdf-preview.mjs, server.mjs, start.ps1, setup-windows.ps1, LICENSE, README.md, README.en.md -Destination $name + Copy-Item index.html, style.css, workspace.css, preview.css, visual-math.css, visual-references-ui.css, studio.css, studio-dialogs.css, main.js, workspace.js, project-model.js, project-archive.js, preview.js, visual-math.js, visual-references.js, visual-references-ui.js, compiler.mjs, pdf-preview.mjs, server.mjs, start.ps1, setup-windows.ps1, LICENSE, README.md, README.en.md -Destination $name Copy-Item vendor -Destination $name -Recurse Copy-Item screenshots -Destination $name -Recurse Copy-Item tests -Destination $name -Recurse diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index ba8bc20..5315545 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -41,7 +41,7 @@ jobs: - name: 准备静态编辑器 run: | mkdir site - cp index.html style.css workspace.css preview.css visual-math.css visual-references-ui.css main.js workspace.js project-model.js project-archive.js preview.js visual-math.js visual-references.js visual-references-ui.js LICENSE site/ + cp index.html style.css workspace.css preview.css visual-math.css visual-references-ui.css studio.css studio-dialogs.css main.js workspace.js project-model.js project-archive.js preview.js visual-math.js visual-references.js visual-references-ui.js LICENSE site/ cp -R vendor site/ - name: 上传站点产物 diff --git a/README.en.md b/README.en.md index 509bef7..6baae74 100644 --- a/README.en.md +++ b/README.en.md @@ -2,6 +2,10 @@ **Import a document, edit it visually, then export—with multiple files, PostScript and local PDF compilation.** +The workspace centers the manuscript, with compact editing and compile controls, consistent icons, paper typography, and focused dialogs. Formula confirmation stays visible in the dialog footer. + +![VisualLaTeX Studio](screenshots/studio-workspace.jpg) + This workspace edition continues [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX)'s purpose of visually modifying existing LaTeX documents, adding full source access, multiple files, references, bibliography entries, ZIP projects and real compilation. It bundles MathLive 0.111.1 (MIT) and its fonts for formula editing. Offline editing needs no npm installation or build step. Compilation uses Node.js 22+ and a local typesetting toolchain. **Complete LaTeX documents open in Visual editing by default.** Edit text and headings directly and use the formatting toolbar. Click a typeset formula to edit fractions, superscripts and subscripts in a graphical math field. References and labels appear as readable items that open an editor when clicked, without switching to source. Untouched source stays intact, and the current session remembers the selected editing mode for each file. diff --git a/README.md b/README.md index a06a259..ca719d7 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ **导入文档,直接可视化修改,再导出——支持多文件、PostScript 与本机 PDF 编译。** +界面以文稿为中心:宽屏合并工具与编译操作,统一图标、纸面排版和编辑弹窗;公式确认按钮固定在弹窗底部。 + +![VisualLaTeX Studio](screenshots/studio-workspace.jpg) + 这是基于 [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) 的独立工作区版本,延续可视化修改现有 LaTeX 文档的用途,并增加完整源码、多文件项目、参考文献、ZIP 管理及真实编译。公式编辑内置 MathLive 0.111.1(MIT)及其字体,无需 npm 安装或构建即可离线编辑;编译需要 Node.js 22+ 和相应工具链。 **完整 LaTeX 文档默认进入「可视化编辑」。** 直接修改文字和标题,用工具栏调整格式;单击排版后的公式,使用图形输入框编辑分式、上下标等内容。引用和标签显示为可读条目,单击即可修改,无需切换源码。只修改需要改动的内容,保留其余源码;切换文件会记住当前会话中为各文件选择的编辑模式。 diff --git a/index.html b/index.html index 3cc60f2..0e3fe35 100644 --- a/index.html +++ b/index.html @@ -9,11 +9,14 @@ + +
    +

    VisualLaTeX Studio

    TeX PS
    @@ -22,18 +25,18 @@

    VisualLaTeX Studio

    - - - + + +
    @@ -63,9 +66,9 @@

    VisualLaTeX Studio

    - + 本机编译 - +
    @@ -84,7 +87,7 @@

    项目文件

    - +
    @@ -124,7 +127,7 @@

    项目文件

    -
    直接修改文字与标题;点击公式、文献引用或标签即可编辑,按 Enter 也可打开。
    +
    点击文字、公式或引用,直接编辑
    @@ -155,7 +158,7 @@

    项目资源

    - + @@ -220,18 +223,18 @@

    PDF 预览

    -

    直接点击公式中的数字、分子、分母或上下标修改;上方按钮可插入数学结构。

    +
    高级 LaTeX 输入(可选)
    - + diff --git a/screenshots/studio-formula.jpg b/screenshots/studio-formula.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e49c9cc6dbf27187b3ed25a74d14ca85aafdaa8 GIT binary patch literal 48713 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 N+4gdzRMY;*KLNJM-i-hN literal 0 HcmV?d00001 diff --git a/screenshots/studio-workspace.jpg b/screenshots/studio-workspace.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61c8f54d41605f2e5922067eadb192802622522c GIT binary patch literal 88197 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

    No*a+x8&_?lKP#kb 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 z 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 ['/' + name, [name, 'text/javascript; charset=utf-8']]), - ...['style.css', 'workspace.css', 'preview.css', 'visual-math.css', 'visual-references-ui.css'] + ...['style.css', 'workspace.css', 'preview.css', 'visual-math.css', 'visual-references-ui.css', + 'studio.css', 'studio-dialogs.css'] .map(name => ['/' + name, [name, 'text/css; charset=utf-8']]), ...mathliveAssets ]); diff --git a/studio-dialogs.css b/studio-dialogs.css new file mode 100644 index 0000000..7026dd2 --- /dev/null +++ b/studio-dialogs.css @@ -0,0 +1,236 @@ +/* The editing tools are small, focused work surfaces above the document. */ +.workspace-app .modal-overlay, +.workspace-app .workspace-dialog-overlay { + padding: 24px; + background: rgb(28 34 53 / 36%); + backdrop-filter: blur(3px); + -webkit-backdrop-filter: blur(3px); +} + +.workspace-app .modal-dialog, +.workspace-app .workspace-dialog { + max-width: calc(100vw - 48px); + max-height: calc(100dvh - 48px); + border: 1px solid rgb(255 255 255 / 70%); + border-radius: 16px; + background: #fff; + color: #242733; + box-shadow: 0 24px 80px rgb(29 36 59 / 18%), 0 3px 12px rgb(29 36 59 / 8%); + font-family: "Segoe UI", "Microsoft YaHei", sans-serif; + animation: studio-dialog-enter 150ms ease-out both; +} + +.workspace-app .modal-dialog { width: 730px; max-width: min(730px, calc(100vw - 48px)); } +.workspace-app .modal-header { + flex: 0 0 auto; + min-height: 76px; + padding: 20px 26px; + border-bottom: 1px solid #e1e5ee; + background: #fff; + color: #242733; +} +.workspace-app .modal-title { font-size: 19px; font-weight: 650; letter-spacing: -.3px; } +.workspace-app .modal-title::before { + content: "ƒ"; + display: inline-grid; + place-items: center; + width: 33px; + height: 33px; + margin-right: 11px; + border-radius: 9px; + background: #eef0ff; + color: #4b5fdb; + font: italic 26px/1 Cambria, Georgia, serif; + vertical-align: middle; +} +.workspace-app .modal-close { + display: inline-grid; + place-items: center; + flex: 0 0 auto; + width: 34px; + min-height: 34px; + height: 34px; + padding: 0; + border: 0; + border-radius: 8px; + background: #f3f4f7; + color: #737b8c; + font-size: 23px; + font-weight: 400; + line-height: 1; +} +.workspace-app .modal-close:hover { background: #e9ecf4; color: #242733; } +.workspace-app .modal-body { padding: 22px 26px 24px; overscroll-behavior: contain; } + +.workspace-app .formula-mode-row { gap: 8px; margin: 0 0 16px; } +.workspace-app .mode-option { + gap: 7px; + padding: 7px 11px; + border: 1px solid transparent; + border-radius: 7px; + background: #f3f4f7; + color: #737b8c; + font-size: 12px; + line-height: 1.5; +} +.workspace-app .mode-option:has(input:checked) { border-color: #dce1fb; background: #eef0ff; color: #3f51bc; } +.workspace-app .mode-option input { margin: 0; accent-color: #4b5fdb; } +.workspace-app .mode-option:has(input:disabled) { cursor: default; } +.workspace-app .symbol-palette { + gap: 5px; + max-height: 148px; + margin: 0 0 18px; + padding: 9px; + border: 1px solid #e1e5ee; + border-radius: 10px; + background: #f8f9fc; + scrollbar-width: thin; +} +.workspace-app .symbol-palette button { + min-width: 33px; + min-height: 32px; + padding: 5px 9px; + border: 1px solid transparent; + border-radius: 6px; + background: #fff; + color: #485064; + box-shadow: 0 1px 2px rgb(32 39 58 / 5%); + font: 12px/1.5 "Segoe UI", "Microsoft YaHei", sans-serif; +} +.workspace-app .symbol-palette button:hover { + border-color: #dce1fb; + background: #eef0ff; + color: #3f51bc; +} +.workspace-app #formulaMathField { + min-height: 120px; + padding: 23px 20px; + border: 1px solid #d7dce8; + border-radius: 11px; + background: #fff; + color: #242733; + font-size: 29px; + outline: 0; + box-shadow: inset 0 1px 3px rgb(35 42 61 / 3%); + --caret-color: #4b5fdb; + --selection-background-color: #e0e5ff; + --selection-color: #242733; +} +.workspace-app #formulaMathField:focus, +.workspace-app #formulaMathField:focus-visible, +.workspace-app #formulaMathField:focus-within { + border-color: #6575df; + outline: 0; + box-shadow: 0 0 0 3px rgb(75 95 219 / 11%); +} +.workspace-app #formulaMathField::part(virtual-keyboard-toggle) { color: #737b8c; border-radius: 6px; } +.workspace-app .formula-help { margin: 11px 1px 16px; color: #737b8c; font-size: 12px; line-height: 1.75; } +.workspace-app #formulaMetadata { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; } +.workspace-app #formulaMetadata label { min-width: 0; margin: 0 0 12px; color: #555e71; font-size: 12px; font-weight: 550; line-height: 1.6; } +.workspace-app #formulaMetadata label:only-child { grid-column: 1 / -1; } +.workspace-app #formulaMetadata input, +.workspace-app .workspace-dialog input, +.workspace-app .workspace-dialog select, +.workspace-app #formulaInput { + box-sizing: border-box; + width: 100%; + min-height: 42px; + padding: 10px 12px; + border: 1px solid #d7dce8; + border-radius: 8px; + background: #fff; + color: #242733; + box-shadow: inset 0 1px 2px rgb(35 42 61 / 2%); + font: 13px/1.6 "Cascadia Code", Consolas, monospace; +} +.workspace-app #formulaMetadata input { margin-top: 7px; } +.workspace-app .workspace-dialog select { padding-right: 28px; font-family: "Segoe UI", "Microsoft YaHei", sans-serif; } +.workspace-app .workspace-dialog input:focus-visible, +.workspace-app .workspace-dialog select:focus-visible, +.workspace-app #formulaMetadata input:focus-visible, +.workspace-app #formulaInput:focus-visible { + border-color: #6575df; + outline: 0; + box-shadow: 0 0 0 3px rgb(75 95 219 / 11%); +} +.workspace-app .formula-advanced { margin-top: 14px; color: #737b8c; font-size: 12px; } +.workspace-app .formula-advanced summary { width: fit-content; padding: 3px 0; cursor: pointer; } +.workspace-app .formula-advanced summary:hover { color: #4b5fdb; } +.workspace-app #formulaInput { min-height: 104px; margin-top: 12px; background: #f8f9fc; resize: vertical; } +.workspace-app #formulaError, +.workspace-app .reference-dialog .reference-error { margin: 9px 0 0; min-height: 0; color: #a83f4a; font-size: 12px; line-height: 1.7; } +.workspace-app #formulaError:empty, +.workspace-app .reference-dialog .reference-error:empty { margin: 0; } +.workspace-app .reference-dialog input[aria-invalid="true"] { border-color: #b95c65; } + +.workspace-app .modal-actions, +.workspace-app .workspace-dialog-actions { gap: 9px; margin-top: 22px; padding-top: 18px; border-top: 1px solid #e1e5ee; } +.workspace-app .modal-dialog > .modal-actions { flex: 0 0 auto; align-items: center; justify-content: space-between; margin: 0; padding: 16px 26px; background: white; } +.workspace-app .formula-shortcut { color: #949cac; font: 10px/1.5 "Segoe UI", "Microsoft YaHei", sans-serif; } +.workspace-app .modal-actions button, +.workspace-app .workspace-dialog-actions button { + min-height: 40px; + padding: 9px 20px; + border: 1px solid #dce1eb; + border-radius: 8px; + background: #fff; + color: #555e71; + font-size: 13px; + font-weight: 550; +} +.workspace-app .modal-actions button:hover, +.workspace-app .workspace-dialog-actions button:hover { border-color: #cbd1e0; background: #f3f4f7; } +.workspace-app .modal-actions #btnInsertFormula, +.workspace-app .workspace-dialog-actions #referenceAccept, +.workspace-app .workspace-dialog-actions #workspaceDialogAccept { + border-color: #4b5fdb; + background: #4b5fdb; + color: #fff; + box-shadow: 0 2px 3px rgb(75 95 219 / 12%); +} +.workspace-app .modal-actions #btnInsertFormula:hover, +.workspace-app .workspace-dialog-actions #referenceAccept:hover, +.workspace-app .workspace-dialog-actions #workspaceDialogAccept:hover { border-color: #3f51bc; background: #3f51bc; } + +.workspace-app .workspace-dialog { width: min(480px, 100%); overflow-y: auto; overscroll-behavior: contain; padding: 28px; } +.workspace-app .workspace-dialog.reference-dialog { width: min(560px, 100%); } +.workspace-app .workspace-dialog h2 { margin: 0 0 11px; color: #242733; font-size: 20px; font-weight: 650; letter-spacing: -.4px; } +.workspace-app .workspace-dialog label { margin: 18px 0 8px; color: #555e71; font-size: 12px; font-weight: 550; line-height: 1.7; } +.workspace-app .workspace-dialog .reference-hint { margin: 0 0 24px; color: #737b8c; font-size: 13px; line-height: 1.8; } +.workspace-app .workspace-dialog #workspaceDialogMessage { margin: 0 0 18px; color: #737b8c; font-size: 13px; font-weight: 400; } +.workspace-app .workspace-dialog select:disabled { background: #f3f4f7; color: #737b8c; } +.workspace-app .modal-dialog :is(button, summary):focus-visible, +.workspace-app .workspace-dialog button:focus-visible { outline: 2px solid #4b5fdb; outline-offset: 3px; } + +@keyframes studio-dialog-enter { + from { opacity: .65; transform: translateY(6px); } + to { opacity: 1; transform: translateY(0); } +} +@media (max-width: 600px) { + .workspace-app .modal-overlay, + .workspace-app .workspace-dialog-overlay { padding: 12px; } + .workspace-app .modal-overlay { align-items: center; } + .workspace-app .modal-dialog, + .workspace-app .workspace-dialog { max-width: calc(100vw - 24px); max-height: calc(100dvh - 24px); border-radius: 14px; } + .workspace-app .modal-header { min-height: 66px; padding: 14px 18px; } + .workspace-app .modal-title { font-size: 17px; } + .workspace-app .modal-body { padding: 18px; } + .workspace-app .modal-dialog > .modal-actions { padding: 12px 18px; } + .workspace-app .formula-shortcut { max-width: 110px; font-size: 9px; } + .workspace-app .modal-close { width: 40px; height: 40px; min-height: 40px; } + .workspace-app .symbol-palette { max-height: 158px; padding: 7px; gap: 5px; } + .workspace-app .symbol-palette button { min-width: 39px; min-height: 40px; padding: 7px 10px; } + .workspace-app #formulaMathField { min-height: 110px; padding: 20px 14px; font-size: 25px; } + .workspace-app #formulaMetadata { grid-template-columns: minmax(0, 1fr); gap: 0; } + .workspace-app .workspace-dialog { padding: 23px; } + .workspace-app #formulaMetadata input, + .workspace-app .workspace-dialog input, + .workspace-app .workspace-dialog select, + .workspace-app #formulaInput { min-height: 44px; font-size: 16px; } + .workspace-app .modal-actions button, + .workspace-app .workspace-dialog-actions button { min-height: 44px; } +} +@media (prefers-reduced-motion: reduce) { + .workspace-app .modal-dialog, + .workspace-app .workspace-dialog { animation: none; } +} diff --git a/studio.css b/studio.css new file mode 100644 index 0000000..10cebb4 --- /dev/null +++ b/studio.css @@ -0,0 +1,202 @@ +/* Studio chrome: a quiet drafting desk around a typeset, editable manuscript. */ +.workspace-app { + --bg: #f3f4f7; --surface: #fff; --surface-soft: #f8f9fc; + --text: #242733; --text-secondary: #737b8c; --border: #e1e5ee; + --border-strong: #cbd1df; --accent: #4b5fdb; --accent-hover: #394dc2; + --accent-soft: #eef0ff; --ink-dark: #242733; --radius: 7px; + --ui-font: "Segoe UI", "Microsoft YaHei", "PingFang SC", sans-serif; + --paper-font: Cambria, Georgia, "Noto Serif CJK SC", SimSun, serif; + font-family: var(--ui-font); -webkit-font-smoothing: antialiased; +} +.workspace-app .container { + display: grid; grid-template-columns: minmax(0,1fr) auto; + grid-template-rows: 68px 54px minmax(0,1fr) 27px; +} +.workspace-app button { font-size: 12px; font-weight: 500; border-color: var(--border); border-radius: 7px; box-shadow: none; } +.workspace-app button:hover { border-color: #ccd3ea; background: #f0f2fa; } +.workspace-app button:disabled { opacity: .36; } +.workspace-app :is(button,input,select,textarea,[contenteditable]):focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; } +.workspace-app button.primary { background: var(--accent); border-color: var(--accent); box-shadow: 0 2px 5px #4b5fdb24; } +.workspace-app button.primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); } +.ui-icon { width: 17px; height: 17px; flex: 0 0 17px; vertical-align: middle; pointer-events: none; } +.workspace-app .icon-button { display: inline-flex; justify-content: center; align-items: center; gap: 7px; } +.workspace-app .icon-only .button-label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; } + +/* Project context is distinct from the document's editing tools. */ +.workspace-header { grid-column: 1/-1; min-height: 0; padding: 0 24px; gap: 28px; border-bottom: 1px solid var(--border); } +.brand-block { gap: 10px; min-width: 192px; } +.brand-monogram { width: 33px; height: 37px; display: grid; place-items: center; border-radius: 9px; background: var(--accent); color: white; font: italic 28px/.9 Cambria,Georgia,serif; box-shadow: 0 3px 7px #4b5fdb1c; } +.brand-block h1 { font: 600 18px/1.15 var(--ui-font); letter-spacing: -.75px; } +.brand-block h1 span { font: 9px/1 var(--ui-font); color: #8a91a2; letter-spacing: 2.4px; margin-top: 5px; } +.language-signature { display: none; } +.project-identity { max-width: 360px; padding-left: 24px; border-left: 1px solid var(--border); gap: 9px; } +.project-identity label { font-size: 11px; color: #8a91a2; } +.project-identity input { min-height: 34px; padding: 5px 8px !important; background: transparent !important; border: 1px solid transparent !important; font-weight: 500 !important; } +.project-identity input:hover { background: var(--surface-soft) !important; } +.project-identity input:focus { background: var(--surface-soft) !important; border-color: var(--border) !important; } +.project-actions { gap: 8px; } +.project-actions button { min-height: 34px; padding: 6px 11px; background: transparent; border-color: transparent; color: #586176; } +.workspace-app #btnExportProject { border-color: var(--border); background: white; color: var(--text); box-shadow: none; } + +/* One compact command row, with compilation as the single primary action. */ +.workspace-toolbar.toolbar { min-width: 0; margin: 0; padding: 0 16px; gap: 10px; background: white; border-bottom: 1px solid var(--border); overflow: auto; scrollbar-width: thin; } +.workspace-toolbar .tool-group { gap: 3px; flex-shrink: 0; } +.workspace-toolbar.toolbar button { min-height: 32px; padding: 5px 7px; border-color: transparent; background: transparent; border-radius: 6px; font-size: 12px; } +.workspace-toolbar.toolbar button:hover { background: var(--accent-soft); color: var(--accent); } +.workspace-toolbar.toolbar .icon-only { width: 32px; padding: 5px; } +.workspace-toolbar .separator { height: 19px; background: var(--border); margin: 0; } +.workspace-toolbar :is(#btnH1,#btnH2,#btnH3) { font-family: Cambria,Georgia,serif; font-weight: 600; font-size: 15px; } +.workspace-toolbar :is(#btnBold,#btnItalic) { font-family: Georgia,serif; font-size: 15px; width: 30px; } +.workspace-toolbar :is(#btnInlineFormula,#btnBlockFormula) { font-size: 12px; } +.math-tool-sign { font: italic 18px Cambria,Georgia,serif; margin-right: 4px; color: #515f82; } +.compile-toolbar { min-width: 0; flex-wrap: nowrap; gap: 6px; padding: 0 18px 0 10px; background: white; border-bottom: 1px solid var(--border); } +.compile-toolbar > label { display: none; } +.workspace-app .compile-toolbar select { width: 118px; min-width: 0; max-width: 150px; height: 32px; font-size: 11px; padding-left: 8px; background: var(--surface-soft); border-color: transparent; } +.compile-toolbar button { min-height: 32px; padding: 5px 11px; } +#btnCompile::before { content: ""; display: inline-block; vertical-align: -1px; margin-right: 7px; width: 0; height: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 7px solid currentColor; } +.compiler-status { display: none; } +.compile-toolbar:has(#btnCompile:disabled):not(:has(#btnCancelCompile:not([hidden]))) .compiler-status { + display: inline; max-width: 120px; color: #8b624a; font-size: 10px; margin-left: 2px; +} +.workspace-app #btnCompilerRetry { min-height: 30px; width: 28px; padding: 5px; } +.workspace-app #btnTogglePreview { width: 32px; padding: 6px; border-color: transparent; } +.workspace-app #btnTogglePreview[aria-expanded="true"] { background: var(--accent-soft); color: var(--accent); } + +/* File navigation and reference tools remain secondary to the manuscript. */ +.workbench.main-content { grid-column: 1/-1; grid-template-columns: 218px minmax(0,1fr) 236px; } +.project-sidebar, .context-sidebar { background: #fafbfe; } +.sidebar-heading { min-height: 58px; padding: 16px 17px 10px; } +.sidebar-heading h2 { color: #555e72; font-size: 12px; font-weight: 600; letter-spacing: .5px; } +.workspace-app .small-button { font-size: 12px; color: var(--text-secondary); } +.file-import-actions { padding: 0 14px 15px; gap: 7px; } +.file-import-actions button { min-height: 32px; background: white; font-size: 11px; padding: 5px 7px; } +.file-tree { padding: 8px 10px 16px; border-top: 1px solid #edf0f6; border-bottom: 0; } +.file-tree button { min-height: 40px; padding: 10px 11px; border: 0; border-radius: 7px; color: #60697c; font: 12px/1.6 var(--editor-font); margin: 2px 0; } +.file-tree button::before { content: ""; width: 11px; height: 14px; border: 1px solid #a3adbf; border-radius: 2px; flex: 0 0 11px; background: linear-gradient(#a3adbf,#a3adbf) 2px 8px/6px 1px no-repeat; } +.file-tree button[title="bibtex"]::before { border-color: #8998a5; background: linear-gradient(90deg, transparent 4px,#8998a5 4px,#8998a5 5px,transparent 5px); } +.file-tree button.active, .file-tree button[aria-current="true"], .file-tree button[aria-selected="true"] { background: #eaeefe; border: 0; box-shadow: none; color: #3f50bd; font-weight: 600; } +.file-tree button.active::before { border-color: #6e7cce; } +.file-actions { gap: 5px; padding: 12px 13px 2px; border-top: 1px solid var(--border); } +.file-actions button { min-height: 28px; font-size: 10px; padding: 4px 6px; background: transparent; border-color: transparent; color: #6d7588; } +.file-actions button:hover { background: #eceff7; } +.sidebar-note { padding: 10px 17px 17px; font-size: 11px; line-height: 1.8; color: #737e91; } +.context-sidebar { background: white; } +.context-list { padding: 0 12px 15px; font-size: 12px; } +.context-list button { padding: 8px 9px; min-height: 35px; font-size: 12px; font-weight: 400; color: #687186; border: 1px solid transparent; background: transparent; border-radius: 6px; line-height: 1.6; } +.outline-section { min-height: 120px; flex-basis: 29%; } +.outline-section .context-list button { border-left: 2px solid #e7eaf3; border-radius: 0; padding-left: 13px; margin-left: 5px; width: calc(100% - 5px); color: #414b62; } +.reference-actions { gap: 6px; padding: 0 16px 15px; } +.reference-actions button { min-height: 32px; font-size: 11px; border-color: var(--border); background: white; } +.reference-actions button:hover { background: var(--accent-soft); color: var(--accent); } + +/* Paper, not a second application panel. No decoration is inserted in the DOM. */ +.document-header { min-height: 59px; padding: 11px 24px; background: #fbfcfe; border-bottom: 1px solid var(--border); } +.document-location { gap: 9px; } +.current-path { font-size: 12px; color: #525d74; } +.language-badge { border: 1px solid #e4e7ef; background: white; color: #8390aa; font: 9px var(--editor-font); padding: 3px 5px; } +.mode-switch { padding: 3px; gap: 0; border: 0; border-radius: 8px; background: #eceff5; } +.mode-switch button { min-height: 30px; padding: 5px 13px; font-size: 11px; border-radius: 6px; } +.mode-switch button.active, .mode-switch button[aria-pressed="true"] { background: white; color: #354570; box-shadow: 0 1px 4px #30395812; } +.visual-panel { background: var(--bg); } +.mode-note { padding: 13px 24px 0; text-align: center; background: transparent; border: 0; color: #737f94; font-size: 11px; } +.mode-note::before { content: ""; width: 4px; height: 4px; border-radius: 50%; display: inline-block; background: #abb5d5; vertical-align: 2px; margin-right: 7px; } +.workspace-app .editor-area { width: min(calc(100% - 48px),820px); margin: 18px auto 24px; padding: 48px 54px 90px; border: 1px solid #e4e7ee; border-radius: 2px; background: white; box-shadow: 0 4px 24px #252d4410; color: #292e39; font: 17px/1.95 var(--paper-font); caret-color: var(--accent); scrollbar-width: thin; } +.workspace-app .editor-area:focus { outline: none; background: white; border-color: #d5dbe9; box-shadow: 0 4px 24px #252d4410,0 0 0 1px #dfe4f0; } +.workspace-app .editor-area:focus-visible { outline: 2px solid #bdc7f0; outline-offset: 3px; } +.workspace-app .editor-area h1 { margin: 0 0 24px; padding: 0; border: 0; color: #252a37; font: 600 30px/1.35 var(--paper-font); letter-spacing: -.6px; } +.workspace-app .editor-area h2 { margin: 29px 0 15px; padding: 0; border: 0; color: #303746; font: 600 24px/1.45 var(--paper-font); } +.workspace-app .editor-area h3 { margin: 24px 0 12px; color: #424a5c; font: 600 20px/1.5 var(--paper-font); } +.workspace-app .editor-area p { margin: 12px 0 18px; text-align: left; } +.workspace-app .editor-area .formula-inline { padding: 1px 4px; background: transparent; border-color: transparent; color: inherit; } +.workspace-app .editor-area .formula-block { position: relative; margin: 27px 0; padding: 18px 24px 15px; background: #fcfcfe; border: 1px solid #f0f2f7; border-radius: 7px; } +.workspace-app .editor-area :is(.formula-inline,.formula-block):hover { background: #f3f5ff; border-color: #d3daf6; } +.workspace-app .editor-area :is(.formula-inline,.formula-block):focus-visible { border-color: var(--accent); outline: 2px solid #d9dff8; } +.workspace-app .visual-math-label { margin-top: 12px; color: #737f94; font: 10px/1.5 var(--editor-font); } +.workspace-app .editor-area .tex-cmd[data-visual-reference] { max-width: 100%; vertical-align: baseline; padding: 0 3px; border: 0; border-bottom: 1px solid #ccd3ef; border-radius: 3px 3px 0 0; background: transparent; color: #5265ad; font: inherit; font-size: .88em; line-height: 1.65; } +.workspace-app .editor-area .tex-cmd[data-visual-reference]:hover { background: #eef1ff; color: #3e51b1; filter: none; } +.workspace-app .editor-area .tex-cmd[data-visual-reference="label"] { color: #65718a; border: 1px solid #e7eaf1; border-radius: 4px; padding: 1px 5px; font: 10px/1.8 var(--editor-font); background: #fcfcfe; } +.workspace-app .editor-area .tex-cmd:is([data-visual-reference="include"],[data-visual-reference="bibliography"],[data-visual-reference="style"]) { color: #79859d; border-color: #dce1ec; font-size: .77em; } +.document-footer { min-height: 25px; padding: 3px 20px; font-size: 10px; background: #f3f4f7; border-top: 0; color: #9199aa; } +.source-hint { display: none; } +.workspace-status.status-bar { grid-column: 1/-1; min-height: 0; padding: 4px 18px; background: #fff; border-top: 1px solid var(--border); color: #8b93a3; font-size: 10px; } +.workspace-status #saveState { color: #78849a; } +.line-numbers { background: #f9fafd; color: #a3adbf; border-color: #edf0f5; font-size: 13px; } +.workspace-app .source-area { color: #39435a; font-size: 14px; line-height: 1.8; padding-top: 22px; } +.find-panel { background: #fbfcff; box-shadow: inset 2px 0 var(--accent); } + +/* The PDF proof shares the same desk and paper treatment. */ +.compilation-visible .workbench.main-content { grid-template-columns: 184px minmax(280px,1fr) minmax(320px,44%); } +.compilation-visible .document-header { padding: 10px 16px; } +.compilation-visible .editor-area { width: calc(100% - 32px); padding-left: 30px; padding-right: 30px; } +.pdf-preview-pane { background: var(--bg); border-color: var(--border); } +.pdf-preview-header { background: #fbfcfe; min-height: 59px; padding: 11px 18px; } +.pdf-preview-header h2 { color: #3f4a61; font-size: 12px; } +.pdf-edit-note { background: transparent; color: #919aaa; font-size: 10px; padding: 12px 18px 5px; } +.compile-status { background: transparent; color: #7d879b; font-size: 10px; padding: 4px 18px 10px; } +.preview-page-controls { border: 0; background: transparent; padding: 0 10px 10px; } +.preview-page-controls button { background: white; font-size: 10px; } +.pdf-page-view { padding: 8px 22px 22px; } +.pdf-page-view img { box-shadow: 0 4px 24px #252d4410; border: 1px solid #e4e7ee; } +.pdf-open { background: transparent; text-decoration: none; color: #8793ab; padding: 7px 18px; } +.compile-logs { background: #fbfcfe; border-color: var(--border); } +.compile-logs summary { font-size: 11px; color: #6c7790; } + +@media (max-width: 1250px) { + .workspace-app .container { grid-template-columns: minmax(0,1fr); grid-template-rows: 62px 46px 46px minmax(0,1fr) 26px; } + .workspace-header { padding: 0 18px; } + .workspace-toolbar.toolbar { justify-content: center; } + .compile-toolbar { padding: 0 18px; justify-content: flex-end; background: #fbfcfe; } + .compile-toolbar > label { display: block; margin-right: auto; font-size: 10px; color: #939bad; } + .compiler-status { display: inline; margin-left: 5px; font-size: 10px; } + .workbench.main-content { grid-template-columns: 190px minmax(0,1fr) 216px; } + .workspace-app .editor-area { padding: 36px 38px 70px; width: calc(100% - 36px); } + .project-identity { padding-left: 15px; } +} +@media (max-width: 1100px) { + .workbench.main-content { grid-template-columns: 190px minmax(0,1fr); } + .context-sidebar { display: none; } + .outline-open .context-sidebar { display: flex; width: 264px; border-left: 1px solid var(--border); box-shadow: -12px 0 40px #303d5a12; } + .compilation-visible .workbench.main-content { grid-template-columns: minmax(260px,1fr) minmax(320px,49%); } + .compilation-visible .project-sidebar { display: none; } + .compilation-visible.files-open .project-sidebar { display: flex; } + .brand-block { min-width: 177px; } +} +@media (max-width: 700px) { + .workspace-app .container { grid-template-rows: auto 47px auto minmax(0,1fr) 26px; } + .workspace-header { padding: 13px 14px 10px; gap: 12px 14px; flex-wrap: wrap; } + .brand-block { min-width: 0; gap: 8px; } + .brand-monogram { width: 28px; height: 31px; font-size: 24px; border-radius: 7px; } + .brand-block h1 { font-size: 15px; } + .brand-block h1 span { font-size: 7px; letter-spacing: 2px; } + .project-identity { padding: 0; border: 0; flex: 1; min-width: 90px; max-width: 155px; margin-left: auto; } + .project-identity input { font-size: 13px !important; min-height: 34px; } + .project-actions { width: 100%; justify-content: flex-end; gap: 6px; } + .project-actions button { flex: 1; min-height: 33px; font-size: 11px; background: #f7f8fc; border-color: #edf0f6; } + .workspace-toolbar.toolbar { justify-content: flex-start; padding: 0 10px; gap: 8px; } + .workspace-toolbar.toolbar button { min-height: 36px; } + .workspace-toolbar.toolbar .icon-only { width: 34px; } + #btnFiles { display: inline-flex; } + .compile-toolbar { flex-wrap: wrap; padding: 8px 10px; gap: 6px; justify-content: flex-start; } + .compile-toolbar > label, .compiler-status { display: none; } + .workspace-app .compile-toolbar select { flex: 1 1 95px; max-width: none; min-width: 60px; height: 35px; font-size: 11px; } + .compile-toolbar button { min-height: 35px; padding: 5px 9px; font-size: 11px; } + .workspace-app #btnCompilerRetry { width: 24px; padding: 4px; } + .workbench.main-content, .compilation-visible .workbench.main-content { grid-template-columns: minmax(0,1fr); } + .project-sidebar { display: none; } + .files-open .project-sidebar { display: flex; } + .document-header { padding: 10px 12px; min-height: 55px; gap: 6px; } + .document-location { gap: 6px; flex-basis: 100px; } + .mode-switch button { padding: 6px 9px; min-height: 33px; font-size: 11px; } + .language-badge { display: none; } + .mode-note { padding: 10px 12px 0; font-size: 9px; } + .workspace-app .editor-area { width: calc(100% - 24px); padding: 30px 24px 60px; margin: 12px auto; font-size: 16px; line-height: 1.9; } + .workspace-app .editor-area h1 { font-size: 26px; } + .workspace-app .editor-area .formula-block { padding: 13px 10px; margin: 20px 0; } + .source-panel .source-area, .line-numbers { font-size: 16px; } + .file-tree button, .context-list button { min-height: 40px; } + .compilation-visible .document-pane { display: none; } + .pdf-preview-header { min-height: 53px; } +} +@media (prefers-reduced-motion: reduce) { + .workspace-app *, .workspace-app *::before, .workspace-app *::after { transition: none !important; animation: none !important; } +} diff --git a/tests/browser-acceptance.md b/tests/browser-acceptance.md index b3fddff..a3f602c 100644 --- a/tests/browser-acceptance.md +++ b/tests/browser-acceptance.md @@ -23,3 +23,5 @@ PDF 图片预览依赖 Ghostscript,不依赖浏览器内置 PDF 插件。还 公式和引用专项验收:单击公式打开 MathLive,通过分数按钮及分子/分母占位框将公式改为 1/2;修改 equation 内容及标签,修改两行 align 的末行内容及标签,确认光标默认位于最后一格内。直接修改正文标签、选择交叉引用目标、替换两处相同文献引用中的第二处,全程不切源码。验证取消、撤销、重做、刷新恢复和长引用卡片点击。实际下载 TeX 保留导言区和尾注;编译 PDF 正确显示方程 (1)、(2)、(3),引用 (1)/(3) 和文献 [1]/[2]。用户当前项目刷新前后 4 个文件逐字节相同。 高级输入与图形输入切换须保留新标签、编号和注释;未修改即确认须保留原始公式,不以数学组件的归一化结果覆盖原文。两项都有事件回归。内嵌浏览器仅允许 HTTP/HTTPS,本次未实跑 file:// UI;本地资源、字体白名单及打包完整性有自动检查。 + +前端改版验收:在 1280×720 和 1383×1084 的真实浏览器检查工具栏、文稿、引用及公式弹窗、双栏 PDF;确认公式按钮固定可见,原有引用点击、源码/可视化切换、公式保存/撤销和 PDF 下载均工作。多行公式 Ctrl/Cmd+Enter 须先阻止数学组件的插行快捷键再确认,输出不能多出占位行;普通 Enter 仍可编辑矩阵行。已有事件回归覆盖这一区别。用户当前项目 4 文件前后逐字节不变。 diff --git a/tests/helpers/workspace-fixture.mjs b/tests/helpers/workspace-fixture.mjs index 0bf084f..4e869a0 100644 --- a/tests/helpers/workspace-fixture.mjs +++ b/tests/helpers/workspace-fixture.mjs @@ -21,19 +21,69 @@ export async function fixture({denyStorage = false, denyDialogs = false, initial let document; const addEvents = target => { target._events = new Map(); - target.addEventListener = (type, listener) => { - if (!target._events.has(type)) target._events.set(type, []); - target._events.get(type).push(listener); + target._captureEvents = new Map(); + const eventMap = options => options === true || options?.capture ? target._captureEvents : target._events; + target.addEventListener = (type, listener, options = false) => { + const map = eventMap(options); + if (!map.has(type)) map.set(type, []); + map.get(type).push(listener); }; - target.removeEventListener = (type, listener) => { - target._events.set(type, (target._events.get(type) || []).filter(item => item !== listener)); + target.removeEventListener = (type, listener, options = false) => { + const map = eventMap(options); + map.set(type, (map.get(type) || []).filter(item => item !== listener)); }; }; - async function emit(target, type, properties = {}) { - const event = {type, target, defaultPrevented: false, propagationStopped: false, + function eventFor(target, type, properties) { + return {type, target, defaultPrevented: false, propagationStopped: false, immediatePropagationStopped: false, preventDefault() { this.defaultPrevented = true; }, - stopPropagation() { this.propagationStopped = true; }, ...properties}; - for (const listener of target._events?.get(type) || []) await listener(event); + stopPropagation() { this.propagationStopped = true; }, + stopImmediatePropagation() { this.immediatePropagationStopped = this.propagationStopped = true; }, ...properties}; + } + async function invoke(target, type, event, capture) { + event.currentTarget = target; + const map = capture ? target._captureEvents : target._events; + for (const listener of map?.get(type) || []) { + await listener.call(target, event); + if (event.immediatePropagationStopped) break; + } + } + async function emit(target, type, properties = {}) { + const event = eventFor(target, type, properties); + event.currentTarget = target; + // Keep target-only delivery timing unchanged for callers that start an + // async prompt and inspect it before answering it. + for (const listener of target._captureEvents?.get(type) || []) { + await listener.call(target, event); + if (event.immediatePropagationStopped) return event; + } + for (const listener of target._events?.get(type) || []) { + await listener.call(target, event); + if (event.immediatePropagationStopped) break; + } + return event; + } + // Opt-in propagation for custom-element integration regressions. Existing + // emit() calls remain target-only so their fixtures do not simulate layout. + async function dispatch(target, type, properties = {}) { + const event = eventFor(target, type, properties); + const path = []; + for (let node = target; node; node = node.parentNode) path.push(node); + if (!path.includes(document)) path.push(document); + event.composedPath = () => path.slice(); + for (const ancestor of path.slice(1).reverse()) { + event.eventPhase = 1; + await invoke(ancestor, type, event, true); + if (event.propagationStopped) return event; + } + event.eventPhase = 2; + await invoke(target, type, event, true); + if (!event.immediatePropagationStopped) await invoke(target, type, event, false); + if (event.propagationStopped) return event; + for (const ancestor of path.slice(1)) { + event.eventPhase = 3; + await invoke(ancestor, type, event, false); + if (event.propagationStopped) return event; + } return event; } function enhance(node) { @@ -217,7 +267,7 @@ export async function fixture({denyStorage = false, denyDialogs = false, initial await emit(document, 'DOMContentLoaded'); const refresh = () => { for (const node of root.querySelectorAll('*')) enhance(node); }; refresh(); - return {context, app: context.visualWorkspace, document, ids, storage, prompts, alerts, blobs, emit, + return {context, app: context.visualWorkspace, document, ids, storage, prompts, alerts, blobs, emit, dispatch, refresh, selection, mathField, setCursor(node, offset) { const range = new Range(); range.setStart(node, offset); range.collapse(true); selection.removeAllRanges(); selection.addRange(range); }, node: id => ids.get(id), click: id => ids.get(id).click(), diff --git a/tests/server.test.mjs b/tests/server.test.mjs index 97dad11..511a170 100644 --- a/tests/server.test.mjs +++ b/tests/server.test.mjs @@ -54,7 +54,8 @@ test('visual editor modules and bundled math fonts have usable MIME types withou assert.equal(response.headers.get('content-type'), 'text/javascript; charset=utf-8', path); assert.ok((await response.text()).length > 0, path); } - for (const path of ['/visual-math.css', '/visual-references-ui.css', '/vendor/mathlive/mathlive-static.css', '/vendor/mathlive/mathlive-fonts.css']) { + for (const path of ['/visual-math.css', '/visual-references-ui.css', '/studio.css', '/studio-dialogs.css', + '/vendor/mathlive/mathlive-static.css', '/vendor/mathlive/mathlive-fonts.css']) { const response = await fetch(f.url + path); assert.equal(response.status, 200, path); assert.equal(response.headers.get('content-type'), 'text/css; charset=utf-8', path); diff --git a/tests/visual-math-ui.test.mjs b/tests/visual-math-ui.test.mjs index c169f33..11d4d67 100644 --- a/tests/visual-math-ui.test.mjs +++ b/tests/visual-math-ui.test.mjs @@ -64,6 +64,59 @@ test('align and gather editors start inside their final cell and commit field in } }); +test('Ctrl/Cmd+Enter confirms before the mathfield target can insert a matrix row', async () => { + for (const modifier of ['ctrlKey', 'metaKey']) { + const f = await visual(String.raw`\begin{align}a&=1\\b&=2\label{eq:last}\end{align}`); + await open(f); + const field = f.node('formulaMathField'); + field.value = String.raw`\begin{aligned}a&=1\\b&=2+1\end{aligned}`; + await f.emit(field, 'input'); + + // MathLive handles keyboard events at a descendant inside its custom + // element. A host bubble listener is too late to prevent this edit. + const keyboardSink = f.document.createElement('span'); + field.appendChild(keyboardSink); + let insertedRows = 0, confirmations = 0, parentShortcuts = 0; + keyboardSink.addEventListener('keydown', async event => { + if (event.key !== 'Enter' || event.defaultPrevented) return; + insertedRows++; + field.value = field.value.replace(String.raw`\end{aligned}`, String.raw`\\\placeholder{}\end{aligned}`); + await f.emit(field, 'input'); + }); + const confirm = f.node('btnInsertFormula'); + const click = confirm.click; + confirm.click = () => { confirmations++; return click(); }; + f.document.addEventListener('keydown', () => { parentShortcuts++; }); + + const event = await f.dispatch(keyboardSink, 'keydown', {key:'Enter', [modifier]:true}); + assert.equal(event.defaultPrevented, true); + assert.equal(event.propagationStopped, true); + assert.equal(insertedRows, 0, 'capture must stop the mathfield default before it changes the expression'); + assert.equal(confirmations, 1); + assert.equal(parentShortcuts, 0); + assert.equal(formula(f).getAttribute('data-formula'), String.raw`a&=1\\b&=2+1\label{eq:last}`); + assert.equal(f.context.VisualMath.split(formula(f).getAttribute('data-formula')).rows.length, 2); + assert.doesNotMatch(f.app.model.get().text, /placeholder/); + assert.equal(f.node('formulaModal').classList.contains('show'), false); + } +}); + +test('plain Enter still reaches the mathfield editing handler without confirming', async () => { + const f = await visual(String.raw`\begin{align}a&=1\\b&=2\end{align}`); + await open(f); + const field = f.node('formulaMathField'); + const keyboardSink = f.document.createElement('span'); + field.appendChild(keyboardSink); + let insertedRows = 0; + keyboardSink.addEventListener('keydown', event => { + if (event.key === 'Enter' && !event.defaultPrevented) insertedRows++; + }); + const event = await f.dispatch(keyboardSink, 'keydown', {key:'Enter'}); + assert.equal(event.defaultPrevented, false); + assert.equal(insertedRows, 1, 'ordinary mathfield editing must still reach its target listener'); + assert.equal(f.node('formulaModal').classList.contains('show'), true); +}); + test('label and display-number input events update only their exact source fields', async () => { const f = await visual(String.raw`\begin{equation} x = y \label {eq:old}\tag*{A 1}% retained \end{equation}`); diff --git a/tests/workspace-markup.test.mjs b/tests/workspace-markup.test.mjs index 3ef2291..4c26112 100644 --- a/tests/workspace-markup.test.mjs +++ b/tests/workspace-markup.test.mjs @@ -40,7 +40,8 @@ test('offline scripts and stylesheet overrides load in dependency order', () => assert.deepEqual(scripts, ['vendor/mathlive/mathlive.min.js', 'visual-math.js', 'main.js', 'project-model.js', 'project-archive.js', 'visual-references.js', 'visual-references-ui.js', 'workspace.js', 'preview.js']); const styles = [...html.matchAll(/]*>/g)].map(match => match[1]); - assert.deepEqual(styles, ['style.css', 'workspace.css', 'preview.css', 'visual-references-ui.css', 'visual-math.css']); + assert.deepEqual(styles, ['style.css', 'workspace.css', 'preview.css', 'visual-references-ui.css', 'visual-math.css', + 'studio.css', 'studio-dialogs.css']); for (const resource of [...scripts, ...styles]) { assert.doesNotMatch(resource, /^(?:https?:)?\/\//); assert.ok(fs.existsSync(new URL('../' + resource, import.meta.url)), `missing local resource ${resource}`); diff --git a/visual-math.js b/visual-math.js index 9679dfc..cdfda28 100644 --- a/visual-math.js +++ b/visual-math.js @@ -215,7 +215,7 @@ if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) { event.preventDefault(); event.stopPropagation(); document.getElementById('btnInsertFormula').click(); } - }); + }, true); // Run before MathLive's matrix shortcut can insert another row. } root.VisualMath = {split,combine,safe,unwrap,mathValue,open,value,initialize, close(){session=null;}, insert(latex){ diff --git a/visual-references-ui.js b/visual-references-ui.js index 2d3a1d8..1bbb00d 100644 --- a/visual-references-ui.js +++ b/visual-references-ui.js @@ -20,7 +20,9 @@ node.setAttribute('title', detail + (description.editable === false ? '' : ' · 点击或按 Enter 编辑')); // Replacing child text on every keystroke would disturb a selection next // to the atom. Only refresh when the derived presentation changes. - const presentation = symbols[description.kind] + ' ' + label; + const presentation = description.kind === 'label' ? label.replace(/^标签[::]\s*/, '# ') + : ['include', 'bibliography', 'style'].includes(description.kind) ? label + : symbols[description.kind] + ' ' + label; if (node.textContent !== presentation) node.textContent = presentation; return description; } From 8a6f8dc3acf9066486066c36b95737a8d84d207f Mon Sep 17 00:00:00 2001 From: nisconder <2129048448@qq.com> Date: Sun, 8 Nov 2026 16:06:40 +0800 Subject: [PATCH 7/7] Preserve upstream release history in Studio documentation --- README.en.md | 14 +++++++++++++- README.md | 16 ++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/README.en.md b/README.en.md index 6baae74..81598e2 100644 --- a/README.en.md +++ b/README.en.md @@ -6,7 +6,7 @@ The workspace centers the manuscript, with compact editing and compile controls, ![VisualLaTeX Studio](screenshots/studio-workspace.jpg) -This workspace edition continues [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX)'s purpose of visually modifying existing LaTeX documents, adding full source access, multiple files, references, bibliography entries, ZIP projects and real compilation. It bundles MathLive 0.111.1 (MIT) and its fonts for formula editing. Offline editing needs no npm installation or build step. Compilation uses Node.js 22+ and a local typesetting toolchain. +VisualLaTeX Studio continues VisualLaTeX's purpose of visually modifying existing LaTeX documents, adding full source access, multiple files, references, bibliography entries, ZIP projects and real compilation. It bundles MathLive 0.111.1 (MIT) and its fonts for formula editing. Offline editing needs no npm installation or build step. Compilation uses Node.js 22+ and a local typesetting toolchain. **Complete LaTeX documents open in Visual editing by default.** Edit text and headings directly and use the formatting toolbar. Click a typeset formula to edit fractions, superscripts and subscripts in a graphical math field. References and labels appear as readable items that open an editor when clicked, without switching to source. Untouched source stays intact, and the current session remembers the selected editing mode for each file. @@ -122,6 +122,18 @@ See the [browser acceptance checklist](tests/browser-acceptance.md) for manual e `workspace.js` coordinates editing, `project-model.js` owns canonical source/history/indexes, and `project-archive.js` handles ZIP. `visual-math.js`/`.css` adapt MathLive for formula rendering and editing; `visual-references*.js`/`.css` provide reference semantics, readable displays and editing dialogs. `preview.js` manages PDF state and export; `compiler.mjs` and `server.mjs` run the local compilation service, while `pdf-preview.mjs` renders bounded page images. `setup-windows.ps1` and `start.ps1` prepare portable tools and start the service. The original `main.js` remains the visual LaTeX conversion core. +

    +Version History + +- **v2.0.3**: fixed import data loss and HTML injection — the `.tex` parser now reads commands, environments, math and verbatim blocks, so untouched source blocks are preserved byte for byte; added `\(...\)` and `\[...\]` delimiters plus `\verb` and `\lstinline` support; double-click a visual formula to edit it; drafts are saved atomically with a version marker and flushed when the page is hidden, and legacy drafts are sanitized before restore; added 70 `node --test` regression tests +- **v2.0.2**: mobile and narrow-viewport adaptation — one panel per screen with bottom tabs switching between the editor and LaTeX code, toolbar collapsed into a single horizontally scrollable row with >=44px touch targets, `min-height:0` fix so the code preview is no longer clipped off-screen, `100dvh` and 16px inputs so iOS no longer zooms the page on focus; LaTeX conversion and export logic unchanged +- **v2.0.1**: maintenance release, main.js unchanged; license moved from MIT to Apache-2.0; UI restyled with design tokens and a warm-white academic theme, toolbar buttons switched to plain text; added CI checks and automatic GitHub Pages demo deployment +- **v2.0.0**: repositioned as a general offline LaTeX light editor; added .tex import; verbatim preservation of unsupported structures for lossless round-trips; fixed preamble not being cached with drafts and formulas losing user edits +- **v1.1.0**: visual editor + formula assistant for math-modeling papers (removed in v2.0.0) +- **v1.0.0**: initial release + +
    + ## License Project code uses [Apache-2.0](LICENSE), based on the original project by Escap1ng. Bundled MathLive 0.111.1 uses the [MIT license](vendor/mathlive/LICENSE.txt); its notice is included in the source archive. diff --git a/README.md b/README.md index ca719d7..d21fde6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ![VisualLaTeX Studio](screenshots/studio-workspace.jpg) -这是基于 [Escap1ng/VisualLaTeX](https://github.com/Escap1ng/VisualLaTeX) 的独立工作区版本,延续可视化修改现有 LaTeX 文档的用途,并增加完整源码、多文件项目、参考文献、ZIP 管理及真实编译。公式编辑内置 MathLive 0.111.1(MIT)及其字体,无需 npm 安装或构建即可离线编辑;编译需要 Node.js 22+ 和相应工具链。 +VisualLaTeX Studio 延续可视化修改现有 LaTeX 文档的用途,并增加完整源码、多文件项目、参考文献、ZIP 管理及真实编译。公式编辑内置 MathLive 0.111.1(MIT)及其字体,无需 npm 安装或构建即可离线编辑;编译需要 Node.js 22+ 和相应工具链。 **完整 LaTeX 文档默认进入「可视化编辑」。** 直接修改文字和标题,用工具栏调整格式;单击排版后的公式,使用图形输入框编辑分式、上下标等内容。引用和标签显示为可读条目,单击即可修改,无需切换源码。只修改需要改动的内容,保留其余源码;切换文件会记住当前会话中为各文件选择的编辑模式。 @@ -151,6 +151,18 @@ setup-windows.ps1 / start.ps1 Windows 便携工具安装与启动 tests/ 零依赖回归测试 ``` +
    +版本历史 + +- **v2.0.3**:修复导入丢内容与 HTML 注入——重写 `.tex` 解析,按命令、环境、数学、逐字块读取,未编辑的源码块逐字节保留;新增 `\(...\)`、`\[...\]` 定界符与 `\verb`、`\lstinline` 支持;双击已有公式可编辑;草稿按版本原子保存并在离开页面时落盘,旧草稿恢复前先清洗;新增 `node --test` 回归测试 70 例 +- **v2.0.2**:手机端与窄屏适配——一屏一个面板,底部 tab 在编辑区与 LaTeX 代码间切换;工具栏收成单行横向滑动,触控目标 ≥44px;补 `min-height:0` 修复代码预览被裁出屏幕;改用 `100dvh` 与 16px 输入框,iOS 聚焦不再放大整页;LaTeX 转换与导出逻辑未改动 +- **v2.0.1**:维护版本,main.js 未作修改;许可证由 MIT 改为 Apache-2.0;界面改用 design tokens 与学术暖白主题,工具栏按钮改为纯文本;新增 CI 检查与 GitHub Pages 在线演示的自动部署 +- **v2.0.0**:去垂直化改造,转型为通用离线 LaTeX 轻编辑器;新增 .tex 导入;未支持结构原样保留,实现往返保真;修复导言区不随草稿缓存、公式误改丢数据等问题 +- **v1.1.0**:可视化编辑器 + 数模公式助手(已被 v2.0.0 移除) +- **v1.0.0**:首个版本 + +
    + ## 许可 -项目代码沿用 [Apache-2.0](LICENSE)。原项目由 Escap1ng 开发,本分支在其基础上扩展。内置 MathLive 0.111.1 使用 [MIT 许可](vendor/mathlive/LICENSE.txt),随源码包保留其许可声明。 +项目代码沿用 [Apache-2.0](LICENSE)。VisualLaTeX 由 Escap1ng 开发,Studio 在其基础上扩展。内置 MathLive 0.111.1 使用 [MIT 许可](vendor/mathlive/LICENSE.txt),随源码包保留其许可声明。