diff --git a/.github/workflows/example-tests.yml b/.github/workflows/example-tests.yml index 30efc5c..3d456f1 100644 --- a/.github/workflows/example-tests.yml +++ b/.github/workflows/example-tests.yml @@ -1,4 +1,4 @@ -# Example 集成测试:单仓内 Example + 根目录 STBaseProject.xcworkspace(含 Pods)。 +# Example 集成测试:单仓内 Example(纯 Swift Package Manager,本地引用根目录 Package.swift)。 name: Example iOS Tests on: @@ -18,7 +18,7 @@ jobs: timeout-minutes: 45 env: - WORKSPACE: STBaseProject.xcworkspace + PROJECT: STBaseProjectExample.xcodeproj SCHEME: STBaseProjectExample RESULT: build/result.xcresult @@ -28,26 +28,6 @@ jobs: - name: Select Xcode run: bash "${GITHUB_WORKSPACE}/.github/select_xcode_ci.sh" - - name: Cache CocoaPods - uses: actions/cache@v4 - with: - path: | - Example/Pods - ~/.cocoapods - key: pods-${{ runner.os }}-${{ hashFiles('Example/Podfile.lock') }} - restore-keys: | - pods-${{ runner.os }}- - - - name: Install CocoaPods - working-directory: Example - run: | - gem install cocoapods -v 1.16.2 --no-document --user-install - GEM_USER_BIN="$(gem env user_gemhome)/bin" - export PATH="$GEM_USER_BIN:$PATH" - echo "$GEM_USER_BIN" >> "$GITHUB_PATH" - pod --version - pod install --repo-update - - name: Pick iOS Simulator id: sim shell: bash @@ -71,18 +51,20 @@ jobs: xcrun simctl bootstatus "$UDID" -b - name: Resolve SPM dependencies + working-directory: Example run: | xcodebuild -resolvePackageDependencies \ - -workspace "$WORKSPACE" \ + -project "$PROJECT" \ -scheme "$SCHEME" - name: Run tests + working-directory: Example shell: bash run: | set -o pipefail mkdir -p build xcodebuild test \ - -workspace "$WORKSPACE" \ + -project "$PROJECT" \ -scheme "$SCHEME" \ -destination "platform=iOS Simulator,id=${{ steps.sim.outputs.udid }}" \ -resultBundlePath "$RESULT" \ diff --git a/.gitignore b/.gitignore index 01470e3..299ea5f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,6 @@ DerivedData/ # Swift Package Manager local metadata .swiftpm/ -# CocoaPods(Example Demo) -Example/Pods/ - # Artifacts *.hmap *.ipa diff --git a/Docs/STMarkdown-SwiftStreamingMarkdown-Comparison.md b/Docs/STMarkdown-SwiftStreamingMarkdown-Comparison.md deleted file mode 100644 index 270db1a..0000000 --- a/Docs/STMarkdown-SwiftStreamingMarkdown-Comparison.md +++ /dev/null @@ -1,325 +0,0 @@ -# STMarkdown vs SwiftStreamingMarkdown — 流式 Markdown 实现对比 - -> 分析日期:2026-06-17 -> 对比对象:`SwiftStreamingMarkdown`(Microsoft 开源,commit master)与 `STBaseProject/STMarkdown` -> 说明:本文档用于说明两套实现的关键机制、实现边界与可借鉴点。 - ---- - -## 1. 总体架构 - -| 维度 | SwiftStreamingMarkdown | STMarkdown | -|---|---|---| -| UI 框架 | SwiftUI,段落通过 `UIViewRepresentable` 桥接 `UITextView` | UIKit 原生 `UITextView`,另提供 SwiftUI 包装 | -| 解析引擎 | `swift-markdown` `Document(parsing:)` | `swift-markdown` `Document(parsing:)` | -| 渲染对象 | `MarkdownRenderable` -> SwiftUI View | `STMarkdownRenderBlock` -> `NSAttributedString` | -| 流式输入 | 上游每帧提供完整前缀快照 | 支持直接追加 fragment,也支持 `STMarkdownStreamBuffer` 智能缓冲 | -| 流式解析 | 每帧全量重解析 | 安全前缀提交 + 增量解析合并 | -| 推测重写 | AST 层 `MarkupPostParsingRewriter` | 可选 AST 推测重写 + 文本层尾部稳定化 | -| 字体模型 | `TextFonts` 变体包通过 attribute 传播 | `STMarkdownFontResolver` + `STMarkdownStyle` 样式字段 | -| LaTeX | 预处理为 code / attachment 渲染 | 数学占位符归一化 + LaTeX 语法降级 | -| 代码高亮 | 共享高亮实例,队列化处理 | `JavaScriptCore` + 私有串行队列 + `NSCache` | -| 流式动画 | iOS 18 `TextRenderer` 或 `ParagraphUIView` 按词淡入 | `STShimmerTextView` 按字符淡入,可切换行级 mask | -| 高度稳定 | SwiftUI proposal width + `sizeCache` + 只改 alpha | `preferredContentWidth` + TextKit 测量 + 回调防抖 + 只改 alpha | -| 视图复用 | `ParagraphUIViewCache` 复用最多 50 个闲置 `ParagraphUIView` | 由宿主持有 `STMarkdownTextView` / `STMarkdownStreamingTextView` 实例 | - -STMarkdown 覆盖面更广,包含表格附件、Mermaid、脚注、HTML 降级、引用系统、代码块附件、目录锚点等能力。SwiftStreamingMarkdown 的主要借鉴价值集中在 AST 推测重写、文本 reveal 时序、测量缓存和字体变体传播模型。 - ---- - -## 2. 推测重写 - -### SwiftStreamingMarkdown - -`MarkdownParserImpl` 解析完成后执行两个 `MarkupPostParsingRewriter`: - -1. `PartialEmphasisRewriter` - - `PartialEmphasisScanner` 查找最右侧 `Text` 或表格 cell 内最后一个非空 `Text`。 - - 末尾 Text 含未闭合 `**...` / `__...` / `*...` / `_...` 时,重写为 `Strong` 或 `Emphasis`。 - - 当 `*cool*` 前一个 Text 以单 `*` 结尾时,推测合并为 `Strong`。 -2. `PartialTableRewriter` - - `PartialTableScanner` 检查末尾 Paragraph 是否是表头候选。 - - 表头尚未形成完整 GFM table 时清空该 Paragraph,避免裸 `|` 表头行闪烁。 - -### STMarkdown - -STMarkdown 在 `STMarkdownStructureParser` 中持有 `speculativeRewriters`,解析流程为: - -```swift -let normalized = STMarkdownMathNormalizer.normalizeBlocks(in: working) -var document = Document(parsing: normalized.text) - -for rewriter in speculativeRewriters { - if let rewritten = rewriter.rewriteIfApplicable(document: document) { - document = rewritten - } -} - -let blocks = makeBlocks(from: Array(document.children), mathMap: normalized.blockMap) -``` - -流式场景通过 `STMarkdownStructureParser.streamingParser()` 预配置: - -- `STStreamingEmphasisRewriter` -- `STStreamingTableRewriter` - -`STMarkdownStreamingTextView.beginSmartMarkdownStreaming()` 在 `streamSpeculativeRewriteEnabled == true` 时切换到 streaming parser。非流式 parser 保持默认空 rewriter,避免影响完整 Markdown 渲染语义。 - -### 文本层稳定化 - -AST 推测重写之外,STMarkdown 还有 `STMarkdownStreamingPresenter` / `STMarkdownStreamingTransforms` 处理流式尾部: - -- 裁剪不完整引用标签。 -- 稳定表格构造过程中的半截表头、半截数据行。 -- 处理裸 list marker、裸 heading / quote marker。 -- 对尾部 inline code、emphasis、CJK emphasis 边界做展示态修正。 - -AST 层用于保留结构语义;文本层用于避免流式中间态暴露未完成语法。 - ---- - -## 3. 字体与 Typography - -### SwiftStreamingMarkdown - -SST 使用 `TextFonts` 封装: - -- `normal` -- `italic` -- `bold` -- `boldItalic` -- `preferredLetterSpacing` -- `preferredLineHeight` - -该对象通过 `NSAttributedString.Key.typography` 进入 attribute container,嵌套 `Emphasis` / `Strong` 渲染时从父 attribute 读取当前字体上下文,再选择对应字体变体。 - -### STMarkdown - -STMarkdown 使用 `STMarkdownStyle` 和 `STMarkdownFontResolver`: - -- `font` 作为正文基础字体。 -- `boldFont` 可显式指定加粗字体。 -- `STMarkdownFontResolver.boldFont(from:)`、`italicFont(from:)`、`boldItalicFont(from:)` 基于 `fontDescriptor.withSymbolicTraits` 推导字体变体。 -- 字体没有真实 italic / boldItalic 变体时,通过 `obliqueness` 做视觉补偿。 -- `kern`、`lineHeight`、`bodyLineSpacing` 等由 `STMarkdownStyle` 统一控制。 - -当前 inline 渲染通过递归参数 `italic` / `bold` 组合出最终字体。SST 的 attribute container 传播模型更适合未来扩展为多字体上下文、局部 typography override 或复杂主题继承。 - ---- - -## 4. LaTeX 预处理 - -### SwiftStreamingMarkdown - -`LaTexPreProcessorImpl` 会先把 block math 转成特殊 code block,把 inline math 包成 inline code,以降低 CommonMark 对 LaTeX 中 `[`、`*`、反引号等字符的干扰。 - -同时,`filteringUnsupportedSyntaxes()` 对常见不兼容命令做降级: - -| 转换 | 效果 | -|---|---| -| `\boxed` | 移除命令,保留内容 | -| `\dfrac` / `\tfrac` | 降级为 `\frac` | -| `'` | 降级为 `^\prime` | -| `\overrightarrow` | 降级为 `\vec` | -| `\implies` | 降级为 `\Rightarrow` | -| `\rightleftharpoons` | 降级为 `\Leftrightarrow` | -| `\dots` | 降级为 `\ldots` | -| `\bigl` / `\Biggl` 等 | 移除尺寸命令 | - -### STMarkdown - -`STMarkdownMathNormalizer` 负责: - -- 归一化 `\\(` / `\\[` 等转义分隔符。 -- 将 block math 替换为 `{{ST_MATH_BLOCK:N}}` 占位符并保存 `blockMap`。 -- 对 inline math 使用 sentinel 保护分隔符与数学内部的 Markdown 特殊字符。 -- 在 block / inline math 进入渲染节点前调用 `STMarkdownLatexSyntaxNormalizer.normalize(_:)`。 - -`STMarkdownLatexSyntaxNormalizer` 对齐 SST 的 8 类降级转换,使下游 iosMath / KaTeX 渲染器收到更稳定的公式输入。 - ---- - -## 5. 流式逐字输出 - -### SwiftStreamingMarkdown - -SST 的流式输入协议要求每次产出完整前缀快照: - -```swift -public protocol StreamedMarkdownSource { - var text: AsyncStream { get } -} -``` - -`StreamedMarkdownController.start()` 对每个快照执行: - -1. `parser.parse(text: config:)` -2. 主线程更新 `@Published markdownToRender` -3. SwiftUI 刷新 `DocumentView` -4. `ParagraphView.updateUIView` 更新底层 `ParagraphUIView` - -主路径动画在 `ParagraphUIView.setParagraphContents` 中完成: - -```swift -let newContentLength = attributedText.length - oldAttributedString.length -let newContentRange = NSRange(location: oldAttributedString.length, length: newContentLength) -let wordRanges = attributedText.splitIntoWords(withIn: newContentRange) -``` - -随后每个 word range 建立 `FadeAnimationData`: - -- 每词 `duration = 0.5s` -- 词间延迟 `0.1 / wordCount` -- `CADisplayLink` 60fps 驱动 -- 每帧只修改 `foregroundColor.alpha` - -`ParagraphUIViewCache` 会缓存最多 50 个不在 `superview` / `window` 中的 `ParagraphUIView` 实例,用于降低 SwiftUI 更新中频繁创建 `UITextView` 的成本。该缓存是 view 级复用,不按 attributed string 内容建立测量结果缓存;尺寸缓存仍分别位于 `ParagraphUIView.cachedSize` 与 `ParagraphView.Coordinator.sizeCache`。 - -iOS 18 SwiftUI `Text` 路径还提供 `TextRenderer` 逐 glyph 渐现: - -- `glyphDelay = 0.02s` -- `glyphDuration = 0.2s` -- 使用 `UnitCurve.easeOut` - -### STMarkdown - -STMarkdown 的流式输入有两条路径: - -1. 直接追加:`appendMarkdownFragment(_:)` - - 累加到 `rawMarkdown` - - `setMarkdown(..., animated: true)` - - 渲染后由 `applySetMarkdownAnimatedDiff` 做 attributed string diff -2. 智能缓冲:`beginSmartMarkdownStreaming()` + `appendSmartMarkdownStreamingChunk(_:)` - - `STMarkdownStreamBuffer` 累积 chunk - - 只提交 `committedSafePrefix` - - `renderSmartStreamingDisplayMarkdown` 在前缀单调增长时走 `engine.processIncremental` - -动画由 `STShimmerTextView` 执行: - -- `_baseAttributedText` 保存最终全不透明 attributed string。 -- 新增内容先以 `foregroundColor.alpha = 0` 插入 `textStorage`。 -- `appendStaggeredTokens` 记录 range、targetColor、startTime、staggerInterval。 -- `handleDisplayLink` 每帧按字符更新 alpha。 -- `characterStaggerInterval = 0.016s`,`tokenFadeDuration` 默认 0.3s。 -- `lineFadeMode` 可切换为 `CAGradientLayer` 水平扫入 mask。 - -`STShimmerTextView` 位于 `Sources/STUIKit/STTextView`,STMarkdown 通过 `STMarkdownStreamingTextView` 组合使用它。字符级 fade 会跳过 attachment 与 `STShimmerTextView.skipFadeIn` 标记的片段;行级 fade 使用 `CAGradientLayer` mask,并在 iOS 16+ 优先走 TextKit 2 的 `NSTextLayoutManager` 获取行 rect,低版本回退 TextKit 1。 - -### 参数对照 - -| 参数 | SST `ParagraphUIView` | STMarkdown `STShimmerTextView` | -|---|---|---| -| 默认粒度 | word / 分隔符 range | character | -| 每单位时长 | 0.5s | `tokenFadeDuration` 默认 0.3s | -| stagger | `0.1 / wordCount` | `characterStaggerInterval = 0.016s` | -| easing | cubic Bezier `(0.1, 1.0)` | `1 - (1 - t)^3` | -| 驱动 | `CADisplayLink` | `CADisplayLink` | -| 动画属性 | `foregroundColor.alpha` | `foregroundColor.alpha` 或 mask | -| 最终态缓存 | `paragraphContents` | `_baseAttributedText` | - ---- - -## 6. 高度稳定 - -### SwiftStreamingMarkdown - -SST 的高度稳定由以下机制组合完成: - -1. `ParagraphUIView.intrinsicContentSize` - - 使用当前 `bounds.width` 调用 `sizeThatFits`。 - - `bounds.width` 不可用时 fallback 到屏幕宽度。 - - 宽度变化时清空内部 `cachedSize`。 -2. `ParagraphView.sizeThatFits` - - 使用 SwiftUI proposal width。 - - `Coordinator.sizeCache` 按 width 缓存 `CGSize`。 - - width 四舍五入到 0.1pt,减少浮点误差造成的 cache miss。 - - 内容或 `lineSpacing` 变化时清空 cache。 -3. SwiftUI 布局 - - 段落使用 `.fixedSize(horizontal: false, vertical: true)`。 - - 垂直方向依赖 UIKit 测量结果自适应。 -4. 动画策略 - - reveal 只改颜色 alpha,不改文本、字体、段落样式或 attachment bounds。 - - `finishAnimationsBeforeLastNewline()` 在跨行时让最后一个换行前的内容立即全不透明。 - -### STMarkdown - -STMarkdown 的高度稳定由 UIKit 测量、宽度契约和回调防抖组成: - -1. `STMarkdownBaseTextView.intrinsicContentSize` - - 使用 `resolvedMarkdownMeasurementWidth()` 得到测量宽度。 - - `sizeThatFits` 后进入 `resolvedTextViewContentHeight(...)`。 -2. 宽度来源优先级 - - `preferredContentWidth` - - `bounds.width` - - `textView.bounds.width` - - `textView.frame.width` - - `window?.bounds.width` - - `UIScreen.main.bounds.width` -3. 首帧高度兜底 - - 已有 attributedText 但 `sizeThatFits` 读到 0 时,回退 `contentSize.height`。 - - 仍为 0 时再回退 `textView.bounds.height`。 -4. 测量工具 - - 默认 `intrinsicContentSize` 使用 `UITextView.sizeThatFits`,并在首帧 0 高度时回退 `contentSize.height` / `bounds.height`。 - - `STMarkdownTextViewMeasure.measure` 是独立 TextKit 1 测量工具,可由外部在需要固定网格高度时调用。 - - 该工具使用 `layoutManager.usedRect(for:)` 得到内容高度,并按 `gridSize` 向上取整,默认 2pt,用于减轻亚像素抖动。 -5. 高度通知 - - `onContentLayoutHeightChange` 由 `publishContentLayoutHeightNotificationIfNeeded` 触发。 - - `contentLayoutHeightNotificationThreshold` 默认 9pt。 - - `contentLayoutHeightNotificationMinInterval` 可限制通知频率。 - - `suppressTransientZeroContentLayoutHeightNotification` 避免有内容时发布瞬时 0 高度。 -6. 动画策略 - - 默认字符级 reveal 只改 `foregroundColor.alpha`。 - - 追加和替换内容时保存并恢复 `contentOffset`。 - - `animateAcrossNewlines == false` 时只保留最后一行动画。 - -### 对照 - -| 维度 | SwiftStreamingMarkdown | STMarkdown | -|---|---|---| -| 显式测量缓存 | `ParagraphUIView.cachedSize` + `ParagraphView.Coordinator.sizeCache` | 主要依赖 TextKit 缓存;可通过 `STMarkdownTextViewMeasure` 做外部测量 | -| 宽度来源 | SwiftUI proposal width | `preferredContentWidth` 优先,随后 fallback 到视图/屏幕宽度 | -| 高度粒度 | `ceil(height)` | 默认 `ceil(height)`;外部测量工具可按 `gridSize` 向上取整 | -| 跨行 reveal | 换行前内容立即完成动画 | `finishAnimationsBeforeLastNewline()` 同类策略 | -| 宿主通知 | SwiftUI layout 自动驱动 | `onContentLayoutHeightChange` + threshold / minInterval | - -自适应高度 cell 使用 STMarkdown 时,建议由宿主设置 `preferredContentWidth`,让首帧测量宽度与最终 cell 宽度一致。 - ---- - -## 7. 代码高亮 - -### SwiftStreamingMarkdown - -SST 的高亮任务通过 manager 聚合: - -- 共享高亮实例。 -- 保留 latest code。 -- 避免并发创建多个高亮上下文。 -- 串行处理高亮任务。 - -### STMarkdown - -`STMarkdownCodeHighlighter` 使用: - -- `JavaScriptCore` -- 单个 `JSVirtualMachine` -- 单个 `JSContext` -- 私有串行队列 `jsQueue` -- `NSCache`,`totalCostLimit = 10MB` -- `NSLock` 保护缓存读写 - -该模型与 SST 的核心目标一致:复用 JS 上下文,串行访问高亮引擎,用缓存吸收重复代码块渲染。 - ---- - -## 8. 测量缓存扩展方向 - -SST 在 SwiftUI bridge 层直接按 proposal width 缓存 `CGSize`。STMarkdown 可以在 UIKit 层按以下维度扩展测量缓存: - -- attributed text 版本或内容 hash -- width,建议 round 到 0.5pt 或 1pt -- textContainerInset -- font / Dynamic Type trait -- 影响 attachment bounds 的渲染配置 - -缓存适合放在 `STMarkdownBaseTextView` 或 `STMarkdownTextViewMeasure` 上层调用方中。对带异步 attachment 的内容,attachment 刷新后需要使对应缓存失效。 diff --git a/Example/.gitignore b/Example/.gitignore index 9720387..b9a467b 100644 --- a/Example/.gitignore +++ b/Example/.gitignore @@ -10,6 +10,3 @@ # Build outputs DerivedData/ build/ - -# CocoaPods -Pods/ diff --git a/Example/Podfile b/Example/Podfile deleted file mode 100644 index f218d70..0000000 --- a/Example/Podfile +++ /dev/null @@ -1,36 +0,0 @@ -# Demo 与 CocoaPods 脚手架:在 `Example/` 执行 `pod install` 后,请打开仓库根目录的 `STBaseProject.xcworkspace`。 -platform :ios, '16.0' - -target 'STBaseProjectExample' do - use_frameworks! - - # Mirrors SPM `Package.swift` (Markdown + SwiftMath); STMarkdown subspec pulls STBaseProject core transitively. -# pod 'STBaseProject/STMarkdown', path: '..' - - target 'STBaseProjectExampleTests' do - inherit! :search_paths - # Pods for testing - end - - target 'STBaseProjectExampleUITests' do - # Pods for testing - end - -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - deployment = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] - if deployment && deployment.to_f < 12.0 - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' - end - if target.name.include?('swift-markdown') - existing = config.build_settings['OTHER_CFLAGS'] || '$(inherited)' - unless existing.to_s.include?('incomplete-umbrella') - config.build_settings['OTHER_CFLAGS'] = "#{existing} -Wno-incomplete-umbrella" - end - end - end - end -end diff --git a/Example/Podfile.lock b/Example/Podfile.lock deleted file mode 100644 index 4d96eac..0000000 --- a/Example/Podfile.lock +++ /dev/null @@ -1,3 +0,0 @@ -PODFILE CHECKSUM: 05d8d9de40eda1522f695addf156f3e5bccf1d99 - -COCOAPODS: 1.16.2 diff --git a/Example/STBaseProjectExample.xcodeproj/project.pbxproj b/Example/STBaseProjectExample.xcodeproj/project.pbxproj index 6037543..85c64fc 100644 --- a/Example/STBaseProjectExample.xcodeproj/project.pbxproj +++ b/Example/STBaseProjectExample.xcodeproj/project.pbxproj @@ -7,14 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 24E42D55FA269510FCC339D8 /* Pods_STBaseProjectExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9585ED53167BB872ED6FAED0 /* Pods_STBaseProjectExample.framework */; }; - 3BC33DCE6667208FB2C173D7 /* Pods_STBaseProjectExampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0283393535FD1ACC2B18EBC8 /* Pods_STBaseProjectExampleTests.framework */; }; - CAAB0100000000000000AA01 /* STContacts in Frameworks */ = {isa = PBXBuildFile; productRef = CAAB0100000000000000AA00 /* STContacts */; }; - CAAB0200000000000000AA01 /* STMedia in Frameworks */ = {isa = PBXBuildFile; productRef = CAAB0200000000000000AA00 /* STMedia */; }; - CAAB0300000000000000AA01 /* STLocation in Frameworks */ = {isa = PBXBuildFile; productRef = CAAB0300000000000000AA00 /* STLocation */; }; - CAAB0400000000000000AA01 /* STBaseProject in Frameworks */ = {isa = PBXBuildFile; productRef = CAAB0400000000000000AA00 /* STBaseProject */; }; - E4EEED8B2FA0B5D300730900 /* STBaseProject in Frameworks */ = {isa = PBXBuildFile; productRef = E4EEED8A2FA0B5D300730900 /* STBaseProject */; }; - F0B670DF2C171EB57F86C428 /* Pods_STBaseProjectExample_STBaseProjectExampleUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ECB33F317DD5400A18A89B8 /* Pods_STBaseProjectExample_STBaseProjectExampleUITests.framework */; }; + E4CF29FF302C7E8C00F589DE /* STMarkdown in Frameworks */ = {isa = PBXBuildFile; productRef = E4CF29FE302C7E8C00F589DE /* STMarkdown */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -35,18 +28,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0283393535FD1ACC2B18EBC8 /* Pods_STBaseProjectExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_STBaseProjectExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2ECB33F317DD5400A18A89B8 /* Pods_STBaseProjectExample_STBaseProjectExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_STBaseProjectExample_STBaseProjectExampleUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 51B6EBC982779829B921D155 /* Pods-STBaseProjectExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-STBaseProjectExample.release.xcconfig"; path = "Target Support Files/Pods-STBaseProjectExample/Pods-STBaseProjectExample.release.xcconfig"; sourceTree = ""; }; - 71A69D3A328698A5A101D8A2 /* Pods-STBaseProjectExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-STBaseProjectExampleTests.release.xcconfig"; path = "Target Support Files/Pods-STBaseProjectExampleTests/Pods-STBaseProjectExampleTests.release.xcconfig"; sourceTree = ""; }; - 88AD10DB079D2C69D4489093 /* Pods-STBaseProjectExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-STBaseProjectExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-STBaseProjectExampleTests/Pods-STBaseProjectExampleTests.debug.xcconfig"; sourceTree = ""; }; - 9392E095265ABE853F0112D6 /* Pods-STBaseProjectExample-STBaseProjectExampleUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-STBaseProjectExample-STBaseProjectExampleUITests.debug.xcconfig"; path = "Target Support Files/Pods-STBaseProjectExample-STBaseProjectExampleUITests/Pods-STBaseProjectExample-STBaseProjectExampleUITests.debug.xcconfig"; sourceTree = ""; }; - 9585ED53167BB872ED6FAED0 /* Pods_STBaseProjectExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_STBaseProjectExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DC62E94F4EEA49C7CAD4411A /* Pods-STBaseProjectExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-STBaseProjectExample.debug.xcconfig"; path = "Target Support Files/Pods-STBaseProjectExample/Pods-STBaseProjectExample.debug.xcconfig"; sourceTree = ""; }; E4EEECD32FA0B1AD00730900 /* STBaseProjectExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = STBaseProjectExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; E4EEECE92FA0B1AD00730900 /* STBaseProjectExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = STBaseProjectExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E4EEECF32FA0B1AD00730900 /* STBaseProjectExampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = STBaseProjectExampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - F5ED43C14EFB7931CEAB5F3B /* Pods-STBaseProjectExample-STBaseProjectExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-STBaseProjectExample-STBaseProjectExampleUITests.release.xcconfig"; path = "Target Support Files/Pods-STBaseProjectExample-STBaseProjectExampleUITests/Pods-STBaseProjectExample-STBaseProjectExampleUITests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -85,8 +69,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E4EEED8B2FA0B5D300730900 /* STBaseProject in Frameworks */, - 24E42D55FA269510FCC339D8 /* Pods_STBaseProjectExample.framework in Frameworks */, + E4CF29FF302C7E8C00F589DE /* STMarkdown in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -94,11 +77,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CAAB0100000000000000AA01 /* STContacts in Frameworks */, - CAAB0200000000000000AA01 /* STMedia in Frameworks */, - CAAB0300000000000000AA01 /* STLocation in Frameworks */, - CAAB0400000000000000AA01 /* STBaseProject in Frameworks */, - 3BC33DCE6667208FB2C173D7 /* Pods_STBaseProjectExampleTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -106,26 +84,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F0B670DF2C171EB57F86C428 /* Pods_STBaseProjectExample_STBaseProjectExampleUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 19FCEE42B9FAD6357AF9B126 /* Pods */ = { - isa = PBXGroup; - children = ( - DC62E94F4EEA49C7CAD4411A /* Pods-STBaseProjectExample.debug.xcconfig */, - 51B6EBC982779829B921D155 /* Pods-STBaseProjectExample.release.xcconfig */, - 9392E095265ABE853F0112D6 /* Pods-STBaseProjectExample-STBaseProjectExampleUITests.debug.xcconfig */, - F5ED43C14EFB7931CEAB5F3B /* Pods-STBaseProjectExample-STBaseProjectExampleUITests.release.xcconfig */, - 88AD10DB079D2C69D4489093 /* Pods-STBaseProjectExampleTests.debug.xcconfig */, - 71A69D3A328698A5A101D8A2 /* Pods-STBaseProjectExampleTests.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; E4EEECCA2FA0B1AD00730900 = { isa = PBXGroup; children = ( @@ -133,7 +97,6 @@ E4EEECEC2FA0B1AD00730900 /* STBaseProjectExampleTests */, E4EEECF62FA0B1AD00730900 /* STBaseProjectExampleUITests */, E4EEECD42FA0B1AD00730900 /* Products */, - 19FCEE42B9FAD6357AF9B126 /* Pods */, EF85DB02CCB1E0993DCB46D9 /* Frameworks */, ); sourceTree = ""; @@ -151,9 +114,6 @@ EF85DB02CCB1E0993DCB46D9 /* Frameworks */ = { isa = PBXGroup; children = ( - 9585ED53167BB872ED6FAED0 /* Pods_STBaseProjectExample.framework */, - 2ECB33F317DD5400A18A89B8 /* Pods_STBaseProjectExample_STBaseProjectExampleUITests.framework */, - 0283393535FD1ACC2B18EBC8 /* Pods_STBaseProjectExampleTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -165,7 +125,6 @@ isa = PBXNativeTarget; buildConfigurationList = E4EEECFC2FA0B1AD00730900 /* Build configuration list for PBXNativeTarget "STBaseProjectExample" */; buildPhases = ( - FC602DE85749453F6C6ED923 /* [CP] Check Pods Manifest.lock */, E4EEECCF2FA0B1AD00730900 /* Sources */, E4EEECD02FA0B1AD00730900 /* Frameworks */, E4EEECD12FA0B1AD00730900 /* Resources */, @@ -179,7 +138,7 @@ ); name = STBaseProjectExample; packageProductDependencies = ( - E4EEED8A2FA0B5D300730900 /* STBaseProject */, + E4CF29FE302C7E8C00F589DE /* STMarkdown */, ); productName = STBaseProjectExample; productReference = E4EEECD32FA0B1AD00730900 /* STBaseProjectExample.app */; @@ -189,7 +148,6 @@ isa = PBXNativeTarget; buildConfigurationList = E4EEED012FA0B1AD00730900 /* Build configuration list for PBXNativeTarget "STBaseProjectExampleTests" */; buildPhases = ( - 3E337D8B1794D92F27AE3BB7 /* [CP] Check Pods Manifest.lock */, E4EEECE52FA0B1AD00730900 /* Sources */, E4EEECE62FA0B1AD00730900 /* Frameworks */, E4EEECE72FA0B1AD00730900 /* Resources */, @@ -204,10 +162,6 @@ ); name = STBaseProjectExampleTests; packageProductDependencies = ( - CAAB0100000000000000AA00 /* STContacts */, - CAAB0200000000000000AA00 /* STMedia */, - CAAB0300000000000000AA00 /* STLocation */, - CAAB0400000000000000AA00 /* STBaseProject */, ); productName = STBaseProjectExampleTests; productReference = E4EEECE92FA0B1AD00730900 /* STBaseProjectExampleTests.xctest */; @@ -217,7 +171,6 @@ isa = PBXNativeTarget; buildConfigurationList = E4EEED042FA0B1AD00730900 /* Build configuration list for PBXNativeTarget "STBaseProjectExampleUITests" */; buildPhases = ( - B71AD6F9190827153D4A40DE /* [CP] Check Pods Manifest.lock */, E4EEECEF2FA0B1AD00730900 /* Sources */, E4EEECF02FA0B1AD00730900 /* Frameworks */, E4EEECF12FA0B1AD00730900 /* Resources */, @@ -264,11 +217,12 @@ knownRegions = ( en, Base, + "zh-Hans", ); mainGroup = E4EEECCA2FA0B1AD00730900; minimizedProjectReferenceProxies = 1; packageReferences = ( - E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */, + E4CF29FD302C7E8C00F589DE /* XCLocalSwiftPackageReference "../../STMarkdown" */, ); preferredProjectObjectVersion = 77; productRefGroup = E4EEECD42FA0B1AD00730900 /* Products */; @@ -306,75 +260,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 3E337D8B1794D92F27AE3BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-STBaseProjectExampleTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - B71AD6F9190827153D4A40DE /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-STBaseProjectExample-STBaseProjectExampleUITests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - FC602DE85749453F6C6ED923 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-STBaseProjectExample-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ E4EEECCF2FA0B1AD00730900 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -415,7 +300,6 @@ /* Begin XCBuildConfiguration section */ E4EEECFD2FA0B1AD00730900 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DC62E94F4EEA49C7CAD4411A /* Pods-STBaseProjectExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -449,7 +333,6 @@ }; E4EEECFE2FA0B1AD00730900 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 51B6EBC982779829B921D155 /* Pods-STBaseProjectExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -604,7 +487,6 @@ }; E4EEED022FA0B1AD00730900 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 88AD10DB079D2C69D4489093 /* Pods-STBaseProjectExampleTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -627,7 +509,6 @@ }; E4EEED032FA0B1AD00730900 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71A69D3A328698A5A101D8A2 /* Pods-STBaseProjectExampleTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -650,7 +531,6 @@ }; E4EEED052FA0B1AD00730900 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9392E095265ABE853F0112D6 /* Pods-STBaseProjectExample-STBaseProjectExampleUITests.debug.xcconfig */; buildSettings = { CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -672,7 +552,6 @@ }; E4EEED062FA0B1AD00730900 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F5ED43C14EFB7931CEAB5F3B /* Pods-STBaseProjectExample-STBaseProjectExampleUITests.release.xcconfig */; buildSettings = { CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -734,37 +613,16 @@ /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ - E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */ = { + E4CF29FD302C7E8C00F589DE /* XCLocalSwiftPackageReference "../../STMarkdown" */ = { isa = XCLocalSwiftPackageReference; - relativePath = ..; + relativePath = ../../STMarkdown; }; /* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - CAAB0100000000000000AA00 /* STContacts */ = { - isa = XCSwiftPackageProductDependency; - package = E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */; - productName = STContacts; - }; - CAAB0200000000000000AA00 /* STMedia */ = { - isa = XCSwiftPackageProductDependency; - package = E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */; - productName = STMedia; - }; - CAAB0300000000000000AA00 /* STLocation */ = { - isa = XCSwiftPackageProductDependency; - package = E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */; - productName = STLocation; - }; - CAAB0400000000000000AA00 /* STBaseProject */ = { - isa = XCSwiftPackageProductDependency; - package = E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */; - productName = STBaseProject; - }; - E4EEED8A2FA0B5D300730900 /* STBaseProject */ = { + E4CF29FE302C7E8C00F589DE /* STMarkdown */ = { isa = XCSwiftPackageProductDependency; - package = E4EEED892FA0B5D300730900 /* XCLocalSwiftPackageReference ".." */; - productName = STBaseProject; + productName = STMarkdown; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/Example/STBaseProjectExample.xcworkspace/contents.xcworkspacedata b/Example/STBaseProjectExample.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 0bcbc55..0000000 --- a/Example/STBaseProjectExample.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Example/STBaseProjectExample/Resources/en.lproj/Localizable.strings b/Example/STBaseProjectExample/Resources/en.lproj/Localizable.strings new file mode 100644 index 0000000..8f33134 --- /dev/null +++ b/Example/STBaseProjectExample/Resources/en.lproj/Localizable.strings @@ -0,0 +1,3 @@ +/* Navigation bar button accessibility fallback labels */ +"st_nav_back" = "Back"; +"st_nav_more" = "More"; diff --git a/Example/STBaseProjectExample/Resources/zh-Hans.lproj/Localizable.strings b/Example/STBaseProjectExample/Resources/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..dc7d1af --- /dev/null +++ b/Example/STBaseProjectExample/Resources/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,3 @@ +/* 导航栏按钮无障碍兜底文案 */ +"st_nav_back" = "返回"; +"st_nav_more" = "更多"; diff --git a/Example/STBaseProjectExample/ViewController.swift b/Example/STBaseProjectExample/ViewController.swift index 9fba52c..94c0d8b 100644 --- a/Example/STBaseProjectExample/ViewController.swift +++ b/Example/STBaseProjectExample/ViewController.swift @@ -40,10 +40,7 @@ class ViewController: BaseViewController { self.dataSouces["TabBar 测试"] = STTabBarTestViewController() self.dataSouces["Log/HUD 背景测试"] = STLogAndHUDTestViewController() self.dataSouces["STTimer 功能测试"] = STTimerTestViewController() - self.dataSouces["STTools 手动测试"] = STToolsManualTestViewController() - self.dataSouces["Markdown 流式渲染测试"] = STMarkdownStreamingTestViewController() self.dataSouces["Shimmer 动画测试"] = STShimmerTextViewTestViewController() - self.dataSouces["SSE 流式渲染测试"] = STSSEViewController(nibName: "STSSEViewController", bundle: nil) self.dataSouces["BottomSheet测试"] = STBottomSheetTestViewController() self.tableView.reloadData() diff --git a/Example/STBaseProjectExample/ViewControllers/STMarkdownStreamingTestViewController.swift b/Example/STBaseProjectExample/ViewControllers/STMarkdownStreamingTestViewController.swift deleted file mode 100644 index 8ef2cdc..0000000 --- a/Example/STBaseProjectExample/ViewControllers/STMarkdownStreamingTestViewController.swift +++ /dev/null @@ -1,312 +0,0 @@ -// -// STMarkdownStreamingTestViewController.swift -// STBaseProjectExample -// -// Created by 寒江孤影 on 2026/5/11. -// - -import UIKit -import STBaseProject - -/// 从 Bundle 读取 `Resources/data1~3.txt`,通过 ``STMarkdownStreamingTextView`` 智能流式 API 逐字渲染。 -final class STMarkdownStreamingTestViewController: BaseViewController { - - private enum StreamSpeed: CaseIterable { - case slow - case normal - case fast - - var interval: TimeInterval { - switch self { - case .slow: return 0.04 - case .normal: return 0.02 - case .fast: return 0.008 - } - } - - var step: Int { - switch self { - case .slow: return 1 - case .normal: return 2 - case .fast: return 4 - } - } - - var title: String { - switch self { - case .slow: return "慢" - case .normal: return "中" - case .fast: return "快" - } - } - } - - private static let fixtureNames = ["data1", "data2", "data3"] - - private var typewriterTimer: Timer? - private var fullMarkdownText: String = "" - private var currentIndex: Int = 0 - private var isPaused = false - private var streamSpeed: StreamSpeed = .normal - - override func viewDidLoad() { - super.viewDidLoad() - self.titleLabel.text = "Markdown 流式测试" - self.buildUI() - self.startRendering() - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - self.stopTypewriter() - } - - // MARK: - UI - - private func buildUI() { - let controlStack = UIStackView(arrangedSubviews: [ - self.speedControl, - self.pauseButton, - self.reloadButton - ]) - controlStack.translatesAutoresizingMaskIntoConstraints = false - controlStack.axis = .horizontal - controlStack.spacing = 8 - controlStack.distribution = .fillEqually - - self.view.addSubview(self.statusLabel) - self.view.addSubview(self.progressView) - self.view.addSubview(self.renderView) - self.view.addSubview(controlStack) - - NSLayoutConstraint.activate([ - self.statusLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 8), - self.statusLabel.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16), - self.statusLabel.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16), - - self.progressView.topAnchor.constraint(equalTo: self.statusLabel.bottomAnchor, constant: 8), - self.progressView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16), - self.progressView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16), - - controlStack.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16), - controlStack.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16), - controlStack.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -12), - controlStack.heightAnchor.constraint(equalToConstant: 40), - - self.renderView.topAnchor.constraint(equalTo: self.progressView.bottomAnchor, constant: 12), - self.renderView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16), - self.renderView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16), - self.renderView.bottomAnchor.constraint(equalTo: controlStack.topAnchor, constant: -12) - ]) - - self.applyLiquidGlassScrollLayout(self.renderView.contentTextView) - } - - // MARK: - Actions - - @objc private func speedChanged(_ sender: UISegmentedControl) { - let index = sender.selectedSegmentIndex - guard index >= 0, index < StreamSpeed.allCases.count else { return } - self.streamSpeed = StreamSpeed.allCases[index] - if self.typewriterTimer != nil { - self.restartTimerIfNeeded() - } - } - - @objc private func pauseTapped() { - self.isPaused.toggle() - self.pauseButton.setTitle(self.isPaused ? "继续" : "暂停", for: .normal) - self.updateStatusLabel() - } - - @objc private func restartRenderTapped() { - self.startRendering() - } - - // MARK: - Streaming - - private func startRendering() { - self.stopTypewriter() - self.isPaused = false - self.pauseButton.setTitle("暂停", for: .normal) - self.currentIndex = 0 - - self.fullMarkdownText = self.loadAllFixtures() - self.renderView.reset() - - guard self.fullMarkdownText.isEmpty == false else { - self.renderView.setMarkdown( - "资源读取失败,请确认 `Resources/data1~3.txt` 已加入主工程 Bundle。", - animated: false - ) - self.progressView.progress = 0 - self.statusLabel.text = "加载失败" - return - } - - self.renderView.beginSmartMarkdownStreaming() - self.updateStatusLabel() - self.restartTimerIfNeeded() - } - - private func restartTimerIfNeeded() { - guard self.currentIndex < self.fullMarkdownText.count else { return } - self.stopTypewriter() - self.typewriterTimer = Timer.scheduledTimer( - timeInterval: self.streamSpeed.interval, - target: self, - selector: #selector(self.handleTypewriterTick), - userInfo: nil, - repeats: true - ) - if let timer = self.typewriterTimer { - RunLoop.main.add(timer, forMode: .common) - } - } - - private func stopTypewriter() { - self.typewriterTimer?.invalidate() - self.typewriterTimer = nil - } - - @objc private func handleTypewriterTick() { - guard self.isPaused == false else { return } - guard self.currentIndex < self.fullMarkdownText.count else { - self.completeStreaming() - return - } - - let next = min(self.currentIndex + self.streamSpeed.step, self.fullMarkdownText.count) - let start = self.fullMarkdownText.index(self.fullMarkdownText.startIndex, offsetBy: self.currentIndex) - let end = self.fullMarkdownText.index(self.fullMarkdownText.startIndex, offsetBy: next) - let chunk = String(self.fullMarkdownText[start.. 0 else { return } - let targetY = max(-textView.contentInset.top, bottom) - if abs(textView.contentOffset.y - targetY) > 4 { - textView.setContentOffset(CGPoint(x: 0, y: targetY), animated: false) - } - } - - // MARK: - Resources - - private func loadAllFixtures() -> String { - let sections = Self.fixtureNames.compactMap { name -> String? in - self.readFixture(named: name).map { "## \(name).txt\n\n\($0)" } - } - return sections.joined(separator: "\n\n---\n\n") - } - - private func readFixture(named name: String) -> String? { - guard let url = Bundle.main.url(forResource: name, withExtension: "txt") else { - return nil - } - return try? String(contentsOf: url, encoding: .utf8) - } - - // MARK: - Subviews - - private lazy var statusLabel: UILabel = { - let label = UILabel() - label.translatesAutoresizingMaskIntoConstraints = false - label.font = .systemFont(ofSize: 13, weight: .medium) - label.textColor = .secondaryLabel - label.numberOfLines = 2 - label.text = "准备加载…" - return label - }() - - private lazy var progressView: UIProgressView = { - let view = UIProgressView(progressViewStyle: .default) - view.translatesAutoresizingMaskIntoConstraints = false - view.progress = 0 - return view - }() - - private lazy var renderView: STMarkdownStreamingTextView = { - let view = STMarkdownStreamingTextView( - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine() - ) - view.translatesAutoresizingMaskIntoConstraints = false - view.backgroundColor = .secondarySystemBackground - view.layer.cornerRadius = 8 - view.clipsToBounds = true - view.isTextSelectionEnabled = true - view.tokenFadeDuration = 0.1 - view.animateAcrossNewlines = false - return view - }() - - private lazy var speedControl: UISegmentedControl = { - let control = UISegmentedControl(items: StreamSpeed.allCases.map(\.title)) - control.translatesAutoresizingMaskIntoConstraints = false - control.selectedSegmentIndex = 1 - control.addTarget(self, action: #selector(self.speedChanged), for: .valueChanged) - return control - }() - - private lazy var pauseButton: UIButton = { - let button = UIButton(type: .system) - button.translatesAutoresizingMaskIntoConstraints = false - button.setTitle("暂停", for: .normal) - button.titleLabel?.font = .systemFont(ofSize: 15, weight: .medium) - button.addTarget(self, action: #selector(self.pauseTapped), for: .touchUpInside) - return button - }() - - private lazy var reloadButton: UIButton = { - let button = UIButton(type: .system) - button.translatesAutoresizingMaskIntoConstraints = false - button.setTitle("重新渲染", for: .normal) - button.titleLabel?.font = .systemFont(ofSize: 15, weight: .medium) - button.addTarget(self, action: #selector(self.restartRenderTapped), for: .touchUpInside) - return button - }() -} diff --git a/Example/STBaseProjectExample/ViewControllers/STSSEViewController.swift b/Example/STBaseProjectExample/ViewControllers/STSSEViewController.swift deleted file mode 100644 index 398da49..0000000 --- a/Example/STBaseProjectExample/ViewControllers/STSSEViewController.swift +++ /dev/null @@ -1,797 +0,0 @@ -// -// STSSEViewController.swift -// STBaseProjectExample -// -// Created by 寒江孤影 on 2026/5/22. -// - -import UIKit -import STBaseProject - -/// 模拟 SSE 三路消息:本地 Bundle 读 data1~3 → Timer 切块 → ``STMarkdownStreamingTextView`` 逐字渲染。 -/// -/// 使用 ``UITableView`` 做 Cell 复用,避免聊天列表变长后 ``UIScrollView`` 堆叠全部 ``STMarkdownStreamingTextView`` 导致卡顿。 -class STSSEViewController: STBaseViewController { - - private struct StreamFixture { - let name: String - let content: String - let blockCount: Int - let tableOfContentsCount: Int - var streamedMarkdown: String = "" - var isCompleted: Bool = false - } - - private enum ParseValidationError: LocalizedError { - case emptySourceBlocks(String) - case emptyRenderBlocks(String) - - var errorDescription: String? { - switch self { - case .emptySourceBlocks(let name): - return "\(name).txt:source AST 为空" - case .emptyRenderBlocks(let name): - return "\(name).txt:render AST 为空" - } - } - } - - private static let fixtureNames = ["data1", "data2", "data3"] - private static let markdownEngine = STMarkdownEngine() - - private let statusLabel = UILabel() - private let tableView = UITableView(frame: .zero, style: .plain) - private var fixtures: [StreamFixture] = [] - private var streamingTimer: Timer? - private var currentFixtureIndex: Int = 0 - private var currentCharacterIndex: Int = 0 - private var isStreaming = false - private var layoutFlushWorkItem: DispatchWorkItem? - /// 精确行高缓存;不依赖 `estimatedHeightForRowAt`,由 `heightForRowAt` 唯一决定行高。 - private var rowHeights: [Int: CGFloat] = [:] - private var lastStatusUpdateUptime: TimeInterval = 0 - private var lastLayoutFlushUptime: TimeInterval = 0 - private var pinsStreamToBottom = true - - /// 逐字输出;TableView 仅用 `rowHeights` + `heightForRowAt` 精确行高(`estimatedRowHeight = 0`)。 - private let streamInterval: TimeInterval = 0.025 - private let streamStep = 1 - private let layoutFlushMinInterval: TimeInterval = 0.5 - private let layoutHeightDeltaThreshold: CGFloat = 36 - private let statusUpdateMinInterval: TimeInterval = 0.3 - private static let placeholderRowHeight: CGFloat = 96 - - override func viewDidLoad() { - super.viewDidLoad() - self.titleLabel.text = "SSE 流式测试" - self.view.backgroundColor = .systemBackground - - self.setupStatusLabel() - self.setupTableView() - self.addStartButton() - self.updateStatusLabel(idle: true) - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - self.stopStreaming() - } - - // MARK: - UI - - private func setupStatusLabel() { - self.statusLabel.translatesAutoresizingMaskIntoConstraints = false - self.statusLabel.font = .systemFont(ofSize: 13, weight: .medium) - self.statusLabel.textColor = .secondaryLabel - self.statusLabel.numberOfLines = 2 - self.statusLabel.textAlignment = .center - self.statusLabel.lineBreakMode = .byTruncatingTail - - self.view.addSubview(self.statusLabel) - NSLayoutConstraint.activate([ - self.statusLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 8), - self.statusLabel.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16), - self.statusLabel.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16), - self.statusLabel.heightAnchor.constraint(equalToConstant: 44) - ]) - } - - private func setupTableView() { - self.tableView.translatesAutoresizingMaskIntoConstraints = false - self.tableView.delegate = self - self.tableView.dataSource = self - self.tableView.register(SSEMarkdownCell.self, forCellReuseIdentifier: SSEMarkdownCell.reuseIdentifier) - self.tableView.rowHeight = UITableView.automaticDimension - // 关闭 estimated 行高,避免与真实高度不一致时系统校正 contentOffset 造成抖动。 - self.tableView.estimatedRowHeight = 0 - self.tableView.separatorStyle = .none - self.tableView.backgroundColor = .systemBackground - self.tableView.contentInset = UIEdgeInsets(top: 4, left: 0, bottom: 100, right: 0) - self.tableView.contentInsetAdjustmentBehavior = .never - - self.view.addSubview(self.tableView) - NSLayoutConstraint.activate([ - self.tableView.topAnchor.constraint(equalTo: self.statusLabel.bottomAnchor, constant: 8), - self.tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), - self.tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - self.tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor) - ]) - } - - private func addStartButton() { - let button = UIButton(type: .system) - if #available(iOS 15.0, *) { - var configuration = UIButton.Configuration.filled() - configuration.title = "▶️ 校验并流式展示 3 份资源" - configuration.baseBackgroundColor = .systemBlue - configuration.baseForegroundColor = .white - configuration.cornerStyle = .large - configuration.contentInsets = NSDirectionalEdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24) - button.configuration = configuration - } else { - button.setTitle("▶️ 校验并流式展示 3 份资源", for: .normal) - button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18) - button.backgroundColor = .systemBlue - button.setTitleColor(.white, for: .normal) - button.layer.cornerRadius = 12 - button.contentEdgeInsets = UIEdgeInsets(top: 12, left: 24, bottom: 12, right: 24) - } - button.addTarget(self, action: #selector(self.startStreaming), for: .touchUpInside) - - self.view.addSubview(button) - button.translatesAutoresizingMaskIntoConstraints = false - - NSLayoutConstraint.activate([ - button.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -30), - button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor) - ]) - } - - // MARK: - Actions - - @objc private func startStreaming() { - self.stopStreaming() - - let loadResult = self.loadFixtures() - guard loadResult.failedNames.isEmpty else { - self.fixtures = [] - self.tableView.reloadData() - self.updateStatusLabel( - message: "资源读取失败:\(loadResult.failedNames.joined(separator: ", "))。请确认文件已加入主工程 Bundle。" - ) - return - } - - let validation = Self.validateParse(fixtures: loadResult.fixtures) - guard validation.errors.isEmpty else { - self.fixtures = [] - self.tableView.reloadData() - self.updateStatusLabel(message: "解析校验失败\n" + validation.errors.joined(separator: "\n")) - return - } - - self.fixtures = validation.fixtures - self.currentFixtureIndex = 0 - self.currentCharacterIndex = 0 - self.isStreaming = true - self.pinsStreamToBottom = true - self.lastStatusUpdateUptime = 0 - self.lastLayoutFlushUptime = 0 - self.rowHeights.removeAll() - - // 须在 isStreaming = true 之后 reload,否则 visibleRowCount 会先返回 3 再变 1,与后续 beginUpdates 冲突崩溃。 - self.tableView.reloadData() - self.tableView.layoutIfNeeded() - self.updateStatusLabel( - message: "解析校验通过 · \(self.fixtures.count) 份资源 · 共 \(validation.totalRenderBlocks) 个 render block" - ) - self.beginStreamingFixture(at: 0) - self.scheduleStreamingTimer() - } - - private func scheduleStreamingTimer() { - self.streamingTimer?.invalidate() - let timer = Timer.scheduledTimer( - timeInterval: self.streamInterval, - target: self, - selector: #selector(self.handleStreamingTick), - userInfo: nil, - repeats: true - ) - RunLoop.main.add(timer, forMode: .common) - self.streamingTimer = timer - } - - @objc private func handleStreamingTick() { - guard self.isStreaming, self.currentFixtureIndex < self.fixtures.count else { - self.completeAllStreaming() - return - } - - let fixture = self.fixtures[self.currentFixtureIndex] - let characters = Array(fixture.content) - guard self.currentCharacterIndex < characters.count else { - self.flushTableLayoutIfNeeded(force: true) - - let finishedRow = self.currentFixtureIndex - self.finishStreamingFixture(at: finishedRow) - self.currentFixtureIndex += 1 - self.currentCharacterIndex = 0 - - if self.currentFixtureIndex < self.fixtures.count { - let nextRow = self.currentFixtureIndex - UIView.performWithoutAnimation { - self.tableView.insertRows(at: [IndexPath(row: nextRow, section: 0)], with: .none) - } - self.rowHeights[nextRow] = Self.placeholderRowHeight - self.beginStreamingFixture(at: nextRow) - if self.pinsStreamToBottom { - self.pinTableToBottom(animated: false) - } - } else { - self.completeAllStreaming() - } - return - } - - let end = min(self.currentCharacterIndex + self.streamStep, characters.count) - let chunk = String(characters[self.currentCharacterIndex.. 0 { - self.rowHeights[index] = max( - self.rowHeights[index] ?? Self.placeholderRowHeight, - cell.measuredRowHeight(tableWidth: tableWidth) - ) - } - } - } - - private func finishStreamingFixture(at index: Int) { - guard index < self.fixtures.count else { return } - self.fixtures[index].isCompleted = true - let indexPath = IndexPath(row: index, section: 0) - if let cell = self.tableView.cellForRow(at: indexPath) as? SSEMarkdownCell { - cell.finishStreaming(finalMarkdown: self.fixtures[index].content) - let tableWidth = self.tableView.bounds.width - if tableWidth > 0 { - self.rowHeights[index] = cell.measuredRowHeight(tableWidth: tableWidth) - } - } - } - - private func completeAllStreaming() { - self.isStreaming = false - self.tableView.reloadData() - self.tableView.layoutIfNeeded() - self.stopStreaming(resetFixtures: false) - self.updateStatusLabel( - message: "流式展示完成 · \(Self.fixtureNames.count) 份资源已通过 STMarkdown 解析并渲染" - ) - } - - private func stopStreaming(resetFixtures: Bool = true) { - self.layoutFlushWorkItem?.cancel() - self.layoutFlushWorkItem = nil - self.streamingTimer?.invalidate() - self.streamingTimer = nil - self.isStreaming = false - self.currentFixtureIndex = 0 - self.currentCharacterIndex = 0 - if resetFixtures { - self.fixtures.removeAll() - self.tableView.reloadData() - self.updateStatusLabel(idle: true) - } - } - - // MARK: - Resources & Parse - - private func loadFixtures() -> (fixtures: [(name: String, content: String)], failedNames: [String]) { - var fixtures: [(name: String, content: String)] = [] - var failedNames: [String] = [] - - for name in Self.fixtureNames { - guard let url = Bundle.main.url(forResource: name, withExtension: "txt"), - let content = try? String(contentsOf: url, encoding: .utf8) else { - failedNames.append("\(name).txt") - continue - } - fixtures.append((name: name, content: content)) - } - - return (fixtures, failedNames) - } - - private static func validateParse( - fixtures: [(name: String, content: String)] - ) -> (fixtures: [StreamFixture], errors: [String], totalRenderBlocks: Int) { - var validated: [StreamFixture] = [] - var errors: [String] = [] - var totalBlocks = 0 - - for item in fixtures { - do { - let fixture = try self.makeValidatedFixture(name: item.name, content: item.content) - validated.append(fixture) - totalBlocks += fixture.blockCount - } catch { - errors.append(error.localizedDescription) - } - } - - return (validated, errors, totalBlocks) - } - - private static func makeValidatedFixture(name: String, content: String) throws -> StreamFixture { - let result = self.markdownEngine.process(content) - - guard result.sourceDocument.blocks.isEmpty == false else { - throw ParseValidationError.emptySourceBlocks(name) - } - guard result.renderDocument.blocks.isEmpty == false else { - throw ParseValidationError.emptyRenderBlocks(name) - } - - switch name { - case "data1": - try self.assertData1Contracts(result: result, name: name) - case "data2": - try self.assertData2Contracts(result: result, name: name) - case "data3": - try self.assertData3Contracts(result: result, name: name) - default: - break - } - - return StreamFixture( - name: name, - content: content, - blockCount: result.renderDocument.blocks.count, - tableOfContentsCount: result.tableOfContents.count - ) - } - - private static func assertData1Contracts(result: STMarkdownPipelineResult, name: String) throws { - let headings = result.sourceDocument.blocks.compactMap { block -> String? in - if case .heading(level: _, let content) = block { - return Self.joinInlineText(content) - } - return nil - } - guard headings.contains(where: { $0.contains("第一步") }) else { - throw NSError(domain: "STSSEParse", code: 1, userInfo: [NSLocalizedDescriptionKey: "\(name).txt:缺少「第一步」标题"]) - } - guard headings.contains(where: { $0.contains("第三步") }) else { - throw NSError(domain: "STSSEParse", code: 2, userInfo: [NSLocalizedDescriptionKey: "\(name).txt:缺少「第三步」标题"]) - } - } - - private static func assertData2Contracts(result: STMarkdownPipelineResult, name: String) throws { - let tables = result.sourceDocument.blocks.compactMap { block -> STMarkdownTableModel? in - if case .table(let model) = block { return model } - return nil - } - guard tables.count == 1 else { - throw NSError(domain: "STSSEParse", code: 3, userInfo: [NSLocalizedDescriptionKey: "\(name).txt:应包含 1 个表格,实际 \(tables.count) 个"]) - } - let headerText = Self.joinInlineText((tables[0].header ?? []).flatMap { $0 }) - guard headerText.contains("类别"), headerText.contains("具体建议") else { - throw NSError(domain: "STSSEParse", code: 4, userInfo: [NSLocalizedDescriptionKey: "\(name).txt:表格表头字段不完整"]) - } - } - - private static func assertData3Contracts(result: STMarkdownPipelineResult, name: String) throws { - let codeBlocks = result.sourceDocument.blocks.compactMap { block -> String? in - if case .codeBlock(language: _, let code) = block { return code } - return nil - } - guard codeBlocks.count >= 2 else { - throw NSError(domain: "STSSEParse", code: 5, userInfo: [NSLocalizedDescriptionKey: "\(name).txt:应至少包含 2 个代码块"]) - } - let rendered = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - .string - guard rendered.contains("```") == false else { - throw NSError(domain: "STSSEParse", code: 6, userInfo: [NSLocalizedDescriptionKey: "\(name).txt:代码围栏定界符泄漏到可见文本"]) - } - } - - private static func joinInlineText(_ nodes: [STMarkdownInlineNode]) -> String { - nodes.map { Self.inlinePlainText($0) }.joined() - } - - private static func inlinePlainText(_ node: STMarkdownInlineNode) -> String { - switch node { - case .text(let value): - return value - case .softBreak: - return "\n" - case .inlineMath(let formula, _): - return formula - case .code(let value): - return value - case .emphasis(let inner), .strong(let inner), .strikethrough(let inner): - return self.joinInlineText(inner) - case .link(_, let inner): - return self.joinInlineText(inner) - case .image(_, let alt, _): - return alt - case .footnoteReference(let label): - return "[^\(label)]" - case .inlineRawHTML(let raw): - return raw - } - } - - // MARK: - Status & Scroll - - private func updateStatusLabel(idle: Bool) { - if idle { - self.statusLabel.text = "点击开始:先用 STMarkdownEngine 校验 data1~3,再逐路 SSE 流式渲染" - } - } - - private func updateStatusLabel(message: String) { - self.statusLabel.text = message - } - - private func updateStreamingStatusIfNeeded( - fixtureName name: String, - progress: Float, - fixtureIndex: Int, - fixtureCount: Int - ) { - let now = ProcessInfo.processInfo.systemUptime - guard now - self.lastStatusUpdateUptime >= self.statusUpdateMinInterval else { return } - self.lastStatusUpdateUptime = now - self.statusLabel.text = String( - format: "流式输出 %@ · 第 %d/%d 路 · %.0f%%", - name, - fixtureIndex, - fixtureCount, - progress * 100 - ) - } - - private func visibleRowCount() -> Int { - guard self.isStreaming, self.fixtures.isEmpty == false else { - return self.fixtures.count - } - return min(self.fixtures.count, self.currentFixtureIndex + 1) - } - - private func flushTableLayoutIfNeeded(force: Bool) { - guard self.isStreaming else { return } - - let now = ProcessInfo.processInfo.systemUptime - if force == false, now - self.lastLayoutFlushUptime < self.layoutFlushMinInterval { - self.scheduleDeferredLayoutFlush() - return - } - - self.layoutFlushWorkItem?.cancel() - self.layoutFlushWorkItem = nil - self.lastLayoutFlushUptime = now - - let row = self.currentFixtureIndex - let indexPath = IndexPath(row: row, section: 0) - guard let cell = self.tableView.cellForRow(at: indexPath) as? SSEMarkdownCell else { return } - - let tableWidth = self.tableView.bounds.width - guard tableWidth > 0 else { return } - - let measured = cell.measuredRowHeight(tableWidth: tableWidth) - let previous = self.rowHeights[row] ?? Self.placeholderRowHeight - let delta = measured - previous - - guard force || abs(delta) >= self.layoutHeightDeltaThreshold else { return } - - let expectedRows = self.visibleRowCount() - let actualRows = self.tableView.numberOfRows(inSection: 0) - guard actualRows == expectedRows else { - self.tableView.reloadData() - return - } - - self.rowHeights[row] = measured - - let tableView = self.tableView - let shouldPin = self.pinsStreamToBottom && self.isViewportNearStreamBottom() - - CATransaction.begin() - CATransaction.setDisableActions(true) - UIView.performWithoutAnimation { - tableView.beginUpdates() - tableView.endUpdates() - } - if shouldPin, delta > 0.5 { - let insetBottom = tableView.adjustedContentInset.bottom - let maxOffsetY = max( - -tableView.adjustedContentInset.top, - tableView.contentSize.height - tableView.bounds.height + insetBottom - ) - tableView.contentOffset.y = min(tableView.contentOffset.y + delta, maxOffsetY) - } - CATransaction.commit() - } - - private func isViewportNearStreamBottom(threshold: CGFloat = 120) -> Bool { - let tableView = self.tableView - let viewportBottom = tableView.contentOffset.y + tableView.bounds.height - tableView.adjustedContentInset.bottom - return tableView.contentSize.height - viewportBottom < threshold - } - - private func pinTableToBottom(animated: Bool) { - let tableView = self.tableView - tableView.layoutIfNeeded() - let insetBottom = tableView.adjustedContentInset.bottom - let maxOffsetY = max( - -tableView.adjustedContentInset.top, - tableView.contentSize.height - tableView.bounds.height + insetBottom - ) - tableView.setContentOffset(CGPoint(x: 0, y: maxOffsetY), animated: animated) - } - - private func scheduleDeferredLayoutFlush() { - guard self.layoutFlushWorkItem == nil else { return } - let work = DispatchWorkItem { [weak self] in - self?.flushTableLayoutIfNeeded(force: true) - } - self.layoutFlushWorkItem = work - DispatchQueue.main.asyncAfter(deadline: .now() + self.layoutFlushMinInterval, execute: work) - } -} - -// MARK: - UITableView - -extension STSSEViewController: UITableViewDataSource, UITableViewDelegate { - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - self.visibleRowCount() - } - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - self.rowHeights[indexPath.row] ?? Self.placeholderRowHeight - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell( - withIdentifier: SSEMarkdownCell.reuseIdentifier, - for: indexPath - ) as! SSEMarkdownCell - let row = indexPath.row - let fixture = self.fixtures[row] - - cell.bindFixture( - name: fixture.name, - blockCount: fixture.blockCount, - tableOfContentsCount: fixture.tableOfContentsCount - ) - - if fixture.isCompleted { - cell.showFinal(markdown: fixture.content) - } else if row < self.currentFixtureIndex { - cell.showFinal(markdown: fixture.content) - } else if row == self.currentFixtureIndex, self.isStreaming { - if cell.accumulatedMarkdown.isEmpty, fixture.streamedMarkdown.isEmpty == false { - cell.syncStreamingProgress(fixture.streamedMarkdown) - } - } else { - cell.showPlaceholder() - } - - return cell - } -} - -// MARK: - UIScrollViewDelegate - -extension STSSEViewController: UIScrollViewDelegate { - - func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { - self.pinsStreamToBottom = false - } - - func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { - if decelerate == false { - self.syncPinsStreamToBottomFromScrollOffset() - } - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - self.syncPinsStreamToBottomFromScrollOffset() - } - - private func syncPinsStreamToBottomFromScrollOffset() { - self.pinsStreamToBottom = self.isViewportNearStreamBottom() - } -} - -// MARK: - SSEMarkdownCell - -/// 单路消息 Cell:流式阶段只用 ``appendMarkdownFragment`` 逐字追加,不用智能流式增量合并(避免标题重复)。 -private final class SSEMarkdownCell: UITableViewCell { - - static let reuseIdentifier = "SSEMarkdownCell" - - private var boundFixtureName: String? - private(set) var accumulatedMarkdown: String = "" - - private let titleLabel = UILabel() - private let metaLabel = UILabel() - private var markdownHeightConstraint: NSLayoutConstraint? - - private let markdownView: STMarkdownStreamingTextView = { - let view = STMarkdownStreamingTextView( - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine() - ) - view.translatesAutoresizingMaskIntoConstraints = false - view.backgroundColor = .secondarySystemBackground - view.layer.cornerRadius = 12 - view.clipsToBounds = true - view.isTextSelectionEnabled = true - view.tokenFadeDuration = 0.06 - view.animateAcrossNewlines = false - return view - }() - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - self.backgroundColor = .clear - self.selectionStyle = .none - - self.titleLabel.translatesAutoresizingMaskIntoConstraints = false - self.titleLabel.font = .systemFont(ofSize: 15, weight: .semibold) - self.titleLabel.textColor = .label - - self.metaLabel.translatesAutoresizingMaskIntoConstraints = false - self.metaLabel.font = .systemFont(ofSize: 12) - self.metaLabel.textColor = .secondaryLabel - - self.contentView.addSubview(self.titleLabel) - self.contentView.addSubview(self.metaLabel) - self.contentView.addSubview(self.markdownView) - - NSLayoutConstraint.activate([ - self.titleLabel.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 8), - self.titleLabel.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 16), - self.titleLabel.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -16), - - self.metaLabel.topAnchor.constraint(equalTo: self.titleLabel.bottomAnchor, constant: 2), - self.metaLabel.leadingAnchor.constraint(equalTo: self.titleLabel.leadingAnchor), - self.metaLabel.trailingAnchor.constraint(equalTo: self.titleLabel.trailingAnchor), - - self.markdownView.topAnchor.constraint(equalTo: self.metaLabel.bottomAnchor, constant: 8), - self.markdownView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 12), - self.markdownView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -12) - ]) - - let heightConstraint = self.markdownView.heightAnchor.constraint(equalToConstant: 1) - heightConstraint.priority = .defaultHigh - heightConstraint.isActive = true - self.markdownHeightConstraint = heightConstraint - - self.markdownView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -8).isActive = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func prepareForReuse() { - super.prepareForReuse() - self.boundFixtureName = nil - self.accumulatedMarkdown = "" - self.markdownView.reset() - } - - func bindFixture(name: String, blockCount: Int, tableOfContentsCount: Int) { - self.titleLabel.text = "\(name).txt" - self.metaLabel.text = "STMarkdown render blocks: \(blockCount) · TOC: \(tableOfContentsCount)" - if self.boundFixtureName != name { - self.boundFixtureName = name - self.accumulatedMarkdown = "" - self.markdownView.reset() - } - } - - func showPlaceholder() { - guard self.accumulatedMarkdown.isEmpty == false else { return } - self.accumulatedMarkdown = "" - self.markdownView.reset() - } - - func startStreaming() { - self.accumulatedMarkdown = "" - self.markdownView.reset() - if let shimmer = self.markdownView.contentTextView as? STShimmerTextView { - shimmer.characterStaggerInterval = 0.002 - } - } - - /// Cell 滚出屏幕后回屏:仅当与 Model 不一致时恢复,避免打断正在 tick 的 Cell。 - func syncStreamingProgress(_ markdown: String) { - guard self.accumulatedMarkdown != markdown else { return } - if markdown.isEmpty { - self.startStreaming() - return - } - self.accumulatedMarkdown = markdown - self.markdownView.setMarkdown(markdown, animated: false) - } - - func appendStreamingChunk(_ chunk: String) { - guard chunk.isEmpty == false else { return } - self.accumulatedMarkdown += chunk - self.markdownView.appendMarkdownFragment(chunk, animated: true) - self.updateMarkdownHeightConstraintIfNeeded() - } - - func measuredRowHeight(tableWidth: CGFloat) -> CGFloat { - let horizontalInset: CGFloat = 12 + 16 - let contentWidth = max(0, tableWidth - horizontalInset * 2) - self.markdownView.preferredContentWidth = contentWidth - self.updateMarkdownHeightConstraintIfNeeded() - self.setNeedsLayout() - self.layoutIfNeeded() - let target = CGSize(width: tableWidth, height: UIView.layoutFittingCompressedSize.height) - return ceil(self.contentView.systemLayoutSizeFitting( - target, - withHorizontalFittingPriority: .required, - verticalFittingPriority: .fittingSizeLevel - ).height) - } - - private func updateMarkdownHeightConstraintIfNeeded() { - let width = self.markdownView.preferredContentWidth > 0 - ? self.markdownView.preferredContentWidth - : self.markdownView.bounds.width - guard width > 0 else { return } - let contentHeight = self.markdownView.sizeThatFitsMarkdown(width: width).height - guard contentHeight > 0 else { return } - self.markdownHeightConstraint?.constant = ceil(contentHeight) - } - - func showFinal(markdown: String) { - guard self.accumulatedMarkdown != markdown else { - self.markdownView.finishStreaming() - return - } - self.accumulatedMarkdown = markdown - self.markdownView.setMarkdown(markdown, animated: false) - self.markdownView.finishStreaming() - } - - func finishStreaming(finalMarkdown: String) { - self.showFinal(markdown: finalMarkdown) - } -} diff --git a/Example/STBaseProjectExample/ViewControllers/STSSEViewController.xib b/Example/STBaseProjectExample/ViewControllers/STSSEViewController.xib deleted file mode 100644 index 5ed94e2..0000000 --- a/Example/STBaseProjectExample/ViewControllers/STSSEViewController.xib +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/STBaseProjectExample/ViewControllers/STToolsManualTestViewController.swift b/Example/STBaseProjectExample/ViewControllers/STToolsManualTestViewController.swift deleted file mode 100644 index ec7c64c..0000000 --- a/Example/STBaseProjectExample/ViewControllers/STToolsManualTestViewController.swift +++ /dev/null @@ -1,213 +0,0 @@ -// -// STToolsManualTestViewController.swift -// STBaseProject_Example -// -// Created by 寒江孤影 on 2022/8/4. -// - -import UIKit -import STBaseProject - -final class STToolsManualTestViewController: BaseViewController { - - private var markdownTypewriterTimer: Timer? - private var markdownTypewriterText: String = "" - private var markdownTypewriterIndex: Int = 0 - private let markdownTypewriterInterval: TimeInterval = 0.02 - private let markdownTypewriterStep: Int = 1 - - override func viewDidLoad() { - super.viewDidLoad() - self.titleLabel.text = "STTools 手动测试" - self.buildUI() - self.appendLine("进入页面后可逐项触发依赖系统能力的测试") - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - self.stopMarkdownTypewriter() - } - - private func buildUI() { - let scrollView = UIScrollView() - scrollView.translatesAutoresizingMaskIntoConstraints = false - self.view.addSubview(scrollView) - - let stackView = UIStackView() - stackView.translatesAutoresizingMaskIntoConstraints = false - stackView.axis = .vertical - stackView.spacing = 12 - scrollView.addSubview(stackView) - - let actions: [(String, Selector)] = [ - ("读取 DeviceInfo", #selector(self.readDeviceInfo)), - ("读取 DeviceAdapter", #selector(self.readDeviceAdapter)), - ("CrashDetector 标记/检查", #selector(self.testCrashDetector)), - ("字体/颜色示例", #selector(self.testFontAndColor)), - ("性能测量示例", #selector(self.testScrollPerfDiagnostics)), - ("Markdown 资源逐字输出", #selector(self.showMarkdownResourcesVerbatim)) - ] - - for action in actions { - let button = UIButton(type: .system) - button.contentHorizontalAlignment = .left - button.titleLabel?.font = .systemFont(ofSize: 15, weight: .medium) - button.setTitle(action.0, for: .normal) - button.addTarget(self, action: action.1, for: .touchUpInside) - stackView.addArrangedSubview(button) - } - - stackView.addArrangedSubview(self.markdownStreamingView) - stackView.addArrangedSubview(self.outputTextView) - NSLayoutConstraint.activate([ - self.markdownStreamingView.heightAnchor.constraint(equalToConstant: 360), - self.outputTextView.heightAnchor.constraint(equalToConstant: 260), - scrollView.topAnchor.constraint(equalTo: self.view.topAnchor), - scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16), - scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16), - scrollView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -12), - stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 12), - stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor), - stackView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor), - stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor), - stackView.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor) - ]) - - self.applyLiquidGlassScrollLayout(scrollView) - } - - private func appendLine(_ message: String) { - let time = Date().formatted("HH:mm:ss") - let line = "[\(time)] \(message)" - let current = self.outputTextView.text ?? "" - self.outputTextView.text = current.isEmpty ? line : current + "\n" + line - STLog(message) - } - - private lazy var outputTextView: UITextView = { - let textView = UITextView() - textView.translatesAutoresizingMaskIntoConstraints = false - textView.isEditable = false - textView.font = .monospacedSystemFont(ofSize: 12, weight: .regular) - textView.backgroundColor = UIColor.secondarySystemBackground - textView.layer.cornerRadius = 8 - return textView - }() - - private lazy var markdownStreamingView: STMarkdownStreamingTextView = { - let view = STMarkdownStreamingTextView( - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine() - ) - view.translatesAutoresizingMaskIntoConstraints = false - view.backgroundColor = UIColor.secondarySystemBackground - view.layer.cornerRadius = 8 - view.clipsToBounds = true - view.isTextSelectionEnabled = true - view.tokenFadeDuration = 0.1 - view.animateAcrossNewlines = false - return view - }() -} - -private extension STToolsManualTestViewController { - - @objc func readDeviceInfo() { - let info = STDeviceInfo.appInfo - self.appendLine("App: \(info.displayName) \(info.version)(\(info.buildVersion))") - self.appendLine("System: \(STDeviceInfo.systemName) \(STDeviceInfo.systemVersion), model: \(STDeviceInfo.deviceModelName)") - self.appendLine("Battery: \(STDeviceInfo.batteryInfo.percentage)%, charging=\(STDeviceInfo.isCharging)") - self.appendLine("Storage used: \(STDeviceInfo.usedStorage), RAM used: \(STDeviceInfo.usedRAM)") - } - - @objc func readDeviceAdapter() { - self.appendLine("Screen: \(STDeviceAdapter.screenSize), scale: \(UIScreen.main.scale)") - self.appendLine("NavBar: \(STDeviceAdapter.navigationBarHeight), TabBar: \(STDeviceAdapter.tabBarHeight)") - self.appendLine("SafeInsets: \(STDeviceAdapter.safeAreaInsets), isNotch=\(STDeviceAdapter.isNotchScreen)") - } - - @objc func testCrashDetector() { - let detector = STCrashDetector.shared - detector.markAppLaunch() - detector.markAppBackgroundEntry() - let detected = detector.detectCrash() - self.appendLine("CrashDetector.detectCrash = \(detected), info = \(detector.crashInfo())") - detector.markAppTermination() - detector.clearCrashData() - } - - @objc func testFontAndColor() { - let font = UIFont.st_systemFont(ofSize: 14, weight: .medium) - let color = UIColor.color(hex: "#FF8800CC") - let components = color.cgColor.components ?? [] - self.appendLine("Font: \(font.fontName) \(font.pointSize)") - self.appendLine("Color components: \(components)") - } - - @objc func testScrollPerfDiagnostics() { - let value = STScrollPerfDiagnostics.measure(name: "ManualCalc") { () -> Int in - (0..<200_000).reduce(0, +) - } - self.appendLine("STScrollPerfDiagnostics measure result = \(value)") - } - - @objc func showMarkdownResourcesVerbatim() { - self.stopMarkdownTypewriter() - let resourceNames = ["data1", "data2", "data3"] - var sections: [String] = [] - - for name in resourceNames { - guard let path = Bundle.main.path(forResource: name, ofType: "txt") else { - self.appendLine("未找到资源文件:\(name).txt") - continue - } - do { - let content = try String(contentsOfFile: path, encoding: .utf8) - sections.append("## \(name).txt\n\n\(content)") - } catch { - self.appendLine("读取 \(name).txt 失败:\(error.localizedDescription)") - } - } - - if sections.isEmpty == false { - self.markdownTypewriterText = sections.joined(separator: "\n\n---\n\n") - self.markdownTypewriterIndex = 0 - self.markdownStreamingView.reset() - self.startMarkdownTypewriter() - self.appendLine("已开始通过 STMarkdown 逐字渲染 3 份资源") - } - } - - private func startMarkdownTypewriter() { - guard !self.markdownTypewriterText.isEmpty else { return } - self.markdownTypewriterTimer = Timer.scheduledTimer( - timeInterval: self.markdownTypewriterInterval, - target: self, - selector: #selector(self.handleMarkdownTypewriterTick), - userInfo: nil, - repeats: true - ) - if let timer = self.markdownTypewriterTimer { - RunLoop.main.add(timer, forMode: .common) - } - } - - private func stopMarkdownTypewriter() { - self.markdownTypewriterTimer?.invalidate() - self.markdownTypewriterTimer = nil - } - - @objc private func handleMarkdownTypewriterTick() { - guard self.markdownTypewriterIndex < self.markdownTypewriterText.count else { - self.stopMarkdownTypewriter() - self.appendLine("逐字渲染完成") - return - } - let nextIndex = min(self.markdownTypewriterIndex + self.markdownTypewriterStep, self.markdownTypewriterText.count) - let end = self.markdownTypewriterText.index(self.markdownTypewriterText.startIndex, offsetBy: nextIndex) - let current = String(self.markdownTypewriterText[.. = [a, b] - XCTAssertEqual(set.count, 1) - } -} - -// MARK: - STContactError 测试 - -final class STContactErrorTests: XCTestCase { - - func testPermissionDeniedDescription() { - let error = STContactError.permissionDenied - XCTAssertNotNil(error.errorDescription) - } - - func testFetchFailedDescription() { - let underlying = NSError(domain: "test", code: 42, userInfo: [NSLocalizedDescriptionKey: "底层错误"]) - let error = STContactError.fetchFailed(underlying) - XCTAssertEqual(error.errorDescription, "底层错误") - } - - func testFetchFailedPreservesUnderlyingError() { - let underlying = NSError(domain: "com.test", code: 99, userInfo: nil) - if case .fetchFailed(let wrapped) = STContactError.fetchFailed(underlying) { - XCTAssertEqual((wrapped as NSError).code, 99) - } else { - XCTFail("应为 fetchFailed case") - } - } -} - -// MARK: - STContactServiceProtocol Mock 测试 - -private final class MockContactService: STContactServiceProtocol { - var permissionStatus: STContactPermissionStatus = .authorized - var stubbedContacts: [STContact] = [] - var stubbedError: Error? = nil - - func requestPermissionAndFetch() async throws -> [STContact] { - if let error = self.stubbedError { throw error } - return self.stubbedContacts - } -} - -final class STContactServiceProtocolTests: XCTestCase { - - func testFetchReturnsStubContacts() async throws { - let mock = MockContactService() - mock.stubbedContacts = [ - STContact(identifier: "m-001", fullName: "Mock 张三", phoneNumbers: ["100"]), - STContact(identifier: "m-002", fullName: nil, phoneNumbers: []) - ] - let results = try await mock.requestPermissionAndFetch() - XCTAssertEqual(results.count, 2) - XCTAssertEqual(results[0].identifier, "m-001") - XCTAssertNil(results[1].fullName) - } - - func testFetchThrowsPermissionDenied() async { - let mock = MockContactService() - mock.stubbedError = STContactError.permissionDenied - do { - _ = try await mock.requestPermissionAndFetch() - XCTFail("应抛出 permissionDenied 错误") - } catch STContactError.permissionDenied { - // 预期路径 - } catch { - XCTFail("抛出了非预期错误: \(error)") - } - } - - func testFetchThrowsFetchFailed() async { - let mock = MockContactService() - let underlying = NSError(domain: "net", code: 500, userInfo: nil) - mock.stubbedError = STContactError.fetchFailed(underlying) - do { - _ = try await mock.requestPermissionAndFetch() - XCTFail("应抛出 fetchFailed 错误") - } catch STContactError.fetchFailed(let err) { - XCTAssertEqual((err as NSError).code, 500) - } catch { - XCTFail("抛出了非预期错误: \(error)") - } - } - - func testPermissionStatusExposedByProtocol() { - let mock = MockContactService() - mock.permissionStatus = .denied - let service: any STContactServiceProtocol = mock - XCTAssertEqual(service.permissionStatus, .denied) - } - - func testEmptyResultWhenNoContacts() async throws { - let mock = MockContactService() - mock.stubbedContacts = [] - let results = try await mock.requestPermissionAndFetch() - XCTAssertTrue(results.isEmpty) - } -} - -// MARK: - STContactService 单例与实例化测试 - -final class STContactServiceInstanceTests: XCTestCase { - - func testSharedIsSingleton() { - let a = STContactService.shared - let b = STContactService.shared - XCTAssertTrue(a === b) - } - - func testCustomInstanceIsIndependent() { - let custom = STContactService() - XCTAssertFalse(custom === STContactService.shared) - } - - func testPermissionStatusReturnsKnownCase() { - let status = STContactService.shared.permissionStatus - let validCases: [STContactPermissionStatus] = [.notDetermined, .restricted, .denied, .limited, .authorized] - XCTAssertTrue(validCases.contains(status)) - } -} diff --git a/Example/STBaseProjectExampleTests/STLocationTests/STLocationManagerTests.swift b/Example/STBaseProjectExampleTests/STLocationTests/STLocationManagerTests.swift deleted file mode 100644 index f6b4ad2..0000000 --- a/Example/STBaseProjectExampleTests/STLocationTests/STLocationManagerTests.swift +++ /dev/null @@ -1,402 +0,0 @@ -// -// STLocationManagerTests.swift -// STBaseProjectExampleTests -// - -import CoreLocation -import XCTest -@testable import STLocation - -// MARK: - Mocks - -final class MockCLLocationManager: STCLLocationManaging { - var delegate: CLLocationManagerDelegate? - var desiredAccuracy: CLLocationAccuracy = kCLLocationAccuracyNearestTenMeters - var distanceFilter: CLLocationDistance = 10.0 - var authorizationStatus: CLAuthorizationStatus = .authorizedWhenInUse - var locationServicesEnabledResult = true - private(set) var startUpdatingCount = 0 - private(set) var stopUpdatingCount = 0 - - func isLocationServicesEnabled() -> Bool { return self.locationServicesEnabledResult } - func requestWhenInUseAuthorization() {} - func requestAlwaysAuthorization() {} - - func startUpdatingLocation() { self.startUpdatingCount += 1 } - func stopUpdatingLocation() { self.stopUpdatingCount += 1 } - - // 用真实 CLLocationManager 实例满足 delegate 方法的参数类型要求 - private let dummyCLManager = CLLocationManager() - - func simulateLocationUpdate(_ location: CLLocation) { - self.delegate?.locationManager?(self.dummyCLManager, didUpdateLocations: [location]) - } - - func simulateLocationError(_ error: Error) { - self.delegate?.locationManager?(self.dummyCLManager, didFailWithError: error) - } -} - -final class MockCLGeocoder: STCLGeocoderProtocol { - private(set) var isGeocoding = false - private(set) var cancelCallCount = 0 - private(set) var geocodeCallCount = 0 - // 持有最近一次 geocoding 的回调,供测试手动触发 - private(set) var pendingHandler: (@Sendable ([CLPlacemark]?, Error?) -> Void)? - - func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping @Sendable ([CLPlacemark]?, Error?) -> Void) { - self.geocodeCallCount += 1 - self.isGeocoding = true - self.pendingHandler = completionHandler - } - - func cancelGeocode() { - self.cancelCallCount += 1 - self.isGeocoding = false - self.pendingHandler = nil - } - - /// 测试辅助:触发 geocoding 失败(nil placemarks) - func completeWithFailure(error: Error? = nil) { - let handler = self.pendingHandler - self.isGeocoding = false - self.pendingHandler = nil - handler?(nil, error) - } -} - -// MARK: - STLocationInfo Tests - -final class STLocationInfoTests: XCTestCase { - - func test_formattedAddress_allFields() { - let info = STLocationInfo( - country: "中国", - locality: "上海市", - subLocality: "浦东新区", - thoroughfare: "陆家嘴环路", - subThoroughfare: "1号", - administrativeArea: "上海" - ) - XCTAssertEqual(info.formattedAddress, "陆家嘴环路, 1号, 浦东新区, 上海市, 上海, 中国") - } - - func test_formattedAddress_emptyStringsSkipped() { - let info = STLocationInfo( - country: "中国", - locality: "", - subLocality: "浦东新区" - ) - // locality 为空应跳过 - XCTAssertEqual(info.formattedAddress, "浦东新区, 中国") - } - - func test_formattedAddress_allNil_returnsEmpty() { - let info = STLocationInfo() - XCTAssertEqual(info.formattedAddress, "") - } - - func test_coordinateString() { - let info = STLocationInfo(latitude: 31.23, longitude: 121.47) - XCTAssertEqual(info.coordinateString, "31.23,121.47") - } -} - -// MARK: - STLocationError Tests - -final class STLocationErrorTests: XCTestCase { - - func test_errorDescriptions_notNil() { - let errors: [STLocationError] = [ - .authorizationDenied, - .authorizationRestricted, - .locationServicesDisabled, - .timeout, - .networkError, - .geocodingFailed(nil), - .busy, - .unknown(NSError(domain: "test", code: -1)) - ] - for error in errors { - XCTAssertNotNil(error.errorDescription, "\(error) 应有 errorDescription") - } - } - - func test_geocodingFailed_withUnderlyingError_includesMessage() { - let underlying = NSError(domain: "CLError", code: 8, userInfo: [NSLocalizedDescriptionKey: "网络不可用"]) - let error = STLocationError.geocodingFailed(underlying) - XCTAssertTrue(error.errorDescription?.contains("网络不可用") == true) - } - - func test_geocodingFailed_nilError_returnsGenericMessage() { - let error = STLocationError.geocodingFailed(nil) - XCTAssertEqual(error.errorDescription, "地理编码失败") - } - - func test_busy_description() { - XCTAssertEqual(STLocationError.busy.errorDescription, "正在获取位置中") - } -} - -// MARK: - STLocationConfig Tests - -final class STLocationConfigTests: XCTestCase { - - func test_defaultPreset() { - let config = STLocationConfig.default - XCTAssertEqual(config.desiredAccuracy, kCLLocationAccuracyNearestTenMeters) - XCTAssertEqual(config.distanceFilter, 10.0) - XCTAssertEqual(config.timeout, 30.0) - XCTAssertEqual(config.maximumAge, 300.0) - } - - func test_highAccuracyPreset() { - let config = STLocationConfig.highAccuracy - XCTAssertEqual(config.desiredAccuracy, kCLLocationAccuracyBest) - XCTAssertEqual(config.timeout, 15.0) - } - - func test_lowAccuracyPreset() { - let config = STLocationConfig.lowAccuracy - XCTAssertEqual(config.desiredAccuracy, kCLLocationAccuracyKilometer) - XCTAssertEqual(config.timeout, 60.0) - } -} - -// MARK: - STLocationManager State Machine Tests - -@MainActor -final class STLocationManagerTests: XCTestCase { - - private var sut: STLocationManager! - private var mockCLManager: MockCLLocationManager! - private var mockGeocoder: MockCLGeocoder! - - override func setUp() async throws { - try await super.setUp() - self.mockCLManager = MockCLLocationManager() - self.mockGeocoder = MockCLGeocoder() - self.sut = STLocationManager(clManager: self.mockCLManager, geocoder: self.mockGeocoder) - } - - override func tearDown() async throws { - self.sut.st_stopUpdatingLocation() - self.sut = nil - self.mockCLManager = nil - self.mockGeocoder = nil - try await super.tearDown() - } - - // MARK: - 位置服务关闭 - - func test_getCurrentLocation_locationServicesDisabled_returnsError() { - self.mockCLManager.locationServicesEnabledResult = false - var result: Result? - self.sut.st_getCurrentLocation(completion: { result = $0 }) - guard case .failure(let error) = result else { - return XCTFail("应立即返回 failure") - } - guard case .locationServicesDisabled = error else { - return XCTFail("应为 locationServicesDisabled,实际:\(error)") - } - } - - func test_startUpdatingLocation_locationServicesDisabled_returnsError() { - self.mockCLManager.locationServicesEnabledResult = false - var result: Result? - self.sut.st_startUpdatingLocation(completion: { result = $0 }) - guard case .failure(.locationServicesDisabled) = result else { - return XCTFail("应返回 locationServicesDisabled") - } - } - - // MARK: - 权限拒绝 - - func test_getCurrentLocation_authorizationDenied_returnsError() { - self.mockCLManager.authorizationStatus = .denied - var result: Result? - self.sut.st_getCurrentLocation(completion: { result = $0 }) - guard case .failure(.authorizationDenied) = result else { - return XCTFail("应返回 authorizationDenied") - } - } - - func test_getCurrentLocation_authorizationRestricted_returnsError() { - self.mockCLManager.authorizationStatus = .restricted - var result: Result? - self.sut.st_getCurrentLocation(completion: { result = $0 }) - guard case .failure(.authorizationRestricted) = result else { - return XCTFail("应返回 authorizationRestricted") - } - } - - // MARK: - Bug 2 修复验证:并发防重(busy 错误) - - func test_getCurrentLocation_whileAlreadyUpdating_returnsBusy() { - // 第一次调用进入 isUpdating 状态 - self.sut.st_getCurrentLocation(completion: { _ in }) - XCTAssertEqual(self.mockCLManager.startUpdatingCount, 1) - - var secondResult: Result? - self.sut.st_getCurrentLocation(completion: { secondResult = $0 }) - - guard case .failure(.busy) = secondResult else { - return XCTFail("并发调用应返回 .busy,实际:\(String(describing: secondResult))") - } - // CLLocationManager 不应被重复启动 - XCTAssertEqual(self.mockCLManager.startUpdatingCount, 1) - } - - func test_startUpdatingLocation_whileAlreadyUpdating_returnsBusy() { - self.sut.st_startUpdatingLocation(completion: { _ in }) - XCTAssertEqual(self.mockCLManager.startUpdatingCount, 1) - - var secondResult: Result? - self.sut.st_startUpdatingLocation(completion: { secondResult = $0 }) - - guard case .failure(.busy) = secondResult else { - return XCTFail("并发调用应返回 .busy,实际:\(String(describing: secondResult))") - } - XCTAssertEqual(self.mockCLManager.startUpdatingCount, 1) - } - - // MARK: - stopUpdatingLocation 行为验证 - - func test_stopUpdatingLocation_cancelsGeocoder() { - self.sut.st_getCurrentLocation(completion: { _ in }) - self.mockCLManager.simulateLocationUpdate(CLLocation(latitude: 31.0, longitude: 121.0)) - - self.sut.st_stopUpdatingLocation() - - XCTAssertEqual(self.mockGeocoder.cancelCallCount, 1, "stop 应调用 geocoder.cancelGeocode()") - } - - func test_stopUpdatingLocation_allowsNewRequestAfterStop() { - self.sut.st_getCurrentLocation(completion: { _ in }) - self.sut.st_stopUpdatingLocation() - - // stop 之后应可以正常发起新请求 - var newRequestStarted = false - self.sut.st_getCurrentLocation(completion: { _ in newRequestStarted = true }) - XCTAssertEqual(self.mockCLManager.startUpdatingCount, 2, "stop 后应能重新 startUpdatingLocation") - } - - // MARK: - Bug 1 修复验证:stop→start 竞态,过期 geocoding 不污染新请求 - - func test_staleGeocoding_doesNotPollutNewRequest() async { - // 第一次请求 - var firstResult: Result? - self.sut.st_getCurrentLocation(completion: { firstResult = $0 }) - - // 模拟位置更新,触发 processLocation → geocoding 开始 - self.mockCLManager.simulateLocationUpdate(CLLocation(latitude: 31.0, longitude: 121.0)) - // 让 Task { @MainActor } 执行(processLocation 在 Task 内运行) - await Task.yield() - await Task.yield() - - // 保存第一次请求的 geocoding handler(此时还未完成) - let staleHandler = self.mockGeocoder.pendingHandler - XCTAssertNotNil(staleHandler, "geocoding 应已开始") - - // Stop:使 requestGeneration 自增,同时 cancelGeocode(清空 mockGeocoder.pendingHandler) - self.sut.st_stopUpdatingLocation() - - // 发起第二次请求 - var secondResult: Result? - self.sut.st_getCurrentLocation(completion: { secondResult = $0 }) - - // 手动触发第一次 geocoding 的旧 handler(模拟 cancelGeocode 后系统仍回调的情况) - // 旧 handler 内 capturedGeneration != requestGeneration,应被丢弃 - staleHandler?(nil, nil) - await Task.yield() - await Task.yield() - - // 第二次请求的 completion 不应被旧结果调用 - XCTAssertNil(secondResult, "过期 geocoding 结果不应触发新请求的 completion") - // 第一次请求的 completion 在 stop 时已被清空,也不应被调用 - XCTAssertNil(firstResult, "第一次请求已 stop,其 completion 不应被调用") - } - - // MARK: - geocodingFailed 携带实际错误 - - func test_geocodingFailed_withUnderlyingError_propagatesError() async { - var capturedResult: Result? - let expectation = XCTestExpectation(description: "geocodingFailed callback") - - self.sut.st_getCurrentLocation(completion: { - capturedResult = $0 - expectation.fulfill() - }) - - self.mockCLManager.simulateLocationUpdate(CLLocation(latitude: 31.0, longitude: 121.0)) - await Task.yield() - await Task.yield() - - let underlyingError = NSError(domain: "CLError", code: 8, userInfo: [NSLocalizedDescriptionKey: "网络不可用"]) - self.mockGeocoder.completeWithFailure(error: underlyingError) - await Task.yield() - await Task.yield() - - await fulfillment(of: [expectation], timeout: 1.0) - - guard case .failure(let error) = capturedResult else { - return XCTFail("应返回 failure,实际:\(String(describing: capturedResult))") - } - guard case .geocodingFailed(let wrappedError) = error else { - return XCTFail("应为 geocodingFailed,实际:\(error)") - } - XCTAssertNotNil(wrappedError, "geocodingFailed 应携带底层错误") - XCTAssertEqual((wrappedError as? NSError)?.domain, "CLError") - } - - // MARK: - 缓存命中 - - func test_getCurrentLocation_cacheHit_returnsImmediately() { - // 写入缓存 - let cachedInfo = STLocationInfo(latitude: 31.0, longitude: 121.0, timestamp: Date()) - self.sut.st_clearLocationCache() - // 通过 st_getLastKnownLocation 验证初始为空 - XCTAssertNil(self.sut.st_getLastKnownLocation()) - - // 手动注入缓存(通过 geocoding 成功路径,使用 highAccuracy 配置) - // 此处改为直接验证:无缓存时 startUpdating 被调用 - self.sut.st_getCurrentLocation(completion: { _ in }) - XCTAssertEqual(self.mockCLManager.startUpdatingCount, 1, "无缓存时应启动 CLLocationManager") - _ = cachedInfo // suppress warning - } - - func test_clearLocationCache_removesLastKnownLocation() { - // 初始无缓存 - XCTAssertNil(self.sut.st_getLastKnownLocation()) - self.sut.st_clearLocationCache() - XCTAssertNil(self.sut.st_getLastKnownLocation()) - } - - // MARK: - 连续更新模式 - - func test_startUpdatingLocation_continuousMode_doesNotStopAfterFirstResult() async { - var callbackCount = 0 - self.sut.st_startUpdatingLocation(completion: { result in - if case .success = result { callbackCount += 1 } - }) - - // 第一次位置更新 - self.mockCLManager.simulateLocationUpdate(CLLocation(latitude: 31.0, longitude: 121.0)) - await Task.yield() - await Task.yield() - self.mockGeocoder.completeWithFailure() // 用 failure 触发 finishRequest 测试连续模式分支不够,先用正常流程 - // 注:由于连续模式只在 success 时保持运行,此处测验证 stop 未被过早调用 - // geocoding 失败会停止连续更新(error 分支),这是预期行为 - await Task.yield() - - // CLLocationManager 在 geocodingFailed 时应停止(error 分支触发 finishRequest 全停) - XCTAssertEqual(self.mockCLManager.stopUpdatingCount, 1) - } - - func test_configure_updatesManagerSettings() { - let config = STLocationConfig.highAccuracy - self.sut.st_configure(with: config) - XCTAssertEqual(self.mockCLManager.desiredAccuracy, kCLLocationAccuracyBest) - XCTAssertEqual(self.mockCLManager.distanceFilter, 1.0) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownASTAndRenderASTExhaustiveTests.swift b/Example/STBaseProjectExampleTests/STMarkdownASTAndRenderASTExhaustiveTests.swift deleted file mode 100644 index b80f821..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownASTAndRenderASTExhaustiveTests.swift +++ /dev/null @@ -1,379 +0,0 @@ -// -// STMarkdownASTAndRenderASTExhaustiveTests.swift -// STBaseProjectExampleTests -// -// 穷举覆盖 STMarkdownAST.swift / STMarkdownRenderAST.swift 中的公开类型: -// 各 enum case、struct 初始化与计算属性、Hashable / Sendable 可赋值性。 -// - -import XCTest -import STBaseProject - -/// 编译期校验:传入参数必须满足 `Sendable`,否则编译失败。 -/// 运行期不做任何断言——`as any Sendable` 后判 `nil` 永远非空,无法验证一致性, -/// `Sendable` 由编译器静态保证。本 helper 仅靠「调用即通过编译」表达契约。 -@inline(__always) -private func st_requireSendable(_: T) {} - -// MARK: - 穷举分支标签(编译器可校验 switch 穷尽性) - -private enum InlineCaseTag: String, CaseIterable { - case text - case inlineMath - case emphasis - case strong - case code - case link - case image - case softBreak - case strikethrough - case footnoteReference - case inlineRawHTML -} - -private func st_tag(forInline node: STMarkdownInlineNode) -> InlineCaseTag { - switch node { - case .text: return .text - case .inlineMath: return .inlineMath - case .emphasis: return .emphasis - case .strong: return .strong - case .code: return .code - case .link: return .link - case .image: return .image - case .softBreak: return .softBreak - case .strikethrough: return .strikethrough - case .footnoteReference: return .footnoteReference - case .inlineRawHTML: return .inlineRawHTML - } -} - -private enum BlockCaseTag: String, CaseIterable { - case paragraph - case heading - case quote - case list - case codeBlock - case table - case mathBlock - case image - case thematicBreak - case details - case rawHTML -} - -private func st_tag(forBlock node: STMarkdownBlockNode) -> BlockCaseTag { - switch node { - case .paragraph: return .paragraph - case .heading: return .heading - case .quote: return .quote - case .list: return .list - case .codeBlock: return .codeBlock - case .table: return .table - case .mathBlock: return .mathBlock - case .image: return .image - case .thematicBreak: return .thematicBreak - case .details: return .details - case .rawHTML: return .rawHTML - } -} - -private enum RenderBlockCaseTag: String, CaseIterable { - case paragraph - case heading - case quote - case list - case codeBlock - case table - case mathBlock - case image - case thematicBreak - case details - case rawHTML -} - -private func st_tag(forRenderBlock node: STMarkdownRenderBlock) -> RenderBlockCaseTag { - switch node { - case .paragraph: return .paragraph - case .heading: return .heading - case .quote: return .quote - case .list: return .list - case .codeBlock: return .codeBlock - case .table: return .table - case .mathBlock: return .mathBlock - case .image: return .image - case .thematicBreak: return .thematicBreak - case .details: return .details - case .rawHTML: return .rawHTML - } -} - -// MARK: - Tests - -final class STMarkdownASTAndRenderASTExhaustiveTests: XCTestCase { - - // MARK: STMarkdownInlineNode - - func testInlineNodeExhaustiveCasesProduceDistinctTags() { - let samples: [STMarkdownInlineNode] = [ - .text("a"), - .inlineMath("x", isDisplayMode: false), - .inlineMath("y", isDisplayMode: true), - .emphasis([.text("e")]), - .strong([.text("s")]), - .code("c"), - .link(destination: "https://u", children: [.text("t")]), - .image(source: "https://i", alt: "alt", title: "ti"), - .image(source: "https://i2", alt: "a2", title: nil), - .softBreak, - .strikethrough([.text("d")]), - .footnoteReference(label: "n1"), - .inlineRawHTML("x"), - ] - let tags = samples.map { st_tag(forInline: $0) } - XCTAssertEqual(Set(tags), Set(InlineCaseTag.allCases)) - } - - func testInlineNodeHashableEqualityAndSendable() { - let a: STMarkdownInlineNode = .text("z") - let b: STMarkdownInlineNode = .text("z") - let c: STMarkdownInlineNode = .text("w") - XCTAssertEqual(a, b) - XCTAssertNotEqual(a, c) - - let nested: STMarkdownInlineNode = .strong([.emphasis([.link(destination: "d", children: [.code("x")])])]) - st_requireSendable(nested) - } - - // MARK: STMarkdownCheckbox / STMarkdownListKind / STMarkdownColumnAlignment - - func testCheckboxExhaustiveCases() { - let cases: [STMarkdownCheckbox] = [.checked, .unchecked] - XCTAssertEqual(Set(cases), Set([STMarkdownCheckbox.checked, .unchecked])) - st_requireSendable(STMarkdownCheckbox.checked) - } - - func testListKindExhaustiveCases() { - let kinds: [STMarkdownListKind] = [.ordered(startIndex: 1), .ordered(startIndex: 7), .unordered] - XCTAssertTrue(kinds.contains(.unordered)) - XCTAssertTrue(kinds.contains { if case .ordered(let n) = $0 { return n == 7 }; return false }) - st_requireSendable(STMarkdownListKind.unordered) - } - - func testColumnAlignmentExhaustiveCases() { - let all: [STMarkdownColumnAlignment] = [.left, .center, .right] - XCTAssertEqual(Set(all), [.left, .center, .right]) - } - - // MARK: STMarkdownListItemNode - - func testListItemNodeInitializersAndEquality() { - let a = STMarkdownListItemNode(blocks: [.paragraph([.text("p")])]) - let b = STMarkdownListItemNode(blocks: [.paragraph([.text("p")])], checkbox: nil) - let c = STMarkdownListItemNode(blocks: [.paragraph([.text("p")])], checkbox: .checked) - XCTAssertEqual(a, b) - XCTAssertNotEqual(a, c) - } - - // MARK: STMarkdownTableModel - - func testTableModelTwoInitializersAndColumnAlignments() { - let cell: [STMarkdownInlineNode] = [.text("c")] - let row: [[STMarkdownInlineNode]] = [cell] - let t0 = STMarkdownTableModel(header: [cell], rows: [row]) - XCTAssertTrue(t0.columnAlignments.isEmpty, "双参数 init 应默认空对齐") - - let t1 = STMarkdownTableModel( - header: nil, - rows: [row], - columnAlignments: [.left, .center, .right] - ) - XCTAssertEqual(t1.columnAlignments, [.left, .center, .right]) - - XCTAssertNotEqual(t0, t1) - } - - /// 不带 alignments 的双参数 init 与带空 alignments 数组的三参数 init 应得到相等模型。 - /// 钉住「默认值漂移」类回归——若实现把双参数 init 默认值改成非空数组,本用例会红字提示。 - func testTableModelDefaultAlignmentsEquivalentToExplicitEmptyAlignments() { - let cell: [STMarkdownInlineNode] = [.text("c")] - let row: [[STMarkdownInlineNode]] = [cell] - let implicit = STMarkdownTableModel(header: [cell], rows: [row]) - let explicit = STMarkdownTableModel(header: [cell], rows: [row], columnAlignments: []) - XCTAssertEqual(implicit, explicit, "双参数 init 与显式空 alignments 三参数 init 应等价") - } - - // MARK: STMarkdownBlockNode - - func testBlockNodeExhaustiveCasesProduceDistinctTags() { - let table = STMarkdownTableModel(header: nil, rows: [[ [.text("a")] ]]) - let samples: [STMarkdownBlockNode] = [ - .paragraph([.text("p")]), - .heading(level: 3, content: [.text("h")]), - .quote([.paragraph([.text("q")])]), - .list(kind: .unordered, items: [STMarkdownListItemNode(blocks: [.paragraph([.text("i")])])]), - .codeBlock(language: "swift", code: "let x = 0"), - .codeBlock(language: nil, code: "plain"), - .table(table), - .mathBlock("E=mc^2"), - .image(url: "https://u", altText: "al", title: "t"), - .image(url: "https://u2", altText: "a2", title: nil), - .thematicBreak, - .details(summary: [.text("s")], body: [.paragraph([.text("d")])]), - .rawHTML("
"), - ] - let tags = samples.map { st_tag(forBlock: $0) } - XCTAssertEqual(Set(tags), Set(BlockCaseTag.allCases)) - } - - func testBlockNodeHashableNestedStructure() { - let inner = STMarkdownBlockNode.paragraph([.strong([.text("x")])]) - let doc = STMarkdownDocument(blocks: [.quote([inner, .thematicBreak])]) - let copy = STMarkdownDocument(blocks: [.quote([inner, .thematicBreak])]) - XCTAssertEqual(doc, copy) - } - - // MARK: STMarkdownDocument - - func testDocumentInitializerAndSendable() { - let d = STMarkdownDocument(blocks: [.paragraph([])]) - st_requireSendable(d) - XCTAssertEqual(d.blocks.count, 1) - if case .paragraph(let inlines)? = d.blocks.first { - XCTAssertTrue(inlines.isEmpty) - } else { - XCTFail("期望单一段落块") - } - } - - // MARK: STMarkdownRenderDocument - - func testRenderDocumentInitializerAndEquality() { - let r = STMarkdownRenderDocument(blocks: [.thematicBreak()]) - let same = STMarkdownRenderDocument(blocks: [.thematicBreak()]) - XCTAssertEqual(r, same) - st_requireSendable(r) - } - - // MARK: STMarkdownRenderBlock - - func testRenderBlockExhaustiveCasesProduceDistinctTags() { - let table = STMarkdownTableModel(header: [[.text("H")]], rows: [[ [.text("c")] ]]) - let samples: [STMarkdownRenderBlock] = [ - .paragraph([.text("p")]), - .heading(level: 2, anchorId: "h", content: [.text("h")]), - .quote([.paragraph([.text("q")])]), - .list([ - STMarkdownRenderListItem( - blocks: [.paragraph([.text("li")])], - ordered: false, - level: 0, - orderedIndex: nil - ), - ]), - .codeBlock(language: "js", code: "1"), - .codeBlock(language: nil, code: "2"), - .table(table), - .mathBlock("a+b"), - .image(url: "https://img", altText: "x", title: "y"), - .image(url: "https://img2", altText: "x2", title: nil), - .thematicBreak(), - .details(summary: [.text("sum")], body: [.paragraph([.text("bd")])]), - .rawHTML("

"), - ] - let tags = samples.map { st_tag(forRenderBlock: $0) } - XCTAssertEqual(Set(tags), Set(RenderBlockCaseTag.allCases)) - } - - // MARK: STMarkdownRenderListItem - - func testRenderListItemDirectInitializerPreservesFields() { - let item = STMarkdownRenderListItem( - blocks: [.paragraph([.text("a")]), .codeBlock(language: nil, code: "b")], - ordered: true, - level: 2, - orderedIndex: 9, - checkbox: .unchecked - ) - XCTAssertEqual(item.blocks.count, 2) - XCTAssertTrue(item.ordered) - XCTAssertEqual(item.level, 2) - XCTAssertEqual(item.orderedIndex, 9) - XCTAssertEqual(item.checkbox, .unchecked) - XCTAssertEqual(item.content, [.text("a")]) - XCTAssertEqual(item.childBlocks.count, 1) - if case .codeBlock(_, language: _, code: let code)? = item.childBlocks.first { - XCTAssertEqual(code, "b") - } else { - XCTFail("childBlocks 首项应为 codeBlock") - } - } - - func testRenderListItemContentInitializerBuildsParagraphPrefix() { - let item = STMarkdownRenderListItem( - content: [.text("lead")], - ordered: false, - level: 1, - orderedIndex: nil, - childBlocks: [.quote([.paragraph([.text("nested")])])], - checkbox: .checked - ) - XCTAssertEqual(item.content, [.text("lead")]) - XCTAssertEqual(item.childBlocks.count, 1) - XCTAssertEqual(item.checkbox, .checked) - if case .quote(_, let inner)? = item.childBlocks.first { - XCTAssertFalse(inner.isEmpty) - } else { - XCTFail("期望 childBlocks 首块为 quote") - } - } - - func testRenderListItemContentInitializerEmptyContentOnlyAppendsChildBlocks() { - // content 为空时不会前置合成 paragraph;若 childBlocks 首块非 paragraph, - // 则 `content` 为空且 `childBlocks` 与 `blocks` 一致。 - let item = STMarkdownRenderListItem( - content: [], - ordered: false, - level: 0, - orderedIndex: nil, - childBlocks: [.codeBlock(language: "swift", code: "only-code")], - checkbox: nil - ) - XCTAssertEqual(item.blocks, [.codeBlock(language: "swift", code: "only-code")]) - XCTAssertEqual(item.blocks.count, 1) - XCTAssertTrue(item.content.isEmpty) - XCTAssertEqual(item.childBlocks, item.blocks) - } - - /// 空 content 不插入额外段;若 childBlocks 仍以 paragraph 开头,则按 API 契约 - /// `content` 取该段 inlines,`childBlocks` 为剩余块(此处为空)。 - func testRenderListItemContentInitializerEmptyContentWithParagraphFirstChildExposesChildInContent() { - let item = STMarkdownRenderListItem( - content: [], - ordered: false, - level: 0, - orderedIndex: nil, - childBlocks: [.paragraph([.text("only-child")])], - checkbox: nil - ) - XCTAssertEqual(item.blocks.count, 1) - XCTAssertEqual(item.content, [.text("only-child")]) - XCTAssertTrue(item.childBlocks.isEmpty) - } - - func testRenderListItemNonParagraphFirstContentAndChildBlocksContract() { - let item = STMarkdownRenderListItem( - blocks: [.codeBlock(language: "swift", code: "x")], - ordered: false, - level: 0, - orderedIndex: nil - ) - XCTAssertTrue(item.content.isEmpty) - XCTAssertEqual(item.childBlocks, item.blocks) - } - - func testRenderListItemHashable() { - let a = STMarkdownRenderListItem(blocks: [.paragraph([.text("z")])], ordered: false, level: 0, orderedIndex: nil) - let b = STMarkdownRenderListItem(blocks: [.paragraph([.text("z")])], ordered: false, level: 0, orderedIndex: nil) - XCTAssertEqual(a, b) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownAttachmentsTests.swift b/Example/STBaseProjectExampleTests/STMarkdownAttachmentsTests.swift deleted file mode 100644 index 6dbe5ae..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownAttachmentsTests.swift +++ /dev/null @@ -1,259 +0,0 @@ -import XCTest -import UIKit -@testable import STBaseProject - -// MARK: - Test doubles - -/// 最小 `STMarkdownRefreshableAttachment` 实现,用于隔离测试附件刷新协议与绑定逻辑。 -private final class MockRefreshableAttachment: NSTextAttachment, STMarkdownRefreshableAttachment, @unchecked Sendable { - private let registry = STMarkdownRefreshObserverRegistry() - - func addDisplayObserver(_ observer: @escaping () -> Void) -> STMarkdownRefreshObservation { - self.registry.add(observer) - } - - func notifyDisplayObservers() { - self.registry.notify() - } -} - -// MARK: - STMarkdownRefreshObservation & STMarkdownRefreshObserverRegistry - -final class STMarkdownRefreshAttachmentInfrastructureTests: XCTestCase { - - func testRefreshObservationInvalidateRunsHandlerOnce() { - var calls = 0 - let obs = STMarkdownRefreshObservation { calls += 1 } - obs.invalidate() - obs.invalidate() - XCTAssertEqual(calls, 1) - } - - func testRefreshObservationDeinitInvalidatesHandler() { - var calls = 0 - do { - _ = STMarkdownRefreshObservation { calls += 1 } - } - XCTAssertEqual(calls, 1) - } - - func testRefreshObserverRegistryMulticastAndInvalidateRemovesEntry() { - let registry = STMarkdownRefreshObserverRegistry() - var a = 0 - var b = 0 - let tokenA = registry.add { a += 1 } - let tokenB = registry.add { b += 1 } - registry.notify() - XCTAssertEqual(a, 1) - XCTAssertEqual(b, 1) - tokenA.invalidate() - registry.notify() - XCTAssertEqual(a, 1) - XCTAssertEqual(b, 2) - tokenB.invalidate() - } - - func testRefreshObserverRegistryNotifyInvokesAllCurrentObservers() { - let registry = STMarkdownRefreshObserverRegistry() - var sum = 0 - let token1 = registry.add { sum += 1 } - let token2 = registry.add { sum += 2 } - registry.notify() - XCTAssertEqual(sum, 3) - token1.invalidate() - token2.invalidate() - } -} - -// MARK: - STMarkdownNumberBadgeAttachment - -@MainActor -final class STMarkdownNumberBadgeAttachmentTests: XCTestCase { - - func testFixedDiameterBaseline() { - XCTAssertEqual(STMarkdownNumberBadgeAttachment.fixedDiameter, 18, accuracy: 0.001) - } - - func testInitUsesMinimumDiameterForSmallBodyFont() { - let font = UIFont.st_systemFont(ofSize: 10, weight: .regular) - let badge = STMarkdownNumberBadgeAttachment( - numberText: "1", - font: font, - textColor: .white, - backgroundColor: .systemBlue - ) - guard let image = badge.image else { - return XCTFail("expected image") - } - XCTAssertEqual(image.size.width, STMarkdownNumberBadgeAttachment.fixedDiameter, accuracy: 0.5) - XCTAssertEqual(image.size.height, STMarkdownNumberBadgeAttachment.fixedDiameter, accuracy: 0.5) - XCTAssertEqual(badge.bounds.width, image.size.width, accuracy: 0.001) - XCTAssertEqual(badge.bounds.height, image.size.height, accuracy: 0.001) - } - - func testInitScalesDiameterWithBodyFont() { - let font = UIFont.st_systemFont(ofSize: 34, weight: .regular) - let badge = STMarkdownNumberBadgeAttachment( - numberText: "2", - font: font, - textColor: .label, - backgroundColor: .systemGray3 - ) - guard let image = badge.image else { - return XCTFail("expected image") - } - // 与 `STMarkdownNumberBadgeAttachment.init` 一致:`UIFont` 实际 `pointSize` 可能略大于请求值。 - let expected = max( - STMarkdownNumberBadgeAttachment.fixedDiameter, - ceil(font.pointSize / 17 * STMarkdownNumberBadgeAttachment.fixedDiameter) - ) - XCTAssertEqual(image.size.width, expected, accuracy: 0.5) - XCTAssertEqual(image.size.height, expected, accuracy: 0.5) - } - - func testRenderBadgeImageDefaultDiameterMatchesFixedDiameter() { - let img = STMarkdownNumberBadgeAttachment.renderBadgeImage( - number: "9", - textColor: .white, - backgroundColor: .systemRed - ) - XCTAssertEqual(img.size.width, STMarkdownNumberBadgeAttachment.fixedDiameter, accuracy: 0.5) - XCTAssertEqual(img.size.height, STMarkdownNumberBadgeAttachment.fixedDiameter, accuracy: 0.5) - } - - func testRenderBadgeImageAccessibilityLabel() { - let img = STMarkdownNumberBadgeAttachment.renderBadgeImage( - number: "42", - textColor: .white, - backgroundColor: .black, - diameter: 20 - ) - XCTAssertEqual(img.accessibilityLabel, "引用 42") - } - - func testInitImageAccessibilityLabel() { - let font = UIFont.st_systemFont(ofSize: 17, weight: .regular) - let badge = STMarkdownNumberBadgeAttachment( - numberText: "7", - font: font, - textColor: .white, - backgroundColor: .systemGreen - ) - XCTAssertEqual(badge.image?.accessibilityLabel, "引用 7") - } - - func testRenderBadgeImageCacheReturnsSameInstanceForIdenticalParameters() { - let a = STMarkdownNumberBadgeAttachment.renderBadgeImage( - number: "3", - textColor: .white, - backgroundColor: .systemOrange, - diameter: 22 - ) - let b = STMarkdownNumberBadgeAttachment.renderBadgeImage( - number: "3", - textColor: .white, - backgroundColor: .systemOrange, - diameter: 22 - ) - XCTAssertTrue(a === b) - } - - func testLegacyTypealiasCompilesAndBehavesLikeConcreteType() { - let font = UIFont.st_systemFont(ofSize: 17, weight: .regular) - let viaAlias: STMarkdownCircleNumberAttachment = STMarkdownCircleNumberAttachment( - numberText: "1", - font: font, - textColor: .white, - backgroundColor: .systemBlue - ) - XCTAssertNotNil(viaAlias.image) - } -} - -// MARK: - STMarkdownAttachmentRefreshSupport - -@MainActor -final class STMarkdownAttachmentRefreshSupportTests: XCTestCase { - - func testBindRefreshHandlersEmptyStringReturnsNoTokens() { - let empty = NSAttributedString() - let tokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: empty) { _ in } - XCTAssertTrue(tokens.isEmpty) - } - - func testBindRefreshHandlersSkipsNonRefreshableAttachments() { - let plain = NSTextAttachment() - let attr = NSMutableAttributedString(string: " ") - attr.addAttribute(.attachment, value: plain, range: NSRange(location: 0, length: 1)) - var refreshCalls = 0 - let tokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: attr) { _ in - refreshCalls += 1 - } - XCTAssertTrue(tokens.isEmpty) - XCTAssertEqual(refreshCalls, 0) - } - - func testBindRefreshHandlersInvokesRefreshOnMainWhenObserverFiresOnMainThread() { - let expectation = expectation(description: "refresh") - let attachment = MockRefreshableAttachment() - let attr = NSMutableAttributedString(string: " ") - attr.addAttribute(.attachment, value: attachment, range: NSRange(location: 0, length: 1)) - let tokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: attr) { att in - XCTAssertTrue(Thread.isMainThread) - XCTAssertTrue(att === attachment) - expectation.fulfill() - } - attachment.notifyDisplayObservers() - waitForExpectations(timeout: 2) - tokens.forEach { $0.invalidate() } - } - - func testBindRefreshHandlersDispatchesToMainWhenObserverFiresOffMainThread() { - let expectation = expectation(description: "refresh off main") - let attachment = MockRefreshableAttachment() - let attr = NSMutableAttributedString(string: " ") - attr.addAttribute(.attachment, value: attachment, range: NSRange(location: 0, length: 1)) - let tokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: attr) { att in - XCTAssertTrue(Thread.isMainThread) - XCTAssertTrue(att === attachment) - expectation.fulfill() - } - DispatchQueue.global(qos: .userInitiated).async { - attachment.notifyDisplayObservers() - } - waitForExpectations(timeout: 3) - tokens.forEach { $0.invalidate() } - } - - func testBindRefreshHandlersRegistersOneTokenPerRefreshableAttachment() { - let a = MockRefreshableAttachment() - let b = MockRefreshableAttachment() - let attr = NSMutableAttributedString(string: " ") - attr.addAttribute(.attachment, value: a, range: NSRange(location: 0, length: 1)) - attr.addAttribute(.attachment, value: b, range: NSRange(location: 1, length: 1)) - var count = 0 - let tokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: attr) { _ in - count += 1 - } - XCTAssertEqual(tokens.count, 2) - a.notifyDisplayObservers() - b.notifyDisplayObservers() - XCTAssertEqual(count, 2) - } - - func testInvalidateObservationStopsFurtherRefreshCallbacks() { - let attachment = MockRefreshableAttachment() - let attr = NSMutableAttributedString(string: " ") - attr.addAttribute(.attachment, value: attachment, range: NSRange(location: 0, length: 1)) - var calls = 0 - let tokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: attr) { _ in - calls += 1 - } - XCTAssertEqual(tokens.count, 1) - attachment.notifyDisplayObservers() - XCTAssertEqual(calls, 1) - tokens[0].invalidate() - attachment.notifyDisplayObservers() - XCTAssertEqual(calls, 1) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownBaseTextViewLayoutTests.swift b/Example/STBaseProjectExampleTests/STMarkdownBaseTextViewLayoutTests.swift deleted file mode 100644 index 284a832..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownBaseTextViewLayoutTests.swift +++ /dev/null @@ -1,37 +0,0 @@ -import XCTest -import UIKit -@testable import STBaseProject - -/// 验证 ``STMarkdownBaseTextView`` 在 Cell 未布局完成时的测量宽度回退与高度回调节流(对齐流式 Cell 稳定性加强)。 -@MainActor -final class STMarkdownBaseTextViewLayoutTests: XCTestCase { - - func testResolvedMeasurementWidthFallsBackToTextViewFrameWhenBoundsZero() { - let view = STMarkdownTextView(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) - view.preferredContentWidth = 0 - view.bounds = .zero - view.textView.frame = CGRect(x: 0, y: 0, width: 320, height: 44) - XCTAssertEqual(view.resolvedMarkdownMeasurementWidth(), 320, accuracy: 0.01) - } - - func testContentLayoutHeightNotificationRespectsMinIntervalUnlessForced() { - let view = STMarkdownTextView(frame: CGRect(x: 0, y: 0, width: 300, height: 400)) - view.contentLayoutHeightNotificationThreshold = 0 - view.contentLayoutHeightNotificationMinInterval = 10 - view.setMarkdown("# Hello\n\nSome body text for height.") - - var invocations = 0 - view.onContentLayoutHeightChange = { _ in - invocations += 1 - } - - view.publishContentLayoutHeightNotificationIfNeeded(force: false) - XCTAssertEqual(invocations, 1) - - view.publishContentLayoutHeightNotificationIfNeeded(force: false) - XCTAssertEqual(invocations, 1, "节流期内不应重复触发") - - view.publishContentLayoutHeightNotificationIfNeeded(force: true) - XCTAssertEqual(invocations, 2, "force 应绕过时间节流") - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownConcurrencyStressTests.swift b/Example/STBaseProjectExampleTests/STMarkdownConcurrencyStressTests.swift deleted file mode 100644 index 8a2d43f..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownConcurrencyStressTests.swift +++ /dev/null @@ -1,30 +0,0 @@ -import XCTest -@testable import STBaseProject - -/// 对照对比文档 P1:在 ``parseLock`` 存在的前提下,多队列并发调用 ``STMarkdownPipeline/process`` 应可完成且无崩溃。 -final class STMarkdownConcurrencyStressTests: XCTestCase { - - func testConcurrentPipelineProcessCompletes() { - let pipeline = STMarkdownPipeline(configuration: STMarkdownPipelineConfiguration(enableInputSanitizer: false)) - let md = """ - # Title - - Body with [^fn]. - - [^fn]: Definition line. - """ - let group = DispatchGroup() - let queueCount = 12 - let iterationsPerQueue = 40 - for _ in 0.. Bool { - self.shouldApplyResult - } - - func apply(to text: String, context: inout STMarkdownPreprocessContext) -> String { - self.replacement - } -} - -private struct CoreMockParser: STMarkdownStructureParsing { - let parseResult: STMarkdownDocument - func parse(_ markdown: String) -> STMarkdownDocument { self.parseResult } -} - -private struct CoreMockRenderAdapter: STMarkdownRenderAdapting { - let adaptResult: STMarkdownRenderDocument - func adapt(_ document: STMarkdownDocument) -> STMarkdownRenderDocument { self.adaptResult } -} - -private struct CoreAppendNormalizer: STMarkdownSemanticNormalizing { - let suffix: String - func normalize(_ document: STMarkdownDocument) -> STMarkdownDocument { - let appended = STMarkdownBlockNode.paragraph([.text(self.suffix)]) - return STMarkdownDocument( - blocks: document.blocks + [appended], - footnoteDefinitions: document.footnoteDefinitions - ) - } -} - -@MainActor -private final class CoreInteractionStub: STMarkdownInteractable { - var onLinkTap: ((URL) -> Void)? - var onSelectionChange: ((String) -> Void)? - var isTextSelectionEnabled: Bool = false -} - -final class STMarkdownCoreContractsTests: XCTestCase { - - func testEngineDelegatesToPipelineAndPreservesRawMarkdown() { - let parserOutput = STMarkdownDocument(blocks: [.heading(level: 1, content: [.text("Title")])]) - let tbMeta = STMarkdownRenderBlockMetadata( - id: "tb", - path: [], - kind: .thematicBreak, - revealPolicy: .atomicBlock - ) - let renderOutput = STMarkdownRenderDocument(blocks: [.thematicBreak(tbMeta)]) - let parser = CoreMockParser(parseResult: parserOutput) - let adapter = CoreMockRenderAdapter(adaptResult: renderOutput) - let engine = STMarkdownEngine( - configuration: .init(enableInputSanitizer: false), - parser: parser, - renderAdapter: adapter - ) - - let result = engine.process("raw markdown") - - XCTAssertEqual(result.rawMarkdown, "raw markdown") - XCTAssertEqual(result.sanitizedMarkdown, "raw markdown") - XCTAssertEqual(result.sourceDocument, parserOutput) - XCTAssertEqual(result.normalizedDocument, parserOutput) - XCTAssertEqual(result.renderDocument, renderOutput) - XCTAssertTrue(result.tableOfContents.isEmpty) - } - - func testPipelineUsesSemanticNormalizersInOrder() { - let source = STMarkdownDocument(blocks: [.paragraph([.text("seed")])]) - let parser = CoreMockParser(parseResult: source) - let adapter = CoreMockRenderAdapter(adaptResult: .init(blocks: [])) - let pipeline = STMarkdownPipeline( - configuration: .init( - enableInputSanitizer: false, - semanticNormalizers: [ - CoreAppendNormalizer(suffix: "A"), - CoreAppendNormalizer(suffix: "B"), - ] - ), - parser: parser, - renderAdapter: adapter - ) - - let result = pipeline.process("ignored") - - XCTAssertEqual(result.normalizedDocument.blocks.count, 3) - XCTAssertEqual(result.normalizedDocument.blocks[1], .paragraph([.text("A")])) - XCTAssertEqual(result.normalizedDocument.blocks[2], .paragraph([.text("B")])) - } - - func testPipelineConfigurationDefaultsEnableSanitizerAndRules() { - let configuration = STMarkdownPipelineConfiguration() - - XCTAssertTrue(configuration.enableInputSanitizer) - XCTAssertFalse(configuration.debug) - XCTAssertFalse(configuration.sanitizerRules.isEmpty) - XCTAssertTrue(configuration.semanticNormalizers.isEmpty) - } - - func testPreprocessContextMarksAppliedRulesInOrder() { - var context = STMarkdownPreprocessContext(debugMode: .enabled) - let first = CoreMockRule(name: "rule-1", shouldApplyResult: true, replacement: "x") - - context.markApplied(first) - context.markApplied("rule-2") - - XCTAssertTrue(context.debugMode.isEnabled) - XCTAssertEqual(context.appliedRules, ["rule-1", "rule-2"]) - } - - func testRenderAdapterKeepsQuoteListItemLevelWithoutExtraIncrement() { - let adapter = STMarkdownRenderAdapter() - let document = STMarkdownDocument( - blocks: [ - .quote([ - .list( - kind: .ordered(startIndex: 3), - items: [ - STMarkdownListItemNode(blocks: [.paragraph([.text("inside quote")])]), - ] - ) - ]) - ] - ) - - let renderDocument = adapter.adapt(document) - - guard let outer = renderDocument.blocks.first, - case .quote(_, let quoteBlocks) = outer, - let inner = quoteBlocks.first, - case .list(_, let items) = inner - else { - return XCTFail("Expected quote->list render structure") - } - XCTAssertEqual(items.first?.orderedIndex, 3) - XCTAssertEqual(items.first?.level, 0) - } - - func testBodyParagraphStyleUsesConfiguredMetrics() { - let style = STMarkdownStyle.default - let paragraph = STMarkdownTypography.bodyParagraphStyle(style: style) - - XCTAssertEqual(paragraph.minimumLineHeight, style.lineHeight) - XCTAssertEqual(paragraph.maximumLineHeight, style.lineHeight) - XCTAssertEqual(paragraph.lineSpacing, style.bodyLineSpacing) - XCTAssertEqual(paragraph.paragraphSpacing, style.paragraphSpacing) - } - - func testHeadingFontAndInsetsForFallbackLevel() { - let font = STMarkdownTypography.headingFont(for: 6) - let insets = STMarkdownTypography.headingInsets(for: 6) - let expected = UIFont.st_systemFont(ofSize: 16, weight: .medium) - - XCTAssertEqual(font.pointSize, expected.pointSize) - XCTAssertEqual(insets.top, 16) - XCTAssertEqual(insets.bottom, 6) - } - - func testHeadingParagraphStyleNeverUsesNegativeParagraphSpacingBefore() { - var style = STMarkdownStyle.default - style.paragraphSpacing = 100 - let font = UIFont.st_systemFont(ofSize: 22, weight: .bold) - - let paragraph = STMarkdownTypography.headingParagraphStyle(level: 1, font: font, style: style) - - XCTAssertEqual(paragraph.paragraphSpacingBefore, 0) - XCTAssertEqual(paragraph.paragraphSpacing, 10) - } - - func testListStyleResolverOrderedLayoutBuildsMonotonicIndices() { - let style = STMarkdownStyle.default - let baseFont = style.font - let layout = STMarkdownListStyleResolver.makeLayout( - ordered: true, - level: 2, - orderedIndex: 0, - baseFont: baseFont, - style: style - ) - - XCTAssertEqual(layout.markerText, "1.\t") - XCTAssertGreaterThan(layout.contentIndent, layout.markerIndent) - XCTAssertGreaterThan(layout.paragraphStyle.tabStops.count, 1) - } - - func testApplyContinuationIndentAlignsAllParagraphsToContentIndent() { - let attributed = NSMutableAttributedString(string: "line1\nline2\n\nline3") - let style = STMarkdownStyle.default - - STMarkdownListStyleResolver.applyContinuationIndent( - to: attributed, - firstLineIndent: 4, - contentIndent: 28, - style: style - ) - - var location = 0 - let string = attributed.string as NSString - while location < attributed.length { - let range = string.paragraphRange(for: NSRange(location: location, length: 0)) - let paragraph = attributed.attribute(.paragraphStyle, at: range.location, effectiveRange: nil) as? NSParagraphStyle - XCTAssertEqual(paragraph?.firstLineHeadIndent, 28) - XCTAssertEqual(paragraph?.headIndent, 28) - location = range.location + range.length - } - } - - func testStyleDefaultAndResolvedDisplayScale() { - let style = STMarkdownStyle.default - XCTAssertEqual(style.lineHeight, 24) - XCTAssertGreaterThan(style.resolvedDisplayScale, 0) - } - - func testStyleHeadingFontProviderCanOverrideLevel() { - var style = STMarkdownStyle.default - style.headingFontProvider = { _ in UIFont.st_systemFont(ofSize: 42, weight: .bold) } - - let resolved = style.headingFontProvider?(3) - let expected = UIFont.st_systemFont(ofSize: 42, weight: .bold) - - XCTAssertEqual(resolved?.pointSize, expected.pointSize) - } - - func testFontResolverReturnsExpectedPointSizeForBoldAndItalic() { - let base = UIFont.st_systemFont(ofSize: 17, weight: .regular) - - let italic = STMarkdownFontResolver.italicFont(from: base) - let bold = STMarkdownFontResolver.boldFont(from: base) - let boldItalic = STMarkdownFontResolver.boldItalicFont(from: base) - - XCTAssertEqual(italic.pointSize, base.pointSize) - XCTAssertEqual(bold.pointSize, base.pointSize) - XCTAssertEqual(boldItalic.pointSize, base.pointSize) - } - - func testPresetsFactoryCreatesFreshRendererInstances() { - let first = STMarkdownPresets.makeDefaultAdvancedRenderers() - let second = STMarkdownPresets.makeDefaultAdvancedRenderers() - - XCTAssertNotNil(first.inlineMathRenderer) - XCTAssertNotNil(first.codeBlockRenderer) - - let firstObject = first.inlineMathRenderer as AnyObject - let secondObject = second.inlineMathRenderer as AnyObject - XCTAssertFalse(firstObject === secondObject) - } - - func testDeprecatedDefaultAdvancedRenderersCompatibilityCreatesFreshInstances() { - let first = STMarkdownPresets.defaultAdvancedRenderers - let second = STMarkdownPresets.defaultAdvancedRenderers - - XCTAssertNotNil(first.inlineMathRenderer) - XCTAssertNotNil(first.blockMathRenderer) - XCTAssertNotNil(first.codeBlockRenderer) - XCTAssertNotNil(first.tableRenderer) - XCTAssertNotNil(first.imageRenderer) - XCTAssertNotNil(first.horizontalRuleRenderer) - - let firstObject = first.inlineMathRenderer as AnyObject - let secondObject = second.inlineMathRenderer as AnyObject - XCTAssertFalse(firstObject === secondObject) - } - - func testPresetsProvideArticleAndCompactWithDifferentTypography() { - XCTAssertGreaterThan(STMarkdownPresets.article.font.pointSize, STMarkdownPresets.compact.font.pointSize) - XCTAssertGreaterThan(STMarkdownPresets.article.lineHeight, STMarkdownPresets.compact.lineHeight) - XCTAssertGreaterThan(STMarkdownPresets.article.horizontalRuleLength, STMarkdownPresets.compact.horizontalRuleLength) - } - - @MainActor - func testInteractionProtocolPropertiesAreUsableOnMainActor() { - let stub = CoreInteractionStub() - var tappedURL: URL? - var selectedText: String? - let url = URL(string: "https://example.com")! - - stub.onLinkTap = { tappedURL = $0 } - stub.onSelectionChange = { selectedText = $0 } - stub.isTextSelectionEnabled = true - - stub.onLinkTap?(url) - stub.onSelectionChange?("selection") - - XCTAssertEqual(tappedURL, url) - XCTAssertEqual(selectedText, "selection") - XCTAssertTrue(stub.isTextSelectionEnabled) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownFixTests.swift b/Example/STBaseProjectExampleTests/STMarkdownFixTests.swift deleted file mode 100644 index 74175a2..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownFixTests.swift +++ /dev/null @@ -1,543 +0,0 @@ -// -// 验证以下三个 Bug 修复: -// 1. STMarkdownMermaidRenderer.cacheKey 使用完整代码字符串,不再用 hashValue,消除碰撞风险 -// 2. STMarkdownTableViewModel 使用静态正则常量,不再在热路径重复编译 -// 3. STMarkdownTableView 添加 UICollectionViewDelegate,使 onCitationTap 回调可正常触发 -// 4. STMarkdownTableView 支持表格展开回调,宿主可呈现全屏详情页 - -import XCTest -import UIKit -@testable import STBaseProject -@testable import STBaseProjectExample - -// MARK: - 1. Mermaid Cache Key Tests - -/// 验证 cacheKey 使用完整代码字符串,不同代码/主题产生不同键,不会发生碰撞 -@MainActor -final class STMarkdownMermaidCacheKeyTests: XCTestCase { - - func testDifferentCodesProduceDifferentKeys() { - let renderer = STMarkdownMermaidRenderer.shared - let keyA = renderer.cacheKey("graph LR\n A --> B", .light) - let keyB = renderer.cacheKey("graph TD\n X --> Y", .light) - XCTAssertNotEqual(keyA, keyB, "不同代码应产生不同 cacheKey") - } - - func testSameCodeSameThemeProduceEqualKeys() { - let renderer = STMarkdownMermaidRenderer.shared - let code = "pie title Pets\n\"Dogs\": 386" - let key1 = renderer.cacheKey(code, .light) - let key2 = renderer.cacheKey(code, .light) - XCTAssertEqual(key1, key2, "相同代码和主题应产生相同 cacheKey") - } - - func testDarkAndLightThemeProduceDifferentKeys() { - let renderer = STMarkdownMermaidRenderer.shared - let code = "flowchart LR\n A --> B" - let lightKey = renderer.cacheKey(code, .light) - let darkKey = renderer.cacheKey(code, .dark) - XCTAssertNotEqual(lightKey, darkKey, "深色/浅色主题应产生不同 cacheKey") - } - - func testKeyFormatIsCodeBased() { - let renderer = STMarkdownMermaidRenderer.shared - let code = "graph LR\n A --> B" - let key = renderer.cacheKey(code, .light) - XCTAssertTrue(key.hasSuffix(code), "cacheKey 应以完整代码字符串结尾,而非 hashValue") - XCTAssertTrue(key.hasPrefix("0_"), "浅色主题 cacheKey 应以 '0_' 开头") - } - - func testDarkKeyFormatIsCodeBased() { - let renderer = STMarkdownMermaidRenderer.shared - let code = "sequenceDiagram\n A->>B: Hello" - let key = renderer.cacheKey(code, .dark) - XCTAssertTrue(key.hasPrefix("1_"), "深色主题 cacheKey 应以 '1_' 开头") - XCTAssertTrue(key.hasSuffix(code), "cacheKey 应包含完整代码字符串") - } - - /// 回归测试:hashValue 在同进程中偶尔会对不同字符串返回相同值(Swift 有随机化处理,但原实现存在理论碰撞) - /// 当前实现使用完整字符串,可保证唯一性 - func testKnownCollisionCandidatesProduceDifferentKeys() { - let renderer = STMarkdownMermaidRenderer.shared - // 两段意义完全不同的 Mermaid 代码 - let codes: [String] = [ - "graph LR\n A --> B\n B --> C", - "graph RL\n C --> B\n B --> A", - "sequenceDiagram\n Alice->>Bob: Hi", - "sequenceDiagram\n Bob->>Alice: Hi", - "pie title X\n \"a\": 10", - "pie title X\n \"b\": 10", - ] - var keys = Set() - for code in codes { - let key = renderer.cacheKey(code, .light) - XCTAssertTrue(keys.insert(key).inserted, "代码 '\(code)' 产生的 key '\(key)' 与已有 key 碰撞") - } - } -} - -// MARK: - 2. STMarkdownTableViewModel Citation Tests - -/// 验证静态正则常量正确提取 citation、badge 替换,不受热路径重编译影响 -final class STMarkdownTableViewModelCitationTests: XCTestCase { - - private let style = STMarkdownStyle.default - - // MARK: - Citation Extraction - - func testExtractsCitationFromLinkNode() { - let table = STMarkdownTableModel( - header: [[.link(destination: "", children: [.text("Citation:3")])]], - rows: [] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - XCTAssertEqual(viewModel.cells.count, 1) - let cellData = viewModel.cells[0][0] - XCTAssertTrue(cellData.citations.contains("3"), "应提取 link 节点中的 Citation:3") - } - - func testExtractsCitationFromInlineText() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("参见 [Citation:7] 了解详情")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - let cellData = viewModel.cells[0][0] - XCTAssertTrue(cellData.citations.contains("7"), "应从纯文本 [Citation:7] 提取编号") - } - - func testNoCitationInPlainText() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("普通内容,没有引用")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - XCTAssertEqual(viewModel.cells[0][0].citations, [], "无 citation 时应返回空数组") - } - - func testMultipleCitationsInSameCell() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[ - .text("[Citation:1]"), - .link(destination: "", children: [.text("Citation:2")]) - ]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - let citations = viewModel.cells[0][0].citations - XCTAssertTrue(citations.contains("1"), "应包含 Citation:1") - XCTAssertTrue(citations.contains("2"), "应包含 Citation:2") - } - - func testWebpageVariantAlsoExtracted() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("[Webpage:4]")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - // citation badge regex 覆盖 [Webpage:N] 格式,验证不崩溃且处理正常 - XCTAssertNotNil(viewModel.cells[0][0].attributedContent) - } - - // MARK: - Header Detection - - func testFirstRowIsHeaderWhenHeaderProvided() { - let table = STMarkdownTableModel( - header: [[.text("列标题")]], - rows: [[[.text("数据")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - XCTAssertTrue(viewModel.hasHeader) - XCTAssertTrue(viewModel.cells[0][0].role.isHeader, "第一行应标记为 header") - XCTAssertFalse(viewModel.cells[1][0].role.isHeader, "数据行不应标记为 header") - } - - func testNoHeaderWhenHeaderNil() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("数据")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - XCTAssertFalse(viewModel.hasHeader) - XCTAssertFalse(viewModel.cells[0][0].role.isHeader) - } - - // MARK: - Badge Replacement - - func testCitationInlineTextReplacedWithAttachment() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("参见 [Citation:5] 了解详情")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - let attributed = viewModel.cells[0][0].attributedContent - XCTAssertTrue( - self.containsAttachment(attributed), - "Citation 文本应被替换为 NSTextAttachment badge" - ) - } - - func testCitationLinkReplacedWithAttachment() { - let table = STMarkdownTableModel( - header: [[.link(destination: "", children: [.text("Citation:2")])]], - rows: [] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - let attributed = viewModel.cells[0][0].attributedContent - XCTAssertTrue( - self.containsAttachment(attributed), - "Citation link 节点应替换为 NSTextAttachment badge" - ) - } - - func testPlainTextCellHasNoAttachment() { - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("普通文字,无引用")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - let attributed = viewModel.cells[0][0].attributedContent - XCTAssertFalse( - self.containsAttachment(attributed), - "无 citation 的 cell 不应包含 NSTextAttachment" - ) - } - - // MARK: - Column / Row Count - - func testColumnAndRowCount() { - // header: [[STMarkdownInlineNode]] — 3 columns, each with 1 node - // rows: [[[STMarkdownInlineNode]]] — 2 rows × 3 columns × 1 node - let table = STMarkdownTableModel( - header: [[.text("A")], [.text("B")], [.text("C")]], - rows: [ - [[.text("1")], [.text("2")], [.text("3")]], - [[.text("4")], [.text("5")], [.text("6")]] - ] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - XCTAssertEqual(viewModel.columnCount, 3) - XCTAssertEqual(viewModel.rowCount, 3, "1 header + 2 data rows = 3 rows") - } - - func testEmptyTableProducesZeroCounts() { - let table = STMarkdownTableModel(header: nil, rows: []) - let viewModel = STMarkdownTableViewModel(from: table, style: self.style) - - XCTAssertEqual(viewModel.columnCount, 0) - XCTAssertEqual(viewModel.rowCount, 0) - } - - // MARK: - Helpers - - private func containsAttachment(_ attributed: NSAttributedString) -> Bool { - var found = false - attributed.enumerateAttribute( - .attachment, - in: NSRange(location: 0, length: attributed.length), - options: [] - ) { value, _, _ in - if value is NSTextAttachment { found = true } - } - return found - } -} - -// MARK: - 3. STMarkdownTableView Citation Tap Tests - -/// 验证添加 UICollectionViewDelegate 后 onCitationTap 回调正常触发 -@MainActor -final class STMarkdownTableViewCitationTapTests: XCTestCase { - - func testCustomHeaderItemsAreVisibleAfterLayout() { - let image = self.makeTestIcon() - let style = STMarkdownStyle( - font: .systemFont(ofSize: 14), - textColor: .label, - lineHeight: 18, - kern: 0, - tableHeaderItems: [ - STMarkdownTableHeaderItem(identifier: "custom-copy", image: image) { _ in }, - STMarkdownTableHeaderItem(identifier: "custom-fullscreen", image: image) { _ in } - ], - tableHeaderButtonWidth: 16 - ) - let tableView = STMarkdownTableView(style: style) - - tableView.frame = CGRect(x: 0, y: 0, width: 320, height: 120) - tableView.layoutIfNeeded() - - let buttons = self.headerButtons(in: tableView) - XCTAssertEqual(buttons.map(\.accessibilityIdentifier), ["custom-copy", "custom-fullscreen"]) - XCTAssertTrue(buttons.allSatisfy { !$0.frame.isEmpty }, "自定义 headerItems 按钮应有稳定非零布局尺寸") - XCTAssertTrue(buttons.allSatisfy { $0.image(for: .normal) != nil }, "自定义 headerItems 按钮应保留配置的图片") - } - - func testReassigningHeaderItemsRemovesOldButtons() { - let image = self.makeTestIcon() - let tableView = STMarkdownTableView(style: .default) - tableView.headerItems = [ - STMarkdownTableHeaderItem(identifier: "first", image: image) { _ in }, - STMarkdownTableHeaderItem(identifier: "second", image: image) { _ in } - ] - tableView.headerItems = [ - STMarkdownTableHeaderItem(identifier: "third", image: image) { _ in } - ] - - tableView.frame = CGRect(x: 0, y: 0, width: 320, height: 120) - tableView.layoutIfNeeded() - - XCTAssertEqual(self.headerButtons(in: tableView).map(\.accessibilityIdentifier), ["third"]) - } - - func testCitationTapCallbackFiredWhenCellSelected() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - - let table = STMarkdownTableModel( - header: nil, - rows: [[[.link(destination: "", children: [.text("Citation:9")])]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: style) - tableView.tableData = viewModel - - var tappedCitation: String? - tableView.onCitationTap = { tappedCitation = $0 } - - tableView.frame = CGRect(x: 0, y: 0, width: 375, height: 200) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - XCTAssertNotNil(collectionView, "STMarkdownTableView 应包含 UICollectionView 子视图") - - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 0, section: 0) - ) - - XCTAssertEqual(tappedCitation, "9", "点击含 Citation:9 的 cell 应触发 onCitationTap(\"9\")") - } - - func testCitationTapNotFiredWhenCellHasNoCitations() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("普通文本")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: style) - tableView.tableData = viewModel - - var tappedCitation: String? - tableView.onCitationTap = { tappedCitation = $0 } - - tableView.frame = CGRect(x: 0, y: 0, width: 375, height: 200) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 0, section: 0) - ) - - XCTAssertNil(tappedCitation, "无 citation 的 cell 被点击时不应触发 onCitationTap") - } - - func testCitationTapWithNilTableDataIsSafe() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - tableView.tableData = nil - - var called = false - tableView.onCitationTap = { _ in called = true } - - tableView.frame = CGRect(x: 0, y: 0, width: 375, height: 200) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - // tableData 为 nil,点击任意 cell 不应崩溃且不应触发回调 - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 0, section: 0) - ) - - XCTAssertFalse(called, "tableData 为 nil 时点击不应触发回调") - } - - func testMultipleColumnsCorrectCitationTap() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - - // rows: 1 row × 2 columns; col 0 = plain text, col 1 = citation link - let table = STMarkdownTableModel( - header: nil, - rows: [ - [ - [.text("无引用")], - [.link(destination: "", children: [.text("Citation:42")])] - ] - ] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: style) - tableView.tableData = viewModel - - var tappedCitation: String? - tableView.onCitationTap = { tappedCitation = $0 } - - tableView.frame = CGRect(x: 0, y: 0, width: 375, height: 200) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - - // 点击第 0 列(无引用) - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 0, section: 0) - ) - XCTAssertNil(tappedCitation, "第 0 列无引用,不应触发回调") - - // 点击第 1 列(有 Citation:42) - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 1, section: 0) - ) - XCTAssertEqual(tappedCitation, "42", "第 1 列应触发 Citation:42 回调") - } - - func testExpandTableTriggeredWhenSelectingCellWithoutCitation() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("普通文本")]]] - ) - let viewModel = STMarkdownTableViewModel(from: table, style: style) - tableView.tableData = viewModel - - var expandedModel: STMarkdownTableViewModel? - tableView.onExpandTable = { expandedModel = $0 } - - tableView.frame = CGRect(x: 0, y: 0, width: 375, height: 200) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 0, section: 0) - ) - - XCTAssertTrue(expandedModel === viewModel, "点击无 citation 的 cell 应触发表格展开回调") - } - - func testExpandTableNotTriggeredWhenSelectingCitationCell() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - let table = STMarkdownTableModel( - header: nil, - rows: [[[.link(destination: "", children: [.text("Citation:7")])]]] - ) - tableView.tableData = STMarkdownTableViewModel(from: table, style: style) - - var expandCallCount = 0 - var tappedCitation: String? - tableView.onExpandTable = { _ in expandCallCount += 1 } - tableView.onCitationTap = { tappedCitation = $0 } - - tableView.frame = CGRect(x: 0, y: 0, width: 375, height: 200) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - collectionView?.delegate?.collectionView?( - collectionView!, - didSelectItemAt: IndexPath(item: 0, section: 0) - ) - - XCTAssertEqual(expandCallCount, 0, "citation cell 点击应优先走 citation 回调,不应误触发表格展开") - XCTAssertEqual(tappedCitation, "7") - } - - func testHorizontalGradientHintHiddenForNonScrollableTable() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - let table = STMarkdownTableModel( - header: nil, - rows: [[[.text("A")], [.text("B")]]] - ) - tableView.tableData = STMarkdownTableViewModel(from: table, style: style) - - tableView.frame = CGRect(x: 0, y: 0, width: 320, height: 80) - tableView.layoutIfNeeded() - - let leftOpacity = self.gradientLayer(named: "STMarkdownTableLeftGradient", in: tableView)?.opacity - let rightOpacity = self.gradientLayer(named: "STMarkdownTableRightGradient", in: tableView)?.opacity - XCTAssertEqual(leftOpacity, 0, "窄表不应显示左侧渐变提示") - XCTAssertEqual(rightOpacity, 0, "窄表不应显示右侧渐变提示") - } - - func testHorizontalGradientHintShownInitiallyForScrollableTable() { - let style = STMarkdownStyle.default - let tableView = STMarkdownTableView(style: style) - let wideText = String(repeating: "宽表内容", count: 24) - let table = STMarkdownTableModel( - header: nil, - rows: [[ - [.text(wideText)], - [.text(wideText)], - [.text(wideText)] - ]] - ) - tableView.tableData = STMarkdownTableViewModel(from: table, style: style) - - tableView.frame = CGRect(x: 0, y: 0, width: 220, height: 80) - tableView.layoutIfNeeded() - - let collectionView = tableView.subviews.compactMap { $0 as? UICollectionView }.first - XCTAssertNotNil(collectionView) - - let leftLayer = self.gradientLayer(named: "STMarkdownTableLeftGradient", in: tableView) - let rightLayer = self.gradientLayer(named: "STMarkdownTableRightGradient", in: tableView) - XCTAssertEqual(leftLayer?.opacity, 0, "初始位于最左侧时不应显示左侧渐变") - XCTAssertEqual(rightLayer?.opacity, 1, "宽表首次出现时应显示右侧渐变提示") - - guard let collectionView else { return } - let maxOffsetX = max(0, collectionView.contentSize.width - collectionView.bounds.width) - collectionView.contentOffset = CGPoint(x: maxOffsetX, y: 0) - collectionView.delegate?.scrollViewDidScroll?(collectionView) - - XCTAssertEqual(leftLayer?.opacity, 1, "滚到最右侧后应显示左侧渐变") - XCTAssertEqual(rightLayer?.opacity, 0, "滚到最右侧后应隐藏右侧渐变") - } - - private func gradientLayer(named name: String, in view: UIView) -> CAGradientLayer? { - view.layer.sublayers?.first(where: { $0.name == name }) as? CAGradientLayer - } - - private func headerButtons(in view: UIView) -> [UIButton] { - view.subviews.flatMap { subview -> [UIButton] in - var buttons = self.headerButtons(in: subview) - if let button = subview as? UIButton { - buttons.insert(button, at: 0) - } - return buttons - } - } - - private func makeTestIcon() -> UIImage { - let renderer = UIGraphicsImageRenderer(size: CGSize(width: 16, height: 16)) - return renderer.image { context in - UIColor.black.setFill() - context.fill(CGRect(x: 3, y: 3, width: 10, height: 10)) - } - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownFootnoteAndHTMLTests.swift b/Example/STBaseProjectExampleTests/STMarkdownFootnoteAndHTMLTests.swift deleted file mode 100644 index 23f5113..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownFootnoteAndHTMLTests.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// STMarkdownFootnoteAndHTMLTests.swift -// STBaseProjectExampleTests -// - -import XCTest -import STBaseProject - -final class STMarkdownFootnoteAndHTMLTests: XCTestCase { - - private func renderMeta(_ kind: STMarkdownRenderBlockKind) -> STMarkdownRenderBlockMetadata { - STMarkdownRenderBlockMetadata( - id: "test-\(kind.rawValue)", - path: [], - kind: kind, - revealPolicy: .atomicBlock - ) - } - - func testFootnoteDefinitionStrippedAndReferenceParsed() { - let md = """ - Hello[^a] world. - - [^a]: Foot **note** here. - """ - let parser = STMarkdownStructureParser() - let doc = parser.parse(md) - XCTAssertFalse(doc.footnoteDefinitions["a"]?.content.isEmpty ?? true, "footnote body should parse") - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("expected paragraph") - } - XCTAssertTrue(inlines.contains(where: { - if case .footnoteReference(let l) = $0 { return l == "a" } - return false - })) - } - - func testRawHTMLBlockPolicyLiteral() { - var style = STMarkdownStyle.default - style.rawHTMLPolicy = .literalMonospace - let renderer = STMarkdownAttributedStringRenderer(style: style, advancedRenderers: .empty) - let doc = STMarkdownRenderDocument(blocks: [.rawHTML(self.renderMeta(.rawHTML), "

x
")]) - let attr = renderer.render(document: doc) - XCTAssertTrue(attr.string.contains("
")) - } - - func testDetailsRenderContainsSummaryGlyph() { - let renderer = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - let doc = STMarkdownRenderDocument(blocks: [ - .details( - self.renderMeta(.details), - summary: [.text("More")], - body: [.paragraph(self.renderMeta(.paragraph), [.text("Hidden")])] - ), - ]) - let attr = renderer.render(document: doc) - XCTAssertTrue(attr.string.contains("▸")) - XCTAssertTrue(attr.string.contains("More")) - XCTAssertTrue(attr.string.contains("Hidden")) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownIncrementalParseTests.swift b/Example/STBaseProjectExampleTests/STMarkdownIncrementalParseTests.swift deleted file mode 100644 index 48e10e7..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownIncrementalParseTests.swift +++ /dev/null @@ -1,107 +0,0 @@ -import XCTest -@testable import STBaseProject - -final class STMarkdownIncrementalParseTests: XCTestCase { - - func testReplaceTailCountMatchesVendorHeuristic() { - // parseStart=50, lastCommitted=250 → backtrack 200 → max(1,2)=2 - let n = STMarkdownIncrementalReplaceCountEstimator.estimateReplaceTailCount( - previousTotalRenderBlockCount: 10, - parseStart: 50, - lastCommittedExclusiveEnd: 250 - ) - XCTAssertEqual(n, 2) - let capped = STMarkdownIncrementalReplaceCountEstimator.estimateReplaceTailCount( - previousTotalRenderBlockCount: 1, - parseStart: 50, - lastCommittedExclusiveEnd: 250 - ) - XCTAssertEqual(capped, 1) - } - - func testReplaceTailCountZeroWhenNoRewindOverlap() { - XCTAssertEqual( - STMarkdownIncrementalReplaceCountEstimator.estimateReplaceTailCount( - previousTotalRenderBlockCount: 99, - parseStart: 100, - lastCommittedExclusiveEnd: 100 - ), - 0 - ) - } - - func testProcessIncrementalParsesWindowFragment() { - let pipeline = STMarkdownPipeline(configuration: STMarkdownPipelineConfiguration(enableInputSanitizer: false)) - let canonical = "# Title\n\nFirst paragraph is here.\n\n## Sub\n\nSecond." - let full = pipeline.process(canonical) - let prevCount = full.renderDocument.blocks.count - XCTAssertGreaterThan(prevCount, 0) - - let lastCommitted = canonical.distance(from: canonical.startIndex, to: canonical.firstIndex(of: "F")!) - let safeEnd = canonical.count - let inc = pipeline.processIncremental( - STMarkdownIncrementalParameters( - canonicalMarkdown: canonical, - lastCommittedExclusiveEnd: lastCommitted, - currentSafeExclusiveEnd: safeEnd, - contextWindowSize: 200, - previousTotalRenderBlockCount: prevCount - ) - ) - XCTAssertGreaterThan(inc.parseEndOffset, inc.parseStartOffset) - XCTAssertFalse(inc.windowFragment.isEmpty) - XCTAssertFalse(inc.windowRenderDocument.blocks.isEmpty) - XCTAssertGreaterThanOrEqual(inc.replaceTailCount, 0) - } - - func testMergedRenderBlocksReplacesTail() { - let prev: [STMarkdownRenderBlock] = [ - .paragraph([.text("a")]), - .paragraph([.text("b")]), - .paragraph([.text("c")]), - ] - let newTail: [STMarkdownRenderBlock] = [ - .paragraph([.text("x")]), - ] - let merged = STMarkdownIncrementalParseResult.mergedRenderBlocks( - previous: prev, - replaceTailCount: 2, - newTailBlocks: newTail - ) - XCTAssertEqual(merged.count, 2) - XCTAssertEqual(merged[0], prev[0]) - XCTAssertEqual(merged[1], newTail[0]) - } - - /// 严格前缀增长时,在若干简单文档上合并结果应与整段 ``process`` 一致(对照对比文档 P0;复杂结构见管线单测扩展)。 - func testIncrementalStrictPrefixGrowthMatchesFullProcess() { - let pipeline = STMarkdownPipeline(configuration: STMarkdownPipelineConfiguration(enableInputSanitizer: false)) - let steps = [ - "# A\n\n", - "# A\n\nSecond paragraph.", - ] - var merged: STMarkdownRenderDocument? - var prevDisplay = "" - for (i, step) in steps.enumerated() { - let full = pipeline.process(step).renderDocument - guard let currentMerged = merged else { - merged = full - prevDisplay = step - XCTAssertEqual(merged!.blocks, full.blocks, "initial step \(i)") - continue - } - let inc = pipeline.processIncremental( - STMarkdownIncrementalParameters( - canonicalMarkdown: step, - lastCommittedExclusiveEnd: prevDisplay.count, - currentSafeExclusiveEnd: step.count, - contextWindowSize: 200, - previousTotalRenderBlockCount: currentMerged.blocks.count - ) - ) - merged = inc.mergedRenderDocument(previous: currentMerged) - prevDisplay = step - XCTAssertEqual(merged!.blocks, full.blocks, "after incremental step \(i)") - } - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownParsingEscapeAndDisplayTests.swift b/Example/STBaseProjectExampleTests/STMarkdownParsingEscapeAndDisplayTests.swift deleted file mode 100644 index 0ead3a2..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownParsingEscapeAndDisplayTests.swift +++ /dev/null @@ -1,1187 +0,0 @@ -// -// STMarkdownParsingEscapeAndDisplayTests.swift -// STBaseProjectExampleTests -// -// 针对 STMarkdown/Parsing 目录两条核心契约: -// 1) CommonMark 反斜杠转义(含 `\* \** \# \` \[ \] \_ \! \> \1. \- \| \~ \$ \\` 与行尾 `\`)、 -// 以及预处理器中的 JSON / HTML 风格转义(`\n \" \/` 还原 + `` 转 markdown 链接)能被正确解析; -// 2) 经默认引擎 + `STMarkdownAttributedStringRenderer` 渲染后的「可见文本」不得残留 Markdown 定界片段、 -// 裸 HTML 标签、占位符;同时富文本 trait(粗 / 斜 / 链接 / 等宽)必须真实存在于属性串上。 -// -// 分工说明: -// - sanitizer 表格 / 锚点 / 页码引用 / 多空行等规则的逐条契约由 STMarkdownPipelineTests 覆盖, -// 本文件聚焦「转义解析」与「最终可见串无 markdown 残留 + 富文本 trait 真实存在」两条端到端契约。 -// - AST / RenderAST 的 enum case 穷举与 struct 初始化等价性由 -// STMarkdownASTAndRenderASTExhaustiveTests 覆盖,本文件不重复。 -// - -import XCTest -import UIKit -import STBaseProject - -// MARK: - 渲染为可见纯文本(与 STMarkdownStructureParserParseAndRenderIntegrityTests 对齐) - -private func st_renderPlainString(markdown: String) -> String { - st_renderAttributed(markdown: markdown).string -} - -private func st_renderAttributed(markdown: String) -> NSAttributedString { - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(markdown) - let renderer = STMarkdownAttributedStringRenderer( - style: .default, - advancedRenderers: .empty - ) - return renderer.render(document: result.renderDocument) -} - -private func st_firstParagraphInlinesFromRender(_ document: STMarkdownRenderDocument) -> [STMarkdownInlineNode]? { - for block in document.blocks { - if case .paragraph(_, let inlines) = block { - return inlines - } - } - return nil -} - -private func st_markdownFixtureText(named name: String, ext: String = "txt") throws -> String { - let testFileURL = URL(fileURLWithPath: #filePath) - let projectRoot = testFileURL - .deletingLastPathComponent() // STBaseProjectExampleTests - .deletingLastPathComponent() // project root - let fixtureURL = projectRoot - .appendingPathComponent("STBaseProjectExample") - .appendingPathComponent("Resources") - .appendingPathComponent(name) - .appendingPathExtension(ext) - return try String(contentsOf: fixtureURL, encoding: .utf8) -} - -/// 归一化空白,便于将「AST 语义拼接」与 `NSAttributedString.string` 对比。 -private func st_normalizeReaderWhitespace(_ s: String) -> String { - s.replacingOccurrences(of: "\u{00a0}", with: " ") - .replacingOccurrences(of: "\r\n", with: "\n") - .replacingOccurrences(of: #"\n{3,}"#, with: "\n\n", options: .regularExpression) - .trimmingCharacters(in: .whitespacesAndNewlines) -} - -/// 深度优先收集段落 / 标题 / 代码块正文的语义文本(不含列表 marker、引用竖线等 UI 装饰)。 -private func st_collectSemanticTextSegments(from blocks: [STMarkdownRenderBlock]) -> [String] { - var segments: [String] = [] - for block in blocks { - switch block { - case .paragraph(_, let inlines): - let t = st_joinInlinePlainText(inlines).trimmingCharacters(in: .whitespacesAndNewlines) - if t.isEmpty == false { segments.append(t) } - case .heading(_, level: _, anchorId: _, content: let inlines): - let t = st_joinInlinePlainText(inlines).trimmingCharacters(in: .whitespacesAndNewlines) - if t.isEmpty == false { segments.append(t) } - case .quote(_, let inner): - segments.append(contentsOf: st_collectSemanticTextSegments(from: inner)) - case .list(_, let items): - for item in items { - segments.append(contentsOf: st_collectSemanticTextSegments(from: item.blocks)) - } - case .codeBlock(_, language: _, code: let code): - let t = code.trimmingCharacters(in: .whitespacesAndNewlines) - if t.isEmpty == false { segments.append(t) } - case .table, .mathBlock, .image, .thematicBreak, .rawHTML: - break - case .details(_, summary: let summary, body: let inner): - let t = st_joinInlinePlainText(summary).trimmingCharacters(in: .whitespacesAndNewlines) - if t.isEmpty == false { segments.append(t) } - segments.append(contentsOf: st_collectSemanticTextSegments(from: inner)) - } - } - return segments -} - -/// 渲染结果中绝不应出现的 Markdown/HTML 定界片段:与转义/未消费定界相关,无论何种用例都禁。 -private let st_baselineForbiddenSubstrings: [(token: String, label: String)] = [ - ("```", "代码围栏"), - ("{{ST_MATH_BLOCK:", "块公式内部占位符泄漏"), - ("![", "图片 Markdown 前缀"), - ("$$", "块公式美元定界符"), - ("\\(", #"行内公式 `\("#), - ("\\)", #"行内公式 `\)`"#), - ("- [ ]", "任务列表未完成原始语法"), - ("- [x]", "任务列表已完成原始语法(小写 x)"), - ("- [X]", "任务列表已完成原始语法(大写 X)"), - ("` 时合法输出 `>`,行首 `> ` 检测仅按需调用。 -private let st_quoteLinePrefix = "> " - -private struct STMarkdownLeakRelaxations: OptionSet { - let rawValue: Int - static let allowLiteralStarRuns = STMarkdownLeakRelaxations(rawValue: 1 << 0) - static let allowLiteralUnderscoreRuns = STMarkdownLeakRelaxations(rawValue: 1 << 1) - static let allowLiteralTildeRuns = STMarkdownLeakRelaxations(rawValue: 1 << 2) -} - -/// 若仍出现在最终可见串里,视为解析/渲染泄漏的 Markdown / 公式 / 裸 HTML 片段。 -/// 仅检测子串型定界符;ATX / quote 行首前缀因可能与字面字符冲突,由独立 helper 按需校验。 -private func st_assertNoMarkdownLeaks( - in output: String, - relaxations: STMarkdownLeakRelaxations = [], - file: StaticString = #filePath, - line: UInt = #line -) { - for (token, label) in st_baselineForbiddenSubstrings { - XCTAssertFalse( - output.contains(token), - "渲染结果不得包含未消费的 Markdown/HTML 定界片段(\(label)):\(token.debugDescription)", - file: file, - line: line - ) - } - for (token, label) in st_pairedEmphasisDelimiters { - if token == "**" && relaxations.contains(.allowLiteralStarRuns) { continue } - if token == "__" && relaxations.contains(.allowLiteralUnderscoreRuns) { continue } - if token == "~~" && relaxations.contains(.allowLiteralTildeRuns) { continue } - XCTAssertFalse( - output.contains(token), - "渲染结果不得包含未消费的 Markdown 强调定界片段(\(label)):\(token.debugDescription)", - file: file, - line: line - ) - } -} - -/// 按需调用:源 markdown 含真 ATX 标题 / 块引用时,验证渲染后该结构不再以 `# / > ` 行首形式出现; -/// 不可在「源含 `\#` / `\>` 转义」的用例上调用——CommonMark §6.1 转义后字面 `#` / `>` 在行首是合法输出。 -private func st_assertNoAtxOrQuoteLineStarts( - in output: String, - file: StaticString = #filePath, - line: UInt = #line -) { - let lines = output.components(separatedBy: CharacterSet.newlines) - for rawLine in lines { - let trimmed = rawLine.trimmingCharacters(in: .whitespaces) - for prefix in st_atxHeadingLinePrefixes where trimmed.hasPrefix(prefix) { - XCTFail( - "渲染结果某行不得以 ATX 标题前缀开头(\(prefix.debugDescription)):\(rawLine.debugDescription)", - file: file, - line: line - ) - break - } - if trimmed.hasPrefix(st_quoteLinePrefix) { - XCTFail( - "渲染结果某行不得以块引用前缀 `> ` 开头:\(rawLine.debugDescription)", - file: file, - line: line - ) - } - } -} - -/// 兼容旧调用:默认无任何放过项,禁全部 baseline + 强调子串。 -private func st_assertNoRawMarkdownOrTagSyntaxLeaks( - in output: String, - file: StaticString = #filePath, - line: UInt = #line -) { - st_assertNoMarkdownLeaks(in: output, relaxations: [], file: file, line: line) -} - -/// 兼容旧调用:用例已转义 `\*\*` / `\*`,可见串允许保留字面量 `**` / `*`,故放过粗体定界符序列。 -private func st_assertNoRawMarkdownOrTagSyntaxLeaksAllowingLiteralStarRuns( - in output: String, - file: StaticString = #filePath, - line: UInt = #line -) { - st_assertNoMarkdownLeaks( - in: output, - relaxations: [.allowLiteralStarRuns], - file: file, - line: line - ) -} - -// MARK: - AST 文本收集(仅用于转义解析断言) - -private func st_joinInlinePlainText(_ nodes: [STMarkdownInlineNode]) -> String { - nodes.map { st_inlinePlainText($0) }.joined() -} - -private func st_inlinePlainText(_ node: STMarkdownInlineNode) -> String { - switch node { - case .text(let s): - return s - case .softBreak: - return "\n" - case .inlineMath(let f, _): - return f - case .code(let s): - return s - case .emphasis(let c), .strong(let c), .strikethrough(let c): - return st_joinInlinePlainText(c) - case .link(_, let c): - return st_joinInlinePlainText(c) - case .image(_, let alt, _): - return alt - case .footnoteReference(let label): - return "[^\(label)]" - case .inlineRawHTML(let raw): - return raw - } -} - -private func st_firstParagraphText(_ document: STMarkdownDocument) -> String? { - for block in document.blocks { - if case .paragraph(let inlines) = block { - return st_joinInlinePlainText(inlines) - } - } - return nil -} - -private func st_blockContainsText(_ block: STMarkdownBlockNode, text: String) -> Bool { - switch block { - case .paragraph(let inlines): - return st_joinInlinePlainText(inlines).contains(text) - case .heading(_, let inlines): - return st_joinInlinePlainText(inlines).contains(text) - case .quote(let children): - return children.contains { st_blockContainsText($0, text: text) } - case .list(_, let items): - return items.contains { item in - item.blocks.contains { st_blockContainsText($0, text: text) } - } - case .table(let table): - let header = (table.header ?? []).flatMap { $0 } - let rows = table.rows.flatMap { $0 }.flatMap { $0 } - return st_joinInlinePlainText(header + rows).contains(text) - case .codeBlock(_, let code): - return code.contains(text) - case .mathBlock(let formula): - return formula.contains(text) - case .image(_, let altText, let title): - return altText.contains(text) || (title?.contains(text) == true) - case .thematicBreak: - return false - case .details(let summary, let body): - return st_joinInlinePlainText(summary).contains(text) - || body.contains { st_blockContainsText($0, text: text) } - case .rawHTML(let html): - return html.contains(text) - } -} - -private func st_renderBlockContainsText(_ block: STMarkdownRenderBlock, text: String) -> Bool { - switch block { - case .paragraph(_, let inlines): - return st_joinInlinePlainText(inlines).contains(text) - case .heading(_, level: _, anchorId: _, content: let inlines): - return st_joinInlinePlainText(inlines).contains(text) - case .quote(_, let children): - return children.contains { st_renderBlockContainsText($0, text: text) } - case .list(_, let items): - return items.contains { item in - item.blocks.contains { st_renderBlockContainsText($0, text: text) } - } - case .table(_, let table): - let header = (table.header ?? []).flatMap { $0 } - let rows = table.rows.flatMap { $0 }.flatMap { $0 } - return st_joinInlinePlainText(header + rows).contains(text) - case .codeBlock(_, language: _, code: let code): - return code.contains(text) - case .mathBlock(_, let formula): - return formula.contains(text) - case .image(_, url: _, altText: let altText, title: let title): - return altText.contains(text) || (title?.contains(text) == true) - case .thematicBreak: - return false - case .details(_, summary: let summary, body: let body): - return st_joinInlinePlainText(summary).contains(text) - || body.contains { st_renderBlockContainsText($0, text: text) } - case .rawHTML(_, let html): - return html.contains(text) - } -} - -// MARK: - Tests - -final class STMarkdownParsingEscapeAndDisplayTests: XCTestCase { - - // MARK: CommonMark 反斜杠转义 → 解析结果 - - func testParserEscapedAsterisksDoNotFormStrongOrEmphasis() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"展示 \*不是斜体\* 与 \*\*不是粗体\*\*"#) - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望首块为段落") - } - XCTAssertTrue(plain.contains("*不是斜体*"), "转义后的星号应作为字面量保留:\(plain)") - XCTAssertTrue(plain.contains("**不是粗体**"), "转义后的双星号应作为字面量保留:\(plain)") - XCTAssertFalse(plain.contains("\\"), "解析后 Text 节点不应再保留反斜杠转义符本身(CommonMark 会消费反斜杠)") - } - - func testParserEscapedHashIsParagraphNotHeading() { - let parser = STMarkdownStructureParser() - let doc = parser.parse("\\# 这不是标题") - - guard case .paragraph = doc.blocks.first else { - return XCTFail("转义的 # 不应被识别为 ATX 标题,期望段落块") - } - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落含文本") - } - XCTAssertTrue(plain.hasPrefix("# 这不是标题") || plain.contains("这不是标题"), - "字面量井号应保留在段落文本中:\(plain)") - } - - func testParserEscapedBackticksDoNotFormInlineCode() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"这里是 \`不是代码\` 片段"#) - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落") - } - XCTAssertTrue(plain.contains("`不是代码`"), "反引号应作为字面量:\(plain)") - } - - func testParserEscapedSquareBracketsDoNotFormLinkOrImage() { - let parser = STMarkdownStructureParser() - // 避免裸 URL 自动链接干扰:验证转义后的 `[]` 不会变成 link 节点。 - // 注:swift-markdown / cmark 对 `\[...\]` 的纯文本拼接未必保留 ASCII 方括号字面量, - // 但「可见方括号」等语义与「不得出现 link」应稳定成立。 - let doc = parser.parse("参考 \\[可见方括号\\] 后文") - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落") - } - XCTAssertTrue(plain.contains("可见方括号") && plain.contains("参考") && plain.contains("后文"), "语义应保留:\(plain)") - - let inlines = doc.blocks.compactMap { block -> [STMarkdownInlineNode]? in - if case .paragraph(let nodes) = block { return nodes } - return nil - }.first ?? [] - let hasLink = inlines.contains { node in - if case .link = node { return true } - return false - } - XCTAssertFalse(hasLink, "转义后的 [] 不应被解析为 Markdown 链接节点") - let hasInlineImage = inlines.contains { node in - if case .image = node { return true } - return false - } - XCTAssertFalse(hasInlineImage, "转义后的 [] 不应被解析为 inline image 节点") - let hasBlockImage = doc.blocks.contains { block in - if case .image = block { return true } - return false - } - XCTAssertFalse(hasBlockImage, "转义后的 [] 不应被提升为段落级 image 块") - } - - /// `\![alt](url)` 的反斜杠把图片前缀 `!` 转义掉;解析器不得生成 image 节点。 - func testParserEscapedBangBracketDoesNotFormImage() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"开头 \![占位](https://example.com/i.png) 结尾"#) - - let hasBlockImage = doc.blocks.contains { block in - if case .image = block { return true } - return false - } - XCTAssertFalse(hasBlockImage, "转义的 \\! 不应触发段落级 image 提升") - - let inlines = doc.blocks.compactMap { block -> [STMarkdownInlineNode]? in - if case .paragraph(let nodes) = block { return nodes } - return nil - }.first ?? [] - let hasInlineImage = inlines.contains { node in - if case .image = node { return true } - return false - } - XCTAssertFalse(hasInlineImage, "转义的 \\! 不应被解析为 inline image 节点") - } - - func testParserEscapedUnderscoreDoesNotFormEmphasis() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"下划线 \_字面量\_ 测试"#) - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落") - } - XCTAssertTrue(plain.contains("_字面量_"), "转义下划线应保留:\(plain)") - } - - /// 行首 `\>` 被转义后,整行视为段落而非 BlockQuote 块。 - func testParserEscapedGreaterThanDoesNotFormBlockQuote() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"\> 不是引用"#) - - XCTAssertEqual(doc.blocks.count, 1) - guard case .paragraph = doc.blocks.first else { - return XCTFail("转义的 \\> 不应被识别为 BlockQuote,期望段落块;实际:\(String(describing: doc.blocks.first))") - } - let hasQuote = doc.blocks.contains { block in - if case .quote = block { return true } - return false - } - XCTAssertFalse(hasQuote) - } - - /// 行首数字后转义的 `\.` 阻止有序列表识别。 - func testParserEscapedOrderedListMarkerDoesNotFormList() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"1\. 不是有序列表"#) - - let hasList = doc.blocks.contains { block in - if case .list = block { return true } - return false - } - XCTAssertFalse(hasList, "转义后的 1\\. 不应被识别为有序列表块") - guard case .paragraph = doc.blocks.first else { - return XCTFail("期望首块为段落,实际:\(String(describing: doc.blocks.first))") - } - } - - /// 行首 `\-` 阻止无序列表识别。 - func testParserEscapedUnorderedListMarkerDoesNotFormList() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"\- 不是无序列表"#) - - let hasList = doc.blocks.contains { block in - if case .list = block { return true } - return false - } - XCTAssertFalse(hasList, "转义后的 \\- 不应被识别为无序列表块") - } - - /// `\~` 阻止 GFM 删除线识别,且字面 `~` 字符应保留。 - func testParserEscapedTildeDoesNotFormStrikethrough() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"\~不是删除线\~ 文本"#) - - let inlines = doc.blocks.compactMap { block -> [STMarkdownInlineNode]? in - if case .paragraph(let nodes) = block { return nodes } - return nil - }.first ?? [] - let hasStrikethrough = inlines.contains { node in - if case .strikethrough = node { return true } - return false - } - XCTAssertFalse(hasStrikethrough, "转义后的 \\~ 不应被解析为 strikethrough 节点") - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落") - } - XCTAssertTrue(plain.contains("~不是删除线~"), "转义后的字面 ~ 应保留:\(plain)") - } - - /// `\|` 在表格未成立的上下文里转义为字面 `|`,且不会触发 table 块。 - func testParserEscapedPipeDoesNotFormTableInProseContext() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"列 A \| 列 B 是字面"#) - - let hasTable = doc.blocks.contains { block in - if case .table = block { return true } - return false - } - XCTAssertFalse(hasTable, "无 delimiter row 的散文场景下,转义 \\| 不应触发 table 块") - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落") - } - XCTAssertTrue(plain.contains("|"), "转义后的字面 | 应保留:\(plain)") - } - - /// `\$\$` 不应触发 mathBlock;mathNormalizer 仅在行首独占 `$$` 才提取,单行内 `\$\$` 走 cmark。 - func testParserEscapedDollarSignsDoNotFormMathBlock() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"价格 \$9.99 与 \$\$ 不是公式 \$\$"#) - - let hasMathBlock = doc.blocks.contains { block in - if case .mathBlock = block { return true } - return false - } - XCTAssertFalse(hasMathBlock, "单行内的 \\$\\$ 不应被识别为块公式") - guard case .paragraph = doc.blocks.first else { - return XCTFail("期望首块为段落") - } - } - - /// CommonMark §6.1:`\\` 应渲染为字面单反斜杠;解析后的 text 节点至少含一个 `\` 字符。 - func testParserDoubleBackslashRendersAsLiteralSingleBackslash() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"路径 C:\\Users\\song 字面"#) - - guard let plain = st_firstParagraphText(doc) else { - return XCTFail("期望段落") - } - XCTAssertTrue(plain.contains(#"\"#), "双反斜杠应保留为字面单反斜杠:\(plain)") - } - - /// CommonMark §6.6:行尾单 `\` 表示硬换行,解析后段落 inline 节点序列应含 softBreak。 - func testParserTrailingBackslashFormsHardLineBreak() { - let parser = STMarkdownStructureParser() - let doc = parser.parse("第一行\\\n第二行") - - XCTAssertEqual(doc.blocks.count, 1, "硬换行不应分段") - guard case .paragraph(let inlines) = doc.blocks.first else { - return XCTFail("期望首块为段落") - } - let hasBreak = inlines.contains { node in - if case .softBreak = node { return true } - return false - } - XCTAssertTrue(hasBreak, "行尾 \\ 应映射到 softBreak 节点;实际 inlines=\(inlines)") - } - - /// 工程契约(主动偏离 CommonMark):`STMarkdownMathNormalizer` 把 `\(...\)` 视为行内公式定界符; - /// 因此用户在散文中写 `\(对话\)` 会被解析成 inlineMath 节点,而非字面括号。 - /// 本用例钉住该契约——若实现改变(如恢复 CommonMark 转义括号语义),此用例将红字提示需要同步更新文档。 - func testMathNormalizerTreatsBackslashParenthesesAsInlineMathEvenInProseContext() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"开头 \(对话\) 结尾"#) - - guard case .paragraph(let inlines) = doc.blocks.first else { - return XCTFail("期望首块为段落") - } - let mathNode = inlines.first { node in - if case .inlineMath = node { return true } - return false - } - guard case .inlineMath(let formula, let display)? = mathNode else { - return XCTFail("工程契约:\\(...\\) 应被吞成 inlineMath;实际 inlines=\(inlines)") - } - XCTAssertEqual(formula, "对话") - XCTAssertFalse(display, "\\(...\\) 是 inline 模式(非 display)") - } - - func testMathNormalizerDoubleBackslashBeforeParenNormalizesToSingleForInlineMath() { - // 通过公共 API:normalizeDelimiters 在 splitInlineMath 内部执行, - // 将 API/模型输出的 "\\(" 规范为 "\(" 后再识别行内公式。 - let raw = #"\\(a+b\\)"# - let nodes = STMarkdownMathNormalizer.splitInlineMath(in: raw) - XCTAssertEqual(nodes.count, 1) - guard case .inlineMath(let formula, let display) = nodes.first else { - return XCTFail("期望单个 inlineMath 节点") - } - XCTAssertEqual(formula, "a+b") - XCTAssertFalse(display) - } - - // MARK: 预处理器转义(STHtmlNormalizeRule 等)+ 全链路 - - func testSanitizerUnescapesJsonStyleSequencesThenParserSeesRealNewlines() { - let sanitizer = STMarkdownInputSanitizer(rules: [STHtmlNormalizeRule()]) - let result = sanitizer.sanitize("第一行\\n第二行\\n第三行") - XCTAssertTrue( - result.appliedRules.contains("STHtmlNormalizeRule"), - "JSON 风格 \\n 必须由 STHtmlNormalizeRule 还原;appliedRules=\(result.appliedRules)" - ) - XCTAssertNotEqual(result.sanitizedText, result.originalText, "sanitized 文本应不同于原始文本") - - let parser = STMarkdownStructureParser() - let doc = parser.parse(result.sanitizedText) - - // STHtmlNormalizeRule 把 `\n` 还原为单换行;CommonMark 把单换行视为 softBreak(同段落), - // 因此应当形成「单一段落 + 两个 softBreak」结构,而非多段落。 - XCTAssertEqual(doc.blocks.count, 1, "单换行应折叠到同一段落,期望 blocks.count == 1:实际 \(doc.blocks.count)") - guard case .paragraph(let inlines) = doc.blocks.first else { - return XCTFail("首块应为 paragraph,实际:\(String(describing: doc.blocks.first))") - } - let softBreakCount = inlines.reduce(into: 0) { partial, node in - if case .softBreak = node { partial += 1 } - } - XCTAssertEqual(softBreakCount, 2, "两个 \\n 应解析为两个 softBreak 节点;实际 \(softBreakCount)") - let joined = st_joinInlinePlainText(inlines) - XCTAssertTrue(joined.contains("第一行")) - XCTAssertTrue(joined.contains("第二行")) - XCTAssertTrue(joined.contains("第三行")) - } - - func testEndToEndEscapedInlineRichTextRendersWithoutDelimiterOrHtmlLeaks() { - let md = #""" - 行内混合:\*\*不是粗体\*\*、\*不是斜体\*、\`不是代码\`、\[方括\] 后接、~~真删除~~。 - """# - let plain = st_renderPlainString(markdown: md) - // 本用例故意含「已转义」字面量 ** / * / `,可见串允许出现连续 *,不得按「泄漏」判失败 - st_assertNoRawMarkdownOrTagSyntaxLeaksAllowingLiteralStarRuns(in: plain) - // CommonMark §6.1:所有 ASCII 标点的反斜杠转义都应保留字面字符。 - // 单分支严格断言而非 `||` 双向放过,保证「正确解析为字面」与「错误解析为强调」可被区分。 - XCTAssertTrue(plain.contains("**不是粗体**"), "已转义 \\*\\* 应保留字面 ** 字符序列:\(plain)") - XCTAssertTrue(plain.contains("*不是斜体*"), "已转义 \\* 应保留字面 * 字符序列:\(plain)") - XCTAssertTrue(plain.contains("`不是代码`"), "已转义 \\` 应保留字面 ` 字符:\(plain)") - XCTAssertTrue(plain.contains("真删除"), "真删除线正文应渲染:\(plain)") - XCTAssertFalse(plain.contains("~~"), "真删除线经解析后可见串不应残留 ~~") - } - - func testEndToEndEscapedHeadingMarkerRendersAsPlainTextWithoutAtxLeak() { - let md = """ - \\# 这不是标题 - - 普通 **粗** 尾 - """ - let plain = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: plain) - XCTAssertTrue(plain.contains("这不是标题")) - XCTAssertTrue(plain.contains("粗")) - } - - func testEndToEndHtmlAnchorFromApiSanitizesToMarkdownThenRendersNoRawTags() { - let md = #"点我 与 **粗**"# - - // 先单跑 sanitizer 验证规则确实被应用——避免「sanitizer 静默失效 + cmark 吞掉 raw HTML」类回归静默通过 - let sanitizer = STMarkdownInputSanitizer(rules: STMarkdownInputSanitizer.defaultRules) - let sanitized = sanitizer.sanitize(md) - XCTAssertTrue( - sanitized.appliedRules.contains("STHtmlNormalizeRule"), - "STHtmlNormalizeRule 应将 \\\" 还原为 \";appliedRules=\(sanitized.appliedRules)" - ) - XCTAssertTrue( - sanitized.appliedRules.contains("STHtmlLinkToMarkdownRule"), - "STHtmlLinkToMarkdownRule 应将 转为 markdown 链接;appliedRules=\(sanitized.appliedRules)" - ) - XCTAssertTrue( - sanitized.sanitizedText.contains("[点我](https://example.com)"), - "sanitize 后应得到 markdown 链接形式:\(sanitized.sanitizedText)" - ) - - let attributed = st_renderAttributed(markdown: md) - let visible = attributed.string - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - XCTAssertTrue(visible.contains("点我")) - XCTAssertTrue(visible.contains("粗")) - - let ns = visible as NSString - let linkRange = ns.range(of: "点我") - XCTAssertNotEqual(linkRange.location, NSNotFound) - let linkAttribute = attributed.attribute(.link, at: linkRange.location, effectiveRange: nil) as? URL - XCTAssertEqual( - linkAttribute?.absoluteString, - "https://example.com", - "anchor 转 markdown 链接后,渲染层应在「点我」区段附 .link 属性而非以 [文本](url) 形式出现在可见串" - ) - - let boldRange = ns.range(of: "粗") - XCTAssertNotEqual(boldRange.location, NSNotFound) - let boldFont = attributed.attribute(.font, at: boldRange.location, effectiveRange: nil) as? UIFont - XCTAssertTrue( - boldFont?.fontDescriptor.symbolicTraits.contains(.traitBold) == true, - "**粗** 区段应携带 .traitBold" - ) - } - - /// 界面可见串应等于「解析管线最终语义」下的纯文本拼接;不得残留 Markdown/HTML 定界片段; - /// 且属性串上须能观察到富文本(粗体字体与链接),不能退化成单一默认字体的纯文本块。 - func testRenderedVisibleStringMatchesFinalMarkdownSemanticsAndUsesRichAttributes() { - let md = "请使用 **加粗** 查看 [文档](https://docs.example.com) 与 *斜体*。" - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(md) - guard let inlines = st_firstParagraphInlinesFromRender(result.renderDocument) else { - return XCTFail("期望渲染文档首块为段落") - } - let expectedSemantic = st_joinInlinePlainText(inlines) - - let attributed = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - let visible = st_normalizeReaderWhitespace(attributed.string) - let expectedTrimmed = st_normalizeReaderWhitespace(expectedSemantic) - - XCTAssertEqual( - visible, - expectedTrimmed, - "可见文本应与管线最终 AST 的语义拼接一致(即 Markdown 解析完成后的读者文本)" - ) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - - let ns = visible as NSString - let boldRange = ns.range(of: "加粗") - let italicRange = ns.range(of: "斜体") - let linkRange = ns.range(of: "文档") - XCTAssertNotEqual(boldRange.location, NSNotFound) - XCTAssertNotEqual(italicRange.location, NSNotFound) - XCTAssertNotEqual(linkRange.location, NSNotFound) - - let fontAtBold = attributed.attribute(.font, at: boldRange.location, effectiveRange: nil) as? UIFont - XCTAssertNotNil(fontAtBold) - let boldTraits = fontAtBold?.fontDescriptor.symbolicTraits - XCTAssertTrue( - boldTraits?.contains(.traitBold) == true, - "粗体区段应携带 .traitBold,界面不能只呈现无样式纯文本" - ) - - let fontAtItalic = attributed.attribute(.font, at: italicRange.location, effectiveRange: nil) as? UIFont - XCTAssertNotNil(fontAtItalic) - let italicTraits = fontAtItalic?.fontDescriptor.symbolicTraits - XCTAssertTrue( - italicTraits?.contains(.traitItalic) == true, - "斜体区段应携带 .traitItalic" - ) - - let linkURL = attributed.attribute(.link, at: linkRange.location, effectiveRange: nil) as? URL - XCTAssertEqual(linkURL?.absoluteString, "https://docs.example.com", "链接语义应体现在属性上,而非以 `[文本](url)` 形式出现在可见串中") - } - - // MARK: 多段 / 非首块 paragraph / 列表与引用(补全语义与富文本覆盖) - - /// 两段纯段落:可见串与递归收集的语义段落拼接一致,且两段内粗/斜均有 trait。 - func testMultiParagraphRenderedVisibleMatchesSemanticSegmentsAndRichAttributes() { - let md = """ - 第一段 **粗一**。 - - 第二段 *斜二*。 - """ - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(md) - let segments = st_collectSemanticTextSegments(from: result.renderDocument.blocks) - XCTAssertEqual(segments.count, 2, "期望两个顶层段落语义片段") - - let attributed = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - let visible = st_normalizeReaderWhitespace(attributed.string) - let expected = st_normalizeReaderWhitespace(segments.joined(separator: "\n")) - XCTAssertEqual( - visible, - expected, - "多段纯文本场景下,可见串应与各段语义文本用块间单换行拼接一致(与 STMarkdownAttributedStringRenderer 块分隔一致)" - ) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - - let ns = visible as NSString - let r1 = ns.range(of: "粗一") - let r2 = ns.range(of: "斜二") - XCTAssertNotEqual(r1.location, NSNotFound) - XCTAssertNotEqual(r2.location, NSNotFound) - let boldTraits = (attributed.attribute(.font, at: r1.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits - let italicTraits = (attributed.attribute(.font, at: r2.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits - XCTAssertTrue(boldTraits?.contains(.traitBold) == true) - XCTAssertTrue(italicTraits?.contains(.traitItalic) == true) - } - - /// 首块为标题时,顶层首块不是 paragraph(但文档内嵌套处仍可有 paragraph,故 `st_firstParagraphInlinesFromRender` 可能非 nil)。 - func testHeadingThenParagraphVisibleMatchesSemanticJoinWithoutAtxMarkers() { - let md = """ - ## 章节 **内粗** - - 正文 *斜* 尾。 - """ - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(md) - guard case .heading(_, level: let level, anchorId: _, content: _)? = result.renderDocument.blocks.first else { - return XCTFail("期望渲染文档首块为 heading,实际:\(String(describing: result.renderDocument.blocks.first))") - } - XCTAssertEqual(level, 2) - - let segments = st_collectSemanticTextSegments(from: result.renderDocument.blocks) - XCTAssertEqual(segments.count, 2) - - let attributed = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - let visible = st_normalizeReaderWhitespace(attributed.string) - let expected = st_normalizeReaderWhitespace(segments.joined(separator: "\n")) - XCTAssertEqual(visible, expected) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - st_assertNoAtxOrQuoteLineStarts(in: visible) - XCTAssertFalse(visible.contains("##"), "可见串不应残留 ATX ## 定界") - XCTAssertTrue(visible.contains("章节") && visible.contains("内粗")) - - let ns = visible as NSString - let rBold = ns.range(of: "内粗") - let rItalic = ns.range(of: "斜") - XCTAssertTrue( - (attributed.attribute(.font, at: rBold.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits.contains(.traitBold) == true - ) - XCTAssertTrue( - (attributed.attribute(.font, at: rItalic.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits.contains(.traitItalic) == true - ) - } - - /// 块引用内粗体:可见串含引用正文,无 `> ` 前缀泄漏,粗体区段有 trait。 - func testBlockQuoteWithStrongRendersQuoteBodyWithoutMarkdownPrefixLeaks() { - let md = "> **引用粗** 与 *引用斜*。" - let attributed = st_renderAttributed(markdown: md) - let visible = attributed.string - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - st_assertNoAtxOrQuoteLineStarts(in: visible) - XCTAssertTrue(visible.contains("引用粗") && visible.contains("引用斜")) - XCTAssertFalse(visible.contains("> "), "块引用不应以 Markdown `> ` 前缀出现在可见文本中") - - let ns = visible as NSString - let rB = ns.range(of: "引用粗") - let rI = ns.range(of: "引用斜") - XCTAssertTrue( - (attributed.attribute(.font, at: rB.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits.contains(.traitBold) == true - ) - XCTAssertTrue( - (attributed.attribute(.font, at: rI.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits.contains(.traitItalic) == true - ) - } - - /// 无序列表项内粗体:首块为 list 非 paragraph;可见串无 `**`,且列表项正文为粗体 trait。 - func testUnorderedListWithStrongItemNoRawMarkdownAndBoldTrait() { - let md = """ - - **列表粗** - - 普通项 - """ - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(md) - guard case .list? = result.renderDocument.blocks.first else { - return XCTFail("期望首块为 list,实际:\(String(describing: result.renderDocument.blocks.first))") - } - - let attributed = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - let visible = attributed.string - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - XCTAssertFalse(visible.contains("**")) - XCTAssertTrue(visible.contains("列表粗") && visible.contains("普通项")) - - let ns = visible as NSString - let rBold = ns.range(of: "列表粗") - XCTAssertNotEqual(rBold.location, NSNotFound) - XCTAssertTrue( - (attributed.attribute(.font, at: rBold.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits.contains(.traitBold) == true - ) - } - - /// 有序列表后接独立段落:首块为 list;语义收集含「粗体项」与「跟段落」;可见串无列表 Markdown 定界泄漏。 - func testOrderedListThenParagraphSemanticSegmentsAndNoDelimiterLeaks() { - let md = """ - 1. 有序 **粗体项** - - 跟段落 *斜*。 - """ - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(md) - guard case .list? = result.renderDocument.blocks.first else { - return XCTFail("期望首块为 list,实际:\(String(describing: result.renderDocument.blocks.first))") - } - - let segments = st_collectSemanticTextSegments(from: result.renderDocument.blocks) - XCTAssertEqual(segments.count, 2) - XCTAssertTrue(segments[0].contains("粗体项")) - XCTAssertTrue(segments[1].contains("跟段落")) - - let visible = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - XCTAssertTrue(visible.contains("粗体项") && visible.contains("跟段落")) - XCTAssertFalse(visible.contains("**")) - XCTAssertFalse(visible.contains("1. 有序"), "不应把有序列表源码前缀原样显示为读者文本") - } - - /// 列表项以围栏代码块开头、后接段落:首子块非 paragraph;可见串含代码正文与「说明」,且不得残留 ``` 围栏。 - func testListItemLeadingWithCodeBlockThenParagraphRendersWithoutFenceLeaks() { - let md = """ - - ```swift - let v = 1 - ``` - - 说明文字 - """ - let attributed = st_renderAttributed(markdown: md) - let visible = attributed.string - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - XCTAssertFalse(visible.contains("```"), "围栏代码不应以 ``` 出现在最终可见串中") - XCTAssertTrue(visible.contains("let v = 1"), "代码正文应出现在可见输出中") - XCTAssertTrue(visible.contains("说明文字"), "代码块后的列表项段落应保留") - - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(md) - guard case .list(_, let items)? = result.renderDocument.blocks.first, - let firstItem = items.first - else { - return XCTFail("期望首块为列表") - } - XCTAssertFalse(firstItem.blocks.isEmpty, "列表项应包含子块") - if case .codeBlock = firstItem.blocks.first {} else { - XCTFail("期望列表项首子块为 codeBlock(首块非 paragraph 场景)") - } - } - - /// 嵌套无序列表:可见串含父子项正文,无 `**` 泄漏。 - func testNestedUnorderedListRendersChildBoldWithoutMarkdownDelimiters() { - let md = """ - - 父项 - - **子粗** - """ - let visible = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: visible) - XCTAssertTrue(visible.contains("父项") && visible.contains("子粗")) - XCTAssertFalse(visible.contains("**")) - - let attributed = st_renderAttributed(markdown: md) - let ns = visible as NSString - let r = ns.range(of: "子粗") - XCTAssertNotEqual(r.location, NSNotFound) - XCTAssertTrue( - (attributed.attribute(.font, at: r.location, effectiveRange: nil) as? UIFont)? - .fontDescriptor.symbolicTraits.contains(.traitBold) == true - ) - } - - @MainActor - func testStreamingViewAccumulatedStringHasNoMarkdownOrHtmlLeaksWhenEscapesPresent() { - // 显式注入带 sanitizer 的 engine:避免默认值漂移导致 chunks 内字面 `\n` 还原行为变化造成假阳性 - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let view = STMarkdownStreamingTextView( - style: .default, - advancedRenderers: .empty, - engine: engine - ) - let chunks = [ - #"字面值 \*"#, - #"*不斜*\n\n"#, - #"[链](https://e.com)"#, - "\n\n**真粗**", - ] - var accumulated = "" - for chunk in chunks { - accumulated += chunk - view.updateStreamingMarkdown(accumulated) - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: view.attributedText.string) - } - XCTAssertTrue(view.attributedText.string.contains("真粗")) - } - - func testSemanticNormalizerPassthroughPreservesEscapedParagraphAST() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"字面 \*星\*"#) - let normalized = STMarkdownSemanticNormalizer.passthrough.normalize(doc) - XCTAssertEqual(normalized, doc) - } - - func testRenderAdapterProducesRenderDocumentWithoutExtraMarkdownDelimiters() { - let parser = STMarkdownStructureParser() - let adapter = STMarkdownRenderAdapter() - let doc = parser.parse("\\# 标题字面 与 **粗**") - let renderDoc = adapter.adapt(doc) - let plain = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: renderDoc) - .string - st_assertNoRawMarkdownOrTagSyntaxLeaks(in: plain) - XCTAssertTrue(plain.contains("粗")) - } - - func testRenderListItemParagraphInitializerPreservesCheckboxForTaskEscapeScenario() { - let item = STMarkdownRenderListItem( - content: [.text("任务项")], - ordered: false, - level: 0, - orderedIndex: nil, - childBlocks: [], - checkbox: .unchecked - ) - XCTAssertEqual(item.checkbox, .unchecked) - XCTAssertEqual(item.content, [.text("任务项")]) - } - - // MARK: 本地 Resources 数据回归 - - func testResourceData1MarkdownCanBeParsedAndRendered() throws { - let markdown = try st_markdownFixtureText(named: "data1") - let result = STMarkdownEngine().process(markdown) - XCTAssertFalse(result.sourceDocument.blocks.isEmpty, "data1 应至少解析出一个 source block") - XCTAssertFalse(result.renderDocument.blocks.isEmpty, "data1 应至少生成一个 render block") - - let rendered = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - .string - XCTAssertTrue(rendered.contains("第一步")) - XCTAssertTrue(rendered.contains("第三步")) - XCTAssertTrue(rendered.contains("立即")) - } - - func testResourceData2MarkdownCanBeParsedAndRendered() throws { - let markdown = try st_markdownFixtureText(named: "data2") - let result = STMarkdownEngine().process(markdown) - XCTAssertFalse(result.sourceDocument.blocks.isEmpty, "data2 应至少解析出一个 source block") - XCTAssertFalse(result.renderDocument.blocks.isEmpty, "data2 应至少生成一个 render block") - - let rendered = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - .string - XCTAssertTrue(rendered.contains("减肥方法")) - XCTAssertTrue(rendered.contains("关键提醒")) - XCTAssertTrue(rendered.contains("控制热量摄入")) - } - - func testResourceData3MarkdownCanBeParsedAndRenderedWithoutCodeFenceLeaks() throws { - let markdown = try st_markdownFixtureText(named: "data3") - let result = STMarkdownEngine().process(markdown) - XCTAssertFalse(result.sourceDocument.blocks.isEmpty, "data3 应至少解析出一个 source block") - XCTAssertFalse(result.renderDocument.blocks.isEmpty, "data3 应至少生成一个 render block") - - let rendered = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: result.renderDocument) - .string - XCTAssertTrue(rendered.contains("Markdown实现示例")) - XCTAssertTrue(rendered.contains("HTML实现示例")) - XCTAssertTrue(rendered.contains("应用场景")) - XCTAssertFalse(rendered.contains("```"), "代码围栏定界符不应泄漏到最终可见串") - } - - func testResourceData1ASTStructureContracts() throws { - let markdown = try st_markdownFixtureText(named: "data1") - let result = STMarkdownEngine().process(markdown) - let sourceBlocks = result.sourceDocument.blocks - XCTAssertFalse(sourceBlocks.isEmpty) - - let headingBlocks = sourceBlocks.compactMap { block -> (Int, [STMarkdownInlineNode])? in - if case .heading(let level, let content) = block { return (level, content) } - return nil - } - XCTAssertGreaterThanOrEqual(headingBlocks.count, 5, "data1 应含多级标题结构") - XCTAssertTrue(headingBlocks.contains { level, content in - level == 2 && st_joinInlinePlainText(content).contains("第一步") - }, "data1 应包含“第一步”二级标题") - XCTAssertTrue(headingBlocks.contains { level, content in - level == 2 && st_joinInlinePlainText(content).contains("第三步") - }, "data1 应包含“第三步”二级标题") - - let listBlocks = sourceBlocks.compactMap { block -> (STMarkdownListKind, [STMarkdownListItemNode])? in - if case .list(let kind, let items) = block { return (kind, items) } - return nil - } - XCTAssertFalse(listBlocks.isEmpty, "data1 应解析出列表块") - XCTAssertTrue(listBlocks.contains { _, items in - items.contains { item in - item.blocks.contains { st_blockContainsText($0, text: "安静") } - } - }, "data1 列表中应包含“安静”相关条目") - } - - func testResourceData2ASTStructureContracts() throws { - let markdown = try st_markdownFixtureText(named: "data2") - let result = STMarkdownEngine().process(markdown) - let sourceBlocks = result.sourceDocument.blocks - XCTAssertFalse(sourceBlocks.isEmpty) - - let tables = sourceBlocks.compactMap { block -> STMarkdownTableModel? in - if case .table(let model) = block { return model } - return nil - } - XCTAssertEqual(tables.count, 1, "data2 应包含单个主表格") - guard let table = tables.first else { return } - XCTAssertNotNil(table.header, "data2 表格应有 header") - XCTAssertGreaterThanOrEqual(table.header?.count ?? 0, 3, "data2 header 至少 3 列") - XCTAssertGreaterThanOrEqual(table.rows.count, 8, "data2 表格应包含多行建议内容") - - let headerText = st_joinInlinePlainText((table.header ?? []).flatMap { $0 }) - XCTAssertTrue(headerText.contains("类别")) - XCTAssertTrue(headerText.contains("具体建议")) - XCTAssertTrue(headerText.contains("注意事项")) - - let rowText = st_joinInlinePlainText(table.rows.flatMap { $0 }.flatMap { $0 }) - XCTAssertTrue(rowText.contains("饮食调整")) - XCTAssertTrue(rowText.contains("运动建议")) - XCTAssertTrue(rowText.contains("生活习惯")) - } - - func testResourceData3ASTStructureContracts() throws { - let markdown = try st_markdownFixtureText(named: "data3") - let result = STMarkdownEngine().process(markdown) - let sourceBlocks = result.sourceDocument.blocks - XCTAssertFalse(sourceBlocks.isEmpty) - - let codeBlocks = sourceBlocks.compactMap { block -> (String?, String)? in - if case .codeBlock(let language, let code) = block { return (language, code) } - return nil - } - XCTAssertGreaterThanOrEqual(codeBlocks.count, 2, "data3 至少包含 markdown/html 两段代码块") - XCTAssertTrue(codeBlocks.contains { lang, code in - (lang ?? "").lowercased().contains("markdown") && code.contains("1. 有序列表第一项") - }) - XCTAssertTrue(codeBlocks.contains { lang, code in - (lang ?? "").lowercased().contains("html") && code.contains("
    ") - }) - - let renderLists = result.renderDocument.blocks.compactMap { block -> [STMarkdownRenderListItem]? in - if case .list(_, let items) = block { return items } - return nil - } - XCTAssertFalse(renderLists.isEmpty, "data3 渲染 AST 应至少包含一个列表块") - XCTAssertTrue(renderLists.contains { items in - items.contains { $0.ordered } - }, "data3 应包含有序列表") - XCTAssertTrue(result.renderDocument.blocks.contains { st_renderBlockContainsText($0, text: "关键点") }) - XCTAssertTrue(result.renderDocument.blocks.contains { st_renderBlockContainsText($0, text: "应用场景") }) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownParsingResourceFixtureTests.swift b/Example/STBaseProjectExampleTests/STMarkdownParsingResourceFixtureTests.swift deleted file mode 100644 index 8909451..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownParsingResourceFixtureTests.swift +++ /dev/null @@ -1,356 +0,0 @@ -// -// STMarkdownParsingResourceFixtureTests.swift -// STBaseProjectExampleTests -// -// 以 Example/STBaseProjectExample/Resources/data1~3.txt 为 fixture, -// 覆盖 STMarkdown/Parsing 目录各模块在真实 LLM 输出上的行为。 -// -// 模块映射: -// - STMarkdownInputSanitizer / defaultRules → sanitizer 阶段 -// - STMarkdownMalformedTableNormalizer → 表格预修复(data2) -// - STMarkdownMathNormalizer → StructureParser 内块级公式(data1~3 无 $$ 时不应误拆) -// - STMarkdownStructureParser + FootnoteSupport + HTMLBlockClassifier → parse 阶段 -// - STMarkdownSemanticNormalizer → 语义归一 -// - STMarkdownAST / STMarkdownRenderAST → 管线结果结构 -// - STMarkdownFootnoteDeepLink(internal)→ 由 STMarkdownFootnoteAndHTMLTests / Renderer 间接覆盖 -// - -import XCTest -import STBaseProject - -// MARK: - Fixture 加载 - -private enum STMarkdownParsingResourceFixture { - static let names = ["data1", "data2", "data3"] - - static func text(named name: String) throws -> String { - let testFileURL = URL(fileURLWithPath: #filePath) - let projectRoot = testFileURL - .deletingLastPathComponent() - .deletingLastPathComponent() - let fixtureURL = projectRoot - .appendingPathComponent("STBaseProjectExample") - .appendingPathComponent("Resources") - .appendingPathComponent(name) - .appendingPathExtension("txt") - return try String(contentsOf: fixtureURL, encoding: .utf8) - } -} - -// MARK: - 轻量 AST 辅助 - -private func st_joinInlinePlainText(_ nodes: [STMarkdownInlineNode]) -> String { - nodes.map { st_inlinePlainText($0) }.joined() -} - -private func st_inlinePlainText(_ node: STMarkdownInlineNode) -> String { - switch node { - case .text(let s): - return s - case .softBreak: - return "\n" - case .inlineMath(let f, _): - return f - case .code(let s): - return s - case .emphasis(let c), .strong(let c), .strikethrough(let c): - return st_joinInlinePlainText(c) - case .link(_, let c): - return st_joinInlinePlainText(c) - case .image(_, let alt, _): - return alt - case .footnoteReference(let label): - return "[^\(label)]" - case .inlineRawHTML(let raw): - return raw - } -} - -private func st_documentPlainText(_ document: STMarkdownDocument) -> String { - func walkBlocks(_ blocks: [STMarkdownBlockNode]) -> String { - blocks.map { block in - switch block { - case .paragraph(let inlines): - return st_joinInlinePlainText(inlines) - case .heading(_, let inlines): - return st_joinInlinePlainText(inlines) - case .quote(let children): - return walkBlocks(children) - case .list(_, let items): - return items.map { walkBlocks($0.blocks) }.joined() - case .table(let table): - let header = (table.header ?? []).flatMap { $0 } - let rows = table.rows.flatMap { $0 }.flatMap { $0 } - return st_joinInlinePlainText(header + rows) - case .codeBlock(_, let code): - return code - case .mathBlock(let formula): - return formula - case .image(_, let alt, let title): - return alt + (title ?? "") - case .thematicBreak: - return "" - case .details(let summary, let body): - return st_joinInlinePlainText(summary) + walkBlocks(body) - case .rawHTML(let html): - return html - } - }.joined(separator: "\n") - } - return walkBlocks(document.blocks) -} - -private func st_containsInlineLink(to term: String, in nodes: [STMarkdownInlineNode]) -> Bool { - for node in nodes { - switch node { - case .link(let destination, let children): - let text = st_joinInlinePlainText(children) - if text.contains(term) { return true } - if destination.contains(term) { return true } - case .emphasis(let c), .strong(let c), .strikethrough(let c): - if st_containsInlineLink(to: term, in: c) { return true } - default: - break - } - } - return false -} - -private func st_collectAllInlines(from document: STMarkdownDocument) -> [STMarkdownInlineNode] { - var result: [STMarkdownInlineNode] = [] - func walkBlocks(_ blocks: [STMarkdownBlockNode]) { - for block in blocks { - switch block { - case .paragraph(let inlines), .heading(_, let inlines): - result.append(contentsOf: inlines) - case .quote(let children): - walkBlocks(children) - case .list(_, let items): - for item in items { walkBlocks(item.blocks) } - case .table(let table): - let header = (table.header ?? []).flatMap { $0 } - let rows = table.rows.flatMap { $0 }.flatMap { $0 } - result.append(contentsOf: header + rows) - case .details(let summary, let body): - result.append(contentsOf: summary) - walkBlocks(body) - default: - break - } - } - } - walkBlocks(document.blocks) - return result -} - -private func st_assertNoRawMarkdownSyntaxLeaks(in output: String, file: StaticString = #filePath, line: UInt = #line) { - let forbidden = ["```", "{{ST_MATH_BLOCK:", "$$", "\\(", "\\)"] - for token in forbidden { - XCTAssertFalse( - output.contains(token), - "渲染可见串不得残留定界符:\(token.debugDescription)", - file: file, - line: line - ) - } -} - -// MARK: - Tests - -final class STMarkdownParsingResourceFixtureTests: XCTestCase { - - // MARK: 全 fixture 管线冒烟(Engine = Sanitizer + MalformedTable + Parser + Semantic + RenderAdapter) - - func testAllResourceFixturesCompletePipeline() throws { - let engine = STMarkdownEngine() - for name in STMarkdownParsingResourceFixture.names { - let markdown = try STMarkdownParsingResourceFixture.text(named: name) - XCTAssertFalse(markdown.isEmpty, "\(name) fixture 不应为空") - - let result = engine.process(markdown) - XCTAssertFalse(result.sourceDocument.blocks.isEmpty, "\(name) source AST 不应为空") - XCTAssertFalse(result.normalizedDocument.blocks.isEmpty, "\(name) normalized AST 不应为空") - XCTAssertFalse(result.renderDocument.blocks.isEmpty, "\(name) render AST 不应为空") - XCTAssertFalse(result.tableOfContents.isEmpty, "\(name) 应抽取至少一个标题目录项") - } - } - - // MARK: STMarkdownInputSanitizer - - func testInputSanitizer_AllResourceFixturesProduceNonEmptySanitizedText() throws { - let sanitizer = STMarkdownInputSanitizer(rules: STMarkdownInputSanitizer.defaultRules) - for name in STMarkdownParsingResourceFixture.names { - let raw = try STMarkdownParsingResourceFixture.text(named: name) - let outcome = sanitizer.sanitize(raw) - XCTAssertFalse(outcome.sanitizedText.isEmpty, "\(name) sanitizer 输出不应为空") - XCTAssertGreaterThan( - outcome.sanitizedText.count, - raw.count / 4, - "\(name) sanitizer 不应过度截断正文" - ) - } - } - - // MARK: STMarkdownMalformedTableNormalizer - - func testMalformedTableNormalizer_Data2IsIdempotent() throws { - let raw = try STMarkdownParsingResourceFixture.text(named: "data2") - let sanitizer = STMarkdownInputSanitizer(rules: STMarkdownInputSanitizer.defaultRules) - let sanitized = sanitizer.sanitize(raw).sanitizedText - - let once = STMarkdownMalformedTableNormalizer.normalize(sanitized) - let twice = STMarkdownMalformedTableNormalizer.normalize(once) - XCTAssertEqual(once, twice, "data2 表格预修复应幂等") - XCTAssertTrue(once.contains("|"), "data2 预修复后应保留表格竖线") - } - - // MARK: STMarkdownMathNormalizer(经 StructureParser 间接) - - func testMathNormalizer_ResourceFixturesDoNotFabricateBlockMathPlaceholders() throws { - let parser = STMarkdownStructureParser() - for name in STMarkdownParsingResourceFixture.names { - let raw = try STMarkdownParsingResourceFixture.text(named: name) - let normalized = STMarkdownMathNormalizer.normalizeBlocks(in: raw) - XCTAssertTrue( - normalized.blockMap.isEmpty, - "\(name) 不含独立 $$ 块级公式时不应生成 math block 占位" - ) - let doc = parser.parse(normalized.text) - XCTAssertFalse(doc.blocks.isEmpty, "\(name) 经 math 预处理后仍应可解析") - let plain = st_documentPlainText(doc) - XCTAssertFalse( - plain.contains("{{ST_MATH_BLOCK:"), - "\(name) 可见语义文本不应含块公式占位符" - ) - } - } - - // MARK: STMarkdownStructureParser(含 FootnoteSupport / HTMLBlockClassifier 路径) - - func testStructureParser_Data1PreservesBracketTermsAndHeadings() throws { - let raw = try STMarkdownParsingResourceFixture.text(named: "data1") - let doc = STMarkdownStructureParser().parse(raw) - let plain = st_documentPlainText(doc) - XCTAssertTrue(plain.contains("第一步"), "data1 应解析出「第一步」") - XCTAssertTrue(plain.contains("偏头痛") || plain.contains("咖啡因"), "data1 应保留方括号术语正文") - - let inlines = st_collectAllInlines(from: doc) - XCTAssertTrue( - st_containsInlineLink(to: "偏头痛", in: inlines) - || plain.contains("[偏头痛]") - || plain.contains("偏头痛"), - "data1 方括号术语应解析为链接或保留可读正文" - ) - - let headingCount = doc.blocks.compactMap { block -> Int? in - if case .heading(let level, _) = block { return level } - return nil - }.count - XCTAssertGreaterThanOrEqual(headingCount, 5, "data1 应含多级标题") - } - - func testStructureParser_Data2ProducesSingleWellFormedTable() throws { - let raw = try STMarkdownParsingResourceFixture.text(named: "data2") - let sanitized = STMarkdownInputSanitizer(rules: STMarkdownInputSanitizer.defaultRules) - .sanitize(raw).sanitizedText - let parserInput = STMarkdownMalformedTableNormalizer.normalize(sanitized) - let doc = STMarkdownStructureParser().parse(parserInput) - - let tables = doc.blocks.compactMap { block -> STMarkdownTableModel? in - if case .table(let model) = block { return model } - return nil - } - XCTAssertEqual(tables.count, 1, "data2 应解析出单个主表格") - guard let table = tables.first else { return } - XCTAssertGreaterThanOrEqual(table.header?.count ?? 0, 3) - XCTAssertGreaterThanOrEqual(table.rows.count, 8) - - let headerText = st_joinInlinePlainText((table.header ?? []).flatMap { $0 }) - XCTAssertTrue(headerText.contains("类别")) - XCTAssertTrue(headerText.contains("具体建议")) - } - - func testStructureParser_Data3NestedListsCodeBlocksAndCitationText() throws { - let raw = try STMarkdownParsingResourceFixture.text(named: "data3") - let doc = STMarkdownStructureParser().parse(raw) - - let codeBlocks = doc.blocks.compactMap { block -> (String?, String)? in - if case .codeBlock(let lang, let code) = block { return (lang, code) } - return nil - } - XCTAssertGreaterThanOrEqual(codeBlocks.count, 2, "data3 应含 markdown/html 代码块") - XCTAssertTrue(codeBlocks.contains { ($0.0 ?? "").lowercased().contains("markdown") }) - XCTAssertTrue(codeBlocks.contains { ($0.0 ?? "").lowercased().contains("html") }) - - let lists = doc.blocks.compactMap { block -> STMarkdownListKind? in - if case .list(let kind, _) = block { return kind } - return nil - } - XCTAssertFalse(lists.isEmpty, "data3 应含列表块") - XCTAssertTrue(lists.contains { if case .ordered = $0 { return true }; return false }) - - let plain = st_documentPlainText(doc) - XCTAssertTrue(plain.contains("[5]") || plain.contains("[8]"), "data3 引用角标应保留在 AST 语义文本中") - XCTAssertTrue(plain.contains("应用场景")) - } - - // MARK: STMarkdownSemanticNormalizer - - func testSemanticNormalizer_PassthroughPreservesResourceBlockCount() throws { - let parser = STMarkdownStructureParser() - let normalizer = STMarkdownSemanticNormalizer.passthrough - for name in STMarkdownParsingResourceFixture.names { - let raw = try STMarkdownParsingResourceFixture.text(named: name) - let parsed = parser.parse(raw) - let normalized = normalizer.normalize(parsed) - XCTAssertEqual( - parsed.blocks.count, - normalized.blocks.count, - "\(name) passthrough 归一化不应改变块数量" - ) - } - } - - // MARK: 端到端渲染(Parsing 输出经 RenderAdapter + Renderer) - - func testRenderedPlainText_AllResourceFixturesNoSyntaxLeaks() throws { - let engine = STMarkdownEngine() - let renderer = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - for name in STMarkdownParsingResourceFixture.names { - let markdown = try STMarkdownParsingResourceFixture.text(named: name) - let result = engine.process(markdown) - let plain = renderer.render(document: result.renderDocument).string - XCTAssertFalse(plain.isEmpty, "\(name) 渲染结果不应为空") - st_assertNoRawMarkdownSyntaxLeaks(in: plain) - } - } - - func testRenderedPlainText_Data1ContainsExpectedSectionTitles() throws { - let markdown = try STMarkdownParsingResourceFixture.text(named: "data1") - let plain = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: STMarkdownEngine().process(markdown).renderDocument) - .string - XCTAssertTrue(plain.contains("第一步")) - XCTAssertTrue(plain.contains("第三步")) - XCTAssertTrue(plain.contains("立即")) - } - - func testRenderedPlainText_Data2ContainsTableContent() throws { - let markdown = try STMarkdownParsingResourceFixture.text(named: "data2") - let plain = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: STMarkdownEngine().process(markdown).renderDocument) - .string - XCTAssertTrue(plain.contains("减肥方法")) - XCTAssertTrue(plain.contains("控制热量摄入")) - } - - func testRenderedPlainText_Data3PreservesExampleSectionTitles() throws { - let markdown = try STMarkdownParsingResourceFixture.text(named: "data3") - let plain = STMarkdownAttributedStringRenderer(style: .default, advancedRenderers: .empty) - .render(document: STMarkdownEngine().process(markdown).renderDocument) - .string - XCTAssertTrue(plain.contains("Markdown实现示例")) - XCTAssertTrue(plain.contains("HTML实现示例")) - XCTAssertTrue(plain.contains("应用场景")) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownPipelineTests.swift b/Example/STBaseProjectExampleTests/STMarkdownPipelineTests.swift deleted file mode 100644 index 956bb15..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownPipelineTests.swift +++ /dev/null @@ -1,2644 +0,0 @@ -import XCTest -@testable import STBaseProject -@testable import STBaseProjectExample - -private struct MockCodeBlockRenderer: STMarkdownCodeBlockRendering { - func renderCodeBlock(language: String?, code: String, style: STMarkdownStyle) -> NSAttributedString? { - NSAttributedString(string: "[code:\(language ?? "plain")]\(code)") - } -} - -private struct MockInlineMathRenderer: STMarkdownInlineMathRendering { - func renderInlineMath(formula: String, style: STMarkdownStyle, baseFont: UIFont, textColor: UIColor) -> NSAttributedString? { - NSAttributedString(string: "[math:\(formula)]") - } -} - -private final class MockImageLoader: STMarkdownImageLoading { - private(set) var lastURL: URL? - - func loadImage(from url: URL, completion: @escaping @Sendable (UIImage?) -> Void) { - self.lastURL = url - let renderer = UIGraphicsImageRenderer(size: CGSize(width: 24, height: 24)) - let image = renderer.image { context in - UIColor.systemBlue.setFill() - context.fill(CGRect(x: 0, y: 0, width: 24, height: 24)) - } - completion(image) - } -} - -private final class CancellableMockImageLoader: STMarkdownCancellableImageLoading { - private(set) var cancellable = MockImageCancellable() - private(set) var requestedURL: URL? - - func loadImage(from url: URL, completion: @escaping @Sendable (UIImage?) -> Void) { - _ = self.loadCancellableImage(from: url, completion: completion) - } - - func loadCancellableImage(from url: URL, completion: @escaping @Sendable (UIImage?) -> Void) -> STMarkdownImageLoadCancellable? { - self.requestedURL = url - return self.cancellable - } -} - -private final class DeferredMockImageLoader: STMarkdownImageLoading { - private(set) var requestedURL: URL? - private var completion: (@Sendable (UIImage?) -> Void)? - - func loadImage(from url: URL, completion: @escaping @Sendable (UIImage?) -> Void) { - self.requestedURL = url - self.completion = completion - } - - func complete(with image: UIImage?) { - self.completion?(image) - } -} - -private final class MockImageCancellable: STMarkdownImageLoadCancellable { - private(set) var didCancel = false - - func cancel() { - self.didCancel = true - } -} - -final class STMarkdownPipelineTests: XCTestCase { - - func testInputSanitizerConvertsHtmlLinkToMarkdown() { - let sanitizer = STMarkdownInputSanitizer( - rules: [ - STHtmlNormalizeRule(), - STHtmlLinkToMarkdownRule(), - ] - ) - - let result = sanitizer.sanitize(#"Example"#) - - XCTAssertEqual(result.sanitizedText, "[Example](https://example.com)") - XCTAssertTrue(result.appliedRules.contains("STHtmlLinkToMarkdownRule")) - } - - func testStructureParserPreservesOrderedListStartIndex() { - let parser = STMarkdownStructureParser() - - let document = parser.parse( - """ - 3. 第三项 - 4. 第四项 - """ - ) - - guard case .list(let kind, let items)? = document.blocks.first else { - return XCTFail("Expected first block to be list") - } - - guard case .ordered(let startIndex) = kind else { - return XCTFail("Expected ordered list kind") - } - - XCTAssertEqual(startIndex, 3) - XCTAssertEqual(items.count, 2) - } - - func testRenderAdapterFlattensOrderedListIndices() { - let parser = STMarkdownStructureParser() - let adapter = STMarkdownRenderAdapter() - let document = parser.parse( - """ - 5. 第一项 - 6. 第二项 - """ - ) - - let renderDocument = adapter.adapt(document) - - guard case .list(_, let items)? = renderDocument.blocks.first else { - return XCTFail("Expected first render block to be list") - } - - XCTAssertEqual(items.map(\.orderedIndex), [5, 6]) - XCTAssertTrue(items.allSatisfy(\.ordered)) - } - - func testMarkdownEngineReturnsSourceAndRenderDocuments() { - let engine = STMarkdownEngine() - - let result = engine.process("**标题**") - - XCTAssertFalse(result.sourceDocument.blocks.isEmpty) - XCTAssertFalse(result.renderDocument.blocks.isEmpty) - XCTAssertEqual(result.rawMarkdown, "**标题**") - } - - func testSoftBreakCollapsingNormalizerRemovesAdjacentSoftBreaks() { - let document = STMarkdownDocument( - blocks: [ - .paragraph([ - .text("A"), - .softBreak, - .softBreak, - .text("B"), - ]) - ] - ) - let normalizer = STMarkdownSoftBreakCollapsingNormalizer() - - let normalized = normalizer.normalize(document) - - guard case .paragraph(let inlines)? = normalized.blocks.first else { - return XCTFail("Expected paragraph block") - } - XCTAssertEqual(inlines, [.text("A"), .softBreak, .text("B")]) - } - - func testSoftBreakCollapsingNormalizerRecursivelyNormalizesNestedChildren() { - let document = STMarkdownDocument( - blocks: [ - .quote([ - .paragraph([ - .text("outer"), - .softBreak, - .softBreak, - .text("tail"), - ]), - .list( - kind: .unordered, - items: [ - STMarkdownListItemNode( - blocks: [ - .paragraph([ - .text("item"), - .softBreak, - .softBreak, - .text("end"), - ]) - ] - ) - ] - ), - ]) - ] - ) - let normalizer = STMarkdownSoftBreakCollapsingNormalizer() - - let normalized = normalizer.normalize(document) - - guard case .quote(let blocks)? = normalized.blocks.first else { - return XCTFail("Expected quote block") - } - guard case .paragraph(let outer)? = blocks.first else { - return XCTFail("Expected first quote child to be paragraph") - } - XCTAssertEqual(outer, [.text("outer"), .softBreak, .text("tail")]) - - guard case .list(_, let items)? = blocks.last, - case .paragraph(let nested)? = items.first?.blocks.first - else { - return XCTFail("Expected list paragraph in quote") - } - XCTAssertEqual(nested, [.text("item"), .softBreak, .text("end")]) - } - - func testAttributedStringRendererUsesDistinctBoldFontForStrongText() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .strong([.text("粗体")]), - .text(" 普通"), - ]) - ] - ) - - let attributed = renderer.render(document: document) - let strongFont = attributed.attribute(.font, at: 0, effectiveRange: nil) as? UIFont - let normalFont = attributed.attribute(.font, at: attributed.length - 1, effectiveRange: nil) as? UIFont - - XCTAssertNotNil(strongFont) - XCTAssertNotNil(normalFont) - XCTAssertNotEqual(strongFont?.fontName, normalFont?.fontName) - } - - func testAttributedStringRendererAppliesItalicBoldItalicInlineCodeAndLinkAttributes() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - linkColor: .systemGreen, - inlineCodeTextColor: .systemPink - ) - let renderer = STMarkdownAttributedStringRenderer(style: style) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .emphasis([.text("斜体")]), - .text(" "), - .strong([.emphasis([.text("粗斜")])]), - .text(" "), - .code("code"), - .text(" "), - .link(destination: "https://example.com", children: [.text("链接")]), - ]) - ] - ) - - let attributed = renderer.render(document: document) - let italicIndex = (attributed.string as NSString).range(of: "斜体").location - let boldItalicIndex = (attributed.string as NSString).range(of: "粗斜").location - let normalIndex = (attributed.string as NSString).range(of: " ").location - let codeIndex = (attributed.string as NSString).range(of: "code").location - let linkIndex = (attributed.string as NSString).range(of: "链接").location - - let italicFont = attributed.attribute(NSAttributedString.Key.font, at: italicIndex, effectiveRange: nil) as? UIFont - let boldItalicFont = attributed.attribute(NSAttributedString.Key.font, at: boldItalicIndex, effectiveRange: nil) as? UIFont - let normalFont = attributed.attribute(NSAttributedString.Key.font, at: normalIndex, effectiveRange: nil) as? UIFont - XCTAssertNotEqual(italicFont?.fontName, normalFont?.fontName) - XCTAssertNotEqual(boldItalicFont?.fontName, normalFont?.fontName) - let codeFont = attributed.attribute(NSAttributedString.Key.font, at: codeIndex, effectiveRange: nil) as? UIFont - let codeColor = attributed.attribute(NSAttributedString.Key.foregroundColor, at: codeIndex, effectiveRange: nil) as? UIColor - XCTAssertTrue(codeFont?.fontName.lowercased().contains("mono") == true) - XCTAssertEqual(codeColor, UIColor.systemPink) - let linkURL = attributed.attribute(NSAttributedString.Key.link, at: linkIndex, effectiveRange: nil) as? URL - let linkColor = attributed.attribute(NSAttributedString.Key.foregroundColor, at: linkIndex, effectiveRange: nil) as? UIColor - XCTAssertEqual(linkURL?.absoluteString, "https://example.com") - XCTAssertEqual(linkColor, UIColor.systemGreen) - } - - func testAttributedStringRendererRenderInlineContentUsesProvidedBaseAttributes() { - let renderer = STMarkdownAttributedStringRenderer() - let baseFont = UIFont.systemFont(ofSize: 21) - let rendered = renderer.renderInlineContent( - nodes: [.text("A"), .strong([.text("B")])], - baseFont: baseFont, - textColor: .systemOrange - ) - - let firstFont = rendered.attribute(NSAttributedString.Key.font, at: 0, effectiveRange: nil) as? UIFont - let firstColor = rendered.attribute(NSAttributedString.Key.foregroundColor, at: 0, effectiveRange: nil) as? UIColor - let secondFont = rendered.attribute(NSAttributedString.Key.font, at: 1, effectiveRange: nil) as? UIFont - - XCTAssertEqual(firstFont?.pointSize, 21) - XCTAssertEqual(firstColor, UIColor.systemOrange) - XCTAssertNotEqual(firstFont?.fontName, secondFont?.fontName) - } - - func testAttributedStringRendererRendersOrderedListMarker() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .list([ - STMarkdownRenderListItem( - content: [.text("第一项")], - ordered: true, - level: 0, - orderedIndex: 3, - childBlocks: [] - ) - ]) - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertTrue(attributed.string.hasPrefix("3.\t")) - XCTAssertTrue(attributed.string.contains("第一项")) - } - - func testMarkdownStreamingTextViewRendersMarkdown() { - let view = STMarkdownStreamingTextView() - - view.setMarkdown("**标题**\n\n1. 第一项", animated: false) - - XCTAssertTrue(view.attributedText.string.contains("标题")) - XCTAssertTrue(view.attributedText.string.contains("第一项")) - } - - func testMarkdownStreamingTextViewReplacesTrailingRangeWhenRenderedPrefixMutates() { - let view = STMarkdownStreamingTextView() - - view.setMarkdown("[链接](https://example.com", animated: false) - view.updateStreamingMarkdown("[链接](https://example.com)") - - let range = (view.attributedText.string as NSString).range(of: "链接") - let link = view.attributedText.attribute(.link, at: range.location, effectiveRange: nil) as? URL - - XCTAssertEqual(link?.absoluteString, "https://example.com") - } - - func testMarkdownTextViewRendersMarkdown() { - let view = STMarkdownTextView() - - view.setMarkdown("## 标题\n\n- 列表项") - - XCTAssertTrue(view.attributedText.string.contains("标题")) - XCTAssertTrue(view.attributedText.string.contains("列表项")) - } - - func testMarkdownTextViewResetClearsContent() { - let view = STMarkdownTextView() - view.setMarkdown("普通文本") - - view.reset() - - XCTAssertTrue(view.attributedText.string.isEmpty) - XCTAssertTrue(view.rawMarkdown.isEmpty) - } - - func testRenderAdapterPreservesNestedListLevel() { - let parser = STMarkdownStructureParser() - let adapter = STMarkdownRenderAdapter() - let document = parser.parse( - """ - 1. 第一项 - - 子项 - """ - ) - - let renderDocument = adapter.adapt(document) - - guard - case .list(_, let items)? = renderDocument.blocks.first, - case .list(_, let childItems)? = items.first?.childBlocks.first - else { - return XCTFail("Expected nested render list") - } - - XCTAssertEqual(items.first?.level, 0) - XCTAssertEqual(childItems.first?.level, 1) - } - - func testAttributedStringRendererOffsetsLooseListParagraphIndent() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .list([ - STMarkdownRenderListItem( - blocks: [ - .paragraph([.text("第一段")]), - .paragraph([.text("第二段")]), - ], - ordered: true, - level: 0, - orderedIndex: 1 - ) - ]) - ] - ) - - let attributed = renderer.render(document: document) - let secondParagraphLocation = (attributed.string as NSString).range(of: "第二段").location - let paragraphStyle = attributed.attribute(.paragraphStyle, at: secondParagraphLocation, effectiveRange: nil) as? NSParagraphStyle - - XCTAssertNotNil(paragraphStyle) - XCTAssertGreaterThan(paragraphStyle?.headIndent ?? 0, 0) - } - - func testAttributedStringRendererUsesCustomCodeBlockRenderer() { - let renderer = STMarkdownAttributedStringRenderer( - advancedRenderers: STMarkdownAdvancedRenderers( - codeBlockRenderer: MockCodeBlockRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .codeBlock(language: "swift", code: "print(1)") - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertEqual(attributed.string, "[code:swift]print(1)") - } - - func testAttributedStringRendererUsesCustomInlineMathRenderer() { - let renderer = STMarkdownAttributedStringRenderer( - advancedRenderers: STMarkdownAdvancedRenderers( - inlineMathRenderer: MockInlineMathRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .text("结果 "), - .inlineMath("x+y", isDisplayMode: false), - ]) - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertTrue(attributed.string.contains("[math:x+y]")) - } - - func testDefaultMathRendererRendersSuperscriptContent() { - let renderer = STMarkdownAttributedStringRenderer( - advancedRenderers: STMarkdownAdvancedRenderers( - inlineMathRenderer: STMarkdownDefaultMathRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .inlineMath("x^2", isDisplayMode: false) - ]) - ] - ) - - let attributed = renderer.render(document: document) - let baselineOffset = attributed.attribute(.baselineOffset, at: 1, effectiveRange: nil) as? CGFloat - - XCTAssertEqual(attributed.string, "x2") - XCTAssertNotNil(baselineOffset) - XCTAssertGreaterThan(baselineOffset ?? 0, 0) - } - - func testDefaultMathRendererRendersSubscriptCommandMapAndBlockParagraphStyle() { - let renderer = STMarkdownDefaultMathRenderer() - let inline = renderer.renderInlineMath( - formula: #"x_{i} + \\alpha \\times y"#, - style: .default, - baseFont: .systemFont(ofSize: 16), - textColor: .label - ) - let subscriptLocation = (inline?.string as NSString?)?.range(of: "i").location ?? NSNotFound - let baselineOffset = inline?.attribute(.baselineOffset, at: subscriptLocation, effectiveRange: nil) as? CGFloat - - XCTAssertEqual(inline?.string, "xi + α × y") - XCTAssertNotNil(baselineOffset) - XCTAssertLessThan(baselineOffset ?? 0, 0) - - let block = renderer.renderBlockMath(formula: "a=b", style: .default) - XCTAssertEqual(block?.string, "\na=b\n") - let paragraphStyle = block?.attribute(.paragraphStyle, at: 1, effectiveRange: nil) as? NSParagraphStyle - XCTAssertEqual(paragraphStyle?.alignment, .center) - } - - func testStructureParserExtractsInlineMathNodes() { - let parser = STMarkdownStructureParser() - let document = parser.parse(#"结果是 \(x^2+y^2\)"#) - - guard case .paragraph(let inlines)? = document.blocks.first else { - return XCTFail("Expected paragraph block") - } - - XCTAssertTrue(inlines.contains { node in - if case .inlineMath(let formula, _) = node { - return formula == "x^2+y^2" - } - return false - }) - } - - func testDefaultCodeBlockRendererIncludesLanguageHeader() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - codeBlockRenderer: STMarkdownDefaultCodeBlockRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .codeBlock(language: "swift", code: "print(\"hi\")") - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertTrue(attributed.string.hasPrefix("SWIFT\n")) - XCTAssertTrue(attributed.string.contains("print(\"hi\")")) - } - - func testDefaultCodeBlockRendererUsesMonospacedFont() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - codeBlockRenderer: STMarkdownDefaultCodeBlockRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .codeBlock(language: nil, code: "let value = 1") - ] - ) - - let attributed = renderer.render(document: document) - let font = attributed.attribute(.font, at: 0, effectiveRange: nil) as? UIFont - - XCTAssertNotNil(font) - XCTAssertTrue(font?.fontName.lowercased().contains("mono") == true) - } - - func testDefaultTableRendererRendersHeaderAndSeparator() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - tableRenderer: STMarkdownDefaultTableRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .table( - STMarkdownTableModel( - header: [ - [.text("名称")], - [.text("值")], - ], - rows: [ - [ - [.text("速度")], - [.text("快")], - ] - ] - ) - ) - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertTrue(attributed.string.contains("名称")) - XCTAssertTrue(attributed.string.contains("值")) - XCTAssertTrue(attributed.string.contains("┼")) - XCTAssertTrue(attributed.string.contains("速度")) - } - - func testDefaultTableRendererUsesMonospacedFont() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - tableRenderer: STMarkdownDefaultTableRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .table( - STMarkdownTableModel( - header: nil, - rows: [ - [ - [.text("A")], - [.text("B")], - ] - ] - ) - ) - ] - ) - - let attributed = renderer.render(document: document) - let font = attributed.attribute(.font, at: 0, effectiveRange: nil) as? UIFont - - XCTAssertNotNil(font) - XCTAssertTrue(font?.fontName.lowercased().contains("mono") == true) - } - - func testDefaultTableRendererPlainTextCoversInlineNodeFallbacks() { - let table = STMarkdownTableModel( - header: nil, - rows: [ - [ - [ - .strong([.text("S")]), - .emphasis([.text("E")]), - .link(destination: "https://example.com", children: [.text("L")]), - .image(source: "https://example.com/image.png", alt: "", title: nil), - ], - [ - .inlineMath("x+y", isDisplayMode: false), - .softBreak, - .code("c"), - .strikethrough([.text("D")]), - ], - ] - ] - ) - - let rendered = STMarkdownDefaultTableRenderer().renderTable(table, style: .default) - - XCTAssertTrue(rendered?.string.contains("SEL[image]") == true) - XCTAssertTrue(rendered?.string.contains("x+y cD") == true) - } - - func testDefaultImageRendererUsesAltTextForInlineImage() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - imageRenderer: STMarkdownDefaultImageRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .image(source: "https://example.com/a.png", alt: "示意图", title: nil) - ]) - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertTrue(attributed.string.contains("示意图")) - } - - func testDefaultImageRendererRendersBlockCaption() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - imageRenderer: STMarkdownDefaultImageRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .image(url: "https://example.com/a.png", altText: "", title: "图片说明") - ] - ) - - let attributed = renderer.render(document: document) - - XCTAssertTrue(attributed.string.contains("[image] a.png")) - XCTAssertTrue(attributed.string.contains("图片说明")) - } - - func testDefaultImageRendererFallsBackForInvalidURLAndEmptyAlt() { - let renderer = STMarkdownDefaultImageRenderer() - - let inline = renderer.renderImage( - url: "", - altText: "", - title: nil, - style: .default, - placement: .inline - ) - let block = renderer.renderImage( - url: "", - altText: "", - title: nil, - style: .default, - placement: .block - ) - - XCTAssertTrue(inline?.string.contains("[img]") == true) - XCTAssertNotNil(inline?.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment) - XCTAssertTrue(block?.string.contains("[image]") == true) - } - - func testDefaultHorizontalRuleRendererUsesConfiguredLength() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16, weight: .regular), - textColor: .label, - lineHeight: 24, - kern: 0.12, - horizontalRuleLength: 10 - ) - let renderer = STMarkdownAttributedStringRenderer( - style: style, - advancedRenderers: STMarkdownAdvancedRenderers( - horizontalRuleRenderer: STMarkdownDefaultHorizontalRuleRenderer() - ) - ) - let document = STMarkdownRenderDocument(blocks: [.thematicBreak()]) - - let attributed = renderer.render(document: document) - - XCTAssertEqual(attributed.string, String(repeating: "─", count: 12)) - } - - func testCodeBlockAttachmentRendererProducesAttachment() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - codeBlockRenderer: STMarkdownCodeBlockAttachmentRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .codeBlock(language: "swift", code: "print(\"hi\")") - ] - ) - - let attributed = renderer.render(document: document) - let attachment = attributed.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment - - XCTAssertNotNil(attachment) - XCTAssertNotNil(attachment?.image) - XCTAssertGreaterThan(attachment?.bounds.width ?? 0, 0) - XCTAssertGreaterThan(attachment?.bounds.height ?? 0, 0) - } - - func testCodeBlockAttachmentRendererOmitsHeaderWhenLanguageIsMissing() { - let renderer = STMarkdownCodeBlockAttachmentRenderer() - let style = STMarkdownStyle.default - let withoutLanguage = renderer.renderCodeBlock(language: nil, code: "let value = 1", style: style) - let withLanguage = renderer.renderCodeBlock(language: "swift", code: "let value = 1", style: style) - let withoutAttachment = withoutLanguage?.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment - let withAttachment = withLanguage?.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment - - XCTAssertNotNil(withoutAttachment) - XCTAssertNotNil(withAttachment) - XCTAssertGreaterThan( - withAttachment?.bounds.height ?? 0, - withoutAttachment?.bounds.height ?? 0, - "高级 code block attachment 无 language 时也不应保留标题区域" - ) - } - - func testCodeBlockAttachmentOmitsHeaderWhenLanguageIsMissing() { - let style = STMarkdownStyle.default - let code = "let value = 1" - let withoutLanguage = STMarkdownCodeBlockAttachment(language: nil, code: code, style: style) - let withLanguage = STMarkdownCodeBlockAttachment(language: "swift", code: code, style: style) - - XCTAssertEqual(withoutLanguage.headerHeight, 0, "无 language 时不应保留空 header 高度") - XCTAssertGreaterThan(withLanguage.headerHeight, 0, "有 language 时应保留 header 高度") - XCTAssertGreaterThan( - withLanguage.bounds.height, - withoutLanguage.bounds.height, - "有 language 的代码块高度应包含 header 与分隔线;无 language 不应保留空白标题区域" - ) - } - - func testAsyncImageRendererProducesAttachmentAndCallsLoader() { - let loader = MockImageLoader() - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - imageRenderer: STMarkdownAsyncImageRenderer(loader: loader) - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .image(url: "https://example.com/image.png", altText: "示意图", title: "图片标题") - ] - ) - - let attributed = renderer.render(document: document) - let attachment = attributed.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment - - XCTAssertEqual(loader.lastURL?.absoluteString, "https://example.com/image.png") - XCTAssertNotNil(attachment) - XCTAssertNotNil(attachment?.image) - XCTAssertTrue(attributed.string.contains("图片标题")) - } - - func testAsyncImageRendererRejectsInvalidURL() { - let loader = MockImageLoader() - let renderer = STMarkdownAsyncImageRenderer(loader: loader) - - let rendered = renderer.renderImage(url: "", altText: "bad", title: nil, style: .default, placement: .inline) - - XCTAssertNil(rendered) - XCTAssertNil(loader.lastURL) - } - - func testAsyncImageAttachmentUpdatesBoundsAndNotifiesObserverWhenImageLoads() { - let loader = DeferredMockImageLoader() - let renderer = STMarkdownAsyncImageRenderer(loader: loader) - let attributed = renderer.renderImage( - url: "https://example.com/wide.png", - altText: "wide", - title: nil, - style: .default, - placement: .block - ) - guard let attachment = attributed?.attribute(.attachment, at: 0, effectiveRange: nil) as? STMarkdownAsyncImageAttachment else { - return XCTFail("Expected async image attachment") - } - let placeholderBounds = attachment.bounds - let expectation = self.expectation(description: "image refresh") - let observation = attachment.addDisplayObserver { - expectation.fulfill() - } - let image = UIGraphicsImageRenderer(size: CGSize(width: 560, height: 280)).image { context in - UIColor.systemRed.setFill() - context.fill(CGRect(x: 0, y: 0, width: 560, height: 280)) - } - - loader.complete(with: image) - wait(for: [expectation], timeout: 1) - _ = observation - - XCTAssertEqual(loader.requestedURL?.absoluteString, "https://example.com/wide.png") - XCTAssertNotEqual(attachment.bounds, placeholderBounds) - XCTAssertEqual(attachment.bounds.width, 280, accuracy: 0.5) - XCTAssertEqual(attachment.bounds.height, 140, accuracy: 0.5) - XCTAssertEqual(attachment.image?.accessibilityLabel, "wide") - } - - func testAsyncImageLegacyLoaderCompletionIsIgnoredAfterAttachmentRelease() { - let loader = DeferredMockImageLoader() - weak var weakAttachment: STMarkdownAsyncImageAttachment? - autoreleasepool { - let attributed = STMarkdownAsyncImageRenderer(loader: loader).renderImage( - url: "https://example.com/release.png", - altText: "release", - title: nil, - style: .default, - placement: .inline - ) - weakAttachment = attributed?.attribute(.attachment, at: 0, effectiveRange: nil) as? STMarkdownAsyncImageAttachment - XCTAssertNotNil(weakAttachment) - } - - loader.complete(with: UIGraphicsImageRenderer(size: CGSize(width: 24, height: 24)).image { _ in }) - - XCTAssertNil(weakAttachment) - } - - func testTableAttachmentRendererProducesAttachment() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - tableRenderer: STMarkdownTableAttachmentRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .table( - STMarkdownTableModel( - header: [ - [.text("列1")], - [.text("列2")], - ], - rows: [ - [ - [.text("A")], - [.text("B")], - ] - ] - ) - ) - ] - ) - - let attributed = renderer.render(document: document) - // STMarkdownTableViewAttachment 使用 overlay 机制(不走 TextKit 绘制), - // image 始终为 nil,尺寸通过 attachmentBounds 在 layout 时计算。 - let attachment = attributed.attribute(.attachment, at: 0, effectiveRange: nil) as? STMarkdownTableViewAttachment - - XCTAssertNotNil(attachment) - XCTAssertNil(attachment?.image) - XCTAssertNotNil(attachment?.tableViewModel) - XCTAssertGreaterThan(attachment?.containerWidth ?? 0, 0) - } - - // MARK: - Multi-table Tests - - func testTableBlankLineRuleInsertsBlankLineBeforeTableAfterText() { - let rule = STTableBlankLineNormalizationRule() - var context = STMarkdownPreprocessContext() - - let input = "Some text\n| A | B |\n|---|---|" - - let result = rule.apply(to: input, context: &context) - - XCTAssertTrue(result.contains("Some text\n\n| A | B |")) - } - - func testTableBlankLineRuleInsertsBlankLineAfterTableBeforeText() { - let rule = STTableBlankLineNormalizationRule() - var context = STMarkdownPreprocessContext() - - let input = "| A | B |\n|---|---|\nSome text" - - let result = rule.apply(to: input, context: &context) - - XCTAssertTrue(result.contains("|---|---|\n\nSome text")) - } - - func testTableBlankLineRuleSkipsContentInsideCodeFence() { - let rule = STTableBlankLineNormalizationRule() - var context = STMarkdownPreprocessContext() - - let input = "```\nSome text\n| A | B |\n```" - - let result = rule.apply(to: input, context: &context) - - XCTAssertEqual(result, input) - } - - func testTableDelimiterRuleInsertsDelimiterForHeaderWithoutOne() { - let rule = STTableDelimiterNormalizationRule() - var context = STMarkdownPreprocessContext() - - // Second table starts after blank line but has no delimiter row - let input = "| A | B |\n|---|---|\n| 1 | 2 |\n\n| C | D |\n| 3 | 4 |" - - let result = rule.apply(to: input, context: &context) - - XCTAssertTrue(result.contains("| C | D |\n| --- | --- |\n| 3 | 4 |")) - } - - func testTableDelimiterRuleDoesNotDuplicateExistingDelimiter() { - let rule = STTableDelimiterNormalizationRule() - var context = STMarkdownPreprocessContext() - - let input = "| A | B |\n|---|---|\n| 1 | 2 |" - - let result = rule.apply(to: input, context: &context) - - // No extra delimiter should be inserted - let delimiterCount = result.components(separatedBy: "|---|---|").count - 1 - XCTAssertEqual(delimiterCount, 1) - } - - func testTableDelimiterRuleSkipsContentInsideCodeFence() { - let rule = STTableDelimiterNormalizationRule() - var context = STMarkdownPreprocessContext() - - let input = "```\n| A | B |\n| 1 | 2 |\n```" - - let result = rule.apply(to: input, context: &context) - - XCTAssertEqual(result, input) - } - - func testEngineRecognizesSecondTableMissingDelimiter() { - let engine = STMarkdownEngine() - // Second table lacks delimiter row — should be repaired by STTableDelimiterNormalizationRule - let markdown = "| A | B |\n|---|---|\n| 1 | 2 |\n\n| C | D |\n| 3 | 4 |" - - let result = engine.process(markdown) - let tableBlocks = result.renderDocument.blocks.compactMap { block -> STMarkdownTableModel? in - if case .table(_, let m) = block { return m } - return nil - } - - XCTAssertEqual(tableBlocks.count, 2, "两个表格都应被识别,即使第二个缺少分隔行") - } - - func testEngineRecognizesTwoWellFormedTables() { - let engine = STMarkdownEngine() - let markdown = "| A | B |\n|---|---|\n| 1 | 2 |\n\n| C | D |\n|---|---|\n| 3 | 4 |" - - let result = engine.process(markdown) - let tableBlocks = result.renderDocument.blocks.compactMap { block -> STMarkdownTableModel? in - if case .table(_, let m) = block { return m } - return nil - } - - XCTAssertEqual(tableBlocks.count, 2) - } - - func testHighFidelityMathRendererProducesInlineAttachment() { - let renderer = STMarkdownAttributedStringRenderer( - style: STMarkdownStyle.default, - advancedRenderers: STMarkdownAdvancedRenderers( - inlineMathRenderer: STMarkdownHighFidelityMathRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .inlineMath(#"\frac{1}{2}"#, isDisplayMode: false) - ]) - ] - ) - - let attributed = renderer.render(document: document) - let attachment = attributed.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment - - XCTAssertNotNil(attachment) - XCTAssertNotNil(attachment?.image) - XCTAssertGreaterThan(attachment?.bounds.width ?? 0, 0) - } - - // MARK: - Strikethrough Tests - - func testStructureParserParsesStrikethrough() { - let parser = STMarkdownStructureParser() - let document = parser.parse("~~删除文本~~") - - guard case .paragraph(let inlines)? = document.blocks.first else { - return XCTFail("Expected paragraph block") - } - - XCTAssertTrue(inlines.contains { node in - if case .strikethrough(let children) = node { - return children.contains(.text("删除文本")) - } - return false - }) - } - - func testAttributedStringRendererAppliesStrikethroughStyle() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .strikethrough([.text("已删除")]) - ]) - ] - ) - - let attributed = renderer.render(document: document) - let style = attributed.attribute(.strikethroughStyle, at: 0, effectiveRange: nil) as? Int - - XCTAssertEqual(attributed.string, "已删除") - XCTAssertNotNil(style) - XCTAssertEqual(style, NSUnderlineStyle.single.rawValue) - } - - func testStrikethroughWithCustomColor() { - let markdownStyle = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0.12, - strikethroughColor: .red - ) - let renderer = STMarkdownAttributedStringRenderer(style: markdownStyle) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .strikethrough([.text("红色删除线")]) - ]) - ] - ) - - let attributed = renderer.render(document: document) - let color = attributed.attribute(.strikethroughColor, at: 0, effectiveRange: nil) as? UIColor - - XCTAssertEqual(color, .red) - } - - // MARK: - Task List / Checkbox Tests - - func testStructureParserParsesTaskListCheckbox() { - let parser = STMarkdownStructureParser() - let document = parser.parse("- [x] 已完成\n- [ ] 未完成") - - guard case .list(_, let items)? = document.blocks.first else { - return XCTFail("Expected list block") - } - - XCTAssertEqual(items.count, 2) - XCTAssertEqual(items[0].checkbox, .checked) - XCTAssertEqual(items[1].checkbox, .unchecked) - } - - func testRenderAdapterPreservesCheckbox() { - let parser = STMarkdownStructureParser() - let adapter = STMarkdownRenderAdapter() - let document = parser.parse("- [x] 已完成\n- [ ] 未完成") - - let renderDocument = adapter.adapt(document) - - guard case .list(_, let items)? = renderDocument.blocks.first else { - return XCTFail("Expected list render block") - } - - XCTAssertEqual(items[0].checkbox, .checked) - XCTAssertEqual(items[1].checkbox, .unchecked) - } - - func testAttributedStringRendererRendersCheckboxMarkers() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .list([ - STMarkdownRenderListItem( - content: [.text("已完成")], - ordered: false, - level: 0, - orderedIndex: nil, - childBlocks: [], - checkbox: .checked - ), - STMarkdownRenderListItem( - content: [.text("未完成")], - ordered: false, - level: 0, - orderedIndex: nil, - childBlocks: [], - checkbox: .unchecked - ), - ]) - ] - ) - - let attributed = renderer.render(document: document) - let text = attributed.string - - XCTAssertTrue(text.contains("☑")) - XCTAssertTrue(text.contains("☐")) - XCTAssertTrue(text.contains("已完成")) - XCTAssertTrue(text.contains("未完成")) - } - - // MARK: - Sanitizer Rule Tests - - func testHtmlNormalizeRuleUnescapesCRLF() { - let rule = STHtmlNormalizeRule() - var context = STMarkdownPreprocessContext() - - let result = rule.apply(to: "第一行\\n第二行", context: &context) - - XCTAssertEqual(result, "第一行\n第二行") - } - - func testAnchorCleanupRuleRemovesFragmentAnchors() { - let rule = STAnchorCleanupRule() - var context = STMarkdownPreprocessContext() - - let input = ##"参考文献1内容"## - let result = rule.apply(to: input, context: &context) - - XCTAssertFalse(result.contains("第二行
    第三行
    第四行", context: &context) - - XCTAssertFalse(result.contains(" 系列标签应全部被替换") - XCTAssertFalse(result.contains("
    ")) - // CommonMark 硬换行是行尾两空格 + \n;这里至少三处换行 - let newlineCount = result.filter { $0 == "\n" }.count - XCTAssertEqual(newlineCount, 3, "三个
    应被替换为三次换行") - } - - func testHtmlNormalizeRuleRewritesEmptyClosingTagToAnchor() { - let rule = STHtmlNormalizeRule() - var context = STMarkdownPreprocessContext() - - let result = rule.apply(to: "链接", context: &context) - - XCTAssertFalse(result.contains(""), "`` 应被改写") - XCTAssertTrue(result.contains(""), "`` 应被改写为 ``") - } - - func testHtmlNormalizeRuleUnescapesCRAndCRLF() { - let rule = STHtmlNormalizeRule() - var context = STMarkdownPreprocessContext() - - // 注意:escapedCR/escapedLF 都带 `(?![A-Za-z])` 负前瞻,避免误吃 `\rest` 这种 LaTeX 命令; - // 因此构造样例时单独的 `\r` 后必须不是字母——这里用空格。 - let input = "A\\r\\nB\\r 尾" - let result = rule.apply(to: input, context: &context) - - XCTAssertFalse(result.contains("\\r"), "`\\r\\n` 与 `\\r `(非字母后续)应被消费") - XCTAssertFalse(result.contains("\\n")) - // `\r\n` → 换行;`\r ` → 换行(保留尾随空格) - XCTAssertTrue(result.contains("A\nB\n"), "应把转义换行序列还原为真实换行") - } - - func testHtmlNormalizeRuleShouldApplyGatesByCheapCheck() { - let rule = STHtmlNormalizeRule() - XCTAssertFalse(rule.shouldApply(to: "纯中文,无任何 HTML/转义")) - XCTAssertTrue(rule.shouldApply(to: "含
    的输入")) - XCTAssertTrue(rule.shouldApply(to: #"含 \" 的输入"#)) - XCTAssertTrue(rule.shouldApply(to: #"含 \/ 的输入"#)) - XCTAssertTrue(rule.shouldApply(to: #"含 \n 的输入"#)) - } - - // MARK: - STHtmlLinkToMarkdownRule 补齐 - - func testHtmlLinkRuleFallsBackToTitleWhenSchemeIsDangerous() { - let rule = STHtmlLinkToMarkdownRule() - var context = STMarkdownPreprocessContext() - - // javascript: 被拒绝 → 只保留可见 title - let input = #"点我"# - let result = rule.apply(to: input, context: &context) - - XCTAssertFalse(result.contains("javascript"), "dangerous scheme 不应泄漏进输出") - XCTAssertFalse(result.contains(" 应被消费") - XCTAssertFalse(result.contains("]("), "不应被转换为 markdown 链接语法") - XCTAssertTrue(result.contains("点我"), "title 必须保留") - } - - func testHtmlLinkRuleFallsBackToTitleWhenUrlHasNoHost() { - let rule = STHtmlLinkToMarkdownRule() - var context = STMarkdownPreprocessContext() - - // 无 host → parsedURL.host == nil → 仅保留 title - let input = #"t"# - let result = rule.apply(to: input, context: &context) - - XCTAssertFalse(result.contains(" - Docs - - """ - - let result = rule.apply(to: input, context: &context) - - XCTAssertEqual(result, "[\nDocs\n](https://example.com/docs)") - } - - func testHtmlLinkRulePreservesNestedTagTitleAsMarkdownText() { - let rule = STHtmlLinkToMarkdownRule() - var context = STMarkdownPreprocessContext() - - let result = rule.apply( - to: #"Example"#, - context: &context - ) - - XCTAssertEqual(result, "[Example](https://example.com)") - } - - // MARK: - STAnchorCleanupRule 补齐 - - func testAnchorCleanupRuleKeepsAnchorWhenFragmentContainsHttp() { - let rule = STAnchorCleanupRule() - var context = STMarkdownPreprocessContext() - - // href="#http..." 的 anchor 是真实引用,不应被清理 - let input = ##"前ref后"## - let result = rule.apply(to: input, context: &context) - - XCTAssertTrue(result.contains("= 2 guard 阻止合成 - let input = "| A |\n| 1 |" - let result = rule.apply(to: input, context: &context) - - XCTAssertFalse( - result.contains("---"), - "单列行不应被改写为表格" - ) - } - - // MARK: - STMarkdownInputSanitizer 短路 / 空输入 - - func testInputSanitizerShortCircuitsOnEmptyInput() { - let sanitizer = STMarkdownInputSanitizer(rules: [STHtmlNormalizeRule()]) - let result = sanitizer.sanitize("") - - XCTAssertEqual(result.originalText, "") - XCTAssertEqual(result.sanitizedText, "") - XCTAssertTrue(result.appliedRules.isEmpty, "空输入应跳过所有规则") - } - - func testInputSanitizerDoesNotRecordRuleWhenApplyIsNoOp() { - // shouldApply 返回 true 但 apply 没有实质修改时,不应记入 appliedRules - let sanitizer = STMarkdownInputSanitizer( - rules: [STDoubleNewlineRule()] - ) - // 输入不含 3 个以上连续换行,规则的 shouldApply 就会 false → appliedRules 为空 - let result = sanitizer.sanitize("A\n\nB") - XCTAssertFalse(result.appliedRules.contains("STDoubleNewlineRule")) - XCTAssertEqual(result.sanitizedText, "A\n\nB") - } - - func testPipelineReusesSanitizerAndProducesStableResultsAcrossCalls() { - let pipeline = STMarkdownPipeline() - let input = """ - Example - - - - Tail - """ - - let first = pipeline.process(input) - let second = pipeline.process(input) - - XCTAssertEqual(first.sanitizedMarkdown, second.sanitizedMarkdown) - XCTAssertEqual(first.appliedRules, second.appliedRules) - XCTAssertEqual(first.renderDocument, second.renderDocument) - XCTAssertEqual(first.sanitizedMarkdown, "[Example](https://example.com)\n\nTail") - XCTAssertTrue(first.appliedRules.contains("STHtmlLinkToMarkdownRule")) - XCTAssertTrue(first.appliedRules.contains("STDoubleNewlineRule")) - } - - // MARK: - STMarkdownMathNormalizer 补齐 - - func testMathNormalizerHandlesSameLineDollarBlock() { - // $$formula$$ 同行开闭 - let input = "前文\n\n$$a+b$$\n\n后文" - let result = STMarkdownMathNormalizer.normalizeBlocks(in: input) - - XCTAssertEqual(result.blockMap.count, 1, "同行 $$...$$ 应被识别为块公式") - XCTAssertEqual(result.blockMap[0], "a+b") - XCTAssertTrue(result.text.contains("{{ST_MATH_BLOCK:0}}")) - } - - func testMathNormalizerHandlesSameLineBracketBlock() { - // \[formula\] 同行开闭 - let input = #"前文\n\n\[x=1\]\n\n后文"# - .replacingOccurrences(of: "\\n", with: "\n") - let result = STMarkdownMathNormalizer.normalizeBlocks(in: input) - - XCTAssertEqual(result.blockMap.count, 1, "同行 \\[...\\] 应被识别为块公式") - XCTAssertEqual(result.blockMap[0], "x=1") - } - - func testMathNormalizerHandlesUnterminatedDollarBlockAsEof() { - // $$ 未闭合 → 到 EOF 也应完成收集,不崩溃 - let input = "前文\n\n$$\nE = mc^2\n继续一行" - let result = STMarkdownMathNormalizer.normalizeBlocks(in: input) - - XCTAssertEqual(result.blockMap.count, 1, "未闭合块应兜底产出一条") - XCTAssertTrue(result.blockMap[0]?.contains("E = mc^2") == true) - } - - func testMathNormalizerRecognizesMultipleMathEnvironments() { - let environments = ["equation", "gather", "cases", "pmatrix"] - for env in environments { - let input = """ - 前文 - - \\begin{\(env)} - x - \\end{\(env)} - - 后文 - """ - let result = STMarkdownMathNormalizer.normalizeBlocks(in: input) - XCTAssertEqual(result.blockMap.count, 1, "环境 \(env) 应被识别") - XCTAssertTrue( - result.blockMap[0]?.contains("\\begin{\(env)}") == true, - "应保留 \\begin{\(env)}" - ) - XCTAssertTrue( - result.blockMap[0]?.contains("\\end{\(env)}") == true, - "应保留 \\end{\(env)}" - ) - } - } - - func testMathNormalizerIgnoresUnsupportedEnvironment() { - // 未注册的环境不应被当作 math block,应当作普通文本保留 - let input = """ - 前文 - - \\begin{foo} - x - \\end{foo} - - 后文 - """ - let result = STMarkdownMathNormalizer.normalizeBlocks(in: input) - XCTAssertTrue(result.blockMap.isEmpty, "未支持的环境不应被抽成 math block") - XCTAssertTrue(result.text.contains("\\begin{foo}")) - XCTAssertTrue(result.text.contains("\\end{foo}")) - } - - func testSplitInlineMathRecognizesBracketDisplayModeInline() { - // 行内 \[x\] 应被识别为 isDisplayMode == true - let nodes = STMarkdownMathNormalizer.splitInlineMath(in: #"前 \[a+b\] 后"#) - - XCTAssertEqual(nodes.count, 3) - XCTAssertEqual(nodes[0], .text("前 ")) - XCTAssertEqual(nodes[1], .inlineMath("a+b", isDisplayMode: true)) - XCTAssertEqual(nodes[2], .text(" 后")) - } - - func testSplitInlineMathReturnsEmptyForEmptyInput() { - let nodes = STMarkdownMathNormalizer.splitInlineMath(in: "") - XCTAssertTrue(nodes.isEmpty, "空输入应返回空数组") - } - - func testSplitInlineMathReturnsSingleTextWhenNoFormula() { - let nodes = STMarkdownMathNormalizer.splitInlineMath(in: "纯文本") - XCTAssertEqual(nodes, [.text("纯文本")]) - } - - // MARK: - STMarkdownSoftBreakCollapsingNormalizer 补齐 - - func testSoftBreakNormalizerCollapsesInsideHeading() { - let document = STMarkdownDocument( - blocks: [ - .heading(level: 2, content: [ - .text("A"), - .softBreak, - .softBreak, - .text("B"), - ]) - ] - ) - let normalized = STMarkdownSoftBreakCollapsingNormalizer().normalize(document) - - guard case .heading(let level, let content)? = normalized.blocks.first else { - return XCTFail("Expected heading") - } - XCTAssertEqual(level, 2) - XCTAssertEqual(content, [.text("A"), .softBreak, .text("B")]) - } - - func testSoftBreakNormalizerRecursesIntoEmphasisStrongLinkStrikethrough() { - let document = STMarkdownDocument( - blocks: [ - .paragraph([ - .emphasis([.text("a"), .softBreak, .softBreak, .text("b")]), - .strong([.text("c"), .softBreak, .softBreak, .text("d")]), - .link(destination: "https://x.com", children: [ - .text("e"), .softBreak, .softBreak, .text("f") - ]), - .strikethrough([.text("g"), .softBreak, .softBreak, .text("h")]), - ]) - ] - ) - let normalized = STMarkdownSoftBreakCollapsingNormalizer().normalize(document) - - guard case .paragraph(let inlines)? = normalized.blocks.first else { - return XCTFail("Expected paragraph") - } - - func softBreakCount(_ nodes: [STMarkdownInlineNode]) -> Int { - nodes.reduce(into: 0) { acc, node in - if case .softBreak = node { acc += 1 } - } - } - - for node in inlines { - switch node { - case .emphasis(let c), .strong(let c), .strikethrough(let c): - XCTAssertEqual(softBreakCount(c), 1, "子节点相邻 softBreak 应被折叠") - case .link(_, let c): - XCTAssertEqual(softBreakCount(c), 1, "link 子节点相邻 softBreak 应被折叠") - default: - break - } - } - } - - func testSemanticNormalizerPassthroughKeepsDocumentIntact() { - let document = STMarkdownDocument( - blocks: [ - .paragraph([.text("A"), .softBreak, .softBreak, .text("B")]) - ] - ) - let normalized = STMarkdownSemanticNormalizer.passthrough.normalize(document) - // passthrough 应原样返回,不折叠相邻 softBreak - XCTAssertEqual(normalized, document) - } - - func testSemanticNormalizerChainsMultipleNormalizersInOrder() { - struct TagNormalizer: STMarkdownSemanticNormalizing { - let tag: String - func normalize(_ document: STMarkdownDocument) -> STMarkdownDocument { - let blocks = document.blocks.map { block -> STMarkdownBlockNode in - if case .paragraph(let inlines) = block { - return .paragraph(inlines + [.text(self.tag)]) - } - return block - } - return STMarkdownDocument( - blocks: blocks, - footnoteDefinitions: document.footnoteDefinitions - ) - } - } - - let composite = STMarkdownSemanticNormalizer( - normalizers: [TagNormalizer(tag: "_1"), TagNormalizer(tag: "_2")] - ) - let normalized = composite.normalize( - STMarkdownDocument(blocks: [.paragraph([.text("X")])]) - ) - - guard case .paragraph(let inlines)? = normalized.blocks.first else { - return XCTFail("Expected paragraph") - } - XCTAssertEqual(inlines, [.text("X"), .text("_1"), .text("_2")], - "normalizer 应按注册顺序依次应用") - } - - // MARK: - STMarkdownRenderListItem 契约 - - func testRenderListItemContentAndChildBlocksWhenFirstBlockIsNotParagraph() { - // 以 codeBlock 开头 → content 返回 [],childBlocks 返回全部 blocks - let codeFirst = STMarkdownRenderListItem( - blocks: [ - .codeBlock(language: "swift", code: "x"), - .paragraph([.text("尾段")]), - ], - ordered: false, - level: 0, - orderedIndex: nil - ) - XCTAssertTrue(codeFirst.content.isEmpty, "首块非 paragraph 时 content 应为空") - XCTAssertEqual(codeFirst.childBlocks.count, 2, - "首块非 paragraph 时 childBlocks 应返回完整 blocks") - } - - func testRenderListItemContentAndChildBlocksWhenFirstBlockIsParagraph() { - let paraFirst = STMarkdownRenderListItem( - blocks: [ - .paragraph([.text("首段")]), - .codeBlock(language: nil, code: "x"), - ], - ordered: false, - level: 0, - orderedIndex: nil - ) - XCTAssertEqual(paraFirst.content, [.text("首段")]) - XCTAssertEqual(paraFirst.childBlocks.count, 1, "应剥掉首段后仅剩子块") - if case .codeBlock = paraFirst.childBlocks.first {} else { - XCTFail("剩余子块应为 codeBlock") - } - } - - // MARK: - STMarkdownStructureParser 补齐 - - func testParserNormalizesLinkDestinationTrimsWhitespace() { - let parser = STMarkdownStructureParser() - // swift-markdown 不允许 destination 里有未转义空白,这里用 `<…>` 形式构造可解析的空白 destination - let doc = parser.parse("[t](< https://example.com >)") - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("Expected paragraph") - } - var destination: String? - for node in inlines { - if case .link(let d, _) = node { destination = d; break } - } - XCTAssertEqual(destination, "https://example.com", - "normalizeLinkDestination 应去除首尾空白") - } - - // MARK: - Rendering 代码审核回归测试 - - /// 回归:`STMarkdownDefaultMathRenderer.normalize` 早期把 `\\(` 写成 raw-string `#"\\("#`, - /// 该字面量实际去匹配两个反斜杠+括号,永远不会命中真实的 `\(...\)` 分隔符。 - /// 修复后,分隔符应被正确剥离。 - func testDefaultMathRendererStripsLatexDelimiters() { - let renderer = STMarkdownDefaultMathRenderer() - let rendered = renderer.renderInlineMath( - formula: #"\(x+y\)"#, - style: .default, - baseFont: .systemFont(ofSize: 16), - textColor: .label - ) - XCTAssertNotNil(rendered) - XCTAssertFalse(rendered?.string.contains(#"\("#) ?? true, - "inline math 分隔符 `\\(` 应被剥离") - XCTAssertFalse(rendered?.string.contains(#"\)"#) ?? true, - "inline math 分隔符 `\\)` 应被剥离") - XCTAssertTrue(rendered?.string.contains("x") == true) - XCTAssertTrue(rendered?.string.contains("y") == true) - } - - func testDefaultMathRendererStripsBracketBlockDelimiters() { - let renderer = STMarkdownDefaultMathRenderer() - let rendered = renderer.renderBlockMath( - formula: #"\[a=b\]"#, - style: .default - ) - XCTAssertNotNil(rendered) - XCTAssertFalse(rendered?.string.contains(#"\["#) ?? true, - "block math 分隔符 `\\[` 应被剥离") - XCTAssertFalse(rendered?.string.contains(#"\]"#) ?? true, - "block math 分隔符 `\\]` 应被剥离") - } - - func testHighFidelityMathRendererRendersBlockAttachmentAndStripsDelimiters() { - let renderer = STMarkdownHighFidelityMathRenderer() - let rendered = renderer.renderBlockMath(formula: #"\[x+y\]"#, style: .default) - - XCTAssertNotNil(rendered) - XCTAssertNotNil(rendered?.attribute(.attachment, at: 0, effectiveRange: nil) as? NSTextAttachment) - XCTAssertFalse(rendered?.string.contains(#"\["#) ?? true) - XCTAssertFalse(rendered?.string.contains(#"\]"#) ?? true) - let paragraphStyle = rendered?.attribute(.paragraphStyle, at: 0, effectiveRange: nil) as? NSParagraphStyle - XCTAssertEqual(paragraphStyle?.alignment, .center) - } - - /// 回归:列表项若首块是非 paragraph(codeBlock/quote/list/table), - /// 之前 marker 后面不补换行会与块内容挤在同一行。 - /// 修复后 marker 与 trailing 子块之间应存在换行。 - func testAttributedStringRendererSeparatesMarkerFromNonParagraphLeadingBlock() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .list([ - STMarkdownRenderListItem( - blocks: [ - .codeBlock(language: "swift", code: "let x = 1") - ], - ordered: false, - level: 0, - orderedIndex: nil - ) - ]) - ] - ) - let attributed = renderer.render(document: document) - // marker 行应当单独一行,且下一行才是代码块内容 - let lines = attributed.string.components(separatedBy: "\n") - XCTAssertGreaterThanOrEqual(lines.count, 2, - "marker 与 codeBlock 之间应有换行") - XCTAssertTrue(lines[0].contains("●") || lines[0].contains("○"), - "首行应包含 list marker") - } - - /// 回归:引用块(quote)之前只在开头插一个 `┃ ` 前缀,多段引用视觉断裂。 - /// 修复后每个非空段落起点都应插入左竖线。 - func testAttributedStringRendererQuoteAppliesPrefixToEachParagraph() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .quote([ - .paragraph([.text("第一段")]), - .paragraph([.text("第二段")]), - ]) - ] - ) - let attributed = renderer.render(document: document) - // 两段引用 → 竖线至少出现两次 - let prefixChar: Character = "▎" - let count = attributed.string.filter { $0 == prefixChar }.count - XCTAssertGreaterThanOrEqual(count, 2, - "多段引用块应对每一段都补左竖线") - } - - /// 回归:`STMarkdownStyle.blockquoteLineColor` 之前是 dead config,总是硬编码 `UIColor.systemGray`。 - /// 修复后自定义颜色应生效。 - func testAttributedStringRendererQuoteHonorsBlockquoteLineColor() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - blockquoteLineColor: .red - ) - let renderer = STMarkdownAttributedStringRenderer(style: style) - let document = STMarkdownRenderDocument( - blocks: [.quote([.paragraph([.text("引用")])])] - ) - let attributed = renderer.render(document: document) - // 找出竖线字符的位置,读它的前景色 - guard let index = attributed.string.firstIndex(of: "▎") else { - return XCTFail("应存在左竖线字符") - } - let nsIndex = attributed.string.utf16.distance( - from: attributed.string.utf16.startIndex, - to: index.samePosition(in: attributed.string.utf16) ?? attributed.string.utf16.startIndex - ) - let color = attributed.attribute(.foregroundColor, at: nsIndex, effectiveRange: nil) as? UIColor - XCTAssertEqual(color, .red, "竖线颜色应来自 style.blockquoteLineColor") - } - - /// 回归:`STMarkdownAttributedStringRenderer.renderTable` 的内建 fallback 早期只取 - /// `renderInline(...).string`,把粗体/斜体/链接全部丢掉。修复后应复用 - /// `STMarkdownDefaultTableRenderer`,至少保留等宽对齐+表头分隔。 - func testAttributedStringRendererFallbackTableUsesSeparator() { - let renderer = STMarkdownAttributedStringRenderer() - let document = STMarkdownRenderDocument( - blocks: [ - .table( - STMarkdownTableModel( - header: [ - [.text("A")], - [.text("B")], - ], - rows: [ - [[.text("1")], [.text("2")]] - ] - ) - ) - ] - ) - let attributed = renderer.render(document: document) - XCTAssertTrue(attributed.string.contains("┼"), - "fallback table 应包含表头分隔符") - } - - /// 回归:`STMarkdownDefaultTableRenderer.columnWidths` 基于 `String.count`, - /// CJK 字符在等宽字体里占两格会导致列对齐错位。修复后应使用 - /// East Asian Width 近似,中文整列 pad 后宽度一致。 - func testDefaultTableRendererAlignsCJKColumns() { - let table = STMarkdownTableModel( - header: [ - [.text("中文")], - [.text("x")], - ], - rows: [ - [[.text("a")], [.text("中文")]] - ] - ) - let rendered = STMarkdownDefaultTableRenderer().renderTable(table, style: .default) - XCTAssertNotNil(rendered) - // 输出形如 `header\n\nseparator\ndata`,过滤空行后取第一/最后行做对齐校验。 - let lines = rendered!.string - .components(separatedBy: "\n") - .filter { $0.isEmpty == false } - XCTAssertGreaterThanOrEqual(lines.count, 3, - "应包含表头、分隔、数据三行") - func displayWidth(_ s: String) -> Int { - s.unicodeScalars.reduce(0) { acc, scalar in - let v = scalar.value - let isWide = (0x4E00...0x9FFF).contains(v) - || (0x3000...0x303F).contains(v) - || (0xFF00...0xFFEF).contains(v) - return acc + (isWide ? 2 : 1) - } - } - let headerWidth = displayWidth(lines[0]) - let dataWidth = displayWidth(lines[lines.count - 1]) - XCTAssertEqual( - headerWidth, - dataWidth, - "表头行与数据行的显示宽度应相同,CJK 对齐不能错位(header=\(lines[0]), data=\(lines.last ?? ""))" - ) - } - - /// 回归:`STMarkdownCodeBlockSupport.keywordPatterns` 里早期有一行 - /// `.replacingOccurrences(of: "\\(joined)", with: joined)`, - /// 但字符串插值阶段 `\(joined)` 已被替换,这是无意义代码。 - /// 修复后仍能正确匹配 Swift 关键字并高亮。 - func testCodeSyntaxHighlighterAppliesKeywordColorForSwift() { - let style = STMarkdownStyle.default - let paragraphStyle = NSMutableParagraphStyle() - let highlighted = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: "swift", - code: "let x = 1", - font: .monospacedSystemFont(ofSize: 14, weight: .regular), - textColor: style.textColor, - paragraphStyle: paragraphStyle - ) - // "let" 起始位置应被染成 keyword 色(systemBlue),非 textColor - let color = highlighted.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor - XCTAssertNotNil(color) - XCTAssertNotEqual(color, style.textColor, - "Swift 关键字应被染色,而不是保持默认 textColor") - } - - func testCodeSyntaxHighlighterCoversStringCommentNumberTypeAndTagBranches() { - let style = STMarkdownStyle.default - let paragraphStyle = NSMutableParagraphStyle() - func color(in attributed: NSAttributedString, for needle: String) -> UIColor? { - let range = (attributed.string as NSString).range(of: needle) - guard range.location != NSNotFound else { return nil } - return attributed.attribute(.foregroundColor, at: range.location, effectiveRange: nil) as? UIColor - } - - let js = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: "javascript", - code: #"const name = "Ada"; // comment"#, - font: .monospacedSystemFont(ofSize: 14, weight: .regular), - textColor: style.textColor, - paragraphStyle: paragraphStyle - ) - XCTAssertNotEqual(color(in: js, for: "const"), style.textColor) - XCTAssertNotEqual(color(in: js, for: #""Ada""#), style.textColor) - XCTAssertNotEqual(color(in: js, for: "// comment"), style.textColor) - - let python = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: "python", - code: "value = 42 # note", - font: .monospacedSystemFont(ofSize: 14, weight: .regular), - textColor: style.textColor, - paragraphStyle: paragraphStyle - ) - XCTAssertNotEqual(color(in: python, for: "42"), style.textColor) - XCTAssertNotEqual(color(in: python, for: "# note"), style.textColor) - - let typed = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: "swift", - code: "let name: String = nil", - font: .monospacedSystemFont(ofSize: 14, weight: .regular), - textColor: style.textColor, - paragraphStyle: paragraphStyle - ) - XCTAssertNotEqual(color(in: typed, for: "String"), style.textColor) - - let html = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: "html", - code: #"Link"#, - font: .monospacedSystemFont(ofSize: 14, weight: .regular), - textColor: style.textColor, - paragraphStyle: paragraphStyle - ) - XCTAssertNotEqual(color(in: html, for: "B", theme: .light) - // 这里只校验不会崩溃以及类型契约;具体缓存写入需要 WKWebView 异步流程。 - XCTAssertTrue(initial == nil || initial != nil) - } - - /// 回归 #28:嵌在 link 里的 inline image attachment 也应继承 `.link` 属性, - /// 否则点击 attachment glyph 不会被识别为链接。 - func testInlineImageAttachmentInheritsLinkAttributeFromSurroundingContext() { - let renderer = STMarkdownAttributedStringRenderer( - advancedRenderers: STMarkdownAdvancedRenderers( - imageRenderer: STMarkdownDefaultImageRenderer() - ) - ) - let document = STMarkdownRenderDocument( - blocks: [ - .paragraph([ - .link(destination: "https://example.com", children: [ - .image(source: "https://example.com/x.png", alt: "x", title: nil) - ]) - ]) - ] - ) - let attributed = renderer.render(document: document) - let link = attributed.attribute(.link, at: 0, effectiveRange: nil) as? URL - XCTAssertEqual(link?.absoluteString, "https://example.com", - "inline image attachment 应继承外层链接 destination") - } - - /// 回归 #15:`rgbaKey` 早期对动态颜色(dark/light)只能取 `description`, - /// 修复后会 `resolvedColor(with:)` 后再取 RGBA,避免缓存错命中。 - func testCodeBlockCacheKeyRespondsToTraitChanges() { - // 同一 code + 同一 style 但 background 是 dynamic color: - // 缓存命中行为需依赖 trait collection 解析后的真实 RGBA。 - let dynamicColor = UIColor { trait in - trait.userInterfaceStyle == .dark ? .black : .white - } - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - codeBlockBackgroundColor: dynamicColor, - renderWidth: 200 - ) - let attachment1 = STMarkdownCodeBlockAttachment(language: "swift", code: "let x = 1", style: style) - XCTAssertNotNil(attachment1.image) - // 二次构造命中缓存(同 trait,同 style) - let attachment2 = STMarkdownCodeBlockAttachment(language: "swift", code: "let x = 1", style: style) - XCTAssertEqual(attachment1.image?.size, attachment2.image?.size) - } - - // MARK: - 第三轮 Rendering 修复回归 - - /// 回归 #11:`STMarkdownAsyncImageRenderer` 通过 `baseURL` 解析相对路径。 - func testAsyncImageRendererResolvesRelativeURLAgainstBase() { - let loader = MockImageLoader() - let base = URL(string: "https://example.com/articles/")! - let renderer = STMarkdownAsyncImageRenderer(loader: loader, baseURL: base) - - let rendered = renderer.renderImage( - url: "../assets/x.png", - altText: "x", - title: nil, - style: .default, - placement: .inline - ) - XCTAssertNotNil(rendered) - XCTAssertEqual(loader.lastURL?.absoluteString, "https://example.com/assets/x.png", - "相对路径应基于 baseURL 解析") - } - - /// 回归 #11:未提供 baseURL 时,相对路径仍应被拒绝(return nil → 上层走占位文本)。 - func testAsyncImageRendererRejectsRelativeURLWithoutBaseURL() { - let loader = MockImageLoader() - let renderer = STMarkdownAsyncImageRenderer(loader: loader) - let rendered = renderer.renderImage( - url: "./image.png", - altText: "", - title: nil, - style: .default, - placement: .block - ) - XCTAssertNil(rendered) - XCTAssertNil(loader.lastURL) - } - - /// 回归 #30:block 图像最大尺寸可通过 `blockMaxSize` 自定义。 - func testAsyncImageRendererHonorsCustomBlockMaxSize() { - let loader = DeferredMockImageLoader() - let renderer = STMarkdownAsyncImageRenderer( - loader: loader, - blockMaxSize: CGSize(width: 100, height: 80) - ) - let attributed = renderer.renderImage( - url: "https://example.com/wide.png", - altText: "", - title: nil, - style: .default, - placement: .block - ) - guard let attachment = attributed?.attribute(.attachment, at: 0, effectiveRange: nil) as? STMarkdownAsyncImageAttachment else { - return XCTFail("Expected async image attachment") - } - let bigImage = UIGraphicsImageRenderer(size: CGSize(width: 800, height: 400)).image { context in - UIColor.systemBlue.setFill() - context.fill(CGRect(x: 0, y: 0, width: 800, height: 400)) - } - let expectation = self.expectation(description: "image refresh") - let observation = attachment.addDisplayObserver { expectation.fulfill() } - loader.complete(with: bigImage) - wait(for: [expectation], timeout: 1) - _ = observation - XCTAssertLessThanOrEqual(attachment.bounds.width, 100.5, - "block 图宽度应受 blockMaxSize 约束") - XCTAssertLessThanOrEqual(attachment.bounds.height, 80.5, - "block 图高度应受 blockMaxSize 约束") - } - - /// 回归 #26:`inlineCodeBackgroundColor` 应被 inline code 渲染采用。 - func testInlineCodeAppliesBackgroundColorFromStyle() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - inlineCodeBackgroundColor: .yellow - ) - let renderer = STMarkdownAttributedStringRenderer(style: style) - let document = STMarkdownRenderDocument( - blocks: [.paragraph([.code("inline")])] - ) - let attributed = renderer.render(document: document) - let bg = attributed.attribute(.backgroundColor, at: 0, effectiveRange: nil) as? UIColor - XCTAssertEqual(bg, .yellow, "inline code 背景应取自 style.inlineCodeBackgroundColor") - } - - /// 回归 #5 余项:`STMarkdownDefaultHorizontalRuleRenderer` 在没有 - /// `horizontalRuleColor` 时退回 `dividerColor`(之前是 dead config)。 - func testHorizontalRuleFallsBackToDividerColor() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - dividerColor: .systemGreen - ) - let attributed = STMarkdownDefaultHorizontalRuleRenderer().renderHorizontalRule(style: style) - let color = attributed?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor - XCTAssertEqual(color, .systemGreen, - "horizontalRuleColor 缺省时应使用 dividerColor") - } - - /// 回归 #5 余项:`STMarkdownStyle.blockquoteIndentation` 之前完全是 dead config。 - /// 修复后正向缩进应反映到段落 paragraphStyle 上。 - func testQuoteIndentationAppliesToParagraphStyle() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - blockquoteIndentation: 24 - ) - let renderer = STMarkdownAttributedStringRenderer(style: style) - let document = STMarkdownRenderDocument( - blocks: [.quote([.paragraph([.text("引用")])])] - ) - let attributed = renderer.render(document: document) - guard let textRange = attributed.string.range(of: "引用") else { - return XCTFail("找不到引用文本位置") - } - let nsLocation = attributed.string.utf16.distance( - from: attributed.string.utf16.startIndex, - to: textRange.lowerBound.samePosition(in: attributed.string.utf16) ?? attributed.string.utf16.startIndex - ) - let paragraphStyle = attributed.attribute( - .paragraphStyle, - at: nsLocation, - effectiveRange: nil - ) as? NSParagraphStyle - XCTAssertNotNil(paragraphStyle) - // 缩进生效:headIndent 至少包含 blockquoteIndentation - XCTAssertGreaterThanOrEqual(paragraphStyle?.headIndent ?? 0, 24, - "blockquoteIndentation 应叠加到 headIndent") - } - - func testQuotePrefixCarriesParagraphStyleAfterIndentation() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - blockquoteIndentation: 24 - ) - let renderer = STMarkdownAttributedStringRenderer(style: style) - let document = STMarkdownRenderDocument( - blocks: [.quote([.paragraph([.text("引用")])])] - ) - - let attributed = renderer.render(document: document) - guard let prefixIndex = attributed.string.firstIndex(of: "▎") else { - return XCTFail("应存在引用竖线") - } - let nsLocation = attributed.string.utf16.distance( - from: attributed.string.utf16.startIndex, - to: prefixIndex.samePosition(in: attributed.string.utf16) ?? attributed.string.utf16.startIndex - ) - let paragraphStyle = attributed.attribute( - .paragraphStyle, - at: nsLocation, - effectiveRange: nil - ) as? NSParagraphStyle - - XCTAssertGreaterThanOrEqual(paragraphStyle?.headIndent ?? 0, 24, - "引用竖线应携带与正文一致的 paragraphStyle") - } - - func testHighFidelityMathRendererFallsBackOffMainThread() { - let expectation = self.expectation(description: "background render") - var renderedString: String? - var hasAttachment = false - - DispatchQueue.global(qos: .userInitiated).async { - let renderer = STMarkdownHighFidelityMathRenderer() - let rendered = renderer.renderInlineMath( - formula: "x^2", - style: .default, - baseFont: .systemFont(ofSize: 16), - textColor: .label - ) - renderedString = rendered?.string - if let rendered, rendered.length > 0 { - hasAttachment = rendered.attribute(.attachment, at: 0, effectiveRange: nil) != nil - } - expectation.fulfill() - } - - wait(for: [expectation], timeout: 1) - XCTAssertEqual(renderedString, "x2") - XCTAssertFalse(hasAttachment, "后台线程应走默认数学文本 fallback,而不是触碰 UIView 渲染 attachment") - } - - func testAsyncImageRendererFallsBackWhenBlockMaxSizeIsInvalid() { - let loader = DeferredMockImageLoader() - let renderer = STMarkdownAsyncImageRenderer( - loader: loader, - blockMaxSize: CGSize(width: 0, height: -1) - ) - let attributed = renderer.renderImage( - url: "https://example.com/wide.png", - altText: "", - title: nil, - style: .default, - placement: .block - ) - guard let attachment = attributed?.attribute(.attachment, at: 0, effectiveRange: nil) as? STMarkdownAsyncImageAttachment else { - return XCTFail("Expected async image attachment") - } - let image = UIGraphicsImageRenderer(size: CGSize(width: 560, height: 280)).image { context in - UIColor.systemBlue.setFill() - context.fill(CGRect(x: 0, y: 0, width: 560, height: 280)) - } - let expectation = self.expectation(description: "image refresh") - let observation = attachment.addDisplayObserver { expectation.fulfill() } - - loader.complete(with: image) - wait(for: [expectation], timeout: 1) - _ = observation - - XCTAssertEqual(attachment.bounds.width, 280, accuracy: 0.5) - XCTAssertEqual(attachment.bounds.height, 140, accuracy: 0.5) - } - - // MARK: - 第四轮 Rendering 修复回归 - - /// 回归 #25:`STMarkdownCodeBlockAttachment.configureRenderCache(countLimit:)` 可调整上限。 - /// 清空缓存后再次构造应命中新的绘制路径,而不复用历史结果。 - func testCodeBlockAttachmentConfigurableRenderCache() { - addTeardownBlock { - STMarkdownCodeBlockAttachment.configureRenderCache(countLimit: 48) - STMarkdownCodeBlockAttachment.clearRenderCache() - } - STMarkdownCodeBlockAttachment.configureRenderCache(countLimit: 8) - STMarkdownCodeBlockAttachment.clearRenderCache() - let style = STMarkdownStyle.default - let first = STMarkdownCodeBlockAttachment(language: "swift", code: "let x = 1", style: style) - XCTAssertNotNil(first.image) - // 清空后强制重新绘制,图像大小仍应保持一致(配置 countLimit 不影响渲染结果) - STMarkdownCodeBlockAttachment.clearRenderCache() - let second = STMarkdownCodeBlockAttachment(language: "swift", code: "let x = 1", style: style) - XCTAssertEqual(first.image?.size, second.image?.size) - } - - /// 回归 #13:`STMarkdownCodeBlockRenderingPresets` 作为 facade 暴露三个 code block - /// renderer 的 typealias,消除调用方在名字相似的实现间纠结。 - func testCodeBlockRenderingPresetsTypealiasesMapToExistingRenderers() { - _ = STMarkdownCodeBlockRenderingPresets.PlainText() - _ = STMarkdownCodeBlockRenderingPresets.StaticAttachment() - _ = STMarkdownCodeBlockRenderingPresets.RichAttachment() - } - - /// 回归 #31:`boundingRect` 已经把 paragraphStyle.lineSpacing 纳入高度, - /// 修复不应再按估算行数二次叠加 lineSpacing,避免代码块被过早折叠。 - func testCodeBlockAttachmentLineSpacingDoesNotTriggerPrematureCollapse() { - STMarkdownCodeBlockAttachment.clearRenderCache() - let largeSpacingStyle = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - bodyLineSpacing: 12, - renderWidth: 240 - ) - let tightStyle = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 24, - kern: 0, - bodyLineSpacing: 0, - renderWidth: 240 - ) - let multiLineCode = "line1\nline2\nline3\nline4\nline5\nline6" - let wide = STMarkdownCodeBlockAttachment(language: "swift", code: multiLineCode, style: largeSpacingStyle) - let tight = STMarkdownCodeBlockAttachment(language: "swift", code: multiLineCode, style: tightStyle) - - XCTAssertGreaterThan( - wide.renderedBodyHeight, - tight.renderedBodyHeight, - "bodyLineSpacing 增大时,TextKit 测量高度应自然变大" - ) - XCTAssertFalse( - wide.isCollapsed, - "lineSpacing 不应被二次叠加到触发过早折叠" - ) - XCTAssertLessThan( - wide.renderedBodyHeight - tight.renderedBodyHeight, - 80, - "高度差应接近真实行间距增量,不能按错误估算行数过度放大" - ) - } - - func testMalformedTableNormalizerRemovesStandalonePipeRow() { - let raw = """ -| a | b | -| --- | --- | -| 1 | 2 | -|| -| 3 | 4 | -""" - let fixed = STMarkdownMalformedTableNormalizer.normalize(raw) - let trimmedLines = fixed.split(separator: "\n").map { - $0.trimmingCharacters(in: .whitespaces) - } - XCTAssertFalse(trimmedLines.contains("||")) - } - - func testMalformedTableNormalizerRemovesSpuriousBlankInsideTable() { - let raw = """ -| a | b | -| --- | --- | -| 1 | 2 | - -| 3 | 4 | -""" - let fixed = STMarkdownMalformedTableNormalizer.normalize(raw) - XCTAssertFalse(fixed.contains("| 1 | 2 |\n\n| 3 |")) - } - - func testPlainTextStreamingHeuristic() { - XCTAssertTrue(STMarkdownStreamingTextView.isLikelyMarkdownFreePlainText("Hello world")) - XCTAssertFalse(STMarkdownStreamingTextView.isLikelyMarkdownFreePlainText("# Title")) - } - - func testStreamBufferDefersUnclosedFence() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 5) - let r1 = buffer.append("```swift\nlet x = 1") - XCTAssertTrue(r1.completeModules.isEmpty) - XCTAssertTrue(r1.hasPendingStructure) - XCTAssertEqual(r1.pendingType, .codeBlock) - XCTAssertTrue(buffer.committedSafePrefix.isEmpty) - } - - func testStreamBufferFlushReleasesTail() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 5) - _ = buffer.append("```\npartial") - XCTAssertTrue(buffer.committedSafePrefix.isEmpty) - let tail = buffer.flush() - XCTAssertFalse(tail.isEmpty) - XCTAssertEqual(buffer.committedSafePrefix, buffer.fullAccumulatedText) - } - - func testStreamBufferSplitsOnSecondH1() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 2) - _ = buffer.append("# A\n\nAlpha paragraph with enough characters.\n\n") - // 前导换行使「未提交起点」严格早于第二个 H1 行首,避免边界与起点重合导致本帧无模块输出。 - let r2 = buffer.append("\n# B\n\nBeta.\n\n") - XCTAssertFalse(r2.completeModules.isEmpty) - XCTAssertTrue(buffer.committedSafePrefix.contains("# A")) - XCTAssertFalse(buffer.committedSafePrefix.contains("# B")) - } - - func testMarkdownStyleStreamMinModuleLengthDefault() { - XCTAssertGreaterThanOrEqual(STMarkdownStyle.default.streamMinModuleLength, 1) - } - - func testLinkUnderlineStyleReflectsStyleFlag() { - var style = STMarkdownStyle.default - style.linkUnderlineEnabled = false - let renderer = STMarkdownAttributedStringRenderer(style: style) - let doc = STMarkdownRenderDocument(blocks: [ - .paragraph([ - .link(destination: "https://example.com", children: [.text("Click")]), - ]), - ]) - let rendered = renderer.render(document: doc) - var foundLink = false - rendered.enumerateAttribute(.link, in: NSRange(location: 0, length: rendered.length)) { value, _, _ in - if value != nil { - foundLink = true - } - } - XCTAssertTrue(foundLink) - let underline = rendered.attribute( - .underlineStyle, - at: 0, - longestEffectiveRange: nil, - in: NSRange(location: 0, length: rendered.length) - ) as? Int - XCTAssertEqual(underline, 0) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownStreamBufferTests.swift b/Example/STBaseProjectExampleTests/STMarkdownStreamBufferTests.swift deleted file mode 100644 index a9f8fc3..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownStreamBufferTests.swift +++ /dev/null @@ -1,115 +0,0 @@ -import XCTest -@testable import STBaseProject - -final class STMarkdownStreamBufferTests: XCTestCase { - - func testSingleHeadingStreamsParagraphByParagraph() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 10) - let markdown = """ - # Title - - Paragraph one is long enough to stream. - - Paragraph two is also long enough. - - """ - let result = buffer.append(markdown) - XCTAssertEqual(result.completeModules.count, 2) - XCTAssertEqual( - result.completeModules[0].trimmingCharacters(in: .whitespacesAndNewlines), - "# Title\n\nParagraph one is long enough to stream." - ) - XCTAssertEqual( - result.completeModules[1].trimmingCharacters(in: .whitespacesAndNewlines), - "Paragraph two is also long enough." - ) - XCTAssertTrue(result.pendingText.isEmpty) - XCTAssertFalse(result.hasPendingStructure) - } - - func testDoubleNewlinesInsideCodeBlocksDoNotCreateParagraphBoundaries() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 10) - let markdown = """ - # Title - - ```swift - let first = 1 - - let second = 2 - ``` - - Closing paragraph is outside the code block. - - """ - let result = buffer.append(markdown) - XCTAssertEqual(result.completeModules.count, 2) - XCTAssertTrue(result.completeModules[0].contains("let second = 2")) - XCTAssertTrue(result.completeModules[0].contains("```swift")) - XCTAssertEqual( - result.completeModules[1].trimmingCharacters(in: .whitespacesAndNewlines), - "Closing paragraph is outside the code block." - ) - XCTAssertTrue(result.pendingText.isEmpty) - } - - func testUnclosedFenceDefersCommitUntilClosingTripleBacktick() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 5) - _ = buffer.append("Intro\n\n```swift\nlet a = 1\n") - XCTAssertTrue(buffer.committedSafePrefix.isEmpty) - XCTAssertEqual(buffer.fullAccumulatedText, "Intro\n\n```swift\nlet a = 1\n") - - let closed = buffer.append("```\n\nDone.\n") - XCTAssertFalse(closed.hasPendingStructure) - XCTAssertFalse(buffer.committedSafePrefix.isEmpty) - XCTAssertTrue(buffer.committedSafePrefix.contains("let a = 1")) - XCTAssertTrue(buffer.committedSafePrefix.contains("Done.")) - } - - func testOddDollarMathFenceReportsLatexPending() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 5) - let r = buffer.append("Text\n\n$$ E = mc^2 ") - XCTAssertTrue(r.hasPendingStructure) - XCTAssertEqual(r.pendingType, .latexBlock) - XCTAssertTrue(r.completeModules.isEmpty) - } - - func testTableRowWithoutTrailingBlankLineDefersAsTablePending() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 5) - let r = buffer.append("| h1 | h2 |\n| -- | -- |\n| a | b |") - XCTAssertTrue(r.hasPendingStructure) - XCTAssertEqual(r.pendingType, .table) - } - - func testChunkSplitAcrossWordsStillCommitsParagraphs() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 8) - _ = buffer.append("Paragraph one is long") - _ = buffer.append(" enough to meet the minimum.\n\n") - _ = buffer.append("Paragraph two is also long enough.\n\n") - XCTAssertFalse(buffer.committedSafePrefix.isEmpty) - XCTAssertTrue(buffer.committedSafePrefix.contains("Paragraph one")) - XCTAssertTrue(buffer.committedSafePrefix.contains("Paragraph two")) - } - - func testMultiAppendWithoutNewSafePrefixKeepsCommittedStable() { - // 1) 使用 `##` 避免单 H1 + `\n\n` 结尾触发的 `shouldDeferCommitAwaitingPossibleSecondTopLevelHeading` 与后续追加的交互。 - // 2) `findModuleBoundaries` 在尾部「未闭合段落」上若 `tailUTF16 >= minModuleLength`,会把 `text.endIndex` - // 并入边界,pending 过长时 committed 会合法地扩展;本用例只追加极少字符,使 tail 仍低于阈值。 - let buffer = STMarkdownStreamBuffer(minModuleLength: 10) - let first = buffer.append("## Section\n\nFirst block is long enough.\n\n") - XCTAssertFalse(first.completeModules.isEmpty) - let committedAfterFirst = buffer.committedSafePrefix - _ = buffer.append("a") - _ = buffer.append("b") - _ = buffer.append("c") - XCTAssertEqual(buffer.committedSafePrefix, committedAfterFirst) - } - - func testFlushExposesFullTextAsCommitted() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 100) - _ = buffer.append("Short") - XCTAssertTrue(buffer.committedSafePrefix.isEmpty) - let tail = buffer.flush() - XCTAssertEqual(tail, "Short") - XCTAssertEqual(buffer.committedSafePrefix, "Short") - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownStreamingHeightStabilityTests.swift b/Example/STBaseProjectExampleTests/STMarkdownStreamingHeightStabilityTests.swift deleted file mode 100644 index 4538858..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownStreamingHeightStabilityTests.swift +++ /dev/null @@ -1,177 +0,0 @@ -// -// STMarkdownStreamingHeightStabilityTests.swift -// STBaseProjectExampleTests -// -// 流式逐字输出场景下:测量 intrinsic 高度与高度回调的稳定性(单调性、动画期无振荡、节流生效)。 -// - -import XCTest -import UIKit -@testable import STBaseProject - -@MainActor -final class STMarkdownStreamingHeightStabilityTests: XCTestCase { - - private func shimmer(for stream: STMarkdownStreamingTextView) -> STShimmerTextView { - stream.contentTextView as! STShimmerTextView - } - - /// 多次 `layoutIfNeeded` 直到 intrinsic 高度在容差内收敛(对齐 TextKit 性能测试中的做法)。 - @discardableResult - private func settleIntrinsicHeight(for view: STMarkdownStreamingTextView, maxPasses: Int = 16) -> CGFloat { - var height = view.intrinsicContentSize.height - for _ in 0.. (UIWindow, UIViewController, STMarkdownStreamingTextView) { - let bounds = CGRect(x: 0, y: 0, width: width, height: height) - let window = UIWindow(frame: bounds) - let vc = UIViewController() - vc.view.bounds = bounds - window.rootViewController = vc - window.makeKeyAndVisible() - - let stream = STMarkdownStreamingTextView(frame: vc.view.bounds) - stream.autoresizingMask = [.flexibleWidth, .flexibleHeight] - stream.preferredContentWidth = width - vc.view.addSubview(stream) - return (window, vc, stream) - } - - /// 逐字追加纯文本(无 Markdown 定界符),开启 stagger:稳定后高度应单调不减。 - func testPerCharacterStreamingIntrinsicHeightMonotonicPlainText() { - let (window, _, stream) = self.makeKeyWindowHost(width: 360, height: 900) - defer { window.isHidden = true } - - stream.tokenFadeDuration = 0.06 - self.shimmer(for: stream).characterStaggerInterval = 0.002 - stream.animateAcrossNewlines = true - - var heights: [CGFloat] = [] - let sentence = "Streaming plain characters without markdown tokens." - for ch in sentence { - stream.appendMarkdownFragment(String(ch), animated: true) - heights.append(self.settleIntrinsicHeight(for: stream)) - } - stream.finishStreaming() - - for i in 1.. Bool) -> STMarkdownBlockNode? { - self.blocks.first(where: predicate) - } -} - -final class STMarkdownStructureParserASTContractTests: XCTestCase { - - // MARK: - P0 #6: 段落内多占位符 + inline AST 保留 - - func testExtractMathBlocks_preservesInlineAST_whenMixedWithStrong() { - // 构造:"看 **公式一** ${{ST_MATH_BLOCK:0}}$ 与 **公式二** ${{ST_MATH_BLOCK:1}}$ 结束" - // 真实输入用 $$…$$ 写在独立行——STMarkdownMathNormalizer 会把它们替换为占位符并隔行; - // 这里我们手动构造一个"占位符与 strong 在同一段落"的边界场景,验证 extractMathBlocks - // 即使遇到这种病理结构也不丢 inline AST。 - // 走的是:先让 normalizer 产出占位符,然后利用 markdown 的 inline 语法把它们拼到同段。 - let parser = STMarkdownStructureParser() - - // 强制把两个块公式与 inline 强调拼到一段:去掉 $$ 前后的空行。 - let markdown = """ - 看 **公式一** - $$ - a = b - $$ - 与 **公式二** - $$ - c = d - $$ - 结束 - """ - - let doc = parser.parse(markdown) - - // 期望:mathBlock 块至少出现两次,并且 strong("公式一")/strong("公式二") 都被保留在 - // 周围段落里——而不是被扁平成 .text("公式一公式二")。 - var mathBlockCount = 0 - var strongTexts: [String] = [] - for block in doc.blocks { - switch block { - case .mathBlock(let latex): - mathBlockCount += 1 - XCTAssertTrue(latex.contains("="), "math 块应保留 LaTeX 内容: \(latex)") - case .paragraph(let inlines): - self.collectStrongTexts(inlines, into: &strongTexts) - default: - break - } - } - - XCTAssertEqual(mathBlockCount, 2, "应识别两个块公式") - XCTAssertTrue(strongTexts.contains("公式一"), "粗体『公式一』应被保留为 strong inline,而不是被扁平化") - XCTAssertTrue(strongTexts.contains("公式二"), "粗体『公式二』应被保留为 strong inline,而不是被扁平化") - } - - // MARK: - P0 #7: 占位符嵌套在 strong/emphasis 内 → 不可识别,走普通段落 - - func testExtractMathBlocks_returnsNil_whenPlaceholderWrappedInStrong() { - let parser = STMarkdownStructureParser() - // 直接喂 swift-markdown 一段把占位符包进 ** 的字面文本——绕过 normalizer,确保 - // 占位符位于 strong 子节点,而不是顶层 Text。 - // 注意:normalizer 不会主动产出这种结构,这里是给 extractMathBlocks 一个"病理输入" - // 验证它的兜底行为:应返回 nil,让段落走普通渲染——而不是悄悄丢掉外层 strong。 - let markdown = "前缀 **{{ST_MATH_BLOCK:0}}** 后缀" - let doc = parser.parse(markdown) - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph,实际为 \(String(describing: doc.blocks.first))") - } - - // 没有 mathBlock,因为 mathMap 里根本没有 0;段落必须保留 strong 结构。 - let strongCount = inlines.reduce(into: 0) { acc, node in - if case .strong = node { acc += 1 } - } - XCTAssertEqual(strongCount, 1, "占位符被包进 strong 时不应丢掉外层 strong 结构") - - // 同时应该没有任何 mathBlock 块被提升出来。 - let hasMathBlock = doc.blocks.contains { if case .mathBlock = $0 { return true }; return false } - XCTAssertFalse(hasMathBlock, "未匹配的占位符不应被升级为 mathBlock 块") - } - - func testExtractMathBlocks_preservesLiteralPlaceholder_whenMathMapMissingAtTopLevel() { - let parser = STMarkdownStructureParser() - let markdown = "前缀 {{ST_MATH_BLOCK:999}} 后缀" - let doc = parser.parse(markdown) - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph,实际为 \(String(describing: doc.blocks.first))") - } - - let renderedText = self.flattenText(inlines) - XCTAssertEqual(renderedText, markdown, "mathMap 缺失时,顶层占位符必须按字面文本保留,不能静默丢弃") - - let hasMathBlock = doc.blocks.contains { if case .mathBlock = $0 { return true }; return false } - XCTAssertFalse(hasMathBlock, "mathMap 缺失时不应生成 mathBlock") - } - - func testExtractMathBlocks_preservesTopLevelLiteralPlaceholdersAndAdjacentInlineAST_whenMathMapMissing() { - let parser = STMarkdownStructureParser() - let doc = parser.parse("前 **粗体** {{ST_MATH_BLOCK:0}} 与 *斜体* {{ST_MATH_BLOCK:1}} 后") - - XCTAssertEqual(doc.blocks.count, 1, "缺失 mathMap 时整段应保留为普通 paragraph") - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望缺失占位符场景保留为 paragraph,实际为 \(String(describing: doc.blocks.first))") - } - - XCTAssertTrue(inlines.contains { if case .strong = $0 { return true }; return false }, "相邻 strong inline 不应被扁平化或丢失") - XCTAssertTrue(inlines.contains { if case .emphasis = $0 { return true }; return false }, "相邻 emphasis inline 不应被扁平化或丢失") - - let text = self.flattenText(inlines) - XCTAssertTrue(text.contains("{{ST_MATH_BLOCK:0}}"), "第一个缺失占位符应按字面保留") - XCTAssertTrue(text.contains("{{ST_MATH_BLOCK:1}}"), "第二个缺失占位符应按字面保留") - } - - // MARK: - P0 #17: Table columnAlignments — center / right / left - - func testTableColumnAlignments_center_right_left() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - | 左 | 中 | 右 | - | :--- | :---: | ---: | - | a | b | c | - """ - ) - - guard let table = doc.firstBlock(where: { if case .table = $0 { return true }; return false }), - case .table(let model) = table else { - return XCTFail("期望识别为表格") - } - - XCTAssertEqual(model.columnAlignments.count, 3, "应解析三列对齐信息") - XCTAssertEqual(model.columnAlignments[safe: 0], .left, "第 1 列 :--- 应为 left") - XCTAssertEqual(model.columnAlignments[safe: 1], .center, "第 2 列 :---: 应为 center") - XCTAssertEqual(model.columnAlignments[safe: 2], .right, "第 3 列 ---: 应为 right") - } - - // MARK: - P1 #11: OrderedList.startIndex 非 1 - - func testOrderedList_startIndex_nonOne() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - 5. 第五 - 6. 第六 - 7. 第七 - """ - ) - - guard let list = doc.firstBlock(where: { if case .list = $0 { return true }; return false }), - case .list(let kind, let items) = list else { - return XCTFail("期望识别为有序列表") - } - - guard case .ordered(let startIndex) = kind else { - return XCTFail("期望 ordered list,得到 \(kind)") - } - XCTAssertEqual(startIndex, 5, "ordered list 应保留 startIndex = 5") - XCTAssertEqual(items.count, 3, "应识别 3 个列表项") - } - - // MARK: - P1 #27: Link destination 归一化(`\/` → `/`) - - func testLinkDestination_normalizesEscapedSlash() { - let parser = STMarkdownStructureParser() - // 在 destination 中混入字面 `\/`,预期 normalizeLinkDestination 还原为 `/`。 - // Markdown 不会原生触发这种内容;它来自上游 JSON 转义未清理干净的 LLM 输出。 - let markdown = #"[官网](https:\/\/example.com\/path)"# - let doc = parser.parse(markdown) - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph") - } - - var foundDestination: String? - for node in inlines { - if case .link(let destination, _) = node { - foundDestination = destination - break - } - } - - guard let destination = foundDestination else { - return XCTFail("应识别为 link inline") - } - XCTAssertFalse(destination.contains(#"\/"#), "link destination 不应保留字面 \\/") - XCTAssertEqual(destination, "https://example.com/path", "link destination 应被归一化为 /") - } - - // MARK: - P1 #21: `\[…\]` 块级数学 - - func testBracketDisplayMath_isRecognizedAsMathBlock() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - #""" - 前文 - - \[ - x = y + 1 - \] - - 后文 - """# - ) - - let mathBlocks = doc.blocks.compactMap { block -> String? in - if case .mathBlock(let latex) = block { return latex } - return nil - } - XCTAssertEqual(mathBlocks.count, 1, "应识别一个 \\[ \\] 块公式") - XCTAssertTrue( - mathBlocks.first?.contains("x = y + 1") ?? false, - "块公式应保留 LaTeX 内容,实际:\(mathBlocks.first ?? "")" - ) - } - - // MARK: - P1 #22: `\begin{align}` 环境块 - - func testAlignEnvironmentBlock_isRecognizedAsMathBlock() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - #""" - 前文 - - \begin{align} - a &= b \\ - c &= d - \end{align} - - 后文 - """# - ) - - let mathBlocks = doc.blocks.compactMap { block -> String? in - if case .mathBlock(let latex) = block { return latex } - return nil - } - XCTAssertEqual(mathBlocks.count, 1, "应识别一个 align 环境块") - XCTAssertTrue( - mathBlocks.first?.contains(#"\begin{align}"#) ?? false, - "应保留 \\begin{align} 起始标记" - ) - XCTAssertTrue( - mathBlocks.first?.contains(#"\end{align}"#) ?? false, - "应保留 \\end{align} 结束标记" - ) - } - - // MARK: - P1 #4: 段落是纯图片 → 单独成 .image 块 - - func testParagraphContainingOnlyImage_becomesImageBlock() { - let parser = STMarkdownStructureParser() - let doc = parser.parse("![示意](https://example.com/x.png)") - - guard let firstBlock = doc.blocks.first else { - return XCTFail("应至少有一个块") - } - - guard case .image(let url, let altText, _) = firstBlock else { - return XCTFail("段落只含一张图片时应升级为 .image block,实际为 \(firstBlock)") - } - XCTAssertEqual(url, "https://example.com/x.png") - XCTAssertEqual(altText, "示意") - } - - // MARK: - P2 # 边界:parse("") → 空文档 - - func testParse_emptyInput_returnsEmptyDocument() { - let parser = STMarkdownStructureParser() - let doc = parser.parse("") - XCTAssertEqual(doc.blocks.count, 0, "空输入应返回空文档(短路)") - } - - // MARK: - P2 #23: 行内公式 `\(…\)` 内容与 isDisplayMode 断言 - - func testInlineMath_parenStyle_preservesContentAndIsNotDisplayMode() { - let parser = STMarkdownStructureParser() - let doc = parser.parse(#"前文 \(x+y\) 后文"#) - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph") - } - - var formula: String? - var displayMode: Bool? - for node in inlines { - if case .inlineMath(let f, let d) = node { - formula = f - displayMode = d - break - } - } - XCTAssertEqual(formula, "x+y", "行内公式应保留 LaTeX 内容(不含定界符)") - XCTAssertEqual(displayMode, false, #"\(...\) 形式应为 isDisplayMode == false"#) - } - - // MARK: - P2 #14: 列表项嵌套块(子列表 / 代码块 / 引用) - - func testListItem_withNestedSublistAndCodeBlock() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - - 父项一 - - 子项一 - - 子项二 - - 父项二 - - ```swift - let x = 1 - ``` - """ - ) - - guard case .list(_, let items)? = doc.blocks.first else { - return XCTFail("期望首块为 list") - } - XCTAssertEqual(items.count, 2, "应有两个父项") - - // 父项一:blocks 里应同时含 paragraph + 嵌套 list - let firstItemBlocks = items[0].blocks - let hasNestedList = firstItemBlocks.contains { if case .list = $0 { return true }; return false } - XCTAssertTrue(hasNestedList, "父项一应包含嵌套的子列表块") - - // 父项二:应含 codeBlock 子块 - let secondItemBlocks = items[1].blocks - let nestedCode = secondItemBlocks.first { if case .codeBlock = $0 { return true }; return false } - guard let nestedCode, case .codeBlock(let lang, let code) = nestedCode else { - return XCTFail("父项二应包含嵌套的 codeBlock 子块") - } - XCTAssertEqual(lang, "swift") - XCTAssertTrue(code.contains("let x = 1")) - } - - // MARK: - P2 #8: BlockQuote 嵌套(quote 里套 list 与 code) - - func testBlockQuote_withNestedListAndCode() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - > 引用首段 - > - > - 引用列表项一 - > - 引用列表项二 - > - > ```swift - > let v = 1 - > ``` - """ - ) - - guard case .quote(let inner)? = doc.blocks.first else { - return XCTFail("期望首块为 quote") - } - - let hasParagraph = inner.contains { if case .paragraph = $0 { return true }; return false } - let hasList = inner.contains { if case .list = $0 { return true }; return false } - let hasCode = inner.contains { if case .codeBlock = $0 { return true }; return false } - XCTAssertTrue(hasParagraph, "quote 内应保留段落子块") - XCTAssertTrue(hasList, "quote 内应保留 list 子块") - XCTAssertTrue(hasCode, "quote 内应保留 codeBlock 子块") - } - - // MARK: - P2 #29: SoftBreak(同一段落跨行) - - func testParagraph_withSoftBreakBetweenLines() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - 第一行 - 第二行 - """ - ) - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph") - } - let softBreakCount = inlines.reduce(into: 0) { acc, node in - if case .softBreak = node { acc += 1 } - } - XCTAssertEqual(softBreakCount, 1, "段落内同一段两行之间应有一个 softBreak") - } - - // MARK: - P3 #2: Heading 4–6 - - func testHeading_levelFourFiveSix() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - #### 四级 - ##### 五级 - ###### 六级 - """ - ) - let levels = doc.blocks.compactMap { block -> Int? in - if case .heading(let level, _) = block { return level } - return nil - } - XCTAssertEqual(levels, [4, 5, 6], "应识别 4/5/6 级标题") - } - - // MARK: - P3 #10: 无 language 的围栏代码块 - - func testCodeBlock_withoutLanguage_hasNilLanguage() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - ``` - plain code - ``` - """ - ) - guard case .codeBlock(let language, let code)? = doc.blocks.first else { - return XCTFail("期望首块为 codeBlock") - } - // swift-markdown 在没有标签时 language 为 nil 或空串;两种都接受。 - XCTAssertTrue(language == nil || language?.isEmpty == true, "无标签围栏的 language 应为 nil/空,实际:\(String(describing: language))") - XCTAssertTrue(code.contains("plain code")) - } - - // MARK: - P3 #28: Image inline 的 alt / source / title 完整断言 - - func testInlineImage_preservesAltSourceAndTitle() { - let parser = STMarkdownStructureParser() - // 段落含其它 inline,强制 image 走 inline 分支而非"段落只含图片→升级 .image 块"。 - let doc = parser.parse(#"前文 ![替代](https://example.com/i.png "标题") 后文"#) - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph") - } - - var foundSource: String? - var foundAlt: String? - var foundTitle: String? - for node in inlines { - if case .image(let source, let alt, let title) = node { - foundSource = source - foundAlt = alt - foundTitle = title - break - } - } - XCTAssertEqual(foundSource, "https://example.com/i.png") - XCTAssertEqual(foundAlt, "替代") - XCTAssertEqual(foundTitle, "标题") - } - - // MARK: - P3 #30: Strikethrough 子节点完整保留 - - func testStrikethrough_preservesNestedTextContent() { - let parser = STMarkdownStructureParser() - let doc = parser.parse("前 ~~删除内容~~ 后") - - guard case .paragraph(let inlines)? = doc.blocks.first else { - return XCTFail("期望首块为 paragraph") - } - - var strikethroughText: String? - for node in inlines { - if case .strikethrough(let children) = node { - strikethroughText = self.flattenText(children) - break - } - } - XCTAssertEqual(strikethroughText, "删除内容", "strikethrough 应保留内部文本") - } - - // MARK: - 私有:递归收集 strong 内的纯文本(用于 P0 #6 的断言) - - private func collectStrongTexts(_ inlines: [STMarkdownInlineNode], into bucket: inout [String]) { - for node in inlines { - switch node { - case .strong(let children): - let text = self.flattenText(children) - if text.isEmpty == false { bucket.append(text) } - self.collectStrongTexts(children, into: &bucket) - case .emphasis(let children), - .strikethrough(let children), - .link(_, let children): - self.collectStrongTexts(children, into: &bucket) - default: - break - } - } - } - - private func flattenText(_ inlines: [STMarkdownInlineNode]) -> String { - var out = "" - for node in inlines { - switch node { - case .text(let raw): out += raw - case .strong(let c), .emphasis(let c), .strikethrough(let c): - out += self.flattenText(c) - case .link(_, let c): - out += self.flattenText(c) - default: - break - } - } - return out - } -} - -private extension Array { - subscript(safe index: Int) -> Element? { - indices.contains(index) ? self[index] : nil - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownStructureParserParseAndRenderIntegrityTests.swift b/Example/STBaseProjectExampleTests/STMarkdownStructureParserParseAndRenderIntegrityTests.swift deleted file mode 100644 index ff23f8a..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownStructureParserParseAndRenderIntegrityTests.swift +++ /dev/null @@ -1,555 +0,0 @@ -// -// STMarkdownStructureParserParseAndRenderIntegrityTests.swift -// STBaseProjectExampleTests -// -// 验证 STMarkdownStructureParser 对常见 Markdown 结构的识别, -// 以及经默认管线 + STMarkdownAttributedStringRenderer 渲染后的纯文本中 -// 不得残留未解析的 Markdown 定界符(标签/语法糖)。 -// - -import XCTest -import STBaseProject - -/// 默认引擎 + 默认属性串渲染器得到的可见字符串(不含 attribute 中的 URL)。 -private func st_renderPlainString(markdown: String) -> String { - let engine = STMarkdownEngine( - configuration: STMarkdownPipelineConfiguration( - enableInputSanitizer: true, - sanitizerRules: STMarkdownInputSanitizer.defaultRules, - debug: false, - semanticNormalizers: [] - ) - ) - let result = engine.process(markdown) - let renderer = STMarkdownAttributedStringRenderer( - style: .default, - advancedRenderers: .empty - ) - return renderer.render(document: result.renderDocument).string -} - -/// 在「我们构造的样例」中,若仍出现在最终可见串里,可视为解析/渲染泄漏的定界片段。 -private func st_assertNoRawMarkdownSyntaxLeaks( - in output: String, - file: StaticString = #filePath, - line: UInt = #line -) { - let forbidden: [(String, String)] = [ - ("**", "粗体定界符"), - ("__", "下划线强调定界符"), - ("~~", "删除线定界符"), - ("```", "代码围栏"), - ("{{ST_MATH_BLOCK:", "块公式内部占位符泄漏"), - ("![", "图片 Markdown 前缀"), - ("$$", "块公式美元定界符"), - ("\\(", #"行内公式 `\(`"#), - ("\\)", #"行内公式 `\)`"#), - ("- [ ]", "任务列表未完成原始语法"), - ("- [x]", "任务列表已完成原始语法(小写 x)"), - ("- [X]", "任务列表已完成原始语法(大写 X)"), - ] - for (token, label) in forbidden { - XCTAssertFalse( - output.contains(token), - "渲染结果不得包含未消费的 Markdown/公式定界片段(\(label)):\(token.debugDescription)", - file: file, - line: line - ) - } -} - -@MainActor -private func st_assertStreamingNoRawMarkdownSyntaxLeaks( - chunks: [String], - file: StaticString = #filePath, - line: UInt = #line -) { - let view = STMarkdownStreamingTextView() - var accumulated = "" - for chunk in chunks { - accumulated += chunk - view.updateStreamingMarkdown(accumulated) - st_assertNoRawMarkdownSyntaxLeaks( - in: view.attributedText.string, - file: file, - line: line - ) - } -} - -private func st_collectInlineKinds(_ nodes: [STMarkdownInlineNode]) -> Set { - var kinds = Set() - func walk(_ nodes: [STMarkdownInlineNode]) { - for node in nodes { - switch node { - case .text: - kinds.insert("text") - case .inlineMath: - kinds.insert("inlineMath") - case .emphasis(let c): - kinds.insert("emphasis") - walk(c) - case .strong(let c): - kinds.insert("strong") - walk(c) - case .code: - kinds.insert("code") - case .link: - kinds.insert("link") - case .image: - kinds.insert("image") - case .softBreak: - kinds.insert("softBreak") - case .strikethrough(let c): - kinds.insert("strikethrough") - walk(c) - case .footnoteReference: - kinds.insert("footnoteReference") - case .inlineRawHTML: - kinds.insert("inlineRawHTML") - } - } - } - walk(nodes) - return kinds -} - -private func st_firstParagraphInlines(_ document: STMarkdownDocument) -> [STMarkdownInlineNode]? { - for block in document.blocks { - if case .paragraph(let inlines) = block { - return inlines - } - } - return nil -} - -private func st_assertStructuredMetadata( - _ metadata: STMarkdownRenderBlockMetadata, - expectedPath: [String], - expectedKind: STMarkdownRenderBlockKind, - expectedRevealPolicy: STMarkdownRevealPolicy, - file: StaticString = #filePath, - line: UInt = #line -) { - XCTAssertEqual(metadata.path, expectedPath, file: file, line: line) - XCTAssertEqual(metadata.id, expectedPath.joined(separator: "/"), file: file, line: line) - XCTAssertEqual(metadata.kind, expectedKind, file: file, line: line) - XCTAssertEqual(metadata.revealPolicy, expectedRevealPolicy, file: file, line: line) - XCTAssertFalse(metadata.id.hasPrefix("compat/"), file: file, line: line) -} - -final class STMarkdownStructureParserParseAndRenderIntegrityTests: XCTestCase { - - // MARK: - 解析:结构是否被识别为 AST 节点(而非整段原文) - - func testParserRecognizesHeadingLevelsAndContent() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - # 一级 - ## 二级 - ### 三级 - """ - ) - XCTAssertEqual(doc.blocks.count, 3) - guard case .heading(let l1, let c1) = doc.blocks[0], - case .heading(let l2, let c2) = doc.blocks[1], - case .heading(let l3, let c3) = doc.blocks[2] - else { - return XCTFail("期望三个 heading 块") - } - XCTAssertEqual(l1, 1) - XCTAssertEqual(l2, 2) - XCTAssertEqual(l3, 3) - XCTAssertTrue(c1.contains { if case .text(let t) = $0 { return t.contains("一级") }; return false }) - XCTAssertTrue(c2.contains { if case .text(let t) = $0 { return t.contains("二级") }; return false }) - XCTAssertTrue(c3.contains { if case .text(let t) = $0 { return t.contains("三级") }; return false }) - } - - func testParserRecognizesInlineStrongEmphasisCodeLinkImageStrikeAndMath() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - #""" - 行内 **粗体** *斜体* `代码` [链接](https://example.com) ![图](https://example.com/i.png) ~~删~~ 公式 \(x+y\) - """# - ) - guard let inlines = st_firstParagraphInlines(doc) else { - return XCTFail("期望首块为段落") - } - let kinds = st_collectInlineKinds(inlines) - XCTAssertTrue(kinds.contains("strong"), "应识别 ** 为 strong") - XCTAssertTrue(kinds.contains("emphasis"), "应识别 * 为 emphasis") - XCTAssertTrue(kinds.contains("code"), "应识别行内代码") - XCTAssertTrue(kinds.contains("link"), "应识别链接") - XCTAssertTrue(kinds.contains("image"), "应识别图片") - XCTAssertTrue(kinds.contains("strikethrough"), "应识别删除线") - XCTAssertTrue(kinds.contains("inlineMath"), "应识别行内公式") - } - - func testParserRecognizesBlockQuoteFencedCodeTableThematicBreakAndDisplayMath() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - > 引用一行 - - ```swift - let a = 1 - ``` - - | 列一 | 列二 | - | --- | --- | - | 甲 | 乙 | - - --- - - $$ - E = mc^2 - $$ - """ - ) - - var sawQuote = false - var sawCode = false - var sawTable = false - var sawBreak = false - var sawMath = false - - for block in doc.blocks { - switch block { - case .quote(let inner): - sawQuote = true - XCTAssertFalse(inner.isEmpty) - case .codeBlock(let lang, let code): - sawCode = true - XCTAssertEqual(lang, "swift") - XCTAssertTrue(code.contains("let a")) - case .table(let model): - sawTable = true - XCTAssertFalse(model.rows.isEmpty) - case .thematicBreak: - sawBreak = true - case .mathBlock(let latex): - sawMath = true - XCTAssertTrue(latex.contains("E = mc^2")) - default: - break - } - } - - XCTAssertTrue(sawQuote, "应识别块引用") - XCTAssertTrue(sawCode, "应识别围栏代码块") - XCTAssertTrue(sawTable, "应识别 GFM 表格") - XCTAssertTrue(sawBreak, "应识别主题分隔线") - XCTAssertTrue(sawMath, "应识别块级公式(mathBlock)") - } - - func testParserRecognizesOrderedUnorderedAndTaskLists() { - let parser = STMarkdownStructureParser() - let doc = parser.parse( - """ - 1. 有序一 - 2. 有序二 - - - 无序项 - - - [x] 已完成 - - [ ] 未完成 - """ - ) - - var orderedItems = 0 - var unorderedItems = 0 - var taskChecked = false - var taskUnchecked = false - - for block in doc.blocks { - guard case .list(let kind, let items) = block else { continue } - switch kind { - case .ordered: - orderedItems += items.count - case .unordered: - unorderedItems += items.count - for item in items { - if item.checkbox == .checked { taskChecked = true } - if item.checkbox == .unchecked { taskUnchecked = true } - } - } - } - - XCTAssertEqual(orderedItems, 2, "有序列表两项") - XCTAssertGreaterThanOrEqual(unorderedItems, 3, "无序 + 任务列表项") - XCTAssertTrue(taskChecked, "应识别已完成任务项") - XCTAssertTrue(taskUnchecked, "应识别未完成任务项") - } - - // MARK: - 渲染:可见串中不得残留 Markdown 定界符 - - func testRenderedOutputHasNoMarkdownDelimiterLeaks_inlineRichParagraph() { - let md = #""" - 展示 **粗体**、*斜体*、`mono`、[点我](https://example.com)、![示意](https://example.com/x.png) 与 ~~旧文~~ 以及 \(a+b\)。 - """# - let plain = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownSyntaxLeaks(in: plain) - XCTAssertTrue(plain.contains("粗体")) - XCTAssertTrue(plain.contains("斜体")) - XCTAssertTrue(plain.contains("mono")) - XCTAssertTrue(plain.contains("点我")) - XCTAssertTrue(plain.contains("示意")) - XCTAssertTrue(plain.contains("旧文")) - } - - func testRenderedOutputHasNoMarkdownDelimiterLeaks_headingsAndBlockStructures() { - let md = """ - # 标题一 - - ## 标题二 - - > 引用内容 - - ```swift - let v = 42 - ``` - - | H1 | H2 | - | --- | --- | - | c1 | c2 | - - --- - - $$ - x^2 - $$ - """ - let plain = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownSyntaxLeaks(in: plain) - XCTAssertTrue(plain.contains("标题一")) - XCTAssertTrue(plain.contains("标题二")) - XCTAssertTrue(plain.contains("引用内容")) - XCTAssertTrue(plain.contains("let v = 42")) - XCTAssertTrue(plain.contains("c1")) - XCTAssertFalse(plain.contains("# "), "标题不应以 Markdown # 前缀出现在可见文本中") - XCTAssertFalse(plain.contains("> "), "块引用不应以 `> ` 出现在可见文本中") - } - - func testRenderedOutputHasNoMarkdownDelimiterLeaks_listsAndTasks() { - let md = """ - 1. 第一项 - 2. 第二项 - - - 圆点 - - - [x] 做完 - - [ ] 待办 - """ - let plain = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownSyntaxLeaks(in: plain) - XCTAssertTrue(plain.contains("第一项")) - XCTAssertTrue(plain.contains("第二项")) - XCTAssertTrue(plain.contains("圆点")) - XCTAssertTrue(plain.contains("做完")) - XCTAssertTrue(plain.contains("待办")) - } - - func testRenderedOutputHasNoMarkdownDelimiterLeaks_nestedEmphasisAndLink() { - let md = """ - 外层 **粗里 *斜粗尾* 尾** [链](https://a.org/b) - """ - let plain = st_renderPlainString(markdown: md) - st_assertNoRawMarkdownSyntaxLeaks(in: plain) - XCTAssertTrue(plain.contains("粗里")) - XCTAssertTrue(plain.contains("斜粗尾")) - XCTAssertTrue(plain.contains("链")) - } - - func testRenderAdapterProducesStructuredMetadataIDsForNestedBlocks() { - let document = STMarkdownDocument(blocks: [ - .heading(level: 1, content: [.text("Title")]), - .quote([ - .paragraph([.text("quoted")]), - .list( - kind: .unordered, - items: [ - STMarkdownListItemNode(blocks: [.paragraph([.text("item")])]), - ] - ), - ]), - .details( - summary: [.text("More")], - body: [.paragraph([.text("Hidden")])] - ), - ]) - - let renderDocument = STMarkdownRenderAdapter().adapt(document) - XCTAssertEqual(renderDocument.blocks.count, 3) - - guard case .heading(let headingMeta, level: let level, anchorId: let anchorId, content: _) - = renderDocument.blocks[0] else { - return XCTFail("首块应为 heading") - } - XCTAssertEqual(level, 1) - XCTAssertEqual(anchorId, "title") - st_assertStructuredMetadata( - headingMeta, - expectedPath: ["b:0"], - expectedKind: .heading, - expectedRevealPolicy: .inlineProgressive - ) - - guard case .quote(let quoteMeta, let quoteBlocks) = renderDocument.blocks[1] else { - return XCTFail("第二块应为 quote") - } - st_assertStructuredMetadata( - quoteMeta, - expectedPath: ["b:1"], - expectedKind: .quote, - expectedRevealPolicy: .containerThenContent - ) - XCTAssertEqual(quoteBlocks.count, 2) - st_assertStructuredMetadata( - quoteBlocks[0].metadata, - expectedPath: ["b:1", "q:0"], - expectedKind: .paragraph, - expectedRevealPolicy: .inlineProgressive - ) - - guard case .list(let listMeta, let items) = quoteBlocks[1] else { - return XCTFail("quote 第二个子块应为 list") - } - st_assertStructuredMetadata( - listMeta, - expectedPath: ["b:1", "q:1"], - expectedKind: .list, - expectedRevealPolicy: .containerThenContent - ) - XCTAssertEqual(items.count, 1) - XCTAssertEqual(items[0].blocks.count, 1) - st_assertStructuredMetadata( - items[0].blocks[0].metadata, - expectedPath: ["b:1", "q:1", "li:0", "b:0"], - expectedKind: .paragraph, - expectedRevealPolicy: .inlineProgressive - ) - - guard case .details(let detailsMeta, summary: let summary, body: let body) = renderDocument.blocks[2] else { - return XCTFail("第三块应为 details") - } - XCTAssertEqual(summary, [.text("More")]) - st_assertStructuredMetadata( - detailsMeta, - expectedPath: ["b:2"], - expectedKind: .details, - expectedRevealPolicy: .containerThenContent - ) - XCTAssertEqual(body.count, 1) - st_assertStructuredMetadata( - body[0].metadata, - expectedPath: ["b:2", "d:0"], - expectedKind: .paragraph, - expectedRevealPolicy: .inlineProgressive - ) - } - - func testRenderAdapterAppendsFootnoteSectionUsingStructuredTopLevelIDs() { - let parser = STMarkdownStructureParser() - let document = parser.parse( - """ - Body[^a]. - - [^a]: note body - """ - ) - - let renderDocument = STMarkdownRenderAdapter().adapt(document) - XCTAssertEqual(renderDocument.blocks.count, 4) - - st_assertStructuredMetadata( - renderDocument.blocks[0].metadata, - expectedPath: ["b:0"], - expectedKind: .paragraph, - expectedRevealPolicy: .inlineProgressive - ) - st_assertStructuredMetadata( - renderDocument.blocks[1].metadata, - expectedPath: ["b:1"], - expectedKind: .thematicBreak, - expectedRevealPolicy: .atomicBlock - ) - st_assertStructuredMetadata( - renderDocument.blocks[2].metadata, - expectedPath: ["b:2"], - expectedKind: .paragraph, - expectedRevealPolicy: .inlineProgressive - ) - st_assertStructuredMetadata( - renderDocument.blocks[3].metadata, - expectedPath: ["b:3"], - expectedKind: .paragraph, - expectedRevealPolicy: .inlineProgressive - ) - - guard case .paragraph(_, let headingInlines) = renderDocument.blocks[2], - case .paragraph(_, let footnoteInlines) = renderDocument.blocks[3] else { - return XCTFail("脚注尾部应追加两个 paragraph") - } - XCTAssertEqual(headingInlines, [.strong([.text("脚注")])]) - XCTAssertTrue(footnoteInlines.contains(.text(" "))) - XCTAssertTrue(footnoteInlines.contains(.text("note body"))) - } - - // MARK: - 流式:每个中间态都不允许出现 Markdown 定界符 - - @MainActor - func testStreamingIntermediateStatesHaveNoMarkdownLeaks_strongAndEmphasis() { - st_assertStreamingNoRawMarkdownSyntaxLeaks( - chunks: [ - "展示 ", - "**粗", - "体**", - " 与 *斜", - "体* 结束" - ] - ) - } - - @MainActor - func testStreamingIntermediateStatesHaveNoMarkdownLeaks_linkAndInlineCode() { - st_assertStreamingNoRawMarkdownSyntaxLeaks( - chunks: [ - "点击 ", - "[链", - "接](https://example.com)", - " 与 `co", - "de`" - ] - ) - } - - @MainActor - func testStreamingIntermediateStatesHaveNoMarkdownLeaks_strikethroughAndTaskList() { - st_assertStreamingNoRawMarkdownSyntaxLeaks( - chunks: [ - "~~删", - "除线~~\n\n", - "- [x] 已", - "完成\n", - "- [ ] 待", - "办" - ] - ) - } - - @MainActor - func testStreamingIntermediateStatesHaveNoMarkdownLeaks_mathDelimiters() { - st_assertStreamingNoRawMarkdownSyntaxLeaks( - chunks: [ - "行内公式 ", - #"\(x+"#, - #"y\)"#, - "\n\n", - "$$", - "\nE = mc^2\n", - "$$" - ] - ) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownTOCTests.swift b/Example/STBaseProjectExampleTests/STMarkdownTOCTests.swift deleted file mode 100644 index 64fbde6..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownTOCTests.swift +++ /dev/null @@ -1,47 +0,0 @@ -import XCTest -@testable import STBaseProject - -final class STMarkdownTOCTests: XCTestCase { - - func testPipelineExtractsTableOfContentsWithStableSlugs() { - let md = """ - # Hello - - ## World Again - - ### Deep - """ - let result = STMarkdownEngine().process(md) - XCTAssertEqual(result.tableOfContents.count, 3) - XCTAssertEqual(result.tableOfContents[0].level, 1) - XCTAssertEqual(result.tableOfContents[0].title, "Hello") - XCTAssertEqual(result.tableOfContents[0].anchorId, "hello") - XCTAssertEqual(result.tableOfContents[1].anchorId, "world-again") - XCTAssertEqual(result.tableOfContents[2].anchorId, "deep") - } - - func testDuplicateHeadingTitlesGetUniqueAnchorIds() { - let md = "## Same\n\n## Same\n" - let result = STMarkdownEngine().process(md) - XCTAssertEqual(result.tableOfContents.count, 2) - XCTAssertEqual(result.tableOfContents[0].anchorId, "same") - XCTAssertEqual(result.tableOfContents[1].anchorId, "same-1") - } - - func testStreamBufferInvokesOnCompleteModules() { - let buffer = STMarkdownStreamBuffer(minModuleLength: 5) - var received: [[String]] = [] - buffer.onCompleteModules = { received.append($0) } - _ = buffer.append("# A\n\nParagraph one is long enough here.\n\n") - XCTAssertEqual(received.count, 1) - XCTAssertFalse(received[0].isEmpty) - } - - @MainActor - func testScrollableMarkdownViewWithTOCPanelUpdatesPipelineTOC() { - let v = STScrollableMarkdownView(frame: CGRect(x: 0, y: 0, width: 360, height: 500)) - v.showsTableOfContents = true - v.setMarkdown("# One\n\n## Two\n\nBody.\n") - XCTAssertGreaterThanOrEqual(v.markdownTextView.tableOfContents.count, 2) - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownTextKitPerformanceAndRegressionTests.swift b/Example/STBaseProjectExampleTests/STMarkdownTextKitPerformanceAndRegressionTests.swift deleted file mode 100644 index 2b13f4c..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownTextKitPerformanceAndRegressionTests.swift +++ /dev/null @@ -1,308 +0,0 @@ -// -// STMarkdownTextKitPerformanceAndRegressionTests.swift -// -// TextKit 1 (`usesTextLayoutManager = false`) vs TextKit 2 (`true`) 对比与交互回归。 -// 性能指标通过 NSLog 输出前缀 `[TextKitPerf]`,便于在 Xcode / CI 日志中检索。 -// - -import XCTest -import UIKit -@testable import STBaseProject - -@MainActor -private final class DisplayLinkFrameSampler: NSObject { - private var link: CADisplayLink? - private(set) var frameIntervals: [TimeInterval] = [] - private var lastTimestamp: CFTimeInterval = 0 - private var tickAction: (() -> Void)? - - func start(onTick: @escaping () -> Void) { - self.stop() - self.frameIntervals = [] - self.lastTimestamp = 0 - self.tickAction = onTick - let dl = CADisplayLink(target: self, selector: #selector(handleDisplayLink(_:))) - dl.preferredFrameRateRange = CAFrameRateRange(minimum: 60, maximum: 120, preferred: 60) - dl.add(to: .main, forMode: .common) - self.link = dl - } - - func stop() { - self.link?.invalidate() - self.link = nil - self.tickAction = nil - } - - @objc private func handleDisplayLink(_ link: CADisplayLink) { - if self.lastTimestamp > 0 { - self.frameIntervals.append(TimeInterval(link.timestamp - self.lastTimestamp)) - } - self.lastTimestamp = link.timestamp - self.tickAction?() - } -} - -@MainActor -final class STMarkdownTextKitPerformanceAndRegressionTests: XCTestCase { - - private static func stressMarkdown(repeatCount: Int) -> String { - (0.. (UIWindow, STScrollableMarkdownView) { - let bounds = CGRect(x: 0, y: 0, width: width, height: height) - let window = UIWindow(frame: bounds) - window.layer.speed = 1 - let vc = UIViewController() - vc.view.bounds = bounds - window.rootViewController = vc - window.makeKeyAndVisible() - - let host = STScrollableMarkdownView(frame: vc.view.bounds, usesTextLayoutManager: usesTK2) - host.autoresizingMask = [.flexibleWidth, .flexibleHeight] - vc.view.addSubview(host) - return (window, host) - } - - /// 首帧:setMarkdown → 首次 `layoutIfNeeded`;总布局:再跑若干轮直到 intrinsic 高度稳定。 - private func measureFirstFrameAndSettlingLayout(host: STScrollableMarkdownView, markdown: String) -> ( - firstFrame: TimeInterval, - settleLayout: TimeInterval, - finalHeight: CGFloat - ) { - let t0 = CACurrentMediaTime() - host.setMarkdown(markdown) - host.layoutIfNeeded() - let t1 = CACurrentMediaTime() - - let settleStart = CACurrentMediaTime() - var h = host.markdownTextView.intrinsicContentSize.height - for _ in 0..<12 { - host.layoutIfNeeded() - let nh = host.markdownTextView.intrinsicContentSize.height - if abs(nh - h) < 0.5 { break } - h = nh - } - let t2 = CACurrentMediaTime() - return (t1 - t0, t2 - settleStart, h) - } - - private func percentile(_ values: [TimeInterval], p: Double) -> TimeInterval { - guard values.isEmpty == false else { return 0 } - let sorted = values.sorted() - let idx = min(sorted.count - 1, max(0, Int((Double(sorted.count - 1) * p).rounded(.down)))) - return sorted[idx] - } - - private func emitPerf(_ line: String) { - print(line) - fflush(stdout) - let attachment = XCTAttachment(string: line) - attachment.lifetime = .keepAlways - self.add(attachment) - } - - // MARK: - 1) 长文档:首帧 / 总布局 / 滚动帧间隔(拆成两条用例,便于 XCTAttachment 落盘到 .xcresult) - - private func runLongMarkdownLayoutAndScrollSample(usesTK2: Bool) { - let md = Self.stressMarkdown(repeatCount: 24) - let width: CGFloat = 390 - let height: CGFloat = 844 - - let (window, host) = self.hostScrollable(width: width, height: height, usesTK2: usesTK2) - defer { window.isHidden = true } - - let (first, settle, finalH) = self.measureFirstFrameAndSettlingLayout(host: host, markdown: md) - host.layoutIfNeeded() - let scroll = host.scrollView - scroll.layoutIfNeeded() - - let sampler = DisplayLinkFrameSampler() - let step: CGFloat = 9 - var ticks = 0 - sampler.start { - ticks += 1 - let maxY = max(0, scroll.contentSize.height - scroll.bounds.height) - let y = min(maxY, scroll.contentOffset.y + step) - scroll.setContentOffset(CGPoint(x: 0, y: y), animated: false) - if ticks >= 90 || (maxY <= 0 && ticks > 5) { - sampler.stop() - } - } - let exp = expectation(description: "scroll sampling") - exp.assertForOverFulfill = false - DispatchQueue.main.asyncAfter(deadline: .now() + 1.6) { - sampler.stop() - exp.fulfill() - } - wait(for: [exp], timeout: 3) - - let iv = sampler.frameIntervals - let median = iv.isEmpty ? 0 : iv.sorted()[iv.count / 2] - let p95 = self.percentile(iv, p: 0.95) - let jankFrames = iv.filter { $0 > (1.0 / 50.0) * 1.45 }.count - - let mode = usesTK2 ? "TK2" : "TK1" - self.emitPerf( - String( - format: "[TextKitPerf] long-md mode=%@ firstFrameMs=%.2f settleLayoutMs=%.2f finalHeight=%.1f scrollSamples=%ld medianFrameMs=%.3f p95FrameMs=%.3f jankishFrames=%ld", - mode, - first * 1000, - settle * 1000, - finalH, - iv.count, - median * 1000, - p95 * 1000, - jankFrames - ) - ) - - XCTAssertGreaterThan(finalH, 200, "应测得显著正文高度 (\(mode))") - } - - func testLongMarkdown_LayoutAndScrollMetrics_TextKit1() { - self.runLongMarkdownLayoutAndScrollSample(usesTK2: false) - } - - func testLongMarkdown_LayoutAndScrollMetrics_TextKit2() { - self.runLongMarkdownLayoutAndScrollSample(usesTK2: true) - } - - // MARK: - 2) 流式 append:每 chunk 耗时、显式 layout 轮数、intrinsic 高度抖动 - - func testStreamingAppend_PerChunkMetrics_TK1_vs_TK2() { - let chunks = (0..<40).map { i in "Line \(i): **bold** and [l](https://e.com) | `c` \n" } - let width: CGFloat = 360 - - for usesTK2 in [false, true] { - var heightSeries: [CGFloat] = [] - var wallMs: [TimeInterval] = [] - var layoutPasses: [Int] = [] - - let window = UIWindow(frame: CGRect(x: 0, y: 0, width: width, height: 800)) - let vc = UIViewController() - window.rootViewController = vc - window.makeKeyAndVisible() - defer { window.isHidden = true } - - let stream = STMarkdownStreamingTextView(frame: vc.view.bounds, usesTextLayoutManager: usesTK2) - stream.autoresizingMask = [.flexibleWidth, .flexibleHeight] - stream.tokenFadeDuration = 0 - stream.characterStaggerInterval = 0 - stream.animateAcrossNewlines = false - vc.view.addSubview(stream) - - for chunk in chunks { - let t0 = CACurrentMediaTime() - stream.appendMarkdownFragment(chunk, animated: false) - var passes = 0 - var h0 = stream.intrinsicContentSize.height - for _ in 0..<8 { - stream.layoutIfNeeded() - passes += 1 - let h1 = stream.intrinsicContentSize.height - if abs(h1 - h0) < 0.25 { break } - h0 = h1 - } - wallMs.append((CACurrentMediaTime() - t0) * 1000) - layoutPasses.append(passes) - heightSeries.append(stream.intrinsicContentSize.height) - } - - let jitters = zip(heightSeries, heightSeries.dropFirst()).map { abs($1 - $0) } - let maxJitter = jitters.max() ?? 0 - let sumWall = wallMs.reduce(0, +) - let mode = usesTK2 ? "TK2" : "TK1" - self.emitPerf( - String( - format: "[TextKitPerf] stream mode=%@ chunks=%ld totalWallMs=%.2f maxHeightJitter=%.2f avgLayoutPasses=%.2f", - mode, - chunks.count, - sumWall, - maxJitter, - Double(layoutPasses.reduce(0, +)) / Double(max(layoutPasses.count, 1)) - ) - ) - - XCTAssertGreaterThan(heightSeries.last ?? 0, 100) - } - } - - // MARK: - 3) 交互回归(TK2):链接 / 脚注 / 选区 / 表格相关富文本非空 - - func testTextKit2_LinkFootnoteSelectionAndTableRenderRegression() { - let md = """ - | a | b | - |---|---| - | 1 | 2 | - - Tap [Example](https://example.org) and foot[^f]. - - [^f]: Note **body**. - """ - let view = STMarkdownTextView(frame: CGRect(x: 0, y: 0, width: 320, height: 600), usesTextLayoutManager: true) - view.setMarkdown(md) - - var linkURL: URL? - view.onLinkTap = { linkURL = $0 } - var footLabel: String? - view.onFootnoteTap = { footLabel = $0 } - - let example = URL(string: "https://example.org")! - _ = view.textView( - view.contentTextView, - shouldInteractWith: example, - in: NSRange(location: 0, length: 1), - interaction: .invokeDefaultAction - ) - XCTAssertEqual(linkURL, example) - - let fnURL = URL(string: "stmarkdown-footnote://f")! - _ = view.textView( - view.contentTextView, - shouldInteractWith: fnURL, - in: NSRange(location: 0, length: 1), - interaction: .invokeDefaultAction - ) - XCTAssertEqual(footLabel, "f") - - var selectionText: String? - view.onSelectionChange = { selectionText = $0 } - view.contentTextView.selectedRange = NSRange(location: 0, length: min(4, view.attributedText.length)) - view.textViewDidChangeSelection(view.contentTextView) - XCTAssertFalse(selectionText?.isEmpty ?? true) - - XCTAssertTrue(view.attributedText.string.contains("1"), "表格单元应出现在可见字符串中") - XCTAssertGreaterThan(view.intrinsicContentSize.height, 40) - } -} - -// MARK: - STMarkdownStreamingTextView 测试扩展(仅本测试 target) - -private extension STMarkdownStreamingTextView { - /// 测试里压低流式动画 CPU:`STShimmerTextView` 的 stagger 间隔。 - var characterStaggerInterval: TimeInterval { - get { self.shimmerTextViewForTests.characterStaggerInterval } - set { self.shimmerTextViewForTests.characterStaggerInterval = newValue } - } - - private var shimmerTextViewForTests: STShimmerTextView { - self.contentTextView as! STShimmerTextView - } -} diff --git a/Example/STBaseProjectExampleTests/STMarkdownUIViewTests.swift b/Example/STBaseProjectExampleTests/STMarkdownUIViewTests.swift deleted file mode 100644 index 44032f4..0000000 --- a/Example/STBaseProjectExampleTests/STMarkdownUIViewTests.swift +++ /dev/null @@ -1,229 +0,0 @@ -import XCTest -import UIKit -@testable import STBaseProject - -@MainActor -final class STMarkdownUIViewTests: XCTestCase { - - func testTextViewLinkTapCallbackReturnsFalseAndForwardsURL() { - let view = STMarkdownTextView() - let url = URL(string: "https://example.com")! - var tappedURL: URL? - view.onLinkTap = { tappedURL = $0 } - - let shouldInteract = view.textView( - view.contentTextView, - shouldInteractWith: url, - in: NSRange(location: 0, length: 0), - interaction: .invokeDefaultAction - ) - - XCTAssertFalse(shouldInteract) - XCTAssertEqual(tappedURL, url) - } - - func testTextViewSelectionChangeCallbackReturnsSelectedText() { - let view = STMarkdownTextView() - view.setMarkdown("Hello World") - var selectedText: String? - view.onSelectionChange = { selectedText = $0 } - - view.contentTextView.selectedRange = NSRange(location: 6, length: 5) - view.textViewDidChangeSelection(view.contentTextView) - - XCTAssertEqual(selectedText, "World") - } - - func testTextViewResetClearsRawMarkdownAndRenderedText() { - let view = STMarkdownTextView() - view.setMarkdown("## Title") - - view.reset() - - XCTAssertTrue(view.rawMarkdown.isEmpty) - XCTAssertTrue(view.attributedText.string.isEmpty) - } - - func testStreamingViewUsesCustomDocumentRendererWhenProvided() { - let view = STMarkdownStreamingTextView() - view.customDocumentRenderer = { _ in - NSAttributedString(string: "custom-rendered") - } - - view.setMarkdown("**ignored**", animated: false) - - XCTAssertEqual(view.attributedText.string, "custom-rendered") - } - - func testStreamingViewAppendEmptyFragmentDoesNotChangeState() { - let view = STMarkdownStreamingTextView() - view.setMarkdown("base", animated: false) - - view.appendMarkdownFragment("", animated: true) - - XCTAssertEqual(view.rawMarkdown, "base") - XCTAssertEqual(view.attributedText.string, "base") - } - - func testStreamingApplyConfigurationUpdatesStyleAndRendersMarkdown() { - let view = STMarkdownStreamingTextView() - let style = STMarkdownStyle( - font: .systemFont(ofSize: 18, weight: .medium), - textColor: .systemRed, - lineHeight: 26, - kern: 0.2 - ) - - view.applyConfiguration( - markdown: "Configured content", - style: style, - advancedRenderers: .empty, - engine: STMarkdownEngine(), - animated: false - ) - - XCTAssertEqual(view.rawMarkdown, "Configured content") - XCTAssertEqual(view.attributedText.string, "Configured content") - XCTAssertEqual(view.contentTextView.textColor, .systemRed) - } - - func testStreamingPlainParagraphTailRemainsCharacterAnimated() { - let view = STMarkdownStreamingTextView() - view.tokenFadeDuration = 0.25 - (view.contentTextView as? STShimmerTextView)?.characterStaggerInterval = 0.02 - view.setMarkdown("Hello", animated: false) - - view.appendMarkdownFragment(" world", animated: true) - - let visible = view.contentTextView.attributedText ?? NSAttributedString() - XCTAssertEqual(visible.string, "Hello world") - let ns = visible.string as NSString - let lastIndex = ns.length - 1 - XCTAssertLessThan(self.foregroundAlpha(in: visible, at: lastIndex), 0.5) - } - - func testStreamingContainerThenContentDelaysOnlyTrailingInlineBlock() { - let view = STMarkdownStreamingTextView() - view.tokenFadeDuration = 0.25 - view.containerRevealGapDuration = 0.2 - (view.contentTextView as? STShimmerTextView)?.characterStaggerInterval = 0.02 - view.setMarkdown("Intro", animated: false) - - view.appendMarkdownFragment("\n\n> quoted line\n\nTail block", animated: true) - - let immediate = view.contentTextView.attributedText?.string ?? "" - XCTAssertTrue(immediate.contains("quoted line")) - XCTAssertFalse(immediate.contains("Tail block")) - - let exp = expectation(description: "wait for trailing inline block reveal scheduling") - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - exp.fulfill() - } - wait(for: [exp], timeout: 1.0) - - let delayed = view.contentTextView.attributedText?.string ?? "" - XCTAssertTrue(delayed.contains("Tail block")) - } - - func testStreamingSeparatorTailFallsBackToPreviousInlineBlockAnimation() { - let view = STMarkdownStreamingTextView() - view.tokenFadeDuration = 0.25 - (view.contentTextView as? STShimmerTextView)?.characterStaggerInterval = 0.02 - view.setMarkdown("Intro", animated: false) - - view.appendMarkdownFragment("\n\nTail block\n\n
    ignored
    ", animated: true) - - let visible = view.contentTextView.attributedText ?? NSAttributedString() - let text = visible.string as NSString - let tailRange = text.range(of: "Tail block") - XCTAssertNotEqual(tailRange.location, NSNotFound) - XCTAssertLessThan(self.foregroundAlpha(in: visible, at: tailRange.location), 0.5) - } - - func testStreamingLineFadeModeCreatesMaskAndReportsAnimatingState() { - let style = STMarkdownStyle( - font: .systemFont(ofSize: 16), - textColor: .label, - lineHeight: 22, - kern: 0, - streamFadeInEnabled: true, - streamLineFadeEnabled: true - ) - let view = STMarkdownStreamingTextView(style: style, usesTextLayoutManager: false) - view.frame = CGRect(x: 0, y: 0, width: 240, height: 80) - view.layoutIfNeeded() - view.setMarkdown("Hello", animated: false) - - var states: [Bool] = [] - (view.contentTextView as? STShimmerTextView)?.onAnimationStateChange = { states.append($0) } - - view.appendMarkdownFragment(" world", animated: true) - - XCTAssertTrue(view.isStreamingAnimationIdle == false) - XCTAssertNotNil(view.contentTextView.layer.mask) - XCTAssertEqual(states.first, true) - } - - func testSmartStreamingSecondCommittedFrameUsesIncrementalMergedRenderPath() { - let view = STMarkdownStreamingTextView() - view.tokenFadeDuration = 0 - view.markdownStyle.streamMinModuleLength = 1 - - let p1 = String(repeating: "a", count: 98) - let p2 = String(repeating: "b", count: 98) - let p3 = String(repeating: "c", count: 98) - let p4 = String(repeating: "d", count: 98) - let p5 = String(repeating: "e", count: 98) - - view.beginSmartMarkdownStreaming() - view.appendSmartMarkdownStreamingChunk([p1, p2, p3, p4].joined(separator: "\n\n") + "\n\n") - XCTAssertEqual(view.lastSmartStreamingRenderMode, .full) - - view.appendSmartMarkdownStreamingChunk(p5 + "\n\n") - - XCTAssertEqual(view.lastSmartStreamingRenderMode, .incremental) - let rendered = view.attributedText.string - XCTAssertTrue(rendered.contains(p1)) - XCTAssertTrue(rendered.contains(p5)) - } - - func testSmartStreamingFinalConvergenceKeepsDuplicateHeadingAnchorsUnique() { - let view = STMarkdownStreamingTextView() - view.tokenFadeDuration = 0 - view.markdownStyle.streamMinModuleLength = 1 - - view.beginSmartMarkdownStreaming() - view.appendSmartMarkdownStreamingChunk("## Same\n\nBody 1\n\n") - XCTAssertEqual(view.tableOfContents.map(\.anchorId), ["same"]) - - view.appendSmartMarkdownStreamingChunk("## Same\n\nBody 2") - view.appendSmartMarkdownStreamingChunk("\n\nTail 3\n\n") - view.endSmartMarkdownStreaming(flushPending: true) - - XCTAssertEqual(view.tableOfContents.map(\.anchorId), ["same", "same-1"]) - } - - func testSmartStreamingIncrementalPathRespectsSanitizerCanonicalization() { - let view = STMarkdownStreamingTextView() - view.tokenFadeDuration = 0 - view.markdownStyle.streamMinModuleLength = 1 - - view.beginSmartMarkdownStreaming() - view.appendSmartMarkdownStreamingChunk("Example\n\n") - XCTAssertEqual(view.attributedText.string, "Example") - - view.appendSmartMarkdownStreamingChunk("Tail\n\n") - - XCTAssertEqual(view.lastSmartStreamingRenderMode, .incremental) - XCTAssertTrue(view.attributedText.string.contains("Example")) - XCTAssertTrue(view.attributedText.string.contains("Tail")) - } - - private func foregroundAlpha(in attributed: NSAttributedString, at index: Int) -> CGFloat { - guard index >= 0, index < attributed.length else { return 1 } - guard let color = attributed.attribute(.foregroundColor, at: index, effectiveRange: nil) as? UIColor else { - return 1 - } - return color.cgColor.alpha - } -} diff --git a/Example/STBaseProjectExampleTests/STMediaTests.swift b/Example/STBaseProjectExampleTests/STMediaTests.swift deleted file mode 100644 index 06dbef0..0000000 --- a/Example/STBaseProjectExampleTests/STMediaTests.swift +++ /dev/null @@ -1,592 +0,0 @@ -import XCTest -import STMedia - -// MARK: - STImageFormatTests - -final class STImageFormatTests: XCTestCase { - - // MARK: format(from:) 字节头检测 - - func test_format_jpeg() { - let data = Data([0xFF, 0xD8, 0xFF, 0xE0]) - XCTAssertEqual(UIImage.format(from: data), .jpeg) - } - - func test_format_png() { - let data = Data([0x89, 0x50, 0x4E, 0x47]) - XCTAssertEqual(UIImage.format(from: data), .png) - } - - func test_format_gif() { - let data = Data([0x47, 0x49, 0x46, 0x38]) - XCTAssertEqual(UIImage.format(from: data), .gif) - } - - func test_format_tiff_little_endian() { - let data = Data([0x49, 0x49, 0x2A, 0x00]) - XCTAssertEqual(UIImage.format(from: data), .tiff) - } - - func test_format_tiff_big_endian() { - let data = Data([0x4D, 0x4D, 0x00, 0x2A]) - XCTAssertEqual(UIImage.format(from: data), .tiff) - } - - func test_format_webp() { - // RIFF????WEBP header (12 bytes) - var bytes = Array("RIFF".utf8) + [0x00, 0x00, 0x00, 0x00] + Array("WEBP".utf8) - let data = Data(bytes) - XCTAssertEqual(UIImage.format(from: data), .webp) - } - - func test_format_empty_returns_undefined() { - XCTAssertEqual(UIImage.format(from: Data()), .undefined) - } - - func test_format_unknown_returns_undefined() { - let data = Data([0xAB, 0xCD, 0xEF]) - XCTAssertEqual(UIImage.format(from: data), .undefined) - } - - // MARK: STImageFormat 属性 - - func test_mimeType() { - XCTAssertEqual(STImageFormat.jpeg.mimeType, "image/jpeg") - XCTAssertEqual(STImageFormat.png.mimeType, "image/png") - XCTAssertEqual(STImageFormat.gif.mimeType, "image/gif") - XCTAssertEqual(STImageFormat.webp.mimeType, "image/webp") - XCTAssertEqual(STImageFormat.heic.mimeType, "image/heic") - } - - func test_fileExtension() { - XCTAssertEqual(STImageFormat.jpeg.fileExtension, "jpeg") - XCTAssertEqual(STImageFormat.png.fileExtension, "png") - } - - // MARK: getFormat() 实例方法(alpha 启发式) - - func test_getFormat_opaqueImage_returns_jpeg() { - let image = makeOpaqueImage(size: CGSize(width: 4, height: 4), color: .red) - XCTAssertEqual(image.getFormat(), .jpeg) - } - - func test_getFormat_alphaImage_returns_png() { - let image = makeAlphaImage(size: CGSize(width: 4, height: 4)) - XCTAssertEqual(image.getFormat(), .png) - } - - // MARK: toData() 格式选择 - - func test_toData_opaqueImage_decodesAsJPEG() { - let image = makeOpaqueImage(size: CGSize(width: 4, height: 4), color: .blue) - let data = image.toData() - XCTAssertFalse(data.isEmpty) - // 无 alpha → 编码为 JPEG,首字节 0xFF - XCTAssertEqual(UIImage.format(from: data), .jpeg) - } - - func test_toData_alphaImage_decodesAsPNG() { - let image = makeAlphaImage(size: CGSize(width: 4, height: 4)) - let data = image.toData() - XCTAssertFalse(data.isEmpty) - // 有 alpha → 编码为 PNG,首字节 0x89 - XCTAssertEqual(UIImage.format(from: data), .png) - } - - // MARK: Helpers - - private func makeOpaqueImage(size: CGSize, color: UIColor) -> UIImage { - // opaque = true 确保 cgImage.alphaInfo 为 none,与 getFormat() 的 alpha 启发式保持一致 - let format = UIGraphicsImageRendererFormat() - format.opaque = true - let renderer = UIGraphicsImageRenderer(size: size, format: format) - return renderer.image { ctx in - color.setFill() - ctx.fill(CGRect(origin: .zero, size: size)) - } - } - - private func makeAlphaImage(size: CGSize) -> UIImage { - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { ctx in - UIColor.clear.setFill() - ctx.fill(CGRect(origin: .zero, size: size)) - UIColor.red.withAlphaComponent(0.5).setFill() - ctx.fill(CGRect(x: 0, y: 0, width: size.width / 2, height: size.height)) - } - } -} - -// MARK: - STImageCompressTests - -final class STImageCompressTests: XCTestCase { - - private func makeColorImage(size: CGSize = CGSize(width: 100, height: 100)) -> UIImage { - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { ctx in - UIColor.blue.setFill() - ctx.fill(CGRect(origin: .zero, size: size)) - } - } - - func test_smartCompress_jpeg_withinLimit() throws { - let image = makeColorImage() - let maxKB = 50 - let data = try XCTUnwrap(UIImage.smartCompress(image, maxFileSize: maxKB)) - XCTAssertLessThanOrEqual(data.count, maxKB * 1024) - } - - func test_smartCompress_png_producesValidData() throws { - let image = makeColorImage(size: CGSize(width: 10, height: 10)) - let data = try XCTUnwrap(UIImage.smartCompress(image, maxFileSize: 100, format: .png)) - XCTAssertFalse(data.isEmpty) - XCTAssertEqual(UIImage.format(from: data), .png) - } - - func test_compressToSize_reducesSize() throws { - let image = makeColorImage(size: CGSize(width: 500, height: 500)) - let maxKB = 30 - let data = try XCTUnwrap(UIImage.compressToSize(image, maxFileSize: maxKB)) - XCTAssertLessThanOrEqual(data.count, maxKB * 1024) - } - - func test_resizeImage_outputSize() throws { - let image = makeColorImage(size: CGSize(width: 200, height: 200)) - let target = CGSize(width: 50, height: 50) - let resized = try XCTUnwrap(UIImage.resizeImage(image, to: target)) - XCTAssertEqual(resized.size, target) - } - - func test_aspectFitScale_maintainsRatio() throws { - let image = makeColorImage(size: CGSize(width: 200, height: 100)) - let result = try XCTUnwrap(image.aspectFitScale(to: CGSize(width: 50, height: 50))) - XCTAssertLessThanOrEqual(result.size.width, 50 + 1) - XCTAssertLessThanOrEqual(result.size.height, 50 + 1) - let ratio = result.size.width / result.size.height - XCTAssertEqual(ratio, 2.0, accuracy: 0.01) - } - - func test_aspectFillScale_outputSize() throws { - let image = makeColorImage(size: CGSize(width: 200, height: 100)) - let target = CGSize(width: 50, height: 50) - let result = try XCTUnwrap(image.aspectFillScale(to: target)) - XCTAssertEqual(result.size.width, target.width, accuracy: 1.0) - XCTAssertEqual(result.size.height, target.height, accuracy: 1.0) - } - - func test_toBase64_roundTrip() { - let image = makeColorImage(size: CGSize(width: 4, height: 4)) - let base64 = image.toBase64() - XCTAssertFalse(base64.isEmpty) - let decoded = Data(base64Encoded: base64) - XCTAssertNotNil(decoded) - XCTAssertNotNil(UIImage(data: decoded!)) - } - - func test_isEmpty_emptyImage() { - let empty = UIImage() - XCTAssertTrue(UIImage.isEmpty(empty)) - } - - func test_isEmpty_nonEmptyImage() { - let image = makeColorImage() - XCTAssertFalse(UIImage.isEmpty(image)) - } -} - -// MARK: - STImageTransformTests - -final class STImageTransformTests: XCTestCase { - - private func makeImage(size: CGSize = CGSize(width: 100, height: 60)) -> UIImage { - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { ctx in - UIColor.green.setFill() - ctx.fill(CGRect(origin: .zero, size: size)) - } - } - - func test_crop() throws { - let image = makeImage(size: CGSize(width: 100, height: 100)) - let cropRect = CGRect(x: 10, y: 10, width: 40, height: 40) - let cropped = try XCTUnwrap(image.crop(to: cropRect)) - XCTAssertEqual(cropped.size.width, 40, accuracy: 1.0) - XCTAssertEqual(cropped.size.height, 40, accuracy: 1.0) - } - - func test_rotate_90degrees() throws { - let image = makeImage(size: CGSize(width: 100, height: 60)) - let rotated = try XCTUnwrap(image.rotate(by: 90)) - // 90° 旋转后宽高互换(允许浮点误差) - XCTAssertEqual(rotated.size.width, 60, accuracy: 1.0) - XCTAssertEqual(rotated.size.height, 100, accuracy: 1.0) - } - - func test_roundedCorners_returnsImage() throws { - let image = makeImage() - let rounded = try XCTUnwrap(image.roundedCorners(radius: 10)) - XCTAssertEqual(rounded.size, image.size) - } - - func test_addBorder_enlargesImage() throws { - let image = makeImage(size: CGSize(width: 80, height: 80)) - let bordered = try XCTUnwrap(image.addBorder(width: 5, color: .red)) - XCTAssertEqual(bordered.size, image.size) - } - - func test_addWatermark_returnsImage() throws { - let base = makeImage(size: CGSize(width: 100, height: 100)) - let watermark = makeImage(size: CGSize(width: 20, height: 20)) - let result = try XCTUnwrap(base.addWatermark(watermark, position: .center)) - XCTAssertEqual(result.size, base.size) - } - - func test_applyBlur_returnsImage() throws { - let image = makeImage() - let blurred = try XCTUnwrap(image.applyBlur(radius: 5)) - XCTAssertFalse(UIImage.isEmpty(blurred)) - } - - func test_adjustBrightness_returnsImage() throws { - let image = makeImage() - let adjusted = try XCTUnwrap(image.adjustBrightness(0.2)) - XCTAssertFalse(UIImage.isEmpty(adjusted)) - } - - func test_getColor_centerPixel() { - let renderer = UIGraphicsImageRenderer(size: CGSize(width: 10, height: 10)) - let image = renderer.image { ctx in - UIColor.red.setFill() - ctx.fill(CGRect(origin: .zero, size: CGSize(width: 10, height: 10))) - } - let color = image.getColor(at: CGPoint(x: 5, y: 5)) - var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 - color.getRed(&r, green: &g, blue: &b, alpha: &a) - XCTAssertGreaterThan(r, 0.5) - XCTAssertLessThan(g, 0.1) - XCTAssertEqual(a, 1.0, accuracy: 0.01) - } - - func test_getColor_outOfBoundsReturnssClear() { - let image = makeImage() - let color = image.getColor(at: CGPoint(x: 9999, y: 9999)) - XCTAssertEqual(color, .clear) - } -} - -// MARK: - STScanManagerTests - -final class STScanManagerTests: XCTestCase { - - // MARK: 空内容/零尺寸边界校验 - - func test_generateQRCode_emptyContent_throws() async { - do { - _ = try await STScanManager.generateQRCode(content: "", size: CGSize(width: 200, height: 200)) - XCTFail("应该抛出 invalidContent 错误") - } catch STScanError.invalidContent { - // 预期 - } catch { - XCTFail("期望 STScanError.invalidContent,实际:\(error)") - } - } - - func test_generateQRCode_zeroSize_throws() async { - do { - _ = try await STScanManager.generateQRCode(content: "test", size: .zero) - XCTFail("应该抛出 invalidSize 错误") - } catch STScanError.invalidSize { - // 预期 - } catch { - XCTFail("期望 STScanError.invalidSize,实际:\(error)") - } - } - - func test_generateBarCode_emptyContent_throws() async { - do { - _ = try await STScanManager.generateBarCode(content: "", size: CGSize(width: 200, height: 80)) - XCTFail("应该抛出 invalidContent 错误") - } catch STScanError.invalidContent { - // 预期 - } catch { - XCTFail("期望 STScanError.invalidContent,实际:\(error)") - } - } - - // MARK: 正常生成 - - func test_generateQRCode_returnsValidImage() async throws { - let size = CGSize(width: 200, height: 200) - let image = try await STScanManager.generateQRCode(content: "https://example.com", size: size) - XCTAssertEqual(image.size.width, size.width, accuracy: 1.0) - XCTAssertEqual(image.size.height, size.height, accuracy: 1.0) - XCTAssertFalse(UIImage.isEmpty(image)) - } - - func test_generateQRCode_customColor_returnsImage() async throws { - let size = CGSize(width: 150, height: 150) - let image = try await STScanManager.generateQRCode( - content: "hello", - size: size, - color: .blue, - background: .yellow - ) - XCTAssertEqual(image.size.width, size.width, accuracy: 1.0) - XCTAssertFalse(UIImage.isEmpty(image)) - } - - func test_generateBarCode_returnsValidImage() async throws { - let size = CGSize(width: 300, height: 100) - let image = try await STScanManager.generateBarCode(content: "1234567890", size: size) - XCTAssertEqual(image.size.width, size.width, accuracy: 1.0) - XCTAssertFalse(UIImage.isEmpty(image)) - } - - // MARK: QR 生成后识别(端到端) - - func test_generateQRCode_thenRecognize_matchesOriginalContent() async throws { - let content = "STMedia-QR-Test-\(UUID().uuidString)" - let qrImage = try await STScanManager.generateQRCode( - content: content, - size: CGSize(width: 300, height: 300) - ) - let recognized = try await STScanManager.recognizeQRCode(in: qrImage) - XCTAssertEqual(recognized, content) - } - - func test_generateQRCode_withWatermark_thenRecognize() async throws { - let content = "watermark-test-\(UUID().uuidString)" - let size = CGSize(width: 400, height: 400) - let watermarkSize = CGSize(width: 60, height: 60) - let watermark = makeColorImage(size: watermarkSize, color: .white) - let qrImage = try await STScanManager.generateQRCode( - content: content, - size: size, - watermark: watermark, - watermarkSize: watermarkSize - ) - let recognized = try await STScanManager.recognizeQRCode(in: qrImage) - XCTAssertEqual(recognized, content) - } - - // MARK: recognizeQRCode 识别失败路径 - - func test_recognizeQRCode_solidColorImage_throws() async { - let image = makeColorImage(size: CGSize(width: 100, height: 100), color: .white) - do { - _ = try await STScanManager.recognizeQRCode(in: image) - XCTFail("纯色图片应该识别失败") - } catch STScanError.noQRCodeFound { - // 预期 - } catch { - XCTFail("期望 STScanError.noQRCodeFound,实际:\(error)") - } - } - - // MARK: Helpers - - private func makeColorImage(size: CGSize, color: UIColor = .white) -> UIImage { - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { ctx in - color.setFill() - ctx.fill(CGRect(origin: .zero, size: size)) - } - } -} - -// MARK: - STScanViewTests - -final class STScanViewTests: XCTestCase { - - // MARK: 配置更新后 scanLineImage 响应 - - func test_scanLineImage_updatesAfterConfigChange() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - let originalColor = view.configuration.cornerColor - var newConfig = view.configuration - newConfig.cornerColor = .red - view.configuration = newConfig - // 断言 configuration 正确更新(间接验证 makeScanLineImage 被调用) - XCTAssertFalse(view.configuration.cornerColor == originalColor) - XCTAssertEqual(view.configuration.cornerColor, .red) - } - - func test_scanLineHeight_updatesAfterConfigChange() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - var config = view.configuration - config.scanLineHeight = 10.0 - view.configuration = config - XCTAssertEqual(view.configuration.scanLineHeight, 10.0) - } - - // MARK: 遮罩宽度计算(间接通过 getScanAreaRect 验证扫描框尺寸) - - func test_scanAreaRect_centeredInView() { - let frame = CGRect(x: 0, y: 0, width: 320, height: 568) - let view = STScanView(frame: frame) - // 关闭 safe area 适配以得到确定性结果 - view.setSafeAreaAdaptation(.disabled) - let rect = view.getScanAreaRect() - // 扫描框应在视图宽度内 - XCTAssertGreaterThan(rect.minX, 0) - XCTAssertLessThan(rect.maxX, frame.width) - XCTAssertGreaterThan(rect.minY, 0) - XCTAssertLessThan(rect.maxY, frame.height) - } - - func test_scanAreaRect_barCodeType_isWider() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.setSafeAreaAdaptation(.disabled) - view.st_configScanType(scanType: .qrCode) - let qrRect = view.getScanAreaRect() - view.st_configScanType(scanType: .barCode) - let barRect = view.getScanAreaRect() - // barCode 的 heightScale = 3.0,高度应显著小于宽度(扁长条形) - XCTAssertLessThan(barRect.height, barRect.width) - // 条码框高度应小于二维码框高度 - XCTAssertLessThan(barRect.height, qrRect.height) - } - - // MARK: 主题切换 - - func test_theme_light_setsMaskAlpha() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.theme = .light - XCTAssertEqual(view.configuration.maskAlpha, 0.4, accuracy: 0.001) - } - - func test_theme_dark_setsMaskAlpha() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.theme = .dark - XCTAssertEqual(view.configuration.maskAlpha, 0.6, accuracy: 0.001) - } - - func test_theme_custom_appliesConfiguration() { - var config = STScanViewConfiguration() - config.maskAlpha = 0.9 - config.tipText = "自定义提示" - // 直接设置 theme 属性,避免便利初始化路径的时序问题 - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.theme = .custom(config) - XCTAssertEqual(view.configuration.maskAlpha, 0.9, accuracy: 0.001) - XCTAssertEqual(view.configuration.tipText, "自定义提示") - } - - // MARK: resetToDefault - - func test_resetToDefault_restoresDarkTheme() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.theme = .light - view.resetToDefault() - XCTAssertEqual(view.configuration.maskAlpha, 0.6, accuracy: 0.001) - XCTAssertEqual(view.scanType, .qrCode) - } - - // MARK: updateTipText - - func test_updateTipText_updatesConfiguration() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.updateTipText("新提示文字") - XCTAssertEqual(view.configuration.tipText, "新提示文字") - } - - // MARK: isAnimating 状态 - - func test_isAnimating_barCodeType_isFalse() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.st_configScanType(scanType: .barCode) - XCTAssertFalse(view.isAnimating) - } - - func test_stopAnimating_setsIsAnimatingFalse() { - let view = STScanView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) - view.st_stopAnimating() - XCTAssertFalse(view.isAnimating) - } -} - -// MARK: - STImageManagerModelTests - -final class STImageManagerModelTests: XCTestCase { - - func test_buildModel_jpeg_usesJpegExtension() throws { - let image = makeOpaqueImage(size: CGSize(width: 100, height: 100)) - var config = STImageManagerConfiguration() - config.maxFileSize = 500 - config.imageFormat = "jpeg" - let model = try STImageManager.buildModel(from: image, source: .camera, config: config) - XCTAssertFalse(model.imageData.isEmpty) - XCTAssertTrue(model.fileName.hasSuffix(".jpeg"), "文件名应以 .jpeg 结尾,实际:\(model.fileName)") - XCTAssertTrue(model.mimeType.hasPrefix("image/"), "mimeType 应以 image/ 开头") - XCTAssertEqual(model.source, .camera) - } - - func test_buildModel_compressedDataWithinLimit() throws { - let image = makeOpaqueImage(size: CGSize(width: 1000, height: 1000)) - var config = STImageManagerConfiguration() - config.maxFileSize = 100 // KB - let model = try STImageManager.buildModel(from: image, source: .photoLibrary, config: config) - XCTAssertLessThanOrEqual(model.imageData.count, 100 * 1024 + 1024) // 允许极小误差 - } - - func test_buildModel_compressionFailed_onZeroMaxSize() { - // 0KB 限制应导致压缩失败 - let image = makeOpaqueImage(size: CGSize(width: 10, height: 10)) - var config = STImageManagerConfiguration() - config.maxFileSize = 0 - XCTAssertThrowsError( - try STImageManager.buildModel(from: image, source: .camera, config: config) - ) { error in - guard case STImageManagerError.compressionFailed = error else { - XCTFail("期望 compressionFailed,实际:\(error)") - return - } - } - } - - func test_buildModel_sourcePreserved() throws { - let image = makeOpaqueImage(size: CGSize(width: 50, height: 50)) - let config = STImageManagerConfiguration() - let modelCamera = try STImageManager.buildModel(from: image, source: .camera, config: config) - let modelLib = try STImageManager.buildModel(from: image, source: .photoLibrary, config: config) - XCTAssertEqual(modelCamera.source, .camera) - XCTAssertEqual(modelLib.source, .photoLibrary) - } - - // MARK: Helpers - - private func makeOpaqueImage(size: CGSize) -> UIImage { - let format = UIGraphicsImageRendererFormat() - format.opaque = true - let renderer = UIGraphicsImageRenderer(size: size, format: format) - return renderer.image { ctx in - UIColor.orange.setFill() - ctx.fill(CGRect(origin: .zero, size: size)) - } - } -} - -// MARK: - STScanErrorTests - -final class STScanErrorTests: XCTestCase { - - func test_errorDescriptions_notNil() { - let errors: [STScanError] = [ - .invalidContent, .invalidSize, .recognitionFailed, - .noQRCodeFound, .cameraNotAvailable, .cameraPermissionDenied - ] - for error in errors { - XCTAssertNotNil(error.errorDescription, "\(error) 应有错误描述") - } - } -} - -// MARK: - STImageErrorTests - -final class STImageErrorTests: XCTestCase { - - func test_errorDescriptions_notNil() { - XCTAssertNotNil(STImageError.invalidData.errorDescription) - XCTAssertNotNil(STImageError.photoLibraryPermissionDenied.errorDescription) - } -} diff --git a/Package.resolved b/Package.resolved index e250ba8..25d93f2 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,31 +1,5 @@ { "pins" : [ - { - "identity" : "swift-cmark", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-cmark.git", - "state" : { - "revision" : "924936d0427cb25a61169739a7660230bffa6ea6", - "version" : "0.8.0" - } - }, - { - "identity" : "swift-markdown", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-markdown.git", - "state" : { - "revision" : "3c6f9523da3a1ec2fd829673e472d95b8097a3b8", - "version" : "0.8.0" - } - }, - { - "identity" : "swiftmath", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mgriebling/SwiftMath.git", - "state" : { - "revision" : "48ff188ba118c37d024551238041113560ab09b9" - } - } ], "version" : 2 } diff --git a/Package.swift b/Package.swift index 772f728..85fff8d 100644 --- a/Package.swift +++ b/Package.swift @@ -12,59 +12,14 @@ let package = Package( .library( name: "STBaseProject", targets: ["STBaseProject"] - ), - .library( - name: "STContacts", - targets: ["STContacts"] - ), - .library( - name: "STLocation", - targets: ["STLocation"] - ), - .library( - name: "STMedia", - targets: ["STMedia"] ) ], - dependencies: [ - .package(url: "https://github.com/swiftlang/swift-markdown.git", from: "0.8.0"), - .package(url: "https://github.com/mgriebling/SwiftMath.git", revision: "48ff188ba118c37d024551238041113560ab09b9") - ], targets: [ .target( name: "STBaseProject", dependencies: [ - .product(name: "Markdown", package: "swift-markdown"), - .product(name: "SwiftMath", package: "SwiftMath", condition: .when(platforms: [.iOS])) ], path: "Sources", - exclude: [ - "STContacts", - "STLocation", - "STMedia" - ], - resources: [ - .process("STMarkdown/Resources"), - .copy("PrivacyInfo.xcprivacy") - ] - ), - .target( - name: "STContacts", - path: "Sources/STContacts", - resources: [ - .copy("PrivacyInfo.xcprivacy") - ] - ), - .target( - name: "STLocation", - path: "Sources/STLocation", - resources: [ - .copy("PrivacyInfo.xcprivacy") - ] - ), - .target( - name: "STMedia", - path: "Sources/STMedia", resources: [ .copy("PrivacyInfo.xcprivacy") ] diff --git a/README.md b/README.md index 7147232..002c902 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,33 @@ # STBaseProject -[![CocoaPods](https://img.shields.io/cocoapods/v/STBaseProject.svg?style=flat)](https://cocoapods.org/pods/STBaseProject) -[![License](https://img.shields.io/badge/license-MIT-green?style=flat)](https://cocoapods.org/pods/STBaseProject) -[![Platform](https://img.shields.io/badge/platform-iOS%2016%2B-lightgrey?style=flat)](https://cocoapods.org/pods/STBaseProject) +> **iOS base components library for Swift** — page base classes, networking, security, UIKit components, localization and common utilities. Distributed via Swift Package Manager. + +[![License](https://img.shields.io/badge/license-MIT-green?style=flat)](https://github.com/i-stack/STBaseProject/blob/main/LICENSE) +[![Platform](https://img.shields.io/badge/platform-iOS%2016%2B-lightgrey?style=flat)](https://github.com/i-stack/STBaseProject) [![Swift](https://img.shields.io/badge/Swift-5.9%20%7C%205.10%20%7C%206.0-orange?style=flat-square)](https://www.swift.org) [![CI](https://github.com/i-stack/STBaseProject/actions/workflows/swift.yml/badge.svg)](https://github.com/i-stack/STBaseProject/actions/workflows/swift.yml) [![SPM](https://img.shields.io/badge/SPM-supported-brightgreen?style=flat)](https://github.com/i-stack/STBaseProject) [![iOS](https://img.shields.io/badge/iOS-16.0%2B-blue?style=flat)](https://github.com/i-stack/STBaseProject) [![Xcode](https://img.shields.io/badge/Xcode-15%2B-147EFB?style=flat)](https://developer.apple.com/xcode/) -STBaseProject 是一个功能强大的 iOS 基础组件库,提供了丰富的 UI 组件和工具类,帮助开发者快速构建高质量的 iOS 应用。 - -## 📋 目录 - -- [安装方式](#installation) -- [按需加载](#modular-import) -- [快速开始](#quick-start) -- [隐私与权限](#privacy-permissions) -- [错误处理规范](#error-handling) -- [文档导航](#docs-navigation) -- [业务接入概览](#integration-overview) -- [模块使用概览](#module-overview) -- [目录介绍](#directory-overview) -- [主要功能](#features) -- [使用说明](#usage) -- [系统要求](#requirements) -- [Pod 发布脚本](#pod-release-script) -- [许可证](#license) -- [贡献](#contributing) -- [联系方式](#contact) - - -## 🚀 安装方式 +**STBaseProject** is an open-source **iOS base library** written in **Swift**, providing **UIKit components**, **networking**, **security (Keychain & crypto)**, **localization** and **common utilities** to help developers build high-quality iOS apps faster. Distributed via **Swift Package Manager (SPM)**. -### CocoaPods +STBaseProject 是一个 iOS 基础组件库,提供页面基类、网络、安全、UIKit 组件、本地化与通用工具,帮助开发者快速构建高质量的 iOS 应用。 -在 `Podfile` 中添加: +## 📋 目录 | Table of Contents -```ruby -pod 'STBaseProject', '~> 1.4.0' -``` +- [安装方式 | Installation](#installation) +- [快速开始 | Getting Started](#quick-start) +- [模块与文档 | Modules & Docs](#modules-docs) +- [主要功能 | Features](#features) +- [许可证 | License](#license) +- [贡献 | Contributing](#contributing) +- [联系方式 | Contact](#contact) -然后执行: + +## 🚀 安装方式 | Installation -```bash -pod install -``` +STBaseProject 是整包发布的库(SPM 单一 product),引入即包含全部核心能力:页面基类、网络、安全、UIKit、本地化、通用工具等。 ### Swift Package Manager @@ -57,144 +39,87 @@ pod install ```swift dependencies: [ - .package(url: "https://github.com/i-stack/STBaseProject.git", from: "1.4.0") -] -``` - -### 手动集成 - -1. 下载仓库源码 -2. 将 `Sources` 目录拖入工程 -3. 确认文件已加入目标 Target - - -## 🧩 按需加载 - -如果只需要部分能力,建议按模块引入,减少编译与依赖负担。 - -### Swift Package Manager(按 Product 选择) - -- `STBaseProject`:基础能力(含 Markdown 渲染,依赖 `swift-markdown`、`SwiftMath`;使用 `import STBaseProject` 即可) -- `STContacts`:联系人权限与读取 -- `STLocation`:定位与地理编码 -- `STMedia`:图片处理、扫码、截图 - -与 CocoaPods 的差异:CocoaPods 下 `STMarkdown` 为可选 subspec;SPM 将 Markdown 合入 `STBaseProject` product,无法在不拉取 `swift-markdown` / `SwiftMath` 的前提下单独「只要核心」。 - -示例: - -```swift -dependencies: [ - .package(url: "https://github.com/i-stack/STBaseProject.git", from: "1.4.0") + .package(url: "https://github.com/i-stack/STBaseProject.git", from: "1.5.0") ], targets: [ .target( name: "YourApp", dependencies: [ - .product(name: "STBaseProject", package: "STBaseProject"), - .product(name: "STContacts", package: "STBaseProject"), - .product(name: "STLocation", package: "STBaseProject") + .product(name: "STBaseProject", package: "STBaseProject") ] ) ] ``` -### CocoaPods(按 Subspec 选择) +### 手动集成 -核心 subspec 名为 `STBaseProject`(与 Pod 名相同)。若使用 `:subspecs`,**列表会覆盖** `default_subspecs`,需要基础能力时请把 `STBaseProject` 一并写上,否则只会安装列出的扩展 subspec。 +1. 下载仓库源码 +2. 将 `Sources` 目录拖入工程 +3. 确认文件已加入目标 Target -```ruby -# 默认:仅核心(等价于 default_subspecs) -pod 'STBaseProject', '~> 1.4.0' + +## ⚡ 快速开始 | Getting Started -# 核心 + 定位(按需把 STContacts、STMedia、STMarkdown 加入数组即可) -pod 'STBaseProject', '~> 1.4.0', :subspecs => ['STBaseProject', 'STLocation'] +### 1) 启动配置 -# 核心 + 多个扩展示例 -# pod 'STBaseProject', '~> 1.4.0', :subspecs => ['STBaseProject', 'STLocation', 'STContacts', 'STMedia'] +在 `AppDelegate` / `SceneDelegate` 中完成全局配置初始化: -# 仅安装某个扩展、不要核心(一般少见;扩展模块不依赖核心时可单独拉取) -# pod 'STBaseProject/STLocation', '~> 1.4.0' -``` +```swift +import STBaseProject - -## 隐私与权限 - -STBaseProject 已随 SPM target 与 CocoaPods subspec 提供 `PrivacyInfo.xcprivacy`。这些隐私清单只声明 SDK 自身访问的隐私相关 API,不会替 App 自动补齐运行时权限说明。消费方如果调用下列能力,必须在 App Target 的 `Info.plist` 中配置对应 usage description。 - -| 模块 | 能力 | 必需 Info.plist Key | -| --- | --- | --- | -| `STMedia` | 相机拍照、扫码 | `NSCameraUsageDescription` | -| `STMedia` | 读取/选择照片 | `NSPhotoLibraryUsageDescription` | -| `STMedia` | 录制含音频的视频或扩展媒体能力 | `NSMicrophoneUsageDescription` | -| `STLocation` | 使用期间定位、反地理编码 | `NSLocationWhenInUseUsageDescription` | -| `STContacts` | 联系人读取 | `NSContactsUsageDescription` | - -示例: - -```xml -NSCameraUsageDescription -用于拍摄照片或扫码 -NSPhotoLibraryUsageDescription -用于选择照片 -NSLocationWhenInUseUsageDescription -用于获取当前位置 -NSContactsUsageDescription -用于读取联系人 -NSMicrophoneUsageDescription -用于录制音频 +// 应用启动阶段集中初始化基础配置 +STBaseConfig.setup() // 全局配置与外观 ``` - -## 错误处理规范 - -仓库通过 `.github/check_try_question_mark.sh` 与 CI 限制 `try?` 使用范围。边界 IO、Keychain、网络发送、证书/加密等安全敏感路径必须使用 `do/catch` 或 `Result`,并保留可诊断错误信息。`try?` 仅允许用于明确可丢弃失败的探测场景,例如 Codable 多类型解码尝试、JSON 解析探测、正则编译探测和可取消的 `Task.sleep`。 - - -## ⚡ 快速开始 +### 2) 页面基类接入 -### 1) 启动配置 +页面优先基于 `STBaseViewController` 组织统一导航与通用交互,状态与异步流程落在 `STBaseViewModel`: -- 在应用启动阶段完成基础配置初始化(`STBaseConfig`) -- 建议将全局配置集中在 `AppDelegate` 或 `SceneDelegate` +```swift +import STBaseProject -### 2) 页面基类接入 +final class DemoViewController: STBaseViewController { + private let viewModel = STBaseViewModel() -- 页面优先基于 `STBaseViewController` 组织统一导航与通用交互 -- 状态和异步流程建议落在 `STBaseViewModel` + override func viewDidLoad() { + super.viewDidLoad() + title = "Demo" + } +} +``` -### 3) 常用组件示例 +### 3) 常用组件 -- UI 组件(按钮、标签、输入框、HUD)统一从 `STUIKit` / `STDialog` 选择 -- 复杂渲染场景(如 Markdown)优先使用 `STMarkdown` +- UI 组件(按钮、标签、输入框、HUD)统一从 `STUIKit` 选择 +- 全局配置与外观:`STConfig` +- 网络请求:`STNetwork`(`STHTTPSession`) +- 安全存储与加解密:`STSecurity`(`STKeychainHelper` / `STCryptoService`) - -## 📚 文档导航 + +## 📚 模块与文档 | Modules & Docs - -### 业务接入概览 +### 业务接入顺序 -建议按“启动配置 -> 页面接入 -> 网络接入 -> 展示能力 -> 安全能力 -> 上线检查”的顺序推进: +建议按「启动配置 → 页面接入 → 网络接入 → 展示能力 → 安全能力 → 上线检查」推进: - 启动阶段:在 `AppDelegate`/`SceneDelegate` 完成基础配置 - 页面层:优先使用 `STBaseViewController` + `STBaseViewModel` - 网络层:统一使用 `STHTTPSession`,策略放在会话与拦截器层 -- 展示层:富文本场景优先使用 `STMarkdown` +- 展示层:文本展示优先使用 `STUIKit`(`STLabel` / `STTextView` 等) - 安全层:敏感数据统一使用 `STKeychainHelper`,高安全接口配合 `STSecurityConfig`/`STSSLPinningConfig` - -### 模块使用概览 +### 模块入口 -常用模块入口(点击可直接跳转): +常用模块入口(点击可跳转源码): - 基础页面与状态:[STBaseViewController](Sources/STBaseViewController/) / [STBaseViewModel](Sources/STBaseViewModel/) - 全局配置与外观:[STConfig](Sources/STConfig/) - 网络能力:[STNetwork](Sources/STNetwork/) / [网络专题文档](Docs/STHTTPSession.md) - 安全能力:[STSecurity](Sources/STSecurity/) / [安全专题文档](Docs/STSecurity.md) - 国际化能力:[STLocalizable](Sources/STLocalizable/) / [本地化专题文档](Docs/STLocalizable.md) -- 媒体能力:[STMedia](Sources/STMedia/) - UIKit 组件:[STUIKit](Sources/STUIKit/) - 通用工具:[STTools](Sources/STTools/) +- 动画与视觉:[STAnimation](Sources/STAnimation/) ### 专题文档 @@ -202,25 +127,23 @@ STBaseProject 已随 SPM target 与 CocoaPods subspec 提供 `PrivacyInfo.xcpriv - [Docs/STSecurity.md](Docs/STSecurity.md):加解密、Keychain、安全检测与策略 - [Docs/STLocalizable.md](Docs/STLocalizable.md):本地化读取、语言切换、通知刷新 - -## 📁 目录介绍 +### 源码目录 -仅列模块能力与入口,不在 README 展开具体实现细节: +- `STAnimation`:动画与视觉(含 shimmer 特效) +- `STBaseViewController` / `STBaseViewModel`:页面基类与状态管理 +- `STConfig`:全局配置与外观 +- `STNetwork`:网络会话、拦截器、WebSocket、SSL Pinning(详见 [Docs/STHTTPSession.md](Docs/STHTTPSession.md)) +- `STSecurity`:加解密、Keychain、安全检测(详见 [Docs/STSecurity.md](Docs/STSecurity.md)) +- `STLocalizable`:本地化管理与动态切换(详见 [Docs/STLocalizable.md](Docs/STLocalizable.md)) +- `STUIKit`:按钮、标签、输入框、TextView、TabBar、WebView、日志等组件 +- `STTools`:颜色、字符串、日期、文件、设备、缓存等通用工具 -- 动画与视觉:`STAnimation` -- 页面基类与状态:`STBaseViewController`、`STBaseViewModel` -- 全局配置:`STConfig` -- 网络:`STNetwork`(详见 [Docs/STHTTPSession.md](Docs/STHTTPSession.md)) -- 安全:`STSecurity`(详见 [Docs/STSecurity.md](Docs/STSecurity.md)) -- 国际化:`STLocalizable`(详见 [Docs/STLocalizable.md](Docs/STLocalizable.md)) -- 媒体能力:`STMedia` -- UIKit 组件:`STUIKit` -- 通用工具:`STTools` +### 本地 Demo -**本地 Demo**:克隆后在仓库根目录执行 `cd Example && pod install`,再用 Xcode 打开根目录的 `STBaseProject.xcworkspace`(内含 `Example/STBaseProjectExample.xcodeproj` 与 CocoaPods 生成的 `Pods`)。Demo 通过本地 SPM 引用同仓根目录的 `Package.swift`,与发布到 GitHub 的集成方式一致。 +克隆后在仓库根目录执行 `open Example/STBaseProjectExample.xcodeproj`。Demo 通过本地 SPM 引用同仓根目录的 `Package.swift`,与发布到 GitHub 的集成方式一致。 -## 🎯 主要功能 +## 🎯 主要功能 | Features ### 🎨 UI 组件 - **自定义导航栏** - 支持多种样式和自定义配置 @@ -251,61 +174,18 @@ STBaseProject 已随 SPM target 与 CocoaPods subspec 提供 `PrivacyInfo.xcpriv - **安全区域适配** - 支持刘海屏等特殊设备 - **字体适配** - 动态字体大小调整 - -## 💡 使用说明 - -README 仅保留能力概览与模块入口。 - -具体实现、参数说明与完整示例请查看对应专题文档: - -- 网络请求:`Docs/STHTTPSession.md` -- 安全能力:`Docs/STSecurity.md` -- 本地化能力:`Docs/STLocalizable.md` - - -## 📋 系统要求 - -- iOS 16.0+ -- Xcode 12.0+ -- Swift 5.0+ - - -## 🚀 Pod 发布脚本 - -仓库内提供自动发布脚本: - -```bash -./scripts/release_pod.sh 1.4.0 -``` - -推荐(自动创建并推送同名 tag): - -```bash -./scripts/release_pod.sh 1.4.0 --tag --push-tag -``` - -脚本会按顺序执行: - -- 更新 `STBaseProject.podspec` 中的 `s.version` -- 检查工作区是否干净(可用 `--allow-dirty` 跳过) -- 检查或自动创建本地 tag(`--tag`) -- 检查或自动推送远端 tag(`--push-tag`) -- 校验 tag 是否指向当前 `HEAD` -- 执行 `pod spec lint STBaseProject.podspec --allow-warnings`(可用 `--skip-lint` 跳过) -- 执行 `pod trunk push STBaseProject.podspec --allow-warnings` - -## 📄 许可证 +## 📄 许可证 | License 本项目采用 MIT 许可证。详情请参阅 [LICENSE](LICENSE) 文件。 -## 🤝 贡献 +## 🤝 贡献 | Contributing 欢迎提交 Issue 和 Pull Request 来帮助改进这个项目。 -## 📞 联系方式 +## 📞 联系方式 | Contact 如有问题或建议,请通过以下方式联系: @@ -314,4 +194,6 @@ README 仅保留能力概览与模块入口。 --- +**STBaseProject** — an iOS & Swift base components library. Keywords: *iOS, Swift, UIKit, Swift Package Manager, base library, networking, security, Keychain, localization, UI components*. + ⭐ 如果这个项目对你有帮助,请给它一个星标! diff --git a/STBaseProject.podspec b/STBaseProject.podspec deleted file mode 100644 index a3da2de..0000000 --- a/STBaseProject.podspec +++ /dev/null @@ -1,85 +0,0 @@ -# -# Be sure to run `pod lib lint STBaseProject.podspec' to ensure this is a -# valid spec before submitting. -# -# Any lines starting with a # are optional, but their use is encouraged -# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html -# - -Pod::Spec.new do |s| - s.name = 'STBaseProject' - s.version = '1.4.0' - s.summary = 'Modular iOS foundation: MVVM bases, networking, security, UIKit, Markdown, localization (SPM & CocoaPods).' - s.description = <<-DESC - STBaseProject is an iOS 16+ modular foundation toolkit distributed via CocoaPods subspecs and Swift Package Manager. - It includes STBaseViewController/STBaseViewModel patterns, STHTTPSession with interceptors and optional SSL pinning, - Keychain and crypto helpers, UIKit components and dialogs, Markdown rendering (including tables and extensions), - localization utilities, plus optional modules for Contacts, Location, and Media (camera/scan/screenshot). - DESC - - s.homepage = 'https://github.com/i-stack/STBaseProject' - s.license = { :type => 'MIT', :file => 'LICENSE' } - s.author = { 'i-stack' => 'songshoubing7664@163.com' } - s.source = { :git => 'https://github.com/i-stack/STBaseProject.git', :tag => s.version.to_s } - s.documentation_url = 'https://github.com/i-stack/STBaseProject/blob/main/README.md' - s.readme = 'https://github.com/i-stack/STBaseProject/blob/main/README.md' - - s.ios.deployment_target = '16.0' - s.swift_versions = %w[5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11] - s.requires_arc = true - # 使用 :subspecs 时会覆盖本默认值;需要核心时请显式包含 'STBaseProject',例如: - # pod 'STBaseProject', '~> x.y.z', :subspecs => ['STBaseProject', 'STLocation'] - s.default_subspecs = ['STBaseProject'] - - s.subspec 'STBaseProject' do |base| - base.source_files = 'Sources/**/*.swift' - base.exclude_files = [ - 'Sources/STContacts/**/*.swift', - 'Sources/STLocation/**/*.swift', - 'Sources/STMedia/**/*.swift', - 'Sources/STMarkdown/**/*.swift' - ] - base.resource_bundles = { - 'STBaseProject_Privacy' => ['Sources/PrivacyInfo.xcprivacy'] - } - end - - s.subspec 'STContacts' do |contacts| - contacts.source_files = 'Sources/STContacts/*.swift' - contacts.resource_bundles = { - 'STBaseProject_STContacts_Privacy' => ['Sources/STContacts/PrivacyInfo.xcprivacy'] - } - end - - s.subspec 'STLocation' do |location| - location.source_files = 'Sources/STLocation/*.swift' - location.resource_bundles = { - 'STBaseProject_STLocation_Privacy' => ['Sources/STLocation/PrivacyInfo.xcprivacy'] - } - end - - s.subspec 'STMedia' do |media| - media.source_files = 'Sources/STMedia/*.swift' - media.resource_bundles = { - 'STBaseProject_STMedia_Privacy' => ['Sources/STMedia/PrivacyInfo.xcprivacy'] - } - end - - s.subspec 'STMarkdown' do |markdown| - markdown.source_files = 'Sources/STMarkdown/**/*.swift' - markdown.dependency 'STBaseProject/STBaseProject' - markdown.dependency 'swift-markdown-pod', '~> 1.0' - markdown.dependency 'SwiftMath-pod', '>= 2.0.1.pod' - markdown.resource_bundles = { - 'STBaseProject_STMarkdown' => ['Sources/STMarkdown/Resources/*'] - } - ca_atomic = '$(inherited) -Xcc -fmodule-map-file="$(PODS_ROOT)/swift-markdown-pod/Sources/CAtomic/include/module.modulemap" -Xcc -I"$(PODS_ROOT)/swift-markdown-pod/Sources/CAtomic/include"' - markdown.pod_target_xcconfig = { - 'OTHER_SWIFT_FLAGS' => ca_atomic - } - markdown.user_target_xcconfig = { - 'OTHER_SWIFT_FLAGS' => ca_atomic - } - end - -end diff --git a/STBaseProject.xcworkspace/contents.xcworkspacedata b/STBaseProject.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index cb905fa..0000000 --- a/STBaseProject.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/STBaseProject.xcworkspace/xcshareddata/swiftpm/Package.resolved b/STBaseProject.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 459b1ad..0000000 --- a/STBaseProject.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,32 +0,0 @@ -{ - "originHash" : "6bc9e378bfd20724fd6785c7802d9b7dff68219be6e5d67467922d8fada76f0f", - "pins" : [ - { - "identity" : "swift-cmark", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-cmark.git", - "state" : { - "revision" : "924936d0427cb25a61169739a7660230bffa6ea6", - "version" : "0.8.0" - } - }, - { - "identity" : "swift-markdown", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-markdown.git", - "state" : { - "revision" : "3c6f9523da3a1ec2fd829673e472d95b8097a3b8", - "version" : "0.8.0" - } - }, - { - "identity" : "swiftmath", - "kind" : "remoteSourceControl", - "location" : "https://github.com/mgriebling/SwiftMath.git", - "state" : { - "revision" : "48ff188ba118c37d024551238041113560ab09b9" - } - } - ], - "version" : 3 -} diff --git a/Sources/PrivacyInfo.xcprivacy b/Sources/PrivacyInfo.xcprivacy index 3fc7dfc..0f88681 100644 --- a/Sources/PrivacyInfo.xcprivacy +++ b/Sources/PrivacyInfo.xcprivacy @@ -35,14 +35,6 @@ E174.1 - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategorySystemBootTime - NSPrivacyAccessedAPITypeReasons - - 35F9.1 - - diff --git a/Sources/STBaseView/STBaseView.swift b/Sources/STBaseView/STBaseView.swift index c5cf57a..f9b9fd3 100644 --- a/Sources/STBaseView/STBaseView.swift +++ b/Sources/STBaseView/STBaseView.swift @@ -35,15 +35,11 @@ open class STBaseView: UIView { public private(set) var layoutMode: STLayoutMode = .scroll public private(set) var scrollDirection: STScrollDirection = .vertical - /// scroll 模式使用的 UIScrollView。可通过 init(scrollView:) 在初始化时注入自定义实例。 - /// open 允许子类(含跨模块)override 此 getter(如将 collectionView 作为 scrollView 代理)。 - open private(set) lazy var scrollView: UIScrollView = STBaseView.makeDefaultScrollView() - /// 标记 scrollView 是否由内部创建(用于判断是否允许 configureScrollBehavior 覆盖外观/滚动配置)。 + /// 可通过 init(scrollView:) 在初始化时注入自定义实例。 private var _isInternallyCreatedScrollView: Bool = true - /// contentView 是内容容器,子视图应添加到此视图。 - /// 在 .scroll 模式下位于 scrollView 内部;在 .fixed 模式下直接贴合 self。 public private(set) lazy var contentView: UIView = self.makeContentView() - + open private(set) lazy var scrollView: UIScrollView = STBaseView.makeDefaultScrollView() + private var _tableView: UITableView? private var _collectionView: UICollectionView? /// 当前由 STBaseView 管理的 tableView 约束。 @@ -60,6 +56,10 @@ open class STBaseView: UIView { public private(set) var tableViewStyle: UITableView.Style = .plain private var keyboardObserverTokens: [NSObjectProtocol] = [] + /// 键盘响应前的基准 inset,用于在键盘收起时还原调用方原有配置(safe area / 工具栏 / 分页 footer 等)。 + private var baseContentInset: UIEdgeInsets? + private var baseVerticalIndicatorInsets: UIEdgeInsets? + private var baseHorizontalIndicatorInsets: UIEdgeInsets? private var appearanceCancellable: AnyCancellable? /// 是否启用 scrollView 的键盘 contentInset 自动调整(默认 true)。 public var enableScrollViewKeyboardAdjustment: Bool = true @@ -103,7 +103,6 @@ open class STBaseView: UIView { if self.enableAppearanceManagement { self.setupAppearanceObservation() } - self.installLayoutStructure() } /// 切换布局模式。 @@ -198,14 +197,29 @@ open class STBaseView: UIView { private func installScrollStructure() { self.installScrollViewConstraints() self.scrollView.addSubview(self.contentView) - NSLayoutConstraint.activate([ + var constraints: [NSLayoutConstraint] = [ self.contentView.topAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.topAnchor), self.contentView.leadingAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.leadingAnchor), self.contentView.trailingAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.trailingAnchor), - self.contentView.bottomAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.bottomAnchor), - // Important: make contentView width equal to scrollView frame (for vertical scrolling) - self.contentView.widthAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.widthAnchor) - ]) + self.contentView.bottomAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.bottomAnchor) + ] + // 约束语义随滚动方向变化: + // - .vertical:宽度锁定为 frame 宽度,内容只能纵向撑高。 + // - .horizontal:高度锁定为 frame 高度,内容只能横向撑宽。 + // - .both:宽高都不锁定,由内容子视图的完整约束决定 contentSize。 + // - .none:同时锁定宽高,等价于固定容器(不可滚动)。 + switch self.scrollDirection { + case .vertical: + constraints.append(self.contentView.widthAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.widthAnchor)) + case .horizontal: + constraints.append(self.contentView.heightAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.heightAnchor)) + case .both: + break + case .none: + constraints.append(self.contentView.widthAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.widthAnchor)) + constraints.append(self.contentView.heightAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.heightAnchor)) + } + NSLayoutConstraint.activate(constraints) self.configureScrollBehavior() } @@ -307,11 +321,6 @@ open class STBaseView: UIView { open override func safeAreaInsetsDidChange() { super.safeAreaInsetsDidChange() - // tableView / collectionView 使用 contentInsetAdjustmentBehavior = .never, - // 所以 safeArea 不会自动折进 adjustedContentInset,需要手动把底部 safeArea - // 写入 contentInset.bottom,否则内容会压到 home indicator。 - // 同时若存在 STRefreshHeaderView / STLoadMoreFooterView,还要保留它们 - // 已注入的额外占位(refreshing / loading / noMore 状态下 +height)。 switch self.layoutMode { case .table: if let tv = self._tableView { @@ -328,6 +337,7 @@ open class STBaseView: UIView { open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) + guard self.enableAppearanceManagement else { return } let previousStyle = previousTraitCollection?.userInterfaceStyle ?? .unspecified let currentStyle = self.traitCollection.userInterfaceStyle guard previousStyle != currentStyle else { return } @@ -356,7 +366,10 @@ open class STBaseView: UIView { let willHide = nc.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] note in self?.keyboardWillHide(note) } - self.keyboardObserverTokens = [willShow, willHide] + let willChange = nc.addObserver(forName: UIResponder.keyboardWillChangeFrameNotification, object: nil, queue: .main) { [weak self] note in + self?.keyboardWillChangeFrame(note) + } + self.keyboardObserverTokens = [willShow, willHide, willChange] } private func removeKeyboardObservers() { @@ -366,22 +379,92 @@ open class STBaseView: UIView { } private func keyboardWillShow(_ note: Notification) { - guard self.layoutMode == .scroll, self.enableScrollViewKeyboardAdjustment, let userInfo = note.userInfo else { return } - let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect) ?? .zero + self.adjustForKeyboard(using: note, appearing: true) + } + + private func keyboardWillHide(_ note: Notification) { + self.adjustForKeyboard(using: note, appearing: false) + } + + private func keyboardWillChangeFrame(_ note: Notification) { + // 旋转/分屏时键盘 frame 变化:键盘可见时按新 frame 重算增量;不可见时忽略。 + guard self.layoutMode == .scroll, self.enableScrollViewKeyboardAdjustment, note.userInfo != nil else { return } + let keyboardFrame = (note.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect) ?? .zero let converted = convert(keyboardFrame, from: nil) let insetBottom = max(0, bounds.maxY - converted.minY) - var insets = self.scrollView.contentInset - insets.bottom = insetBottom - self.scrollView.contentInset = insets - self.scrollView.scrollIndicatorInsets = insets + guard insetBottom > 0 else { return } + self.adjustForKeyboard(using: note, appearing: true) } - private func keyboardWillHide(_ note: Notification) { - guard self.layoutMode == .scroll, self.enableScrollViewKeyboardAdjustment else { return } - var insets = self.scrollView.contentInset - insets.bottom = 0 - self.scrollView.contentInset = insets - self.scrollView.scrollIndicatorInsets = insets + /// 以"基准 inset + 键盘遮挡增量"的方式调整 contentInset / scrollIndicatorInsets, + /// 隐藏时还原基准值并清空缓存,避免覆盖调用方原有的 bottom / 其他边 inset, + /// 也避免后续键盘周期恢复陈旧基准。 + private func adjustForKeyboard(using note: Notification, appearing: Bool) { + // 键盘禁用时,若此前已注入过键盘 inset(基准非空),仍要恢复到基准;否则直接退出。 + guard self.layoutMode == .scroll else { return } + guard appearing || self.baseContentInset != nil else { return } + guard let userInfo = note.userInfo, self.enableScrollViewKeyboardAdjustment else { + if !appearing, let baseContent = self.baseContentInset { + // 键盘调整被关闭,但仍需还原已注入的 inset。 + self.restoreBaseInsets() + } + return + } + + // 首次响应键盘前保存基准 inset(一次键盘周期内捕获,隐藏后清空)。 + // 垂直/水平指示器的 inset 需分别保存完整 UIEdgeInsets,避免恢复时丢失调用方原有边距。 + if self.baseContentInset == nil { + self.baseContentInset = self.scrollView.contentInset + } + if self.baseVerticalIndicatorInsets == nil { + self.baseVerticalIndicatorInsets = self.scrollView.verticalScrollIndicatorInsets + } + if self.baseHorizontalIndicatorInsets == nil { + self.baseHorizontalIndicatorInsets = self.scrollView.horizontalScrollIndicatorInsets + } + let baseContent = self.baseContentInset ?? self.scrollView.contentInset + var verticalIndicator = self.baseVerticalIndicatorInsets ?? self.scrollView.verticalScrollIndicatorInsets + var horizontalIndicator = self.baseHorizontalIndicatorInsets ?? self.scrollView.horizontalScrollIndicatorInsets + + let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect) ?? .zero + let converted = convert(keyboardFrame, from: nil) + let overlay = appearing ? max(0, bounds.maxY - converted.minY) : 0 + // 增量 = 键盘遮挡高度 - 基准已有 bottom(避免与调用方原有 bottom inset 叠加)。 + let delta = max(0, overlay - baseContent.bottom) + + var contentInset = baseContent + contentInset.bottom = baseContent.bottom + delta + // 只修改各自指示器的 bottom,其余边保持调用方原配置。 + verticalIndicator.bottom = verticalIndicator.bottom + delta + horizontalIndicator.bottom = horizontalIndicator.bottom + delta + + let duration = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 + let curveRaw = (userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber)?.uintValue ?? UInt(UIView.AnimationCurve.easeInOut.rawValue) + let options = UIView.AnimationOptions(rawValue: curveRaw << 16) + + UIView.animate(withDuration: duration, delay: 0, options: options) { + self.scrollView.contentInset = contentInset + self.scrollView.verticalScrollIndicatorInsets = verticalIndicator + self.scrollView.horizontalScrollIndicatorInsets = horizontalIndicator + if !appearing { + // 隐藏动画完成后清空基准缓存,下一次显示重新捕获当前 inset。 + self.baseContentInset = nil + self.baseVerticalIndicatorInsets = nil + self.baseHorizontalIndicatorInsets = nil + } + } + } + + private func restoreBaseInsets() { + let baseContent = self.baseContentInset ?? self.scrollView.contentInset + let verticalIndicator = self.baseVerticalIndicatorInsets ?? self.scrollView.verticalScrollIndicatorInsets + let horizontalIndicator = self.baseHorizontalIndicatorInsets ?? self.scrollView.horizontalScrollIndicatorInsets + self.scrollView.contentInset = baseContent + self.scrollView.verticalScrollIndicatorInsets = verticalIndicator + self.scrollView.horizontalScrollIndicatorInsets = horizontalIndicator + self.baseContentInset = nil + self.baseVerticalIndicatorInsets = nil + self.baseHorizontalIndicatorInsets = nil } /// Convenience for debugging: ensure last subview has bottom constraint to contentView @@ -476,21 +559,17 @@ extension STBaseView { /// - 如果当前正在 .table 模式且已存在内部默认实例,则销毁旧实例并用新 style 重建。 /// - 若外部注入过自定义 tableView,此方法不会影响已注入实例。 /// - /// ⚠️ 重建 tableView 会丢弃所有已在旧 table 上配置的状态:delegate / dataSource / + /// 重建 tableView 会丢弃所有已在旧 table 上配置的状态:delegate / dataSource / /// cell 注册 / contentOffset / 以及已挂载的 pull-to-refresh / load-more 控件。 /// 重建后调用方需要自行重新配置。推荐在创建 tableView 之前一次性确定 style。 @discardableResult public func st_tableViewStyle(_ style: UITableView.Style) -> Self { guard self.tableViewStyle != style else { return self } self.tableViewStyle = style - // 若已经存在由内部创建的 tableView,则销毁重建以让新 style 生效 if self._tableView != nil, self._isInternallyCreatedTableView { #if DEBUG assertionFailure("STBaseView.st_tableViewStyle(_:) called after the internal tableView was created. All table configuration (delegate/dataSource/cell registration/pull-to-refresh/load-more) will be lost and must be re-applied.") #endif - // 先拆除挂在旧 table 上的刷新控件,避免 KVO token 继续持有旧 scrollView(泄漏), - // 并清掉 self 上的 associated object,防止后续 st_beginRefreshing / st_endLoadMore - // 作用到已脱离视图层级的旧实例上。 self.st_removePullToRefresh() self.st_removeLoadMore() self._tableView?.removeFromSuperview() @@ -622,15 +701,12 @@ open class STSection: UIView { return self } - /// Update spacing (chainable) — equivalent to directly assigning `self.spacing`. @discardableResult public func setSpacing(_ spacing: CGFloat) -> Self { self.spacing = spacing return self } - /// Update inset (chainable) — equivalent to directly assigning `self.inset`. - /// The setter tunes the 4 retained constraints, so there's no constraint leak. @discardableResult public func setInset(_ inset: UIEdgeInsets) -> Self { self.inset = inset @@ -647,7 +723,6 @@ open class STSection: UIView { extension STBaseView { - /// 用于跟踪每个 section 与 container.bottom 之间"末尾"约束,便于添加新 section 时拆除并复用为 inter-section 约束。 private static let sectionBottomConstraintKey = STAssociationKey() private var st_lastSectionBottomConstraint: NSLayoutConstraint? { @@ -662,28 +737,34 @@ extension STBaseView { let container = self.contentContainer() container.addSubview(section) section.translatesAutoresizingMaskIntoConstraints = false - - // 移除旧的"末尾 -> container.bottom"约束(若存在) if let oldBottom = self.st_lastSectionBottomConstraint { oldBottom.isActive = false self.st_lastSectionBottomConstraint = nil } - let topSpacing = interSectionSpacing ?? section.spacing + // section.inset 仅作为 section 内部 stackView 的内边距(由 STSection 自身约束使用), + // section 相对容器保持左右贴边。STSection.spacing 原本控制 stackView 内部 arranged subviews 的间距, + // 因此不可兼作 section 对容器的外边距:首尾 section 直接贴容器,section 之间才使用 interSectionSpacing。 if let last = container.subviews.dropLast().last { - section.topAnchor.constraint(equalTo: last.bottomAnchor, constant: topSpacing).isActive = true + #if DEBUG + assert(last is STSection, "STBaseView.st_addSection: contentContainer 中存在非 STSection 子视图(可能混用了 st_addContentSubview),链式约束将锚定到错误视图。请勿混用这两个 API。") + #endif + let interSpacing = interSectionSpacing ?? 0 + section.topAnchor.constraint(equalTo: last.bottomAnchor, constant: interSpacing).isActive = true } else { - section.topAnchor.constraint(equalTo: container.topAnchor, constant: section.inset.top).isActive = true + // 首个 section:顶部直接贴容器(无外边距)。 + section.topAnchor.constraint(equalTo: container.topAnchor).isActive = true } NSLayoutConstraint.activate([ - section.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: section.inset.left), - section.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -section.inset.right) + section.leadingAnchor.constraint(equalTo: container.leadingAnchor), + section.trailingAnchor.constraint(equalTo: container.trailingAnchor) ]) // 在 .scroll 模式下,必须建立 section.bottom -> container.bottom 的约束才能算出 contentSize。 // 在 .fixed 模式下也建立此约束以保证布局完整;在 table/collection 容器下不强制。 + // 末尾 section 直接贴容器底部(无外边距)。 if self.layoutMode == .scroll || self.layoutMode == .fixed { - let bottom = section.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: -section.inset.bottom) + let bottom = section.bottomAnchor.constraint(equalTo: container.bottomAnchor) bottom.priority = .defaultHigh bottom.isActive = true self.st_lastSectionBottomConstraint = bottom @@ -801,7 +882,6 @@ open class STGradientNavigationBar: UIView { public override func layoutSubviews() { super.layoutSubviews() - // frame 更新仍需每次布局同步;颜色/起止点已在属性变化/初始化时设置。 self.gradientLayer.frame = self.bounds } @@ -811,7 +891,6 @@ open class STGradientNavigationBar: UIView { open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) - // 动态色适配:当 trait 变化导致 UIColor -> cgColor 对应分辨率变化时需重算 if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { self.updateGradientColors() } @@ -819,7 +898,6 @@ open class STGradientNavigationBar: UIView { } // MARK: - Refresh & Load More - private enum STRefreshKeys { static let header = STAssociationKey() static let footer = STAssociationKey() diff --git a/Sources/STBaseViewController/STBaseViewController.swift b/Sources/STBaseViewController/STBaseViewController.swift index f4b82e9..1d4bef0 100644 --- a/Sources/STBaseViewController/STBaseViewController.swift +++ b/Sources/STBaseViewController/STBaseViewController.swift @@ -37,6 +37,12 @@ open class STBaseViewController: UIViewController { public private(set) var navigationBarView = UIView() public private(set) var navigationBarItemsView = UIView() public private(set) var navGradientBar: STGradientNavigationBar? + + /// 撑起导航栏高度的约束(navigationBarItemsView 高度 + 与 navigationBarView.bottom 的关联)。 + /// `.none` 时需将高度约束常量置 0(约束本身保持激活、不移除),否则隐藏后内容区顶部会残留一段死区。 + private var navigationBarHeightConstraint: NSLayoutConstraint? + private var navigationBarBottomConstraint: NSLayoutConstraint? + private var isNavigationBarCollapsed = false public var navBarBackgroundColor: UIColor = .white { didSet { if self.liquidGlassContainerView == nil { @@ -86,6 +92,11 @@ open class STBaseViewController: UIViewController { } public var statusBarHidden: Bool = false public var statusBarStyle: UIStatusBarStyle = .default + /// 本基类在 `viewWillAppear` 中把系统导航栏设为该值,但**没有对称的恢复时机**: + /// 若从 STBaseViewController push 到一个未继承本基类、且期望系统导航栏可见的 UIViewController, + /// 系统栏会保持隐藏(目标 VC 的 viewWillAppear 不会恢复它)。 + /// 因此本库隐含假设「导航栈内所有 VC 均继承 STBaseViewController」。 + /// 混用系统 VC 时,请在目标 VC 的 viewWillAppear 中自行 `navigationController?.setNavigationBarHidden(false, animated:)`。 open var prefersSystemNavigationBarHidden: Bool { true } public var contentTopAnchor: NSLayoutYAxisAnchor { self.navigationBarView.bottomAnchor } private var appearanceCancellable: AnyCancellable? @@ -151,13 +162,18 @@ open class STBaseViewController: UIViewController { NSLayoutConstraint.activate([ self.navigationBarView.topAnchor.constraint(equalTo: self.view.topAnchor), self.navigationBarView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - self.navigationBarView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), - self.navigationBarView.bottomAnchor.constraint(equalTo: self.navigationBarItemsView.bottomAnchor) + self.navigationBarView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor) ]) + self.navigationBarBottomConstraint = self.navigationBarView.bottomAnchor.constraint(equalTo: self.navigationBarItemsView.bottomAnchor) + self.navigationBarBottomConstraint.map { NSLayoutConstraint.activate([$0]) } + + let initialHeight = self.isNavigationBarCollapsed ? 0 : STDeviceAdapter.navigationBarContentHeight + let heightConstraint = self.navigationBarItemsView.heightAnchor.constraint(equalToConstant: initialHeight) + self.navigationBarHeightConstraint = heightConstraint NSLayoutConstraint.activate([ self.navigationBarItemsView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), - self.navigationBarItemsView.heightAnchor.constraint(equalToConstant: STDeviceAdapter.navigationBarContentHeight), + heightConstraint, self.navigationBarItemsView.leadingAnchor.constraint(equalTo: self.navigationBarView.leadingAnchor), self.navigationBarItemsView.trailingAnchor.constraint(equalTo: self.navigationBarView.trailingAnchor) ]) @@ -175,6 +191,10 @@ open class STBaseViewController: UIViewController { self.leftBtn.addTarget(self, action: #selector(self.onLeftBtnTap), for: .touchUpInside) self.rightBtn.addTarget(self, action: #selector(self.onRightBtnTap), for: .touchUpInside) + // 仅含图片时的无障碍兜底文案(有 title 时优先用 title,无需此处设置)。 + // 从本地化资源读取,并在语言切换时由 st_refreshAccessibilityFallbacks 同步刷新。 + self.st_refreshAccessibilityFallbacks() + self.view.bringSubviewToFront(self.navigationBarView) } @@ -231,6 +251,11 @@ open class STBaseViewController: UIViewController { } /// 替换左按钮约束;自动停用旧约束、启用新约束 + /// + /// ⚠️ 约束耦合提示:左/右按钮约束默认通过 `avoidTitleOverlap` 引用了 `titleLabel` 的锚点, + /// 标题约束默认也引用了左/右按钮的锚点(三者相互引用 anchor,而非固定值)。 + /// 若只替换其中一组,其余两组对 titleLabel 的引用仍会生效(实测不崩,但布局意图可能偏离预期)。 + /// 自定义布局时建议三者整体重写,保持一致。 @discardableResult public func st_replaceLeftButtonConstraints(_ builder: (UIView) -> [NSLayoutConstraint]) -> Self { self.leftBtnConstraints = builder(self.navigationBarItemsView) @@ -238,6 +263,9 @@ open class STBaseViewController: UIViewController { } /// 替换右按钮约束;自动停用旧约束、启用新约束 + /// + /// ⚠️ 见 `st_replaceLeftButtonConstraints` 的约束耦合说明:左/右/标题三组约束相互引用, + /// 建议整体重写而非只替换其一。 @discardableResult public func st_replaceRightButtonConstraints(_ builder: (UIView) -> [NSLayoutConstraint]) -> Self { self.rightBtnConstraints = builder(self.navigationBarItemsView) @@ -245,6 +273,9 @@ open class STBaseViewController: UIViewController { } /// 替换标题约束;自动停用旧约束、启用新约束 + /// + /// ⚠️ 见 `st_replaceLeftButtonConstraints` 的约束耦合说明:左/右/标题三组约束相互引用, + /// 建议整体重写而非只替换其一。 @discardableResult public func st_replaceTitleLabelConstraints(_ builder: (UIView) -> [NSLayoutConstraint]) -> Self { self.titleLabelConstraints = builder(self.navigationBarItemsView) @@ -332,6 +363,9 @@ open class STBaseViewController: UIViewController { let hideBar = (type == .none) self.navigationBarView.isHidden = hideBar self.navigationBarItemsView.isHidden = hideBar + // `.none` 的语义是「全屏无导航栏占位」:除 isHidden 外,必须把撑高约束的常量置 0 + // (约束保持激活、不移除),否则 contentTopAnchor(恒等于 navigationBarView.bottomAnchor)仍会保留 navBarHeight 的死区。 + self.setNavigationBarCollapsed(hideBar) switch type { case .showLeftBtn: self.leftBtn.isHidden = false @@ -348,6 +382,25 @@ open class STBaseViewController: UIViewController { } } + /// 折叠/展开导航栏的占位高度(.none 时折叠)。Liquid Glass 迁移会重建约束,故需重取引用。 + private func setNavigationBarCollapsed(_ collapsed: Bool) { + guard self.isNavigationBarCollapsed != collapsed else { return } + self.isNavigationBarCollapsed = collapsed + // 视图尚未加载时,仅记录状态;高度约束在 setupNavigationBar 中会按此状态取初始常量。 + // 视图已加载后,约束已存在,这里实时更新常量。 + let height = collapsed ? 0 : STDeviceAdapter.navigationBarContentHeight + self.navigationBarHeightConstraint?.constant = height + if self.isViewLoaded { self.view.setNeedsLayout() } + } + + /// 从本地化资源刷新左右按钮「仅含图片」时的无障碍兜底文案。 + /// 调用方显式传入的 accessibilityLabel 仍具有最高优先级(存于 STIconBtn.st_explicitAccessibilityLabel)。 + /// value 传入英文,确保无任何本地化资源时(或当前语言无该 key 时)回退为英文,而非固定中文。 + func st_refreshAccessibilityFallbacks() { + self.leftBtn.st_fallbackAccessibilityLabel = Bundle.st_localizedString(key: "st_nav_back", value: "Back") + self.rightBtn.st_fallbackAccessibilityLabel = Bundle.st_localizedString(key: "st_nav_more", value: "More") + } + @discardableResult open func st_setTitle(_ text: String) -> Self { self.titleLabel.text = text @@ -360,17 +413,29 @@ open class STBaseViewController: UIViewController { return self } + /// 设置左侧导航按钮。 + /// + /// 无障碍标签优先级:显式传入的 `accessibilityLabel` > `title` > 仅含图片时的本地化兜底文案。 + /// + /// - Important: 本地化资源由**宿主 App 提供**,本库不内置翻译。 + /// 若希望仅含图片时朗读本地化文案,请在宿主 App 的 `Localizable.strings` 中提供 + /// `st_nav_back`(左)与 `st_nav_more`(右)两个 key; + /// 未提供时统一回退英文 "Back" / "More"。需要其他文案请直接传 `accessibilityLabel`。 @discardableResult - open func st_setLeftBtn(image: UIImage? = nil, title: String? = nil) -> Self { + open func st_setLeftBtn(image: UIImage? = nil, title: String? = nil, accessibilityLabel: String? = nil) -> Self { if let image { self.leftBtnImage = image } if let title { self.leftBtnTitle = title } + if let accessibilityLabel { self.leftBtn.accessibilityLabel = accessibilityLabel } return self } + /// 设置右侧导航按钮。无障碍标签优先级与本地化资源契约同 `st_setLeftBtn(image:title:accessibilityLabel:)` + /// (宿主 App 提供 `st_nav_more`,未提供时回退英文 "More")。 @discardableResult - open func st_setRightBtn(image: UIImage? = nil, title: String? = nil) -> Self { + open func st_setRightBtn(image: UIImage? = nil, title: String? = nil, accessibilityLabel: String? = nil) -> Self { if let image { self.rightBtnImage = image } if let title { self.rightBtnTitle = title } + if let accessibilityLabel { self.rightBtn.accessibilityLabel = accessibilityLabel } return self } @@ -469,10 +534,15 @@ extension STBaseViewController { // removeFromSuperview 会一并销毁 items view 的所有约束(含决定 navigationBarView 高度的 bottom 约束),必须重建。 self.navigationBarItemsView.removeFromSuperview() container.contentView.addSubview(self.navigationBarItemsView) + let bottomConstraint = self.navigationBarView.bottomAnchor.constraint(equalTo: self.navigationBarItemsView.bottomAnchor) + let heightConstraint = self.navigationBarItemsView.heightAnchor.constraint(equalToConstant: STDeviceAdapter.navigationBarContentHeight) + self.navigationBarBottomConstraint = bottomConstraint + self.navigationBarHeightConstraint = heightConstraint + if self.isNavigationBarCollapsed { heightConstraint.constant = 0 } NSLayoutConstraint.activate([ - self.navigationBarView.bottomAnchor.constraint(equalTo: self.navigationBarItemsView.bottomAnchor), + bottomConstraint, self.navigationBarItemsView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), - self.navigationBarItemsView.heightAnchor.constraint(equalToConstant: STDeviceAdapter.navigationBarContentHeight), + heightConstraint, self.navigationBarItemsView.leadingAnchor.constraint(equalTo: container.contentView.leadingAnchor), self.navigationBarItemsView.trailingAnchor.constraint(equalTo: container.contentView.trailingAnchor) ]) @@ -487,10 +557,15 @@ extension STBaseViewController { // 迁回 navigationBarView 并重建完整约束(含决定 nav 栏高度的 bottom 约束) self.navigationBarItemsView.removeFromSuperview() self.navigationBarView.addSubview(self.navigationBarItemsView) + let bottomConstraint = self.navigationBarView.bottomAnchor.constraint(equalTo: self.navigationBarItemsView.bottomAnchor) + let heightConstraint = self.navigationBarItemsView.heightAnchor.constraint(equalToConstant: STDeviceAdapter.navigationBarContentHeight) + self.navigationBarBottomConstraint = bottomConstraint + self.navigationBarHeightConstraint = heightConstraint + if self.isNavigationBarCollapsed { heightConstraint.constant = 0 } NSLayoutConstraint.activate([ - self.navigationBarView.bottomAnchor.constraint(equalTo: self.navigationBarItemsView.bottomAnchor), + bottomConstraint, self.navigationBarItemsView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), - self.navigationBarItemsView.heightAnchor.constraint(equalToConstant: STDeviceAdapter.navigationBarContentHeight), + heightConstraint, self.navigationBarItemsView.leadingAnchor.constraint(equalTo: self.navigationBarView.leadingAnchor), self.navigationBarItemsView.trailingAnchor.constraint(equalTo: self.navigationBarView.trailingAnchor) ]) diff --git a/Sources/STContacts/PrivacyInfo.xcprivacy b/Sources/STContacts/PrivacyInfo.xcprivacy deleted file mode 100644 index 2009fb7..0000000 --- a/Sources/STContacts/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,14 +0,0 @@ - - - - - NSPrivacyTracking - - NSPrivacyTrackingDomains - - NSPrivacyCollectedDataTypes - - NSPrivacyAccessedAPITypes - - - diff --git a/Sources/STContacts/STContact.swift b/Sources/STContacts/STContact.swift deleted file mode 100644 index 94d1ca4..0000000 --- a/Sources/STContacts/STContact.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// STContact.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import Foundation - -public struct STContact: Sendable, Hashable { - public let identifier: String - public let fullName: String? - public let phoneNumbers: [String] - - public init(identifier: String, fullName: String?, phoneNumbers: [String]) { - self.identifier = identifier - self.fullName = fullName - self.phoneNumbers = phoneNumbers - } -} diff --git a/Sources/STContacts/STContactError.swift b/Sources/STContacts/STContactError.swift deleted file mode 100644 index b574deb..0000000 --- a/Sources/STContacts/STContactError.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// STContactError.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import Foundation - -public enum STContactError: Error { - case permissionDenied - case fetchFailed(Error) -} - -extension STContactError: LocalizedError { - public var errorDescription: String? { - switch self { - case .permissionDenied: - return NSLocalizedString("st_contacts.error.permission_denied", comment: "") - case .fetchFailed(let underlying): - return underlying.localizedDescription - } - } -} diff --git a/Sources/STContacts/STContactPermissionStatus.swift b/Sources/STContacts/STContactPermissionStatus.swift deleted file mode 100644 index 4c133cc..0000000 --- a/Sources/STContacts/STContactPermissionStatus.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// STContactPermissionStatus.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import Contacts - -public enum STContactPermissionStatus: Sendable { - case notDetermined - case restricted - case denied - case limited - case authorized -} - -extension STContactPermissionStatus { - public init(_ rawStatus: CNAuthorizationStatus) { - switch rawStatus { - case .notDetermined: self = .notDetermined - case .restricted: self = .restricted - case .denied: self = .denied - case .limited: self = .limited - case .authorized: self = .authorized - @unknown default: self = .denied - } - } -} diff --git a/Sources/STContacts/STContactService.swift b/Sources/STContacts/STContactService.swift deleted file mode 100644 index c5d78bf..0000000 --- a/Sources/STContacts/STContactService.swift +++ /dev/null @@ -1,90 +0,0 @@ -// -// STContactService.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import Foundation -#if os(iOS) -@preconcurrency import Contacts - -public final class STContactService: @unchecked Sendable { - - public static let shared = STContactService() - - public init() {} - - public var permissionStatus: STContactPermissionStatus { - STContactPermissionStatus(CNContactStore.authorizationStatus(for: .contacts)) - } - - public func requestPermissionAndFetch() async throws -> [STContact] { - try await self.requestPermission() - return try await self.fetchContacts() - } - - private let contactStore = CNContactStore() - private let keysToFetch: [CNKeyDescriptor] = [ - CNContactFormatter.descriptorForRequiredKeys(for: .fullName), - CNContactPhoneNumbersKey as CNKeyDescriptor - ] -} - -extension STContactService: STContactServiceProtocol {} - -private extension STContactService { - func requestPermission() async throws { - try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in - self.contactStore.requestAccess(for: .contacts) { granted, error in - if granted { - continuation.resume() - } else if let error = error { - continuation.resume(throwing: STContactError.fetchFailed(error)) - } else { - continuation.resume(throwing: STContactError.permissionDenied) - } - } - } - } - - func fetchContacts() async throws -> [STContact] { - let store = self.contactStore - let keys = self.keysToFetch - return try await withCheckedThrowingContinuation { continuation in - DispatchQueue.global(qos: .userInitiated).async { - do { - let containers = try store.containers(matching: nil) - var seen = Set() - var rawContacts: [CNContact] = [] - for container in containers { - let predicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier) - let batch = try store.unifiedContacts(matching: predicate, keysToFetch: keys) - for contact in batch where seen.insert(contact.identifier).inserted { - rawContacts.append(contact) - } - } - let contacts = rawContacts.map { STContact(contact: $0) } - continuation.resume(returning: contacts) - } catch { - continuation.resume(throwing: STContactError.fetchFailed(error)) - } - } - } - } -} - -private extension STContact { - init(contact: CNContact) { - self.identifier = contact.identifier - self.fullName = CNContactFormatter.string(from: contact, style: .fullName) - self.phoneNumbers = contact.phoneNumbers.map { $0.value.stringValue } - } -} -#else -@available(macOS, unavailable, message: "STContactService is only available on iOS.") -public final class STContactService: @unchecked Sendable { - public static let shared = STContactService() - public init() {} -} -#endif diff --git a/Sources/STContacts/STContactServiceProtocol.swift b/Sources/STContacts/STContactServiceProtocol.swift deleted file mode 100644 index eefbdb6..0000000 --- a/Sources/STContacts/STContactServiceProtocol.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// STContactServiceProtocol.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import Foundation - -public protocol STContactServiceProtocol { - var permissionStatus: STContactPermissionStatus { get } - func requestPermissionAndFetch() async throws -> [STContact] -} diff --git a/Sources/STLocalizable/STLocalizationManager.swift b/Sources/STLocalizable/STLocalizationManager.swift index b66d157..77a8cc7 100644 --- a/Sources/STLocalizable/STLocalizationManager.swift +++ b/Sources/STLocalizable/STLocalizationManager.swift @@ -82,9 +82,13 @@ public extension Bundle { } /// 获取本地化字符串,优先使用自定义语言包 - static func st_localizedString(key: String, tableName: String = "Localizable") -> String { + /// - Parameters: + /// - key: 本地化 key + /// - value: 未找到对应翻译时的回退值(建议用英文,而非固定中文),默认 nil + /// - tableName: 字符串表名,默认 "Localizable" + static func st_localizedString(key: String, value: String? = nil, tableName: String = "Localizable") -> String { let bundle = customLanguageBundle ?? Bundle.main - return bundle.localizedString(forKey: key, value: nil, table: tableName) + return bundle.localizedString(forKey: key, value: value, table: tableName) } /// 切换到指定语言代码(如 "zh-Hans"、"en") diff --git a/Sources/STLocalizable/STViewControllerLocalization.swift b/Sources/STLocalizable/STViewControllerLocalization.swift index 240d523..dfb53b6 100644 --- a/Sources/STLocalizable/STViewControllerLocalization.swift +++ b/Sources/STLocalizable/STViewControllerLocalization.swift @@ -20,6 +20,8 @@ public extension STBaseViewController { @objc func st_updateLocalizedTexts() { self.st_applyTitleLocalization() self.updateLocalizedTextsInView(self.view) + // 同步刷新导航按钮「仅含图片」时的无障碍兜底文案(语言切换后朗读应跟随) + self.st_refreshAccessibilityFallbacks() } private func st_applyTitleLocalization() { diff --git a/Sources/STLocation/PrivacyInfo.xcprivacy b/Sources/STLocation/PrivacyInfo.xcprivacy deleted file mode 100644 index 2009fb7..0000000 --- a/Sources/STLocation/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,14 +0,0 @@ - - - - - NSPrivacyTracking - - NSPrivacyTrackingDomains - - NSPrivacyCollectedDataTypes - - NSPrivacyAccessedAPITypes - - - diff --git a/Sources/STLocation/STLocationManager.swift b/Sources/STLocation/STLocationManager.swift deleted file mode 100644 index 8065b17..0000000 --- a/Sources/STLocation/STLocationManager.swift +++ /dev/null @@ -1,395 +0,0 @@ -// -// STLocationManager.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import CoreLocation -import Foundation - -#if os(iOS) - -public struct STLocationInfo { - public let name: String? - public let country: String? - public let latitude: Double - public let longitude: Double - public let locality: String? - public let subLocality: String? - public let thoroughfare: String? - public let subThoroughfare: String? - public let isoCountryCode: String? - public let administrativeArea: String? - public let postalCode: String? - public let timestamp: Date - - public init(name: String? = nil, - country: String? = nil, - latitude: Double = 0.0, - longitude: Double = 0.0, - locality: String? = nil, - subLocality: String? = nil, - thoroughfare: String? = nil, - subThoroughfare: String? = nil, - isoCountryCode: String? = nil, - administrativeArea: String? = nil, - postalCode: String? = nil, - timestamp: Date = Date()) { - self.name = name - self.country = country - self.latitude = latitude - self.longitude = longitude - self.locality = locality - self.subLocality = subLocality - self.thoroughfare = thoroughfare - self.subThoroughfare = subThoroughfare - self.isoCountryCode = isoCountryCode - self.administrativeArea = administrativeArea - self.postalCode = postalCode - self.timestamp = timestamp - } - - public var formattedAddress: String { - var components: [String] = [] - if let v = self.thoroughfare, !v.isEmpty { components.append(v) } - if let v = self.subThoroughfare, !v.isEmpty { components.append(v) } - if let v = self.subLocality, !v.isEmpty { components.append(v) } - if let v = self.locality, !v.isEmpty { components.append(v) } - if let v = self.administrativeArea, !v.isEmpty { components.append(v) } - if let v = self.country, !v.isEmpty { components.append(v) } - return components.joined(separator: ", ") - } - - public var coordinateString: String { - return "\(self.latitude),\(self.longitude)" - } -} - -public struct STLocationConfig { - public let desiredAccuracy: CLLocationAccuracy - public let distanceFilter: CLLocationDistance - public let timeout: TimeInterval - public let maximumAge: TimeInterval - - public init(desiredAccuracy: CLLocationAccuracy = kCLLocationAccuracyNearestTenMeters, - distanceFilter: CLLocationDistance = 10.0, - timeout: TimeInterval = 30.0, - maximumAge: TimeInterval = 300.0) { - self.desiredAccuracy = desiredAccuracy - self.distanceFilter = distanceFilter - self.timeout = timeout - self.maximumAge = maximumAge - } - - public static let `default` = STLocationConfig() - public static let highAccuracy = STLocationConfig(desiredAccuracy: kCLLocationAccuracyBest, - distanceFilter: 1.0, - timeout: 15.0, - maximumAge: 60.0) - public static let lowAccuracy = STLocationConfig(desiredAccuracy: kCLLocationAccuracyKilometer, - distanceFilter: 1000.0, - timeout: 60.0, - maximumAge: 600.0) -} - -public enum STLocationError: Error, LocalizedError { - case authorizationDenied - case authorizationRestricted - case locationServicesDisabled - case timeout - case networkError - case geocodingFailed(Error?) - case busy - case unknown(Error) - - public var errorDescription: String? { - switch self { - case .authorizationDenied: return "位置权限被拒绝" - case .authorizationRestricted: return "位置权限受限" - case .locationServicesDisabled: return "位置服务已禁用" - case .timeout: return "获取位置超时" - case .networkError: return "网络错误" - case .geocodingFailed(let e): return e.map { "地理编码失败: \($0.localizedDescription)" } ?? "地理编码失败" - case .busy: return "正在获取位置中" - case .unknown(let error): return "未知错误: \(error.localizedDescription)" - } - } -} - -@MainActor -public protocol STLocationManagerProtocol: AnyObject { - func st_configure(with config: STLocationConfig) - func st_requestWhenInUseAuthorization(completion: @escaping (CLAuthorizationStatus) -> Void) - func st_requestAlwaysAuthorization(completion: @escaping (CLAuthorizationStatus) -> Void) - func st_checkLocationPermission(completion: @escaping (CLAuthorizationStatus) -> Void) - func st_getCurrentLocation(config: STLocationConfig?, completion: @escaping (Result) -> Void) - func st_startUpdatingLocation(config: STLocationConfig?, completion: @escaping (Result) -> Void) - func st_stopUpdatingLocation() - func st_getLastKnownLocation() -> STLocationInfo? - func st_clearLocationCache() -} - -protocol STCLLocationManaging: AnyObject { - var delegate: CLLocationManagerDelegate? { get set } - var desiredAccuracy: CLLocationAccuracy { get set } - var distanceFilter: CLLocationDistance { get set } - var authorizationStatus: CLAuthorizationStatus { get } - func isLocationServicesEnabled() -> Bool - func requestWhenInUseAuthorization() - func requestAlwaysAuthorization() - func startUpdatingLocation() - func stopUpdatingLocation() -} - -extension CLLocationManager: STCLLocationManaging { - func isLocationServicesEnabled() -> Bool { - return CLLocationManager.locationServicesEnabled() - } -} - -protocol STCLGeocoderProtocol: AnyObject { - var isGeocoding: Bool { get } - func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping @Sendable ([CLPlacemark]?, Error?) -> Void) - func cancelGeocode() -} - -extension CLGeocoder: STCLGeocoderProtocol {} - -@MainActor -public class STLocationManager: NSObject { - - public static let shared = STLocationManager() - - private var currentConfig: STLocationConfig = .default - private var locationCompletion: ((Result) -> Void)? - private var permissionCompletion: ((CLAuthorizationStatus) -> Void)? - private var isUpdating = false - private var isContinuousUpdating = false - private var requestGeneration: Int = 0 - private var lastLocationInfo: STLocationInfo? - private var lastLocationTime: Date? - private var timeoutTask: Task? - private var clManager: STCLLocationManaging - private let geocoder: STCLGeocoderProtocol - - public override init() { - let manager = CLLocationManager() - self.clManager = manager - self.geocoder = CLGeocoder() - super.init() - manager.delegate = self - manager.desiredAccuracy = self.currentConfig.desiredAccuracy - manager.distanceFilter = self.currentConfig.distanceFilter - } - - init(clManager: STCLLocationManaging, geocoder: STCLGeocoderProtocol) { - self.clManager = clManager - self.geocoder = geocoder - super.init() - clManager.delegate = self - } -} - -extension STLocationManager: STLocationManagerProtocol { - public func st_configure(with config: STLocationConfig) { - self.currentConfig = config - self.clManager.desiredAccuracy = config.desiredAccuracy - self.clManager.distanceFilter = config.distanceFilter - } - - public func st_requestWhenInUseAuthorization(completion: @escaping (CLAuthorizationStatus) -> Void) { - guard self.permissionCompletion == nil else { return } - self.permissionCompletion = completion - self.clManager.requestWhenInUseAuthorization() - } - - public func st_requestAlwaysAuthorization(completion: @escaping (CLAuthorizationStatus) -> Void) { - guard self.permissionCompletion == nil else { return } - self.permissionCompletion = completion - self.clManager.requestAlwaysAuthorization() - } - - public func st_checkLocationPermission(completion: @escaping (CLAuthorizationStatus) -> Void) { - completion(self.clManager.authorizationStatus) - } - - public func st_getCurrentLocation(config: STLocationConfig? = nil, completion: @escaping (Result) -> Void) { - guard !self.isUpdating else { - completion(.failure(.busy)) - return - } - guard self.clManager.isLocationServicesEnabled() else { - completion(.failure(.locationServicesDisabled)) - return - } - let status = self.clManager.authorizationStatus - guard Self.isLocationAccessAuthorized(status) else { - completion(.failure(status == .restricted ? .authorizationRestricted : .authorizationDenied)) - return - } - if let last = self.lastLocationInfo, - let lastTime = self.lastLocationTime, - Date().timeIntervalSince(lastTime) < self.currentConfig.maximumAge { - completion(.success(last)) - return - } - if let newConfig = config { - self.st_configure(with: newConfig) - } - self.requestGeneration += 1 - self.locationCompletion = completion - self.isUpdating = true - self.isContinuousUpdating = false - self.startTimeoutTask() - self.clManager.startUpdatingLocation() - } - - public func st_startUpdatingLocation(config: STLocationConfig? = nil, completion: @escaping (Result) -> Void) { - guard !self.isUpdating else { - completion(.failure(.busy)) - return - } - guard self.clManager.isLocationServicesEnabled() else { - completion(.failure(.locationServicesDisabled)) - return - } - let status = self.clManager.authorizationStatus - guard Self.isLocationAccessAuthorized(status) else { - completion(.failure(status == .restricted ? .authorizationRestricted : .authorizationDenied)) - return - } - if let newConfig = config { - self.st_configure(with: newConfig) - } - self.requestGeneration += 1 - self.locationCompletion = completion - self.isUpdating = true - self.isContinuousUpdating = true - self.clManager.startUpdatingLocation() - } - - public func st_stopUpdatingLocation() { - self.requestGeneration += 1 - self.isContinuousUpdating = false - self.isUpdating = false - self.locationCompletion = nil - self.geocoder.cancelGeocode() - self.cancelTimeoutTask() - self.clManager.stopUpdatingLocation() - } - - public func st_getLastKnownLocation() -> STLocationInfo? { - return self.lastLocationInfo - } - - public func st_clearLocationCache() { - self.lastLocationInfo = nil - self.lastLocationTime = nil - } -} - -extension STLocationManager { - private static func isLocationAccessAuthorized(_ status: CLAuthorizationStatus) -> Bool { - #if os(macOS) - return status == .authorizedAlways - #else - return status == .authorizedWhenInUse || status == .authorizedAlways - #endif - } - - private func startTimeoutTask() { - self.cancelTimeoutTask() - let timeout = self.currentConfig.timeout - self.timeoutTask = Task { @MainActor [weak self] in - try? await Task.sleep(nanoseconds: UInt64(timeout * 1_000_000_000)) - guard !Task.isCancelled, let self = self else { return } - self.handleLocationTimeout() - } - } - - private func cancelTimeoutTask() { - self.timeoutTask?.cancel() - self.timeoutTask = nil - } - - private func handleLocationTimeout() { - self.cancelTimeoutTask() - self.finishRequest(with: .failure(.timeout)) - } - - private func processLocation(_ location: CLLocation) { - let age = Date().timeIntervalSince(location.timestamp) - guard age < self.currentConfig.maximumAge else { return } - guard !self.geocoder.isGeocoding else { return } - let capturedGeneration = self.requestGeneration - let latitude = location.coordinate.latitude - let longitude = location.coordinate.longitude - let timestamp = location.timestamp - self.geocoder.reverseGeocodeLocation(location) { [weak self] placemarks, error in - Task { @MainActor [weak self] in - guard let self = self else { return } - guard self.requestGeneration == capturedGeneration else { return } - guard let placemark = placemarks?.first else { - self.finishRequest(with: .failure(.geocodingFailed(error))) - return - } - let locationInfo = STLocationInfo( - name: placemark.name, - country: placemark.country, - latitude: latitude, - longitude: longitude, - locality: placemark.locality, - subLocality: placemark.subLocality, - thoroughfare: placemark.thoroughfare, - subThoroughfare: placemark.subThoroughfare, - isoCountryCode: placemark.isoCountryCode, - administrativeArea: placemark.administrativeArea, - postalCode: placemark.postalCode, - timestamp: timestamp - ) - self.lastLocationInfo = locationInfo - self.lastLocationTime = Date() - self.finishRequest(with: .success(locationInfo)) - } - } - } - - private func finishRequest(with result: Result) { - if self.isContinuousUpdating, case .success = result { - self.locationCompletion?(result) - } else { - let completion = self.locationCompletion - self.locationCompletion = nil - self.isUpdating = false - self.isContinuousUpdating = false - self.cancelTimeoutTask() - self.clManager.stopUpdatingLocation() - completion?(result) - } - } -} - -extension STLocationManager: CLLocationManagerDelegate { - nonisolated public func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { - let status = manager.authorizationStatus - Task { @MainActor [weak self] in - self?.permissionCompletion?(status) - self?.permissionCompletion = nil - } - } - - nonisolated public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { - guard let location = locations.last else { return } - Task { @MainActor [weak self] in - self?.processLocation(location) - } - } - - nonisolated public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { - Task { @MainActor [weak self] in - self?.finishRequest(with: .failure(.unknown(error))) - } - } -} -#endif diff --git a/Sources/STMarkdown/Attachments/STMarkdownAttachmentRefreshSupport.swift b/Sources/STMarkdown/Attachments/STMarkdownAttachmentRefreshSupport.swift deleted file mode 100644 index 112f75c..0000000 --- a/Sources/STMarkdown/Attachments/STMarkdownAttachmentRefreshSupport.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// STMarkdownAttachmentRefreshSupport.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -enum STMarkdownAttachmentRefreshSupport { - /// 为 `attributedText` 内所有可刷新 attachment 注册刷新观察者。 - /// - /// 与早期覆盖式赋值不同,这里走 `STMarkdownRefreshableAttachment.addDisplayObserver` - /// 走多播订阅,同一个 attachment 被多个 TextView 同时挂载时不会互相覆盖。 - /// 调用方需要持有返回的 `[STMarkdownRefreshObservation]`,在文本被替换或 TextView - /// 销毁时通过 `invalidate()` 解绑,否则旧 TextView 会继续被回调(虽然 `[weak self]` - /// 会让回调成为 no-op,但仍会保留多余的 entry 直到 attachment 释放)。 - /// - /// - Parameters: - /// - attributedText: 待扫描的富文本。 - /// - refresh: 主线程闭包;图像就绪时会在主线程被调用,参数为触发刷新的 attachment。 - /// - Returns: 注册产生的 observation token 数组,调用方持有以控制生命周期。 - @discardableResult - static func bindRefreshHandlers(in attributedText: NSAttributedString, refresh: @escaping @MainActor (_ attachment: NSTextAttachment) -> Void) -> [STMarkdownRefreshObservation] { - let range = NSRange(location: 0, length: attributedText.length) - guard range.length > 0 else { return [] } - var tokens: [STMarkdownRefreshObservation] = [] - attributedText.enumerateAttribute(.attachment, in: range) { value, _, _ in - guard let attachment = value as? STMarkdownRefreshableAttachment else { return } - let token = attachment.addDisplayObserver { [weak attachment] in - guard let attachment else { return } - if Thread.isMainThread { - MainActor.assumeIsolated { - refresh(attachment) - } - } else { - DispatchQueue.main.async { - MainActor.assumeIsolated { - refresh(attachment) - } - } - } - } - tokens.append(token) - } - return tokens - } -} diff --git a/Sources/STMarkdown/Attachments/STMarkdownNumberBadgeAttachment.swift b/Sources/STMarkdown/Attachments/STMarkdownNumberBadgeAttachment.swift deleted file mode 100644 index 7dd213b..0000000 --- a/Sources/STMarkdown/Attachments/STMarkdownNumberBadgeAttachment.swift +++ /dev/null @@ -1,169 +0,0 @@ -// -// STMarkdownNumberBadgeAttachment.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 数字角标 NSTextAttachment,用于在富文本中渲染带圆圈背景的数字标记(如引用角标)。 -/// 所有引用角标使用统一的直径(可随正文字体放大),避免不同数字(如 1 vs 12)因文本宽度差异导致圆圈大小不一致。 -public final class STMarkdownNumberBadgeAttachment: NSTextAttachment { - - public static let fixedDiameter: CGFloat = 18 - - /// - Parameters: - /// - numberText: 显示的数字文本 - /// - font: 正文字体,用于计算直径与基线对齐(支持 Dynamic Type 自动缩放) - /// - textColor: 数字文本颜色 - /// - backgroundColor: 圆圈背景颜色 - public init(numberText: String, font: UIFont, textColor: UIColor, backgroundColor: UIColor) { - super.init(data: nil, ofType: nil) - let baseFontPointSize: CGFloat = 17 - let scaled = font.pointSize / baseFontPointSize * Self.fixedDiameter - let diameter = max(Self.fixedDiameter, ceil(scaled)) - let size = CGSize(width: diameter, height: diameter) - - let image = Self.drawBadge( - number: numberText, - textColor: textColor, - backgroundColor: backgroundColor, - diameter: diameter - ) - image.accessibilityLabel = Self.accessibilityLabel(for: numberText) - self.image = image - - // 将圆圈角标与正文文字垂直居中对齐: - // bounds.origin.y 以基线为原点,正值向上。 - // font.ascender(正值)到 font.descender(负值)是文字的完整垂直范围, - // 取其中点再减去角标半高,使圆圈中心与文字视觉中心对齐。 - let baselineOffset = (font.ascender + font.descender - size.height) / 2 - self.bounds = CGRect(x: 0, y: baselineOffset, width: size.width, height: size.height) - } - - /// 本类型不设计为可归档。若整个富文本仍被 `NSKeyedArchiver` 序列化, - /// 我们退化为一个普通 `NSTextAttachment`(保留 `image` 字段), - /// 避免 `fatalError` 让外部归档链路整体崩溃。 - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - /// 直接渲染圆形数字角标图片,供 CoreGraphics 绘制上下文(如表格渲染)调用。 - /// - Parameters: - /// - number: 显示的数字文本 - /// - textColor: 数字文本颜色 - /// - backgroundColor: 圆圈背景颜色 - /// - diameter: 圆圈直径,默认与 `fixedDiameter` 一致 - /// - Returns: 固定尺寸的圆形角标图片(带无障碍 label,形如 "引用 1") - public static func renderBadgeImage( - number: String, - textColor: UIColor, - backgroundColor: UIColor, - diameter: CGFloat = STMarkdownNumberBadgeAttachment.fixedDiameter - ) -> UIImage { - let image = drawBadge( - number: number, - textColor: textColor, - backgroundColor: backgroundColor, - diameter: diameter - ) - image.accessibilityLabel = accessibilityLabel(for: number) - return image - } -} - -/// 旧名称兼容:后续新代码请使用 `STMarkdownNumberBadgeAttachment`。 -public typealias STMarkdownCircleNumberAttachment = STMarkdownNumberBadgeAttachment - -private extension STMarkdownNumberBadgeAttachment { - /// 缓存 key:四元组(数字文本、前景色、背景色、直径)全匹配才能命中。 - /// 颜色通过 `UIColor.cgColor` 的 `CFHash` 生成稳定 hash,避免 `UIColor.==` - /// 在动态颜色下的不确定性(`UIColor.systemBlue` 在 light/dark 下是两个底层颜色)。 - struct BadgeCacheKey: Hashable { - let number: String - let textColorHash: Int - let backgroundColorHash: Int - let diameter: CGFloat - } - - /// 同模块共享的 badge 图片缓存。一张文本中出现 N 个相同参数的角标时只渲染一次。 - /// 64 个 slot 足以覆盖常见(10 位数 × 3 种颜色 × 2 种直径)组合。 - static let badgeCache: NSCache = { - let cache = NSCache() - cache.countLimit = 64 - return cache - }() - - /// 内联 init 与静态 `renderBadgeImage` 共用的绘制逻辑,避免字体阶梯 / 居中逻辑 - /// 在两条路径之间漂移。 - /// - /// 注意:当前字号阶梯仅对 1–3 位数字做了视觉校准,引用角标一般不会超过 3 位; - /// 若传入 4 位及以上,文字可能在圆圈内偏紧或溢出,调用方需自行截断。 - static func drawBadge( - number: String, - textColor: UIColor, - backgroundColor: UIColor, - diameter: CGFloat - ) -> UIImage { - assert(number.count <= 3, "STMarkdownNumberBadgeAttachment 当前仅为 1-3 位数字做了视觉校准,传入 \(number) 可能溢出圆圈") - let key = BadgeCacheKey( - number: number, - textColorHash: colorFingerprint(textColor), - backgroundColorHash: colorFingerprint(backgroundColor), - diameter: diameter - ) - let cacheKey = cacheKeyString(for: key) - if let cached = badgeCache.object(forKey: cacheKey) { - return cached - } - - let size = CGSize(width: diameter, height: diameter) - let ratio: CGFloat = number.count <= 1 ? 11.0 / 18.0 : (number.count == 2 ? 10.0 / 18.0 : 9.0 / 18.0) - let badgeFont = UIFont.st_systemFont(ofSize: diameter * ratio, weight: .semibold) - let textAttributes: [NSAttributedString.Key: Any] = [ - .font: badgeFont, - .foregroundColor: textColor, - ] - let textSize = (number as NSString).size(withAttributes: textAttributes) - let renderer = UIGraphicsImageRenderer(size: size) - let image = renderer.image { _ in - let rect = CGRect(origin: .zero, size: size) - backgroundColor.setFill() - UIBezierPath(ovalIn: rect).fill() - let textRect = CGRect( - x: (size.width - textSize.width) * 0.5, - y: (size.height - textSize.height) * 0.5, - width: textSize.width, - height: textSize.height - ) - (number as NSString).draw(in: textRect, withAttributes: textAttributes) - } - badgeCache.setObject(image, forKey: cacheKey) - return image - } - - /// 生成 VoiceOver 友好的 label;调用方可通过 `UIAccessibility.isVoiceOverRunning` - /// 自己决定是否读出。 - static func accessibilityLabel(for number: String) -> String { - return "引用 \(number)" - } - - static func cacheKeyString(for key: BadgeCacheKey) -> NSString { - return "\(key.number)|\(key.textColorHash)|\(key.backgroundColorHash)|\(key.diameter)" as NSString - } - - /// 将 UIColor 压成稳定 Int 以用作 cache key 组件。 - /// 动态颜色的底层组件在不同 traitCollection 下不同,这里取当前 trait 下 resolved 值, - /// 避免 light/dark 相互污染。 - static func colorFingerprint(_ color: UIColor) -> Int { - let resolved = color.resolvedColor(with: UITraitCollection.current) - var red: CGFloat = 0 - var green: CGFloat = 0 - var blue: CGFloat = 0 - var alpha: CGFloat = 0 - resolved.getRed(&red, green: &green, blue: &blue, alpha: &alpha) - let q = { (c: CGFloat) -> Int in Int((c * 255).rounded()) & 0xFF } - return (q(red) << 24) | (q(green) << 16) | (q(blue) << 8) | q(alpha) - } -} diff --git a/Sources/STMarkdown/Attachments/STMarkdownRefreshableAttachment.swift b/Sources/STMarkdown/Attachments/STMarkdownRefreshableAttachment.swift deleted file mode 100644 index 9a3cf13..0000000 --- a/Sources/STMarkdown/Attachments/STMarkdownRefreshableAttachment.swift +++ /dev/null @@ -1,81 +0,0 @@ -// -// STMarkdownRefreshableAttachment.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 具备"就绪后需刷新宿主 TextView"能力的异步 attachment。 -/// 约束所有多播逻辑统一走 `addDisplayObserver` / `removeDisplayObserver`, -/// 而不是直接赋值某个闭包属性,避免多消费者(同一 attachment 被多个 TextView 挂载) -/// 场景下后绑者覆盖前绑者。 -protocol STMarkdownRefreshableAttachment: NSTextAttachment { - /// 注册一个刷新观察者。返回的 token 被销毁或显式 `invalidate()` 时自动解除注册。 - /// - Parameter observer: 可能在任意线程触发,接收方需自己派发回主线程(通常由 - /// `STMarkdownAttachmentRefreshSupport` 完成)。 - func addDisplayObserver(_ observer: @escaping () -> Void) -> STMarkdownRefreshObservation -} - -/// `addDisplayObserver` 返回的订阅凭证。 -/// 销毁/失效后对应 observer 不再收到通知,可用于跨 TextView 切换时的解绑。 -final class STMarkdownRefreshObservation { - private let invalidateHandler: () -> Void - private var isInvalidated = false - private let lock = NSLock() - - init(invalidate: @escaping () -> Void) { - self.invalidateHandler = invalidate - } - - func invalidate() { - self.lock.lock() - let shouldRun = self.isInvalidated == false - self.isInvalidated = true - self.lock.unlock() - if shouldRun { - self.invalidateHandler() - } - } - - deinit { - self.invalidate() - } -} - -/// 多播订阅容器,线程安全。`STMarkdownAsyncImageAttachment` 内部持有一份。 -final class STMarkdownRefreshObserverRegistry { - private struct Entry { - let id: UUID - let observer: () -> Void - } - - private let lock = NSLock() - private var entries: [Entry] = [] - - func add(_ observer: @escaping () -> Void) -> STMarkdownRefreshObservation { - let id = UUID() - self.lock.lock() - self.entries.append(Entry(id: id, observer: observer)) - self.lock.unlock() - return STMarkdownRefreshObservation { [weak self] in - self?.remove(id: id) - } - } - - func notify() { - self.lock.lock() - let snapshot = self.entries - self.lock.unlock() - for entry in snapshot { - entry.observer() - } - } - - private func remove(id: UUID) { - self.lock.lock() - self.entries.removeAll { $0.id == id } - self.lock.unlock() - } -} diff --git a/Sources/STMarkdown/Core/STMarkdownEngine.swift b/Sources/STMarkdown/Core/STMarkdownEngine.swift deleted file mode 100644 index d31cd6f..0000000 --- a/Sources/STMarkdown/Core/STMarkdownEngine.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// STMarkdownEngine.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import Foundation - -public protocol STMarkdownProcessing { - /// 将原始 Markdown 文本经过 sanitize → parse → normalize → adapt 流水线后返回结果。 - func process(_ rawMarkdown: String) -> STMarkdownPipelineResult -} - -/// 默认的 Markdown 处理引擎。 -/// -/// 线程安全:仅当传入的 `parser`、`renderAdapter` 与 `configuration` 中的所有 -/// rules / normalizers 都满足 `Sendable` 时,本类型才可在多线程并发调用。 -/// 框架内置的实现均已满足该约束。 -public final class STMarkdownEngine: STMarkdownProcessing, Sendable { - - public let pipeline: STMarkdownPipeline - - public init(configuration: STMarkdownPipelineConfiguration = STMarkdownPipelineConfiguration(), parser: any STMarkdownStructureParsing = STMarkdownStructureParser(), renderAdapter: any STMarkdownRenderAdapting = STMarkdownRenderAdapter()) { - self.pipeline = STMarkdownPipeline(configuration: configuration, parser: parser, renderAdapter: renderAdapter) - } - - public func process(_ rawMarkdown: String) -> STMarkdownPipelineResult { - self.pipeline.process(rawMarkdown) - } - - /// 见 ``STMarkdownPipeline/processIncremental(_:)``。 - public func processIncremental(_ parameters: STMarkdownIncrementalParameters) -> STMarkdownIncrementalParseResult { - self.pipeline.processIncremental(parameters) - } -} diff --git a/Sources/STMarkdown/Core/STMarkdownIncrementalParse.swift b/Sources/STMarkdown/Core/STMarkdownIncrementalParse.swift deleted file mode 100644 index 3d45264..0000000 --- a/Sources/STMarkdown/Core/STMarkdownIncrementalParse.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// STMarkdownIncrementalParse.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import Foundation - -/// 增量解析输入。 -/// -/// **偏移约定**:`lastCommittedExclusiveEnd` / `currentSafeExclusiveEnd` 与 ``STMarkdownStreamBuffer`` -/// 使用的 **Character 偏移**(`String.index(_:offsetBy:limitedBy:)` 从 `startIndex` 起算)一致,且作用于 -/// 本参数中的 ``canonicalMarkdown`` 整串。 -/// -/// - Important: 本路径**不执行**输入规整器(`STMarkdownInputSanitizer`)。若管线启用 sanitizer, -/// 请自行对全文做规整后再把结果作为 ``canonicalMarkdown`` 传入,并保证偏移与之一致;否则请关闭 -/// sanitizer 后使缓冲串与 canonical 为同一字符串(常见流式场景)。 -public struct STMarkdownIncrementalParameters: Sendable, Hashable { - /// 当前帧完整 Markdown(已与缓冲 / 规整结果对齐)。 - public var canonicalMarkdown: String - /// 上一帧已冻结、本帧仍视为不可变的前缀上界(不包含该下标)。 - public var lastCommittedExclusiveEnd: Int - /// 本帧安全解析上界(不包含该下标),通常来自缓冲器的 `lastSafeUpperBoundOffset`。 - public var currentSafeExclusiveEnd: Int - /// 向前回溯字符数,对齐 Vendor ``contextWindowSize``(默认 200)。 - public var contextWindowSize: Int - /// 上一帧合并后 **渲染块总数**(对齐 Vendor ``previousElementCount``)。 - public var previousTotalRenderBlockCount: Int - - public init( - canonicalMarkdown: String, - lastCommittedExclusiveEnd: Int, - currentSafeExclusiveEnd: Int, - contextWindowSize: Int = 200, - previousTotalRenderBlockCount: Int - ) { - self.canonicalMarkdown = canonicalMarkdown - self.lastCommittedExclusiveEnd = lastCommittedExclusiveEnd - self.currentSafeExclusiveEnd = currentSafeExclusiveEnd - self.contextWindowSize = max(0, contextWindowSize) - self.previousTotalRenderBlockCount = max(0, previousTotalRenderBlockCount) - } -} - -/// 单帧增量解析产物(对齐 Vendor ``IncrementalParseResult`` 的核心字段子集)。 -public struct STMarkdownIncrementalParseResult: Sendable, Hashable { - /// 与 Vendor ``replaceCount`` 对应:应从上一帧 **渲染块列表尾部** 丢弃的块数,再拼接 ``windowRenderDocument/blocks``。 - public let replaceTailCount: Int - public let parseStartOffset: Int - public let parseEndOffset: Int - /// 实际参与 parse 的子串(`canonicalMarkdown[parseStart.. STMarkdownRenderDocument { - let merged = Self.mergedRenderBlocks( - previous: previous.blocks, - replaceTailCount: self.replaceTailCount, - newTailBlocks: self.windowRenderDocument.blocks - ) - return STMarkdownRenderDocument(blocks: merged) - } - - public static func mergedRenderBlocks( - previous: [STMarkdownRenderBlock], - replaceTailCount: Int, - newTailBlocks: [STMarkdownRenderBlock] - ) -> [STMarkdownRenderBlock] { - let k = max(0, previous.count - replaceTailCount) - return Array(previous.prefix(k)) + newTailBlocks - } -} - -enum STMarkdownIncrementalReplaceCountEstimator { - /// Vendor:`parseStart < lastSafePosition` 时 `max(1, backtrackChars/100)` 再 `min(previousElementCount, …)`。 - static func estimateReplaceTailCount(previousTotalRenderBlockCount: Int, parseStart: Int, lastCommittedExclusiveEnd: Int) -> Int { - guard parseStart < lastCommittedExclusiveEnd else { return 0 } - let backtrackChars = lastCommittedExclusiveEnd - parseStart - let estimated = max(1, backtrackChars / 100) - return min(estimated, previousTotalRenderBlockCount) - } -} - -// MARK: - 子串(Character 偏移) -enum STMarkdownIncrementalSubstring { - static func fragment(in text: String, startOffset: Int, endOffset: Int) -> String { - guard text.isEmpty == false, startOffset < endOffset, startOffset >= 0 else { return "" } - let endClamped = min(endOffset, text.count) - guard let sIdx = text.index(text.startIndex, offsetBy: startOffset, limitedBy: text.endIndex), - let eIdx = text.index(text.startIndex, offsetBy: endClamped, limitedBy: text.endIndex), - sIdx < eIdx else { - return "" - } - return String(text[sIdx.. Void)? { get set } - var onSelectionChange: ((String) -> Void)? { get set } - var isTextSelectionEnabled: Bool { get set } -} diff --git a/Sources/STMarkdown/Core/STMarkdownPipeline.swift b/Sources/STMarkdown/Core/STMarkdownPipeline.swift deleted file mode 100644 index bea421d..0000000 --- a/Sources/STMarkdown/Core/STMarkdownPipeline.swift +++ /dev/null @@ -1,167 +0,0 @@ -// -// STMarkdownPipeline.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import Foundation - -public struct STMarkdownPipelineConfiguration: Sendable { - public var enableInputSanitizer: Bool - public var sanitizerRules: [any STMarkdownRule] - public var debug: Bool - public var semanticNormalizers: [any STMarkdownSemanticNormalizing] - /// 解析前修正常见断裂表格(孤立 `|` 行、表内误插空行等),对 LLM 流式输出更友好。 - public var autoFixMalformedTables: Bool - - public init( - enableInputSanitizer: Bool = true, - sanitizerRules: [any STMarkdownRule] = STMarkdownInputSanitizer.defaultRules, - debug: Bool = false, - semanticNormalizers: [any STMarkdownSemanticNormalizing] = [], - autoFixMalformedTables: Bool = true - ) { - self.enableInputSanitizer = enableInputSanitizer - self.sanitizerRules = sanitizerRules - self.debug = debug - self.semanticNormalizers = semanticNormalizers - self.autoFixMalformedTables = autoFixMalformedTables - } -} - -public struct STMarkdownPipelineResult: Sendable { - public let rawMarkdown: String - public let sanitizedMarkdown: String - public let appliedRules: [String] - public let sourceDocument: STMarkdownDocument - public let normalizedDocument: STMarkdownDocument - public let renderDocument: STMarkdownRenderDocument - public let tableOfContents: [STMarkdownTOCItem] - - public init( - rawMarkdown: String, - sanitizedMarkdown: String, - appliedRules: [String], - sourceDocument: STMarkdownDocument, - normalizedDocument: STMarkdownDocument, - renderDocument: STMarkdownRenderDocument, - tableOfContents: [STMarkdownTOCItem] - ) { - self.rawMarkdown = rawMarkdown - self.sanitizedMarkdown = sanitizedMarkdown - self.appliedRules = appliedRules - self.sourceDocument = sourceDocument - self.normalizedDocument = normalizedDocument - self.renderDocument = renderDocument - self.tableOfContents = tableOfContents - } -} - -/// 原始 Markdown 处理顺序:可选输入规整 →(可选)断裂表格预修复 → `swift-markdown` 解析 -/// → 语义归一 → 渲染 AST;公式在 ``STMarkdownStructureParser`` 内先于解析做块级抽取。 -public final class STMarkdownPipeline: Sendable { - public let configuration: STMarkdownPipelineConfiguration - public let parser: any STMarkdownStructureParsing - public let semanticNormalizer: STMarkdownSemanticNormalizer - public let renderAdapter: any STMarkdownRenderAdapting - - /// 预先构建的 sanitizer;当配置禁用时为 nil。 - /// 缓存实例可避免高频 `process(_:)` 调用的重复初始化开销。 - private let sanitizer: STMarkdownInputSanitizer? - - public init( - configuration: STMarkdownPipelineConfiguration = STMarkdownPipelineConfiguration(), - parser: any STMarkdownStructureParsing = STMarkdownStructureParser(), - renderAdapter: any STMarkdownRenderAdapting = STMarkdownRenderAdapter() - ) { - self.configuration = configuration - self.parser = parser - self.semanticNormalizer = STMarkdownSemanticNormalizer( - normalizers: configuration.semanticNormalizers - ) - self.renderAdapter = renderAdapter - self.sanitizer = configuration.enableInputSanitizer - ? STMarkdownInputSanitizer(rules: configuration.sanitizerRules) - : nil - } - - public func process(_ rawMarkdown: String) -> STMarkdownPipelineResult { - let sanitizationResult: STMarkdownSanitizationResult - if let sanitizer = self.sanitizer { - sanitizationResult = sanitizer.sanitize(rawMarkdown, debug: self.configuration.debug) - } else { - sanitizationResult = STMarkdownSanitizationResult( - originalText: rawMarkdown, - sanitizedText: rawMarkdown, - appliedRules: [] - ) - } - - let parserInput = STMarkdownMalformedTableNormalizer.normalize( - sanitizationResult.sanitizedText, - enabled: self.configuration.autoFixMalformedTables - ) - let sourceDocument = self.parser.parse(parserInput) - let normalizedDocument = self.semanticNormalizer.normalize(sourceDocument) - let renderDocument = self.renderAdapter.adapt(normalizedDocument) - let tableOfContents = STMarkdownTOCExtraction.items(from: renderDocument) - return STMarkdownPipelineResult( - rawMarkdown: rawMarkdown, - sanitizedMarkdown: sanitizationResult.sanitizedText, - appliedRules: sanitizationResult.appliedRules, - sourceDocument: sourceDocument, - normalizedDocument: normalizedDocument, - renderDocument: renderDocument, - tableOfContents: tableOfContents - ) - } - - /// 对 ``canonicalMarkdown`` 的 `[parseStart, parseEnd)` 子串执行 parse → normalize → adapt,并给出 - /// ``STMarkdownIncrementalParseResult/replaceTailCount``(对齐 Vendor ``replaceCount`` 估算语义)。 - /// - /// - Note: 不跑输入 sanitizer;见 ``STMarkdownIncrementalParameters`` 说明。 - public func processIncremental(_ parameters: STMarkdownIncrementalParameters) -> STMarkdownIncrementalParseResult { - let text = parameters.canonicalMarkdown - let lastCommitted = parameters.lastCommittedExclusiveEnd - let safeEnd = parameters.currentSafeExclusiveEnd - let window = parameters.contextWindowSize - - let parseStart = max(0, lastCommitted - window) - let parseEnd = min(max(0, safeEnd), text.count) - - guard parseStart < parseEnd else { - return STMarkdownIncrementalParseResult( - replaceTailCount: 0, - parseStartOffset: parseStart, - parseEndOffset: parseEnd, - windowFragment: "", - windowRenderDocument: STMarkdownRenderDocument(blocks: []), - windowTableOfContents: [] - ) - } - - let fragment = STMarkdownIncrementalSubstring.fragment(in: text, startOffset: parseStart, endOffset: parseEnd) - let parserInput = STMarkdownMalformedTableNormalizer.normalize( - fragment, - enabled: self.configuration.autoFixMalformedTables - ) - let sourceDocument = self.parser.parse(parserInput) - let normalizedDocument = self.semanticNormalizer.normalize(sourceDocument) - let renderDocument = self.renderAdapter.adapt(normalizedDocument) - let windowTOC = STMarkdownTOCExtraction.items(from: renderDocument) - let replaceTail = STMarkdownIncrementalReplaceCountEstimator.estimateReplaceTailCount( - previousTotalRenderBlockCount: parameters.previousTotalRenderBlockCount, - parseStart: parseStart, - lastCommittedExclusiveEnd: lastCommitted - ) - return STMarkdownIncrementalParseResult( - replaceTailCount: replaceTail, - parseStartOffset: parseStart, - parseEndOffset: parseEnd, - windowFragment: fragment, - windowRenderDocument: renderDocument, - windowTableOfContents: windowTOC - ) - } -} diff --git a/Sources/STMarkdown/Core/STMarkdownPreset.swift b/Sources/STMarkdown/Core/STMarkdownPreset.swift deleted file mode 100644 index aa5ef9e..0000000 --- a/Sources/STMarkdown/Core/STMarkdownPreset.swift +++ /dev/null @@ -1,87 +0,0 @@ -// -// STMarkdownPreset.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public enum STMarkdownPresets { - public static let `default` = STMarkdownStyle.default - - /// 构造一组默认的高级渲染器实例。 - /// - /// 高级渲染器(图片、表格、代码块等)通常持有内部缓存或可变状态,因此 - /// **每个调用方应单独持有自己的实例**,避免跨场景共享导致的并发污染。 - /// 故采用工厂方法返回新实例,禁止使用全局单例。 - public static func makeDefaultAdvancedRenderers() -> STMarkdownAdvancedRenderers { - STMarkdownAdvancedRenderers( - inlineMathRenderer: STMarkdownHighFidelityMathRenderer(), - blockMathRenderer: STMarkdownHighFidelityMathRenderer(), - codeBlockRenderer: STMarkdownCodeBlockRenderer(), - tableRenderer: STMarkdownTableAttachmentRenderer(), - imageRenderer: STMarkdownAsyncImageRenderer(), - horizontalRuleRenderer: STMarkdownDefaultHorizontalRuleRenderer() - ) - } - - @available(*, deprecated, message: "Use makeDefaultAdvancedRenderers() to avoid sharing renderer instances.") - public static var defaultAdvancedRenderers: STMarkdownAdvancedRenderers { - self.makeDefaultAdvancedRenderers() - } - - public static let article = STMarkdownStyle( - font: UIFont.st_systemFont(ofSize: 17, weight: .regular), - textColor: UIColor.label, - lineHeight: 26, - kern: 0.1, - paragraphSpacing: 10, - bodyLineSpacing: 3, - headingTextColor: UIColor.label, - linkColor: UIColor.systemBlue, - inlineCodeTextColor: UIColor.secondaryLabel, - codeBlockTextColor: UIColor.label, - codeBlockHeaderTextColor: UIColor.secondaryLabel, - codeBlockBackgroundColor: UIColor.secondarySystemBackground, - tableTextColor: UIColor.label, - tableHeaderTextColor: UIColor.label, - tableBorderColor: UIColor.separator, - tableBackgroundColor: UIColor.secondarySystemBackground, - imagePlaceholderTextColor: UIColor.label, - imagePlaceholderBackgroundColor: UIColor.tertiarySystemBackground, - imagePlaceholderCaptionColor: UIColor.secondaryLabel, - horizontalRuleColor: UIColor.separator, - horizontalRuleLength: 24, - listItemSpacing: 10, - listIndentPerLevel: 16, - headingLineHeightMultiplier: 1.25 - ) - - public static let compact = STMarkdownStyle( - font: UIFont.st_systemFont(ofSize: 14, weight: UIFont.Weight.regular), - textColor: UIColor.label, - lineHeight: 20, - kern: 0.08, - paragraphSpacing: 6, - bodyLineSpacing: 1, - headingTextColor: UIColor.label, - linkColor: UIColor.systemBlue, - inlineCodeTextColor: UIColor.secondaryLabel, - codeBlockTextColor: UIColor.label, - codeBlockHeaderTextColor: UIColor.secondaryLabel, - codeBlockBackgroundColor: UIColor.secondarySystemBackground, - tableTextColor: UIColor.label, - tableHeaderTextColor: UIColor.label, - tableBorderColor: UIColor.separator, - tableBackgroundColor: UIColor.secondarySystemBackground, - imagePlaceholderTextColor: UIColor.label, - imagePlaceholderBackgroundColor: UIColor.tertiarySystemBackground, - imagePlaceholderCaptionColor: UIColor.secondaryLabel, - horizontalRuleColor: UIColor.separator, - horizontalRuleLength: 18, - listItemSpacing: 6, - listIndentPerLevel: 12, - headingLineHeightMultiplier: 1.18 - ) -} diff --git a/Sources/STMarkdown/Core/STMarkdownRegexPatterns.swift b/Sources/STMarkdown/Core/STMarkdownRegexPatterns.swift deleted file mode 100644 index eeda7c3..0000000 --- a/Sources/STMarkdown/Core/STMarkdownRegexPatterns.swift +++ /dev/null @@ -1,339 +0,0 @@ -// -// STMarkdownRegexPatterns.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// -// 集中存放 STMarkdown 框架内所有预编译正则。 -// -// 分组: -// - STMarkdownRegex HTML 链接、JSON 转义换行等基础模式 -// - STMarkdownListRegex 列表结构匹配 -// - STMarkdownMathRegex 数学/LaTeX 处理 -// - STMarkdownCJKRegex CJK 标点与强调符边界 -// - STMarkdownCitationRegex Citation / Webpage 标签识别与提取 -// - STMarkdownStreamingRegex 流式输出尾部标记裁剪 -// - STMarkdownHTMLCleanRegex HTML 标签/注释清理 -// - -import Foundation - -public enum STMarkdownRegex { - /// 匹配 `]*?href\s*=\s*\\?["']([^"']+)\\?["'][^>]*>(.*?)"#, - options: [.caseInsensitive, .dotMatchesLineSeparators], - owner: "STMarkdownRegex.htmlLink" - ) - - public static let escaped2CRLF = STMarkdownRegexFactory.compile(pattern: #"\\\\r\\\\n"#, owner: "STMarkdownRegex.escaped2CRLF") - public static let escaped2LF = STMarkdownRegexFactory.compile(pattern: #"\\\\n(?![A-Za-z])"#, owner: "STMarkdownRegex.escaped2LF") - public static let escaped2CR = STMarkdownRegexFactory.compile(pattern: #"\\\\r(?![A-Za-z])"#, owner: "STMarkdownRegex.escaped2CR") - public static let escapedCRLF = STMarkdownRegexFactory.compile(pattern: #"\\r\\n"#, owner: "STMarkdownRegex.escapedCRLF") - public static let escapedLF = STMarkdownRegexFactory.compile(pattern: #"\\n(?![A-Za-z])"#, owner: "STMarkdownRegex.escapedLF") - public static let escapedCR = STMarkdownRegexFactory.compile(pattern: #"\\r(?![A-Za-z])"#, owner: "STMarkdownRegex.escapedCR") -} - -public enum STMarkdownListRegex { - /// `1. text` / `1.text` → 补空格(多行模式) - public static let numberList = STMarkdownRegexFactory.compile( - pattern: #"(?m)^(\s*\d+\.)\s*(\S)"#, - owner: "STMarkdownListRegex.numberList" - ) - /// `- text` / `+ text`(非 `--`/`++`)→ 补空格(多行模式) - public static let symbolList = STMarkdownRegexFactory.compile( - pattern: #"(?m)^(\s*[-+])(?![-+])\s*(\S)"#, - owner: "STMarkdownListRegex.symbolList" - ) - /// `* text`(非 `**`、非 `*"`/`*'`/`*\u201C` 等引号开头——这些是强调语法而非列表项)→ 补空格(多行模式) - public static let starList = STMarkdownRegexFactory.compile( - pattern: #"(?m)^(\s*)\*(?!\*|["'\u201C\u201D\u2018\u2019])\s*(\S)"#, - owner: "STMarkdownListRegex.starList" - ) - /// 有序列表行(0-3 空格缩进,marker 后有内容) - public static let orderedListLine = STMarkdownRegexFactory.compile( - pattern: #"^\s{0,3}\d+\.\s+\S"#, - owner: "STMarkdownListRegex.orderedListLine" - ) - /// 受保护的 4+ 空格缩进块(列表嵌套 / 代码段 / 引用等不应 dedent) - public static let protectedIndentedBlock = STMarkdownRegexFactory.compile( - pattern: #"^\s{4,}(?:[-+*]|\d+\.|>|```|~~~|\|)"#, - owner: "STMarkdownListRegex.protectedIndentedBlock" - ) - /// 顶层无序列表行(0-3 空格缩进) - public static let topLevelUnorderedListLine = STMarkdownRegexFactory.compile( - pattern: #"^\s{0,3}[-+*]\s+\S"#, - owner: "STMarkdownListRegex.topLevelUnorderedListLine" - ) - /// 缩进 3+ 空格的无序列表行(嵌套子列表) - public static let indentedUnorderedListLine = STMarkdownRegexFactory.compile( - pattern: #"^\s{3,}[-+*]\s+\S"#, - owner: "STMarkdownListRegex.indentedUnorderedListLine" - ) -} - -public enum STMarkdownMathRegex { - /// `[expr]` 形式的内联数学(要求含 `=`、`+`、`_`、`^`、`\` 等数学符号,避免误伤链接) - public static let mathInline = STMarkdownRegexFactory.compile( - pattern: #"\[(?=[^\]]*[=+_^\\])([^\]]+)\]"#, - owner: "STMarkdownMathRegex.mathInline" - ) - /// 反引号包裹的内联代码段(非连续反引号) - public static let inlineCodeSpan = STMarkdownRegexFactory.compile( - pattern: #"(? String? { - guard let value = Int(number), value > 0, value <= 20 else { return nil } - guard let scalar = UnicodeScalar(0x2460 + value - 1) else { return nil } - return String(Character(scalar)) - } -} - -public enum STMarkdownStreamingRegex { - /// 行尾不完整 Heading(`# ` / `## `)或 Blockquote(`> `)标记 - /// - /// 用于流式 drip 阶段裁剪尚未闭合的块级语法标记,防止提前渲染造成布局抖动。 - /// `dripSafe` 变体额外排除 `[[` 双括号标签(由 safeDripCursor 处理),避免与 - /// citation/node 标签的正则叠加触发连续 stall。 - public static let dripSafeTrailingMarkers: [NSRegularExpression] = [ - STMarkdownRegexFactory.compile( - pattern: #"(?s)\n?[ \t]{0,3}#{1,6}[ \t]*$"#, - owner: "STMarkdownStreamingRegex.dripSafe[0]" - ), - STMarkdownRegexFactory.compile( - pattern: #"(?s)\n?[ \t]{0,3}#{2,6}\S*$"#, - owner: "STMarkdownStreamingRegex.dripSafe[1]" - ), - STMarkdownRegexFactory.compile( - pattern: #"(?s)\n?[ \t]{0,3}>[ \t]*$"#, - owner: "STMarkdownStreamingRegex.dripSafe[2]" - ), - STMarkdownRegexFactory.compile( - pattern: #"(?is)webpage\s*\d*$"#, - owner: "STMarkdownStreamingRegex.dripSafe[3]" - ), - STMarkdownRegexFactory.compile( - pattern: #"(?is)citation\s*:?\s*\d*$"#, - owner: "STMarkdownStreamingRegex.dripSafe[4]" - ), - // 标准 Markdown 链接 `[text`:`(?]{0,100})?$"#, - owner: "STMarkdownStreamingRegex.trailingIncompleteHtmlTag" - ) - /// 行尾不完整 HTML 注释:`"#] - case "css": - return [#"/\*[\s\S]*?\*/"#] - default: - return [#"(?m)//.*$"#, #"/\*[\s\S]*?\*/"#] - } - } - - private static func stringPatterns(for language: String) -> [String] { - if language == "html" || language == "xml" || language == "svg" { - return [#""([^"\\]|\\.)*""#, #"'([^'\\]|\\.)*'"#] - } - return [#""([^"\\]|\\.)*""#, #"'([^'\\]|\\.)*'"#, #"`([^`\\]|\\.)*`"#] - } - - private static func numberPatterns() -> [String] { - [#"\b\d+(?:\.\d+)?\b"#] - } - - private static func typePatterns(for language: String) -> [String] { - switch language { - case "swift": - return [#"\b(?:String|Int|Double|Bool|CGFloat|CGRect|UIView|UIColor|URL|Data|Result|Error|Any|Void)\b"#] - case "typescript", "ts", "javascript", "js": - return [#"\b(?:Promise|Array|Record|Map|Set|Date|RegExp|HTMLElement|HTMLDivElement|JSON)\b"#] - case "python": - return [#"\b(?:str|int|float|bool|list|dict|tuple|set|None)\b"#] - default: - return [] - } - } - - private static func keywordPatterns(for language: String) -> [String] { - let words: [String] - switch language { - case "swift": - words = ["let", "var", "func", "if", "else", "guard", "return", "class", "struct", "enum", "protocol", "extension", "import", "private", "fileprivate", "internal", "public", "open", "static", "case", "switch", "for", "in", "while", "where", "try", "catch", "throw", "async", "await", "actor", "weak", "self", "nil", "true", "false"] - case "typescript", "ts", "javascript", "js": - words = ["const", "let", "var", "function", "return", "if", "else", "switch", "case", "break", "for", "while", "class", "extends", "new", "import", "from", "export", "default", "async", "await", "try", "catch", "throw", "null", "undefined", "true", "false"] - case "python": - words = ["def", "class", "if", "elif", "else", "for", "while", "in", "return", "import", "from", "as", "try", "except", "finally", "with", "lambda", "pass", "break", "continue", "None", "True", "False"] - case "html", "xml", "svg": - words = [] - case "css": - words = ["display", "position", "color", "background", "padding", "margin", "border", "flex", "grid"] - case "json": - words = ["true", "false", "null"] - case "bash", "shell", "sh": - words = ["if", "then", "else", "fi", "for", "do", "done", "case", "esac", "function", "export", "local"] - default: - words = ["if", "else", "for", "while", "return", "class", "struct", "enum", "switch", "case", "break", "continue", "import", "from", "public", "private", "protected", "static", "const", "let", "var", "func", "def", "new", "true", "false", "null", "nil"] - } - guard !words.isEmpty else { return [] } - let joined = words.joined(separator: "|") - // `\(joined)` 已在字符串插值阶段被替换为关键字列表;这里的字面量已无需二次处理。 - return ["(? [String] { - switch language { - case "html", "xml", "svg": - return [ - #" NSAttributedString? { - let result = NSMutableAttributedString() - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.minimumLineHeight = style.lineHeight - paragraphStyle.maximumLineHeight = style.lineHeight - paragraphStyle.paragraphSpacing = style.paragraphSpacing - paragraphStyle.lineBreakMode = .byCharWrapping - - let headerAttributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.st_monospacedSystemFont(ofSize: max(style.font.pointSize - 2, 12), weight: .semibold), - .foregroundColor: style.codeBlockHeaderTextColor ?? style.textColor.withAlphaComponent(0.72), - .backgroundColor: style.codeBlockBackgroundColor ?? UIColor.secondarySystemBackground, - .paragraphStyle: paragraphStyle, - ] - - let bodyAttributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.st_monospacedSystemFont(ofSize: max(style.font.pointSize - 1, 12), weight: .regular), - .foregroundColor: style.codeBlockTextColor ?? style.textColor, - .backgroundColor: style.codeBlockBackgroundColor ?? UIColor.secondarySystemBackground, - .paragraphStyle: paragraphStyle, - ] - - if let language, language.isEmpty == false { - result.append(NSAttributedString(string: language.uppercased(), attributes: headerAttributes)) - result.append(NSAttributedString(string: "\n", attributes: bodyAttributes)) - } - - result.append(NSAttributedString(string: code, attributes: bodyAttributes)) - return result - } -} diff --git a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultHorizontalRuleRenderer.swift b/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultHorizontalRuleRenderer.swift deleted file mode 100644 index d6ec8c5..0000000 --- a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultHorizontalRuleRenderer.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// STMarkdownDefaultHorizontalRuleRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public struct STMarkdownDefaultHorizontalRuleRenderer: STMarkdownHorizontalRuleRendering { - public init() {} - - public func renderHorizontalRule(style: STMarkdownStyle) -> NSAttributedString? { - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.minimumLineHeight = style.lineHeight - paragraphStyle.maximumLineHeight = style.lineHeight - paragraphStyle.paragraphSpacing = style.paragraphSpacing - paragraphStyle.alignment = .natural - paragraphStyle.lineBreakMode = .byClipping - - let color = style.horizontalRuleColor - ?? style.dividerColor - ?? style.textColor.withAlphaComponent(0.28) - let attributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.st_systemFont(ofSize: max(style.font.pointSize - 2, 12), weight: .regular), - .foregroundColor: color, - .paragraphStyle: paragraphStyle, - ] - - return NSAttributedString( - string: String(repeating: "─", count: max(style.horizontalRuleLength, 12)), - attributes: attributes - ) - } -} diff --git a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultImageRenderer.swift b/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultImageRenderer.swift deleted file mode 100644 index 2cb5645..0000000 --- a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultImageRenderer.swift +++ /dev/null @@ -1,102 +0,0 @@ -// -// STMarkdownDefaultImageRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public struct STMarkdownDefaultImageRenderer: STMarkdownImageRendering { - public init() {} - - public func renderImage( - url: String, - altText: String, - title: String?, - style: STMarkdownStyle, - placement: STMarkdownImagePlacement - ) -> NSAttributedString? { - let label = self.displayLabel(url: url, altText: altText, placement: placement) - if placement.isInline { - return self.renderInlineImage(label: label, style: style) - } - return self.renderBlockImage(label: label, title: title, style: style) - } -} - -private extension STMarkdownDefaultImageRenderer { - func displayLabel(url: String, altText: String, placement: STMarkdownImagePlacement) -> String { - if altText.isEmpty == false { - return altText - } - if let lastPath = URL(string: url)?.lastPathComponent, lastPath.isEmpty == false { - return placement.isInline ? lastPath : "[image] \(lastPath)" - } - return placement.isInline ? "[img]" : "[image]" - } - - func renderInlineImage(label: String, style: STMarkdownStyle) -> NSAttributedString { - let font = UIFont.st_systemFont(ofSize: max(style.font.pointSize - 1, 12), weight: .medium) - let attachment = NSTextAttachment() - let tint = style.imagePlaceholderTextColor ?? style.textColor.withAlphaComponent(0.88) - let placeholder = UIImage(systemName: "photo")?.withTintColor(tint, renderingMode: .alwaysOriginal) - attachment.image = placeholder - let imageHeight = max(font.capHeight, 12) - attachment.bounds = CGRect(x: 0, y: (font.capHeight - imageHeight) / 2, width: imageHeight, height: imageHeight) - let result = NSMutableAttributedString(attachment: attachment) - let text = NSAttributedString( - string: " \(label)", - attributes: [ - .font: font, - .foregroundColor: style.imagePlaceholderTextColor ?? style.textColor.withAlphaComponent(0.88), - .backgroundColor: style.imagePlaceholderBackgroundColor ?? UIColor.tertiarySystemBackground, - ] - ) - result.append(text) - return result - } - - func renderBlockImage(label: String, title: String?, style: STMarkdownStyle) -> NSAttributedString { - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.minimumLineHeight = style.lineHeight - paragraphStyle.maximumLineHeight = style.lineHeight - paragraphStyle.paragraphSpacing = style.paragraphSpacing - paragraphStyle.alignment = .center - - let iconAttachment = NSTextAttachment() - let iconTint = style.imagePlaceholderTextColor ?? style.textColor - iconAttachment.image = UIImage(systemName: "photo.on.rectangle")? - .withTintColor(iconTint, renderingMode: .alwaysOriginal) - let iconSize = max(style.font.pointSize + 2, 16) - iconAttachment.bounds = CGRect(x: 0, y: -2, width: iconSize, height: iconSize) - - let result = NSMutableAttributedString() - result.append(NSAttributedString(attachment: iconAttachment)) - result.append( - NSAttributedString( - string: "\n\(label)", - attributes: [ - .font: UIFont.st_systemFont(ofSize: style.font.pointSize, weight: .medium), - .foregroundColor: style.imagePlaceholderTextColor ?? style.textColor, - .backgroundColor: style.imagePlaceholderBackgroundColor ?? UIColor.tertiarySystemBackground, - .paragraphStyle: paragraphStyle, - ] - ) - ) - - if let title, title.isEmpty == false { - result.append( - NSAttributedString( - string: "\n\(title)", - attributes: [ - .font: UIFont.st_systemFont(ofSize: max(style.font.pointSize - 2, 12), weight: .regular), - .foregroundColor: style.imagePlaceholderCaptionColor ?? style.textColor.withAlphaComponent(0.72), - .paragraphStyle: paragraphStyle, - ] - ) - ) - } - return result - } -} diff --git a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultMathRenderer.swift b/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultMathRenderer.swift deleted file mode 100644 index 4d820b9..0000000 --- a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultMathRenderer.swift +++ /dev/null @@ -1,168 +0,0 @@ -// -// STMarkdownDefaultMathRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public struct STMarkdownDefaultMathRenderer: STMarkdownInlineMathRendering, STMarkdownBlockMathRendering { - - public init() {} - - public func renderInlineMath(formula: String, style: STMarkdownStyle, baseFont: UIFont, textColor: UIColor) -> NSAttributedString? { - self.renderMath(formula: formula, style: style, baseFont: baseFont, textColor: textColor, displayMode: false) - } - - public func renderBlockMath(formula: String, style: STMarkdownStyle) -> NSAttributedString? { - let baseFont = UIFont(descriptor: style.font.fontDescriptor, size: max(style.font.pointSize, 16)) - return self.renderMath(formula: formula, style: style, baseFont: baseFont, textColor: style.textColor, displayMode: true) - } -} - -private extension STMarkdownDefaultMathRenderer { - static let commandMap: [String: String] = [ - "\\alpha": "α", - "\\beta": "β", - "\\gamma": "γ", - "\\delta": "δ", - "\\theta": "θ", - "\\lambda": "λ", - "\\mu": "μ", - "\\pi": "π", - "\\sigma": "σ", - "\\phi": "φ", - "\\omega": "ω", - "\\Delta": "Δ", - "\\Gamma": "Γ", - "\\Pi": "Π", - "\\Sigma": "Σ", - "\\Phi": "Φ", - "\\Omega": "Ω", - "\\cdot": "·", - "\\times": "×", - "\\pm": "±", - "\\neq": "≠", - "\\le": "≤", - "\\ge": "≥", - "\\approx": "≈", - "\\infty": "∞", - "\\to": "→", - "\\leftarrow": "←", - "\\Rightarrow": "⇒", - "\\sum": "∑", - "\\prod": "∏", - "\\int": "∫", - "\\partial": "∂", - "\\nabla": "∇", - "\\sqrt": "√", - ] - - func renderMath(formula: String, style: STMarkdownStyle, baseFont: UIFont, textColor: UIColor, displayMode: Bool) -> NSAttributedString { - let paragraphStyle = self.makeParagraphStyle(style: style, displayMode: displayMode) - let normalized = self.normalize(formula) - let result = NSMutableAttributedString() - let baseAttributes: [NSAttributedString.Key: Any] = [ - .font: baseFont, - .foregroundColor: textColor, - .paragraphStyle: paragraphStyle, - ] - - var index = normalized.startIndex - while index < normalized.endIndex { - let character = normalized[index] - if character == "^" || character == "_" { - let isSuperscript = character == "^" - let nextIndex = normalized.index(after: index) - let extraction = self.extractScriptContent(in: normalized, startingAt: nextIndex) - let content = extraction.content.isEmpty ? String(character) : extraction.content - result.append(self.makeScriptAttributedString(content: content, baseFont: baseFont, textColor: textColor, paragraphStyle: paragraphStyle, isSuperscript: isSuperscript)) - index = extraction.nextIndex - continue - } - result.append(NSAttributedString(string: String(character), attributes: baseAttributes)) - index = normalized.index(after: index) - } - if displayMode { - let wrapped = NSMutableAttributedString(string: "\n", attributes: baseAttributes) - wrapped.append(result) - wrapped.append(NSAttributedString(string: "\n", attributes: baseAttributes)) - return wrapped - } - return result - } - - func normalize(_ formula: String) -> String { - var result = formula.trimmingCharacters(in: .whitespacesAndNewlines) - result = result.replacingOccurrences(of: "\r\n", with: " ") - result = result.replacingOccurrences(of: "\n", with: " ") - result = result.replacingOccurrences(of: "\r", with: " ") - result = result.replacingOccurrences(of: #"\("#, with: "") - result = result.replacingOccurrences(of: #"\)"#, with: "") - result = result.replacingOccurrences(of: #"\["#, with: "") - result = result.replacingOccurrences(of: #"\]"#, with: "") - for (command, replacement) in Self.commandMap { - result = result.replacingOccurrences(of: command, with: replacement) - } - while result.contains(" ") { - result = result.replacingOccurrences(of: " ", with: " ") - } - return result - } - - func extractScriptContent(in text: String, startingAt index: String.Index) -> (content: String, nextIndex: String.Index) { - guard index < text.endIndex else { - return ("", index) - } - if text[index] == "{" { - var cursor = text.index(after: index) - var depth = 1 - let start = cursor - while cursor < text.endIndex { - if text[cursor] == "{" { - depth += 1 - } else if text[cursor] == "}" { - depth -= 1 - if depth == 0 { - return (String(text[start.. NSAttributedString { - let scriptFont = UIFont(descriptor: baseFont.fontDescriptor, size: max(baseFont.pointSize * 0.72, 10)) - let offset = isSuperscript ? baseFont.pointSize * 0.32 : -baseFont.pointSize * 0.22 - return NSAttributedString( - string: content, - attributes: [ - .font: scriptFont, - .foregroundColor: textColor, - .paragraphStyle: paragraphStyle, - .baselineOffset: offset, - ] - ) - } - - func makeParagraphStyle(style: STMarkdownStyle, displayMode: Bool) -> NSMutableParagraphStyle { - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.minimumLineHeight = style.lineHeight - paragraphStyle.maximumLineHeight = style.lineHeight - paragraphStyle.paragraphSpacing = displayMode ? style.paragraphSpacing : 0 - paragraphStyle.alignment = displayMode ? .center : .natural - paragraphStyle.lineBreakMode = .byWordWrapping - return paragraphStyle - } -} diff --git a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultTableRenderer.swift b/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultTableRenderer.swift deleted file mode 100644 index a44eebf..0000000 --- a/Sources/STMarkdown/Rendering/Default/STMarkdownDefaultTableRenderer.swift +++ /dev/null @@ -1,159 +0,0 @@ -// -// STMarkdownDefaultTableRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public struct STMarkdownDefaultTableRenderer: STMarkdownTableRendering { - - public init() {} - - public func renderTable(_ table: STMarkdownTableModel, style: STMarkdownStyle) -> NSAttributedString? { - let rows = self.makeRows(from: table) - guard rows.isEmpty == false else { - return nil - } - let columnCount = rows.map(\.count).max() ?? 0 - guard columnCount > 0 else { - return nil - } - let paddedRows = rows.map { row in - row + Array(repeating: "", count: max(0, columnCount - row.count)) - } - let columnWidths = self.columnWidths(for: paddedRows) - let result = NSMutableAttributedString() - for (rowIndex, row) in paddedRows.enumerated() { - let isHeader = table.header != nil && rowIndex == 0 - let renderedRow = self.renderRow(row, columnWidths: columnWidths, isHeader: isHeader, style: style) - result.append(renderedRow) - if rowIndex < paddedRows.count - 1 { - result.append(NSAttributedString(string: "\n")) - } - if isHeader { - result.append(NSAttributedString(string: "\n")) - result.append(self.renderSeparator(columnWidths: columnWidths, style: style)) - if rowIndex < paddedRows.count - 1 { - result.append(NSAttributedString(string: "\n")) - } - } - } - return result - } -} - -private extension STMarkdownDefaultTableRenderer { - func makeRows(from table: STMarkdownTableModel) -> [[String]] { - var rows: [[String]] = [] - if let header = table.header { - rows.append(header.map(self.plainText)) - } - rows.append(contentsOf: table.rows.map { $0.map(self.plainText) }) - return rows - } - - func plainText(from nodes: [STMarkdownInlineNode]) -> String { - nodes.map { node in - switch node { - case .text(let text): - return text - case .inlineMath(let formula, _): - return formula - case .emphasis(let children), .strong(let children): - return self.plainText(from: children) - case .code(let code): - return code - case .link(_, let children): - return self.plainText(from: children) - case .image(_, let alt, _): - return alt.isEmpty ? "[image]" : alt - case .softBreak: - return " " - case .strikethrough(let children): - return self.plainText(from: children) - case .footnoteReference(let label): - return "[^\(label)]" - case .inlineRawHTML(let raw): - return raw - } - }.joined() - } - - func columnWidths(for rows: [[String]]) -> [Int] { - guard let firstRow = rows.first else { return [] } - return firstRow.indices.map { column in - rows.reduce(0) { partialResult, row in - max(partialResult, self.displayWidth(of: row[column])) - } - } - } - - /// 基于 Unicode East Asian Width 属性近似估算等宽字体下的单元宽度。 - /// CJK 全角字符占 2 个等宽格子,其余占 1,能避免中英混排时的列错位。 - func displayWidth(of string: String) -> Int { - var width = 0 - for scalar in string.unicodeScalars { - width += self.isWideScalar(scalar) ? 2 : 1 - } - return width - } - - func isWideScalar(_ scalar: Unicode.Scalar) -> Bool { - switch scalar.value { - case 0x1100...0x115F, // Hangul Jamo - 0x2E80...0x303E, // CJK Radicals Supplement / Kangxi - 0x3041...0x33FF, // Hiragana / Katakana / CJK Symbols - 0x3400...0x4DBF, // CJK Extension A - 0x4E00...0x9FFF, // CJK Unified Ideographs - 0xA000...0xA4CF, // Yi - 0xAC00...0xD7A3, // Hangul Syllables - 0xF900...0xFAFF, // CJK Compatibility Ideographs - 0xFE30...0xFE4F, // CJK Compatibility Forms - 0xFF00...0xFF60, // Fullwidth forms - 0xFFE0...0xFFE6, - 0x20000...0x2FFFD, // CJK Extension B-F - 0x30000...0x3FFFD: - return true - default: - return false - } - } - - func renderRow(_ row: [String], columnWidths: [Int], isHeader: Bool, style: STMarkdownStyle) -> NSAttributedString { - let font: UIFont - if isHeader, let f = style.tableHeaderFont { - font = f - } else if !isHeader, let f = style.tableFont { - font = f - } else { - font = UIFont.st_monospacedSystemFont(ofSize: max(style.font.pointSize - 1, 12), weight: isHeader ? .semibold : .regular) - } - let attributes: [NSAttributedString.Key: Any] = [ - .font: font, - .foregroundColor: isHeader ? (style.tableHeaderTextColor ?? style.textColor) : (style.tableTextColor ?? style.textColor), - .backgroundColor: style.tableBackgroundColor ?? UIColor.secondarySystemBackground, - ] - let rendered = row.enumerated().map { index, column in - let paddingCount = max(0, columnWidths[index] - self.displayWidth(of: column)) - return " \(column)\(String(repeating: " ", count: paddingCount)) " - } - .joined(separator: "│") - return NSAttributedString(string: rendered, attributes: attributes) - } - - func renderSeparator(columnWidths: [Int], style: STMarkdownStyle) -> NSAttributedString { - let font = style.tableFont ?? UIFont.st_monospacedSystemFont(ofSize: max(style.font.pointSize - 1, 12), weight: .regular) - let attributes: [NSAttributedString.Key: Any] = [ - .font: font, - .foregroundColor: style.tableBorderColor ?? style.textColor.withAlphaComponent(0.55), - .backgroundColor: style.tableBackgroundColor ?? UIColor.secondarySystemBackground, - ] - let separator = columnWidths.map { width in - String(repeating: "─", count: width + 2) - } - .joined(separator: "┼") - return NSAttributedString(string: separator, attributes: attributes) - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownBlockLayoutCalculator.swift b/Sources/STMarkdown/Rendering/STMarkdownBlockLayoutCalculator.swift deleted file mode 100644 index 90acd71..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownBlockLayoutCalculator.swift +++ /dev/null @@ -1,189 +0,0 @@ -// -// STMarkdownBlockLayoutCalculator.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public enum STMarkdownBlockLayoutCalculator { - - /// 两个相邻块之间的视觉间距(点)。 - public static func spacing( - after previousBlock: STMarkdownRenderBlock, - before nextBlock: STMarkdownRenderBlock, - style: STMarkdownStyle - ) -> CGFloat { - if isTableAdjacent(previousBlock: previousBlock, nextBlock: nextBlock) { - return style.blockSpacing - } - if case .heading = nextBlock { - // Heading 的 paragraphSpacingBefore/paragraphSpacing 已编码了上下留白, - // 分隔符 "\n" 只是终止上一段,minimumLineHeight 对此无视觉效果,取最小值 1pt。 - return 1 - } - if isListBridgeStrongParagraph(previousBlock: previousBlock, nextBlock: nextBlock, style: style) { - return max(style.listItemSpacing, 1) - } - let prev = trailingSpacing(for: previousBlock, style: style) - let next = leadingSpacing(for: nextBlock, style: style) - return max(max(prev, next), 1) - } - - /// 块之前的推荐前导间距。 - public static func leadingSpacing(for block: STMarkdownRenderBlock, style: STMarkdownStyle) -> CGFloat { - switch block { - case .heading(_, level: let level, anchorId: _, content: _): - return STMarkdownTypography.headingInsets(for: level).top - case .list: - return style.listItemSpacing - case .quote: - return style.blockSpacing * 0.8 - case .codeBlock, .table, .mathBlock, .image, .thematicBreak, .details, .rawHTML: - return style.blockSpacing - case .paragraph: - if isStandaloneColonHeadingParagraph(block) { - return pseudoHeadingTopSpacing(style: style) - } - return style.blockSpacing - } - } - - /// 块之后的推荐尾随间距。 - public static func trailingSpacing(for block: STMarkdownRenderBlock, style: STMarkdownStyle) -> CGFloat { - switch block { - case .heading(_, level: let level, anchorId: _, content: _): - if let bottomSpacings = style.headingBottomSpacing, - level >= 1, level <= bottomSpacings.count { - return bottomSpacings[level - 1] - } - return STMarkdownTypography.headingInsets(for: level).bottom - case .list: - return style.listItemSpacing - case .quote: - return style.blockSpacing * 0.8 - case .codeBlock, .table, .mathBlock, .image, .thematicBreak, .details, .rawHTML: - return style.blockSpacing - case .paragraph: - return style.blockSpacing - } - } - - public static func isTableAdjacent(previousBlock: STMarkdownRenderBlock, nextBlock: STMarkdownRenderBlock) -> Bool { - switch (previousBlock, nextBlock) { - case (.table, _), (_, .table): - return true - default: - return false - } - } - - /// 生成两个相邻块之间的间距 `NSAttributedString`(单个 `"\n"`,行高 = 计算所得间距)。 - /// - /// - Parameters: - /// - skipFadeInKey: 可选的"跳过淡入"自定义属性 key(流式 shimmer 用),传 nil 则不写入。 - public static func separatorAttributedString( - after previousBlock: STMarkdownRenderBlock, - before nextBlock: STMarkdownRenderBlock, - style: STMarkdownStyle, - skipFadeInKey: NSAttributedString.Key? = nil - ) -> NSAttributedString { - let spacing = Self.spacing(after: previousBlock, before: nextBlock, style: style) - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.minimumLineHeight = spacing - paragraphStyle.maximumLineHeight = spacing - paragraphStyle.lineBreakMode = .byWordWrapping - var attrs: [NSAttributedString.Key: Any] = [ - .font: style.font, - .foregroundColor: UIColor.clear, - .paragraphStyle: paragraphStyle, - ] - if let key = skipFadeInKey { attrs[key] = true } - return NSAttributedString(string: "\n", attributes: attrs) - } - - /// 前后块是否构成"列表 ↔ standalone-strong 段落"的桥接关系(使用 listItemSpacing 而非 blockSpacing)。 - public static func isListBridgeStrongParagraph( - previousBlock: STMarkdownRenderBlock, - nextBlock: STMarkdownRenderBlock, - style: STMarkdownStyle - ) -> Bool { - (isListBlock(previousBlock) && isStandaloneStrongParagraph(nextBlock)) - || (isStandaloneStrongParagraph(previousBlock) && isListBlock(nextBlock)) - } - - /// 是否为列表块(不限嵌套层级)。 - public static func isListBlock(_ block: STMarkdownRenderBlock) -> Bool { - if case .list = block { return true } - return false - } - - /// 是否为"仅含 strong 节点"的段落(列表相邻时用 listItemSpacing)。 - public static func isStandaloneStrongParagraph(_ block: STMarkdownRenderBlock) -> Bool { - guard case .paragraph(_, let inlines) = block else { return false } - return isStandaloneStrongParagraph(inlines: inlines) - } - - public static func isStandaloneStrongParagraph(inlines: [STMarkdownInlineNode]) -> Bool { - var sawStrongContent = false - for inline in inlines { - switch inline { - case .strong(let children): - guard !inlineNodesVisibleText(children).isEmpty else { return false } - sawStrongContent = true - case .text(let text), .inlineRawHTML(let text): - if !text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { return false } - case .softBreak: - continue - default: - return false - } - } - return sawStrongContent - } - - /// 递归提取内联节点的可见纯文本(用于判断节点是否有实际内容)。 - public static func inlineNodesVisibleText(_ nodes: [STMarkdownInlineNode]) -> String { - var text = "" - for node in nodes { - switch node { - case .text(let value), .code(let value), .inlineMath(let value, _), .inlineRawHTML(let value): - text.append(value) - case .emphasis(let children), .strong(let children), - .strikethrough(let children), .link(_, let children): - text.append(inlineNodesVisibleText(children)) - case .softBreak: - text.append("\n") - case .image(_, let alt, _): - text.append(alt) - case .footnoteReference(let label): - text.append(label) - } - } - return text.trimmingCharacters(in: .whitespacesAndNewlines) - } - - /// 某块的前一块或后一块是否为列表块(用于判断段落是否紧邻列表)。 - public static func isListAdjacentParagraph(previousBlock: STMarkdownRenderBlock?, nextBlock: STMarkdownRenderBlock?) -> Bool { - if let prev = previousBlock, isListBlock(prev) { return true } - if let next = nextBlock, isListBlock(next) { return true } - return false - } - - /// `paragraph(only-strong, 文本以冒号结尾)` ——LLM 用 `**xxx:**` 单行模拟标题的模式。 - public static func isStandaloneColonHeadingParagraph(_ block: STMarkdownRenderBlock) -> Bool { - guard isStandaloneStrongParagraph(block), - case .paragraph(_, let inlines) = block else { return false } - let text = inlineNodesVisibleText(inlines) - return text.hasSuffix(":") || text.hasSuffix(":") - } - - /// 伪标题的前导间距:等同 h3 heading top spacing,降级为 blockSpacing * 1.6。 - public static func pseudoHeadingTopSpacing(style: STMarkdownStyle) -> CGFloat { - if let topSpacings = style.headingTopSpacing, topSpacings.count >= 3 { - return topSpacings[2] // h3 index - } - return STMarkdownTypography.headingInsets(for: 3).top - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownCodeBlockMarkerInfo.swift b/Sources/STMarkdown/Rendering/STMarkdownCodeBlockMarkerInfo.swift deleted file mode 100644 index 4e7d6f8..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownCodeBlockMarkerInfo.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// STMarkdownCodeBlockMarkerInfo.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public final class STMarkdownCodeBlockMarkerInfo: NSObject { - public let language: String? - public let code: String - public let style: STMarkdownStyle - public let headerHeight: CGFloat - public let contentInsets: UIEdgeInsets - - public init(language: String?, code: String, style: STMarkdownStyle) { - self.language = language?.trimmingCharacters(in: .whitespacesAndNewlines) - self.code = code - self.style = style - self.contentInsets = style.codeBlockContentInsets - let autoHeight = max( - ceil(UIFont.st_monospacedSystemFont( - ofSize: max(style.font.pointSize - 2, 12), - weight: .semibold - ).lineHeight), - 18 - ) - self.headerHeight = style.codeBlockHeaderHeight > 0 ? style.codeBlockHeaderHeight : autoHeight - super.init() - } -} - -public extension NSAttributedString.Key { - static let stCodeBlockMarker = NSAttributedString.Key("com.stbaseproject.stCodeBlockMarker") -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownCodeBlockRenderingPresets.swift b/Sources/STMarkdown/Rendering/STMarkdownCodeBlockRenderingPresets.swift deleted file mode 100644 index 4f1ac02..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownCodeBlockRenderingPresets.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// STMarkdownCodeBlockRenderingPresets.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import Foundation - -public enum STMarkdownCodeBlockRenderingPresets { - /// 简单文本预设:等宽字体 + 头部语言名(无背景框)。性能最好,适合 - /// 流式 markdown 中初次出现的代码片段。 - public typealias PlainText = STMarkdownDefaultCodeBlockRenderer - - /// 单帧 attachment 预设:把代码绘制为 `UIImage` 嵌入文本流。无折叠/无语法高亮, - /// 适合体量小、不需要交互的代码片段。 - public typealias StaticAttachment = STMarkdownCodeBlockAttachmentRenderer - - /// 富 attachment 预设:包含语法高亮、超长折叠 + 渐隐遮罩、按钮行预留以及全局缓存。 - /// 推荐生产环境优先使用。 - public typealias RichAttachment = STMarkdownCodeBlockRenderer - - /// highlight.js 预设:通过 JavaScriptCore + highlight.js 生成 token 着色的 `NSAttributedString`。 - /// 支持 20 种语言,结果按 `language|code` 为 key 缓存(10 MB)。 - /// 适合需要真实语法着色但不需要 attachment 图像的场景;调用方最好从后台线程触发。 - public typealias HighlightJS = STMarkdownCodeHighlighter -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownFullHeightCodeBlockSupport.swift b/Sources/STMarkdown/Rendering/STMarkdownFullHeightCodeBlockSupport.swift deleted file mode 100644 index 5d07f36..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownFullHeightCodeBlockSupport.swift +++ /dev/null @@ -1,187 +0,0 @@ -// -// STMarkdownFullHeightCodeBlockAttachment.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/05/26. -// - -import UIKit - -public final class STMarkdownFullHeightCodeBlockAttachment: NSTextAttachment { - public let language: String? - public let code: String - public let style: STMarkdownStyle - public let headerHeight: CGFloat - public let contentInsets: UIEdgeInsets - - private static let renderCache: NSCache = { - let cache = NSCache() - cache.countLimit = 32 - return cache - }() - - public static func clearRenderCache() { - Self.renderCache.removeAllObjects() - } - - public init(language: String?, code: String, style: STMarkdownStyle) { - self.language = language?.trimmingCharacters(in: .whitespacesAndNewlines) - self.code = code - self.style = style - self.contentInsets = style.codeBlockContentInsets - let autoHeight = max( - ceil(UIFont.st_monospacedSystemFont( - ofSize: max(style.font.pointSize - 2, 12), - weight: .semibold - ).lineHeight), - 18 - ) - self.headerHeight = style.codeBlockHeaderHeight > 0 ? style.codeBlockHeaderHeight : autoHeight - super.init(data: nil, ofType: nil) - - let cacheKey = Self.cacheKey(language: self.language, code: code, style: style) - if let cached = Self.renderCache.object(forKey: cacheKey as NSString) { - self.image = cached - self.bounds = CGRect(origin: .zero, size: cached.size) - return - } - let image = STMarkdownDynamicHeightCodeBlockRenderer.renderAttachmentImage( - language: self.language, - code: code, - style: style, - headerHeight: self.headerHeight, - contentInsets: self.contentInsets - ) - Self.renderCache.setObject(image, forKey: cacheKey as NSString) - self.image = image - self.bounds = CGRect(origin: .zero, size: image.size) - } - - public required init?(coder: NSCoder) { nil } - - private static func cacheKey(language: String?, code: String, style: STMarkdownStyle) -> String { - let count = code.count - let utf8Count = code.utf8.count - let prefix = String(code.prefix(32)) - let suffix = String(code.suffix(32)) - let fingerprint = "c\(count)_b\(utf8Count)_h\(code.hashValue)_p\(prefix)_s\(suffix)" - return [ - language ?? "", - fingerprint, - String(format: "%.2f", style.renderWidth), - String(format: "%.2f", style.font.pointSize), - String(format: "%.2f", style.bodyLineSpacing), - ].joined(separator: "|") - } -} - -/// 全高代码块渲染器,实现 STMarkdownCodeBlockRendering 协议,可直接注入 STMarkdownAdvancedRenderers.codeBlockRenderer。 -public struct STMarkdownDynamicHeightCodeBlockRenderer: STMarkdownCodeBlockRendering { - public init() {} - - public func renderCodeBlock(language: String?, code: String, style: STMarkdownStyle) -> NSAttributedString? { - NSAttributedString(attachment: STMarkdownFullHeightCodeBlockAttachment(language: language, code: code, style: style)) - } - - public static func renderAttachmentImage( - language: String?, - code: String, - style: STMarkdownStyle, - headerHeight: CGFloat, - contentInsets: UIEdgeInsets - ) -> UIImage { - let blockWidth = max( - style.renderWidth > 0 - ? style.renderWidth - : (280 + style.codeBlockContentInsets.left + style.codeBlockContentInsets.right), - 1 - ) - let contentWidth = max(blockWidth - contentInsets.left - contentInsets.right, 1) - let backgroundColor = style.codeBlockBackgroundColor ?? UIColor.secondarySystemBackground - let borderColor = style.codeBlockBorderColor ?? UIColor.separator - let headerColor = style.codeBlockHeaderTextColor ?? style.textColor.withAlphaComponent(0.72) - let headerFont = UIFont.st_monospacedSystemFont( - ofSize: max(style.font.pointSize - 2, 12), - weight: .semibold - ) - let codeFont = UIFont.st_monospacedSystemFont( - ofSize: max(style.font.pointSize - 1, 12), - weight: .regular - ) - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineBreakMode = .byCharWrapping - paragraphStyle.lineSpacing = max(style.bodyLineSpacing, 2) - let highlightedBody = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: language, - code: code, - font: codeFont, - textColor: style.codeBlockTextColor ?? style.textColor, - paragraphStyle: paragraphStyle - ) - let bodyHeight = max( - ceil(highlightedBody.boundingRect( - with: CGSize(width: contentWidth, height: .greatestFiniteMagnitude), - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil - ).height), - ceil(codeFont.lineHeight) - ) - let separatorSpacing = style.codeBlockSeparatorSpacing - let buttonRowReservedWidth = style.codeBlockButtonRowReservedWidth - let blockHeight = contentInsets.top + headerHeight + separatorSpacing + bodyHeight + contentInsets.bottom - let format = UIGraphicsImageRendererFormat.default() - format.scale = style.resolvedDisplayScale - return UIGraphicsImageRenderer( - size: CGSize(width: blockWidth, height: blockHeight), - format: format - ).image { context in - let cgContext = context.cgContext - let rect = CGRect(x: 0, y: 0, width: blockWidth, height: blockHeight) - let path = UIBezierPath(roundedRect: rect, cornerRadius: style.codeBlockCornerRadius) - backgroundColor.setFill() - path.fill() - if style.codeBlockBorderWidth > 0 { - borderColor.setStroke() - path.lineWidth = style.codeBlockBorderWidth - path.stroke() - } - let headerText = (language?.isEmpty == false ? language?.uppercased() : "CODE") ?? "CODE" - let headerTextSize = (headerText as NSString).size(withAttributes: [.font: headerFont]) - let headerTextY = contentInsets.top + max((headerHeight - headerTextSize.height) / 2, 0) - let headerRect = CGRect( - x: contentInsets.left, - y: headerTextY, - width: max(contentWidth - buttonRowReservedWidth, 1), - height: headerTextSize.height - ) - (headerText as NSString).draw( - in: headerRect, - withAttributes: [.font: headerFont, .foregroundColor: headerColor] - ) - let separatorRect = CGRect( - x: contentInsets.left, - y: contentInsets.top + headerHeight + separatorSpacing / 2, - width: contentWidth, - height: 1 - ) - cgContext.setFillColor( - (style.horizontalRuleColor ?? UIColor.separator).withAlphaComponent(0.35).cgColor - ) - cgContext.fill(separatorRect) - let codeRect = CGRect( - x: contentInsets.left, - y: contentInsets.top + headerHeight + separatorSpacing, - width: contentWidth, - height: bodyHeight - ) - cgContext.saveGState() - cgContext.clip(to: codeRect) - highlightedBody.draw( - with: codeRect, - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil - ) - cgContext.restoreGState() - } - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownHTMLPreviewDocumentBuilder.swift b/Sources/STMarkdown/Rendering/STMarkdownHTMLPreviewDocumentBuilder.swift deleted file mode 100644 index 53ae3fc..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownHTMLPreviewDocumentBuilder.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// STMarkdownHTMLPreviewDocumentBuilder.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/05/26. -// - -import UIKit - -/// HTML 片段预览文档包装器。负责将裸 HTML fragment 包裹成完整可渲染的 HTML 文档, -/// 注入背景色、文字色、monospace 样式与内容宽度约束。 -/// 不含任何宿主业务逻辑(分享、导航、主题系统)。 -public enum STMarkdownHTMLPreviewDocumentBuilder { - /// 将 HTML fragment 包裹为完整 HTML 文档。 - /// - Parameters: - /// - fragment: 待包裹的原始 HTML 片段。 - /// - contentWidth: 文档 body 最大宽度(px),由宿主容器尺寸决定。 - /// - style: 提供背景色、文字色等样式参数;为 nil 时使用系统默认色。 - /// - backgroundColorFallback: style.codeBlockBackgroundColor 为 nil 时使用的兜底背景色,默认为系统次背景色。 - public static func wrappedHTMLDocument( - fragment: String, - contentWidth: CGFloat, - style: STMarkdownStyle?, - backgroundColorFallback: UIColor = .secondarySystemBackground - ) -> String { - let bg = rgbString(from: style?.codeBlockBackgroundColor ?? backgroundColorFallback) - let fg = rgbString(from: style?.codeBlockTextColor ?? style?.textColor ?? UIColor.label) - let muted = rgbString( - from: style?.codeBlockHeaderTextColor - ?? (style?.textColor ?? UIColor.label).withAlphaComponent(0.72) - ) - return """ - - - - - - - - - \(fragment) - - - """ - } - - private static func rgbString(from color: UIColor) -> String { - let c = color.cgColor - guard let components = c.components, components.count >= 3 else { - return "rgb(128,128,128)" - } - let r = Int((components[0] * 255).rounded()) - let g = Int((components[1] * 255).rounded()) - let b = Int((components[2] * 255).rounded()) - return "rgb(\(r),\(g),\(b))" - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownInlineCodeBlockRenderer.swift b/Sources/STMarkdown/Rendering/STMarkdownInlineCodeBlockRenderer.swift deleted file mode 100644 index ab4e9e5..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownInlineCodeBlockRenderer.swift +++ /dev/null @@ -1,180 +0,0 @@ -// -// STMarkdownInlineCodeBlockRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 代码块内联文本渲染器。 -/// -/// 将代码块渲染为带背景色的 `NSAttributedString`(非 `NSTextAttachment` 图片), -/// 适用于两个场景: -/// -/// - **流式阶段**:每帧逐字追加,避免 O(N²) 全帧图片重绘; -/// 启用 `tailHighlightOnly` 后仅对末尾 `tailHighlightLines` 行做语法高亮, -/// 把每帧扫描量压至常数 O(1)。 -/// -/// - **AST 静态阶段**:携带 `.codeBlockMarker` 自定义属性供 overlay 按钮定位, -/// 避免 TextKit 1 大尺寸图片 glyph rect 计算不准确导致代码块覆盖后续正文。 -/// -/// 两种用途通过 `Mode` 控制,差异仅在头部属性字典和是否截断高亮行数。 -public enum STMarkdownInlineCodeBlockRenderMode { - /// 流式阶段:跳过业务自定义头部属性,启用尾部高亮截断。 - case streaming(tailHighlightLines: Int) - /// AST 静态阶段:可附加业务自定义的头部属性(如宿主的 `.codeBlockMarker`)。 - case ast(extraHeaderAttributes: [NSAttributedString.Key: Any]) -} - -public struct STMarkdownInlineCodeBlockRenderer { - - public init() {} - - /// 渲染代码块为带背景色的 `NSAttributedString`。 - /// - /// - Parameters: - /// - language: 代码语言(nil / 空字符串时显示 "CODE") - /// - code: 代码正文 - /// - style: 当前 Markdown 样式配置 - /// - mode: 渲染模式(流式 or AST) - /// - skipFadeInKey: 流式 shimmer 文字跳过淡入动画的 `NSAttributedString.Key`(传 nil 时不写入) - public func render( - language: String?, - code: String, - style: STMarkdownStyle, - mode: STMarkdownInlineCodeBlockRenderMode, - skipFadeInKey: NSAttributedString.Key? = nil - ) -> NSAttributedString { - let contentInsets = style.codeBlockContentInsets - let backgroundColor = style.codeBlockBackgroundColor ?? UIColor.secondarySystemBackground - let headerColor = style.codeBlockHeaderTextColor ?? style.textColor.withAlphaComponent(0.72) - let headerFont = UIFont.st_monospacedSystemFont( - ofSize: max(style.font.pointSize - 2, 12), - weight: .semibold - ) - let codeFont = UIFont.st_monospacedSystemFont( - ofSize: max(style.font.pointSize - 1, 12), - weight: .regular - ) - - let result = NSMutableAttributedString() - - // 头部段落样式:spacer attachment 撑出左侧间距,确保背景色连续 - let headerParagraphStyle = NSMutableParagraphStyle() - headerParagraphStyle.tailIndent = -contentInsets.right - headerParagraphStyle.paragraphSpacingBefore = contentInsets.top - headerParagraphStyle.lineBreakMode = .byTruncatingTail - if style.codeBlockHeaderHeight > 0 { - headerParagraphStyle.minimumLineHeight = style.codeBlockHeaderHeight - headerParagraphStyle.maximumLineHeight = style.codeBlockHeaderHeight - } - - let headerText = language.flatMap { $0.isEmpty ? nil : $0.uppercased() } ?? "CODE" - let headerBaselineOffset: CGFloat = style.codeBlockHeaderHeight > 0 - ? (style.codeBlockHeaderHeight - headerFont.lineHeight) / 2 - : 0 - - var headerAttrs: [NSAttributedString.Key: Any] = [ - .font: headerFont, - .foregroundColor: headerColor, - .backgroundColor: backgroundColor, - .paragraphStyle: headerParagraphStyle, - .baselineOffset: headerBaselineOffset, - ] - if let key = skipFadeInKey { headerAttrs[key] = true } - - // AST 模式写入宿主注入的业务属性(如 .codeBlockMarker) - if case .ast(let extraAttrs) = mode { - for (key, value) in extraAttrs { - headerAttrs[key] = value - } - } - - let headerLine = NSMutableAttributedString() - let spacer = NSTextAttachment() - spacer.image = UIImage() - spacer.bounds = CGRect(x: 0, y: 0, width: contentInsets.left, height: 1) - let spacerStr = NSMutableAttributedString(attachment: spacer) - spacerStr.addAttributes(headerAttrs, range: NSRange(location: 0, length: spacerStr.length)) - headerLine.append(spacerStr) - headerLine.append(NSAttributedString(string: headerText + "\n", attributes: headerAttrs)) - result.append(headerLine) - - // 代码体段落样式 - let codeParagraphStyle = NSMutableParagraphStyle() - codeParagraphStyle.lineBreakMode = .byCharWrapping - codeParagraphStyle.lineSpacing = max(style.bodyLineSpacing, 2) - codeParagraphStyle.firstLineHeadIndent = contentInsets.left - codeParagraphStyle.headIndent = contentInsets.left - codeParagraphStyle.tailIndent = -contentInsets.right - codeParagraphStyle.paragraphSpacingBefore = style.codeBlockSeparatorSpacing - - // 语法高亮(流式阶段可截断为尾部 N 行降低 O(N²)) - let mutableBody: NSMutableAttributedString - if case .streaming(let tailLines) = mode, - tailLines > 0 { - let codeLines = code.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) - let totalLines = codeLines.count - if totalLines > tailLines { - let prefixCode = codeLines.prefix(totalLines - tailLines).joined(separator: "\n") + "\n" - let suffixCode = codeLines.dropFirst(totalLines - tailLines).joined(separator: "\n") - mutableBody = NSMutableAttributedString() - mutableBody.append(NSAttributedString(string: prefixCode, attributes: [ - .font: codeFont, - .foregroundColor: style.codeBlockTextColor ?? style.textColor, - .paragraphStyle: codeParagraphStyle, - ])) - let highlightedSuffix = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: language, - code: suffixCode, - font: codeFont, - textColor: style.codeBlockTextColor ?? style.textColor, - paragraphStyle: codeParagraphStyle - ) - mutableBody.append(highlightedSuffix) - } else { - mutableBody = NSMutableAttributedString( - attributedString: STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: language, - code: code, - font: codeFont, - textColor: style.codeBlockTextColor ?? style.textColor, - paragraphStyle: codeParagraphStyle - ) - ) - } - } else { - mutableBody = NSMutableAttributedString( - attributedString: STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: language, - code: code, - font: codeFont, - textColor: style.codeBlockTextColor ?? style.textColor, - paragraphStyle: codeParagraphStyle - ) - ) - } - mutableBody.addAttribute( - .backgroundColor, - value: backgroundColor, - range: NSRange(location: 0, length: mutableBody.length) - ) - result.append(mutableBody) - - // 尾部:底部间距 - let tailParagraphStyle = NSMutableParagraphStyle() - tailParagraphStyle.minimumLineHeight = contentInsets.bottom - tailParagraphStyle.maximumLineHeight = contentInsets.bottom - var tailAttrs: [NSAttributedString.Key: Any] = [ - .font: codeFont, - .foregroundColor: UIColor.clear, - .backgroundColor: backgroundColor, - .paragraphStyle: tailParagraphStyle, - ] - if let key = skipFadeInKey, case .streaming = mode { tailAttrs[key] = true } - result.append(NSAttributedString(string: "\n", attributes: tailAttrs)) - - return result - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownMermaidAttachmentFactory.swift b/Sources/STMarkdown/Rendering/STMarkdownMermaidAttachmentFactory.swift deleted file mode 100644 index 1c5ddad..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownMermaidAttachmentFactory.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// STMarkdownMermaidAttachmentFactory.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public enum STMarkdownMermaidAttachmentFactory { - - /// 将渲染完成的 Mermaid 图片包装为内嵌 attachment,宽度等比缩放至 `renderWidth`。 - public static func imageAttachment(_ image: UIImage, renderWidth: CGFloat) -> NSAttributedString { - let attachment = NSTextAttachment() - attachment.image = image - let scale = image.size.width > 0 ? renderWidth / image.size.width : 1.0 - attachment.bounds = CGRect(origin: .zero, size: CGSize(width: renderWidth, height: image.size.height * scale)) - return NSAttributedString(attachment: attachment) - } - - /// 生成圆角背景 + 居中文字的"加载中"占位 attachment,高度固定 100pt。 - /// - /// - Parameters: - /// - width: 占位块宽度(等于 `renderWidth`) - /// - style: 当前 Markdown 样式(取 `codeBlockBackgroundColor` 和 `codeBlockCornerRadius`) - /// - loadingText: 占位文字,默认 `"Loading diagram..."` - public static func placeholderAttachment( - width: CGFloat, - style: STMarkdownStyle, - loadingText: String = "Loading diagram..." - ) -> NSAttributedString { - let height: CGFloat = 100 - let bgColor = style.codeBlockBackgroundColor ?? UIColor.secondarySystemBackground - let cornerRadius = style.codeBlockCornerRadius - let format = UIGraphicsImageRendererFormat.default() - format.scale = UIScreen.main.scale - let image = UIGraphicsImageRenderer( - size: CGSize(width: width, height: height), - format: format - ).image { _ in - let rect = CGRect(x: 0, y: 0, width: width, height: height) - UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).fill() - bgColor.setFill() - UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).fill() - let attrs: [NSAttributedString.Key: Any] = [ - .font: UIFont.systemFont(ofSize: 13), - .foregroundColor: UIColor.secondaryLabel, - ] - let textSize = (loadingText as NSString).size(withAttributes: attrs) - let textOrigin = CGPoint( - x: (width - textSize.width) / 2, - y: (height - textSize.height) / 2 - ) - (loadingText as NSString).draw(at: textOrigin, withAttributes: attrs) - } - let attachment = NSTextAttachment() - attachment.image = image - attachment.bounds = CGRect(origin: .zero, size: CGSize(width: width, height: height)) - return NSAttributedString(attachment: attachment) - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownPlainTextRenderer.swift b/Sources/STMarkdown/Rendering/STMarkdownPlainTextRenderer.swift deleted file mode 100644 index 20f3cf0..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownPlainTextRenderer.swift +++ /dev/null @@ -1,168 +0,0 @@ -// -// STMarkdownPlainTextRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/06/04. -// - -import Foundation - -public enum STMarkdownPlainTextRenderer { - - private static let plainTextParser = STMarkdownStructureParser() - - public static func makeDeferredPlainTextActivePresentation( - from text: String, - kind: STMarkdownStreamingBlockKind - ) -> String { - guard !text.isEmpty else { return "" } - let prepared = Self.prepareActivePlainTextMarkdown(text, kind: kind) - guard !prepared.isEmpty else { return "" } - let document = Self.plainTextParser.parse(prepared) - let rendered = Self.renderPlainText(document.blocks) - guard !rendered.isEmpty else { - return Self.fallbackPlainText(from: prepared, kind: kind) - } - return rendered - } - - private static func prepareActivePlainTextMarkdown( - _ text: String, - kind: STMarkdownStreamingBlockKind - ) -> String { - guard !text.isEmpty else { return "" } - var candidate = STMarkdownStreamingTransforms.trimTrailingIncompleteCitationTags(in: text) - candidate = STMarkdownStreamingTransforms.trimIncompleteTrailingMarkdownSyntax(in: candidate) - candidate = STMarkdownStreamingTransforms.trimTrailingIncompleteHtmlTag(in: candidate) - candidate = STMarkdownStreamingTransforms.sanitizeDanglingInlineMarkdownFragments(in: candidate) - candidate = STMarkdownStreamingTransforms.trimIncompleteTrailingEmphasis(in: candidate) - candidate = STMarkdownStreamingTransforms.autoCloseTrailingInlineCode(in: candidate) - if kind == .list { - candidate = STMarkdownStreamingTransforms.softenTrailingListLeadingDanglingEmphasis(in: candidate) - } - return candidate.trimmingCharacters(in: .whitespacesAndNewlines) - } - - private static func fallbackPlainText( - from text: String, - kind: STMarkdownStreamingBlockKind - ) -> String { - var flattened = STMarkdownStreamingTransforms.flattenStreamingBlockSyntax(in: text) - if kind == .list { - flattened = STMarkdownStreamingTransforms.flattenStreamingListSyntax(in: flattened) - } - flattened = flattened.replacingOccurrences(of: "**", with: "") - flattened = flattened.replacingOccurrences(of: "__", with: "") - flattened = flattened.replacingOccurrences(of: "~~", with: "") - flattened = flattened.replacingOccurrences(of: "`", with: "") - flattened = flattened.replacingOccurrences(of: "*", with: "") - flattened = flattened.replacingOccurrences(of: "_", with: "") - return STMarkdownStreamingTransforms.sanitizeDanglingInlineMarkdownFragments(in: flattened) - .trimmingCharacters(in: .whitespacesAndNewlines) - } - - private static func renderPlainText(_ blocks: [STMarkdownBlockNode], quoteDepth: Int = 0) -> String { - guard !blocks.isEmpty else { return "" } - var parts: [String] = [] - for block in blocks { - let rendered = Self.renderPlainText(block, quoteDepth: quoteDepth) - if !rendered.isEmpty { - parts.append(rendered) - } - } - return parts.joined(separator: "\n").trimmingCharacters(in: .whitespacesAndNewlines) - } - - private static func renderPlainText(_ block: STMarkdownBlockNode, quoteDepth: Int) -> String { - switch block { - case .paragraph(let inlines): - return Self.quotePrefix(depth: quoteDepth) + Self.renderPlainText(inlines) - case .heading(_, let content): - return Self.quotePrefix(depth: quoteDepth) + Self.renderPlainText(content) - case .quote(let blocks): - return Self.renderPlainText(blocks, quoteDepth: quoteDepth + 1) - case .list(let kind, let items): - return Self.renderPlainTextList(kind: kind, items: items, quoteDepth: quoteDepth) - case .codeBlock(_, let code): - let trimmed = code.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty else { return "" } - return Self.quotePrefix(depth: quoteDepth) + trimmed - case .thematicBreak: - return "" - case .details(let summary, let body): - let summaryText = Self.renderPlainText(summary) - let bodyText = Self.renderPlainText(body, quoteDepth: quoteDepth) - return [summaryText, bodyText] - .filter { !$0.isEmpty } - .joined(separator: "\n") - case .rawHTML(let html): - let trimmed = html.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty else { return "" } - return Self.quotePrefix(depth: quoteDepth) + trimmed - case .image(_, let altText, _): - return Self.quotePrefix(depth: quoteDepth) + altText - case .table, .mathBlock: - return "" - } - } - - private static func renderPlainTextList( - kind: STMarkdownListKind, - items: [STMarkdownListItemNode], - quoteDepth: Int - ) -> String { - guard !items.isEmpty else { return "" } - var lines: [String] = [] - for (index, item) in items.enumerated() { - let marker: String - switch kind { - case .unordered: - marker = quoteDepth > 0 ? "◦" : "•" - case .ordered(let startIndex): - marker = "\(startIndex + index))" - } - let itemBody = Self.renderPlainText(item.blocks, quoteDepth: quoteDepth) - let itemLines = itemBody.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) - guard let firstLine = itemLines.first, !firstLine.isEmpty else { continue } - lines.append("\(marker) \(firstLine)") - for continuation in itemLines.dropFirst() where !continuation.isEmpty { - lines.append("\(Self.quotePrefix(depth: quoteDepth))\(continuation)") - } - } - return lines.joined(separator: "\n") - } - - private static func renderPlainText(_ inlines: [STMarkdownInlineNode]) -> String { - var output = "" - for inline in inlines { - switch inline { - case .text(let text): - output += text - case .inlineMath(let text, _): - output += text - case .emphasis(let children), - .strong(let children), - .strikethrough(let children): - output += Self.renderPlainText(children) - case .code(let code): - output += code - case .link(_, let children): - output += Self.renderPlainText(children) - case .image(_, let alt, _): - output += alt - case .softBreak: - output += "\n" - case .footnoteReference(let label): - output += "[\(label)]" - case .inlineRawHTML(let html): - output += html - } - } - return output.trimmingCharacters(in: .whitespacesAndNewlines) - } - - private static func quotePrefix(depth: Int) -> String { - guard depth > 0 else { return "" } - return String(repeating: "│ ", count: depth) - } -} diff --git a/Sources/STMarkdown/Rendering/STMarkdownStreamingPresentationHelpers.swift b/Sources/STMarkdown/Rendering/STMarkdownStreamingPresentationHelpers.swift deleted file mode 100644 index 83f4cd0..0000000 --- a/Sources/STMarkdown/Rendering/STMarkdownStreamingPresentationHelpers.swift +++ /dev/null @@ -1,366 +0,0 @@ -// -// STMarkdownStreamingPresentationHelpers.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/06/04. -// - -import Foundation - -public enum STMarkdownStreamingTextStabilizer { - - public static func isListLine(_ trimmedLine: String) -> Bool { - if trimmedLine.hasPrefix("- ") - || trimmedLine.hasPrefix("+ ") - || trimmedLine.hasPrefix("* ") - || trimmedLine.hasPrefix("• ") - || trimmedLine.hasPrefix("◦ ") - || trimmedLine.hasPrefix("▪ ") { - return true - } - return trimmedLine.range(of: #"^\d+(?:\.|[))])\s+"#, options: .regularExpression) != nil - } - - public static func endsWithOrderedListLine(_ text: String) -> Bool { - let lines = text.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) - guard let lastNonEmpty = lines.last(where: { - !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty - }) else { - return false - } - let trimmed = lastNonEmpty.trimmingCharacters(in: .whitespaces) - for separator: Character in [".", ")"] { - guard let sepIndex = trimmed.firstIndex(of: separator), - sepIndex > trimmed.startIndex else { - continue - } - let digits = trimmed[.. String { - let trimmed = line.trimmingCharacters(in: .whitespaces) - guard !trimmed.isEmpty, Self.isListLine(trimmed) else { return line } - let markers = ["~~", "**", "__"] - var updated = line - for marker in markers { - if Self.countUnescapedOccurrences(of: marker, in: updated) % 2 != 0 { - if updated.hasSuffix(marker) { - updated = String(updated.dropLast(marker.count)) - } else if marker.count > 1 { - let unit = String(marker.prefix(1)) - if updated.hasSuffix(unit) { - updated = String(updated.dropLast(unit.count)) - } - } - } - } - return updated - } - - public static func committedLinePrefix(in text: String) -> String { - guard let lastNewline = text.lastIndex(of: "\n") else { return "" } - return String(text[.. String.Index? { - let closingCharacters = CharacterSet(charactersIn: "\"\u{2018}\u{2019}\u{201C}\u{201D}\u{FF09})]】」』 ") - var index = text.endIndex - while index > text.startIndex { - let previous = text.index(before: index) - let character = text[previous] - if "。!?!?;;::\n".contains(character) { - var boundary = text.index(after: previous) - while boundary < text.endIndex, - let scalar = text[boundary].unicodeScalars.first, - closingCharacters.contains(scalar) { - boundary = text.index(after: boundary) - } - return boundary - } - index = previous - } - return nil - } - - public static func containsPotentiallyUnstableMarkdownSyntax(_ text: String) -> Bool { - guard !text.isEmpty else { return false } - if text.contains("[") || text.contains("|") || text.contains("`") { - return true - } - if text.contains("**") || text.contains("__") || text.contains("~~") { - return true - } - if text.hasPrefix("#") || text.hasPrefix(">") { - return true - } - let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) - if ["*", "-", "+"].contains(trimmed) { - return true - } - let orderedRange = NSRange(location: 0, length: trimmed.utf16.count) - if STMarkdownStreamingRegex.streamingPartialOrderedListMarker.firstMatch( - in: trimmed, options: [], range: orderedRange - ) != nil { - return true - } - return false - } - - public static func makeStableParagraphPreview(from text: String) -> String { - guard !text.isEmpty else { return "" } - let stabilized = STMarkdownStreamingTransforms.stabilizeStreamingPresentationTail(in: text) - if Self.containsPotentiallyUnstableMarkdownSyntax(stabilized) { - if let boundary = Self.lastSentenceBoundary(in: stabilized) { - return String(stabilized[.. String { - guard !text.isEmpty else { return "" } - let stabilized = STMarkdownStreamingTransforms.stabilizeStreamingPresentationTail(in: text) - if !Self.containsPotentiallyUnstableMarkdownSyntax(stabilized) { - return stabilized - } - return Self.committedLinePrefix(in: stabilized) - } - - public static func makeStableQuotedPreview(from text: String) -> String { - guard !text.isEmpty else { return "" } - let stabilized = STMarkdownStreamingTransforms.stabilizeStreamingPresentationTail(in: text) - if !Self.containsPotentiallyUnstableMarkdownSyntax(stabilized) { - return stabilized - } - return Self.committedLinePrefix(in: stabilized) - } - - public static func makeStableSingleLineBlockPreview(from text: String) -> String { - guard !text.isEmpty else { return "" } - let stabilized = STMarkdownStreamingTransforms.stabilizeStreamingPresentationTail(in: text) - if stabilized.hasSuffix("\n") { - return stabilized.trimmingCharacters(in: .newlines) - } - return Self.containsPotentiallyUnstableMarkdownSyntax(stabilized) ? "" : stabilized - } - - public static func isLikelyStreamingTableHeaderCandidate(_ line: String) -> Bool { - let trimmed = line.trimmingCharacters(in: .whitespaces) - guard !trimmed.isEmpty else { return false } - let pipeCount = trimmed.filter { $0 == "|" }.count - guard pipeCount >= 2 else { return false } - if trimmed.hasPrefix("|") || trimmed.hasSuffix("|") { - return true - } - let cells = trimmed - .split(separator: "|", omittingEmptySubsequences: false) - .map { $0.trimmingCharacters(in: .whitespaces) } - .filter { !$0.isEmpty } - guard cells.count >= 2 else { return false } - let hasSentencePunctuation = cells.contains { cell in - cell.contains("。") || cell.contains(",") || cell.contains(";") || cell.contains(":") - } - let maxCellLength = cells.map(\.count).max() ?? 0 - return !hasSentencePunctuation && maxCellLength <= 24 - } - - public static func containsLikelyTableSyntax(in lines: [String]) -> Bool { - for line in lines { - let trimmed = line.trimmingCharacters(in: .whitespaces) - if trimmed.isEmpty { continue } - let pipeCount = trimmed.filter { $0 == "|" }.count - if pipeCount >= 2 || trimmed.hasPrefix("|") { - return true - } - } - return false - } - - public static func makeStreamingTablePresentation(from text: String) -> String { - guard !text.isEmpty else { return "" } - let lines = text.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) - guard !lines.isEmpty else { return "" } - guard lines.count >= 2 else { return "" } - let separator = lines[1].trimmingCharacters(in: .whitespaces) - let nonSepChars = separator.filter { $0 != "|" && $0 != "-" && $0 != ":" && $0 != " " && $0 != "\t" } - guard nonSepChars.isEmpty, separator.contains("--") else { return "" } - - var validLines: [String] = [] - validLines.append(lines[0]) - validLines.append(lines[1]) - for row in lines.dropFirst(2) { - let trimmed = row.trimmingCharacters(in: .whitespaces) - let pipeCount = trimmed.filter { $0 == "|" }.count - if pipeCount >= 2 { - validLines.append(row) - } - } - guard validLines.count >= 2 else { return "" } - - if validLines.count == 2 { - let colCount = max(lines[0].filter({ $0 == "|" }).count - 1, 1) - let emptyCells = Array(repeating: " ", count: colCount) - validLines.append("| " + emptyCells.joined(separator: " | ") + " |") - } - - let lastIdx = validLines.count - 1 - if lastIdx >= 2 { - validLines[lastIdx] = Self.autoCloseEmphasisInTableRow(validLines[lastIdx]) - } - return validLines.joined(separator: "\n") - } - - public static func autoCloseEmphasisInTableRow(_ row: String) -> String { - let parts = row.split(separator: "|", omittingEmptySubsequences: false).map(String.init) - guard parts.count >= 3 else { return row } - var result: [String] = [] - for (index, part) in parts.enumerated() { - if index == 0 || index == parts.count - 1 { - result.append(part) - continue - } - result.append(Self.autoCloseEmphasisInCellContent(part)) - } - return result.joined(separator: "|") - } - - public static func autoCloseEmphasisInCellContent(_ cell: String) -> String { - var text = cell - let markers: [(String, Int)] = [("~~", 2), ("**", 2), ("__", 2), ("*", 1), ("_", 1)] - for (marker, _) in markers { - var count = 0 - var searchRange = text.startIndex.. String { - guard !text.isEmpty else { return text } - var lines = text.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) - guard let lastNonEmptyIndex = lines.lastIndex(where: { - !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty - }) else { - return text - } - let line = lines[lastNonEmptyIndex] - let trimmed = line.trimmingCharacters(in: .whitespaces) - guard !trimmed.isEmpty else { return text } - guard !trimmed.contains("|") else { return text } - let nsRange = NSRange(location: 0, length: trimmed.utf16.count) - let isStandaloneStrongLine = trimmed.hasPrefix("**") - let isHeadingStrongLine = Self.headingStrongLineRegex.firstMatch( - in: trimmed, options: [], range: nsRange - ) != nil - guard isStandaloneStrongLine || isHeadingStrongLine else { return text } - guard !trimmed.hasSuffix("**") else { return text } - guard Self.countUnescapedOccurrences(of: "**", in: trimmed) == 1 else { return text } - let closingSuffix = line.hasSuffix("*") ? "*" : "**" - lines[lastNonEmptyIndex] = line + closingSuffix - return lines.joined(separator: "\n") - } - - public static func countUnescapedOccurrences(of token: String, in text: String) -> Int { - guard !token.isEmpty else { return 0 } - var count = 0 - var searchStart = text.startIndex - while let range = text.range(of: token, range: searchStart.. text.startIndex - && text[text.index(before: range.lowerBound)] == "\\" - if !escaped { count += 1 } - searchStart = range.upperBound - } - return count - } - - public static func trimUnpairedTrailingMarker(in line: String, marker: String, markerLen: Int) -> String { - var positions: [String.Index] = [] - if markerLen == 1 { - let markerChar = marker.first! - var i = line.startIndex - while i < line.endIndex { - if line[i] == markerChar { - let runStart = i - var runLength = 0 - var j = i - while j < line.endIndex, line[j] == markerChar { - runLength += 1 - j = line.index(after: j) - } - if runLength % 2 == 1 { - var isListBullet = false - if runLength == 1, marker == "*" || marker == "-" || marker == "+" { - let lineHead: String.Index - if let prevNewline = line[line.startIndex..[ \t]?(.*)$"#, - options: [] - ) -} diff --git a/Sources/STMarkdown/Resources/default.min.css b/Sources/STMarkdown/Resources/default.min.css deleted file mode 100644 index df8c415..0000000 --- a/Sources/STMarkdown/Resources/default.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - Theme: Default - Description: Original highlight.js style - Author: (c) Ivan Sagalaev - Maintainer: @highlightjs/core-team - Website: https://highlightjs.org/ - License: see project LICENSE - Touched: 2021 -*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fff;color:#1f3b63}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} diff --git a/Sources/STMarkdown/Resources/highlight.min.js b/Sources/STMarkdown/Resources/highlight.min.js deleted file mode 100644 index 3d27c68..0000000 --- a/Sources/STMarkdown/Resources/highlight.min.js +++ /dev/null @@ -1,1123 +0,0 @@ -/*! - Highlight.js v11.10.0 (git: 366a8bd012) - (c) 2006-2024 Josh Goebel and other contributors - License: BSD-3-Clause - */ -var hljs=function(){"use strict";function e(t){ -return t instanceof Map?t.clear=t.delete=t.set=()=>{ -throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ -throw Error("set is read-only") -}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{ -const i=t[n],s=typeof i;"object"!==s&&"function"!==s||Object.isFrozen(i)||e(i) -})),t}class t{constructor(e){ -void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} -ignoreMatch(){this.isMatchIgnored=!0}}function n(e){ -return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") -}function i(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] -;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const s=e=>!!e.scope -;class o{constructor(e,t){ -this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ -this.buffer+=n(e)}openNode(e){if(!s(e))return;const t=((e,{prefix:t})=>{ -if(e.startsWith("language:"))return e.replace("language:","language-") -;if(e.includes(".")){const n=e.split(".") -;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") -}return`${t}${e}`})(e.scope,{prefix:this.classPrefix});this.span(t)} -closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ -this.buffer+=``}}const r=(e={})=>{const t={children:[]} -;return Object.assign(t,e),t};class a{constructor(){ -this.rootNode=r(),this.stack=[this.rootNode]}get top(){ -return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ -this.top.children.push(e)}openNode(e){const t=r({scope:e}) -;this.add(t),this.stack.push(t)}closeNode(){ -if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ -for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} -walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ -return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), -t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ -"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ -a._collapse(e)})))}}class c extends a{constructor(e){super(),this.options=e} -addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ -this.closeNode()}__addSublanguage(e,t){const n=e.root -;t&&(n.scope="language:"+t),this.add(n)}toHTML(){ -return new o(this,this.options).value()}finalize(){ -return this.closeAllNodes(),!0}}function l(e){ -return e?"string"==typeof e?e:e.source:null}function g(e){return h("(?=",e,")")} -function u(e){return h("(?:",e,")*")}function d(e){return h("(?:",e,")?")} -function h(...e){return e.map((e=>l(e))).join("")}function f(...e){const t=(e=>{ -const t=e[e.length-1] -;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} -})(e);return"("+(t.capture?"":"?:")+e.map((e=>l(e))).join("|")+")"} -function p(e){return RegExp(e.toString()+"|").exec("").length-1} -const b=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ -;function m(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n -;let i=l(e),s="";for(;i.length>0;){const e=b.exec(i);if(!e){s+=i;break} -s+=i.substring(0,e.index), -i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0], -"("===e[0]&&n++)}return s})).map((e=>`(${e})`)).join(t)} -const E="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",w="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",_="\\b(0b[01]+)",O={ -begin:"\\\\[\\s\\S]",relevance:0},v={scope:"string",begin:"'",end:"'", -illegal:"\\n",contains:[O]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", -contains:[O]},N=(e,t,n={})=>{const s=i({scope:"comment",begin:e,end:t, -contains:[]},n);s.contains.push({scope:"doctag", -begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", -end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) -;const o=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) -;return s.contains.push({begin:h(/[ ]+/,"(",o,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s -},S=N("//","$"),M=N("/\\*","\\*/"),R=N("#","$");var j=Object.freeze({ -__proto__:null,APOS_STRING_MODE:v,BACKSLASH_ESCAPE:O,BINARY_NUMBER_MODE:{ -scope:"number",begin:_,relevance:0},BINARY_NUMBER_RE:_,COMMENT:N, -C_BLOCK_COMMENT_MODE:M,C_LINE_COMMENT_MODE:S,C_NUMBER_MODE:{scope:"number", -begin:y,relevance:0},C_NUMBER_RE:y,END_SAME_AS_BEGIN:e=>Object.assign(e,{ -"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}}),HASH_COMMENT_MODE:R,IDENT_RE:E, -MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+x,relevance:0}, -NUMBER_MODE:{scope:"number",begin:w,relevance:0},NUMBER_RE:w, -PHRASAL_WORDS_MODE:{ -begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -},QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, -end:/\/[gimuy]*/,contains:[O,{begin:/\[/,end:/\]/,relevance:0,contains:[O]}]}, -RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", -SHEBANG:(e={})=>{const t=/^#![ ]*\// -;return e.binary&&(e.begin=h(t,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:t, -end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, -TITLE_MODE:{scope:"title",begin:E,relevance:0},UNDERSCORE_IDENT_RE:x, -UNDERSCORE_TITLE_MODE:{scope:"title",begin:x,relevance:0}});function A(e,t){ -"."===e.input[e.index-1]&&t.ignoreMatch()}function I(e,t){ -void 0!==e.className&&(e.scope=e.className,delete e.className)}function T(e,t){ -t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", -e.__beforeBegin=A,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, -void 0===e.relevance&&(e.relevance=0))}function L(e,t){ -Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function B(e,t){ -if(e.match){ -if(e.begin||e.end)throw Error("begin & end are not supported with match") -;e.begin=e.match,delete e.match}}function P(e,t){ -void 0===e.relevance&&(e.relevance=1)}const D=(e,t)=>{if(!e.beforeMatch)return -;if(e.starts)throw Error("beforeMatch cannot be used with starts") -;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] -})),e.keywords=n.keywords,e.begin=h(n.beforeMatch,g(n.begin)),e.starts={ -relevance:0,contains:[Object.assign(n,{endsParent:!0})] -},e.relevance=0,delete n.beforeMatch -},H=["of","and","for","in","not","or","if","then","parent","list","value"],C="keyword" -;function $(e,t,n=C){const i=Object.create(null) -;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{ -Object.assign(i,$(e[n],t,n))})),i;function s(e,n){ -t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") -;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ -return t?Number(t):(e=>H.includes(e.toLowerCase()))(e)?0:1}const z={},W=e=>{ -console.error(e)},X=(e,...t)=>{console.log("WARN: "+e,...t)},G=(e,t)=>{ -z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) -},K=Error();function F(e,t,{key:n}){let i=0;const s=e[n],o={},r={} -;for(let e=1;e<=t.length;e++)r[e+i]=s[e],o[e+i]=!0,i+=p(t[e-1]) -;e[n]=r,e[n]._emit=o,e[n]._multi=!0}function Z(e){(e=>{ -e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, -delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ -_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope -}),(e=>{if(Array.isArray(e.begin)){ -if(e.skip||e.excludeBegin||e.returnBegin)throw W("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), -K -;if("object"!=typeof e.beginScope||null===e.beginScope)throw W("beginScope must be object"), -K;F(e,e.begin,{key:"beginScope"}),e.begin=m(e.begin,{joinWith:""})}})(e),(e=>{ -if(Array.isArray(e.end)){ -if(e.skip||e.excludeEnd||e.returnEnd)throw W("skip, excludeEnd, returnEnd not compatible with endScope: {}"), -K -;if("object"!=typeof e.endScope||null===e.endScope)throw W("endScope must be object"), -K;F(e,e.end,{key:"endScope"}),e.end=m(e.end,{joinWith:""})}})(e)}function V(e){ -function t(t,n){ -return RegExp(l(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) -}class n{constructor(){ -this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} -addRule(e,t){ -t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), -this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) -;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(m(e,{joinWith:"|" -}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex -;const t=this.matcherRe.exec(e);if(!t)return null -;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] -;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){ -this.rules=[],this.multiRegexes=[], -this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ -if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n -;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), -t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ -return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ -this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ -const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex -;let n=t.exec(e) -;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ -const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} -return n&&(this.regexIndex+=n.position+1, -this.regexIndex===this.count&&this.considerAll()),n}} -if(e.compilerExtensions||(e.compilerExtensions=[]), -e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") -;return e.classNameAliases=i(e.classNameAliases||{}),function n(o,r){const a=o -;if(o.isCompiled)return a -;[I,B,Z,D].forEach((e=>e(o,r))),e.compilerExtensions.forEach((e=>e(o,r))), -o.__beforeBegin=null,[T,L,P].forEach((e=>e(o,r))),o.isCompiled=!0;let c=null -;return"object"==typeof o.keywords&&o.keywords.$pattern&&(o.keywords=Object.assign({},o.keywords), -c=o.keywords.$pattern, -delete o.keywords.$pattern),c=c||/\w+/,o.keywords&&(o.keywords=$(o.keywords,e.case_insensitive)), -a.keywordPatternRe=t(c,!0), -r&&(o.begin||(o.begin=/\B|\b/),a.beginRe=t(a.begin),o.end||o.endsWithParent||(o.end=/\B|\b/), -o.end&&(a.endRe=t(a.end)), -a.terminatorEnd=l(a.end)||"",o.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(o.end?"|":"")+r.terminatorEnd)), -o.illegal&&(a.illegalRe=t(o.illegal)), -o.contains||(o.contains=[]),o.contains=[].concat(...o.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>i(e,{ -variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?i(e,{ -starts:e.starts?i(e.starts):null -}):Object.isFrozen(e)?i(e):e))("self"===e?o:e)))),o.contains.forEach((e=>{n(e,a) -})),o.starts&&n(o.starts,r),a.matcher=(e=>{const t=new s -;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" -}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" -}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ -return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ -constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} -const Y=n,Q=i,ee=Symbol("nomatch"),te=n=>{ -const i=Object.create(null),s=Object.create(null),o=[];let r=!0 -;const a="Could not find the language '{}', did you forget to load/include a language module?",l={ -disableAutodetect:!0,name:"Plain text",contains:[]};let p={ -ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, -languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", -cssSelector:"pre code",languages:null,__emitter:c};function b(e){ -return p.noHighlightRe.test(e)}function m(e,t,n){let i="",s="" -;"object"==typeof t?(i=e, -n=t.ignoreIllegals,s=t.language):(G("10.7.0","highlight(lang, code, ...args) has been deprecated."), -G("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), -s=e,i=t),void 0===n&&(n=!0);const o={code:i,language:s};N("before:highlight",o) -;const r=o.result?o.result:E(o.language,o.code,n) -;return r.code=o.code,N("after:highlight",r),r}function E(e,n,s,o){ -const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(R) -;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(R),n="" -;for(;t;){n+=R.substring(e,t.index) -;const s=_.case_insensitive?t[0].toLowerCase():t[0],o=(i=s,N.keywords[i]);if(o){ -const[e,i]=o -;if(M.addText(n),n="",c[s]=(c[s]||0)+1,c[s]<=7&&(j+=i),e.startsWith("_"))n+=t[0];else{ -const n=_.classNameAliases[e]||e;u(t[0],n)}}else n+=t[0] -;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(R)}var i -;n+=R.substring(e),M.addText(n)}function g(){null!=N.subLanguage?(()=>{ -if(""===R)return;let e=null;if("string"==typeof N.subLanguage){ -if(!i[N.subLanguage])return void M.addText(R) -;e=E(N.subLanguage,R,!0,S[N.subLanguage]),S[N.subLanguage]=e._top -}else e=x(R,N.subLanguage.length?N.subLanguage:null) -;N.relevance>0&&(j+=e.relevance),M.__addSublanguage(e._emitter,e.language) -})():l(),R=""}function u(e,t){ -""!==e&&(M.startScope(t),M.addText(e),M.endScope())}function d(e,t){let n=1 -;const i=t.length-1;for(;n<=i;){if(!e._emit[n]){n++;continue} -const i=_.classNameAliases[e[n]]||e[n],s=t[n];i?u(s,i):(R=s,l(),R=""),n++}} -function h(e,t){ -return e.scope&&"string"==typeof e.scope&&M.openNode(_.classNameAliases[e.scope]||e.scope), -e.beginScope&&(e.beginScope._wrap?(u(R,_.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), -R=""):e.beginScope._multi&&(d(e.beginScope,t),R="")),N=Object.create(e,{parent:{ -value:N}}),N}function f(e,n,i){let s=((e,t)=>{const n=e&&e.exec(t) -;return n&&0===n.index})(e.endRe,i);if(s){if(e["on:end"]){const i=new t(e) -;e["on:end"](n,i),i.isMatchIgnored&&(s=!1)}if(s){ -for(;e.endsParent&&e.parent;)e=e.parent;return e}} -if(e.endsWithParent)return f(e.parent,n,i)}function b(e){ -return 0===N.matcher.regexIndex?(R+=e[0],1):(T=!0,0)}function m(e){ -const t=e[0],i=n.substring(e.index),s=f(N,e,i);if(!s)return ee;const o=N -;N.endScope&&N.endScope._wrap?(g(), -u(t,N.endScope._wrap)):N.endScope&&N.endScope._multi?(g(), -d(N.endScope,e)):o.skip?R+=t:(o.returnEnd||o.excludeEnd||(R+=t), -g(),o.excludeEnd&&(R=t));do{ -N.scope&&M.closeNode(),N.skip||N.subLanguage||(j+=N.relevance),N=N.parent -}while(N!==s.parent);return s.starts&&h(s.starts,e),o.returnEnd?0:t.length} -let w={};function y(i,o){const a=o&&o[0];if(R+=i,null==a)return g(),0 -;if("begin"===w.type&&"end"===o.type&&w.index===o.index&&""===a){ -if(R+=n.slice(o.index,o.index+1),!r){const t=Error(`0 width match regex (${e})`) -;throw t.languageName=e,t.badRule=w.rule,t}return 1} -if(w=o,"begin"===o.type)return(e=>{ -const n=e[0],i=e.rule,s=new t(i),o=[i.__beforeBegin,i["on:begin"]] -;for(const t of o)if(t&&(t(e,s),s.isMatchIgnored))return b(n) -;return i.skip?R+=n:(i.excludeBegin&&(R+=n), -g(),i.returnBegin||i.excludeBegin||(R=n)),h(i,e),i.returnBegin?0:n.length})(o) -;if("illegal"===o.type&&!s){ -const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') -;throw e.mode=N,e}if("end"===o.type){const e=m(o);if(e!==ee)return e} -if("illegal"===o.type&&""===a)return 1 -;if(I>1e5&&I>3*o.index)throw Error("potential infinite loop, way more iterations than matches") -;return R+=a,a.length}const _=O(e)||O('plaintext') -;if(!_)throw W(a.replace("{}",e)),Error('Unknown language: "'+e+'"') -;const v=V(_);let k="",N=o||v;const S={},M=new p.__emitter(p);(()=>{const e=[] -;for(let t=N;t!==_;t=t.parent)t.scope&&e.unshift(t.scope) -;e.forEach((e=>M.openNode(e)))})();let R="",j=0,A=0,I=0,T=!1;try{ -if(_.__emitTokens)_.__emitTokens(n,M);else{for(N.matcher.considerAll();;){ -I++,T?T=!1:N.matcher.considerAll(),N.matcher.lastIndex=A -;const e=N.matcher.exec(n);if(!e)break;const t=y(n.substring(A,e.index),e) -;A=e.index+t}y(n.substring(A))}return M.finalize(),k=M.toHTML(),{language:e, -value:k,relevance:j,illegal:!1,_emitter:M,_top:N}}catch(t){ -if(t.message&&t.message.includes("Illegal"))return{language:e,value:Y(n), -illegal:!0,relevance:0,_illegalBy:{message:t.message,index:A, -context:n.slice(A-100,A+100),mode:t.mode,resultSoFar:k},_emitter:M};if(r)return{ -language:e,value:Y(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:N} -;throw t}}function x(e,t){t=t||p.languages||Object.keys(i);const n=(e=>{ -const t={value:Y(e),illegal:!1,relevance:0,_top:l,_emitter:new p.__emitter(p)} -;return t._emitter.addText(e),t})(e),s=t.filter(O).filter(k).map((t=>E(t,e,!1))) -;s.unshift(n);const o=s.sort(((e,t)=>{ -if(e.relevance!==t.relevance)return t.relevance-e.relevance -;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 -;if(O(t.language).supersetOf===e.language)return-1}return 0})),[r,a]=o,c=r -;return c.secondBest=a,c}function w(e){let t=null;const n=(e=>{ -let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" -;const n=p.languageDetectRe.exec(t);if(n){const t=O(n[1]) -;return t||(X(a.replace("{}",n[1])), -X("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} -return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return -;if(N("before:highlightElement",{el:e,language:n -}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) -;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), -console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), -console.warn("The element with unescaped HTML:"), -console.warn(e)),p.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) -;t=e;const i=t.textContent,o=n?m(i,{language:n,ignoreIllegals:!0}):x(i) -;e.innerHTML=o.value,e.dataset.highlighted="yes",((e,t,n)=>{const i=t&&s[t]||n -;e.classList.add("hljs"),e.classList.add("language-"+i) -})(e,n,o.language),e.result={language:o.language,re:o.relevance, -relevance:o.relevance},o.secondBest&&(e.secondBest={ -language:o.secondBest.language,relevance:o.secondBest.relevance -}),N("after:highlightElement",{el:e,result:o,text:i})}let y=!1;function _(){ -"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(w):y=!0 -}function O(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]} -function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ -s[e.toLowerCase()]=t}))}function k(e){const t=O(e) -;return t&&!t.disableAutodetect}function N(e,t){const n=e;o.forEach((e=>{ -e[n]&&e[n](t)}))} -"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ -y&&_()}),!1),Object.assign(n,{highlight:m,highlightAuto:x,highlightAll:_, -highlightElement:w, -highlightBlock:e=>(G("10.7.0","highlightBlock will be removed entirely in v12.0"), -G("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{p=Q(p,e)}, -initHighlighting:()=>{ -_(),G("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, -initHighlightingOnLoad:()=>{ -_(),G("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") -},registerLanguage:(e,t)=>{let s=null;try{s=t(n)}catch(t){ -if(W("Language definition for '{}' could not be registered.".replace("{}",e)), -!r)throw t;W(t),s=l} -s.name||(s.name=e),i[e]=s,s.rawDefinition=t.bind(null,n),s.aliases&&v(s.aliases,{ -languageName:e})},unregisterLanguage:e=>{delete i[e] -;for(const t of Object.keys(s))s[t]===e&&delete s[t]}, -listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, -autoDetection:k,inherit:Q,addPlugin:e=>{(e=>{ -e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ -e["before:highlightBlock"](Object.assign({block:t.el},t)) -}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ -e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),o.push(e)}, -removePlugin:e=>{const t=o.indexOf(e);-1!==t&&o.splice(t,1)}}),n.debugMode=()=>{ -r=!1},n.safeMode=()=>{r=!0},n.versionString="11.10.0",n.regex={concat:h, -lookahead:g,either:f,optional:d,anyNumberOfTimes:u} -;for(const t in j)"object"==typeof j[t]&&e(j[t]);return Object.assign(n,j),n -},ne=te({});return ne.newInstance=()=>te({}),ne}() -;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `bash` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const s=e.regex,t={},n={begin:/\$\{/, -end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{ -className:"variable",variants:[{ -begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});const a={ -className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE] -},i=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),c={ -begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, -end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/, -contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const r={begin:/\$?\(\(/, -end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] -},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 -}),m={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, -contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ -name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, -keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], -literal:["true","false"], -built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] -},contains:[l,e.SHEBANG(),m,r,i,c,{match:/(\/[a-z._-]+)+/},o,{match:/\\"/},{ -className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}})() -;hljs.registerLanguage("bash",e)})();/*! `c` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,t=e.COMMENT("//","$",{ -contains:[{begin:/\\\n/}] -}),a="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",i="("+a+"|"+n.optional(s)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ -className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ -match:/\batomic_[a-z]{3,6}\b/}]},l={className:"string",variants:[{ -begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include" -},contains:[{begin:/\\\n/,relevance:0},e.inherit(l,{className:"string"}),{ -className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ -className:"title",begin:n.optional(s)+e.IDENT_RE,relevance:0 -},_=n.optional(s)+e.IDENT_RE+"\\s*\\(",u={ -keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], -type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"], -literal:"true false NULL", -built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" -},g=[c,r,t,e.C_BLOCK_COMMENT_MODE,o,l],m={variants:[{begin:/=/,end:/;/},{ -begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], -keywords:u,contains:g.concat([{begin:/\(/,end:/\)/,keywords:u, -contains:g.concat(["self"]),relevance:0}]),relevance:0},p={ -begin:"("+i+"[\\*&\\s]+)+"+_,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, -keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ -begin:_,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], -relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, -keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,l,o,r,{begin:/\(/, -end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,l,o,r] -}]},r,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, -disableAutodetect:!0,illegal:"=]/,contains:[{ -beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, -strings:l,keywords:u}}}})();hljs.registerLanguage("c",e)})();/*! `cpp` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const t=e.regex,a=e.COMMENT("//","$",{ -contains:[{begin:/\\\n/}] -}),n="decltype\\(auto\\)",r="[a-zA-Z_]\\w*::",i="(?!struct)("+n+"|"+t.optional(r)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={ -className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{ -begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{ -begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)" -},{ -begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)" -}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{ -className:"string",begin:/<.*?>/},a,e.C_BLOCK_COMMENT_MODE]},u={ -className:"title",begin:t.optional(r)+e.IDENT_RE,relevance:0 -},d=t.optional(r)+e.IDENT_RE+"\\s*\\(",p={ -type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], -keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], -literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], -_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] -},_={className:"function.dispatch",relevance:0,keywords:{ -_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] -}, -begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/)) -},m=[_,l,s,a,e.C_BLOCK_COMMENT_MODE,o,c],f={variants:[{begin:/=/,end:/;/},{ -begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], -keywords:p,contains:m.concat([{begin:/\(/,end:/\)/,keywords:p, -contains:m.concat(["self"]),relevance:0}]),relevance:0},g={className:"function", -begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, -keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:n,keywords:p,relevance:0},{ -begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{ -begin:/:/,endsWithParent:!0,contains:[c,o]},{relevance:0,match:/,/},{ -className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0, -contains:[a,e.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/,end:/\)/,keywords:p, -relevance:0,contains:["self",a,e.C_BLOCK_COMMENT_MODE,c,o,s]}] -},s,a,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", -aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"",keywords:p,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:p},{ -match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], -className:{1:"keyword",3:"title.class"}}])}}})();hljs.registerLanguage("cpp",e) -})();/*! `csharp` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const n={ -keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), -built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], -literal:["default","false","null","true"]},a=e.inherit(e.TITLE_MODE,{ -begin:"[a-zA-Z](\\.?\\w)*"}),i={className:"number",variants:[{ -begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] -},t=e.inherit(s,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/, -keywords:n},l=e.inherit(r,{illegal:/\n/}),c={className:"string",begin:/\$"/, -end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ -},e.BACKSLASH_ESCAPE,l]},o={className:"string",begin:/\$@"/,end:'"',contains:[{ -begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},d=e.inherit(o,{illegal:/\n/, -contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},l]}) -;r.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_BLOCK_COMMENT_MODE], -l.contains=[d,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.inherit(e.C_BLOCK_COMMENT_MODE,{ -illegal:/\n/})];const g={variants:[{className:"string", -begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1 -},o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">", -contains:[{beginKeywords:"in out"},a] -},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={ -begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], -keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, -contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ -begin:"\x3c!--|--\x3e"},{begin:""}]}] -}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", -end:"$",keywords:{ -keyword:"if else elif endif define undef warning error line region endregion pragma checksum" -}},g,i,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, -illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" -},a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", -relevance:0,end:/[{;=]/,illegal:/[^\s:]/, -contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, -contains:[a,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", -begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ -className:"string",begin:/"/,end:/"/}]},{ -beginKeywords:"new return throw await else",relevance:0},{className:"function", -begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, -end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ -beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", -relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, -contains:[e.TITLE_MODE,E],relevance:0},{match:/\(\)/},{className:"params", -begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, -contains:[g,i,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}})() -;hljs.registerLanguage("csharp",e)})();/*! `css` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],r=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),t=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),i=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),o=["accent-color","align-content","align-items","align-self","alignment-baseline","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-end-end-radius","border-end-start-radius","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","cx","cy","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","empty-cells","enable-background","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","flood-color","flood-opacity","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","inset","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","kerning","justify-content","justify-items","justify-self","left","letter-spacing","lighting-color","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","marker","marker-end","marker-mid","marker-start","mask","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","scale","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","speak","speak-as","src","tab-size","table-layout","text-anchor","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-offset","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","vector-effect","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index"].sort().reverse() -;return n=>{const a=n.regex,l=(e=>({IMPORTANT:{scope:"meta",begin:"!important"}, -BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number", -begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{ -className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{ -scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", -contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ -scope:"number", -begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} -}))(n),s=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", -case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, -classNameAliases:{keyframePosition:"selector-tag"},contains:[l.BLOCK_COMMENT,{ -begin:/-(webkit|moz|ms|o)-(?=[a-z])/},l.CSS_NUMBER_MODE,{ -className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{ -className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 -},l.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ -begin:":("+t.join("|")+")"},{begin:":(:)?("+i.join("|")+")"}]},l.CSS_VARIABLE,{ -className:"attribute",begin:"\\b("+o.join("|")+")\\b"},{begin:/:/,end:/[;}{]/, -contains:[l.BLOCK_COMMENT,l.HEXCOLOR,l.IMPORTANT,l.CSS_NUMBER_MODE,...s,{ -begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" -},contains:[...s,{className:"string",begin:/[^)]/,endsWithParent:!0, -excludeEnd:!0}]},l.FUNCTION_DISPATCH]},{begin:a.lookahead(/@/),end:"[{;]", -relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ -},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ -$pattern:/[a-z-]+/,keyword:"and or not only",attribute:r.join(" ")},contains:[{ -begin:/[a-z-]+(?=:)/,className:"attribute"},...s,l.CSS_NUMBER_MODE]}]},{ -className:"selector-tag",begin:"\\b("+e.join("|")+")\\b"}]}}})() -;hljs.registerLanguage("css",e)})();/*! `go` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const a={ -keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], -type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], -literal:["true","false","iota","nil"], -built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] -};return{name:"Go",aliases:["golang"],keywords:a,illegal:"{var e=(()=>{"use strict" -;var e="[0-9](_*[0-9])*",a=`\\.(${e})`,n="[0-9a-fA-F](_*[0-9a-fA-F])*",s={ -className:"number",variants:[{ -begin:`(\\b(${e})((${a})|\\.)?|(${a}))[eE][+-]?(${e})[fFdD]?\\b`},{ -begin:`\\b(${e})((${a})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${a})[fFdD]?\\b` -},{begin:`\\b(${e})[fFdD]\\b`},{ -begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?(${e})[fFdD]?\\b`},{ -begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};function t(e,a,n){return-1===n?"":e.replace(a,(s=>t(e,a,n-1)))} -return e=>{ -const a=e.regex,n="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",i=n+t("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),r={ -keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto"], -literal:["false","true","null"], -type:["char","boolean","long","float","int","byte","short","double"], -built_in:["super","this"]},l={className:"meta",begin:"@"+n,contains:[{ -begin:/\(/,end:/\)/,contains:["self"]}]},c={className:"params",begin:/\(/, -end:/\)/,keywords:r,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} -;return{name:"Java",aliases:["jsp"],keywords:r,illegal:/<\/|#/, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, -relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ -begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, -className:"string",contains:[e.BACKSLASH_ESCAPE] -},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ -match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{ -1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ -begin:[a.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type", -3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword", -3:"title.class"},contains:[c,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ -beginKeywords:"new throw return else",relevance:0},{ -begin:["(?:"+i+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ -2:"title.function"},keywords:r,contains:[{className:"params",begin:/\(/, -end:/\)/,keywords:r,relevance:0, -contains:[l,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,e.C_BLOCK_COMMENT_MODE] -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},s,l]}}})() -;hljs.registerLanguage("java",e)})();/*! `javascript` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s) -;return o=>{const l=o.regex,b=e,d={begin:/<[A-Za-z0-9\\._:-]+/, -end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ -const a=e[0].length+e.index,t=e.input[a] -;if("<"===t||","===t)return void n.ignoreMatch();let s -;">"===t&&(((e,{after:n})=>{const a="e+"\\s*\\(")), -l.concat("(?!",T.join("|"),")")),b,l.lookahead(/\s*\(/)), -className:"title.function",relevance:0};var T;const C={ -begin:l.concat(/\./,l.lookahead(l.concat(b,/(?![0-9A-Za-z$_(])/))),end:b, -excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={ -match:[/get|set/,/\s+/,b,/(?=\()/],className:{1:"keyword",3:"title.function"}, -contains:[{begin:/\(\)/},R] -},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={ -match:[/const|var|let/,/\s+/,b,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)], -keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]} -;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{ -PARAMS_CONTAINS:w,CLASS_REFERENCE:k},illegal:/#(?![$_A-z])/, -contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ -label:"use_strict",className:"meta",relevance:10, -begin:/^\s*['"]use (strict|asm)['"]/ -},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,h,N,_,f,p,{match:/\$\d+/},A,k,{ -className:"attr",begin:b+l.lookahead(":"),relevance:0},$,{ -begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", -keywords:"return throw case",relevance:0,contains:[p,o.REGEXP_MODE,{ -className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{ -className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{ -className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/, -excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0 -},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{ -match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:d.begin, -"on:begin":d.isTrulyOpeningTag,end:d.end}],subLanguage:"xml",contains:[{ -begin:d.begin,end:d.end,skip:!0,contains:["self"]}]}]},I,{ -beginKeywords:"while if switch catch for"},{ -begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:b, -className:"title.function"})]},{match:/\.\.\./,relevance:0},C,{match:"\\$"+b, -relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, -contains:[R]},x,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, -className:"variable.constant"},O,M,{match:/\$[(.]/}]}}})() -;hljs.registerLanguage("javascript",e)})();/*! `json` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const a=["true","false","null"],s={ -scope:"literal",beginKeywords:a.join(" ")};return{name:"JSON",aliases:["jsonc"], -keywords:{literal:a},contains:[{className:"attr", -begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/, -className:"punctuation",relevance:0 -},e.QUOTE_STRING_MODE,s,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], -illegal:"\\S"}}})();hljs.registerLanguage("json",e)})();/*! `kotlin` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict" -;var e="[0-9](_*[0-9])*",n=`\\.(${e})`,a="[0-9a-fA-F](_*[0-9a-fA-F])*",i={ -className:"number",variants:[{ -begin:`(\\b(${e})((${n})|\\.)?|(${n}))[eE][+-]?(${e})[fFdD]?\\b`},{ -begin:`\\b(${e})((${n})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${n})[fFdD]?\\b` -},{begin:`\\b(${e})[fFdD]\\b`},{ -begin:`\\b0[xX]((${a})\\.?|(${a})?\\.(${a}))[pP][+-]?(${e})[fFdD]?\\b`},{ -begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${a})[lL]?\\b`},{ -begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], -relevance:0};return e=>{const n={ -keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", -built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", -literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" -},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={ -className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", -variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'", -illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, -contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={ -className:"meta", -begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" -},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, -end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] -},o=i,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={ -variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, -contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d], -{name:"Kotlin",aliases:["kt","kts"],keywords:n, -contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", -begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,b,{className:"keyword", -begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", -begin:/@\w+/}]}},a,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$", -returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ -begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, -contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, -keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, -endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, -endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0 -},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{ -begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ -3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, -illegal:"extends implements",contains:[{ -beginKeywords:"public protected internal private constructor" -},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, -excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, -excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env", -end:"$",illegal:"\n"},o]}}})();hljs.registerLanguage("kotlin",e)})();/*! `markdown` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, -end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, -relevance:0},{ -begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, -relevance:2},{ -begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), -relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ -begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ -},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, -returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", -end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], -variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] -},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ -begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] -}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) -;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g) -})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ -className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{ -begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", -contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", -end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g, -end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ -begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ -begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", -contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ -begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ -className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ -className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal", -match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}})() -;hljs.registerLanguage("markdown",e)})();/*! `objectivec` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={ -$pattern:n,keyword:["@interface","@class","@protocol","@implementation"]} -;return{name:"Objective-C", -aliases:["mm","objc","obj-c","obj-c++","objective-c","objective-c++"],keywords:{ -"variable.language":["this","super"],$pattern:n, -keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], -literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], -built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], -type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] -},illegal:"/,end:/$/,illegal:"\\n" -},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", -begin:"("+_.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:_, -contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, -relevance:0}]}}})();hljs.registerLanguage("objectivec",e)})();/*! `php` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{ -const t=e.regex,a=/(?![A-Za-z0-9])(?![$])/,r=t.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,a),n=t.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,a),o={ -scope:"variable",match:"\\$+"+r},c={scope:"subst",variants:[{begin:/\$\w+/},{ -begin:/\{\$/,end:/\}/}]},i=e.inherit(e.APOS_STRING_MODE,{illegal:null -}),s="[ \t\n]",l={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ -illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(c)}),i,{ -begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, -contains:e.QUOTE_STRING_MODE.contains.concat(c),"on:begin":(e,t)=>{ -t.data._beginMatch=e[1]||e[2]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}},e.END_SAME_AS_BEGIN({ -begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ -begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ -begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ -begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" -}],relevance:0 -},_=["false","null","true"],p=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],E={ -keyword:p,literal:(e=>{const t=[];return e.forEach((e=>{ -t.push(e),e.toLowerCase()===e?t.push(e.toUpperCase()):t.push(e.toLowerCase()) -})),t})(_),built_in:b},u=e=>e.map((e=>e.replace(/\|\d+$/,""))),g={variants:[{ -match:[/new/,t.concat(s,"+"),t.concat("(?!",u(b).join("\\b|"),"\\b)"),n],scope:{ -1:"keyword",4:"title.class"}}]},h=t.concat(r,"\\b(?!\\()"),m={variants:[{ -match:[t.concat(/::/,t.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" -}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ -match:[n,t.concat(/::/,t.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", -3:"variable.constant"}},{match:[n,t.concat("::",t.lookahead(/(?!class\b)/))], -scope:{1:"title.class"}},{match:[n,/::/,/class/],scope:{1:"title.class", -3:"variable.language"}}]},I={scope:"attr", -match:t.concat(r,t.lookahead(":"),t.lookahead(/(?!::)/))},f={relevance:0, -begin:/\(/,end:/\)/,keywords:E,contains:[I,o,m,e.C_BLOCK_COMMENT_MODE,l,d,g] -},O={relevance:0, -match:[/\b/,t.concat("(?!fn\\b|function\\b|",u(p).join("\\b|"),"|",u(b).join("\\b|"),"\\b)"),r,t.concat(s,"*"),t.lookahead(/(?=\()/)], -scope:{3:"title.function.invoke"},contains:[f]};f.contains.push(O) -;const v=[I,m,e.C_BLOCK_COMMENT_MODE,l,d,g];return{case_insensitive:!1, -keywords:E,contains:[{begin:t.concat(/#\[\s*/,n),beginScope:"meta",end:/]/, -endScope:"meta",keywords:{literal:_,keyword:["new","array"]},contains:[{ -begin:/\[/,end:/]/,keywords:{literal:_,keyword:["new","array"]}, -contains:["self",...v]},...v,{scope:"meta",match:n}] -},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ -scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, -keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, -contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ -begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ -begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},o,O,m,{ -match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},g,{ -scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, -excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" -},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", -begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:E, -contains:["self",o,m,e.C_BLOCK_COMMENT_MODE,l,d]}]},{scope:"class",variants:[{ -beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", -illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ -beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, -contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ -beginKeywords:"use",relevance:0,end:";",contains:[{ -match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},l,d]} -}})();hljs.registerLanguage("php",e)})();/*! `plaintext` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text", -aliases:["text","txt"],disableAutodetect:!0})})() -;hljs.registerLanguage("plaintext",t)})();/*! `python` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{ -const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={ -$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s, -built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], -literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], -type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] -},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, -end:/\}/,keywords:t,illegal:/#/},l={begin:/\{\{/,relevance:0},o={ -className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, -contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ -begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, -end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([uU]|[rR])'/,end:/'/, -relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ -begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, -end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, -contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, -contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},b="[0-9](_?[0-9])*",c=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,d="\\b|"+s.join("|"),g={ -className:"number",relevance:0,variants:[{ -begin:`(\\b(${b})|(${c}))[eE][+-]?(${b})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ -begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ -begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` -},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${b})[jJ](?=${d})` -}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:t, -contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ -className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, -end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t, -contains:["self",i,g,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,g,i],{ -name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t, -illegal:/(<\/|\?)|=>/,contains:[i,g,{scope:"variable.language",match:/\bself\b/ -},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword" -},o,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword", -3:"title.function"},contains:[m]},{variants:[{ -match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], -scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ -className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,o]}]}}})() -;hljs.registerLanguage("python",e)})();/*! `ruby` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{ -const n=e.regex,a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",s=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(s,/(::\w+)*/),t={ -"variable.constant":["__FILE__","__LINE__","__ENCODING__"], -"variable.language":["self","super"], -keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], -built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], -literal:["true","false","nil"]},c={className:"doctag",begin:"@[A-Za-z]+"},r={ -begin:"#<",end:">"},b=[e.COMMENT("#","$",{contains:[c] -}),e.COMMENT("^=begin","^=end",{contains:[c],relevance:10 -}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],l={className:"subst",begin:/#\{/, -end:/\}/,keywords:t},d={className:"string",contains:[e.BACKSLASH_ESCAPE,l], -variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ -begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ -begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, -end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ -begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ -begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ -begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ -begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ -begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), -contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, -contains:[e.BACKSLASH_ESCAPE,l]})]}]},o="[0-9](_?[0-9])*",g={className:"number", -relevance:0,variants:[{ -begin:`\\b([1-9](_?[0-9])*|0)(\\.(${o}))?([eE][+-]?(${o})|r)?i?\\b`},{ -begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" -},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ -begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ -begin:"\\b0(_?[0-7])+r?i?\\b"}]},_={variants:[{match:/\(\)/},{ -className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, -keywords:t}]},u=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ -match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", -4:"title.class.inherited"},keywords:t},{match:[/(include|extend)\s+/,i],scope:{ -2:"title.class"},keywords:t},{relevance:0,match:[i,/\.new[. (]/],scope:{ -1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, -className:"variable.constant"},{relevance:0,match:s,scope:"title.class"},{ -match:[/def/,/\s+/,a],scope:{1:"keyword",3:"title.function"},contains:[_]},{ -begin:e.IDENT_RE+"::"},{className:"symbol", -begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", -begin:":(?!\\s)",contains:[d,{begin:a}],relevance:0},g,{className:"variable", -begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ -className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, -relevance:0,keywords:t},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", -keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,l], -illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ -begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", -end:"\\][a-z]*"}]}].concat(r,b),relevance:0}].concat(r,b) -;l.contains=u,_.contains=u;const m=[{begin:/^\s*=>/,starts:{end:"$",contains:u} -},{className:"meta.prompt", -begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", -starts:{end:"$",keywords:t,contains:u}}];return b.unshift(r),{name:"Ruby", -aliases:["rb","gemspec","podspec","thor","irb"],keywords:t,illegal:/\/\*/, -contains:[e.SHEBANG({binary:"ruby"})].concat(m).concat(b).concat(u)}}})() -;hljs.registerLanguage("ruby",e)})();/*! `rust` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{ -const t=e.regex,n=/(r#)?/,a=t.concat(n,e.UNDERSCORE_IDENT_RE),i=t.concat(n,e.IDENT_RE),r={ -className:"title.function.invoke",relevance:0, -begin:t.concat(/\b/,/(?!let|for|while|if|else|match\b)/,i,t.lookahead(/\s*\(/)) -},s="([ui](8|16|32|64|128|size)|f(32|64))?",l=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],o=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] -;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:o, -keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"], -literal:["true","false","Some","None","Ok","Err"],built_in:l},illegal:""},r]}}})() -;hljs.registerLanguage("rust",e)})();/*! `shell` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var s=(()=>{"use strict";return s=>({name:"Shell Session", -aliases:["console","shellsession"],contains:[{className:"meta.prompt", -begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, -subLanguage:"bash"}}]})})();hljs.registerLanguage("shell",s)})();/*! `sql` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{ -const r=e.regex,t=e.COMMENT("--","$"),n=["true","false","unknown"],a=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],i=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=i,c=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!i.includes(e))),l={ -begin:r.concat(/\b/,r.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} -;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ -$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:r,when:t}={})=>{const n=t -;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) -})(c,{when:e=>e.length<3}),literal:n,type:a, -built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] -},contains:[{begin:r.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, -keyword:c.concat(s),literal:n,type:a}},{className:"type", -begin:r.either("double precision","large object","with timezone","without timezone") -},l,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", -variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, -contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ -className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, -relevance:0}]}}})();hljs.registerLanguage("sql",e)})();/*! `swift` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return t("(?=",e,")")} -function t(...n){return n.map((n=>e(n))).join("")}function a(...n){const t=(e=>{ -const n=e[e.length-1] -;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} -})(n);return"("+(t.capture?"":"?:")+n.map((n=>e(n))).join("|")+")"} -const i=e=>t(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),c=["init","self"].map(i),u=["Any","Self"],o=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],r=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],p=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],d=a(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=a(d,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=t(d,F,"*"),h=a(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=a(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=t(h,f,"*"),g=t(/[A-Z]/,f,"*"),y=["attached","autoclosure",t(/convention\(/,a("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",t(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],v=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] -;return e=>{const d={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ -contains:["self"]}),E=[e.C_LINE_COMMENT_MODE,h],A={match:[/\./,a(...s,...c)], -className:{2:"keyword"}},C={match:t(/\./,a(...o)),relevance:0 -},k=o.filter((e=>"string"==typeof e)).concat(["_|0"]),N={variants:[{ -className:"keyword", -match:a(...o.filter((e=>"string"!=typeof e)).concat(u).map(i),...c)}]},S={ -$pattern:a(/\b\w+/,/#\w+/),keyword:k.concat(m),literal:r},B=[A,C,N],D=[{ -match:t(/\./,a(...p)),relevance:0},{className:"built_in", -match:t(/\b/,a(...p),/(?=\()/)}],_={match:/->/,relevance:0},M=[_,{ -className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] -}],x="([0-9]_*)+",L="([0-9a-fA-F]_*)+",$={className:"number",relevance:0, -variants:[{match:`\\b(${x})(\\.(${x}))?([eE][+-]?(${x}))?\\b`},{ -match:`\\b0x(${L})(\\.(${L}))?([pP][+-]?(${x}))?\\b`},{match:/\b0o([0-7]_*)+\b/ -},{match:/\b0b([01]_*)+\b/}]},I=(e="")=>({className:"subst",variants:[{ -match:t(/\\/,e,/[0\\tnr"']/)},{match:t(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] -}),O=(e="")=>({className:"subst",match:t(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) -}),P=(e="")=>({className:"subst",label:"interpol",begin:t(/\\/,e,/\(/),end:/\)/ -}),j=(e="")=>({begin:t(e,/"""/),end:t(/"""/,e),contains:[I(e),O(e),P(e)] -}),K=(e="")=>({begin:t(e,/"/),end:t(/"/,e),contains:[I(e),P(e)]}),T={ -className:"string", -variants:[j(),j("#"),j("##"),j("###"),K(),K("#"),K("##"),K("###")] -},q=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, -contains:[e.BACKSLASH_ESCAPE]}],U={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, -contains:q},z=e=>{const n=t(e,/\//),a=t(/\//,e);return{begin:n,end:a, -contains:[...q,{scope:"comment",begin:`#(?!.*${a})`,end:/$/}]}},V={ -scope:"regexp",variants:[z("###"),z("##"),z("#"),U]},W={match:t(/`/,w,/`/) -},Z=[W,{className:"variable",match:/\$\d+/},{className:"variable", -match:`\\$${f}+`}],G=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ -contains:[{begin:/\(/,end:/\)/,keywords:v,contains:[...M,$,T]}]}},{ -scope:"keyword",match:t(/@/,a(...y),n(a(/\(/,/\s+/)))},{scope:"meta", -match:t(/@/,w)}],H={match:n(/\b[A-Z]/),relevance:0,contains:[{className:"type", -match:t(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") -},{className:"type",match:g,relevance:0},{match:/[?!]+/,relevance:0},{ -match:/\.\.\./,relevance:0},{match:t(/\s+&\s+/,n(g)),relevance:0}]},R={ -begin://,keywords:S,contains:[...E,...B,...G,_,H]};H.contains.push(R) -;const X={begin:/\(/,end:/\)/,relevance:0,keywords:S,contains:["self",{ -match:t(w,/\s*:/),keywords:"_|0",relevance:0 -},...E,V,...B,...D,...M,$,T,...Z,...G,H]},J={begin://, -keywords:"repeat each",contains:[...E,H]},Q={begin:/\(/,end:/\)/,keywords:S, -contains:[{begin:a(n(t(w,/\s*:/)),n(t(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0, -contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:w}] -},...E,...B,...M,$,T,...G,H,X],endsParent:!0,illegal:/["']/},Y={ -match:[/(func|macro)/,/\s+/,a(W.match,w,b)],className:{1:"keyword", -3:"title.function"},contains:[J,Q,d],illegal:[/\[/,/%/]},ee={ -match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, -contains:[J,Q,d],illegal:/\[|%/},ne={match:[/operator/,/\s+/,b],className:{ -1:"keyword",3:"title"}},te={begin:[/precedencegroup/,/\s+/,g],className:{ -1:"keyword",3:"title"},contains:[H],keywords:[...l,...r],end:/}/},ae={ -begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,w,/\s*/], -beginScope:{1:"keyword",3:"title.class"},keywords:S,contains:[J,...B,{begin:/:/, -end:/\{/,keywords:S,contains:[{scope:"title.class.inherited",match:g},...B], -relevance:0}]};for(const e of T.variants){ -const n=e.contains.find((e=>"interpol"===e.label));n.keywords=S -;const t=[...B,...D,...M,$,T,...Z];n.contains=[...t,{begin:/\(/,end:/\)/, -contains:["self",...t]}]}return{name:"Swift",keywords:S, -contains:[...E,Y,ee,ae,ne,te,{beginKeywords:"import",end:/$/,contains:[...E], -relevance:0},V,...B,...D,...M,$,T,...Z,...G,H,X]}}})() -;hljs.registerLanguage("swift",e)})();/*! `typescript` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],i=[].concat(r,t,s) -;function o(o){const l=o.regex,d=e,b={begin:/<[A-Za-z0-9\\._:-]+/, -end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ -const a=e[0].length+e.index,t=e.input[a] -;if("<"===t||","===t)return void n.ignoreMatch();let s -;">"===t&&(((e,{after:n})=>{const a="e+"\\s*\\(")), -l.concat("(?!",C.join("|"),")")),d,l.lookahead(/\s*\(/)), -className:"title.function",relevance:0};var C;const T={ -begin:l.concat(/\./,l.lookahead(l.concat(d,/(?![0-9A-Za-z$_(])/))),end:d, -excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},M={ -match:[/get|set/,/\s+/,d,/(?=\()/],className:{1:"keyword",3:"title.function"}, -contains:[{begin:/\(\)/},R] -},B="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+o.UNDERSCORE_IDENT_RE+")\\s*=>",$={ -match:[/const|var|let/,/\s+/,d,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(B)], -keywords:"async",className:{1:"keyword",3:"title.function"},contains:[R]} -;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{ -PARAMS_CONTAINS:w,CLASS_REFERENCE:x},illegal:/#(?![$_A-z])/, -contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ -label:"use_strict",className:"meta",relevance:10, -begin:/^\s*['"]use (strict|asm)['"]/ -},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,p,N,f,_,h,{match:/\$\d+/},A,x,{ -className:"attr",begin:d+l.lookahead(":"),relevance:0},$,{ -begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", -keywords:"return throw case",relevance:0,contains:[h,o.REGEXP_MODE,{ -className:"function",begin:B,returnBegin:!0,end:"\\s*=>",contains:[{ -className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{ -className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/, -excludeBegin:!0,excludeEnd:!0,keywords:g,contains:w}]}]},{begin:/,/,relevance:0 -},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{ -match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:b.begin, -"on:begin":b.isTrulyOpeningTag,end:b.end}],subLanguage:"xml",contains:[{ -begin:b.begin,end:b.end,skip:!0,contains:["self"]}]}]},O,{ -beginKeywords:"while if switch catch for"},{ -begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,label:"func.def",contains:[R,o.inherit(o.TITLE_MODE,{begin:d, -className:"title.function"})]},{match:/\.\.\./,relevance:0},T,{match:"\\$"+d, -relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, -contains:[R]},I,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, -className:"variable.constant"},k,M,{match:/\$[(.]/}]}}return t=>{ -const s=o(t),r=e,l=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],d={ -begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"} -},b={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{ -keyword:"interface extends",built_in:l},contains:[s.exports.CLASS_REFERENCE] -},g={$pattern:e, -keyword:n.concat(["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"]), -literal:a,built_in:i.concat(l),"variable.language":c},u={className:"meta", -begin:"@"+r},m=(e,n,a)=>{const t=e.contains.findIndex((e=>e.label===n)) -;if(-1===t)throw Error("can not find mode to replace");e.contains.splice(t,1,a)} -;Object.assign(s.keywords,g),s.exports.PARAMS_CONTAINS.push(u) -;const E=s.contains.find((e=>"attr"===e.className)) -;return s.exports.PARAMS_CONTAINS.push([s.exports.CLASS_REFERENCE,E]), -s.contains=s.contains.concat([u,d,b]), -m(s,"shebang",t.SHEBANG()),m(s,"use_strict",{className:"meta",relevance:10, -begin:/^\s*['"]use strict['"]/ -}),s.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(s,{ -name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),s}})() -;hljs.registerLanguage("typescript",e)})();/*! `xml` grammar compiled for Highlight.js 11.10.0 */ -(()=>{var e=(()=>{"use strict";return e=>{ -const a=e.regex,n=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s={ -className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/, -contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] -},i=e.inherit(t,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{ -className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),r={ -endsWithParent:!0,illegal:/`]+/}]}]}]};return{ -name:"HTML, XML", -aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], -case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,l,c,i,{begin:/\[/,end:/\]/,contains:[{ -className:"meta",begin://,contains:[t,i,l,c]}]}] -},e.COMMENT(//,{relevance:10}),{begin://, -relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, -relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"style"},contains:[r],starts:{ -end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"script"},contains:[r],starts:{ -end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ -className:"tag",begin:/<>|<\/>/},{className:"tag", -begin:a.concat(//,/>/,/\s/)))), -end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:r}]},{ -className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(n,/>/))),contains:[{ -className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}} -})();hljs.registerLanguage("xml",e)})(); diff --git a/Sources/STMarkdown/Resources/mermaid.min.js b/Sources/STMarkdown/Resources/mermaid.min.js deleted file mode 100644 index 6d69387..0000000 --- a/Sources/STMarkdown/Resources/mermaid.min.js +++ /dev/null @@ -1,3022 +0,0 @@ -"use strict";var __esbuild_esm_mermaid_nm;(__esbuild_esm_mermaid_nm||={}).mermaid=(()=>{var BAe=Object.create;var u2=Object.defineProperty;var FAe=Object.getOwnPropertyDescriptor;var $Ae=Object.getOwnPropertyNames;var zAe=Object.getPrototypeOf,GAe=Object.prototype.hasOwnProperty;var o=(t,e)=>u2(t,"name",{value:e,configurable:!0});var O=(t,e)=>()=>(t&&(e=t(t=0)),e);var nr=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),vr=(t,e)=>{for(var r in e)u2(t,r,{get:e[r],enumerable:!0})},z3=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of $Ae(e))!GAe.call(t,i)&&i!==r&&u2(t,i,{get:()=>e[i],enumerable:!(n=FAe(e,i))||n.enumerable});return t},jr=(t,e,r)=>(z3(t,e,"default"),r&&z3(r,e,"default")),Ra=(t,e,r)=>(r=t!=null?BAe(zAe(t)):{},z3(e||!t||!t.__esModule?u2(r,"default",{value:t,enumerable:!0}):r,t)),G3=t=>z3(u2({},"__esModule",{value:!0}),t);var VAe,ag,W_,uH,V3=O(()=>{"use strict";VAe=Object.freeze({left:0,top:0,width:16,height:16}),ag=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),W_=Object.freeze({...VAe,...ag}),uH=Object.freeze({...W_,body:"",hidden:!1})});var qAe,hH,fH=O(()=>{"use strict";V3();qAe=Object.freeze({width:null,height:null}),hH=Object.freeze({...qAe,...ag})});var H_,q3,dH=O(()=>{"use strict";H_=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!q3(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!q3(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!q3(l,r)?null:l}return null},"stringToIcon"),q3=o((t,e)=>t?!!((e&&t.prefix===""||t.prefix)&&t.name):!1,"validateIconName")});function pH(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var mH=O(()=>{"use strict";o(pH,"mergeIconTransformations")});function Y_(t,e){let r=pH(t,e);for(let n in uH)n in ag?n in t&&!(n in r)&&(r[n]=ag[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var gH=O(()=>{"use strict";V3();mH();o(Y_,"mergeIconData")});function yH(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var vH=O(()=>{"use strict";o(yH,"getIconsTree")});function xH(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=Y_(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),Y_(t,a)}function j_(t,e){if(t.icons[e])return xH(t,e,[]);let r=yH(t,[e])[e];return r?xH(t,e,r):null}var bH=O(()=>{"use strict";gH();vH();o(xH,"internalGetIconData");o(j_,"getIconData")});function X_(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(UAe);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=WAe.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var UAe,WAe,TH=O(()=>{"use strict";UAe=/(-?[0-9.]*[0-9]+[0-9.]*)/g,WAe=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(X_,"calculateSize")});function HAe(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function YAe(t,e){return t?""+t+""+e:e}function wH(t,e,r){let n=HAe(t);return YAe(n.defs,e+n.content+r)}var kH=O(()=>{"use strict";o(HAe,"splitSVGDefs");o(YAe,"mergeDefsAndContent");o(wH,"wrapSVGContent")});function K_(t,e){let r={...W_,...t},n={...hH,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,T=y.rotate;x?b?T+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let E;switch(T<0&&(T-=Math.floor(T/4)*4),T=T%4,T){case 1:E=i.height/2+i.top,v.unshift("rotate(90 "+E.toString()+" "+E.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:E=i.width/2+i.left,v.unshift("rotate(-90 "+E.toString()+" "+E.toString()+")");break}T%2===1&&(i.left!==i.top&&(E=i.left,i.left=i.top,i.top=E),i.width!==i.height&&(E=i.width,i.width=i.height,i.height=E)),v.length&&(a=wH(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=X_(d,u/h)):(f=s==="auto"?u:s,d=l===null?X_(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{jAe(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var jAe,EH=O(()=>{"use strict";V3();fH();TH();kH();jAe=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(K_,"iconToSVG")});function Q_(t,e=KAe){let r=[],n;for(;n=XAe.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(QAe++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var XAe,KAe,QAe,SH=O(()=>{"use strict";XAe=/\sid="(\S+)"/g,KAe="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),QAe=0;o(Q_,"replaceIDs")});function Z_(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var CH=O(()=>{"use strict";o(Z_,"iconToHTML")});var AH=O(()=>{"use strict";dH();bH();EH();SH();CH()});var J_,Vn,sg=O(()=>{"use strict";J_=o((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>J_(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&e[a]!==null&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=J_(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Vn=J_});var U3=nr((e8,t8)=>{"use strict";(function(t,e){typeof e8=="object"&&typeof t8<"u"?t8.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(e8,(function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(C){var _=["th","st","nd","rd"],D=C%100;return"["+C+(_[(D-20)%10]||_[D]||_[0])+"]"},"ordinal")},x=o(function(C,_,D){var M=String(C);return!M||M.length>=_?C:""+Array(_+1-M.length).join(D)+C},"m"),b={s:x,z:o(function(C){var _=-C.utcOffset(),D=Math.abs(_),M=Math.floor(D/60),R=D%60;return(_<=0?"+":"-")+x(M,2,"0")+":"+x(R,2,"0")},"z"),m:o(function C(_,D){if(_.date()1)return C(B[0])}else{var F=_.name;E[F]=_,R=F}return!M&&R&&(T=R),R||!M&&T},"t"),A=o(function(C,_){if(k(C))return C.clone();var D=typeof _=="object"?_:{};return D.date=C,D.args=arguments,new I(D)},"O"),L=b;L.l=S,L.i=k,L.w=function(C,_){return A(C,{locale:_.$L,utc:_.$u,x:_.$x,$offset:_.$offset})};var I=(function(){function C(D){this.$L=S(D.locale,null,!0),this.parse(D),this.$x=this.$x||D.x||{},this[w]=!0}o(C,"M");var _=C.prototype;return _.parse=function(D){this.$d=(function(M){var R=M.date,P=M.utc;if(R===null)return new Date(NaN);if(L.u(R))return new Date;if(R instanceof Date)return new Date(R);if(typeof R=="string"&&!/Z$/i.test(R)){var B=R.match(g);if(B){var F=B[2]-1||0,G=(B[7]||"0").substring(0,3);return P?new Date(Date.UTC(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,G)):new Date(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,G)}}return new Date(R)})(D),this.init()},_.init=function(){var D=this.$d;this.$y=D.getFullYear(),this.$M=D.getMonth(),this.$D=D.getDate(),this.$W=D.getDay(),this.$H=D.getHours(),this.$m=D.getMinutes(),this.$s=D.getSeconds(),this.$ms=D.getMilliseconds()},_.$utils=function(){return L},_.isValid=function(){return this.$d.toString()!==m},_.isSame=function(D,M){var R=A(D);return this.startOf(M)<=R&&R<=this.endOf(M)},_.isAfter=function(D,M){return A(D){"use strict";_H=Ra(U3(),1),eh={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},K={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},h2=o(function(t="fatal"){let e=eh.fatal;typeof t=="string"?t.toLowerCase()in eh&&(e=eh[t]):typeof t=="number"&&(e=t),K.trace=()=>{},K.debug=()=>{},K.info=()=>{},K.warn=()=>{},K.error=()=>{},K.fatal=()=>{},e<=eh.fatal&&(K.fatal=console.error?console.error.bind(console,cl("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",cl("FATAL"))),e<=eh.error&&(K.error=console.error?console.error.bind(console,cl("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",cl("ERROR"))),e<=eh.warn&&(K.warn=console.warn?console.warn.bind(console,cl("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",cl("WARN"))),e<=eh.info&&(K.info=console.info?console.info.bind(console,cl("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",cl("INFO"))),e<=eh.debug&&(K.debug=console.debug?console.debug.bind(console,cl("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",cl("DEBUG"))),e<=eh.trace&&(K.trace=console.debug?console.debug.bind(console,cl("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",cl("TRACE")))},"setLogLevel"),cl=o(t=>`%c${(0,_H.default)().format("ss.SSS")} : ${t} : `,"format")});var W3,DH,RH=O(()=>{"use strict";W3={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:o(t=>t>=255?255:t<0?0:t,"r"),g:o(t=>t>=255?255:t<0?0:t,"g"),b:o(t=>t>=255?255:t<0?0:t,"b"),h:o(t=>t%360,"h"),s:o(t=>t>=100?100:t<0?0:t,"s"),l:o(t=>t>=100?100:t<0?0:t,"l"),a:o(t=>t>=1?1:t<0?0:t,"a")},toLinear:o(t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},"toLinear"),hue2rgb:o((t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<.16666666666666666?t+(e-t)*6*r:r<.5?e:r<.6666666666666666?t+(e-t)*(.6666666666666666-r)*6:t),"hue2rgb"),hsl2rgb:o(({h:t,s:e,l:r},n)=>{if(!e)return r*2.55;t/=360,e/=100,r/=100;let i=r<.5?r*(1+e):r+e-r*e,a=2*r-i;switch(n){case"r":return W3.hue2rgb(a,i,t+.3333333333333333)*255;case"g":return W3.hue2rgb(a,i,t)*255;case"b":return W3.hue2rgb(a,i,t-.3333333333333333)*255}},"hsl2rgb"),rgb2hsl:o(({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;let i=Math.max(t,e,r),a=Math.min(t,e,r),s=(i+a)/2;if(n==="l")return s*100;if(i===a)return 0;let l=i-a,u=s>.5?l/(2-i-a):l/(i+a);if(n==="s")return u*100;switch(i){case t:return((e-r)/l+(e{"use strict";ZAe={clamp:o((t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),"clamp"),round:o(t=>Math.round(t*1e10)/1e10,"round")},LH=ZAe});var JAe,MH,IH=O(()=>{"use strict";JAe={dec2hex:o(t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`},"dec2hex")},MH=JAe});var e7e,ir,$c=O(()=>{"use strict";RH();NH();IH();e7e={channel:DH,lang:LH,unit:MH},ir=e7e});var th,Qi,f2=O(()=>{"use strict";$c();th={};for(let t=0;t<=255;t++)th[t]=ir.unit.dec2hex(t);Qi={ALL:0,RGB:1,HSL:2}});var r8,OH,PH=O(()=>{"use strict";f2();r8=class{static{o(this,"Type")}constructor(){this.type=Qi.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Qi.ALL}is(e){return this.type===e}},OH=r8});var n8,BH,FH=O(()=>{"use strict";$c();PH();f2();n8=class{static{o(this,"Channels")}constructor(e,r){this.color=r,this.changed=!1,this.data=e,this.type=new OH}set(e,r){return this.color=r,this.changed=!1,this.data=e,this.type.type=Qi.ALL,this}_ensureHSL(){let e=this.data,{h:r,s:n,l:i}=e;r===void 0&&(e.h=ir.channel.rgb2hsl(e,"h")),n===void 0&&(e.s=ir.channel.rgb2hsl(e,"s")),i===void 0&&(e.l=ir.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r,g:n,b:i}=e;r===void 0&&(e.r=ir.channel.hsl2rgb(e,"r")),n===void 0&&(e.g=ir.channel.hsl2rgb(e,"g")),i===void 0&&(e.b=ir.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,r=e.r;return!this.type.is(Qi.HSL)&&r!==void 0?r:(this._ensureHSL(),ir.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,r=e.g;return!this.type.is(Qi.HSL)&&r!==void 0?r:(this._ensureHSL(),ir.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,r=e.b;return!this.type.is(Qi.HSL)&&r!==void 0?r:(this._ensureHSL(),ir.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,r=e.h;return!this.type.is(Qi.RGB)&&r!==void 0?r:(this._ensureRGB(),ir.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,r=e.s;return!this.type.is(Qi.RGB)&&r!==void 0?r:(this._ensureRGB(),ir.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,r=e.l;return!this.type.is(Qi.RGB)&&r!==void 0?r:(this._ensureRGB(),ir.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(Qi.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Qi.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Qi.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Qi.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Qi.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Qi.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},BH=n8});var t7e,pf,d2=O(()=>{"use strict";FH();t7e=new BH({r:0,g:0,b:0,a:0},"transparent"),pf=t7e});var $H,Ap,i8=O(()=>{"use strict";d2();f2();$H={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:o(t=>{if(t.charCodeAt(0)!==35)return;let e=t.match($H.re);if(!e)return;let r=e[1],n=parseInt(r,16),i=r.length,a=i%4===0,s=i>4,l=s?1:17,u=s?8:4,h=a?0:-1,f=s?255:15;return pf.set({r:(n>>u*(h+3)&f)*l,g:(n>>u*(h+2)&f)*l,b:(n>>u*(h+1)&f)*l,a:a?(n&f)*l/255:1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`#${th[Math.round(e)]}${th[Math.round(r)]}${th[Math.round(n)]}${th[Math.round(i*255)]}`:`#${th[Math.round(e)]}${th[Math.round(r)]}${th[Math.round(n)]}`},"stringify")},Ap=$H});var H3,p2,zH=O(()=>{"use strict";$c();d2();H3={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:o(t=>{let e=t.match(H3.hueRe);if(e){let[,r,n]=e;switch(n){case"grad":return ir.channel.clamp.h(parseFloat(r)*.9);case"rad":return ir.channel.clamp.h(parseFloat(r)*180/Math.PI);case"turn":return ir.channel.clamp.h(parseFloat(r)*360)}}return ir.channel.clamp.h(parseFloat(t))},"_hue2deg"),parse:o(t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let r=t.match(H3.re);if(!r)return;let[,n,i,a,s,l]=r;return pf.set({h:H3._hue2deg(n),s:ir.channel.clamp.s(parseFloat(i)),l:ir.channel.clamp.l(parseFloat(a)),a:s?ir.channel.clamp.a(l?parseFloat(s)/100:parseFloat(s)):1},t)},"parse"),stringify:o(t=>{let{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${ir.lang.round(e)}, ${ir.lang.round(r)}%, ${ir.lang.round(n)}%, ${i})`:`hsl(${ir.lang.round(e)}, ${ir.lang.round(r)}%, ${ir.lang.round(n)}%)`},"stringify")},p2=H3});var Y3,a8,GH=O(()=>{"use strict";i8();Y3={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:o(t=>{t=t.toLowerCase();let e=Y3.colors[t];if(e)return Ap.parse(e)},"parse"),stringify:o(t=>{let e=Ap.stringify(t);for(let r in Y3.colors)if(Y3.colors[r]===e)return r},"stringify")},a8=Y3});var VH,m2,qH=O(()=>{"use strict";$c();d2();VH={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:o(t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let r=t.match(VH.re);if(!r)return;let[,n,i,a,s,l,u,h,f]=r;return pf.set({r:ir.channel.clamp.r(i?parseFloat(n)*2.55:parseFloat(n)),g:ir.channel.clamp.g(s?parseFloat(a)*2.55:parseFloat(a)),b:ir.channel.clamp.b(u?parseFloat(l)*2.55:parseFloat(l)),a:h?ir.channel.clamp.a(f?parseFloat(h)/100:parseFloat(h)):1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${ir.lang.round(e)}, ${ir.lang.round(r)}, ${ir.lang.round(n)}, ${ir.lang.round(i)})`:`rgb(${ir.lang.round(e)}, ${ir.lang.round(r)}, ${ir.lang.round(n)})`},"stringify")},m2=VH});var r7e,Zi,rh=O(()=>{"use strict";i8();zH();GH();qH();f2();r7e={format:{keyword:a8,hex:Ap,rgb:m2,rgba:m2,hsl:p2,hsla:p2},parse:o(t=>{if(typeof t!="string")return t;let e=Ap.parse(t)||m2.parse(t)||p2.parse(t)||a8.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},"parse"),stringify:o(t=>!t.changed&&t.color?t.color:t.type.is(Qi.HSL)||t.data.r===void 0?p2.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?m2.stringify(t):Ap.stringify(t),"stringify")},Zi=r7e});var n7e,j3,s8=O(()=>{"use strict";$c();rh();n7e=o((t,e)=>{let r=Zi.parse(t);for(let n in e)r[n]=ir.channel.clamp[n](e[n]);return Zi.stringify(r)},"change"),j3=n7e});var i7e,bs,o8=O(()=>{"use strict";$c();d2();rh();s8();i7e=o((t,e,r=0,n=1)=>{if(typeof t!="number")return j3(t,{a:e});let i=pf.set({r:ir.channel.clamp.r(t),g:ir.channel.clamp.g(e),b:ir.channel.clamp.b(r),a:ir.channel.clamp.a(n)});return Zi.stringify(i)},"rgba"),bs=i7e});var a7e,_p,UH=O(()=>{"use strict";$c();rh();a7e=o((t,e)=>ir.lang.round(Zi.parse(t)[e]),"channel"),_p=a7e});var s7e,WH,HH=O(()=>{"use strict";$c();rh();s7e=o(t=>{let{r:e,g:r,b:n}=Zi.parse(t),i=.2126*ir.channel.toLinear(e)+.7152*ir.channel.toLinear(r)+.0722*ir.channel.toLinear(n);return ir.lang.round(i)},"luminance"),WH=s7e});var o7e,YH,jH=O(()=>{"use strict";HH();o7e=o(t=>WH(t)>=.5,"isLight"),YH=o7e});var l7e,Ji,XH=O(()=>{"use strict";jH();l7e=o(t=>!YH(t),"isDark"),Ji=l7e});var c7e,og,X3=O(()=>{"use strict";$c();rh();c7e=o((t,e,r)=>{let n=Zi.parse(t),i=n[e],a=ir.channel.clamp[e](i+r);return i!==a&&(n[e]=a),Zi.stringify(n)},"adjustChannel"),og=c7e});var u7e,Lt,KH=O(()=>{"use strict";X3();u7e=o((t,e)=>og(t,"l",e),"lighten"),Lt=u7e});var h7e,Bt,QH=O(()=>{"use strict";X3();h7e=o((t,e)=>og(t,"l",-e),"darken"),Bt=h7e});var f7e,K3,ZH=O(()=>{"use strict";X3();f7e=o((t,e)=>og(t,"a",-e),"transparentize"),K3=f7e});var d7e,Fe,JH=O(()=>{"use strict";rh();s8();d7e=o((t,e)=>{let r=Zi.parse(t),n={};for(let i in e)e[i]&&(n[i]=r[i]+e[i]);return j3(t,n)},"adjust"),Fe=d7e});var p7e,eY,tY=O(()=>{"use strict";rh();o8();p7e=o((t,e,r=50)=>{let{r:n,g:i,b:a,a:s}=Zi.parse(t),{r:l,g:u,b:h,a:f}=Zi.parse(e),d=r/100,p=d*2-1,m=s-f,y=((p*m===-1?p:(p+m)/(1+p*m))+1)/2,v=1-y,x=n*y+l*v,b=i*y+u*v,T=a*y+h*v,E=s*d+f*(1-d);return bs(x,b,T,E)},"mix"),eY=p7e});var m7e,At,rY=O(()=>{"use strict";rh();tY();m7e=o((t,e=100)=>{let r=Zi.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,eY(r,t,e)},"invert"),At=m7e});var nY=O(()=>{"use strict";o8();UH();XH();KH();QH();ZH();JH();rY()});var Ys=O(()=>{"use strict";nY()});var mf,gf,g2=O(()=>{"use strict";mf="#ffffff",gf="#f2f2f2"});var zi,lg=O(()=>{"use strict";Ys();zi=o((t,e)=>e?Fe(t,{s:-40,l:10}):Fe(t,{s:-40,l:-10}),"mkBorder")});var c8,iY,aY=O(()=>{"use strict";Ys();g2();lg();c8=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Fe(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Fe(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||zi(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||zi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||zi(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||zi(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||At(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||At(this.tertiaryColor),this.lineColor=this.lineColor||At(this.background),this.arrowheadColor=this.arrowheadColor||At(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?Bt(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||Bt(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||At(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||Lt(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||Bt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Bt(this.mainBkg,10)):(this.rowOdd=this.rowOdd||Lt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||Lt(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Fe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Fe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Fe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Fe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Fe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Fe(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Fe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Fe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Fe(this.primaryColor,{h:330}),this.darkMode)for(let r=0;r{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},iY=o(t=>{let e=new c8;return e.calculate(t),e},"getThemeVariables")});var u8,sY,oY=O(()=>{"use strict";Ys();lg();u8=class{static{o(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=Lt(this.primaryColor,16),this.tertiaryColor=Fe(this.primaryColor,{h:-160}),this.primaryBorderColor=At(this.background),this.secondaryBorderColor=zi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=zi(this.tertiaryColor,this.darkMode),this.primaryTextColor=At(this.primaryColor),this.secondaryTextColor=At(this.secondaryColor),this.tertiaryTextColor=At(this.tertiaryColor),this.lineColor=At(this.background),this.textColor=At(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=Lt(At("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=bs(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=Bt("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=Bt(this.sectionBkgColor,10),this.taskBorderColor=bs(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=bs(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Lt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Bt(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=Lt(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=Lt(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=Lt(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=At(this.doneTaskBkgColor),this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Fe(this.primaryColor,{h:64}),this.fillType3=Fe(this.secondaryColor,{h:64}),this.fillType4=Fe(this.primaryColor,{h:-64}),this.fillType5=Fe(this.secondaryColor,{h:-64}),this.fillType6=Fe(this.primaryColor,{h:128}),this.fillType7=Fe(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Fe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Fe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Fe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Fe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Fe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Fe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Fe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Fe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Fe(this.primaryColor,{h:330});for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},sY=o(t=>{let e=new u8;return e.calculate(t),e},"getThemeVariables")});var h8,yf,y2=O(()=>{"use strict";Ys();lg();g2();h8=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Fe(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Fe(this.primaryColor,{h:-160}),this.primaryBorderColor=zi(this.primaryColor,this.darkMode),this.secondaryBorderColor=zi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=zi(this.tertiaryColor,this.darkMode),this.primaryTextColor=At(this.primaryColor),this.secondaryTextColor=At(this.secondaryColor),this.tertiaryTextColor=At(this.tertiaryColor),this.lineColor=At(this.background),this.textColor=At(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=bs(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Fe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Fe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Fe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Fe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Fe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Fe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Fe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Fe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Fe(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Bt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Bt(this.tertiaryColor,40);for(let e=0;e{this[n]==="calculated"&&(this[n]=void 0)}),typeof e!="object"){this.updateColors();return}let r=Object.keys(e);r.forEach(n=>{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},yf=o(t=>{let e=new h8;return e.calculate(t),e},"getThemeVariables")});var f8,lY,cY=O(()=>{"use strict";Ys();g2();lg();f8=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=Lt("#cde498",10),this.primaryBorderColor=zi(this.primaryColor,this.darkMode),this.secondaryBorderColor=zi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=zi(this.tertiaryColor,this.darkMode),this.primaryTextColor=At(this.primaryColor),this.secondaryTextColor=At(this.secondaryColor),this.tertiaryTextColor=At(this.primaryColor),this.lineColor=At(this.background),this.textColor=At(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=Bt(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Fe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Fe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Fe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Fe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Fe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Fe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Fe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Fe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Fe(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Bt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Bt(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},lY=o(t=>{let e=new f8;return e.calculate(t),e},"getThemeVariables")});var d8,uY,hY=O(()=>{"use strict";Ys();lg();g2();d8=class{static{o(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=Lt(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Fe(this.primaryColor,{h:-160}),this.primaryBorderColor=zi(this.primaryColor,this.darkMode),this.secondaryBorderColor=zi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=zi(this.tertiaryColor,this.darkMode),this.primaryTextColor=At(this.primaryColor),this.secondaryTextColor=At(this.secondaryColor),this.tertiaryTextColor=At(this.tertiaryColor),this.lineColor=At(this.background),this.textColor=At(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Lt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=Lt(this.contrast,55),this.border2=this.contrast,this.actorBorder=Lt(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},uY=o(t=>{let e=new d8;return e.calculate(t),e},"getThemeVariables")});var ul,Q3=O(()=>{"use strict";aY();oY();y2();cY();hY();ul={base:{getThemeVariables:iY},dark:{getThemeVariables:sY},default:{getThemeVariables:yf},forest:{getThemeVariables:lY},neutral:{getThemeVariables:uY}}});var Oo,fY=O(()=>{"use strict";Oo={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:null,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200,layoutAlgorithm:"cose-bilkent"},ishikawa:{useMaxWidth:!0,diagramPadding:20},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},venn:{useMaxWidth:!0,width:800,height:450,padding:8,useDebugLayout:!1},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}});var dY,pY,mY,gr,La=O(()=>{"use strict";Q3();fY();dY={...Oo,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF",forceNodeModelOrder:!1,considerModelOrder:"NODES_AND_EDGES"},themeCSS:void 0,themeVariables:ul.default.getThemeVariables(),sequence:{...Oo.sequence,messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:o(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:o(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...Oo.gantt,tickInterval:void 0,useWidth:void 0},c4:{...Oo.c4,useWidth:void 0,personFont:o(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:{...Oo.flowchart,inheritDir:!1},external_personFont:o(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:o(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:o(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:o(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:o(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:o(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:o(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:o(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:o(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:o(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:o(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:o(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:o(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:o(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:o(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:o(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:o(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:o(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:o(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:o(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...Oo.pie,useWidth:984},xyChart:{...Oo.xyChart,useWidth:void 0},requirement:{...Oo.requirement,useWidth:void 0},packet:{...Oo.packet},radar:{...Oo.radar},ishikawa:{...Oo.ishikawa},treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","},venn:{...Oo.venn}},pY=o((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...pY(t[n],"")]:[...r,e+n],[]),"keyify"),mY=new Set(pY(dY,"")),gr=dY});var cg,g7e,p8=O(()=>{"use strict";La();xt();cg=o(t=>{if(K.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>cg(e));return}for(let e of Object.keys(t)){if(K.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!mY.has(e)||t[e]==null){K.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){K.debug("sanitizing object",e),cg(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(K.debug("sanitizing css option",e),t[e]=g7e(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}K.debug("After sanitization",t)}},"sanitizeDirective"),g7e=o(t=>{let e=0,r=0;for(let n of t){if(e{"use strict";sg();xt();Q3();La();p8();vf=Object.freeze(gr),Xs=o(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),js=Vn({},vf),Dp=[],v2=Vn({},vf),J3=o((t,e)=>{let r=Vn({},t),n={};for(let i of e)xY(i),n=Vn(n,i);if(r=Vn(r,n),n.theme&&n.theme in ul){let i=Vn({},Z3),a=Vn(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in ul&&(r.themeVariables=ul[r.theme].getThemeVariables(a))}return v2=r,wY(v2),v2},"updateCurrentConfig"),m8=o(t=>(js=Vn({},vf),js=Vn(js,t),t.theme&&ul[t.theme]&&(js.themeVariables=ul[t.theme].getThemeVariables(t.themeVariables)),J3(js,Dp),js),"setSiteConfig"),yY=o(t=>{Z3=Vn({},t)},"saveConfigFromInitialize"),vY=o(t=>(js=Vn(js,t),J3(js,Dp),js),"updateSiteConfig"),g8=o(()=>Vn({},js),"getSiteConfig"),ew=o(t=>(wY(t),Vn(v2,t),Zt()),"setConfig"),Zt=o(()=>Vn({},v2),"getConfig"),xY=o(t=>{t&&(["secure",...js.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(K.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&xY(t[e])}))},"sanitize"),bY=o(t=>{cg(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),Dp.push(t),J3(js,Dp)},"addDirective"),x2=o((t=js)=>{Dp=[],J3(t,Dp)},"reset"),y7e={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",FLOWCHART_HTML_LABELS_DEPRECATED:"flowchart.htmlLabels is deprecated. Please use global htmlLabels instead."},gY={},TY=o(t=>{gY[t]||(K.warn(y7e[t]),gY[t]=!0)},"issueWarning"),wY=o(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&TY("LAZY_LOAD_DEPRECATED")},"checkConfig"),kY=o(()=>{let t={};Z3&&(t=Vn(t,Z3));for(let e of Dp)t=Vn(t,e);return t},"getUserDefinedConfig"),Sr=o(t=>(t.flowchart?.htmlLabels!=null&&TY("FLOWCHART_HTML_LABELS_DEPRECATED"),Xs(t.htmlLabels??t.flowchart?.htmlLabels??!0)),"getEffectiveHtmlLabels")});function ks(t){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:nw;EY&&EY(t,null);let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){let a=r(i);a!==i&&(v7e(e)||(e[n]=a),i=a)}t[i]=!0}return t}function C7e(t){for(let e=0;e0&&arguments[0]!==void 0?arguments[0]:B7e(),e=o(mt=>OY(mt),"DOMPurify");if(e.version="3.3.1",e.removed=[],!t||!t.document||t.document.nodeType!==E2.document||!t.Element)return e.isSupported=!1,e;let{document:r}=t,n=r,i=n.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:l,Element:u,NodeFilter:h,NamedNodeMap:f=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:d,DOMParser:p,trustedTypes:m}=t,g=u.prototype,y=k2(g,"cloneNode"),v=k2(g,"remove"),x=k2(g,"nextSibling"),b=k2(g,"childNodes"),T=k2(g,"parentNode");if(typeof s=="function"){let mt=r.createElement("template");mt.content&&mt.content.ownerDocument&&(r=mt.content.ownerDocument)}let E,w="",{implementation:k,createNodeIterator:S,createDocumentFragment:A,getElementsByTagName:L}=r,{importNode:I}=n,N=LY();e.isSupported=typeof NY=="function"&&typeof T=="function"&&k&&k.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:C,ERB_EXPR:_,TMPLIT_EXPR:D,DATA_ATTR:M,ARIA_ATTR:R,IS_SCRIPT_OR_DATA:P,ATTR_WHITESPACE:B,CUSTOM_ELEMENT:F}=RY,{IS_ALLOWED_URI:G}=RY,$=null,V=Xr({},[...CY,...x8,...b8,...T8,...AY]),X=null,Q=Xr({},[..._Y,...w8,...DY,...rw]),H=Object.seal(k8(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ie=null,Y=null,le=Object.seal(k8(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),ee=!0,J=!0,te=!1,Z=!0,xe=!1,de=!0,Se=!1,Me=!1,ke=!1,we=!1,_e=!1,$e=!1,fe=!0,Ke=!1,Te="user-content-",Be=!0,Ue=!1,Ge={},Ne=null,We=Xr({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),j=null,ae=Xr({},["audio","video","img","source","image","track"]),U=null,ce=Xr({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),z="http://www.w3.org/1998/Math/MathML",ne="http://www.w3.org/2000/svg",se="http://www.w3.org/1999/xhtml",be=se,pe=!1,me=null,Re=Xr({},[z,ne,se],y8),ge=Xr({},["mi","mo","mn","ms","mtext"]),Ie=Xr({},["annotation-xml"]),qe=Xr({},["title","style","font","a","script"]),Pe=null,Xe=["application/xhtml+xml","text/html"],oe="text/html",et=null,he=null,ot=r.createElement("form"),Dt=o(function(Le){return Le instanceof RegExp||Le instanceof Function},"isRegexOrFunction"),It=o(function(){let Le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(he&&he===Le)){if((!Le||typeof Le!="object")&&(Le={}),Le=zc(Le),Pe=Xe.indexOf(Le.PARSER_MEDIA_TYPE)===-1?oe:Le.PARSER_MEDIA_TYPE,et=Pe==="application/xhtml+xml"?y8:nw,$=Kl(Le,"ALLOWED_TAGS")?Xr({},Le.ALLOWED_TAGS,et):V,X=Kl(Le,"ALLOWED_ATTR")?Xr({},Le.ALLOWED_ATTR,et):Q,me=Kl(Le,"ALLOWED_NAMESPACES")?Xr({},Le.ALLOWED_NAMESPACES,y8):Re,U=Kl(Le,"ADD_URI_SAFE_ATTR")?Xr(zc(ce),Le.ADD_URI_SAFE_ATTR,et):ce,j=Kl(Le,"ADD_DATA_URI_TAGS")?Xr(zc(ae),Le.ADD_DATA_URI_TAGS,et):ae,Ne=Kl(Le,"FORBID_CONTENTS")?Xr({},Le.FORBID_CONTENTS,et):We,ie=Kl(Le,"FORBID_TAGS")?Xr({},Le.FORBID_TAGS,et):zc({}),Y=Kl(Le,"FORBID_ATTR")?Xr({},Le.FORBID_ATTR,et):zc({}),Ge=Kl(Le,"USE_PROFILES")?Le.USE_PROFILES:!1,ee=Le.ALLOW_ARIA_ATTR!==!1,J=Le.ALLOW_DATA_ATTR!==!1,te=Le.ALLOW_UNKNOWN_PROTOCOLS||!1,Z=Le.ALLOW_SELF_CLOSE_IN_ATTR!==!1,xe=Le.SAFE_FOR_TEMPLATES||!1,de=Le.SAFE_FOR_XML!==!1,Se=Le.WHOLE_DOCUMENT||!1,we=Le.RETURN_DOM||!1,_e=Le.RETURN_DOM_FRAGMENT||!1,$e=Le.RETURN_TRUSTED_TYPE||!1,ke=Le.FORCE_BODY||!1,fe=Le.SANITIZE_DOM!==!1,Ke=Le.SANITIZE_NAMED_PROPS||!1,Be=Le.KEEP_CONTENT!==!1,Ue=Le.IN_PLACE||!1,G=Le.ALLOWED_URI_REGEXP||MY,be=Le.NAMESPACE||se,ge=Le.MATHML_TEXT_INTEGRATION_POINTS||ge,Ie=Le.HTML_INTEGRATION_POINTS||Ie,H=Le.CUSTOM_ELEMENT_HANDLING||{},Le.CUSTOM_ELEMENT_HANDLING&&Dt(Le.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(H.tagNameCheck=Le.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Le.CUSTOM_ELEMENT_HANDLING&&Dt(Le.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(H.attributeNameCheck=Le.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Le.CUSTOM_ELEMENT_HANDLING&&typeof Le.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(H.allowCustomizedBuiltInElements=Le.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),xe&&(J=!1),_e&&(we=!0),Ge&&($=Xr({},AY),X=[],Ge.html===!0&&(Xr($,CY),Xr(X,_Y)),Ge.svg===!0&&(Xr($,x8),Xr(X,w8),Xr(X,rw)),Ge.svgFilters===!0&&(Xr($,b8),Xr(X,w8),Xr(X,rw)),Ge.mathMl===!0&&(Xr($,T8),Xr(X,DY),Xr(X,rw))),Le.ADD_TAGS&&(typeof Le.ADD_TAGS=="function"?le.tagCheck=Le.ADD_TAGS:($===V&&($=zc($)),Xr($,Le.ADD_TAGS,et))),Le.ADD_ATTR&&(typeof Le.ADD_ATTR=="function"?le.attributeCheck=Le.ADD_ATTR:(X===Q&&(X=zc(X)),Xr(X,Le.ADD_ATTR,et))),Le.ADD_URI_SAFE_ATTR&&Xr(U,Le.ADD_URI_SAFE_ATTR,et),Le.FORBID_CONTENTS&&(Ne===We&&(Ne=zc(Ne)),Xr(Ne,Le.FORBID_CONTENTS,et)),Le.ADD_FORBID_CONTENTS&&(Ne===We&&(Ne=zc(Ne)),Xr(Ne,Le.ADD_FORBID_CONTENTS,et)),Be&&($["#text"]=!0),Se&&Xr($,["html","head","body"]),$.table&&(Xr($,["tbody"]),delete ie.tbody),Le.TRUSTED_TYPES_POLICY){if(typeof Le.TRUSTED_TYPES_POLICY.createHTML!="function")throw w2('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Le.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw w2('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');E=Le.TRUSTED_TYPES_POLICY,w=E.createHTML("")}else E===void 0&&(E=F7e(m,i)),E!==null&&typeof w=="string"&&(w=E.createHTML(""));ws&&ws(Le),he=Le}},"_parseConfig"),wt=Xr({},[...x8,...b8,...A7e]),Rt=Xr({},[...T8,..._7e]),it=o(function(Le){let ct=T(Le);(!ct||!ct.tagName)&&(ct={namespaceURI:be,tagName:"template"});let St=nw(Le.tagName),Mr=nw(ct.tagName);return me[Le.namespaceURI]?Le.namespaceURI===ne?ct.namespaceURI===se?St==="svg":ct.namespaceURI===z?St==="svg"&&(Mr==="annotation-xml"||ge[Mr]):!!wt[St]:Le.namespaceURI===z?ct.namespaceURI===se?St==="math":ct.namespaceURI===ne?St==="math"&&Ie[Mr]:!!Rt[St]:Le.namespaceURI===se?ct.namespaceURI===ne&&!Ie[Mr]||ct.namespaceURI===z&&!ge[Mr]?!1:!Rt[St]&&(qe[St]||!wt[St]):!!(Pe==="application/xhtml+xml"&&me[Le.namespaceURI]):!1},"_checkValidNamespace"),at=o(function(Le){b2(e.removed,{element:Le});try{T(Le).removeChild(Le)}catch{v(Le)}},"_forceRemove"),Ct=o(function(Le,ct){try{b2(e.removed,{attribute:ct.getAttributeNode(Le),from:ct})}catch{b2(e.removed,{attribute:null,from:ct})}if(ct.removeAttribute(Le),Le==="is")if(we||_e)try{at(ct)}catch{}else try{ct.setAttribute(Le,"")}catch{}},"_removeAttribute"),yt=o(function(Le){let ct=null,St=null;if(ke)Le=""+Le;else{let cn=v8(Le,/^[\r\n\t ]+/);St=cn&&cn[0]}Pe==="application/xhtml+xml"&&be===se&&(Le=''+Le+"");let Mr=E?E.createHTML(Le):Le;if(be===se)try{ct=new p().parseFromString(Mr,Pe)}catch{}if(!ct||!ct.documentElement){ct=k.createDocument(be,"template",null);try{ct.documentElement.innerHTML=pe?w:Mr}catch{}}let tn=ct.body||ct.documentElement;return Le&&St&&tn.insertBefore(r.createTextNode(St),tn.childNodes[0]||null),be===se?L.call(ct,Se?"html":"body")[0]:Se?ct.documentElement:tn},"_initDocument"),dt=o(function(Le){return S.call(Le.ownerDocument||Le,Le,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),Ht=o(function(Le){return Le instanceof d&&(typeof Le.nodeName!="string"||typeof Le.textContent!="string"||typeof Le.removeChild!="function"||!(Le.attributes instanceof f)||typeof Le.removeAttribute!="function"||typeof Le.setAttribute!="function"||typeof Le.namespaceURI!="string"||typeof Le.insertBefore!="function"||typeof Le.hasChildNodes!="function")},"_isClobbered"),cr=o(function(Le){return typeof l=="function"&&Le instanceof l},"_isNode");function Kt(mt,Le,ct){tw(mt,St=>{St.call(e,Le,ct,he)})}o(Kt,"_executeHooks");let kr=o(function(Le){let ct=null;if(Kt(N.beforeSanitizeElements,Le,null),Ht(Le))return at(Le),!0;let St=et(Le.nodeName);if(Kt(N.uponSanitizeElement,Le,{tagName:St,allowedTags:$}),de&&Le.hasChildNodes()&&!cr(Le.firstElementChild)&&Ts(/<[/\w!]/g,Le.innerHTML)&&Ts(/<[/\w!]/g,Le.textContent)||Le.nodeType===E2.progressingInstruction||de&&Le.nodeType===E2.comment&&Ts(/<[/\w]/g,Le.data))return at(Le),!0;if(!(le.tagCheck instanceof Function&&le.tagCheck(St))&&(!$[St]||ie[St])){if(!ie[St]&&tr(St)&&(H.tagNameCheck instanceof RegExp&&Ts(H.tagNameCheck,St)||H.tagNameCheck instanceof Function&&H.tagNameCheck(St)))return!1;if(Be&&!Ne[St]){let Mr=T(Le)||Le.parentNode,tn=b(Le)||Le.childNodes;if(tn&&Mr){let cn=tn.length;for(let Cr=cn-1;Cr>=0;--Cr){let Ki=y(tn[Cr],!0);Ki.__removalCount=(Le.__removalCount||0)+1,Mr.insertBefore(Ki,x(Le))}}}return at(Le),!0}return Le instanceof u&&!it(Le)||(St==="noscript"||St==="noembed"||St==="noframes")&&Ts(/<\/no(script|embed|frames)/i,Le.innerHTML)?(at(Le),!0):(xe&&Le.nodeType===E2.text&&(ct=Le.textContent,tw([C,_,D],Mr=>{ct=T2(ct,Mr," ")}),Le.textContent!==ct&&(b2(e.removed,{element:Le.cloneNode()}),Le.textContent=ct)),Kt(N.afterSanitizeElements,Le,null),!1)},"_sanitizeElements"),ur=o(function(Le,ct,St){if(fe&&(ct==="id"||ct==="name")&&(St in r||St in ot))return!1;if(!(J&&!Y[ct]&&Ts(M,ct))){if(!(ee&&Ts(R,ct))){if(!(le.attributeCheck instanceof Function&&le.attributeCheck(ct,Le))){if(!X[ct]||Y[ct]){if(!(tr(Le)&&(H.tagNameCheck instanceof RegExp&&Ts(H.tagNameCheck,Le)||H.tagNameCheck instanceof Function&&H.tagNameCheck(Le))&&(H.attributeNameCheck instanceof RegExp&&Ts(H.attributeNameCheck,ct)||H.attributeNameCheck instanceof Function&&H.attributeNameCheck(ct,Le))||ct==="is"&&H.allowCustomizedBuiltInElements&&(H.tagNameCheck instanceof RegExp&&Ts(H.tagNameCheck,St)||H.tagNameCheck instanceof Function&&H.tagNameCheck(St))))return!1}else if(!U[ct]){if(!Ts(G,T2(St,B,""))){if(!((ct==="src"||ct==="xlink:href"||ct==="href")&&Le!=="script"&&k7e(St,"data:")===0&&j[Le])){if(!(te&&!Ts(P,T2(St,B,"")))){if(St)return!1}}}}}}}return!0},"_isValidAttribute"),tr=o(function(Le){return Le!=="annotation-xml"&&v8(Le,F)},"_isBasicCustomElement"),hr=o(function(Le){Kt(N.beforeSanitizeAttributes,Le,null);let{attributes:ct}=Le;if(!ct||Ht(Le))return;let St={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:X,forceKeepAttr:void 0},Mr=ct.length;for(;Mr--;){let tn=ct[Mr],{name:cn,namespaceURI:Cr,value:Ki}=tn,Da=et(cn),Dn=Ki,Pt=cn==="value"?Dn:E7e(Dn);if(St.attrName=Da,St.attrValue=Pt,St.keepAttr=!0,St.forceKeepAttr=void 0,Kt(N.uponSanitizeAttribute,Le,St),Pt=St.attrValue,Ke&&(Da==="id"||Da==="name")&&(Ct(cn,Le),Pt=Te+Pt),de&&Ts(/((--!?|])>)|<\/(style|title|textarea)/i,Pt)){Ct(cn,Le);continue}if(Da==="attributename"&&v8(Pt,"href")){Ct(cn,Le);continue}if(St.forceKeepAttr)continue;if(!St.keepAttr){Ct(cn,Le);continue}if(!Z&&Ts(/\/>/i,Pt)){Ct(cn,Le);continue}xe&&tw([C,_,D],Vt=>{Pt=T2(Pt,Vt," ")});let Tt=et(Le.nodeName);if(!ur(Tt,Da,Pt)){Ct(cn,Le);continue}if(E&&typeof m=="object"&&typeof m.getAttributeType=="function"&&!Cr)switch(m.getAttributeType(Tt,Da)){case"TrustedHTML":{Pt=E.createHTML(Pt);break}case"TrustedScriptURL":{Pt=E.createScriptURL(Pt);break}}if(Pt!==Dn)try{Cr?Le.setAttributeNS(Cr,cn,Pt):Le.setAttribute(cn,Pt),Ht(Le)?at(Le):SY(e.removed)}catch{Ct(cn,Le)}}Kt(N.afterSanitizeAttributes,Le,null)},"_sanitizeAttributes"),_n=o(function mt(Le){let ct=null,St=dt(Le);for(Kt(N.beforeSanitizeShadowDOM,Le,null);ct=St.nextNode();)Kt(N.uponSanitizeShadowNode,ct,null),kr(ct),hr(ct),ct.content instanceof a&&mt(ct.content);Kt(N.afterSanitizeShadowDOM,Le,null)},"_sanitizeShadowDOM");return e.sanitize=function(mt){let Le=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},ct=null,St=null,Mr=null,tn=null;if(pe=!mt,pe&&(mt=""),typeof mt!="string"&&!cr(mt))if(typeof mt.toString=="function"){if(mt=mt.toString(),typeof mt!="string")throw w2("dirty is not a string, aborting")}else throw w2("toString is not a function");if(!e.isSupported)return mt;if(Me||It(Le),e.removed=[],typeof mt=="string"&&(Ue=!1),Ue){if(mt.nodeName){let Ki=et(mt.nodeName);if(!$[Ki]||ie[Ki])throw w2("root node is forbidden and cannot be sanitized in-place")}}else if(mt instanceof l)ct=yt(""),St=ct.ownerDocument.importNode(mt,!0),St.nodeType===E2.element&&St.nodeName==="BODY"||St.nodeName==="HTML"?ct=St:ct.appendChild(St);else{if(!we&&!xe&&!Se&&mt.indexOf("<")===-1)return E&&$e?E.createHTML(mt):mt;if(ct=yt(mt),!ct)return we?null:$e?w:""}ct&&ke&&at(ct.firstChild);let cn=dt(Ue?mt:ct);for(;Mr=cn.nextNode();)kr(Mr),hr(Mr),Mr.content instanceof a&&_n(Mr.content);if(Ue)return mt;if(we){if(_e)for(tn=A.call(ct.ownerDocument);ct.firstChild;)tn.appendChild(ct.firstChild);else tn=ct;return(X.shadowroot||X.shadowrootmode)&&(tn=I.call(n,tn,!0)),tn}let Cr=Se?ct.outerHTML:ct.innerHTML;return Se&&$["!doctype"]&&ct.ownerDocument&&ct.ownerDocument.doctype&&ct.ownerDocument.doctype.name&&Ts(IY,ct.ownerDocument.doctype.name)&&(Cr=" -`+Cr),xe&&tw([C,_,D],Ki=>{Cr=T2(Cr,Ki," ")}),E&&$e?E.createHTML(Cr):Cr},e.setConfig=function(){let mt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};It(mt),Me=!0},e.clearConfig=function(){he=null,Me=!1},e.isValidAttribute=function(mt,Le,ct){he||It({});let St=et(mt),Mr=et(Le);return ur(St,Mr,ct)},e.addHook=function(mt,Le){typeof Le=="function"&&b2(N[mt],Le)},e.removeHook=function(mt,Le){if(Le!==void 0){let ct=T7e(N[mt],Le);return ct===-1?void 0:w7e(N[mt],ct,1)[0]}return SY(N[mt])},e.removeHooks=function(mt){N[mt]=[]},e.removeAllHooks=function(){N=LY()},e}var NY,EY,v7e,x7e,b7e,ws,hl,k8,E8,S8,tw,T7e,SY,b2,w7e,nw,y8,v8,T2,k7e,E7e,Kl,Ts,w2,CY,x8,b8,A7e,T8,_7e,AY,_Y,w8,DY,rw,D7e,R7e,L7e,N7e,M7e,MY,I7e,O7e,IY,P7e,RY,E2,B7e,F7e,LY,fl,S2=O(()=>{"use strict";({entries:NY,setPrototypeOf:EY,isFrozen:v7e,getPrototypeOf:x7e,getOwnPropertyDescriptor:b7e}=Object),{freeze:ws,seal:hl,create:k8}=Object,{apply:E8,construct:S8}=typeof Reflect<"u"&&Reflect;ws||(ws=o(function(e){return e},"freeze"));hl||(hl=o(function(e){return e},"seal"));E8||(E8=o(function(e,r){for(var n=arguments.length,i=new Array(n>2?n-2:0),a=2;a1?r-1:0),i=1;i/gm),L7e=hl(/\$\{[\w\W]*/gm),N7e=hl(/^data-[\-\w.\u00B7-\uFFFF]+$/),M7e=hl(/^aria-[\-\w]+$/),MY=hl(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),I7e=hl(/^(?:\w+script|data):/i),O7e=hl(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),IY=hl(/^html$/i),P7e=hl(/^[a-z][.\w]*(-[.\w]+)+$/i),RY=Object.freeze({__proto__:null,ARIA_ATTR:M7e,ATTR_WHITESPACE:O7e,CUSTOM_ELEMENT:P7e,DATA_ATTR:N7e,DOCTYPE_NAME:IY,ERB_EXPR:R7e,IS_ALLOWED_URI:MY,IS_SCRIPT_OR_DATA:I7e,MUSTACHE_EXPR:D7e,TMPLIT_EXPR:L7e}),E2={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},B7e=o(function(){return typeof window>"u"?null:window},"getGlobal"),F7e=o(function(e,r){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(n=r.getAttribute(i));let a="dompurify"+(n?"#"+n:"");try{return e.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},"_createTrustedTypesPolicy"),LY=o(function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},"_createHooksMap");o(OY,"createDOMPurify");fl=OY()});var dX={};vr(dX,{ParseError:()=>bt,SETTINGS_SCHEMA:()=>D2,__defineFunction:()=>Ot,__defineMacro:()=>ue,__defineSymbol:()=>q,__domTree:()=>fX,__parse:()=>lX,__renderToDomTree:()=>Rw,__renderToHTMLTree:()=>uX,__setFontMetrics:()=>mj,default:()=>_8e,render:()=>pD,renderToString:()=>oX,version:()=>hX});function U7e(t){return String(t).replace(q7e,e=>V7e[e])}function j7e(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function t_e(t){for(var e=0;e<$8.length;e++)for(var r=$8[e],n=0;n=i[0]&&t<=i[1])return r.name}return null}function pj(t){for(var e=0;e=mw[e]&&t<=mw[e+1])return!0;return!1}function mj(t,e){qc[t]=e}function Z8(t,e,r){if(!qc[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=qc[e][n];if(!i&&t[0]in BY&&(n=BY[t[0]].charCodeAt(0),i=qc[e][n]),!i&&r==="text"&&pj(n)&&(i=qc[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function f_e(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!C8[e]){var r=C8[e]={cssEmPerMu:iw.quad[e]/18};for(var n in iw)iw.hasOwnProperty(n)&&(r[n]=iw[n][e])}return C8[e]}function zY(t){if(t instanceof Zs)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function y_e(t){if(t instanceof Np)return t;throw new Error("Expected span but got "+String(t)+".")}function q(t,e,r,n,i,a){qn[t][i]={font:e,group:r,replace:n},a&&n&&(qn[t][n]=qn[t][i])}function Ot(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},u=0;u0&&(a.push(hw(s,e)),s=[]),a.push(n[l]));s.length>0&&a.push(hw(s,e));var h;r?(h=hw(ea(r,e,!0)),h.classes=["tag"],a.push(h)):i&&a.push(i);var f=oh(["katex-html"],a);if(f.setAttribute("aria-hidden","true"),h){var d=h.children[0];d.style.height=_t(f.height+f.depth),f.depth&&(d.style.verticalAlign=_t(-f.depth))}return f}function Aj(t){return new Lp(t)}function D8(t){if(!t)return!1;if(t.type==="mi"&&t.children.length===1){var e=t.children[0];return e instanceof pl&&e.text==="."}else if(t.type==="mo"&&t.children.length===1&&t.getAttribute("separator")==="true"&&t.getAttribute("lspace")==="0em"&&t.getAttribute("rspace")==="0em"){var r=t.children[0];return r instanceof pl&&r.text===","}else return!1}function WY(t,e,r,n,i){var a=Js(t,r),s;a.length===1&&a[0]instanceof Es&&["mrow","mtable"].includes(a[0].type)?s=a[0]:s=new vt.MathNode("mrow",a);var l=new vt.MathNode("annotation",[new vt.TextNode(e)]);l.setAttribute("encoding","application/x-tex");var u=new vt.MathNode("semantics",[s,l]),h=new vt.MathNode("math",[u]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&h.setAttribute("display","block");var f=i?"katex":"katex-mathml";return He.makeSpan([f],[h])}function Ir(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function rD(t){var e=Cw(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function Cw(t){return t&&(t.type==="atom"||x_e.hasOwnProperty(t.type))?t:null}function Lj(t,e){var r=ea(t.body,e,!0);return X_e([t.mclass],r,e)}function Nj(t,e){var r,n=Js(t.body,e);return t.mclass==="minner"?r=new vt.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new vt.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new vt.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function Z_e(t,e,r){var n=K_e[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),l=r.callFunction("\\\\cdright",[e[1]],[]),u={type:"ordgroup",mode:"math",body:[i,s,l]};return r.callFunction("\\\\cdparent",[u],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var h={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[h],[])}default:return{type:"textord",text:" ",mode:"math"}}}function J_e(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new bt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(h)>-1)for(var d=0;d<2;d++){for(var p=!0,m=u+1;mAV=|." after @',s[u]);var g=Z_e(h,f,t),y={type:"styling",body:[g],mode:"math",style:"display"};n.push(y),l=HY()}a%2===0?n.push(l):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var v=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:v,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function _w(t,e){var r=Cw(t);if(r&&f8e.includes(r.text))return r;throw r?new bt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new bt("Invalid delimiter type '"+t.type+"'",t)}function XY(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function Wc(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},u=0;u1||!f)&&y.pop(),x.length{"use strict";Qs=class t{static{o(this,"SourceLocation")}constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},Po=class t{static{o(this,"Token")}constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,Qs.range(this,e))}},bt=class t{static{o(this,"ParseError")}constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var l=s.lexer.input;i=s.start,a=s.end,i===l.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var u=l.slice(i,a).replace(/[^]/g,"$&\u0332"),h;i>15?h="\u2026"+l.slice(i-15,i):h=l.slice(0,i);var f;a+15":">","<":"<",'"':""","'":"'"},q7e=/[&><"']/g;o(U7e,"escape");dj=o(function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},"getBaseElem"),W7e=o(function(e){var r=dj(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},"isCharacterBox"),H7e=o(function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},"assert"),Y7e=o(function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},"protocolFromUrl"),un={deflt:$7e,escape:U7e,hyphenate:G7e,getBaseElem:dj,isCharacterBox:W7e,protocolFromUrl:Y7e},D2={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:o(t=>"#"+t,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:o((t,e)=>(e.push(t),e),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:o(t=>Math.max(0,t),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:o(t=>Math.max(0,t),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:o(t=>Math.max(0,t),"processor"),cli:"-e, --max-expand ",cliProcessor:o(t=>t==="Infinity"?1/0:parseInt(t),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}};o(j7e,"getDefaultValue");L2=class{static{o(this,"Settings")}constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in D2)if(D2.hasOwnProperty(r)){var n=D2[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:j7e(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new bt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=un.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},Gc=class{static{o(this,"Style")}constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return Vc[X7e[this.id]]}sub(){return Vc[K7e[this.id]]}fracNum(){return Vc[Q7e[this.id]]}fracDen(){return Vc[Z7e[this.id]]}cramp(){return Vc[J7e[this.id]]}text(){return Vc[e_e[this.id]]}isTight(){return this.size>=2}},Q8=0,gw=1,fg=2,ah=3,N2=4,dl=5,dg=6,Ss=7,Vc=[new Gc(Q8,0,!1),new Gc(gw,0,!0),new Gc(fg,1,!1),new Gc(ah,1,!0),new Gc(N2,2,!1),new Gc(dl,2,!0),new Gc(dg,3,!1),new Gc(Ss,3,!0)],X7e=[N2,dl,N2,dl,dg,Ss,dg,Ss],K7e=[dl,dl,dl,dl,Ss,Ss,Ss,Ss],Q7e=[fg,ah,N2,dl,dg,Ss,dg,Ss],Z7e=[ah,ah,dl,dl,Ss,Ss,Ss,Ss],J7e=[gw,gw,ah,ah,dl,dl,Ss,Ss],e_e=[Q8,gw,fg,ah,fg,ah,fg,ah],dr={DISPLAY:Vc[Q8],TEXT:Vc[fg],SCRIPT:Vc[N2],SCRIPTSCRIPT:Vc[dg]},$8=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];o(t_e,"scriptFromCodepoint");mw=[];$8.forEach(t=>t.blocks.forEach(e=>mw.push(...e)));o(pj,"supportedCodepoint");hg=80,r_e=o(function(e,r){return"M95,"+(622+e+r)+` -c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 -c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 -c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 -s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 -c69,-144,104.5,-217.7,106.5,-221 -l`+e/2.075+" -"+e+` -c5.3,-9.3,12,-14,20,-14 -H400000v`+(40+e)+`H845.2724 -s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 -c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z -M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),n_e=o(function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 -c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 -c340,-704.7,510.7,-1060.3,512,-1067 -l`+e/2.084+" -"+e+` -c4.7,-7.3,11,-11,19,-11 -H40000v`+(40+e)+`H1012.3 -s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 -c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 -s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 -c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z -M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),i_e=o(function(e,r){return"M983 "+(10+e+r)+` -l`+e/3.13+" -"+e+` -c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` -H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 -s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 -c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 -c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 -c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 -c53.7,-170.3,84.5,-266.8,92.5,-289.5z -M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),a_e=o(function(e,r){return"M424,"+(2398+e+r)+` -c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 -c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 -s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 -s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 -l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 -v`+(40+e)+`H1014.6 -s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 -c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` -h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),s_e=o(function(e,r){return"M473,"+(2713+e+r)+` -c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` -c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 -s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 -c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 -s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, -606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),o_e=o(function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),l_e=o(function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` -H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 -h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 -c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 -219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},"sqrtTall"),c_e=o(function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=r_e(r,hg);break;case"sqrtSize1":i=n_e(r,hg);break;case"sqrtSize2":i=i_e(r,hg);break;case"sqrtSize3":i=a_e(r,hg);break;case"sqrtSize4":i=s_e(r,hg);break;case"sqrtTall":i=l_e(r,hg,n)}return i},"sqrtPath"),u_e=o(function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},"innerPath"),PY={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`,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`,tilde1:`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`,tilde2:`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`,tilde3:`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`,tilde4:`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`},h_e=o(function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 -H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z -M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z -M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z -MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z -MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z -M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z -M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 -c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, --36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, -949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 -c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, --544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 -l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, --210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, -63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 -c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` -c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 -c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 -c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 -c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 -l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, --470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),Lp=class{static{o(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return this.classes.includes(e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText(),"toText");return this.children.map(e).join("")}},qc={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],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:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],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:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],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:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],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:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],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:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],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:[0,.44444,0,0,.63889],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:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],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:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],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:[0,.68611,.17208,0,.8961],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:[0,.68611,.17208,0,.8961],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:[0,.69444,.06709,0,.59111],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:[.19444,.44444,.105,0,.53222],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:[.19444,.44444,.105,0,.53222],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:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],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:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],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:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],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:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],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:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],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:[0,.68333,.16389,0,.74333],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:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],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:[0,.68333,.16389,0,.74333],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:[0,.69444,.06646,0,.51111],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:[.19444,.43056,.08847,0,.46],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:[.19444,.43056,.08847,0,.46],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:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],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:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],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:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],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:[0,.43056,0,0,.55556],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:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],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:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],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:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],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:[0,.69444,0,0,.66759],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:[0,.44444,0,0,.58472],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:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],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:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],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:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],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:[0,.68333,.08125,.05556,.83125],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:[0,.68333,.02778,.08334,.76278],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:[0,.43056,0,.05556,.48472],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:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],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:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],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:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],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:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],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:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],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:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],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:[0,.69444,.07816,0,.27778],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:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],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:[0,.69444,0,0,.66667],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:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],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:[0,.69444,.0799,0,.5],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:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],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:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],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:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],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:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],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:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],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:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},iw={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],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:[.25,.25,.25],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],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},BY={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\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"};o(mj,"setFontMetrics");o(Z8,"getCharacterMetrics");C8={};o(f_e,"getGlobalMetrics");d_e=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],FY=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],$Y=o(function(e,r){return r.size<2?e:d_e[e-1][r.size-1]},"sizeAtStyle"),yw=class t{static{o(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=FY[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:$Y(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:FY[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=$Y(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=f_e(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};yw.BASESIZE=6;z8={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},p_e={ex:!0,em:!0,mu:!0},gj=o(function(e){return typeof e!="string"&&(e=e.unit),e in z8||e in p_e||e==="ex"},"validUnit"),bi=o(function(e,r){var n;if(e.unit in z8)n=z8[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new bt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},"calculateSize"),_t=o(function(e){return+e.toFixed(4)+"em"},"makeEm"),Tf=o(function(e){return e.filter(r=>r).join(" ")},"createClass"),yj=o(function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},"initNode"),vj=o(function(e){var r=document.createElement(e);r.className=Tf(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a/=\x00-\x1f]/,xj=o(function(e){var r="<"+e;this.classes.length&&(r+=' class="'+un.escape(Tf(this.classes))+'"');var n="";for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=un.hyphenate(i)+":"+this.style[i]+";");n&&(r+=' style="'+un.escape(n)+'"');for(var a in this.attributes)if(this.attributes.hasOwnProperty(a)){if(m_e.test(a))throw new bt("Invalid attribute name '"+a+"'");r+=" "+a+'="'+un.escape(this.attributes[a])+'"'}r+=">";for(var s=0;s",r},"toMarkup"),Np=class{static{o(this,"Span")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,yj.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return this.classes.includes(e)}toNode(){return vj.call(this,"span")}toMarkup(){return xj.call(this,"span")}},M2=class{static{o(this,"Anchor")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,yj.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return this.classes.includes(e)}toNode(){return vj.call(this,"a")}toMarkup(){return xj.call(this,"a")}},G8=class{static{o(this,"Img")}constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return this.classes.includes(e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+un.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=_t(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=Tf(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=un.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+un.escape(n)+'"');var a=un.escape(this.text);return e?(r+=">",r+=a,r+="",r):a}},Zl=class{static{o(this,"SvgNode")}constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},I2=class{static{o(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);q(W,re,De,"\u2208","\\in",!0);q(W,re,De,"\uE020","\\@not");q(W,re,De,"\u2282","\\subset",!0);q(W,re,De,"\u2283","\\supset",!0);q(W,re,De,"\u2286","\\subseteq",!0);q(W,re,De,"\u2287","\\supseteq",!0);q(W,Ae,De,"\u2288","\\nsubseteq",!0);q(W,Ae,De,"\u2289","\\nsupseteq",!0);q(W,re,De,"\u22A8","\\models");q(W,re,De,"\u2190","\\leftarrow",!0);q(W,re,De,"\u2264","\\le");q(W,re,De,"\u2264","\\leq",!0);q(W,re,De,"<","\\lt",!0);q(W,re,De,"\u2192","\\rightarrow",!0);q(W,re,De,"\u2192","\\to");q(W,Ae,De,"\u2271","\\ngeq",!0);q(W,Ae,De,"\u2270","\\nleq",!0);q(W,re,ch,"\xA0","\\ ");q(W,re,ch,"\xA0","\\space");q(W,re,ch,"\xA0","\\nobreakspace");q(ft,re,ch,"\xA0","\\ ");q(ft,re,ch,"\xA0"," ");q(ft,re,ch,"\xA0","\\space");q(ft,re,ch,"\xA0","\\nobreakspace");q(W,re,ch,null,"\\nobreak");q(W,re,ch,null,"\\allowbreak");q(W,re,Ew,",",",");q(W,re,Ew,";",";");q(W,Ae,Ft,"\u22BC","\\barwedge",!0);q(W,Ae,Ft,"\u22BB","\\veebar",!0);q(W,re,Ft,"\u2299","\\odot",!0);q(W,re,Ft,"\u2295","\\oplus",!0);q(W,re,Ft,"\u2297","\\otimes",!0);q(W,re,ze,"\u2202","\\partial",!0);q(W,re,Ft,"\u2298","\\oslash",!0);q(W,Ae,Ft,"\u229A","\\circledcirc",!0);q(W,Ae,Ft,"\u22A1","\\boxdot",!0);q(W,re,Ft,"\u25B3","\\bigtriangleup");q(W,re,Ft,"\u25BD","\\bigtriangledown");q(W,re,Ft,"\u2020","\\dagger");q(W,re,Ft,"\u22C4","\\diamond");q(W,re,Ft,"\u22C6","\\star");q(W,re,Ft,"\u25C3","\\triangleleft");q(W,re,Ft,"\u25B9","\\triangleright");q(W,re,Bo,"{","\\{");q(ft,re,ze,"{","\\{");q(ft,re,ze,"{","\\textbraceleft");q(W,re,Cs,"}","\\}");q(ft,re,ze,"}","\\}");q(ft,re,ze,"}","\\textbraceright");q(W,re,Bo,"{","\\lbrace");q(W,re,Cs,"}","\\rbrace");q(W,re,Bo,"[","\\lbrack",!0);q(ft,re,ze,"[","\\lbrack",!0);q(W,re,Cs,"]","\\rbrack",!0);q(ft,re,ze,"]","\\rbrack",!0);q(W,re,Bo,"(","\\lparen",!0);q(W,re,Cs,")","\\rparen",!0);q(ft,re,ze,"<","\\textless",!0);q(ft,re,ze,">","\\textgreater",!0);q(W,re,Bo,"\u230A","\\lfloor",!0);q(W,re,Cs,"\u230B","\\rfloor",!0);q(W,re,Bo,"\u2308","\\lceil",!0);q(W,re,Cs,"\u2309","\\rceil",!0);q(W,re,ze,"\\","\\backslash");q(W,re,ze,"\u2223","|");q(W,re,ze,"\u2223","\\vert");q(ft,re,ze,"|","\\textbar",!0);q(W,re,ze,"\u2225","\\|");q(W,re,ze,"\u2225","\\Vert");q(ft,re,ze,"\u2225","\\textbardbl");q(ft,re,ze,"~","\\textasciitilde");q(ft,re,ze,"\\","\\textbackslash");q(ft,re,ze,"^","\\textasciicircum");q(W,re,De,"\u2191","\\uparrow",!0);q(W,re,De,"\u21D1","\\Uparrow",!0);q(W,re,De,"\u2193","\\downarrow",!0);q(W,re,De,"\u21D3","\\Downarrow",!0);q(W,re,De,"\u2195","\\updownarrow",!0);q(W,re,De,"\u21D5","\\Updownarrow",!0);q(W,re,Gi,"\u2210","\\coprod");q(W,re,Gi,"\u22C1","\\bigvee");q(W,re,Gi,"\u22C0","\\bigwedge");q(W,re,Gi,"\u2A04","\\biguplus");q(W,re,Gi,"\u22C2","\\bigcap");q(W,re,Gi,"\u22C3","\\bigcup");q(W,re,Gi,"\u222B","\\int");q(W,re,Gi,"\u222B","\\intop");q(W,re,Gi,"\u222C","\\iint");q(W,re,Gi,"\u222D","\\iiint");q(W,re,Gi,"\u220F","\\prod");q(W,re,Gi,"\u2211","\\sum");q(W,re,Gi,"\u2A02","\\bigotimes");q(W,re,Gi,"\u2A01","\\bigoplus");q(W,re,Gi,"\u2A00","\\bigodot");q(W,re,Gi,"\u222E","\\oint");q(W,re,Gi,"\u222F","\\oiint");q(W,re,Gi,"\u2230","\\oiiint");q(W,re,Gi,"\u2A06","\\bigsqcup");q(W,re,Gi,"\u222B","\\smallint");q(ft,re,pg,"\u2026","\\textellipsis");q(W,re,pg,"\u2026","\\mathellipsis");q(ft,re,pg,"\u2026","\\ldots",!0);q(W,re,pg,"\u2026","\\ldots",!0);q(W,re,pg,"\u22EF","\\@cdots",!0);q(W,re,pg,"\u22F1","\\ddots",!0);q(W,re,ze,"\u22EE","\\varvdots");q(ft,re,ze,"\u22EE","\\varvdots");q(W,re,ai,"\u02CA","\\acute");q(W,re,ai,"\u02CB","\\grave");q(W,re,ai,"\xA8","\\ddot");q(W,re,ai,"~","\\tilde");q(W,re,ai,"\u02C9","\\bar");q(W,re,ai,"\u02D8","\\breve");q(W,re,ai,"\u02C7","\\check");q(W,re,ai,"^","\\hat");q(W,re,ai,"\u20D7","\\vec");q(W,re,ai,"\u02D9","\\dot");q(W,re,ai,"\u02DA","\\mathring");q(W,re,fr,"\uE131","\\@imath");q(W,re,fr,"\uE237","\\@jmath");q(W,re,ze,"\u0131","\u0131");q(W,re,ze,"\u0237","\u0237");q(ft,re,ze,"\u0131","\\i",!0);q(ft,re,ze,"\u0237","\\j",!0);q(ft,re,ze,"\xDF","\\ss",!0);q(ft,re,ze,"\xE6","\\ae",!0);q(ft,re,ze,"\u0153","\\oe",!0);q(ft,re,ze,"\xF8","\\o",!0);q(ft,re,ze,"\xC6","\\AE",!0);q(ft,re,ze,"\u0152","\\OE",!0);q(ft,re,ze,"\xD8","\\O",!0);q(ft,re,ai,"\u02CA","\\'");q(ft,re,ai,"\u02CB","\\`");q(ft,re,ai,"\u02C6","\\^");q(ft,re,ai,"\u02DC","\\~");q(ft,re,ai,"\u02C9","\\=");q(ft,re,ai,"\u02D8","\\u");q(ft,re,ai,"\u02D9","\\.");q(ft,re,ai,"\xB8","\\c");q(ft,re,ai,"\u02DA","\\r");q(ft,re,ai,"\u02C7","\\v");q(ft,re,ai,"\xA8",'\\"');q(ft,re,ai,"\u02DD","\\H");q(ft,re,ai,"\u25EF","\\textcircled");bj={"--":!0,"---":!0,"``":!0,"''":!0};q(ft,re,ze,"\u2013","--",!0);q(ft,re,ze,"\u2013","\\textendash");q(ft,re,ze,"\u2014","---",!0);q(ft,re,ze,"\u2014","\\textemdash");q(ft,re,ze,"\u2018","`",!0);q(ft,re,ze,"\u2018","\\textquoteleft");q(ft,re,ze,"\u2019","'",!0);q(ft,re,ze,"\u2019","\\textquoteright");q(ft,re,ze,"\u201C","``",!0);q(ft,re,ze,"\u201C","\\textquotedblleft");q(ft,re,ze,"\u201D","''",!0);q(ft,re,ze,"\u201D","\\textquotedblright");q(W,re,ze,"\xB0","\\degree",!0);q(ft,re,ze,"\xB0","\\degree");q(ft,re,ze,"\xB0","\\textdegree",!0);q(W,re,ze,"\xA3","\\pounds");q(W,re,ze,"\xA3","\\mathsterling",!0);q(ft,re,ze,"\xA3","\\pounds");q(ft,re,ze,"\xA3","\\textsterling",!0);q(W,Ae,ze,"\u2720","\\maltese");q(ft,Ae,ze,"\u2720","\\maltese");GY='0123456789/@."';for(aw=0;aw0)return Ql(a,h,i,r,s.concat(f));if(u){var d,p;if(u==="boldsymbol"){var m=w_e(a,i,r,s,n);d=m.fontName,p=[m.fontClass]}else l?(d=kj[u].fontName,p=[u]):(d=uw(u,r.fontWeight,r.fontShape),p=[u,r.fontWeight,r.fontShape]);if(Sw(a,d,i).metrics)return Ql(a,d,i,r,s.concat(p));if(bj.hasOwnProperty(a)&&d.slice(0,10)==="Typewriter"){for(var g=[],y=0;y{if(Tf(t.classes)!==Tf(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},"canCombine"),S_e=o(t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},"sizeElementFromChildren"),Ks=o(function(e,r,n,i){var a=new Np(e,r,n,i);return J8(a),a},"makeSpan"),Tj=o((t,e,r,n)=>new Np(t,e,r,n),"makeSvgSpan"),C_e=o(function(e,r,n){var i=Ks([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=_t(i.height),i.maxFontSize=1,i},"makeLineSpan"),A_e=o(function(e,r,n,i){var a=new M2(e,r,n,i);return J8(a),a},"makeAnchor"),wj=o(function(e){var r=new Lp(e);return J8(r),r},"makeFragment"),__e=o(function(e,r){return e instanceof Lp?Ks([],[e],r):e},"wrapFragment"),D_e=o(function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=Ks(["mspace"],[],e),n=bi(t,e);return r.style.marginRight=_t(n),r},"makeGlue"),uw=o(function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},"retrieveTextFontName"),kj={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ej={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},N_e=o(function(e,r){var[n,i,a]=Ej[e],s=new Uc(n),l=new Zl([s],{width:_t(i),height:_t(a),style:"width:"+_t(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),u=Tj(["overlay"],[l],r);return u.height=a,u.style.height=_t(a),u.style.width=_t(i),u},"staticSvg"),He={fontMap:kj,makeSymbol:Ql,mathsym:T_e,makeSpan:Ks,makeSvgSpan:Tj,makeLineSpan:C_e,makeAnchor:A_e,makeFragment:wj,wrapFragment:__e,makeVList:R_e,makeOrd:k_e,makeGlue:L_e,staticSvg:N_e,svgData:Ej,tryCombineChars:S_e},xi={number:3,unit:"mu"},Rp={number:4,unit:"mu"},ih={number:5,unit:"mu"},M_e={mord:{mop:xi,mbin:Rp,mrel:ih,minner:xi},mop:{mord:xi,mop:xi,mrel:ih,minner:xi},mbin:{mord:Rp,mop:Rp,mopen:Rp,minner:Rp},mrel:{mord:ih,mop:ih,mopen:ih,minner:ih},mopen:{},mclose:{mop:xi,mbin:Rp,mrel:ih,minner:xi},mpunct:{mord:xi,mop:xi,mrel:ih,mopen:xi,mclose:xi,mpunct:xi,minner:xi},minner:{mord:xi,mop:xi,mbin:Rp,mrel:ih,mopen:xi,mpunct:xi,minner:xi}},I_e={mord:{mop:xi},mop:{mord:xi,mop:xi},mbin:{},mrel:{},mopen:{},mclose:{mop:xi},mpunct:{},minner:{mop:xi}},Sj={},xw={},bw={};o(Ot,"defineFunction");o(Mp,"defineFunctionBuilders");Tw=o(function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},"normalizeArgument"),Oi=o(function(e){return e.type==="ordgroup"?e.body:[e]},"ordargument"),oh=He.makeSpan,O_e=["leftmost","mbin","mopen","mrel","mop","mpunct"],P_e=["rightmost","mrel","mclose","mpunct"],B_e={display:dr.DISPLAY,text:dr.TEXT,script:dr.SCRIPT,scriptscript:dr.SCRIPTSCRIPT},F_e={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},ea=o(function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var v=y.classes[0],x=g.classes[0];v==="mbin"&&P_e.includes(x)?y.classes[0]="mord":x==="mbin"&&O_e.includes(v)&&(g.classes[0]="mord")},{node:d},p,m),UY(a,(g,y)=>{var v=q8(y),x=q8(g),b=v&&x?g.hasClass("mtight")?I_e[v][x]:M_e[v][x]:null;if(b)return He.makeGlue(b,h)},{node:d},p,m),a},"buildExpression"),UY=o(function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sp=>{e.splice(d+1,0,p),s++})(s)}i&&e.pop()},"traverseNonSpaceNodes"),Cj=o(function(e){return e instanceof Lp||e instanceof M2||e instanceof Np&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),$_e=o(function t(e,r){var n=Cj(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},"getOutermostNode"),q8=o(function(e,r){return e?(r&&(e=$_e(e,r)),F_e[e.classes[0]]||null):null},"getTypeOfDomTree"),O2=o(function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return oh(r.concat(n))},"makeNullDelimiter"),rn=o(function(e,r,n){if(!e)return oh();if(xw[e.type]){var i=xw[e.type](e,r);if(n&&r.size!==n.size){i=oh(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new bt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(hw,"buildHTMLUnbreakable");o(U8,"buildHTML");o(Aj,"newDocumentFragment");Es=class{static{o(this,"MathNode")}constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=Tf(this.classes));for(var n=0;n0&&(e+=' class ="'+un.escape(Tf(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},pl=class{static{o(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return un.escape(this.toText())}toText(){return this.text}},W8=class{static{o(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",_t(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},vt={MathNode:Es,TextNode:pl,SpaceNode:W8,newDocumentFragment:Aj},ml=o(function(e,r,n){return qn[r][e]&&qn[r][e].replace&&e.charCodeAt(0)!==55349&&!(bj.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=qn[r][e].replace),new vt.TextNode(e)},"makeText"),eD=o(function(e){return e.length===1?e[0]:new vt.MathNode("mrow",e)},"makeRow"),tD=o(function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathsfit")return"sans-serif-italic";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(["\\imath","\\jmath"].includes(a))return null;qn[i][a]&&qn[i][a].replace&&(a=qn[i][a].replace);var s=He.fontMap[n].fontName;return Z8(a,s,i)?He.fontMap[n].variant:null},"getVariant");o(D8,"isNumberPunctuation");Js=o(function(e,r,n){if(e.length===1){var i=Mn(e[0],r);return n&&i instanceof Es&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,l=0;l=1&&(s.type==="mn"||D8(s))){var h=u.children[0];h instanceof Es&&h.type==="mn"&&(h.children=[...s.children,...h.children],a.pop())}else if(s.type==="mi"&&s.children.length===1){var f=s.children[0];if(f instanceof pl&&f.text==="\u0338"&&(u.type==="mo"||u.type==="mi"||u.type==="mn")){var d=u.children[0];d instanceof pl&&d.text.length>0&&(d.text=d.text.slice(0,1)+"\u0338"+d.text.slice(1),a.pop())}}}a.push(u),s=u}return a},"buildExpression"),wf=o(function(e,r,n){return eD(Js(e,r,n))},"buildExpressionRow"),Mn=o(function(e,r){if(!e)return new vt.MathNode("mrow");if(bw[e.type]){var n=bw[e.type](e,r);return n}else throw new bt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(WY,"buildMathML");_j=o(function(e){return new yw({style:e.displayMode?dr.DISPLAY:dr.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},"optionsFromSettings"),Dj=o(function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=He.makeSpan(n,[e])}return e},"displayWrap"),z_e=o(function(e,r,n){var i=_j(n),a;if(n.output==="mathml")return WY(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=U8(e,i);a=He.makeSpan(["katex"],[s])}else{var l=WY(e,r,i,n.displayMode,!1),u=U8(e,i);a=He.makeSpan(["katex"],[l,u])}return Dj(a,n)},"buildTree"),G_e=o(function(e,r,n){var i=_j(n),a=U8(e,i),s=He.makeSpan(["katex"],[a]);return Dj(s,n)},"buildHTMLTree"),V_e={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\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",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},q_e=o(function(e){var r=new vt.MathNode("mo",[new vt.TextNode(V_e[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},"mathMLnode"),U_e={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"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,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"],"\\cdlongequal":[["longequal"],3,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],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["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],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},W_e=o(function(e){return e.type==="ordgroup"?e.body.length:1},"groupLength"),H_e=o(function(e,r){function n(){var l=4e5,u=e.label.slice(1);if(["widehat","widecheck","widetilde","utilde"].includes(u)){var h=e,f=W_e(h.base),d,p,m;if(f>5)u==="widehat"||u==="widecheck"?(d=420,l=2364,m=.42,p=u+"4"):(d=312,l=2340,m=.34,p="tilde4");else{var g=[1,1,2,2,3,3][f];u==="widehat"||u==="widecheck"?(l=[0,1062,2364,2364,2364][g],d=[0,239,300,360,420][g],m=[0,.24,.3,.3,.36,.42][g],p=u+g):(l=[0,600,1033,2339,2340][g],d=[0,260,286,306,312][g],m=[0,.26,.286,.3,.306,.34][g],p="tilde"+g)}var y=new Uc(p),v=new Zl([y],{width:"100%",height:_t(m),viewBox:"0 0 "+l+" "+d,preserveAspectRatio:"none"});return{span:He.makeSvgSpan([],[v],r),minWidth:0,height:m}}else{var x=[],b=U_e[u],[T,E,w]=b,k=w/1e3,S=T.length,A,L;if(S===1){var I=b[3];A=["hide-tail"],L=[I]}else if(S===2)A=["halfarrow-left","halfarrow-right"],L=["xMinYMin","xMaxYMin"];else if(S===3)A=["brace-left","brace-center","brace-right"],L=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support - `+S+" children.");for(var N=0;N0&&(i.style.minWidth=_t(a)),i},"svgSpan"),Y_e=o(function(e,r,n,i,a){var s,l=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=He.makeSpan(["stretchy",r],[],a),r==="fbox"){var u=a.color&&a.getColor();u&&(s.style.borderColor=u)}}else{var h=[];/^[bx]cancel$/.test(r)&&h.push(new I2({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&h.push(new I2({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var f=new Zl(h,{width:"100%",height:_t(l)});s=He.makeSvgSpan([],[f],a)}return s.height=l,s.style.height=_t(l),s},"encloseSpan"),lh={encloseSpan:Y_e,mathMLnode:q_e,svgSpan:H_e};o(Ir,"assertNodeType");o(rD,"assertSymbolNodeType");o(Cw,"checkSymbolNodeType");nD=o((t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=Ir(t.base,"accent"),r=n.base,t.base=r,i=y_e(rn(t,e)),t.base=n):(n=Ir(t,"accent"),r=n.base);var a=rn(r,e.havingCrampedStyle()),s=n.isShifty&&un.isCharacterBox(r),l=0;if(s){var u=un.getBaseElem(r),h=rn(u,e.havingCrampedStyle());l=zY(h).skew}var f=n.label==="\\c",d=f?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),p;if(n.isStretchy)p=lh.svgSpan(n,e),p=He.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:p,wrapperClasses:["svg-align"],wrapperStyle:l>0?{width:"calc(100% - "+_t(2*l)+")",marginLeft:_t(2*l)}:void 0}]},e);else{var m,g;n.label==="\\vec"?(m=He.staticSvg("vec",e),g=He.svgData.vec[1]):(m=He.makeOrd({mode:n.mode,text:n.label},e,"textord"),m=zY(m),m.italic=0,g=m.width,f&&(d+=m.depth)),p=He.makeSpan(["accent-body"],[m]);var y=n.label==="\\textcircled";y&&(p.classes.push("accent-full"),d=a.height);var v=l;y||(v-=g/2),p.style.left=_t(v),n.label==="\\textcircled"&&(p.style.top=".2em"),p=He.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-d},{type:"elem",elem:p}]},e)}var x=He.makeSpan(["mord","accent"],[p],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},"htmlBuilder$a"),Rj=o((t,e)=>{var r=t.isStretchy?lh.mathMLnode(t.label):new vt.MathNode("mo",[ml(t.label,t.mode)]),n=new vt.MathNode("mover",[Mn(t.base,e),r]);return n.setAttribute("accent","true"),n},"mathmlBuilder$9"),j_e=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));Ot({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:o((t,e)=>{var r=Tw(e[0]),n=!j_e.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},"handler"),htmlBuilder:nD,mathmlBuilder:Rj});Ot({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:o((t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},"handler"),htmlBuilder:nD,mathmlBuilder:Rj});Ot({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},"handler"),htmlBuilder:o((t,e)=>{var r=rn(t.base,e),n=lh.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=He.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return He.makeSpan(["mord","accentunder"],[a],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=lh.mathMLnode(t.label),n=new vt.MathNode("munder",[Mn(t.base,e),r]);return n.setAttribute("accentunder","true"),n},"mathmlBuilder")});fw=o(t=>{var e=new vt.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e},"paddedNode");Ot({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=He.wrapFragment(rn(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=He.wrapFragment(rn(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var l=lh.svgSpan(t,e),u=-e.fontMetrics().axisHeight+.5*l.height,h=-e.fontMetrics().axisHeight-.5*l.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(h-=i.depth);var f;if(s){var d=-e.fontMetrics().axisHeight+s.height+.5*l.height+.111;f=He.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u},{type:"elem",elem:s,shift:d}]},e)}else f=He.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u}]},e);return f.children[0].children[0].children[1].classes.push("svg-align"),He.makeSpan(["mrel","x-arrow"],[f],e)},mathmlBuilder(t,e){var r=lh.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=fw(Mn(t.body,e));if(t.below){var a=fw(Mn(t.below,e));n=new vt.MathNode("munderover",[r,a,i])}else n=new vt.MathNode("mover",[r,i])}else if(t.below){var s=fw(Mn(t.below,e));n=new vt.MathNode("munder",[r,s])}else n=fw(),n=new vt.MathNode("mover",[r,n]);return n}});X_e=He.makeSpan;o(Lj,"htmlBuilder$9");o(Nj,"mathmlBuilder$8");Ot({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:Oi(i),isCharacterBox:un.isCharacterBox(i)}},htmlBuilder:Lj,mathmlBuilder:Nj});Aw=o(t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"},"binrelClass");Ot({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:Aw(e[0]),body:Oi(e[1]),isCharacterBox:un.isCharacterBox(e[1])}}});Ot({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=Aw(i):s="mrel";var l={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:Oi(i)},u={type:"supsub",mode:a.mode,base:l,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[u],isCharacterBox:un.isCharacterBox(u)}},htmlBuilder:Lj,mathmlBuilder:Nj});Ot({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:Aw(e[0]),body:Oi(e[0])}},htmlBuilder(t,e){var r=ea(t.body,e,!0),n=He.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=Js(t.body,e),n=new vt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});K_e={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},HY=o(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),YY=o(t=>t.type==="textord"&&t.text==="@","isStartOfArrow"),Q_e=o((t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e,"isLabelEnd");o(Z_e,"cdArrow");o(J_e,"parseCD");Ot({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=He.wrapFragment(rn(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=_t(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new vt.MathNode("mrow",[Mn(t.label,e)]);return r=new vt.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new vt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});Ot({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=He.wrapFragment(rn(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new vt.MathNode("mrow",[Mn(t.fragment,e)])}});Ot({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=Ir(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new bt("\\@char with invalid code point "+a);return u<=65535?h=String.fromCharCode(u):(u-=65536,h=String.fromCharCode((u>>10)+55296,(u&1023)+56320)),{type:"textord",mode:r.mode,text:h}}});Mj=o((t,e)=>{var r=ea(t.body,e.withColor(t.color),!1);return He.makeFragment(r)},"htmlBuilder$8"),Ij=o((t,e)=>{var r=Js(t.body,e.withColor(t.color)),n=new vt.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n},"mathmlBuilder$7");Ot({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=Ir(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:Oi(i)}},htmlBuilder:Mj,mathmlBuilder:Ij});Ot({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=Ir(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:Mj,mathmlBuilder:Ij});Ot({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&Ir(i,"size").value}},htmlBuilder(t,e){var r=He.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=_t(bi(t.size,e)))),r},mathmlBuilder(t,e){var r=new vt.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",_t(bi(t.size,e)))),r}});H8={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Oj=o(t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new bt("Expected a control sequence",t);return e},"checkControlSequence"),e8e=o(t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},"getRHS"),Pj=o((t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)},"letCommand");Ot({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(H8[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=H8[n.text]),Ir(e.parseFunction(),"internal");throw new bt("Invalid token after macro prefix",n)}});Ot({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new bt("Expected a control sequence",n);for(var a=0,s,l=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),l[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new bt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new bt('Argument number "'+n.text+'" out of order');a++,l.push([])}else{if(n.text==="EOF")throw new bt("Expected a macro definition");l[a].push(n.text)}var{tokens:u}=e.gullet.consumeArg();return s&&u.unshift(s),(r==="\\edef"||r==="\\xdef")&&(u=e.gullet.expandTokens(u),u.reverse()),e.gullet.macros.set(i,{tokens:u,numArgs:a,delimiters:l},r===H8[r]),{type:"internal",mode:e.mode}}});Ot({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=Oj(e.gullet.popToken());e.gullet.consumeSpaces();var i=e8e(e);return Pj(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});Ot({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=Oj(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return Pj(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});_2=o(function(e,r,n){var i=qn.math[e]&&qn.math[e].replace,a=Z8(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},"getMetrics"),iD=o(function(e,r,n,i){var a=n.havingBaseStyle(r),s=He.makeSpan(i.concat(a.sizingClasses(n)),[e],n),l=a.sizeMultiplier/n.sizeMultiplier;return s.height*=l,s.depth*=l,s.maxFontSize=a.sizeMultiplier,s},"styleWrap"),Bj=o(function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=_t(a),e.height-=a,e.depth+=a},"centerSpan"),t8e=o(function(e,r,n,i,a,s){var l=He.makeSymbol(e,"Main-Regular",a,i),u=iD(l,r,i,s);return n&&Bj(u,i,r),u},"makeSmallDelim"),r8e=o(function(e,r,n,i){return He.makeSymbol(e,"Size"+r+"-Regular",n,i)},"mathrmSize"),Fj=o(function(e,r,n,i,a,s){var l=r8e(e,r,a,i),u=iD(He.makeSpan(["delimsizing","size"+r],[l],i),dr.TEXT,i,s);return n&&Bj(u,i,dr.TEXT),u},"makeLargeDelim"),R8=o(function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=He.makeSpan(["delimsizinginner",i],[He.makeSpan([],[He.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},"makeGlyphSpan"),L8=o(function(e,r,n){var i=qc["Size4-Regular"][e.charCodeAt(0)]?qc["Size4-Regular"][e.charCodeAt(0)][4]:qc["Size1-Regular"][e.charCodeAt(0)][4],a=new Uc("inner",u_e(e,Math.round(1e3*r))),s=new Zl([a],{width:_t(i),height:_t(r),style:"width:"+_t(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),l=He.makeSvgSpan([],[s],n);return l.height=r,l.style.height=_t(r),l.style.width=_t(i),{type:"elem",elem:l}},"makeInner"),Y8=.008,dw={type:"kern",size:-1*Y8},n8e=["|","\\lvert","\\rvert","\\vert"],i8e=["\\|","\\lVert","\\rVert","\\Vert"],$j=o(function(e,r,n,i,a,s){var l,u,h,f,d="",p=0;l=h=f=e,u=null;var m="Size1-Regular";e==="\\uparrow"?h=f="\u23D0":e==="\\Uparrow"?h=f="\u2016":e==="\\downarrow"?l=h="\u23D0":e==="\\Downarrow"?l=h="\u2016":e==="\\updownarrow"?(l="\\uparrow",h="\u23D0",f="\\downarrow"):e==="\\Updownarrow"?(l="\\Uparrow",h="\u2016",f="\\Downarrow"):n8e.includes(e)?(h="\u2223",d="vert",p=333):i8e.includes(e)?(h="\u2225",d="doublevert",p=556):e==="["||e==="\\lbrack"?(l="\u23A1",h="\u23A2",f="\u23A3",m="Size4-Regular",d="lbrack",p=667):e==="]"||e==="\\rbrack"?(l="\u23A4",h="\u23A5",f="\u23A6",m="Size4-Regular",d="rbrack",p=667):e==="\\lfloor"||e==="\u230A"?(h=l="\u23A2",f="\u23A3",m="Size4-Regular",d="lfloor",p=667):e==="\\lceil"||e==="\u2308"?(l="\u23A1",h=f="\u23A2",m="Size4-Regular",d="lceil",p=667):e==="\\rfloor"||e==="\u230B"?(h=l="\u23A5",f="\u23A6",m="Size4-Regular",d="rfloor",p=667):e==="\\rceil"||e==="\u2309"?(l="\u23A4",h=f="\u23A5",m="Size4-Regular",d="rceil",p=667):e==="("||e==="\\lparen"?(l="\u239B",h="\u239C",f="\u239D",m="Size4-Regular",d="lparen",p=875):e===")"||e==="\\rparen"?(l="\u239E",h="\u239F",f="\u23A0",m="Size4-Regular",d="rparen",p=875):e==="\\{"||e==="\\lbrace"?(l="\u23A7",u="\u23A8",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(l="\u23AB",u="\u23AC",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(l="\u23A7",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(l="\u23AB",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(l="\u23A7",f="\u23AD",h="\u23AA",m="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(l="\u23AB",f="\u23A9",h="\u23AA",m="Size4-Regular");var g=_2(l,m,a),y=g.height+g.depth,v=_2(h,m,a),x=v.height+v.depth,b=_2(f,m,a),T=b.height+b.depth,E=0,w=1;if(u!==null){var k=_2(u,m,a);E=k.height+k.depth,w=2}var S=y+T+E,A=Math.max(0,Math.ceil((r-S)/(w*x))),L=S+A*w*x,I=i.fontMetrics().axisHeight;n&&(I*=i.sizeMultiplier);var N=L/2-I,C=[];if(d.length>0){var _=L-y-T,D=Math.round(L*1e3),M=h_e(d,Math.round(_*1e3)),R=new Uc(d,M),P=(p/1e3).toFixed(3)+"em",B=(D/1e3).toFixed(3)+"em",F=new Zl([R],{width:P,height:B,viewBox:"0 0 "+p+" "+D}),G=He.makeSvgSpan([],[F],i);G.height=D/1e3,G.style.width=P,G.style.height=B,C.push({type:"elem",elem:G})}else{if(C.push(R8(f,m,a)),C.push(dw),u===null){var $=L-y-T+2*Y8;C.push(L8(h,$,i))}else{var V=(L-y-T-E)/2+2*Y8;C.push(L8(h,V,i)),C.push(dw),C.push(R8(u,m,a)),C.push(dw),C.push(L8(h,V,i))}C.push(dw),C.push(R8(l,m,a))}var X=i.havingBaseStyle(dr.TEXT),Q=He.makeVList({positionType:"bottom",positionData:N,children:C},X);return iD(He.makeSpan(["delimsizing","mult"],[Q],X),dr.TEXT,i,s)},"makeStackedDelim"),N8=80,M8=.08,I8=o(function(e,r,n,i,a){var s=c_e(e,i,n),l=new Uc(e,s),u=new Zl([l],{width:"400em",height:_t(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return He.makeSvgSpan(["hide-tail"],[u],a)},"sqrtSvg"),a8e=o(function(e,r){var n=r.havingBaseSizing(),i=qj("\\surd",e*n.sizeMultiplier,Vj,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),l,u=0,h=0,f=0,d;return i.type==="small"?(f=1e3+1e3*s+N8,e<1?a=1:e<1.4&&(a=.7),u=(1+s+M8)/a,h=(1+s)/a,l=I8("sqrtMain",u,f,s,r),l.style.minWidth="0.853em",d=.833/a):i.type==="large"?(f=(1e3+N8)*R2[i.size],h=(R2[i.size]+s)/a,u=(R2[i.size]+s+M8)/a,l=I8("sqrtSize"+i.size,u,f,s,r),l.style.minWidth="1.02em",d=1/a):(u=e+s+M8,h=e+s,f=Math.floor(1e3*e+s)+N8,l=I8("sqrtTall",u,f,s,r),l.style.minWidth="0.742em",d=1.056),l.height=h,l.style.height=_t(u),{span:l,advanceWidth:d,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},"makeSqrtImage"),zj=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],s8e=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],Gj=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],R2=[0,1.2,1.8,2.4,3],o8e=o(function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),zj.includes(e)||Gj.includes(e))return Fj(e,r,!1,n,i,a);if(s8e.includes(e))return $j(e,R2[r],!1,n,i,a);throw new bt("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),l8e=[{type:"small",style:dr.SCRIPTSCRIPT},{type:"small",style:dr.SCRIPT},{type:"small",style:dr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],c8e=[{type:"small",style:dr.SCRIPTSCRIPT},{type:"small",style:dr.SCRIPT},{type:"small",style:dr.TEXT},{type:"stack"}],Vj=[{type:"small",style:dr.SCRIPTSCRIPT},{type:"small",style:dr.SCRIPT},{type:"small",style:dr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],u8e=o(function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),qj=o(function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},"traverseSequence"),Uj=o(function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var l;Gj.includes(e)?l=l8e:zj.includes(e)?l=Vj:l=c8e;var u=qj(e,r,l,i);return u.type==="small"?t8e(e,u.style,n,i,a,s):u.type==="large"?Fj(e,u.size,n,i,a,s):$j(e,r,n,i,a,s)},"makeCustomSizedDelim"),h8e=o(function(e,r,n,i,a,s){var l=i.fontMetrics().axisHeight*i.sizeMultiplier,u=901,h=5/i.fontMetrics().ptPerEm,f=Math.max(r-l,n+l),d=Math.max(f/500*u,2*f-h);return Uj(e,d,!0,i,a,s)},"makeLeftRightDelim"),sh={sqrtImage:a8e,sizedDelim:o8e,sizeToMaxHeight:R2,customSizedDelim:Uj,leftRightDelim:h8e},jY={"\\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}},f8e=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];o(_w,"checkDelimiter");Ot({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:o((t,e)=>{var r=_w(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:jY[t.funcName].size,mclass:jY[t.funcName].mclass,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>t.delim==="."?He.makeSpan([t.mclass]):sh.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),"htmlBuilder"),mathmlBuilder:o(t=>{var e=[];t.delim!=="."&&e.push(ml(t.delim,t.mode));var r=new vt.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=_t(sh.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r},"mathmlBuilder")});o(XY,"assertParsed");Ot({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new bt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:_w(e[0],t).text,color:r}},"handler")});Ot({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=_w(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=Ir(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},"handler"),htmlBuilder:o((t,e)=>{XY(t);for(var r=ea(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{XY(t);var r=Js(t.body,e);if(t.left!=="."){var n=new vt.MathNode("mo",[ml(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new vt.MathNode("mo",[ml(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return eD(r)},"mathmlBuilder")});Ot({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=_w(e[0],t);if(!t.parser.leftrightDepth)throw new bt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>{var r;if(t.delim===".")r=O2(e,[]);else{r=sh.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?ml("|","text"):ml(t.delim,t.mode),n=new vt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n},"mathmlBuilder")});aD=o((t,e)=>{var r=He.wrapFragment(rn(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,l=un.isCharacterBox(t.body);if(n==="sout")a=He.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var u=bi({number:.6,unit:"pt"},e),h=bi({number:.35,unit:"ex"},e),f=e.havingBaseSizing();i=i/f.sizeMultiplier;var d=r.height+r.depth+u+h;r.style.paddingLeft=_t(d/2+u);var p=Math.floor(1e3*d*i),m=o_e(p),g=new Zl([new Uc("phase",m)],{width:"400em",height:_t(p/1e3),viewBox:"0 0 400000 "+p,preserveAspectRatio:"xMinYMin slice"});a=He.makeSvgSpan(["hide-tail"],[g],e),a.style.height=_t(d),s=r.depth+u+h}else{/cancel/.test(n)?l||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var y=0,v=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),y=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),v=y):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),y=4*x,v=Math.max(0,.25-r.depth)):(y=l?.2:0,v=y),a=lh.encloseSpan(r,n,y,v,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=_t(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=_t(x),a.style.borderRightWidth=_t(x)),s=r.depth+v,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=He.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var T=/cancel|phase/.test(n)?["svg-align"]:[];b=He.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:T}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!l?He.makeSpan(["mord","cancel-lap"],[b],e):He.makeSpan(["mord"],[b],e)},"htmlBuilder$7"),sD=o((t,e)=>{var r=0,n=new vt.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[Mn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n},"mathmlBuilder$6");Ot({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=Ir(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:aD,mathmlBuilder:sD});Ot({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=Ir(e[0],"color-token").color,s=Ir(e[1],"color-token").color,l=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:l}},htmlBuilder:aD,mathmlBuilder:sD});Ot({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});Ot({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:aD,mathmlBuilder:sD});Ot({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});Wj={};o(Wc,"defineEnvironment");Hj={};o(ue,"defineMacro");o(KY,"getHLines");Dw=o(t=>{var e=t.parser.settings;if(!e.displayMode)throw new bt("{"+t.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext");o(oD,"getAutoTag");o(kf,"parseArray");o(lD,"dCellStyle");Hc=o(function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,l=0,u=new Array(a),h=[],f=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),d=1/r.fontMetrics().ptPerEm,p=5*d;if(e.colSeparationType&&e.colSeparationType==="small"){var m=r.havingStyle(dr.SCRIPT).sizeMultiplier;p=.2778*(m/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?bi({number:3,unit:"ex"},r):12*d,y=3*d,v=e.arraystretch*g,x=.7*v,b=.3*v,T=0;function E(we){for(var _e=0;_e0&&(T+=.25),h.push({pos:T,isDashed:we[_e]})}for(o(E,"setHLinePos"),E(s[0]),n=0;n0&&(N+=b,Swe))for(n=0;n=l)){var Y=void 0;(i>0||e.hskipBeforeAndAfter)&&(Y=un.deflt(V.pregap,p),Y!==0&&(M=He.makeSpan(["arraycolsep"],[]),M.style.width=_t(Y),D.push(M)));var le=[];for(n=0;n0){for(var Z=He.makeLineSpan("hline",r,f),xe=He.makeLineSpan("hdashline",r,f),de=[{type:"elem",elem:u,shift:0}];h.length>0;){var Se=h.pop(),Me=Se.pos-C;Se.isDashed?de.push({type:"elem",elem:xe,shift:Me}):de.push({type:"elem",elem:Z,shift:Me})}u=He.makeVList({positionType:"individualShift",children:de},r)}if(P.length===0)return He.makeSpan(["mord"],[u],r);var ke=He.makeVList({positionType:"individualShift",children:P},r);return ke=He.makeSpan(["tag"],[ke],r),He.makeFragment([u,ke])},"htmlBuilder"),d8e={c:"center ",l:"left ",r:"right "},Yc=o(function(e,r){for(var n=[],i=new vt.MathNode("mtd",[],["mtr-glue"]),a=new vt.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,y="",v=!1,x=0,b=g.length;g[0].type==="separator"&&(p+="top ",x=1),g[g.length-1].type==="separator"&&(p+="bottom ",b-=1);for(var T=x;T0?"left ":"",p+=A[A.length-1].length>0?"right ":"";for(var L=1;L-1?"alignat":"align",a=e.envName==="split",s=kf(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:oD(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),l,u=0,h={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var f="",d=0;d0&&m&&(v=1),n[g]={type:"align",align:y,pregap:v,postgap:0}}return s.colSeparationType=m?"align":"alignat",s},"alignedHandler");Wc({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=Cw(e[0]),n=r?[e[0]]:Ir(e[0],"ordgroup").body,i=n.map(function(s){var l=rD(s),u=l.text;if("lcr".indexOf(u)!==-1)return{type:"align",align:u};if(u==="|")return{type:"separator",separator:"|"};if(u===":")return{type:"separator",separator:":"};throw new bt("Unknown column alignment: "+u,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return kf(t.parser,a,lD(t.envName))},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new bt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=kf(t.parser,n,lD(t.envName)),s=Math.max(0,...a.body.map(l=>l.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=kf(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=Cw(e[0]),n=r?[e[0]]:Ir(e[0],"ordgroup").body,i=n.map(function(s){var l=rD(s),u=l.text;if("lc".indexOf(u)!==-1)return{type:"align",align:u};throw new bt("Unknown column alignment: "+u,s)});if(i.length>1)throw new bt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=kf(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new bt("{subarray} can contain only one column");return a},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=kf(t.parser,e,lD(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Yj,htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){["gather","gather*"].includes(t.envName)&&Dw(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:oD(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return kf(t.parser,e,"display")},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Yj,htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){Dw(t);var e={autoTag:oD(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return kf(t.parser,e,"display")},htmlBuilder:Hc,mathmlBuilder:Yc});Wc({type:"array",names:["CD"],props:{numArgs:0},handler(t){return Dw(t),J_e(t.parser)},htmlBuilder:Hc,mathmlBuilder:Yc});ue("\\nonumber","\\gdef\\@eqnsw{0}");ue("\\notag","\\nonumber");Ot({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new bt(t.funcName+" valid only within array environment")}});QY=Wj;Ot({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new bt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return rn(t.body,n)},"htmlBuilder$5"),Xj=o((t,e)=>{var r=t.font,n=e.withFont(r);return Mn(t.body,n)},"mathmlBuilder$4"),ZY={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};Ot({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=Tw(e[0]),a=n;return a in ZY&&(a=ZY[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},"handler"),htmlBuilder:jj,mathmlBuilder:Xj});Ot({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r}=t,n=e[0],i=un.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:Aw(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}},"handler")});Ot({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),l="math"+n.slice(1);return{type:"font",mode:a,font:l,body:{type:"ordgroup",mode:r.mode,body:s}}},"handler"),htmlBuilder:jj,mathmlBuilder:Xj});Kj=o((t,e)=>{var r=e;return t==="display"?r=r.id>=dr.SCRIPT.id?r.text():dr.DISPLAY:t==="text"&&r.size===dr.DISPLAY.size?r=dr.TEXT:t==="script"?r=dr.SCRIPT:t==="scriptscript"&&(r=dr.SCRIPTSCRIPT),r},"adjustStyle"),cD=o((t,e)=>{var r=Kj(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=rn(t.numer,a,e);if(t.continued){var l=8.5/e.fontMetrics().ptPerEm,u=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*p:g=7*p,y=e.fontMetrics().denom1):(d>0?(m=e.fontMetrics().num2,g=p):(m=e.fontMetrics().num3,g=3*p),y=e.fontMetrics().denom2);var v;if(f){var b=e.fontMetrics().axisHeight;m-s.depth-(b+.5*d){var r=new vt.MathNode("mfrac",[Mn(t.numer,e),Mn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=bi(t.barSize,e);r.setAttribute("linethickness",_t(n))}var i=Kj(t.size,e.style);if(i.size!==e.style.size){r=new vt.MathNode("mstyle",[r]);var a=i.size===dr.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var l=new vt.MathNode("mo",[new vt.TextNode(t.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}if(s.push(r),t.rightDelim!=null){var u=new vt.MathNode("mo",[new vt.TextNode(t.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),s.push(u)}return eD(s)}return r},"mathmlBuilder$3");Ot({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,l=null,u=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,l="(",u=")";break;case"\\\\bracefrac":s=!1,l="\\{",u="\\}";break;case"\\\\brackfrac":s=!1,l="[",u="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:l,rightDelim:u,size:h,barSize:null}},"handler"),htmlBuilder:cD,mathmlBuilder:uD});Ot({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")});Ot({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});JY=["display","text","script","scriptscript"],ej=o(function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r},"delimFromValue");Ot({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=Tw(e[0]),s=a.type==="atom"&&a.family==="open"?ej(a.text):null,l=Tw(e[1]),u=l.type==="atom"&&l.family==="close"?ej(l.text):null,h=Ir(e[2],"size"),f,d=null;h.isBlank?f=!0:(d=h.value,f=d.number>0);var p="auto",m=e[3];if(m.type==="ordgroup"){if(m.body.length>0){var g=Ir(m.body[0],"textord");p=JY[Number(g.text)]}}else m=Ir(m,"textord"),p=JY[Number(m.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:f,barSize:d,leftDelim:s,rightDelim:u,size:p}},htmlBuilder:cD,mathmlBuilder:uD});Ot({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ir(e[0],"size").value,token:i}}});Ot({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=H7e(Ir(e[1],"infix").size),s=e[2],l=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:l,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},"handler"),htmlBuilder:cD,mathmlBuilder:uD});Qj=o((t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?rn(t.sup,e.havingStyle(r.sup()),e):rn(t.sub,e.havingStyle(r.sub()),e),i=Ir(t.base,"horizBrace")):i=Ir(t,"horizBrace");var a=rn(i.base,e.havingBaseStyle(dr.DISPLAY)),s=lh.svgSpan(i,e),l;if(i.isOver?(l=He.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),l.children[0].children[0].children[1].classes.push("svg-align")):(l=He.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),l.children[0].children[0].children[0].classes.push("svg-align")),n){var u=He.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e);i.isOver?l=He.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:u},{type:"kern",size:.2},{type:"elem",elem:n}]},e):l=He.makeVList({positionType:"bottom",positionData:u.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:u}]},e)}return He.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e)},"htmlBuilder$3"),p8e=o((t,e)=>{var r=lh.mathMLnode(t.label);return new vt.MathNode(t.isOver?"mover":"munder",[Mn(t.base,e),r])},"mathmlBuilder$2");Ot({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:Qj,mathmlBuilder:p8e});Ot({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[1],i=Ir(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:Oi(n)}:r.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:o((t,e)=>{var r=ea(t.body,e,!1);return He.makeAnchor(t.href,[],r,e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=wf(t.body,e);return r instanceof Es||(r=new Es("mrow",[r])),r.setAttribute("href",t.href),r},"mathmlBuilder")});Ot({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=Ir(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=Ir(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l,u={};switch(n){case"\\htmlClass":u.class=a,l={command:"\\htmlClass",class:a};break;case"\\htmlId":u.id=a,l={command:"\\htmlId",id:a};break;case"\\htmlStyle":u.style=a,l={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var h=a.split(","),f=0;f{var r=ea(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=He.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},"htmlBuilder"),mathmlBuilder:o((t,e)=>wf(t.body,e),"mathmlBuilder")});Ot({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:Oi(e[0]),mathml:Oi(e[1])}},"handler"),htmlBuilder:o((t,e)=>{var r=ea(t.html,e,!1);return He.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>wf(t.mathml,e),"mathmlBuilder")});O8=o(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new bt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!gj(n))throw new bt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n},"sizeData");Ot({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:o((t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var u=Ir(r[0],"raw").string,h=u.split(","),f=0;f{var r=bi(t.height,e),n=0;t.totalheight.number>0&&(n=bi(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=bi(t.width,e));var a={height:_t(r+n)};i>0&&(a.width=_t(i)),n>0&&(a.verticalAlign=_t(-n));var s=new G8(t.src,t.alt,a);return s.height=r,s.depth=n,s},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new vt.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=bi(t.height,e),i=0;if(t.totalheight.number>0&&(i=bi(t.totalheight,e)-n,r.setAttribute("valign",_t(-i))),r.setAttribute("height",_t(n+i)),t.width.number>0){var a=bi(t.width,e);r.setAttribute("width",_t(a))}return r.setAttribute("src",t.src),r},"mathmlBuilder")});Ot({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=Ir(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return He.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=bi(t.dimension,e);return new vt.SpaceNode(r)}});Ot({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},"handler"),htmlBuilder:o((t,e)=>{var r;t.alignment==="clap"?(r=He.makeSpan([],[rn(t.body,e)]),r=He.makeSpan(["inner"],[r],e)):r=He.makeSpan(["inner"],[rn(t.body,e)]);var n=He.makeSpan(["fix"],[]),i=He.makeSpan([t.alignment],[r,n],e),a=He.makeSpan(["strut"]);return a.style.height=_t(i.height+i.depth),i.depth&&(a.style.verticalAlign=_t(-i.depth)),i.children.unshift(a),i=He.makeSpan(["thinbox"],[i],e),He.makeSpan(["mord","vbox"],[i],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new vt.MathNode("mpadded",[Mn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r},"mathmlBuilder")});Ot({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});Ot({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new bt("Mismatched "+t.funcName)}});tj=o((t,e)=>{switch(e.style.size){case dr.DISPLAY.size:return t.display;case dr.TEXT.size:return t.text;case dr.SCRIPT.size:return t.script;case dr.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}},"chooseMathStyle");Ot({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:Oi(e[0]),text:Oi(e[1]),script:Oi(e[2]),scriptscript:Oi(e[3])}},"handler"),htmlBuilder:o((t,e)=>{var r=tj(t,e),n=ea(r,e,!1);return He.makeFragment(n)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=tj(t,e);return wf(r,e)},"mathmlBuilder")});Zj=o((t,e,r,n,i,a,s)=>{t=He.makeSpan([],[t]);var l=r&&un.isCharacterBox(r),u,h;if(e){var f=rn(e,n.havingStyle(i.sup()),n);h={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-f.depth)}}if(r){var d=rn(r,n.havingStyle(i.sub()),n);u={elem:d,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-d.height)}}var p;if(h&&u){var m=n.fontMetrics().bigOpSpacing5+u.elem.height+u.elem.depth+u.kern+t.depth+s;p=He.makeVList({positionType:"bottom",positionData:m,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:_t(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:_t(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(u){var g=t.height-s;p=He.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:_t(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t}]},n)}else if(h){var y=t.depth+s;p=He.makeVList({positionType:"bottom",positionData:y,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:_t(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var v=[p];if(u&&a!==0&&!l){var x=He.makeSpan(["mspace"],[],n);x.style.marginRight=_t(a),v.unshift(x)}return He.makeSpan(["mop","op-limits"],v,n)},"assembleSupSub"),Jj=["\\smallint"],mg=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=Ir(t.base,"op"),i=!0):a=Ir(t,"op");var s=e.style,l=!1;s.size===dr.DISPLAY.size&&a.symbol&&!Jj.includes(a.name)&&(l=!0);var u;if(a.symbol){var h=l?"Size2-Regular":"Size1-Regular",f="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(f=a.name.slice(1),a.name=f==="oiint"?"\\iint":"\\iiint"),u=He.makeSymbol(a.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),f.length>0){var d=u.italic,p=He.staticSvg(f+"Size"+(l?"2":"1"),e);u=He.makeVList({positionType:"individualShift",children:[{type:"elem",elem:u,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),a.name="\\"+f,u.classes.unshift("mop"),u.italic=d}}else if(a.body){var m=ea(a.body,e,!0);m.length===1&&m[0]instanceof Zs?(u=m[0],u.classes[0]="mop"):u=He.makeSpan(["mop"],m,e)}else{for(var g=[],y=1;y{var r;if(t.symbol)r=new Es("mo",[ml(t.name,t.mode)]),Jj.includes(t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new Es("mo",Js(t.body,e));else{r=new Es("mi",[new pl(t.name.slice(1))]);var n=new Es("mo",[ml("\u2061","text")]);t.parentIsSupSub?r=new Es("mrow",[r,n]):r=Aj([r,n])}return r},"mathmlBuilder$1"),m8e={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};Ot({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=m8e[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},"handler"),htmlBuilder:mg,mathmlBuilder:P2});Ot({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Oi(n)}},"handler"),htmlBuilder:mg,mathmlBuilder:P2});g8e={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};Ot({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:mg,mathmlBuilder:P2});Ot({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:mg,mathmlBuilder:P2});Ot({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=g8e[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:mg,mathmlBuilder:P2});eX=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=Ir(t.base,"operatorname"),i=!0):a=Ir(t,"operatorname");var s;if(a.body.length>0){for(var l=a.body.map(d=>{var p=d.text;return typeof p=="string"?{type:"textord",mode:d.mode,text:p}:d}),u=ea(l,e.withFont("mathrm"),!0),h=0;h{for(var r=Js(t.body,e.withFont("mathrm")),n=!0,i=0;if.toText()).join("");r=[new vt.TextNode(l)]}var u=new vt.MathNode("mi",r);u.setAttribute("mathvariant","normal");var h=new vt.MathNode("mo",[ml("\u2061","text")]);return t.parentIsSupSub?new vt.MathNode("mrow",[u,h]):vt.newDocumentFragment([u,h])},"mathmlBuilder");Ot({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:Oi(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:eX,mathmlBuilder:y8e});ue("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");Mp({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?He.makeFragment(ea(t.body,e,!1)):He.makeSpan(["mord"],ea(t.body,e,!0),e)},mathmlBuilder(t,e){return wf(t.body,e,!0)}});Ot({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=rn(t.body,e.havingCrampedStyle()),n=He.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=He.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return He.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new vt.MathNode("mo",[new vt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new vt.MathNode("mover",[Mn(t.body,e),r]);return n.setAttribute("accent","true"),n}});Ot({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:Oi(n)}},"handler"),htmlBuilder:o((t,e)=>{var r=ea(t.body,e.withPhantom(),!1);return He.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Js(t.body,e);return new vt.MathNode("mphantom",r)},"mathmlBuilder")});Ot({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=He.makeSpan([],[rn(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=Js(Oi(t.body),e),n=new vt.MathNode("mphantom",r),i=new vt.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i},"mathmlBuilder")});Ot({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=He.makeSpan(["inner"],[rn(t.body,e.withPhantom())]),n=He.makeSpan(["fix"],[]);return He.makeSpan(["mord","rlap"],[r,n],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Js(Oi(t.body),e),n=new vt.MathNode("mphantom",r),i=new vt.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i},"mathmlBuilder")});Ot({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=Ir(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=rn(t.body,e),n=bi(t.dy,e);return He.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new vt.MathNode("mpadded",[Mn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});Ot({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});Ot({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=Ir(e[0],"size"),s=Ir(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&Ir(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=He.makeSpan(["mord","rule"],[],e),n=bi(t.width,e),i=bi(t.height,e),a=t.shift?bi(t.shift,e):0;return r.style.borderRightWidth=_t(n),r.style.borderTopWidth=_t(i),r.style.bottom=_t(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=bi(t.width,e),n=bi(t.height,e),i=t.shift?bi(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new vt.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",_t(r)),s.setAttribute("height",_t(n));var l=new vt.MathNode("mpadded",[s]);return i>=0?l.setAttribute("height",_t(i)):(l.setAttribute("height",_t(i)),l.setAttribute("depth",_t(-i))),l.setAttribute("voffset",_t(i)),l}});o(tX,"sizingGroup");rj=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],v8e=o((t,e)=>{var r=e.havingSize(t.size);return tX(t.body,r,e)},"htmlBuilder");Ot({type:"sizing",names:rj,props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:rj.indexOf(n)+1,body:a}},"handler"),htmlBuilder:v8e,mathmlBuilder:o((t,e)=>{var r=e.havingSize(t.size),n=Js(t.body,r),i=new vt.MathNode("mstyle",n);return i.setAttribute("mathsize",_t(r.sizeMultiplier)),i},"mathmlBuilder")});Ot({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:o((t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&Ir(r[0],"ordgroup");if(s)for(var l="",u=0;u{var r=He.makeSpan([],[rn(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new vt.MathNode("mpadded",[Mn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r},"mathmlBuilder")});Ot({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=rn(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=He.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+d-r.height-r.depth)/2);var p=u.height-r.height-s-h;r.style.paddingLeft=_t(f);var m=He.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:u},{type:"kern",size:h}]},e);if(t.index){var g=e.havingStyle(dr.SCRIPTSCRIPT),y=rn(t.index,g,e),v=.6*(m.height-m.depth),x=He.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:y}]},e),b=He.makeSpan(["root"],[x]);return He.makeSpan(["mord","sqrt"],[b,m],e)}else return He.makeSpan(["mord","sqrt"],[m],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new vt.MathNode("mroot",[Mn(r,e),Mn(n,e)]):new vt.MathNode("msqrt",[Mn(r,e)])}});nj={display:dr.DISPLAY,text:dr.TEXT,script:dr.SCRIPT,scriptscript:dr.SCRIPTSCRIPT};Ot({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=nj[t.style],n=e.havingStyle(r).withFont("");return tX(t.body,n,e)},mathmlBuilder(t,e){var r=nj[t.style],n=e.havingStyle(r),i=Js(t.body,n),a=new vt.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},l=s[t.style];return a.setAttribute("scriptlevel",l[0]),a.setAttribute("displaystyle",l[1]),a}});x8e=o(function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===dr.DISPLAY.size||n.alwaysHandleSupSub);return i?mg:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===dr.DISPLAY.size||n.limits);return a?eX:null}else{if(n.type==="accent")return un.isCharacterBox(n.base)?nD:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?Qj:null}else return null}else return null},"htmlBuilderDelegate");Mp({type:"supsub",htmlBuilder(t,e){var r=x8e(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=rn(n,e),l,u,h=e.fontMetrics(),f=0,d=0,p=n&&un.isCharacterBox(n);if(i){var m=e.havingStyle(e.style.sup());l=rn(i,m,e),p||(f=s.height-m.fontMetrics().supDrop*m.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());u=rn(a,g,e),p||(d=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var y;e.style===dr.DISPLAY?y=h.sup1:e.style.cramped?y=h.sup3:y=h.sup2;var v=e.sizeMultiplier,x=_t(.5/h.ptPerEm/v),b=null;if(u){var T=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof Zs||T)&&(b=_t(-s.italic))}var E;if(l&&u){f=Math.max(f,y,l.depth+.25*h.xHeight),d=Math.max(d,h.sub2);var w=h.defaultRuleThickness,k=4*w;if(f-l.depth-(u.height-d)0&&(f+=S,d-=S)}var A=[{type:"elem",elem:u,shift:d,marginRight:x,marginLeft:b},{type:"elem",elem:l,shift:-f,marginRight:x}];E=He.makeVList({positionType:"individualShift",children:A},e)}else if(u){d=Math.max(d,h.sub1,u.height-.8*h.xHeight);var L=[{type:"elem",elem:u,marginLeft:b,marginRight:x}];E=He.makeVList({positionType:"shift",positionData:d,children:L},e)}else if(l)f=Math.max(f,y,l.depth+.25*h.xHeight),E=He.makeVList({positionType:"shift",positionData:-f,children:[{type:"elem",elem:l,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var I=q8(s,"right")||"mord";return He.makeSpan([I],[s,He.makeSpan(["msupsub"],[E])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[Mn(t.base,e)];t.sub&&a.push(Mn(t.sub,e)),t.sup&&a.push(Mn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var h=t.base;h&&h.type==="op"&&h.limits&&e.style===dr.DISPLAY||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(e.style===dr.DISPLAY||h.limits)?s="munderover":s="msubsup"}else{var u=t.base;u&&u.type==="op"&&u.limits&&(e.style===dr.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===dr.DISPLAY)?s="munder":s="msub"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===dr.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===dr.DISPLAY)?s="mover":s="msup"}return new vt.MathNode(s,a)}});Mp({type:"atom",htmlBuilder(t,e){return He.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new vt.MathNode("mo",[ml(t.text,t.mode)]);if(t.family==="bin"){var n=tD(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});rX={mi:"italic",mn:"normal",mtext:"normal"};Mp({type:"mathord",htmlBuilder(t,e){return He.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new vt.MathNode("mi",[ml(t.text,t.mode,e)]),n=tD(t,e)||"italic";return n!==rX[r.type]&&r.setAttribute("mathvariant",n),r}});Mp({type:"textord",htmlBuilder(t,e){return He.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=ml(t.text,t.mode,e),n=tD(t,e)||"normal",i;return t.mode==="text"?i=new vt.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new vt.MathNode("mn",[r]):t.text==="\\prime"?i=new vt.MathNode("mo",[r]):i=new vt.MathNode("mi",[r]),n!==rX[i.type]&&i.setAttribute("mathvariant",n),i}});P8={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},B8={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Mp({type:"spacing",htmlBuilder(t,e){if(B8.hasOwnProperty(t.text)){var r=B8[t.text].className||"";if(t.mode==="text"){var n=He.makeOrd(t,e,"textord");return n.classes.push(r),n}else return He.makeSpan(["mspace",r],[He.mathsym(t.text,t.mode,e)],e)}else{if(P8.hasOwnProperty(t.text))return He.makeSpan(["mspace",P8[t.text]],[],e);throw new bt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(B8.hasOwnProperty(t.text))r=new vt.MathNode("mtext",[new vt.TextNode("\xA0")]);else{if(P8.hasOwnProperty(t.text))return new vt.MathNode("mspace");throw new bt('Unknown type of space "'+t.text+'"')}return r}});ij=o(()=>{var t=new vt.MathNode("mtd",[]);return t.setAttribute("width","50%"),t},"pad");Mp({type:"tag",mathmlBuilder(t,e){var r=new vt.MathNode("mtable",[new vt.MathNode("mtr",[ij(),new vt.MathNode("mtd",[wf(t.body,e)]),ij(),new vt.MathNode("mtd",[wf(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});aj={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},sj={"\\textbf":"textbf","\\textmd":"textmd"},b8e={"\\textit":"textit","\\textup":"textup"},oj=o((t,e)=>{var r=t.font;if(r){if(aj[r])return e.withTextFontFamily(aj[r]);if(sj[r])return e.withTextFontWeight(sj[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(b8e[r])},"optionsWithFont");Ot({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:Oi(i),font:n}},htmlBuilder(t,e){var r=oj(t,e),n=ea(t.body,r,!0);return He.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=oj(t,e);return wf(t.body,r)}});Ot({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=rn(t.body,e),n=He.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=He.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return He.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new vt.MathNode("mo",[new vt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new vt.MathNode("munder",[Mn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});Ot({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=rn(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return He.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new vt.MathNode("mpadded",[Mn(t.body,e)],["vcenter"])}});Ot({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new bt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=lj(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),"makeVerb"),bf=Sj,nX=`[ \r - ]`,T8e="\\\\[a-zA-Z@]+",w8e="\\\\[^\uD800-\uDFFF]",k8e="("+T8e+")"+nX+"*",E8e=`\\\\( -|[ \r ]+ -?)[ \r ]*`,j8="[\u0300-\u036F]",S8e=new RegExp(j8+"+$"),C8e="("+nX+"+)|"+(E8e+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(j8+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(j8+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+k8e)+("|"+w8e+")"),ww=class{static{o(this,"Lexer")}constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp(C8e,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new Po("EOF",new Qs(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new bt("Unexpected character: '"+e[r]+"'",new Po(e[r],new Qs(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` -`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new Po(i,new Qs(this,r,this.tokenRegex.lastIndex))}},X8=class{static{o(this,"Namespace")}constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new bt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},A8e=Hj;ue("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});ue("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});ue("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});ue("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});ue("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});ue("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");ue("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});cj={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};ue("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new bt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=cj[e.text],n==null||n>=r)throw new bt("Invalid base-"+r+" digit "+e.text);for(var i;(i=cj[t.future().text])!=null&&i{var i=t.consumeArg().tokens;if(i.length!==1)throw new bt("\\newcommand's first argument must be a macro name");var a=i[0].text,s=t.isDefined(a);if(s&&!e)throw new bt("\\newcommand{"+a+"} attempting to redefine "+(a+"; use \\renewcommand"));if(!s&&!r)throw new bt("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");var l=0;if(i=t.consumeArg().tokens,i.length===1&&i[0].text==="["){for(var u="",h=t.expandNextToken();h.text!=="]"&&h.text!=="EOF";)u+=h.text,h=t.expandNextToken();if(!u.match(/^\s*[0-9]+\s*$/))throw new bt("Invalid number of arguments: "+u);l=parseInt(u),i=t.consumeArg().tokens}return s&&n||t.macros.set(a,{tokens:i,numArgs:l}),""},"newcommand");ue("\\newcommand",t=>hD(t,!1,!0,!1));ue("\\renewcommand",t=>hD(t,!0,!1,!1));ue("\\providecommand",t=>hD(t,!0,!0,!0));ue("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});ue("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});ue("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),bf[r],qn.math[r],qn.text[r]),""});ue("\\bgroup","{");ue("\\egroup","}");ue("~","\\nobreakspace");ue("\\lq","`");ue("\\rq","'");ue("\\aa","\\r a");ue("\\AA","\\r A");ue("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");ue("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");ue("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");ue("\u212C","\\mathscr{B}");ue("\u2130","\\mathscr{E}");ue("\u2131","\\mathscr{F}");ue("\u210B","\\mathscr{H}");ue("\u2110","\\mathscr{I}");ue("\u2112","\\mathscr{L}");ue("\u2133","\\mathscr{M}");ue("\u211B","\\mathscr{R}");ue("\u212D","\\mathfrak{C}");ue("\u210C","\\mathfrak{H}");ue("\u2128","\\mathfrak{Z}");ue("\\Bbbk","\\Bbb{k}");ue("\xB7","\\cdotp");ue("\\llap","\\mathllap{\\textrm{#1}}");ue("\\rlap","\\mathrlap{\\textrm{#1}}");ue("\\clap","\\mathclap{\\textrm{#1}}");ue("\\mathstrut","\\vphantom{(}");ue("\\underbar","\\underline{\\text{#1}}");ue("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');ue("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");ue("\\ne","\\neq");ue("\u2260","\\neq");ue("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");ue("\u2209","\\notin");ue("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");ue("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");ue("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");ue("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");ue("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");ue("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");ue("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");ue("\u27C2","\\perp");ue("\u203C","\\mathclose{!\\mkern-0.8mu!}");ue("\u220C","\\notni");ue("\u231C","\\ulcorner");ue("\u231D","\\urcorner");ue("\u231E","\\llcorner");ue("\u231F","\\lrcorner");ue("\xA9","\\copyright");ue("\xAE","\\textregistered");ue("\uFE0F","\\textregistered");ue("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');ue("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');ue("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');ue("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');ue("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");ue("\u22EE","\\vdots");ue("\\varGamma","\\mathit{\\Gamma}");ue("\\varDelta","\\mathit{\\Delta}");ue("\\varTheta","\\mathit{\\Theta}");ue("\\varLambda","\\mathit{\\Lambda}");ue("\\varXi","\\mathit{\\Xi}");ue("\\varPi","\\mathit{\\Pi}");ue("\\varSigma","\\mathit{\\Sigma}");ue("\\varUpsilon","\\mathit{\\Upsilon}");ue("\\varPhi","\\mathit{\\Phi}");ue("\\varPsi","\\mathit{\\Psi}");ue("\\varOmega","\\mathit{\\Omega}");ue("\\substack","\\begin{subarray}{c}#1\\end{subarray}");ue("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");ue("\\boxed","\\fbox{$\\displaystyle{#1}$}");ue("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");ue("\\implies","\\DOTSB\\;\\Longrightarrow\\;");ue("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");ue("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");ue("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");uj={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};ue("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in uj?e=uj[r]:(r.slice(0,4)==="\\not"||r in qn.math&&["bin","rel"].includes(qn.math[r].group))&&(e="\\dotsb"),e});fD={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};ue("\\dotso",function(t){var e=t.future().text;return e in fD?"\\ldots\\,":"\\ldots"});ue("\\dotsc",function(t){var e=t.future().text;return e in fD&&e!==","?"\\ldots\\,":"\\ldots"});ue("\\cdots",function(t){var e=t.future().text;return e in fD?"\\@cdots\\,":"\\@cdots"});ue("\\dotsb","\\cdots");ue("\\dotsm","\\cdots");ue("\\dotsi","\\!\\cdots");ue("\\dotsx","\\ldots\\,");ue("\\DOTSI","\\relax");ue("\\DOTSB","\\relax");ue("\\DOTSX","\\relax");ue("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");ue("\\,","\\tmspace+{3mu}{.1667em}");ue("\\thinspace","\\,");ue("\\>","\\mskip{4mu}");ue("\\:","\\tmspace+{4mu}{.2222em}");ue("\\medspace","\\:");ue("\\;","\\tmspace+{5mu}{.2777em}");ue("\\thickspace","\\;");ue("\\!","\\tmspace-{3mu}{.1667em}");ue("\\negthinspace","\\!");ue("\\negmedspace","\\tmspace-{4mu}{.2222em}");ue("\\negthickspace","\\tmspace-{5mu}{.277em}");ue("\\enspace","\\kern.5em ");ue("\\enskip","\\hskip.5em\\relax");ue("\\quad","\\hskip1em\\relax");ue("\\qquad","\\hskip2em\\relax");ue("\\tag","\\@ifstar\\tag@literal\\tag@paren");ue("\\tag@paren","\\tag@literal{({#1})}");ue("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new bt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});ue("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");ue("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");ue("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");ue("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");ue("\\newline","\\\\\\relax");ue("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");iX=_t(qc["Main-Regular"][84][1]-.7*qc["Main-Regular"][65][1]);ue("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+iX+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");ue("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+iX+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");ue("\\hspace","\\@ifstar\\@hspacer\\@hspace");ue("\\@hspace","\\hskip #1\\relax");ue("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");ue("\\ordinarycolon",":");ue("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");ue("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');ue("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');ue("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');ue("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');ue("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');ue("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');ue("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');ue("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');ue("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');ue("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');ue("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');ue("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');ue("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');ue("\u2237","\\dblcolon");ue("\u2239","\\eqcolon");ue("\u2254","\\coloneqq");ue("\u2255","\\eqqcolon");ue("\u2A74","\\Coloneqq");ue("\\ratio","\\vcentcolon");ue("\\coloncolon","\\dblcolon");ue("\\colonequals","\\coloneqq");ue("\\coloncolonequals","\\Coloneqq");ue("\\equalscolon","\\eqqcolon");ue("\\equalscoloncolon","\\Eqqcolon");ue("\\colonminus","\\coloneq");ue("\\coloncolonminus","\\Coloneq");ue("\\minuscolon","\\eqcolon");ue("\\minuscoloncolon","\\Eqcolon");ue("\\coloncolonapprox","\\Colonapprox");ue("\\coloncolonsim","\\Colonsim");ue("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");ue("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");ue("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");ue("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");ue("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");ue("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");ue("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");ue("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");ue("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");ue("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");ue("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");ue("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");ue("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");ue("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");ue("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");ue("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");ue("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");ue("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");ue("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");ue("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");ue("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");ue("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");ue("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");ue("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");ue("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");ue("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");ue("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");ue("\\imath","\\html@mathml{\\@imath}{\u0131}");ue("\\jmath","\\html@mathml{\\@jmath}{\u0237}");ue("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");ue("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");ue("\u27E6","\\llbracket");ue("\u27E7","\\rrbracket");ue("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");ue("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");ue("\u2983","\\lBrace");ue("\u2984","\\rBrace");ue("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");ue("\u29B5","\\minuso");ue("\\darr","\\downarrow");ue("\\dArr","\\Downarrow");ue("\\Darr","\\Downarrow");ue("\\lang","\\langle");ue("\\rang","\\rangle");ue("\\uarr","\\uparrow");ue("\\uArr","\\Uparrow");ue("\\Uarr","\\Uparrow");ue("\\N","\\mathbb{N}");ue("\\R","\\mathbb{R}");ue("\\Z","\\mathbb{Z}");ue("\\alef","\\aleph");ue("\\alefsym","\\aleph");ue("\\Alpha","\\mathrm{A}");ue("\\Beta","\\mathrm{B}");ue("\\bull","\\bullet");ue("\\Chi","\\mathrm{X}");ue("\\clubs","\\clubsuit");ue("\\cnums","\\mathbb{C}");ue("\\Complex","\\mathbb{C}");ue("\\Dagger","\\ddagger");ue("\\diamonds","\\diamondsuit");ue("\\empty","\\emptyset");ue("\\Epsilon","\\mathrm{E}");ue("\\Eta","\\mathrm{H}");ue("\\exist","\\exists");ue("\\harr","\\leftrightarrow");ue("\\hArr","\\Leftrightarrow");ue("\\Harr","\\Leftrightarrow");ue("\\hearts","\\heartsuit");ue("\\image","\\Im");ue("\\infin","\\infty");ue("\\Iota","\\mathrm{I}");ue("\\isin","\\in");ue("\\Kappa","\\mathrm{K}");ue("\\larr","\\leftarrow");ue("\\lArr","\\Leftarrow");ue("\\Larr","\\Leftarrow");ue("\\lrarr","\\leftrightarrow");ue("\\lrArr","\\Leftrightarrow");ue("\\Lrarr","\\Leftrightarrow");ue("\\Mu","\\mathrm{M}");ue("\\natnums","\\mathbb{N}");ue("\\Nu","\\mathrm{N}");ue("\\Omicron","\\mathrm{O}");ue("\\plusmn","\\pm");ue("\\rarr","\\rightarrow");ue("\\rArr","\\Rightarrow");ue("\\Rarr","\\Rightarrow");ue("\\real","\\Re");ue("\\reals","\\mathbb{R}");ue("\\Reals","\\mathbb{R}");ue("\\Rho","\\mathrm{P}");ue("\\sdot","\\cdot");ue("\\sect","\\S");ue("\\spades","\\spadesuit");ue("\\sub","\\subset");ue("\\sube","\\subseteq");ue("\\supe","\\supseteq");ue("\\Tau","\\mathrm{T}");ue("\\thetasym","\\vartheta");ue("\\weierp","\\wp");ue("\\Zeta","\\mathrm{Z}");ue("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");ue("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");ue("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");ue("\\bra","\\mathinner{\\langle{#1}|}");ue("\\ket","\\mathinner{|{#1}\\rangle}");ue("\\braket","\\mathinner{\\langle{#1}\\rangle}");ue("\\Bra","\\left\\langle#1\\right|");ue("\\Ket","\\left|#1\\right\\rangle");aX=o(t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),l=e.macros.get("\\|");e.macros.beginGroup();var u=o(d=>p=>{t&&(p.macros.set("|",s),i.length&&p.macros.set("\\|",l));var m=d;if(!d&&i.length){var g=p.future();g.text==="|"&&(p.popToken(),m=!0)}return{tokens:m?i:n,numArgs:0}},"midMacro");e.macros.set("|",u(!1)),i.length&&e.macros.set("\\|",u(!0));var h=e.consumeArg().tokens,f=e.expandTokens([...a,...h,...r]);return e.macros.endGroup(),{tokens:f.reverse(),numArgs:0}},"braketHelper");ue("\\bra@ket",aX(!1));ue("\\bra@set",aX(!0));ue("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");ue("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");ue("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");ue("\\angln","{\\angl n}");ue("\\blue","\\textcolor{##6495ed}{#1}");ue("\\orange","\\textcolor{##ffa500}{#1}");ue("\\pink","\\textcolor{##ff00af}{#1}");ue("\\red","\\textcolor{##df0030}{#1}");ue("\\green","\\textcolor{##28ae7b}{#1}");ue("\\gray","\\textcolor{gray}{#1}");ue("\\purple","\\textcolor{##9d38bd}{#1}");ue("\\blueA","\\textcolor{##ccfaff}{#1}");ue("\\blueB","\\textcolor{##80f6ff}{#1}");ue("\\blueC","\\textcolor{##63d9ea}{#1}");ue("\\blueD","\\textcolor{##11accd}{#1}");ue("\\blueE","\\textcolor{##0c7f99}{#1}");ue("\\tealA","\\textcolor{##94fff5}{#1}");ue("\\tealB","\\textcolor{##26edd5}{#1}");ue("\\tealC","\\textcolor{##01d1c1}{#1}");ue("\\tealD","\\textcolor{##01a995}{#1}");ue("\\tealE","\\textcolor{##208170}{#1}");ue("\\greenA","\\textcolor{##b6ffb0}{#1}");ue("\\greenB","\\textcolor{##8af281}{#1}");ue("\\greenC","\\textcolor{##74cf70}{#1}");ue("\\greenD","\\textcolor{##1fab54}{#1}");ue("\\greenE","\\textcolor{##0d923f}{#1}");ue("\\goldA","\\textcolor{##ffd0a9}{#1}");ue("\\goldB","\\textcolor{##ffbb71}{#1}");ue("\\goldC","\\textcolor{##ff9c39}{#1}");ue("\\goldD","\\textcolor{##e07d10}{#1}");ue("\\goldE","\\textcolor{##a75a05}{#1}");ue("\\redA","\\textcolor{##fca9a9}{#1}");ue("\\redB","\\textcolor{##ff8482}{#1}");ue("\\redC","\\textcolor{##f9685d}{#1}");ue("\\redD","\\textcolor{##e84d39}{#1}");ue("\\redE","\\textcolor{##bc2612}{#1}");ue("\\maroonA","\\textcolor{##ffbde0}{#1}");ue("\\maroonB","\\textcolor{##ff92c6}{#1}");ue("\\maroonC","\\textcolor{##ed5fa6}{#1}");ue("\\maroonD","\\textcolor{##ca337c}{#1}");ue("\\maroonE","\\textcolor{##9e034e}{#1}");ue("\\purpleA","\\textcolor{##ddd7ff}{#1}");ue("\\purpleB","\\textcolor{##c6b9fc}{#1}");ue("\\purpleC","\\textcolor{##aa87ff}{#1}");ue("\\purpleD","\\textcolor{##7854ab}{#1}");ue("\\purpleE","\\textcolor{##543b78}{#1}");ue("\\mintA","\\textcolor{##f5f9e8}{#1}");ue("\\mintB","\\textcolor{##edf2df}{#1}");ue("\\mintC","\\textcolor{##e0e5cc}{#1}");ue("\\grayA","\\textcolor{##f6f7f7}{#1}");ue("\\grayB","\\textcolor{##f0f1f2}{#1}");ue("\\grayC","\\textcolor{##e3e5e6}{#1}");ue("\\grayD","\\textcolor{##d6d8da}{#1}");ue("\\grayE","\\textcolor{##babec2}{#1}");ue("\\grayF","\\textcolor{##888d93}{#1}");ue("\\grayG","\\textcolor{##626569}{#1}");ue("\\grayH","\\textcolor{##3b3e40}{#1}");ue("\\grayI","\\textcolor{##21242c}{#1}");ue("\\kaBlue","\\textcolor{##314453}{#1}");ue("\\kaGreen","\\textcolor{##71B307}{#1}");sX={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},K8=class{static{o(this,"MacroExpander")}constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new X8(A8e,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new ww(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new Po("EOF",n.loc)),this.pushTokens(i),new Po("",Qs.range(r,n))}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,l=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new bt("Extra }",a)}else if(a.text==="EOF")throw new bt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[l]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[l]==="{")&&a.text===e[l]){if(++l,l===e.length){r.splice(-l,l);break}}else l=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new bt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new bt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new bt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var l=a.length-1;l>=0;--l){var u=a[l];if(u.text==="#"){if(l===0)throw new bt("Incomplete placeholder at end of macro body",u);if(u=a[--l],u.text==="#")a.splice(l+1,1);else if(/^[1-9]$/.test(u.text))a.splice(l,2,...s[+u.text-1]);else throw new bt("Not a valid argument number",u)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Po(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var l=new ww(i,this.settings),u=[],h=l.lex();h.text!=="EOF";)u.push(h),h=l.lex();u.reverse();var f={tokens:u,numArgs:a};return f}return i}isDefined(e){return this.macros.has(e)||bf.hasOwnProperty(e)||qn.math.hasOwnProperty(e)||qn.text.hasOwnProperty(e)||sX.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:bf.hasOwnProperty(e)&&!bf[e].primitive}},hj=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,pw=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),F8={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},fj={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},kw=class t{static{o(this,"Parser")}constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new K8(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new bt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new Po("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&bf[i.text]&&bf[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var l=qn[this.mode][r].group,u=Qs.range(e),h;if(v_e.hasOwnProperty(l)){var f=l;h={type:"atom",mode:this.mode,family:f,loc:u,text:r}}else h={type:l,mode:this.mode,loc:u,text:r};s=h}else if(r.charCodeAt(0)>=128)this.settings.strict&&(pj(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:Qs.range(e),text:r};else return null;if(this.consume(),a)for(var d=0;d{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),fl.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var Ip,D8e,R8e,yX,mX,wr,N8e,M8e,I8e,O8e,vX,Op,P8e,B8e,jc,mD,F8e,$8e,gX,Lw,Jn,Pp,z8e,gg,st,Ur=O(()=>{"use strict";S2();$r();Ip=//gi,D8e=o(t=>t?vX(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),R8e=(()=>{let t=!1;return()=>{t||(L8e(),t=!0)}})();o(L8e,"setupDompurifyHooks");yX=o(t=>(R8e(),fl.sanitize(t)),"removeScript"),mX=o((t,e)=>{if(Sr(e)){let r=e.securityLevel;r==="antiscript"||r==="strict"||r==="sandbox"?t=yX(t):r!=="loose"&&(t=vX(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=O8e(t))}return t},"sanitizeMore"),wr=o((t,e)=>t&&(e.dompurifyConfig?t=fl.sanitize(mX(t,e),e.dompurifyConfig).toString():t=fl.sanitize(mX(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),N8e=o((t,e)=>typeof t=="string"?wr(t,e):t.flat().map(r=>wr(r,e)),"sanitizeTextOrArray"),M8e=o(t=>Ip.test(t),"hasBreaks"),I8e=o(t=>t.split(Ip),"splitBreaks"),O8e=o(t=>t.replace(/#br#/g,"
    "),"placeholderToBreak"),vX=o(t=>t.replace(Ip,"#br#"),"breakToPlaceholder"),Op=o(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),P8e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),B8e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),jc=o(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),F8e=o((t,e)=>{let r=mD(t,"~"),n=mD(e,"~");return r===1&&n===1},"shouldCombineSets"),$8e=o(t=>{let e=mD(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),gX=o(()=>window.MathMLElement!==void 0,"isMathMLSupported"),Lw=/\$\$(.*)\$\$/g,Jn=o(t=>(t.match(Lw)?.length??0)>0,"hasKatex"),Pp=o(async(t,e)=>{let r=document.createElement("div");r.innerHTML=await gg(t,e),r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),z8e=o(async(t,e)=>{if(!Jn(t))return t;if(!(gX()||e.legacyMathML||e.forceLegacyMathML))return t.replace(Lw,"MathML is unsupported in this environment.");{let{default:r}=await Promise.resolve().then(()=>(pX(),dX)),n=e.forceLegacyMathML||!gX()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(Ip).map(i=>Jn(i)?`
    ${i}
    `:`
    ${i}
    `).join("").replace(Lw,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))}return t.replace(Lw,"Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.")},"renderKatexUnsanitized"),gg=o(async(t,e)=>wr(await z8e(t,e),e),"renderKatexSanitized"),st={getRows:D8e,sanitizeText:wr,sanitizeTextOrArray:N8e,hasBreaks:M8e,splitBreaks:I8e,lineBreakRegex:Ip,removeScript:yX,getUrl:Op,evaluate:Xs,getMax:P8e,getMin:B8e}});var yD,gD,xX,Nw,bX,TX,eo,Xc=O(()=>{"use strict";AH();$r();Ur();xt();yD={body:'?',height:80,width:80},gD=new Map,xX=new Map,Nw=o(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(K.debug("Registering icon pack:",e.name),"loader"in e)xX.set(e.name,e.loader);else if("icons"in e)gD.set(e.name,e.icons);else throw K.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),bX=o(async(t,e)=>{let r=H_(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=gD.get(n);if(!i){let s=xX.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},gD.set(n,i)}catch(l){throw K.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=j_(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),TX=o(async t=>{try{return await bX(t),!0}catch{return!1}},"isIconAvailable"),eo=o(async(t,e,r)=>{let n;try{n=await bX(t,e?.fallbackPrefix)}catch(s){K.error(s),n=yD}let i=K_(n,e),a=Z_(Q_(i.body),{...i.attributes,...r});return wr(a,Zt())},"getIconSVG")});function Mw(t){for(var e=[],r=1;r{"use strict";o(Mw,"dedent")});var Iw,Bp,wX,Ow=O(()=>{"use strict";Iw=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,Bp=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,wX=/\s*%%.*\n/gm});var yg,xD=O(()=>{"use strict";yg=class extends Error{static{o(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}});var uh,vg,B2,bD,kX,Fp=O(()=>{"use strict";xt();Ow();xD();uh={},vg=o(function(t,e){t=t.replace(Iw,"").replace(Bp,"").replace(wX,` -`);for(let[r,{detector:n}]of Object.entries(uh))if(n(t,e))return r;throw new yg(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),B2=o((...t)=>{for(let{id:e,detector:r,loader:n}of t)bD(e,r,n)},"registerLazyLoadedDiagrams"),bD=o((t,e,r)=>{uh[t]&&K.warn(`Detector with key ${t} already exists. Overwriting.`),uh[t]={detector:e,loader:r},K.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),kX=o(t=>uh[t].loader,"getDiagramLoader")});var F2,EX,TD=O(()=>{"use strict";F2=(function(){var t=o(function(Te,Be,Ue,Ge){for(Ue=Ue||{},Ge=Te.length;Ge--;Ue[Te[Ge]]=Be);return Ue},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],l=[1,64],u=[1,65],h=[1,66],f=[1,67],d=[1,68],p=[1,69],m=[1,29],g=[1,30],y=[1,31],v=[1,32],x=[1,33],b=[1,34],T=[1,35],E=[1,36],w=[1,37],k=[1,38],S=[1,39],A=[1,40],L=[1,41],I=[1,42],N=[1,43],C=[1,44],_=[1,45],D=[1,46],M=[1,47],R=[1,48],P=[1,50],B=[1,51],F=[1,52],G=[1,53],$=[1,54],V=[1,55],X=[1,56],Q=[1,57],H=[1,58],ie=[1,59],Y=[1,60],le=[14,42],ee=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],J=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],te=[1,82],Z=[1,83],xe=[1,84],de=[1,85],Se=[12,14,42],Me=[12,14,33,42],ke=[12,14,33,42,76,77,79,80],we=[12,33],_e=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],$e={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:o(function(Be,Ue,Ge,Ne,We,j,ae){var U=j.length-1;switch(We){case 3:Ne.setDirection("TB");break;case 4:Ne.setDirection("BT");break;case 5:Ne.setDirection("RL");break;case 6:Ne.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:Ne.setC4Type(j[U-3]);break;case 19:Ne.setTitle(j[U].substring(6)),this.$=j[U].substring(6);break;case 20:Ne.setAccDescription(j[U].substring(15)),this.$=j[U].substring(15);break;case 21:this.$=j[U].trim(),Ne.setTitle(this.$);break;case 22:case 23:this.$=j[U].trim(),Ne.setAccDescription(this.$);break;case 28:j[U].splice(2,0,"ENTERPRISE"),Ne.addPersonOrSystemBoundary(...j[U]),this.$=j[U];break;case 29:j[U].splice(2,0,"SYSTEM"),Ne.addPersonOrSystemBoundary(...j[U]),this.$=j[U];break;case 30:Ne.addPersonOrSystemBoundary(...j[U]),this.$=j[U];break;case 31:j[U].splice(2,0,"CONTAINER"),Ne.addContainerBoundary(...j[U]),this.$=j[U];break;case 32:Ne.addDeploymentNode("node",...j[U]),this.$=j[U];break;case 33:Ne.addDeploymentNode("nodeL",...j[U]),this.$=j[U];break;case 34:Ne.addDeploymentNode("nodeR",...j[U]),this.$=j[U];break;case 35:Ne.popBoundaryParseStack();break;case 39:Ne.addPersonOrSystem("person",...j[U]),this.$=j[U];break;case 40:Ne.addPersonOrSystem("external_person",...j[U]),this.$=j[U];break;case 41:Ne.addPersonOrSystem("system",...j[U]),this.$=j[U];break;case 42:Ne.addPersonOrSystem("system_db",...j[U]),this.$=j[U];break;case 43:Ne.addPersonOrSystem("system_queue",...j[U]),this.$=j[U];break;case 44:Ne.addPersonOrSystem("external_system",...j[U]),this.$=j[U];break;case 45:Ne.addPersonOrSystem("external_system_db",...j[U]),this.$=j[U];break;case 46:Ne.addPersonOrSystem("external_system_queue",...j[U]),this.$=j[U];break;case 47:Ne.addContainer("container",...j[U]),this.$=j[U];break;case 48:Ne.addContainer("container_db",...j[U]),this.$=j[U];break;case 49:Ne.addContainer("container_queue",...j[U]),this.$=j[U];break;case 50:Ne.addContainer("external_container",...j[U]),this.$=j[U];break;case 51:Ne.addContainer("external_container_db",...j[U]),this.$=j[U];break;case 52:Ne.addContainer("external_container_queue",...j[U]),this.$=j[U];break;case 53:Ne.addComponent("component",...j[U]),this.$=j[U];break;case 54:Ne.addComponent("component_db",...j[U]),this.$=j[U];break;case 55:Ne.addComponent("component_queue",...j[U]),this.$=j[U];break;case 56:Ne.addComponent("external_component",...j[U]),this.$=j[U];break;case 57:Ne.addComponent("external_component_db",...j[U]),this.$=j[U];break;case 58:Ne.addComponent("external_component_queue",...j[U]),this.$=j[U];break;case 60:Ne.addRel("rel",...j[U]),this.$=j[U];break;case 61:Ne.addRel("birel",...j[U]),this.$=j[U];break;case 62:Ne.addRel("rel_u",...j[U]),this.$=j[U];break;case 63:Ne.addRel("rel_d",...j[U]),this.$=j[U];break;case 64:Ne.addRel("rel_l",...j[U]),this.$=j[U];break;case 65:Ne.addRel("rel_r",...j[U]),this.$=j[U];break;case 66:Ne.addRel("rel_b",...j[U]),this.$=j[U];break;case 67:j[U].splice(0,1),Ne.addRel("rel",...j[U]),this.$=j[U];break;case 68:Ne.updateElStyle("update_el_style",...j[U]),this.$=j[U];break;case 69:Ne.updateRelStyle("update_rel_style",...j[U]),this.$=j[U];break;case 70:Ne.updateLayoutConfig("update_layout_config",...j[U]),this.$=j[U];break;case 71:this.$=[j[U]];break;case 72:j[U].unshift(j[U-1]),this.$=j[U];break;case 73:case 75:this.$=j[U].trim();break;case 74:let ce={};ce[j[U-1].trim()]=j[U].trim(),this.$=ce;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y},{14:[1,74]},t(le,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y}),t(le,[2,14]),t(ee,[2,16],{12:[1,76]}),t(le,[2,36],{12:[1,77]}),t(J,[2,19]),t(J,[2,20]),{25:[1,78]},{27:[1,79]},t(J,[2,23]),{35:80,75:81,76:te,77:Z,79:xe,80:de},{35:86,75:81,76:te,77:Z,79:xe,80:de},{35:87,75:81,76:te,77:Z,79:xe,80:de},{35:88,75:81,76:te,77:Z,79:xe,80:de},{35:89,75:81,76:te,77:Z,79:xe,80:de},{35:90,75:81,76:te,77:Z,79:xe,80:de},{35:91,75:81,76:te,77:Z,79:xe,80:de},{35:92,75:81,76:te,77:Z,79:xe,80:de},{35:93,75:81,76:te,77:Z,79:xe,80:de},{35:94,75:81,76:te,77:Z,79:xe,80:de},{35:95,75:81,76:te,77:Z,79:xe,80:de},{35:96,75:81,76:te,77:Z,79:xe,80:de},{35:97,75:81,76:te,77:Z,79:xe,80:de},{35:98,75:81,76:te,77:Z,79:xe,80:de},{35:99,75:81,76:te,77:Z,79:xe,80:de},{35:100,75:81,76:te,77:Z,79:xe,80:de},{35:101,75:81,76:te,77:Z,79:xe,80:de},{35:102,75:81,76:te,77:Z,79:xe,80:de},{35:103,75:81,76:te,77:Z,79:xe,80:de},{35:104,75:81,76:te,77:Z,79:xe,80:de},t(Se,[2,59]),{35:105,75:81,76:te,77:Z,79:xe,80:de},{35:106,75:81,76:te,77:Z,79:xe,80:de},{35:107,75:81,76:te,77:Z,79:xe,80:de},{35:108,75:81,76:te,77:Z,79:xe,80:de},{35:109,75:81,76:te,77:Z,79:xe,80:de},{35:110,75:81,76:te,77:Z,79:xe,80:de},{35:111,75:81,76:te,77:Z,79:xe,80:de},{35:112,75:81,76:te,77:Z,79:xe,80:de},{35:113,75:81,76:te,77:Z,79:xe,80:de},{35:114,75:81,76:te,77:Z,79:xe,80:de},{35:115,75:81,76:te,77:Z,79:xe,80:de},{20:116,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y},{12:[1,118],33:[1,117]},{35:119,75:81,76:te,77:Z,79:xe,80:de},{35:120,75:81,76:te,77:Z,79:xe,80:de},{35:121,75:81,76:te,77:Z,79:xe,80:de},{35:122,75:81,76:te,77:Z,79:xe,80:de},{35:123,75:81,76:te,77:Z,79:xe,80:de},{35:124,75:81,76:te,77:Z,79:xe,80:de},{35:125,75:81,76:te,77:Z,79:xe,80:de},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(le,[2,15]),t(ee,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(le,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:E,52:w,53:k,54:S,55:A,56:L,57:I,58:N,59:C,60:_,61:D,62:M,63:R,64:P,65:B,66:F,67:G,68:$,69:V,70:X,71:Q,72:H,73:ie,74:Y}),t(J,[2,21]),t(J,[2,22]),t(Se,[2,39]),t(Me,[2,71],{75:81,35:132,76:te,77:Z,79:xe,80:de}),t(ke,[2,73]),{78:[1,133]},t(ke,[2,75]),t(ke,[2,76]),t(Se,[2,40]),t(Se,[2,41]),t(Se,[2,42]),t(Se,[2,43]),t(Se,[2,44]),t(Se,[2,45]),t(Se,[2,46]),t(Se,[2,47]),t(Se,[2,48]),t(Se,[2,49]),t(Se,[2,50]),t(Se,[2,51]),t(Se,[2,52]),t(Se,[2,53]),t(Se,[2,54]),t(Se,[2,55]),t(Se,[2,56]),t(Se,[2,57]),t(Se,[2,58]),t(Se,[2,60]),t(Se,[2,61]),t(Se,[2,62]),t(Se,[2,63]),t(Se,[2,64]),t(Se,[2,65]),t(Se,[2,66]),t(Se,[2,67]),t(Se,[2,68]),t(Se,[2,69]),t(Se,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(we,[2,28]),t(we,[2,29]),t(we,[2,30]),t(we,[2,31]),t(we,[2,32]),t(we,[2,33]),t(we,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(ee,[2,18]),t(le,[2,38]),t(Me,[2,72]),t(ke,[2,74]),t(Se,[2,24]),t(Se,[2,35]),t(_e,[2,25]),t(_e,[2,26],{12:[1,138]}),t(_e,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:o(function(Be,Ue){if(Ue.recoverable)this.trace(Be);else{var Ge=new Error(Be);throw Ge.hash=Ue,Ge}},"parseError"),parse:o(function(Be){var Ue=this,Ge=[0],Ne=[],We=[null],j=[],ae=this.table,U="",ce=0,z=0,ne=0,se=2,be=1,pe=j.slice.call(arguments,1),me=Object.create(this.lexer),Re={yy:{}};for(var ge in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ge)&&(Re.yy[ge]=this.yy[ge]);me.setInput(Be,Re.yy),Re.yy.lexer=me,Re.yy.parser=this,typeof me.yylloc>"u"&&(me.yylloc={});var Ie=me.yylloc;j.push(Ie);var qe=me.options&&me.options.ranges;typeof Re.yy.parseError=="function"?this.parseError=Re.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Pe(dt){Ge.length=Ge.length-2*dt,We.length=We.length-dt,j.length=j.length-dt}o(Pe,"popStack");function Xe(){var dt;return dt=Ne.pop()||me.lex()||be,typeof dt!="number"&&(dt instanceof Array&&(Ne=dt,dt=Ne.pop()),dt=Ue.symbols_[dt]||dt),dt}o(Xe,"lex");for(var oe,et,he,ot,Dt,It,wt={},Rt,it,at,Ct;;){if(he=Ge[Ge.length-1],this.defaultActions[he]?ot=this.defaultActions[he]:((oe===null||typeof oe>"u")&&(oe=Xe()),ot=ae[he]&&ae[he][oe]),typeof ot>"u"||!ot.length||!ot[0]){var yt="";Ct=[];for(Rt in ae[he])this.terminals_[Rt]&&Rt>se&&Ct.push("'"+this.terminals_[Rt]+"'");me.showPosition?yt="Parse error on line "+(ce+1)+`: -`+me.showPosition()+` -Expecting `+Ct.join(", ")+", got '"+(this.terminals_[oe]||oe)+"'":yt="Parse error on line "+(ce+1)+": Unexpected "+(oe==be?"end of input":"'"+(this.terminals_[oe]||oe)+"'"),this.parseError(yt,{text:me.match,token:this.terminals_[oe]||oe,line:me.yylineno,loc:Ie,expected:Ct})}if(ot[0]instanceof Array&&ot.length>1)throw new Error("Parse Error: multiple actions possible at state: "+he+", token: "+oe);switch(ot[0]){case 1:Ge.push(oe),We.push(me.yytext),j.push(me.yylloc),Ge.push(ot[1]),oe=null,et?(oe=et,et=null):(z=me.yyleng,U=me.yytext,ce=me.yylineno,Ie=me.yylloc,ne>0&&ne--);break;case 2:if(it=this.productions_[ot[1]][1],wt.$=We[We.length-it],wt._$={first_line:j[j.length-(it||1)].first_line,last_line:j[j.length-1].last_line,first_column:j[j.length-(it||1)].first_column,last_column:j[j.length-1].last_column},qe&&(wt._$.range=[j[j.length-(it||1)].range[0],j[j.length-1].range[1]]),It=this.performAction.apply(wt,[U,z,ce,Re.yy,ot[1],We,j].concat(pe)),typeof It<"u")return It;it&&(Ge=Ge.slice(0,-1*it*2),We=We.slice(0,-1*it),j=j.slice(0,-1*it)),Ge.push(this.productions_[ot[1]][0]),We.push(wt.$),j.push(wt._$),at=ae[Ge[Ge.length-2]][Ge[Ge.length-1]],Ge.push(at);break;case 3:return!0}}return!0},"parse")},fe=(function(){var Te={EOF:1,parseError:o(function(Ue,Ge){if(this.yy.parser)this.yy.parser.parseError(Ue,Ge);else throw new Error(Ue)},"parseError"),setInput:o(function(Be,Ue){return this.yy=Ue||this.yy||{},this._input=Be,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Be=this._input[0];this.yytext+=Be,this.yyleng++,this.offset++,this.match+=Be,this.matched+=Be;var Ue=Be.match(/(?:\r\n?|\n).*/g);return Ue?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Be},"input"),unput:o(function(Be){var Ue=Be.length,Ge=Be.split(/(?:\r\n?|\n)/g);this._input=Be+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ue),this.offset-=Ue;var Ne=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ge.length-1&&(this.yylineno-=Ge.length-1);var We=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ge?(Ge.length===Ne.length?this.yylloc.first_column:0)+Ne[Ne.length-Ge.length].length-Ge[0].length:this.yylloc.first_column-Ue},this.options.ranges&&(this.yylloc.range=[We[0],We[0]+this.yyleng-Ue]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Be){this.unput(this.match.slice(Be))},"less"),pastInput:o(function(){var Be=this.matched.substr(0,this.matched.length-this.match.length);return(Be.length>20?"...":"")+Be.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Be=this.match;return Be.length<20&&(Be+=this._input.substr(0,20-Be.length)),(Be.substr(0,20)+(Be.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Be=this.pastInput(),Ue=new Array(Be.length+1).join("-");return Be+this.upcomingInput()+` -`+Ue+"^"},"showPosition"),test_match:o(function(Be,Ue){var Ge,Ne,We;if(this.options.backtrack_lexer&&(We={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(We.yylloc.range=this.yylloc.range.slice(0))),Ne=Be[0].match(/(?:\r\n?|\n).*/g),Ne&&(this.yylineno+=Ne.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ne?Ne[Ne.length-1].length-Ne[Ne.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Be[0].length},this.yytext+=Be[0],this.match+=Be[0],this.matches=Be,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Be[0].length),this.matched+=Be[0],Ge=this.performAction.call(this,this.yy,this,Ue,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ge)return Ge;if(this._backtrack){for(var j in We)this[j]=We[j];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Be,Ue,Ge,Ne;this._more||(this.yytext="",this.match="");for(var We=this._currentRules(),j=0;jUe[0].length)){if(Ue=Ge,Ne=j,this.options.backtrack_lexer){if(Be=this.test_match(Ge,We[j]),Be!==!1)return Be;if(this._backtrack){Ue=!1;continue}else return!1}else if(!this.options.flex)break}return Ue?(Be=this.test_match(Ue,We[Ne]),Be!==!1?Be:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ue=this.next();return Ue||this.lex()},"lex"),begin:o(function(Ue){this.conditionStack.push(Ue)},"begin"),popState:o(function(){var Ue=this.conditionStack.length-1;return Ue>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ue){return Ue=this.conditionStack.length-1-Math.abs(Ue||0),Ue>=0?this.conditionStack[Ue]:"INITIAL"},"topState"),pushState:o(function(Ue){this.begin(Ue)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ue,Ge,Ne,We){var j=We;switch(Ne){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[65,66,67,68],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return Te})();$e.lexer=fe;function Ke(){this.yy={}}return o(Ke,"Parser"),Ke.prototype=$e,$e.Parser=Ke,new Ke})();F2.parser=F2;EX=F2});var G8e,V8e,Zr,Kc,Ti=O(()=>{"use strict";xt();G8e=o(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),V8e=o(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),Zr=o(function(t,e,r,n){let i=V8e(e,r,n);G8e(t,i)},"configureSvgSize"),Kc=o(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;K.info(`SVG bounds: ${a}x${s}`,i);let l=0,u=0;K.info(`Graph bounds: ${l}x${u}`,t),l=a+r*2,u=s+r*2,K.info(`Calculated bounds: ${l}x${u}`),Zr(e,u,l,n);let h=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",h)},"setupGraphViewbox")});var Pw,q8e,SX,CX,wD=O(()=>{"use strict";xt();Pw={},q8e=o((t,e,r)=>{let n="";return t in Pw&&Pw[t]?n=Pw[t](r):K.warn(`No theme found for ${t}`),` & { - font-family: ${r.fontFamily}; - font-size: ${r.fontSize}; - fill: ${r.textColor} - } - @keyframes edge-animation-frame { - from { - stroke-dashoffset: 0; - } - } - @keyframes dash { - to { - stroke-dashoffset: 0; - } - } - & .edge-animation-slow { - stroke-dasharray: 9,5 !important; - stroke-dashoffset: 900; - animation: dash 50s linear infinite; - stroke-linecap: round; - } - & .edge-animation-fast { - stroke-dasharray: 9,5 !important; - stroke-dashoffset: 900; - animation: dash 20s linear infinite; - stroke-linecap: round; - } - /* Classes common for multiple diagrams */ - - & .error-icon { - fill: ${r.errorBkgColor}; - } - & .error-text { - fill: ${r.errorTextColor}; - stroke: ${r.errorTextColor}; - } - - & .edge-thickness-normal { - stroke-width: 1px; - } - & .edge-thickness-thick { - stroke-width: 3.5px - } - & .edge-pattern-solid { - stroke-dasharray: 0; - } - & .edge-thickness-invisible { - stroke-width: 0; - fill: none; - } - & .edge-pattern-dashed{ - stroke-dasharray: 3; - } - .edge-pattern-dotted { - stroke-dasharray: 2; - } - - & .marker { - fill: ${r.lineColor}; - stroke: ${r.lineColor}; - } - & .marker.cross { - stroke: ${r.lineColor}; - } - - & svg { - font-family: ${r.fontFamily}; - font-size: ${r.fontSize}; - } - & p { - margin: 0 - } - - ${n} - - ${e} -`},"getStyles"),SX=o((t,e)=>{e!==void 0&&(Pw[t]=e)},"addStylesForDiagram"),CX=q8e});var $2={};vr($2,{clear:()=>_r,getAccDescription:()=>Br,getAccTitle:()=>Or,getDiagramTitle:()=>Fr,setAccDescription:()=>Pr,setAccTitle:()=>Lr,setDiagramTitle:()=>zr});var kD,ED,SD,CD,_r,Lr,Or,Pr,Br,zr,Fr,si=O(()=>{"use strict";Ur();$r();kD="",ED="",SD="",CD=o(t=>wr(t,Zt()),"sanitizeText"),_r=o(()=>{kD="",SD="",ED=""},"clear"),Lr=o(t=>{kD=CD(t).replace(/^\s+/g,"")},"setAccTitle"),Or=o(()=>kD,"getAccTitle"),Pr=o(t=>{SD=CD(t).replace(/\n\s+/g,` -`)},"setAccDescription"),Br=o(()=>SD,"getAccDescription"),zr=o(t=>{ED=CD(t)},"setDiagramTitle"),Fr=o(()=>ED,"getDiagramTitle")});var AX,U8e,ve,z2,Fw,G2,_D,W8e,Bw,$p,V2,AD,jt=O(()=>{"use strict";Fp();xt();$r();Ur();Ti();wD();si();AX=K,U8e=h2,ve=Zt,z2=ew,Fw=vf,G2=o(t=>wr(t,ve()),"sanitizeText"),_D=Kc,W8e=o(()=>$2,"getCommonDb"),Bw={},$p=o((t,e,r)=>{Bw[t]&&AX.warn(`Diagram with id ${t} already registered. Overwriting.`),Bw[t]=e,r&&bD(t,r),SX(t,e.styles),e.injectUtils?.(AX,U8e,ve,G2,_D,W8e(),()=>{})},"registerDiagram"),V2=o(t=>{if(t in Bw)return Bw[t];throw new AD(t)},"getDiagram"),AD=class extends Error{static{o(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}});var ec,Ef,As,Jl,Qc,q2,DD,RD,$w,zw,_X,H8e,Y8e,j8e,X8e,K8e,Q8e,Z8e,J8e,eDe,tDe,rDe,nDe,iDe,aDe,sDe,oDe,lDe,DX,cDe,uDe,RX,hDe,fDe,dDe,pDe,Sf,mDe,gDe,yDe,vDe,xDe,U2,LD=O(()=>{"use strict";jt();Ur();si();ec=[],Ef=[""],As="global",Jl="",Qc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],q2=[],DD="",RD=!1,$w=4,zw=2,H8e=o(function(){return _X},"getC4Type"),Y8e=o(function(t){_X=wr(t,ve())},"setC4Type"),j8e=o(function(t,e,r,n,i,a,s,l,u){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let h={},f=q2.find(d=>d.from===e&&d.to===r);if(f?h=f:q2.push(h),h.type=t,h.from=e,h.to=r,h.label={text:n},i==null)h.techn={text:""};else if(typeof i=="object"){let[d,p]=Object.entries(i)[0];h[d]={text:p}}else h.techn={text:i};if(a==null)h.descr={text:""};else if(typeof a=="object"){let[d,p]=Object.entries(a)[0];h[d]={text:p}}else h.descr={text:a};if(typeof s=="object"){let[d,p]=Object.entries(s)[0];h[d]=p}else h.sprite=s;if(typeof l=="object"){let[d,p]=Object.entries(l)[0];h[d]=p}else h.tags=l;if(typeof u=="object"){let[d,p]=Object.entries(u)[0];h[d]=p}else h.link=u;h.wrap=Sf()},"addRel"),X8e=o(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let l={},u=ec.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,ec.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.descr={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.descr={text:n};if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]=f}else l.sprite=i;if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.tags=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=As,l.wrap=Sf()},"addPersonOrSystem"),K8e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ec.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ec.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Sf(),u.typeC4Shape={text:t},u.parentBoundary=As},"addContainer"),Q8e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ec.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ec.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Sf(),u.typeC4Shape={text:t},u.parentBoundary=As},"addComponent"),Z8e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=Qc.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,Qc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=As,a.wrap=Sf(),Jl=As,As=t,Ef.push(Jl)},"addPersonOrSystemBoundary"),J8e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=Qc.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,Qc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=As,a.wrap=Sf(),Jl=As,As=t,Ef.push(Jl)},"addContainerBoundary"),eDe=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=Qc.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,Qc.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.type={text:"node"};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.type={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.nodeType=t,u.parentBoundary=As,u.wrap=Sf(),Jl=As,As=e,Ef.push(Jl)},"addDeploymentNode"),tDe=o(function(){As=Jl,Ef.pop(),Jl=Ef.pop(),Ef.push(Jl)},"popBoundaryParseStack"),rDe=o(function(t,e,r,n,i,a,s,l,u,h,f){let d=ec.find(p=>p.alias===e);if(!(d===void 0&&(d=Qc.find(p=>p.alias===e),d===void 0))){if(r!=null)if(typeof r=="object"){let[p,m]=Object.entries(r)[0];d[p]=m}else d.bgColor=r;if(n!=null)if(typeof n=="object"){let[p,m]=Object.entries(n)[0];d[p]=m}else d.fontColor=n;if(i!=null)if(typeof i=="object"){let[p,m]=Object.entries(i)[0];d[p]=m}else d.borderColor=i;if(a!=null)if(typeof a=="object"){let[p,m]=Object.entries(a)[0];d[p]=m}else d.shadowing=a;if(s!=null)if(typeof s=="object"){let[p,m]=Object.entries(s)[0];d[p]=m}else d.shape=s;if(l!=null)if(typeof l=="object"){let[p,m]=Object.entries(l)[0];d[p]=m}else d.sprite=l;if(u!=null)if(typeof u=="object"){let[p,m]=Object.entries(u)[0];d[p]=m}else d.techn=u;if(h!=null)if(typeof h=="object"){let[p,m]=Object.entries(h)[0];d[p]=m}else d.legendText=h;if(f!=null)if(typeof f=="object"){let[p,m]=Object.entries(f)[0];d[p]=m}else d.legendSprite=f}},"updateElStyle"),nDe=o(function(t,e,r,n,i,a,s){let l=q2.find(u=>u.from===e&&u.to===r);if(l!==void 0){if(n!=null)if(typeof n=="object"){let[u,h]=Object.entries(n)[0];l[u]=h}else l.textColor=n;if(i!=null)if(typeof i=="object"){let[u,h]=Object.entries(i)[0];l[u]=h}else l.lineColor=i;if(a!=null)if(typeof a=="object"){let[u,h]=Object.entries(a)[0];l[u]=parseInt(h)}else l.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[u,h]=Object.entries(s)[0];l[u]=parseInt(h)}else l.offsetY=parseInt(s)}},"updateRelStyle"),iDe=o(function(t,e,r){let n=$w,i=zw;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&($w=n),i>=1&&(zw=i)},"updateLayoutConfig"),aDe=o(function(){return $w},"getC4ShapeInRow"),sDe=o(function(){return zw},"getC4BoundaryInRow"),oDe=o(function(){return As},"getCurrentBoundaryParse"),lDe=o(function(){return Jl},"getParentBoundaryParse"),DX=o(function(t){return t==null?ec:ec.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),cDe=o(function(t){return ec.find(e=>e.alias===t)},"getC4Shape"),uDe=o(function(t){return Object.keys(DX(t))},"getC4ShapeKeys"),RX=o(function(t){return t==null?Qc:Qc.filter(e=>e.parentBoundary===t)},"getBoundaries"),hDe=RX,fDe=o(function(){return q2},"getRels"),dDe=o(function(){return DD},"getTitle"),pDe=o(function(t){RD=t},"setWrap"),Sf=o(function(){return RD},"autoWrap"),mDe=o(function(){ec=[],Qc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Jl="",As="global",Ef=[""],q2=[],Ef=[""],DD="",RD=!1,$w=4,zw=2},"clear"),gDe={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},yDe={FILLED:0,OPEN:1},vDe={LEFTOF:0,RIGHTOF:1,OVER:2},xDe=o(function(t){DD=wr(t,ve())},"setTitle"),U2={addPersonOrSystem:X8e,addPersonOrSystemBoundary:Z8e,addContainer:K8e,addContainerBoundary:J8e,addComponent:Q8e,addDeploymentNode:eDe,popBoundaryParseStack:tDe,addRel:j8e,updateElStyle:rDe,updateRelStyle:nDe,updateLayoutConfig:iDe,autoWrap:Sf,setWrap:pDe,getC4ShapeArray:DX,getC4Shape:cDe,getC4ShapeKeys:uDe,getBoundaries:RX,getBoundarys:hDe,getCurrentBoundaryParse:oDe,getParentBoundaryParse:lDe,getRels:fDe,getTitle:dDe,getC4Type:H8e,getC4ShapeInRow:aDe,getC4BoundaryInRow:sDe,setAccTitle:Lr,getAccTitle:Or,getAccDescription:Br,setAccDescription:Pr,getConfig:o(()=>ve().c4,"getConfig"),clear:mDe,LINETYPE:gDe,ARROWTYPE:yDe,PLACEMENT:vDe,setTitle:xDe,setC4Type:Y8e}});function zp(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var ND=O(()=>{"use strict";o(zp,"ascending")});function MD(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var LX=O(()=>{"use strict";o(MD,"descending")});function Gp(t){let e,r,n;t.length!==2?(e=zp,r=o((l,u)=>zp(t(l),u),"compare2"),n=o((l,u)=>t(l)-u,"delta")):(e=t===zp||t===MD?t:bDe,r=t,n=t);function i(l,u,h=0,f=l.length){if(h>>1;r(l[d],u)<0?h=d+1:f=d}while(h>>1;r(l[d],u)<=0?h=d+1:f=d}while(hh&&n(l[d-1],u)>-n(l[d],u)?d-1:d}return o(s,"center"),{left:i,center:s,right:a}}function bDe(){return 0}var ID=O(()=>{"use strict";ND();LX();o(Gp,"bisector");o(bDe,"zero")});function OD(t){return t===null?NaN:+t}var NX=O(()=>{"use strict";o(OD,"number")});var MX,IX,TDe,wDe,PD,OX=O(()=>{"use strict";ND();ID();NX();MX=Gp(zp),IX=MX.right,TDe=MX.left,wDe=Gp(OD).center,PD=IX});function PX({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function kDe({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function EDe({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function SDe(t){return t!==null&&typeof t=="object"?t.valueOf():t}var xg,BX=O(()=>{"use strict";xg=class extends Map{static{o(this,"InternMap")}constructor(e,r=SDe){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(PX(this,e))}has(e){return super.has(PX(this,e))}set(e,r){return super.set(kDe(this,e),r)}delete(e){return super.delete(EDe(this,e))}};o(PX,"intern_get");o(kDe,"intern_set");o(EDe,"intern_delete");o(SDe,"keyof")});function Gw(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=CDe?10:a>=ADe?5:a>=_De?2:1,l,u,h;return i<0?(h=Math.pow(10,-i)/s,l=Math.round(t*h),u=Math.round(e*h),l/he&&--u,h=-h):(h=Math.pow(10,i)*s,l=Math.round(t/h),u=Math.round(e/h),l*he&&--u),u0))return[];if(t===e)return[t];let n=e=i))return[];let l=a-i+1,u=new Array(l);if(n)if(s<0)for(let h=0;h{"use strict";CDe=Math.sqrt(50),ADe=Math.sqrt(10),_De=Math.sqrt(2);o(Gw,"tickSpec");o(Vw,"ticks");o(W2,"tickIncrement");o(bg,"tickStep")});function qw(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var $X=O(()=>{"use strict";o(qw,"max")});function Uw(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var zX=O(()=>{"use strict";o(Uw,"min")});function Ww(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{"use strict";o(Ww,"range")});var Cf=O(()=>{"use strict";OX();ID();$X();zX();GX();FX();BX()});function BD(t){return t}var VX=O(()=>{"use strict";o(BD,"default")});function DDe(t){return"translate("+t+",0)"}function RDe(t){return"translate(0,"+t+")"}function LDe(t){return e=>+t(e)}function NDe(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function MDe(){return!this.__axis}function UX(t,e){var r=[],n=null,i=null,a=6,s=6,l=3,u=typeof window<"u"&&window.devicePixelRatio>1?0:.5,h=t===Yw||t===Hw?-1:1,f=t===Hw||t===FD?"x":"y",d=t===Yw||t===$D?DDe:RDe;function p(m){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),y=i??(e.tickFormat?e.tickFormat.apply(e,r):BD),v=Math.max(a,0)+l,x=e.range(),b=+x[0]+u,T=+x[x.length-1]+u,E=(e.bandwidth?NDe:LDe)(e.copy(),u),w=m.selection?m.selection():m,k=w.selectAll(".domain").data([null]),S=w.selectAll(".tick").data(g,e).order(),A=S.exit(),L=S.enter().append("g").attr("class","tick"),I=S.select("line"),N=S.select("text");k=k.merge(k.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),S=S.merge(L),I=I.merge(L.append("line").attr("stroke","currentColor").attr(f+"2",h*a)),N=N.merge(L.append("text").attr("fill","currentColor").attr(f,h*v).attr("dy",t===Yw?"0em":t===$D?"0.71em":"0.32em")),m!==w&&(k=k.transition(m),S=S.transition(m),I=I.transition(m),N=N.transition(m),A=A.transition(m).attr("opacity",qX).attr("transform",function(C){return isFinite(C=E(C))?d(C+u):this.getAttribute("transform")}),L.attr("opacity",qX).attr("transform",function(C){var _=this.parentNode.__axis;return d((_&&isFinite(_=_(C))?_:E(C))+u)})),A.remove(),k.attr("d",t===Hw||t===FD?s?"M"+h*s+","+b+"H"+u+"V"+T+"H"+h*s:"M"+u+","+b+"V"+T:s?"M"+b+","+h*s+"V"+u+"H"+T+"V"+h*s:"M"+b+","+u+"H"+T),S.attr("opacity",1).attr("transform",function(C){return d(E(C)+u)}),I.attr(f+"2",h*a),N.attr(f,h*v).text(y),w.filter(MDe).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===FD?"start":t===Hw?"end":"middle"),w.each(function(){this.__axis=E})}return o(p,"axis"),p.scale=function(m){return arguments.length?(e=m,p):e},p.ticks=function(){return r=Array.from(arguments),p},p.tickArguments=function(m){return arguments.length?(r=m==null?[]:Array.from(m),p):r.slice()},p.tickValues=function(m){return arguments.length?(n=m==null?null:Array.from(m),p):n&&n.slice()},p.tickFormat=function(m){return arguments.length?(i=m,p):i},p.tickSize=function(m){return arguments.length?(a=s=+m,p):a},p.tickSizeInner=function(m){return arguments.length?(a=+m,p):a},p.tickSizeOuter=function(m){return arguments.length?(s=+m,p):s},p.tickPadding=function(m){return arguments.length?(l=+m,p):l},p.offset=function(m){return arguments.length?(u=+m,p):u},p}function zD(t){return UX(Yw,t)}function GD(t){return UX($D,t)}var Yw,FD,$D,Hw,qX,WX=O(()=>{"use strict";VX();Yw=1,FD=2,$D=3,Hw=4,qX=1e-6;o(DDe,"translateX");o(RDe,"translateY");o(LDe,"number");o(NDe,"center");o(MDe,"entering");o(UX,"axis");o(zD,"axisTop");o(GD,"axisBottom")});var HX=O(()=>{"use strict";WX()});function jX(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function PDe(t,e){for(var r=0,n=t.length,i;r{"use strict";IDe={value:o(()=>{},"value")};o(jX,"dispatch");o(jw,"Dispatch");o(ODe,"parseTypenames");jw.prototype=jX.prototype={constructor:jw,on:o(function(t,e){var r=this._,n=ODe(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{"use strict";XX()});var Xw,UD,WD=O(()=>{"use strict";Xw="http://www.w3.org/1999/xhtml",UD={svg:"http://www.w3.org/2000/svg",xhtml:Xw,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function Zc(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),UD.hasOwnProperty(e)?{space:UD[e],local:t}:t}var Kw=O(()=>{"use strict";WD();o(Zc,"default")});function BDe(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===Xw&&e.documentElement.namespaceURI===Xw?e.createElement(t):e.createElementNS(r,t)}}function FDe(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function H2(t){var e=Zc(t);return(e.local?FDe:BDe)(e)}var HD=O(()=>{"use strict";Kw();WD();o(BDe,"creatorInherit");o(FDe,"creatorFixed");o(H2,"default")});function $De(){}function Af(t){return t==null?$De:function(){return this.querySelector(t)}}var Qw=O(()=>{"use strict";o($De,"none");o(Af,"default")});function YD(t){typeof t!="function"&&(t=Af(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";tc();Qw();o(YD,"default")});function jD(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var QX=O(()=>{"use strict";o(jD,"array")});function zDe(){return[]}function Tg(t){return t==null?zDe:function(){return this.querySelectorAll(t)}}var XD=O(()=>{"use strict";o(zDe,"empty");o(Tg,"default")});function GDe(t){return function(){return jD(t.apply(this,arguments))}}function KD(t){typeof t=="function"?t=GDe(t):t=Tg(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{"use strict";tc();QX();XD();o(GDe,"arrayAll");o(KD,"default")});function wg(t){return function(){return this.matches(t)}}function Zw(t){return function(e){return e.matches(t)}}var Y2=O(()=>{"use strict";o(wg,"default");o(Zw,"childMatcher")});function qDe(t){return function(){return VDe.call(this.children,t)}}function UDe(){return this.firstElementChild}function QD(t){return this.select(t==null?UDe:qDe(typeof t=="function"?t:Zw(t)))}var VDe,JX=O(()=>{"use strict";Y2();VDe=Array.prototype.find;o(qDe,"childFind");o(UDe,"childFirst");o(QD,"default")});function HDe(){return Array.from(this.children)}function YDe(t){return function(){return WDe.call(this.children,t)}}function ZD(t){return this.selectAll(t==null?HDe:YDe(typeof t=="function"?t:Zw(t)))}var WDe,eK=O(()=>{"use strict";Y2();WDe=Array.prototype.filter;o(HDe,"children");o(YDe,"childrenFilter");o(ZD,"default")});function JD(t){typeof t!="function"&&(t=wg(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";tc();Y2();o(JD,"default")});function j2(t){return new Array(t.length)}var eR=O(()=>{"use strict";o(j2,"default")});function tR(){return new Di(this._enter||this._groups.map(j2),this._parents)}function X2(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var rR=O(()=>{"use strict";eR();tc();o(tR,"default");o(X2,"EnterNode");X2.prototype={constructor:X2,appendChild:o(function(t){return this._parent.insertBefore(t,this._next)},"appendChild"),insertBefore:o(function(t,e){return this._parent.insertBefore(t,e)},"insertBefore"),querySelector:o(function(t){return this._parent.querySelector(t)},"querySelector"),querySelectorAll:o(function(t){return this._parent.querySelectorAll(t)},"querySelectorAll")}});function nR(t){return function(){return t}}var rK=O(()=>{"use strict";o(nR,"default")});function jDe(t,e,r,n,i,a){for(var s=0,l,u=e.length,h=a.length;s=T&&(T=b+1);!(w=v[T])&&++T{"use strict";tc();rR();rK();o(jDe,"bindIndex");o(XDe,"bindKey");o(KDe,"datum");o(iR,"default");o(QDe,"arraylike")});function aR(){return new Di(this._exit||this._groups.map(j2),this._parents)}var iK=O(()=>{"use strict";eR();tc();o(aR,"default")});function sR(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var aK=O(()=>{"use strict";o(sR,"default")});function oR(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),l=new Array(i),u=0;u{"use strict";tc();o(oR,"default")});function lR(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var oK=O(()=>{"use strict";o(lR,"default")});function cR(t){t||(t=ZDe);function e(d,p){return d&&p?t(d.__data__,p.__data__):!d-!p}o(e,"compareNode");for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var lK=O(()=>{"use strict";tc();o(cR,"default");o(ZDe,"ascending")});function uR(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var cK=O(()=>{"use strict";o(uR,"default")});function hR(){return Array.from(this)}var uK=O(()=>{"use strict";o(hR,"default")});function fR(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(fR,"default")});function dR(){let t=0;for(let e of this)++t;return t}var fK=O(()=>{"use strict";o(dR,"default")});function pR(){return!this.node()}var dK=O(()=>{"use strict";o(pR,"default")});function mR(t){for(var e=this._groups,r=0,n=e.length;r{"use strict";o(mR,"default")});function JDe(t){return function(){this.removeAttribute(t)}}function eRe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function tRe(t,e){return function(){this.setAttribute(t,e)}}function rRe(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function nRe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function iRe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function gR(t,e){var r=Zc(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?eRe:JDe:typeof e=="function"?r.local?iRe:nRe:r.local?rRe:tRe)(r,e))}var mK=O(()=>{"use strict";Kw();o(JDe,"attrRemove");o(eRe,"attrRemoveNS");o(tRe,"attrConstant");o(rRe,"attrConstantNS");o(nRe,"attrFunction");o(iRe,"attrFunctionNS");o(gR,"default")});function K2(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var yR=O(()=>{"use strict";o(K2,"default")});function aRe(t){return function(){this.style.removeProperty(t)}}function sRe(t,e,r){return function(){this.style.setProperty(t,e,r)}}function oRe(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function vR(t,e,r){return arguments.length>1?this.each((e==null?aRe:typeof e=="function"?oRe:sRe)(t,e,r??"")):_f(this.node(),t)}function _f(t,e){return t.style.getPropertyValue(e)||K2(t).getComputedStyle(t,null).getPropertyValue(e)}var xR=O(()=>{"use strict";yR();o(aRe,"styleRemove");o(sRe,"styleConstant");o(oRe,"styleFunction");o(vR,"default");o(_f,"styleValue")});function lRe(t){return function(){delete this[t]}}function cRe(t,e){return function(){this[t]=e}}function uRe(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function bR(t,e){return arguments.length>1?this.each((e==null?lRe:typeof e=="function"?uRe:cRe)(t,e)):this.node()[t]}var gK=O(()=>{"use strict";o(lRe,"propertyRemove");o(cRe,"propertyConstant");o(uRe,"propertyFunction");o(bR,"default")});function yK(t){return t.trim().split(/^|\s+/)}function TR(t){return t.classList||new vK(t)}function vK(t){this._node=t,this._names=yK(t.getAttribute("class")||"")}function xK(t,e){for(var r=TR(t),n=-1,i=e.length;++n{"use strict";o(yK,"classArray");o(TR,"classList");o(vK,"ClassList");vK.prototype={add:o(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:o(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:o(function(t){return this._names.indexOf(t)>=0},"contains")};o(xK,"classedAdd");o(bK,"classedRemove");o(hRe,"classedTrue");o(fRe,"classedFalse");o(dRe,"classedFunction");o(wR,"default")});function pRe(){this.textContent=""}function mRe(t){return function(){this.textContent=t}}function gRe(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function kR(t){return arguments.length?this.each(t==null?pRe:(typeof t=="function"?gRe:mRe)(t)):this.node().textContent}var wK=O(()=>{"use strict";o(pRe,"textRemove");o(mRe,"textConstant");o(gRe,"textFunction");o(kR,"default")});function yRe(){this.innerHTML=""}function vRe(t){return function(){this.innerHTML=t}}function xRe(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function ER(t){return arguments.length?this.each(t==null?yRe:(typeof t=="function"?xRe:vRe)(t)):this.node().innerHTML}var kK=O(()=>{"use strict";o(yRe,"htmlRemove");o(vRe,"htmlConstant");o(xRe,"htmlFunction");o(ER,"default")});function bRe(){this.nextSibling&&this.parentNode.appendChild(this)}function SR(){return this.each(bRe)}var EK=O(()=>{"use strict";o(bRe,"raise");o(SR,"default")});function TRe(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function CR(){return this.each(TRe)}var SK=O(()=>{"use strict";o(TRe,"lower");o(CR,"default")});function AR(t){var e=typeof t=="function"?t:H2(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var CK=O(()=>{"use strict";HD();o(AR,"default")});function wRe(){return null}function _R(t,e){var r=typeof t=="function"?t:H2(t),n=e==null?wRe:typeof e=="function"?e:Af(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var AK=O(()=>{"use strict";HD();Qw();o(wRe,"constantNull");o(_R,"default")});function kRe(){var t=this.parentNode;t&&t.removeChild(this)}function DR(){return this.each(kRe)}var _K=O(()=>{"use strict";o(kRe,"remove");o(DR,"default")});function ERe(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function SRe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function RR(t){return this.select(t?SRe:ERe)}var DK=O(()=>{"use strict";o(ERe,"selection_cloneShallow");o(SRe,"selection_cloneDeep");o(RR,"default")});function LR(t){return arguments.length?this.property("__data__",t):this.node().__data__}var RK=O(()=>{"use strict";o(LR,"default")});function CRe(t){return function(e){t.call(this,e,this.__data__)}}function ARe(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function _Re(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{"use strict";o(CRe,"contextListener");o(ARe,"parseTypenames");o(_Re,"onRemove");o(DRe,"onAdd");o(NR,"default")});function NK(t,e,r){var n=K2(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function RRe(t,e){return function(){return NK(this,t,e)}}function LRe(t,e){return function(){return NK(this,t,e.apply(this,arguments))}}function MR(t,e){return this.each((typeof e=="function"?LRe:RRe)(t,e))}var MK=O(()=>{"use strict";yR();o(NK,"dispatchEvent");o(RRe,"dispatchConstant");o(LRe,"dispatchFunction");o(MR,"default")});function*IR(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(IR,"default")});function Di(t,e){this._groups=t,this._parents=e}function OK(){return new Di([[document.documentElement]],OR)}function NRe(){return this}var OR,hh,tc=O(()=>{"use strict";KX();ZX();JX();eK();tK();nK();rR();iK();aK();sK();oK();lK();cK();uK();hK();fK();dK();pK();mK();xR();gK();TK();wK();kK();EK();SK();CK();AK();_K();DK();RK();LK();MK();IK();OR=[null];o(Di,"Selection");o(OK,"selection");o(NRe,"selection_selection");Di.prototype=OK.prototype={constructor:Di,select:YD,selectAll:KD,selectChild:QD,selectChildren:ZD,filter:JD,data:iR,enter:tR,exit:aR,join:sR,merge:oR,selection:NRe,order:lR,sort:cR,call:uR,nodes:hR,node:fR,size:dR,empty:pR,each:mR,attr:gR,style:vR,property:bR,classed:wR,text:kR,html:ER,raise:SR,lower:CR,append:AR,insert:_R,remove:DR,clone:RR,datum:LR,on:NR,dispatch:MR,[Symbol.iterator]:IR};hh=OK});function je(t){return typeof t=="string"?new Di([[document.querySelector(t)]],[document.documentElement]):new Di([[t]],OR)}var PK=O(()=>{"use strict";tc();o(je,"default")});var rc=O(()=>{"use strict";Y2();Kw();PK();tc();Qw();XD();xR()});var BK=O(()=>{"use strict"});function Df(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function kg(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var PR=O(()=>{"use strict";o(Df,"default");o(kg,"extend")});function Rf(){}function $K(){return this.rgb().formatHex()}function zRe(){return this.rgb().formatHex8()}function GRe(){return HK(this).formatHsl()}function zK(){return this.rgb().formatRgb()}function ic(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=MRe.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?GK(e):r===3?new Na(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?Jw(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?Jw(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=IRe.exec(t))?new Na(e[1],e[2],e[3],1):(e=ORe.exec(t))?new Na(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=PRe.exec(t))?Jw(e[1],e[2],e[3],e[4]):(e=BRe.exec(t))?Jw(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=FRe.exec(t))?UK(e[1],e[2]/100,e[3]/100,1):(e=$Re.exec(t))?UK(e[1],e[2]/100,e[3]/100,e[4]):FK.hasOwnProperty(t)?GK(FK[t]):t==="transparent"?new Na(NaN,NaN,NaN,0):null}function GK(t){return new Na(t>>16&255,t>>8&255,t&255,1)}function Jw(t,e,r,n){return n<=0&&(t=e=r=NaN),new Na(t,e,r,n)}function FR(t){return t instanceof Rf||(t=ic(t)),t?(t=t.rgb(),new Na(t.r,t.g,t.b,t.opacity)):new Na}function Sg(t,e,r,n){return arguments.length===1?FR(t):new Na(t,e,r,n??1)}function Na(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function VK(){return`#${Vp(this.r)}${Vp(this.g)}${Vp(this.b)}`}function VRe(){return`#${Vp(this.r)}${Vp(this.g)}${Vp(this.b)}${Vp((isNaN(this.opacity)?1:this.opacity)*255)}`}function qK(){let t=r5(this.opacity);return`${t===1?"rgb(":"rgba("}${qp(this.r)}, ${qp(this.g)}, ${qp(this.b)}${t===1?")":`, ${t})`}`}function r5(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function qp(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Vp(t){return t=qp(t),(t<16?"0":"")+t.toString(16)}function UK(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new nc(t,e,r,n)}function HK(t){if(t instanceof nc)return new nc(t.h,t.s,t.l,t.opacity);if(t instanceof Rf||(t=ic(t)),!t)return new nc;if(t instanceof nc)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,l=a-i,u=(a+i)/2;return l?(e===a?s=(r-n)/l+(r0&&u<1?0:s,new nc(s,l,u,t.opacity)}function YK(t,e,r,n){return arguments.length===1?HK(t):new nc(t,e,r,n??1)}function nc(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function WK(t){return t=(t||0)%360,t<0?t+360:t}function e5(t){return Math.max(0,Math.min(1,t||0))}function BR(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var Q2,t5,Eg,Z2,Jc,MRe,IRe,ORe,PRe,BRe,FRe,$Re,FK,$R=O(()=>{"use strict";PR();o(Rf,"Color");Q2=.7,t5=1/Q2,Eg="\\s*([+-]?\\d+)\\s*",Z2="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",Jc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",MRe=/^#([0-9a-f]{3,8})$/,IRe=new RegExp(`^rgb\\(${Eg},${Eg},${Eg}\\)$`),ORe=new RegExp(`^rgb\\(${Jc},${Jc},${Jc}\\)$`),PRe=new RegExp(`^rgba\\(${Eg},${Eg},${Eg},${Z2}\\)$`),BRe=new RegExp(`^rgba\\(${Jc},${Jc},${Jc},${Z2}\\)$`),FRe=new RegExp(`^hsl\\(${Z2},${Jc},${Jc}\\)$`),$Re=new RegExp(`^hsla\\(${Z2},${Jc},${Jc},${Z2}\\)$`),FK={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Df(Rf,ic,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:$K,formatHex:$K,formatHex8:zRe,formatHsl:GRe,formatRgb:zK,toString:zK});o($K,"color_formatHex");o(zRe,"color_formatHex8");o(GRe,"color_formatHsl");o(zK,"color_formatRgb");o(ic,"color");o(GK,"rgbn");o(Jw,"rgba");o(FR,"rgbConvert");o(Sg,"rgb");o(Na,"Rgb");Df(Na,Sg,kg(Rf,{brighter(t){return t=t==null?t5:Math.pow(t5,t),new Na(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Q2:Math.pow(Q2,t),new Na(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Na(qp(this.r),qp(this.g),qp(this.b),r5(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:VK,formatHex:VK,formatHex8:VRe,formatRgb:qK,toString:qK}));o(VK,"rgb_formatHex");o(VRe,"rgb_formatHex8");o(qK,"rgb_formatRgb");o(r5,"clampa");o(qp,"clampi");o(Vp,"hex");o(UK,"hsla");o(HK,"hslConvert");o(YK,"hsl");o(nc,"Hsl");Df(nc,YK,kg(Rf,{brighter(t){return t=t==null?t5:Math.pow(t5,t),new nc(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Q2:Math.pow(Q2,t),new nc(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new Na(BR(t>=240?t-240:t+120,i,n),BR(t,i,n),BR(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new nc(WK(this.h),e5(this.s),e5(this.l),r5(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=r5(this.opacity);return`${t===1?"hsl(":"hsla("}${WK(this.h)}, ${e5(this.s)*100}%, ${e5(this.l)*100}%${t===1?")":`, ${t})`}`}}));o(WK,"clamph");o(e5,"clampt");o(BR,"hsl2rgb")});var jK,XK,KK=O(()=>{"use strict";jK=Math.PI/180,XK=180/Math.PI});function rQ(t){if(t instanceof eu)return new eu(t.l,t.a,t.b,t.opacity);if(t instanceof fh)return nQ(t);t instanceof Na||(t=FR(t));var e=qR(t.r),r=qR(t.g),n=qR(t.b),i=zR((.2225045*e+.7168786*r+.0606169*n)/ZK),a,s;return e===r&&r===n?a=s=i:(a=zR((.4360747*e+.3850649*r+.1430804*n)/QK),s=zR((.0139322*e+.0971045*r+.7141733*n)/JK)),new eu(116*i-16,500*(a-i),200*(i-s),t.opacity)}function UR(t,e,r,n){return arguments.length===1?rQ(t):new eu(t,e,r,n??1)}function eu(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function zR(t){return t>qRe?Math.pow(t,1/3):t/tQ+eQ}function GR(t){return t>Cg?t*t*t:tQ*(t-eQ)}function VR(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function qR(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function URe(t){if(t instanceof fh)return new fh(t.h,t.c,t.l,t.opacity);if(t instanceof eu||(t=rQ(t)),t.a===0&&t.b===0)return new fh(NaN,0{"use strict";PR();$R();KK();n5=18,QK=.96422,ZK=1,JK=.82521,eQ=4/29,Cg=6/29,tQ=3*Cg*Cg,qRe=Cg*Cg*Cg;o(rQ,"labConvert");o(UR,"lab");o(eu,"Lab");Df(eu,UR,kg(Rf,{brighter(t){return new eu(this.l+n5*(t??1),this.a,this.b,this.opacity)},darker(t){return new eu(this.l-n5*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=QK*GR(e),t=ZK*GR(t),r=JK*GR(r),new Na(VR(3.1338561*e-1.6168667*t-.4906146*r),VR(-.9787684*e+1.9161415*t+.033454*r),VR(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));o(zR,"xyz2lab");o(GR,"lab2xyz");o(VR,"lrgb2rgb");o(qR,"rgb2lrgb");o(URe,"hclConvert");o(J2,"hcl");o(fh,"Hcl");o(nQ,"hcl2lab");Df(fh,J2,kg(Rf,{brighter(t){return new fh(this.h,this.c,this.l+n5*(t??1),this.opacity)},darker(t){return new fh(this.h,this.c,this.l-n5*(t??1),this.opacity)},rgb(){return nQ(this).rgb()}}))});var Ag=O(()=>{"use strict";$R();iQ()});function WR(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function HR(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,l=n{"use strict";o(WR,"basis");o(HR,"default")});function jR(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],l=t[(n+2)%e];return WR((r-n/e)*e,i,a,s,l)}}var aQ=O(()=>{"use strict";YR();o(jR,"default")});var _g,XR=O(()=>{"use strict";_g=o(t=>()=>t,"default")});function sQ(t,e){return function(r){return t+r*e}}function WRe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function oQ(t,e){var r=e-t;return r?sQ(t,r>180||r<-180?r-360*Math.round(r/360):r):_g(isNaN(t)?e:t)}function lQ(t){return(t=+t)==1?dh:function(e,r){return r-e?WRe(e,r,t):_g(isNaN(e)?r:e)}}function dh(t,e){var r=e-t;return r?sQ(t,r):_g(isNaN(t)?e:t)}var KR=O(()=>{"use strict";XR();o(sQ,"linear");o(WRe,"exponential");o(oQ,"hue");o(lQ,"gamma");o(dh,"nogamma")});function cQ(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,l;for(s=0;s{"use strict";Ag();YR();aQ();KR();Up=o((function t(e){var r=lQ(e);function n(i,a){var s=r((i=Sg(i)).r,(a=Sg(a)).r),l=r(i.g,a.g),u=r(i.b,a.b),h=dh(i.opacity,a.opacity);return function(f){return i.r=s(f),i.g=l(f),i.b=u(f),i.opacity=h(f),i+""}}return o(n,"rgb"),n.gamma=t,n}),"rgbGamma")(1);o(cQ,"rgbSpline");HRe=cQ(HR),YRe=cQ(jR)});function ZR(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{"use strict";o(ZR,"default");o(uQ,"isNumberArray")});function fQ(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{"use strict";i5();o(fQ,"genericArray")});function JR(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var pQ=O(()=>{"use strict";o(JR,"default")});function da(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var ex=O(()=>{"use strict";o(da,"default")});function eL(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=Lf(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var mQ=O(()=>{"use strict";i5();o(eL,"default")});function jRe(t){return function(){return t}}function XRe(t){return function(e){return t(e)+""}}function Dg(t,e){var r=rL.lastIndex=tL.lastIndex=0,n,i,a,s=-1,l=[],u=[];for(t=t+"",e=e+"";(n=rL.exec(t))&&(i=tL.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),l[s]?l[s]+=a:l[++s]=a),(n=n[0])===(i=i[0])?l[s]?l[s]+=i:l[++s]=i:(l[++s]=null,u.push({i:s,x:da(n,i)})),r=tL.lastIndex;return r{"use strict";ex();rL=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,tL=new RegExp(rL.source,"g");o(jRe,"zero");o(XRe,"one");o(Dg,"default")});function Lf(t,e){var r=typeof e,n;return e==null||r==="boolean"?_g(e):(r==="number"?da:r==="string"?(n=ic(e))?(e=n,Up):Dg:e instanceof ic?Up:e instanceof Date?JR:uQ(e)?ZR:Array.isArray(e)?fQ:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?eL:da)(t,e)}var i5=O(()=>{"use strict";Ag();QR();dQ();pQ();ex();mQ();nL();XR();hQ();o(Lf,"default")});function a5(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var gQ=O(()=>{"use strict";o(a5,"default")});function o5(t,e,r,n,i,a){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*r+e*n)&&(r-=t*u,n-=e*u),(l=Math.sqrt(r*r+n*n))&&(r/=l,n/=l,u/=l),t*n{"use strict";yQ=180/Math.PI,s5={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};o(o5,"default")});function xQ(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?s5:o5(e.a,e.b,e.c,e.d,e.e,e.f)}function bQ(t){return t==null?s5:(l5||(l5=document.createElementNS("http://www.w3.org/2000/svg","g")),l5.setAttribute("transform",t),(t=l5.transform.baseVal.consolidate())?(t=t.matrix,o5(t.a,t.b,t.c,t.d,t.e,t.f)):s5)}var l5,TQ=O(()=>{"use strict";vQ();o(xQ,"parseCss");o(bQ,"parseSvg")});function wQ(t,e,r,n){function i(h){return h.length?h.pop()+" ":""}o(i,"pop");function a(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push("translate(",null,e,null,r);g.push({i:y-4,x:da(h,d)},{i:y-2,x:da(f,p)})}else(d||p)&&m.push("translate("+d+e+p+r)}o(a,"translate");function s(h,f,d,p){h!==f?(h-f>180?f+=360:f-h>180&&(h+=360),p.push({i:d.push(i(d)+"rotate(",null,n)-2,x:da(h,f)})):f&&d.push(i(d)+"rotate("+f+n)}o(s,"rotate");function l(h,f,d,p){h!==f?p.push({i:d.push(i(d)+"skewX(",null,n)-2,x:da(h,f)}):f&&d.push(i(d)+"skewX("+f+n)}o(l,"skewX");function u(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push(i(m)+"scale(",null,",",null,")");g.push({i:y-4,x:da(h,d)},{i:y-2,x:da(f,p)})}else(d!==1||p!==1)&&m.push(i(m)+"scale("+d+","+p+")")}return o(u,"scale"),function(h,f){var d=[],p=[];return h=t(h),f=t(f),a(h.translateX,h.translateY,f.translateX,f.translateY,d,p),s(h.rotate,f.rotate,d,p),l(h.skewX,f.skewX,d,p),u(h.scaleX,h.scaleY,f.scaleX,f.scaleY,d,p),h=f=null,function(m){for(var g=-1,y=p.length,v;++g{"use strict";ex();TQ();o(wQ,"interpolateTransform");iL=wQ(xQ,"px, ","px)","deg)"),aL=wQ(bQ,", ",")",")")});function EQ(t){return function(e,r){var n=t((e=J2(e)).h,(r=J2(r)).h),i=dh(e.c,r.c),a=dh(e.l,r.l),s=dh(e.opacity,r.opacity);return function(l){return e.h=n(l),e.c=i(l),e.l=a(l),e.opacity=s(l),e+""}}}var sL,KRe,SQ=O(()=>{"use strict";Ag();KR();o(EQ,"hcl");sL=EQ(oQ),KRe=EQ(dh)});var Rg=O(()=>{"use strict";i5();ex();gQ();nL();kQ();QR();SQ()});function sx(){return Wp||(_Q(QRe),Wp=ix.now()+h5)}function QRe(){Wp=0}function ax(){this._call=this._time=this._next=null}function f5(t,e,r){var n=new ax;return n.restart(t,e,r),n}function DQ(){sx(),++Lg;for(var t=c5,e;t;)(e=Wp-t._time)>=0&&t._call.call(void 0,e),t=t._next;--Lg}function CQ(){Wp=(u5=ix.now())+h5,Lg=rx=0;try{DQ()}finally{Lg=0,JRe(),Wp=0}}function ZRe(){var t=ix.now(),e=t-u5;e>AQ&&(h5-=e,u5=t)}function JRe(){for(var t,e=c5,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:c5=r);nx=t,oL(n)}function oL(t){if(!Lg){rx&&(rx=clearTimeout(rx));var e=t-Wp;e>24?(t<1/0&&(rx=setTimeout(CQ,t-ix.now()-h5)),tx&&(tx=clearInterval(tx))):(tx||(u5=ix.now(),tx=setInterval(ZRe,AQ)),Lg=1,_Q(CQ))}}var Lg,rx,tx,AQ,c5,nx,u5,Wp,h5,ix,_Q,lL=O(()=>{"use strict";Lg=0,rx=0,tx=0,AQ=1e3,u5=0,Wp=0,h5=0,ix=typeof performance=="object"&&performance.now?performance:Date,_Q=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};o(sx,"now");o(QRe,"clearNow");o(ax,"Timer");ax.prototype=f5.prototype={constructor:ax,restart:o(function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?sx():+r)+(e==null?0:+e),!this._next&&nx!==this&&(nx?nx._next=this:c5=this,nx=this),this._call=t,this._time=r,oL()},"restart"),stop:o(function(){this._call&&(this._call=null,this._time=1/0,oL())},"stop")};o(f5,"timer");o(DQ,"timerFlush");o(CQ,"wake");o(ZRe,"poke");o(JRe,"nap");o(oL,"sleep")});function ox(t,e,r){var n=new ax;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var RQ=O(()=>{"use strict";lL();o(ox,"default")});var d5=O(()=>{"use strict";lL();RQ()});function ph(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;rLe(t,r,{name:e,index:n,group:i,on:eLe,tween:tLe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:MQ})}function cx(t,e){var r=ta(t,e);if(r.state>MQ)throw new Error("too late; already scheduled");return r}function Ma(t,e){var r=ta(t,e);if(r.state>p5)throw new Error("too late; already running");return r}function ta(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function rLe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=f5(a,0,r.time);function a(h){r.state=LQ,r.timer.restart(s,r.delay,r.time),r.delay<=h&&s(h-r.delay)}o(a,"schedule");function s(h){var f,d,p,m;if(r.state!==LQ)return u();for(f in n)if(m=n[f],m.name===r.name){if(m.state===p5)return ox(s);m.state===NQ?(m.state=lx,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete n[f]):+f{"use strict";qD();d5();eLe=VD("start","end","cancel","interrupt"),tLe=[],MQ=0,LQ=1,m5=2,p5=3,NQ=4,g5=5,lx=6;o(ph,"default");o(cx,"init");o(Ma,"set");o(ta,"get");o(rLe,"create")});function ux(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>m5&&n.state{"use strict";to();o(ux,"default")});function cL(t){return this.each(function(){ux(this,t)})}var OQ=O(()=>{"use strict";IQ();o(cL,"default")});function nLe(t,e){var r,n;return function(){var i=Ma(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,l=n.length;s{"use strict";to();o(nLe,"tweenRemove");o(iLe,"tweenFunction");o(uL,"default");o(Ng,"tweenValue")});function fx(t,e){var r;return(typeof e=="number"?da:e instanceof ic?Up:(r=ic(e))?(e=r,Up):Dg)(t,e)}var hL=O(()=>{"use strict";Ag();Rg();o(fx,"default")});function aLe(t){return function(){this.removeAttribute(t)}}function sLe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function oLe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function lLe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function cLe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttribute(t):(s=this.getAttribute(t),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function uLe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function fL(t,e){var r=Zc(t),n=r==="transform"?aL:fx;return this.attrTween(t,typeof e=="function"?(r.local?uLe:cLe)(r,n,Ng(this,"attr."+t,e)):e==null?(r.local?sLe:aLe)(r):(r.local?lLe:oLe)(r,n,e))}var PQ=O(()=>{"use strict";Rg();rc();hx();hL();o(aLe,"attrRemove");o(sLe,"attrRemoveNS");o(oLe,"attrConstant");o(lLe,"attrConstantNS");o(cLe,"attrFunction");o(uLe,"attrFunctionNS");o(fL,"default")});function hLe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function fLe(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function dLe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&fLe(t,a)),r}return o(i,"tween"),i._value=e,i}function pLe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&hLe(t,a)),r}return o(i,"tween"),i._value=e,i}function dL(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=Zc(t);return this.tween(r,(n.local?dLe:pLe)(n,e))}var BQ=O(()=>{"use strict";rc();o(hLe,"attrInterpolate");o(fLe,"attrInterpolateNS");o(dLe,"attrTweenNS");o(pLe,"attrTween");o(dL,"default")});function mLe(t,e){return function(){cx(this,t).delay=+e.apply(this,arguments)}}function gLe(t,e){return e=+e,function(){cx(this,t).delay=e}}function pL(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?mLe:gLe)(e,t)):ta(this.node(),e).delay}var FQ=O(()=>{"use strict";to();o(mLe,"delayFunction");o(gLe,"delayConstant");o(pL,"default")});function yLe(t,e){return function(){Ma(this,t).duration=+e.apply(this,arguments)}}function vLe(t,e){return e=+e,function(){Ma(this,t).duration=e}}function mL(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?yLe:vLe)(e,t)):ta(this.node(),e).duration}var $Q=O(()=>{"use strict";to();o(yLe,"durationFunction");o(vLe,"durationConstant");o(mL,"default")});function xLe(t,e){if(typeof e!="function")throw new Error;return function(){Ma(this,t).ease=e}}function gL(t){var e=this._id;return arguments.length?this.each(xLe(e,t)):ta(this.node(),e).ease}var zQ=O(()=>{"use strict";to();o(xLe,"easeConstant");o(gL,"default")});function bLe(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;Ma(this,t).ease=r}}function yL(t){if(typeof t!="function")throw new Error;return this.each(bLe(this._id,t))}var GQ=O(()=>{"use strict";to();o(bLe,"easeVarying");o(yL,"default")});function vL(t){typeof t!="function"&&(t=wg(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";rc();Hp();o(vL,"default")});function xL(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),l=0;l{"use strict";Hp();o(xL,"default")});function TLe(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function wLe(t,e,r){var n,i,a=TLe(e)?cx:Ma;return function(){var s=a(this,t),l=s.on;l!==n&&(i=(n=l).copy()).on(e,r),s.on=i}}function bL(t,e){var r=this._id;return arguments.length<2?ta(this.node(),r).on.on(t):this.each(wLe(r,t,e))}var UQ=O(()=>{"use strict";to();o(TLe,"start");o(wLe,"onFunction");o(bL,"default")});function kLe(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function TL(){return this.on("end.remove",kLe(this._id))}var WQ=O(()=>{"use strict";o(kLe,"removeFunction");o(TL,"default")});function wL(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Af(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{"use strict";rc();Hp();to();o(wL,"default")});function kL(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Tg(t));for(var n=this._groups,i=n.length,a=[],s=[],l=0;l{"use strict";rc();Hp();to();o(kL,"default")});function EL(){return new ELe(this._groups,this._parents)}var ELe,jQ=O(()=>{"use strict";rc();ELe=hh.prototype.constructor;o(EL,"default")});function SLe(t,e){var r,n,i;return function(){var a=_f(this,t),s=(this.style.removeProperty(t),_f(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function XQ(t){return function(){this.style.removeProperty(t)}}function CLe(t,e,r){var n,i=r+"",a;return function(){var s=_f(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function ALe(t,e,r){var n,i,a;return function(){var s=_f(this,t),l=r(this),u=l+"";return l==null&&(u=l=(this.style.removeProperty(t),_f(this,t))),s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l))}}function _Le(t,e){var r,n,i,a="style."+e,s="end."+a,l;return function(){var u=Ma(this,t),h=u.on,f=u.value[a]==null?l||(l=XQ(e)):void 0;(h!==r||i!==f)&&(n=(r=h).copy()).on(s,i=f),u.on=n}}function SL(t,e,r){var n=(t+="")=="transform"?iL:fx;return e==null?this.styleTween(t,SLe(t,n)).on("end.style."+t,XQ(t)):typeof e=="function"?this.styleTween(t,ALe(t,n,Ng(this,"style."+t,e))).each(_Le(this._id,t)):this.styleTween(t,CLe(t,n,e),r).on("end.style."+t,null)}var KQ=O(()=>{"use strict";Rg();rc();to();hx();hL();o(SLe,"styleNull");o(XQ,"styleRemove");o(CLe,"styleConstant");o(ALe,"styleFunction");o(_Le,"styleMaybeRemove");o(SL,"default")});function DLe(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function RLe(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&DLe(t,s,r)),n}return o(a,"tween"),a._value=e,a}function CL(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,RLe(t,e,r??""))}var QQ=O(()=>{"use strict";o(DLe,"styleInterpolate");o(RLe,"styleTween");o(CL,"default")});function LLe(t){return function(){this.textContent=t}}function NLe(t){return function(){var e=t(this);this.textContent=e??""}}function AL(t){return this.tween("text",typeof t=="function"?NLe(Ng(this,"text",t)):LLe(t==null?"":t+""))}var ZQ=O(()=>{"use strict";hx();o(LLe,"textConstant");o(NLe,"textFunction");o(AL,"default")});function MLe(t){return function(e){this.textContent=t.call(this,e)}}function ILe(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&MLe(i)),e}return o(n,"tween"),n._value=t,n}function _L(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,ILe(t))}var JQ=O(()=>{"use strict";o(MLe,"textInterpolate");o(ILe,"textTween");o(_L,"default")});function DL(){for(var t=this._name,e=this._id,r=y5(),n=this._groups,i=n.length,a=0;a{"use strict";Hp();to();o(DL,"default")});function RL(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var l={value:s},u={value:o(function(){--i===0&&a()},"value")};r.each(function(){var h=Ma(this,n),f=h.on;f!==t&&(e=(t=f).copy(),e._.cancel.push(l),e._.interrupt.push(l),e._.end.push(u)),h.on=e}),i===0&&a()})}var tZ=O(()=>{"use strict";to();o(RL,"default")});function _s(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function rZ(t){return hh().transition(t)}function y5(){return++OLe}var OLe,mh,Hp=O(()=>{"use strict";rc();PQ();BQ();FQ();$Q();zQ();GQ();VQ();qQ();UQ();WQ();HQ();YQ();jQ();KQ();QQ();ZQ();JQ();eZ();hx();tZ();OLe=0;o(_s,"Transition");o(rZ,"transition");o(y5,"newId");mh=hh.prototype;_s.prototype=rZ.prototype={constructor:_s,select:wL,selectAll:kL,selectChild:mh.selectChild,selectChildren:mh.selectChildren,filter:vL,merge:xL,selection:EL,transition:DL,call:mh.call,nodes:mh.nodes,node:mh.node,size:mh.size,empty:mh.empty,each:mh.each,on:bL,attr:fL,attrTween:dL,style:SL,styleTween:CL,text:AL,textTween:_L,remove:TL,tween:uL,delay:pL,duration:mL,ease:gL,easeVarying:yL,end:RL,[Symbol.iterator]:mh[Symbol.iterator]}});function v5(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var nZ=O(()=>{"use strict";o(v5,"cubicInOut")});var LL=O(()=>{"use strict";nZ()});function BLe(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function NL(t){var e,r;t instanceof _s?(e=t._id,t=t._name):(e=y5(),(r=PLe).time=sx(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{"use strict";Hp();to();LL();d5();PLe={time:null,delay:0,duration:250,ease:v5};o(BLe,"inherit");o(NL,"default")});var aZ=O(()=>{"use strict";rc();OQ();iZ();hh.prototype.interrupt=cL;hh.prototype.transition=NL});var x5=O(()=>{"use strict";aZ()});var sZ=O(()=>{"use strict"});var oZ=O(()=>{"use strict"});var lZ=O(()=>{"use strict"});function cZ(t){return[+t[0],+t[1]]}function FLe(t){return[cZ(t[0]),cZ(t[1])]}function ML(t){return{type:t}}var akt,skt,okt,lkt,ckt,ukt,uZ=O(()=>{"use strict";x5();sZ();oZ();lZ();({abs:akt,max:skt,min:okt}=Math);o(cZ,"number1");o(FLe,"number2");lkt={name:"x",handles:["w","e"].map(ML),input:o(function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},"input"),output:o(function(t){return t&&[t[0][0],t[1][0]]},"output")},ckt={name:"y",handles:["n","s"].map(ML),input:o(function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},"input"),output:o(function(t){return t&&[t[0][1],t[1][1]]},"output")},ukt={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(ML),input:o(function(t){return t==null?null:FLe(t)},"input"),output:o(function(t){return t},"output")};o(ML,"type")});var hZ=O(()=>{"use strict";uZ()});function fZ(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return fZ;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{"use strict";IL=Math.PI,OL=2*IL,Yp=1e-6,$Le=OL-Yp;o(fZ,"append");o(zLe,"appendRound");jp=class{static{o(this,"Path")}constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?fZ:zLe(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,l=this._y1,u=n-e,h=i-r,f=s-e,d=l-r,p=f*f+d*d;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>Yp)if(!(Math.abs(d*u-h*f)>Yp)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let m=n-s,g=i-l,y=u*u+h*h,v=m*m+g*g,x=Math.sqrt(y),b=Math.sqrt(p),T=a*Math.tan((IL-Math.acos((y+p-v)/(2*x*b)))/2),E=T/b,w=T/x;Math.abs(E-1)>Yp&&this._append`L${e+E*f},${r+E*d}`,this._append`A${a},${a},0,0,${+(d*m>f*g)},${this._x1=e+w*u},${this._y1=r+w*h}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),u=n*Math.sin(i),h=e+l,f=r+u,d=1^s,p=s?i-a:a-i;this._x1===null?this._append`M${h},${f}`:(Math.abs(this._x1-h)>Yp||Math.abs(this._y1-f)>Yp)&&this._append`L${h},${f}`,n&&(p<0&&(p=p%OL+OL),p>$Le?this._append`A${n},${n},0,1,${d},${e-l},${r-u}A${n},${n},0,1,${d},${this._x1=h},${this._y1=f}`:p>Yp&&this._append`A${n},${n},0,${+(p>=IL)},${d},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};o(dZ,"path");dZ.prototype=jp.prototype});var PL=O(()=>{"use strict";pZ()});var mZ=O(()=>{"use strict"});var gZ=O(()=>{"use strict"});var yZ=O(()=>{"use strict"});var vZ=O(()=>{"use strict"});var xZ=O(()=>{"use strict"});var bZ=O(()=>{"use strict"});var TZ=O(()=>{"use strict"});function BL(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function Xp(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var dx=O(()=>{"use strict";o(BL,"default");o(Xp,"formatDecimalParts")});function ac(t){return t=Xp(Math.abs(t)),t?t[1]:NaN}var px=O(()=>{"use strict";dx();o(ac,"default")});function FL(t,e){return function(r,n){for(var i=r.length,a=[],s=0,l=t[0],u=0;i>0&&l>0&&(u+l+1>n&&(l=Math.max(1,n-u)),a.push(r.substring(i-=l,i+l)),!((u+=l+1)>n));)l=t[s=(s+1)%t.length];return a.reverse().join(e)}}var wZ=O(()=>{"use strict";o(FL,"default")});function $L(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var kZ=O(()=>{"use strict";o($L,"default")});function Nf(t){if(!(e=GLe.exec(t)))throw new Error("invalid format: "+t);var e;return new b5({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function b5(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var GLe,zL=O(()=>{"use strict";GLe=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;o(Nf,"formatSpecifier");Nf.prototype=b5.prototype;o(b5,"FormatSpecifier");b5.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function GL(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var EZ=O(()=>{"use strict";o(GL,"default")});function qL(t,e){var r=Xp(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(VL=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+Xp(t,Math.max(0,e+a-1))[0]}var VL,UL=O(()=>{"use strict";dx();o(qL,"default")});function T5(t,e){var r=Xp(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var SZ=O(()=>{"use strict";dx();o(T5,"default")});var WL,CZ=O(()=>{"use strict";dx();UL();SZ();WL={"%":o((t,e)=>(t*100).toFixed(e),"%"),b:o(t=>Math.round(t).toString(2),"b"),c:o(t=>t+"","c"),d:BL,e:o((t,e)=>t.toExponential(e),"e"),f:o((t,e)=>t.toFixed(e),"f"),g:o((t,e)=>t.toPrecision(e),"g"),o:o(t=>Math.round(t).toString(8),"o"),p:o((t,e)=>T5(t*100,e),"p"),r:T5,s:qL,X:o(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:o(t=>Math.round(t).toString(16),"x")}});function w5(t){return t}var AZ=O(()=>{"use strict";o(w5,"default")});function HL(t){var e=t.grouping===void 0||t.thousands===void 0?w5:FL(_Z.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?w5:$L(_Z.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",l=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function h(d){d=Nf(d);var p=d.fill,m=d.align,g=d.sign,y=d.symbol,v=d.zero,x=d.width,b=d.comma,T=d.precision,E=d.trim,w=d.type;w==="n"?(b=!0,w="g"):WL[w]||(T===void 0&&(T=12),E=!0,w="g"),(v||p==="0"&&m==="=")&&(v=!0,p="0",m="=");var k=y==="$"?r:y==="#"&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",S=y==="$"?n:/[%p]/.test(w)?s:"",A=WL[w],L=/[defgprs%]/.test(w);T=T===void 0?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,T)):Math.max(0,Math.min(20,T));function I(N){var C=k,_=S,D,M,R;if(w==="c")_=A(N)+_,N="";else{N=+N;var P=N<0||1/N<0;if(N=isNaN(N)?u:A(Math.abs(N),T),E&&(N=GL(N)),P&&+N==0&&g!=="+"&&(P=!1),C=(P?g==="("?g:l:g==="-"||g==="("?"":g)+C,_=(w==="s"?DZ[8+VL/3]:"")+_+(P&&g==="("?")":""),L){for(D=-1,M=N.length;++DR||R>57){_=(R===46?i+N.slice(D+1):N.slice(D))+_,N=N.slice(0,D);break}}}b&&!v&&(N=e(N,1/0));var B=C.length+N.length+_.length,F=B>1)+C+N+_+F.slice(B);break;default:N=F+C+N+_;break}return a(N)}return o(I,"format"),I.toString=function(){return d+""},I}o(h,"newFormat");function f(d,p){var m=h((d=Nf(d),d.type="f",d)),g=Math.max(-8,Math.min(8,Math.floor(ac(p)/3)))*3,y=Math.pow(10,-g),v=DZ[8+g/3];return function(x){return m(y*x)+v}}return o(f,"formatPrefix"),{format:h,formatPrefix:f}}var _Z,DZ,RZ=O(()=>{"use strict";px();wZ();kZ();zL();EZ();CZ();UL();AZ();_Z=Array.prototype.map,DZ=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];o(HL,"default")});function YL(t){return k5=HL(t),tu=k5.format,E5=k5.formatPrefix,k5}var k5,tu,E5,LZ=O(()=>{"use strict";RZ();YL({thousands:",",grouping:[3],currency:["$",""]});o(YL,"defaultLocale")});function S5(t){return Math.max(0,-ac(Math.abs(t)))}var NZ=O(()=>{"use strict";px();o(S5,"default")});function C5(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(ac(e)/3)))*3-ac(Math.abs(t)))}var MZ=O(()=>{"use strict";px();o(C5,"default")});function A5(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ac(e)-ac(t))+1}var IZ=O(()=>{"use strict";px();o(A5,"default")});var jL=O(()=>{"use strict";LZ();zL();NZ();MZ();IZ()});var OZ=O(()=>{"use strict"});function VLe(t){var e=0,r=t.children,n=r&&r.length;if(!n)e=1;else for(;--n>=0;)e+=r[n].value;t.value=e}function XL(){return this.eachAfter(VLe)}var PZ=O(()=>{"use strict";o(VLe,"count");o(XL,"default")});function KL(t,e){let r=-1;for(let n of this)t.call(e,n,++r,this);return this}var BZ=O(()=>{"use strict";o(KL,"default")});function QL(t,e){for(var r=this,n=[r],i,a,s=-1;r=n.pop();)if(t.call(e,r,++s,this),i=r.children)for(a=i.length-1;a>=0;--a)n.push(i[a]);return this}var FZ=O(()=>{"use strict";o(QL,"default")});function ZL(t,e){for(var r=this,n=[r],i=[],a,s,l,u=-1;r=n.pop();)if(i.push(r),a=r.children)for(s=0,l=a.length;s{"use strict";o(ZL,"default")});function JL(t,e){let r=-1;for(let n of this)if(t.call(e,n,++r,this))return n}var zZ=O(()=>{"use strict";o(JL,"default")});function e9(t){return this.eachAfter(function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r})}var GZ=O(()=>{"use strict";o(e9,"default")});function t9(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}var VZ=O(()=>{"use strict";o(t9,"default")});function r9(t){for(var e=this,r=qLe(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n}function qLe(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}var qZ=O(()=>{"use strict";o(r9,"default");o(qLe,"leastCommonAncestor")});function n9(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}var UZ=O(()=>{"use strict";o(n9,"default")});function i9(){return Array.from(this)}var WZ=O(()=>{"use strict";o(i9,"default")});function a9(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}var HZ=O(()=>{"use strict";o(a9,"default")});function s9(){var t=this,e=[];return t.each(function(r){r!==t&&e.push({source:r.parent,target:r})}),e}var YZ=O(()=>{"use strict";o(s9,"default")});function*o9(){var t=this,e,r=[t],n,i,a;do for(e=r.reverse(),r=[];t=e.pop();)if(yield t,n=t.children)for(i=0,a=n.length;i{"use strict";o(o9,"default")});function Mg(t,e){t instanceof Map?(t=[void 0,t],e===void 0&&(e=HLe)):e===void 0&&(e=WLe);for(var r=new mx(t),n,i=[r],a,s,l,u;n=i.pop();)if((s=e(n.data))&&(u=(s=Array.from(s)).length))for(n.children=s,l=u-1;l>=0;--l)i.push(a=s[l]=new mx(s[l])),a.parent=n,a.depth=n.depth+1;return r.eachBefore(jLe)}function ULe(){return Mg(this).eachBefore(YLe)}function WLe(t){return t.children}function HLe(t){return Array.isArray(t)?t[1]:null}function YLe(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}function jLe(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}function mx(t){this.data=t,this.depth=this.height=0,this.parent=null}var XZ=O(()=>{"use strict";PZ();BZ();FZ();$Z();zZ();GZ();VZ();qZ();UZ();WZ();HZ();YZ();jZ();o(Mg,"hierarchy");o(ULe,"node_copy");o(WLe,"objectChildren");o(HLe,"mapChildren");o(YLe,"copyData");o(jLe,"computeHeight");o(mx,"Node");mx.prototype=Mg.prototype={constructor:mx,count:XL,each:KL,eachAfter:ZL,eachBefore:QL,find:JL,sum:e9,sort:t9,path:r9,ancestors:n9,descendants:i9,leaves:a9,links:s9,copy:ULe,[Symbol.iterator]:o9}});function KZ(t){if(typeof t!="function")throw new Error;return t}var QZ=O(()=>{"use strict";o(KZ,"required")});function Ig(){return 0}function Kp(t){return function(){return t}}var ZZ=O(()=>{"use strict";o(Ig,"constantZero");o(Kp,"default")});function l9(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}var JZ=O(()=>{"use strict";o(l9,"default")});function c9(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(n-e)/t.value;++l{"use strict";o(c9,"default")});function u9(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(i-r)/t.value;++l{"use strict";o(u9,"default")});function KLe(t,e,r,n,i,a){for(var s=[],l=e.children,u,h,f=0,d=0,p=l.length,m,g,y=e.value,v,x,b,T,E,w,k;fb&&(b=h),k=v*v*w,T=Math.max(b/k,k/x),T>E){v-=h;break}E=T}s.push(u={value:v,dice:m{"use strict";eJ();tJ();XLe=(1+Math.sqrt(5))/2;o(KLe,"squarifyRatio");rJ=o((function t(e){function r(n,i,a,s,l){KLe(e,n,i,a,s,l)}return o(r,"squarify"),r.ratio=function(n){return t((n=+n)>1?n:1)},r}),"custom")(XLe)});function _5(){var t=rJ,e=!1,r=1,n=1,i=[0],a=Ig,s=Ig,l=Ig,u=Ig,h=Ig;function f(p){return p.x0=p.y0=0,p.x1=r,p.y1=n,p.eachBefore(d),i=[0],e&&p.eachBefore(l9),p}o(f,"treemap");function d(p){var m=i[p.depth],g=p.x0+m,y=p.y0+m,v=p.x1-m,x=p.y1-m;v{"use strict";JZ();nJ();QZ();ZZ();o(_5,"default")});var aJ=O(()=>{"use strict";XZ();iJ()});var sJ=O(()=>{"use strict"});var oJ=O(()=>{"use strict"});function Mf(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var gx=O(()=>{"use strict";o(Mf,"initRange")});function Fo(){var t=new xg,e=[],r=[],n=h9;function i(a){let s=t.get(a);if(s===void 0){if(n!==h9)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return o(i,"scale"),i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new xg;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return Fo(e,r).unknown(n)},Mf.apply(i,arguments),i}var h9,f9=O(()=>{"use strict";Cf();gx();h9=Symbol("implicit");o(Fo,"ordinal")});function Og(){var t=Fo().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,l=!1,u=0,h=0,f=.5;delete t.unknown;function d(){var p=e().length,m=i{"use strict";Cf();gx();f9();o(Og,"band")});function d9(t){return function(){return t}}var cJ=O(()=>{"use strict";o(d9,"constants")});function p9(t){return+t}var uJ=O(()=>{"use strict";o(p9,"number")});function Pg(t){return t}function m9(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:d9(isNaN(e)?NaN:.5)}function QLe(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function ZLe(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?JLe:ZLe,u=h=null,d}o(f,"rescale");function d(p){return p==null||isNaN(p=+p)?a:(u||(u=l(t.map(n),e,r)))(n(s(p)))}return o(d,"scale"),d.invert=function(p){return s(i((h||(h=l(e,t.map(n),da)))(p)))},d.domain=function(p){return arguments.length?(t=Array.from(p,p9),f()):t.slice()},d.range=function(p){return arguments.length?(e=Array.from(p),f()):e.slice()},d.rangeRound=function(p){return e=Array.from(p),r=a5,f()},d.clamp=function(p){return arguments.length?(s=p?!0:Pg,f()):s!==Pg},d.interpolate=function(p){return arguments.length?(r=p,f()):r},d.unknown=function(p){return arguments.length?(a=p,d):a},function(p,m){return n=p,i=m,f()}}function yx(){return e9e()(Pg,Pg)}var hJ,g9=O(()=>{"use strict";Cf();Rg();cJ();uJ();hJ=[0,1];o(Pg,"identity");o(m9,"normalize");o(QLe,"clamper");o(ZLe,"bimap");o(JLe,"polymap");o(D5,"copy");o(e9e,"transformer");o(yx,"continuous")});function y9(t,e,r,n){var i=bg(t,e,r),a;switch(n=Nf(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=C5(i,s))&&(n.precision=a),E5(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=A5(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=S5(i))&&(n.precision=a-(n.type==="%")*2);break}}return tu(n)}var fJ=O(()=>{"use strict";Cf();jL();o(y9,"tickFormat")});function t9e(t){var e=t.domain;return t.ticks=function(r){var n=e();return Vw(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return y9(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],l=n[a],u,h,f=10;for(l0;){if(h=W2(s,l,r),h===u)return n[i]=s,n[a]=l,e(n);if(h>0)s=Math.floor(s/h)*h,l=Math.ceil(l/h)*h;else if(h<0)s=Math.ceil(s*h)/h,l=Math.floor(l*h)/h;else break;u=h}return t},t}function sc(){var t=yx();return t.copy=function(){return D5(t,sc())},Mf.apply(t,arguments),t9e(t)}var dJ=O(()=>{"use strict";Cf();g9();gx();fJ();o(t9e,"linearish");o(sc,"linear")});function v9(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{"use strict";o(v9,"nice")});function In(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return o(i,"interval"),i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),l=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,l)=>{let u=[];if(a=i.ceil(a),l=l==null?1:Math.floor(l),!(a0))return u;let h;do u.push(h=new Date(+a)),e(a,l),t(a);while(hIn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,l)=>{if(s>=s)if(l<0)for(;++l<=0;)for(;e(s,-1),!a(s););else for(;--l>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(x9.setTime(+a),b9.setTime(+s),t(x9),t(b9),Math.floor(r(x9,b9))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var x9,b9,gh=O(()=>{"use strict";x9=new Date,b9=new Date;o(In,"timeInterval")});var ru,mJ,T9=O(()=>{"use strict";gh();ru=In(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);ru.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?In(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):ru);mJ=ru.range});var $o,gJ,w9=O(()=>{"use strict";gh();$o=In(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),gJ=$o.range});var yh,r9e,R5,n9e,k9=O(()=>{"use strict";gh();yh=In(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),r9e=yh.range,R5=In(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),n9e=R5.range});var vh,i9e,L5,a9e,E9=O(()=>{"use strict";gh();vh=In(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),i9e=vh.range,L5=In(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),a9e=L5.range});var gl,s9e,xx,o9e,N5,l9e,S9=O(()=>{"use strict";gh();gl=In(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),s9e=gl.range,xx=In(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),o9e=xx.range,N5=In(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),l9e=N5.range});function Jp(t){return In(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function e0(t){return In(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var oc,If,M5,I5,iu,O5,P5,vJ,c9e,u9e,h9e,f9e,d9e,p9e,t0,Bg,xJ,bJ,Of,TJ,wJ,kJ,m9e,g9e,y9e,v9e,x9e,b9e,C9=O(()=>{"use strict";gh();o(Jp,"timeWeekday");oc=Jp(0),If=Jp(1),M5=Jp(2),I5=Jp(3),iu=Jp(4),O5=Jp(5),P5=Jp(6),vJ=oc.range,c9e=If.range,u9e=M5.range,h9e=I5.range,f9e=iu.range,d9e=O5.range,p9e=P5.range;o(e0,"utcWeekday");t0=e0(0),Bg=e0(1),xJ=e0(2),bJ=e0(3),Of=e0(4),TJ=e0(5),wJ=e0(6),kJ=t0.range,m9e=Bg.range,g9e=xJ.range,y9e=bJ.range,v9e=Of.range,x9e=TJ.range,b9e=wJ.range});var xh,T9e,B5,w9e,A9=O(()=>{"use strict";gh();xh=In(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),T9e=xh.range,B5=In(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),w9e=B5.range});var zo,k9e,lc,E9e,_9=O(()=>{"use strict";gh();zo=In(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());zo.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:In(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});k9e=zo.range,lc=In(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());lc.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:In(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});E9e=lc.range});function SJ(t,e,r,n,i,a){let s=[[$o,1,1e3],[$o,5,5*1e3],[$o,15,15*1e3],[$o,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function l(h,f,d){let p=fv).right(s,p);if(m===s.length)return t.every(bg(h/31536e6,f/31536e6,d));if(m===0)return ru.every(Math.max(bg(h,f,d),1));let[g,y]=s[p/s[m-1][2]{"use strict";Cf();T9();w9();k9();E9();S9();C9();A9();_9();o(SJ,"ticker");[C9e,A9e]=SJ(lc,B5,t0,N5,L5,R5),[D9,R9]=SJ(zo,xh,oc,gl,vh,yh)});var F5=O(()=>{"use strict";T9();w9();k9();E9();S9();C9();A9();_9();CJ()});function L9(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function N9(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function bx(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function M9(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,l=t.months,u=t.shortMonths,h=Tx(i),f=wx(i),d=Tx(a),p=wx(a),m=Tx(s),g=wx(s),y=Tx(l),v=wx(l),x=Tx(u),b=wx(u),T={a:P,A:B,b:F,B:G,c:null,d:NJ,e:NJ,f:K9e,g:sNe,G:lNe,H:Y9e,I:j9e,j:X9e,L:BJ,m:Q9e,M:Z9e,p:$,q:V,Q:OJ,s:PJ,S:J9e,u:eNe,U:tNe,V:rNe,w:nNe,W:iNe,x:null,X:null,y:aNe,Y:oNe,Z:cNe,"%":IJ},E={a:X,A:Q,b:H,B:ie,c:null,d:MJ,e:MJ,f:dNe,g:kNe,G:SNe,H:uNe,I:hNe,j:fNe,L:$J,m:pNe,M:mNe,p:Y,q:le,Q:OJ,s:PJ,S:gNe,u:yNe,U:vNe,V:xNe,w:bNe,W:TNe,x:null,X:null,y:wNe,Y:ENe,Z:CNe,"%":IJ},w={a:I,A:N,b:C,B:_,c:D,d:RJ,e:RJ,f:q9e,g:DJ,G:_J,H:LJ,I:LJ,j:$9e,L:V9e,m:F9e,M:z9e,p:L,q:B9e,Q:W9e,s:H9e,S:G9e,u:N9e,U:M9e,V:I9e,w:L9e,W:O9e,x:M,X:R,y:DJ,Y:_J,Z:P9e,"%":U9e};T.x=k(r,T),T.X=k(n,T),T.c=k(e,T),E.x=k(r,E),E.X=k(n,E),E.c=k(e,E);function k(ee,J){return function(te){var Z=[],xe=-1,de=0,Se=ee.length,Me,ke,we;for(te instanceof Date||(te=new Date(+te));++xe53)return null;"w"in Z||(Z.w=1),"Z"in Z?(de=N9(bx(Z.y,0,1)),Se=de.getUTCDay(),de=Se>4||Se===0?Bg.ceil(de):Bg(de),de=xx.offset(de,(Z.V-1)*7),Z.y=de.getUTCFullYear(),Z.m=de.getUTCMonth(),Z.d=de.getUTCDate()+(Z.w+6)%7):(de=L9(bx(Z.y,0,1)),Se=de.getDay(),de=Se>4||Se===0?If.ceil(de):If(de),de=gl.offset(de,(Z.V-1)*7),Z.y=de.getFullYear(),Z.m=de.getMonth(),Z.d=de.getDate()+(Z.w+6)%7)}else("W"in Z||"U"in Z)&&("w"in Z||(Z.w="u"in Z?Z.u%7:"W"in Z?1:0),Se="Z"in Z?N9(bx(Z.y,0,1)).getUTCDay():L9(bx(Z.y,0,1)).getDay(),Z.m=0,Z.d="W"in Z?(Z.w+6)%7+Z.W*7-(Se+5)%7:Z.w+Z.U*7-(Se+6)%7);return"Z"in Z?(Z.H+=Z.Z/100|0,Z.M+=Z.Z%100,N9(Z)):L9(Z)}}o(S,"newParse");function A(ee,J,te,Z){for(var xe=0,de=J.length,Se=te.length,Me,ke;xe=Se)return-1;if(Me=J.charCodeAt(xe++),Me===37){if(Me=J.charAt(xe++),ke=w[Me in AJ?J.charAt(xe++):Me],!ke||(Z=ke(ee,te,Z))<0)return-1}else if(Me!=te.charCodeAt(Z++))return-1}return Z}o(A,"parseSpecifier");function L(ee,J,te){var Z=h.exec(J.slice(te));return Z?(ee.p=f.get(Z[0].toLowerCase()),te+Z[0].length):-1}o(L,"parsePeriod");function I(ee,J,te){var Z=m.exec(J.slice(te));return Z?(ee.w=g.get(Z[0].toLowerCase()),te+Z[0].length):-1}o(I,"parseShortWeekday");function N(ee,J,te){var Z=d.exec(J.slice(te));return Z?(ee.w=p.get(Z[0].toLowerCase()),te+Z[0].length):-1}o(N,"parseWeekday");function C(ee,J,te){var Z=x.exec(J.slice(te));return Z?(ee.m=b.get(Z[0].toLowerCase()),te+Z[0].length):-1}o(C,"parseShortMonth");function _(ee,J,te){var Z=y.exec(J.slice(te));return Z?(ee.m=v.get(Z[0].toLowerCase()),te+Z[0].length):-1}o(_,"parseMonth");function D(ee,J,te){return A(ee,e,J,te)}o(D,"parseLocaleDateTime");function M(ee,J,te){return A(ee,r,J,te)}o(M,"parseLocaleDate");function R(ee,J,te){return A(ee,n,J,te)}o(R,"parseLocaleTime");function P(ee){return s[ee.getDay()]}o(P,"formatShortWeekday");function B(ee){return a[ee.getDay()]}o(B,"formatWeekday");function F(ee){return u[ee.getMonth()]}o(F,"formatShortMonth");function G(ee){return l[ee.getMonth()]}o(G,"formatMonth");function $(ee){return i[+(ee.getHours()>=12)]}o($,"formatPeriod");function V(ee){return 1+~~(ee.getMonth()/3)}o(V,"formatQuarter");function X(ee){return s[ee.getUTCDay()]}o(X,"formatUTCShortWeekday");function Q(ee){return a[ee.getUTCDay()]}o(Q,"formatUTCWeekday");function H(ee){return u[ee.getUTCMonth()]}o(H,"formatUTCShortMonth");function ie(ee){return l[ee.getUTCMonth()]}o(ie,"formatUTCMonth");function Y(ee){return i[+(ee.getUTCHours()>=12)]}o(Y,"formatUTCPeriod");function le(ee){return 1+~~(ee.getUTCMonth()/3)}return o(le,"formatUTCQuarter"),{format:o(function(ee){var J=k(ee+="",T);return J.toString=function(){return ee},J},"format"),parse:o(function(ee){var J=S(ee+="",!1);return J.toString=function(){return ee},J},"parse"),utcFormat:o(function(ee){var J=k(ee+="",E);return J.toString=function(){return ee},J},"utcFormat"),utcParse:o(function(ee){var J=S(ee+="",!0);return J.toString=function(){return ee},J},"utcParse")}}function hn(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function L9e(t,e,r){var n=pa.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function N9e(t,e,r){var n=pa.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function M9e(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function I9e(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function O9e(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function _J(t,e,r){var n=pa.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function DJ(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function P9e(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function B9e(t,e,r){var n=pa.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function F9e(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function RJ(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function $9e(t,e,r){var n=pa.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function LJ(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function z9e(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function G9e(t,e,r){var n=pa.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function V9e(t,e,r){var n=pa.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function q9e(t,e,r){var n=pa.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function U9e(t,e,r){var n=_9e.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function W9e(t,e,r){var n=pa.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function H9e(t,e,r){var n=pa.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function NJ(t,e){return hn(t.getDate(),e,2)}function Y9e(t,e){return hn(t.getHours(),e,2)}function j9e(t,e){return hn(t.getHours()%12||12,e,2)}function X9e(t,e){return hn(1+gl.count(zo(t),t),e,3)}function BJ(t,e){return hn(t.getMilliseconds(),e,3)}function K9e(t,e){return BJ(t,e)+"000"}function Q9e(t,e){return hn(t.getMonth()+1,e,2)}function Z9e(t,e){return hn(t.getMinutes(),e,2)}function J9e(t,e){return hn(t.getSeconds(),e,2)}function eNe(t){var e=t.getDay();return e===0?7:e}function tNe(t,e){return hn(oc.count(zo(t)-1,t),e,2)}function FJ(t){var e=t.getDay();return e>=4||e===0?iu(t):iu.ceil(t)}function rNe(t,e){return t=FJ(t),hn(iu.count(zo(t),t)+(zo(t).getDay()===4),e,2)}function nNe(t){return t.getDay()}function iNe(t,e){return hn(If.count(zo(t)-1,t),e,2)}function aNe(t,e){return hn(t.getFullYear()%100,e,2)}function sNe(t,e){return t=FJ(t),hn(t.getFullYear()%100,e,2)}function oNe(t,e){return hn(t.getFullYear()%1e4,e,4)}function lNe(t,e){var r=t.getDay();return t=r>=4||r===0?iu(t):iu.ceil(t),hn(t.getFullYear()%1e4,e,4)}function cNe(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+hn(e/60|0,"0",2)+hn(e%60,"0",2)}function MJ(t,e){return hn(t.getUTCDate(),e,2)}function uNe(t,e){return hn(t.getUTCHours(),e,2)}function hNe(t,e){return hn(t.getUTCHours()%12||12,e,2)}function fNe(t,e){return hn(1+xx.count(lc(t),t),e,3)}function $J(t,e){return hn(t.getUTCMilliseconds(),e,3)}function dNe(t,e){return $J(t,e)+"000"}function pNe(t,e){return hn(t.getUTCMonth()+1,e,2)}function mNe(t,e){return hn(t.getUTCMinutes(),e,2)}function gNe(t,e){return hn(t.getUTCSeconds(),e,2)}function yNe(t){var e=t.getUTCDay();return e===0?7:e}function vNe(t,e){return hn(t0.count(lc(t)-1,t),e,2)}function zJ(t){var e=t.getUTCDay();return e>=4||e===0?Of(t):Of.ceil(t)}function xNe(t,e){return t=zJ(t),hn(Of.count(lc(t),t)+(lc(t).getUTCDay()===4),e,2)}function bNe(t){return t.getUTCDay()}function TNe(t,e){return hn(Bg.count(lc(t)-1,t),e,2)}function wNe(t,e){return hn(t.getUTCFullYear()%100,e,2)}function kNe(t,e){return t=zJ(t),hn(t.getUTCFullYear()%100,e,2)}function ENe(t,e){return hn(t.getUTCFullYear()%1e4,e,4)}function SNe(t,e){var r=t.getUTCDay();return t=r>=4||r===0?Of(t):Of.ceil(t),hn(t.getUTCFullYear()%1e4,e,4)}function CNe(){return"+0000"}function IJ(){return"%"}function OJ(t){return+t}function PJ(t){return Math.floor(+t/1e3)}var AJ,pa,_9e,D9e,GJ=O(()=>{"use strict";F5();o(L9,"localDate");o(N9,"utcDate");o(bx,"newDate");o(M9,"formatLocale");AJ={"-":"",_:" ",0:"0"},pa=/^\s*\d+/,_9e=/^%/,D9e=/[\\^$*+?|[\]().{}]/g;o(hn,"pad");o(R9e,"requote");o(Tx,"formatRe");o(wx,"formatLookup");o(L9e,"parseWeekdayNumberSunday");o(N9e,"parseWeekdayNumberMonday");o(M9e,"parseWeekNumberSunday");o(I9e,"parseWeekNumberISO");o(O9e,"parseWeekNumberMonday");o(_J,"parseFullYear");o(DJ,"parseYear");o(P9e,"parseZone");o(B9e,"parseQuarter");o(F9e,"parseMonthNumber");o(RJ,"parseDayOfMonth");o($9e,"parseDayOfYear");o(LJ,"parseHour24");o(z9e,"parseMinutes");o(G9e,"parseSeconds");o(V9e,"parseMilliseconds");o(q9e,"parseMicroseconds");o(U9e,"parseLiteralPercent");o(W9e,"parseUnixTimestamp");o(H9e,"parseUnixTimestampSeconds");o(NJ,"formatDayOfMonth");o(Y9e,"formatHour24");o(j9e,"formatHour12");o(X9e,"formatDayOfYear");o(BJ,"formatMilliseconds");o(K9e,"formatMicroseconds");o(Q9e,"formatMonthNumber");o(Z9e,"formatMinutes");o(J9e,"formatSeconds");o(eNe,"formatWeekdayNumberMonday");o(tNe,"formatWeekNumberSunday");o(FJ,"dISO");o(rNe,"formatWeekNumberISO");o(nNe,"formatWeekdayNumberSunday");o(iNe,"formatWeekNumberMonday");o(aNe,"formatYear");o(sNe,"formatYearISO");o(oNe,"formatFullYear");o(lNe,"formatFullYearISO");o(cNe,"formatZone");o(MJ,"formatUTCDayOfMonth");o(uNe,"formatUTCHour24");o(hNe,"formatUTCHour12");o(fNe,"formatUTCDayOfYear");o($J,"formatUTCMilliseconds");o(dNe,"formatUTCMicroseconds");o(pNe,"formatUTCMonthNumber");o(mNe,"formatUTCMinutes");o(gNe,"formatUTCSeconds");o(yNe,"formatUTCWeekdayNumberMonday");o(vNe,"formatUTCWeekNumberSunday");o(zJ,"UTCdISO");o(xNe,"formatUTCWeekNumberISO");o(bNe,"formatUTCWeekdayNumberSunday");o(TNe,"formatUTCWeekNumberMonday");o(wNe,"formatUTCYear");o(kNe,"formatUTCYearISO");o(ENe,"formatUTCFullYear");o(SNe,"formatUTCFullYearISO");o(CNe,"formatUTCZone");o(IJ,"formatLiteralPercent");o(OJ,"formatUnixTimestamp");o(PJ,"formatUnixTimestampSeconds")});function I9(t){return Fg=M9(t),r0=Fg.format,VJ=Fg.parse,qJ=Fg.utcFormat,UJ=Fg.utcParse,Fg}var Fg,r0,VJ,qJ,UJ,WJ=O(()=>{"use strict";GJ();I9({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});o(I9,"defaultLocale")});var O9=O(()=>{"use strict";WJ()});function ANe(t){return new Date(t)}function _Ne(t){return t instanceof Date?+t:+new Date(+t)}function HJ(t,e,r,n,i,a,s,l,u,h){var f=yx(),d=f.invert,p=f.domain,m=h(".%L"),g=h(":%S"),y=h("%I:%M"),v=h("%I %p"),x=h("%a %d"),b=h("%b %d"),T=h("%B"),E=h("%Y");function w(k){return(u(k){"use strict";F5();O9();g9();gx();pJ();o(ANe,"date");o(_Ne,"number");o(HJ,"calendar");o($5,"time")});var jJ=O(()=>{"use strict";lJ();dJ();f9();YJ()});function P9(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{"use strict";o(P9,"default")});var B9,KJ=O(()=>{"use strict";XJ();B9=P9("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var QJ=O(()=>{"use strict";KJ()});function ei(t){return o(function(){return t},"constant")}var z5=O(()=>{"use strict";o(ei,"default")});function JJ(t){return t>1?0:t<-1?$g:Math.acos(t)}function $9(t){return t>=1?kx:t<=-1?-kx:Math.asin(t)}var F9,Ia,Pf,ZJ,G5,cc,n0,ma,$g,kx,zg,V5=O(()=>{"use strict";F9=Math.abs,Ia=Math.atan2,Pf=Math.cos,ZJ=Math.max,G5=Math.min,cc=Math.sin,n0=Math.sqrt,ma=1e-12,$g=Math.PI,kx=$g/2,zg=2*$g;o(JJ,"acos");o($9,"asin")});function q5(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new jp(e)}var z9=O(()=>{"use strict";PL();o(q5,"withPath")});function DNe(t){return t.innerRadius}function RNe(t){return t.outerRadius}function LNe(t){return t.startAngle}function NNe(t){return t.endAngle}function MNe(t){return t&&t.padAngle}function INe(t,e,r,n,i,a,s,l){var u=r-t,h=n-e,f=s-i,d=l-a,p=d*u-f*h;if(!(p*pD*D+M*M&&(A=I,L=N),{cx:A,cy:L,x01:-f,y01:-d,x11:A*(i/w-1),y11:L*(i/w-1)}}function uc(){var t=DNe,e=RNe,r=ei(0),n=null,i=LNe,a=NNe,s=MNe,l=null,u=q5(h);function h(){var f,d,p=+t.apply(this,arguments),m=+e.apply(this,arguments),g=i.apply(this,arguments)-kx,y=a.apply(this,arguments)-kx,v=F9(y-g),x=y>g;if(l||(l=f=u()),mma))l.moveTo(0,0);else if(v>zg-ma)l.moveTo(m*Pf(g),m*cc(g)),l.arc(0,0,m,g,y,!x),p>ma&&(l.moveTo(p*Pf(y),p*cc(y)),l.arc(0,0,p,y,g,x));else{var b=g,T=y,E=g,w=y,k=v,S=v,A=s.apply(this,arguments)/2,L=A>ma&&(n?+n.apply(this,arguments):n0(p*p+m*m)),I=G5(F9(m-p)/2,+r.apply(this,arguments)),N=I,C=I,_,D;if(L>ma){var M=$9(L/p*cc(A)),R=$9(L/m*cc(A));(k-=M*2)>ma?(M*=x?1:-1,E+=M,w-=M):(k=0,E=w=(g+y)/2),(S-=R*2)>ma?(R*=x?1:-1,b+=R,T-=R):(S=0,b=T=(g+y)/2)}var P=m*Pf(b),B=m*cc(b),F=p*Pf(w),G=p*cc(w);if(I>ma){var $=m*Pf(T),V=m*cc(T),X=p*Pf(E),Q=p*cc(E),H;if(v<$g)if(H=INe(P,B,X,Q,$,V,F,G)){var ie=P-H[0],Y=B-H[1],le=$-H[0],ee=V-H[1],J=1/cc(JJ((ie*le+Y*ee)/(n0(ie*ie+Y*Y)*n0(le*le+ee*ee)))/2),te=n0(H[0]*H[0]+H[1]*H[1]);N=G5(I,(p-te)/(J-1)),C=G5(I,(m-te)/(J+1))}else N=C=0}S>ma?C>ma?(_=U5(X,Q,P,B,m,C,x),D=U5($,V,F,G,m,C,x),l.moveTo(_.cx+_.x01,_.cy+_.y01),Cma)||!(k>ma)?l.lineTo(F,G):N>ma?(_=U5(F,G,$,V,p,-N,x),D=U5(P,B,X,Q,p,-N,x),l.lineTo(_.cx+_.x01,_.cy+_.y01),N{"use strict";z5();V5();z9();o(DNe,"arcInnerRadius");o(RNe,"arcOuterRadius");o(LNe,"arcStartAngle");o(NNe,"arcEndAngle");o(MNe,"arcPadAngle");o(INe,"intersect");o(U5,"cornerTangents");o(uc,"default")});function Ex(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var j6t,G9=O(()=>{"use strict";j6t=Array.prototype.slice;o(Ex,"default")});function tee(t){this._context=t}function au(t){return new tee(t)}var V9=O(()=>{"use strict";o(tee,"Linear");tee.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}},"point")};o(au,"default")});function ree(t){return t[0]}function nee(t){return t[1]}var iee=O(()=>{"use strict";o(ree,"x");o(nee,"y")});function hc(t,e){var r=ei(!0),n=null,i=au,a=null,s=q5(l);t=typeof t=="function"?t:t===void 0?ree:ei(t),e=typeof e=="function"?e:e===void 0?nee:ei(e);function l(u){var h,f=(u=Ex(u)).length,d,p=!1,m;for(n==null&&(a=i(m=s())),h=0;h<=f;++h)!(h{"use strict";G9();z5();V9();z9();iee();o(hc,"default")});function q9(t,e){return et?1:e>=t?0:NaN}var see=O(()=>{"use strict";o(q9,"default")});function U9(t){return t}var oee=O(()=>{"use strict";o(U9,"default")});function W5(){var t=U9,e=q9,r=null,n=ei(0),i=ei(zg),a=ei(0);function s(l){var u,h=(l=Ex(l)).length,f,d,p=0,m=new Array(h),g=new Array(h),y=+n.apply(this,arguments),v=Math.min(zg,Math.max(-zg,i.apply(this,arguments)-y)),x,b=Math.min(Math.abs(v)/h,a.apply(this,arguments)),T=b*(v<0?-1:1),E;for(u=0;u0&&(p+=E);for(e!=null?m.sort(function(w,k){return e(g[w],g[k])}):r!=null&&m.sort(function(w,k){return r(l[w],l[k])}),u=0,d=p?(v-h*T)/p:0;u0?E*d:0)+T,g[f]={data:l[f],index:u,value:E,startAngle:y,endAngle:x,padAngle:b};return g}return o(s,"pie"),s.value=function(l){return arguments.length?(t=typeof l=="function"?l:ei(+l),s):t},s.sortValues=function(l){return arguments.length?(e=l,r=null,s):e},s.sort=function(l){return arguments.length?(r=l,e=null,s):r},s.startAngle=function(l){return arguments.length?(n=typeof l=="function"?l:ei(+l),s):n},s.endAngle=function(l){return arguments.length?(i=typeof l=="function"?l:ei(+l),s):i},s.padAngle=function(l){return arguments.length?(a=typeof l=="function"?l:ei(+l),s):a},s}var lee=O(()=>{"use strict";G9();z5();see();oee();V5();o(W5,"default")});function Sx(t){return new H5(t,!0)}function Cx(t){return new H5(t,!1)}var H5,cee=O(()=>{"use strict";H5=class{static{o(this,"Bump")}constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}};o(Sx,"bumpX");o(Cx,"bumpY")});function Go(){}var Ax=O(()=>{"use strict";o(Go,"default")});function Gg(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function _x(t){this._context=t}function fc(t){return new _x(t)}var Dx=O(()=>{"use strict";o(Gg,"point");o(_x,"Basis");_x.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 3:Gg(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Gg(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(fc,"default")});function uee(t){this._context=t}function Y5(t){return new uee(t)}var hee=O(()=>{"use strict";Ax();Dx();o(uee,"BasisClosed");uee.prototype={areaStart:Go,areaEnd:Go,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Gg(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(Y5,"default")});function fee(t){this._context=t}function j5(t){return new fee(t)}var dee=O(()=>{"use strict";Dx();o(fee,"BasisOpen");fee.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Gg(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(j5,"default")});function pee(t,e){this._basis=new _x(t),this._beta=e}var W9,mee=O(()=>{"use strict";Dx();o(pee,"Bundle");pee.prototype={lineStart:o(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,l=-1,u;++l<=r;)u=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(n+u*a),this._beta*e[l]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:o(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};W9=o((function t(e){function r(n){return e===1?new _x(n):new pee(n,e)}return o(r,"bundle"),r.beta=function(n){return t(+n)},r}),"custom")(.85)});function Vg(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function X5(t,e){this._context=t,this._k=(1-e)/6}var Rx,Lx=O(()=>{"use strict";o(Vg,"point");o(X5,"Cardinal");X5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Vg(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Vg(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Rx=o((function t(e){function r(n){return new X5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function K5(t,e){this._context=t,this._k=(1-e)/6}var H9,Y9=O(()=>{"use strict";Ax();Lx();o(K5,"CardinalClosed");K5.prototype={areaStart:Go,areaEnd:Go,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Vg(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};H9=o((function t(e){function r(n){return new K5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function Q5(t,e){this._context=t,this._k=(1-e)/6}var j9,X9=O(()=>{"use strict";Lx();o(Q5,"CardinalOpen");Q5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Vg(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};j9=o((function t(e){function r(n){return new Q5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function Nx(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>ma){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,i=(i*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>ma){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*h+t._x1*t._l23_2a-e*t._l12_2a)/f,s=(s*h+t._y1*t._l23_2a-r*t._l12_2a)/f}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function gee(t,e){this._context=t,this._alpha=e}var Mx,Z5=O(()=>{"use strict";V5();Lx();o(Nx,"point");o(gee,"CatmullRom");gee.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Nx(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Mx=o((function t(e){function r(n){return e?new gee(n,e):new X5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function yee(t,e){this._context=t,this._alpha=e}var K9,vee=O(()=>{"use strict";Y9();Ax();Z5();o(yee,"CatmullRomClosed");yee.prototype={areaStart:Go,areaEnd:Go,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Nx(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};K9=o((function t(e){function r(n){return e?new yee(n,e):new K5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function xee(t,e){this._context=t,this._alpha=e}var Q9,bee=O(()=>{"use strict";X9();Z5();o(xee,"CatmullRomOpen");xee.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Nx(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Q9=o((function t(e){function r(n){return e?new xee(n,e):new Q5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function Tee(t){this._context=t}function J5(t){return new Tee(t)}var wee=O(()=>{"use strict";Ax();o(Tee,"LinearClosed");Tee.prototype={areaStart:Go,areaEnd:Go,lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){this._point&&this._context.closePath()},"lineEnd"),point:o(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};o(J5,"default")});function kee(t){return t<0?-1:1}function Eee(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),l=(a*i+s*n)/(n+i);return(kee(a)+kee(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(l))||0}function See(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function Z9(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,l=(a-n)/3;t._context.bezierCurveTo(n+l,i+l*e,a-l,s-l*r,a,s)}function ek(t){this._context=t}function Cee(t){this._context=new Aee(t)}function Aee(t){this._context=t}function Ix(t){return new ek(t)}function Ox(t){return new Cee(t)}var _ee=O(()=>{"use strict";o(kee,"sign");o(Eee,"slope3");o(See,"slope2");o(Z9,"point");o(ek,"MonotoneX");ek.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Z9(this,this._t0,See(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,Z9(this,See(this,r=Eee(this,t,e)),r);break;default:Z9(this,this._t0,r=Eee(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}},"point")};o(Cee,"MonotoneY");(Cee.prototype=Object.create(ek.prototype)).point=function(t,e){ek.prototype.point.call(this,e,t)};o(Aee,"ReflectContext");Aee.prototype={moveTo:o(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:o(function(){this._context.closePath()},"closePath"),lineTo:o(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)},"bezierCurveTo")};o(Ix,"monotoneX");o(Ox,"monotoneY")});function Ree(t){this._context=t}function Dee(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{"use strict";o(Ree,"Natural");Ree.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=Dee(t),i=Dee(e),a=0,s=1;s{"use strict";o(tk,"Step");tk.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=this._y=NaN,this._point=0},"lineStart"),lineEnd:o(function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e},"point")};o(Ug,"default");o(Px,"stepBefore");o(Bx,"stepAfter")});var Mee=O(()=>{"use strict";eee();aee();lee();hee();dee();Dx();cee();mee();Y9();X9();Lx();vee();bee();Z5();wee();V9();_ee();Lee();Nee()});var Iee=O(()=>{"use strict"});var Oee=O(()=>{"use strict"});function Bf(t,e,r){this.k=t,this.x=e,this.y=r}function eN(t){for(;!t.__zoom;)if(!(t=t.parentNode))return J9;return t.__zoom}var J9,tN=O(()=>{"use strict";o(Bf,"Transform");Bf.prototype={constructor:Bf,scale:o(function(t){return t===1?this:new Bf(this.k*t,this.x,this.y)},"scale"),translate:o(function(t,e){return t===0&e===0?this:new Bf(this.k,this.x+this.k*t,this.y+this.k*e)},"translate"),apply:o(function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},"apply"),applyX:o(function(t){return t*this.k+this.x},"applyX"),applyY:o(function(t){return t*this.k+this.y},"applyY"),invert:o(function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},"invert"),invertX:o(function(t){return(t-this.x)/this.k},"invertX"),invertY:o(function(t){return(t-this.y)/this.k},"invertY"),rescaleX:o(function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},"rescaleX"),rescaleY:o(function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},"rescaleY"),toString:o(function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"},"toString")};J9=new Bf(1,0,0);eN.prototype=Bf.prototype;o(eN,"transform")});var Pee=O(()=>{"use strict"});var Bee=O(()=>{"use strict";x5();Iee();Oee();tN();Pee()});var Fee=O(()=>{"use strict";Bee();tN()});var Ar=O(()=>{"use strict";Cf();HX();hZ();mZ();Ag();gZ();yZ();qD();BK();vZ();LL();xZ();TZ();jL();OZ();aJ();Rg();PL();sJ();bZ();oJ();jJ();QJ();rc();Mee();F5();O9();d5();x5();Fee()});var $ee=nr(ga=>{"use strict";Object.defineProperty(ga,"__esModule",{value:!0});ga.BLANK_URL=ga.relativeFirstCharacters=ga.whitespaceEscapeCharsRegex=ga.urlSchemeRegex=ga.ctrlCharactersRegex=ga.htmlCtrlEntityRegex=ga.htmlEntitiesRegex=ga.invalidProtocolRegex=void 0;ga.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;ga.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;ga.htmlCtrlEntityRegex=/&(newline|tab);/gi;ga.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;ga.urlSchemeRegex=/^.+(:|:)/gim;ga.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;ga.relativeFirstCharacters=[".","/"];ga.BLANK_URL="about:blank"});var Wg=nr(rk=>{"use strict";Object.defineProperty(rk,"__esModule",{value:!0});rk.sanitizeUrl=void 0;var Ja=$ee();function ONe(t){return Ja.relativeFirstCharacters.indexOf(t[0])>-1}o(ONe,"isRelativeUrlWithoutProtocol");function PNe(t){var e=t.replace(Ja.ctrlCharactersRegex,"");return e.replace(Ja.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}o(PNe,"decodeHtmlCharacters");function BNe(t){return URL.canParse(t)}o(BNe,"isValidUrl");function zee(t){try{return decodeURIComponent(t)}catch{return t}}o(zee,"decodeURI");function FNe(t){if(!t)return Ja.BLANK_URL;var e,r=zee(t.trim());do r=PNe(r).replace(Ja.htmlCtrlEntityRegex,"").replace(Ja.ctrlCharactersRegex,"").replace(Ja.whitespaceEscapeCharsRegex,"").trim(),r=zee(r),e=r.match(Ja.ctrlCharactersRegex)||r.match(Ja.htmlEntitiesRegex)||r.match(Ja.htmlCtrlEntityRegex)||r.match(Ja.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return Ja.BLANK_URL;if(ONe(n))return n;var i=n.trimStart(),a=i.match(Ja.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(Ja.invalidProtocolRegex.test(s))return Ja.BLANK_URL;var l=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return l;if(s==="http:"||s==="https:"){if(!BNe(l))return Ja.BLANK_URL;var u=new URL(l);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return l}o(FNe,"sanitizeUrl");rk.sanitizeUrl=FNe});var rN,i0,nk,Gee,ik,ak,Oa,Fx,sk,a0=O(()=>{"use strict";rN=Ra(Wg(),1);Ar();Ur();i0=o((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),nk=o((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};i0(t,r).lower()},"drawBackgroundRect"),Gee=o((t,e)=>{let r=e.text.replace(Ip," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),ik=o((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,rN.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),ak=o((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,rN.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),Oa=o(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),Fx=o(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj"),sk=o(()=>{let t=je(".mermaidTooltip");return t.empty()&&(t=je("body").append("div").attr("class","mermaidTooltip").style("opacity",0).style("position","absolute").style("text-align","center").style("max-width","200px").style("padding","2px").style("font-size","12px").style("background","#ffffde").style("border","1px solid #333").style("border-radius","2px").style("pointer-events","none").style("z-index","100")),t},"createTooltip")});var Vee,nN,qee,$Ne,zNe,GNe,VNe,qNe,UNe,WNe,HNe,YNe,jNe,XNe,KNe,bh,dc,Uee=O(()=>{"use strict";Ur();a0();Vee=Ra(Wg(),1),nN=o(function(t,e){return i0(t,e)},"drawRect"),qee=o(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let l=a.startsWith("data:image/png;base64")?a:(0,Vee.sanitizeUrl)(a);s.attr("xlink:href",l)},"drawImage"),$Ne=o((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",l=a.lineColor?a.lineColor:"#444444",u=a.offsetX?parseInt(a.offsetX):0,h=a.offsetY?parseInt(a.offsetY):0,f="";if(i===0){let p=n.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",l),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)"),i=-1}else{let p=n.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",l).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)")}let d=r.messageFont();bh(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+h,a.label.width,a.label.height,{fill:s},d),a.techn&&a.techn.text!==""&&(d=r.messageFont(),bh(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+h,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},d))}},"drawRels"),zNe=o(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let u={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};nN(n,u);let h=r.boundaryFont();h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=s,bh(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},h),e.type&&e.type.text!==""&&(h=r.boundaryFont(),h.fontColor=s,bh(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},h)),e.descr&&e.descr.text!==""&&(h=r.boundaryFont(),h.fontSize=h.fontSize-2,h.fontColor=s,bh(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},h))},"drawBoundary"),GNe=o(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let l=t.append("g");l.attr("class","person-man");let u=Oa();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":u.x=e.x,u.y=e.y,u.fill=n,u.width=e.width,u.height=e.height,u.stroke=i,u.rx=2.5,u.ry=2.5,u.attrs={"stroke-width":.5},nN(l,u);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let h=KNe(r,e.typeC4Shape.text);switch(l.append("text").attr("fill",a).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":qee(l,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let f=r[e.typeC4Shape.text+"Font"]();return f.fontWeight="bold",f.fontSize=f.fontSize+2,f.fontColor=a,bh(r)(e.label.text,l,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},f),f=r[e.typeC4Shape.text+"Font"](),f.fontColor=a,e.techn&&e.techn?.text!==""?bh(r)(e.techn.text,l,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},f):e.type&&e.type.text!==""&&bh(r)(e.type.text,l,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},f),e.descr&&e.descr.text!==""&&(f=r.personFont(),f.fontColor=a,bh(r)(e.descr.text,l,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},f)),e.height},"drawC4Shape"),VNe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),qNe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),UNe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),WNe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),HNe=o(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),YNe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),jNe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),XNe=o(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),KNe=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),bh=(function(){function t(i,a,s,l,u,h,f){let d=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(i);n(d,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d){let{fontSize:p,fontFamily:m,fontWeight:g}=d,y=i.split(st.lineBreakRegex);for(let v=0;v{"use strict";QNe=typeof global=="object"&&global&&global.Object===Object&&global,lk=QNe});var ZNe,JNe,Ri,yl=O(()=>{"use strict";iN();ZNe=typeof self=="object"&&self&&self.Object===Object&&self,JNe=lk||ZNe||Function("return this")(),Ri=JNe});var eMe,ya,s0=O(()=>{"use strict";yl();eMe=Ri.Symbol,ya=eMe});function nMe(t){var e=tMe.call(t,$x),r=t[$x];try{t[$x]=void 0;var n=!0}catch{}var i=rMe.call(t);return n&&(e?t[$x]=r:delete t[$x]),i}var Wee,tMe,rMe,$x,Hee,Yee=O(()=>{"use strict";s0();Wee=Object.prototype,tMe=Wee.hasOwnProperty,rMe=Wee.toString,$x=ya?ya.toStringTag:void 0;o(nMe,"getRawTag");Hee=nMe});function sMe(t){return aMe.call(t)}var iMe,aMe,jee,Xee=O(()=>{"use strict";iMe=Object.prototype,aMe=iMe.toString;o(sMe,"objectToString");jee=sMe});function cMe(t){return t==null?t===void 0?lMe:oMe:Kee&&Kee in Object(t)?Hee(t):jee(t)}var oMe,lMe,Kee,Pa,Th=O(()=>{"use strict";s0();Yee();Xee();oMe="[object Null]",lMe="[object Undefined]",Kee=ya?ya.toStringTag:void 0;o(cMe,"baseGetTag");Pa=cMe});function uMe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var On,Vo=O(()=>{"use strict";o(uMe,"isObject");On=uMe});function mMe(t){if(!On(t))return!1;var e=Pa(t);return e==fMe||e==dMe||e==hMe||e==pMe}var hMe,fMe,dMe,pMe,Vi,zx=O(()=>{"use strict";Th();Vo();hMe="[object AsyncFunction]",fMe="[object Function]",dMe="[object GeneratorFunction]",pMe="[object Proxy]";o(mMe,"isFunction");Vi=mMe});var gMe,ck,Qee=O(()=>{"use strict";yl();gMe=Ri["__core-js_shared__"],ck=gMe});function yMe(t){return!!Zee&&Zee in t}var Zee,Jee,ete=O(()=>{"use strict";Qee();Zee=(function(){var t=/[^.]+$/.exec(ck&&ck.keys&&ck.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""})();o(yMe,"isMasked");Jee=yMe});function bMe(t){if(t!=null){try{return xMe.call(t)}catch{}try{return t+""}catch{}}return""}var vMe,xMe,wh,aN=O(()=>{"use strict";vMe=Function.prototype,xMe=vMe.toString;o(bMe,"toSource");wh=bMe});function _Me(t){if(!On(t)||Jee(t))return!1;var e=Vi(t)?AMe:wMe;return e.test(wh(t))}var TMe,wMe,kMe,EMe,SMe,CMe,AMe,tte,rte=O(()=>{"use strict";zx();ete();Vo();aN();TMe=/[\\^$.*+?()[\]{}|]/g,wMe=/^\[object .+?Constructor\]$/,kMe=Function.prototype,EMe=Object.prototype,SMe=kMe.toString,CMe=EMe.hasOwnProperty,AMe=RegExp("^"+SMe.call(CMe).replace(TMe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o(_Me,"baseIsNative");tte=_Me});function DMe(t,e){return t?.[e]}var nte,ite=O(()=>{"use strict";o(DMe,"getValue");nte=DMe});function RMe(t,e){var r=nte(t,e);return tte(r)?r:void 0}var ro,Ff=O(()=>{"use strict";rte();ite();o(RMe,"getNative");ro=RMe});var LMe,kh,Gx=O(()=>{"use strict";Ff();LMe=ro(Object,"create"),kh=LMe});function NMe(){this.__data__=kh?kh(null):{},this.size=0}var ate,ste=O(()=>{"use strict";Gx();o(NMe,"hashClear");ate=NMe});function MMe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var ote,lte=O(()=>{"use strict";o(MMe,"hashDelete");ote=MMe});function BMe(t){var e=this.__data__;if(kh){var r=e[t];return r===IMe?void 0:r}return PMe.call(e,t)?e[t]:void 0}var IMe,OMe,PMe,cte,ute=O(()=>{"use strict";Gx();IMe="__lodash_hash_undefined__",OMe=Object.prototype,PMe=OMe.hasOwnProperty;o(BMe,"hashGet");cte=BMe});function zMe(t){var e=this.__data__;return kh?e[t]!==void 0:$Me.call(e,t)}var FMe,$Me,hte,fte=O(()=>{"use strict";Gx();FMe=Object.prototype,$Me=FMe.hasOwnProperty;o(zMe,"hashHas");hte=zMe});function VMe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=kh&&e===void 0?GMe:e,this}var GMe,dte,pte=O(()=>{"use strict";Gx();GMe="__lodash_hash_undefined__";o(VMe,"hashSet");dte=VMe});function Hg(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";ste();lte();ute();fte();pte();o(Hg,"Hash");Hg.prototype.clear=ate;Hg.prototype.delete=ote;Hg.prototype.get=cte;Hg.prototype.has=hte;Hg.prototype.set=dte;sN=Hg});function qMe(){this.__data__=[],this.size=0}var gte,yte=O(()=>{"use strict";o(qMe,"listCacheClear");gte=qMe});function UMe(t,e){return t===e||t!==t&&e!==e}var vl,o0=O(()=>{"use strict";o(UMe,"eq");vl=UMe});function WMe(t,e){for(var r=t.length;r--;)if(vl(t[r][0],e))return r;return-1}var $f,Vx=O(()=>{"use strict";o0();o(WMe,"assocIndexOf");$f=WMe});function jMe(t){var e=this.__data__,r=$f(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():YMe.call(e,r,1),--this.size,!0}var HMe,YMe,vte,xte=O(()=>{"use strict";Vx();HMe=Array.prototype,YMe=HMe.splice;o(jMe,"listCacheDelete");vte=jMe});function XMe(t){var e=this.__data__,r=$f(e,t);return r<0?void 0:e[r][1]}var bte,Tte=O(()=>{"use strict";Vx();o(XMe,"listCacheGet");bte=XMe});function KMe(t){return $f(this.__data__,t)>-1}var wte,kte=O(()=>{"use strict";Vx();o(KMe,"listCacheHas");wte=KMe});function QMe(t,e){var r=this.__data__,n=$f(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var Ete,Ste=O(()=>{"use strict";Vx();o(QMe,"listCacheSet");Ete=QMe});function Yg(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";yte();xte();Tte();kte();Ste();o(Yg,"ListCache");Yg.prototype.clear=gte;Yg.prototype.delete=vte;Yg.prototype.get=bte;Yg.prototype.has=wte;Yg.prototype.set=Ete;zf=Yg});var ZMe,Gf,uk=O(()=>{"use strict";Ff();yl();ZMe=ro(Ri,"Map"),Gf=ZMe});function JMe(){this.size=0,this.__data__={hash:new sN,map:new(Gf||zf),string:new sN}}var Cte,Ate=O(()=>{"use strict";mte();qx();uk();o(JMe,"mapCacheClear");Cte=JMe});function eIe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var _te,Dte=O(()=>{"use strict";o(eIe,"isKeyable");_te=eIe});function tIe(t,e){var r=t.__data__;return _te(e)?r[typeof e=="string"?"string":"hash"]:r.map}var Vf,Ux=O(()=>{"use strict";Dte();o(tIe,"getMapData");Vf=tIe});function rIe(t){var e=Vf(this,t).delete(t);return this.size-=e?1:0,e}var Rte,Lte=O(()=>{"use strict";Ux();o(rIe,"mapCacheDelete");Rte=rIe});function nIe(t){return Vf(this,t).get(t)}var Nte,Mte=O(()=>{"use strict";Ux();o(nIe,"mapCacheGet");Nte=nIe});function iIe(t){return Vf(this,t).has(t)}var Ite,Ote=O(()=>{"use strict";Ux();o(iIe,"mapCacheHas");Ite=iIe});function aIe(t,e){var r=Vf(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var Pte,Bte=O(()=>{"use strict";Ux();o(aIe,"mapCacheSet");Pte=aIe});function jg(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";Ate();Lte();Mte();Ote();Bte();o(jg,"MapCache");jg.prototype.clear=Cte;jg.prototype.delete=Rte;jg.prototype.get=Nte;jg.prototype.has=Ite;jg.prototype.set=Pte;l0=jg});function oN(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(sIe);var r=o(function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s},"memoized");return r.cache=new(oN.Cache||l0),r}var sIe,Xg,lN=O(()=>{"use strict";hk();sIe="Expected a function";o(oN,"memoize");oN.Cache=l0;Xg=oN});function oIe(){this.__data__=new zf,this.size=0}var Fte,$te=O(()=>{"use strict";qx();o(oIe,"stackClear");Fte=oIe});function lIe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var zte,Gte=O(()=>{"use strict";o(lIe,"stackDelete");zte=lIe});function cIe(t){return this.__data__.get(t)}var Vte,qte=O(()=>{"use strict";o(cIe,"stackGet");Vte=cIe});function uIe(t){return this.__data__.has(t)}var Ute,Wte=O(()=>{"use strict";o(uIe,"stackHas");Ute=uIe});function fIe(t,e){var r=this.__data__;if(r instanceof zf){var n=r.__data__;if(!Gf||n.length{"use strict";qx();uk();hk();hIe=200;o(fIe,"stackSet");Hte=fIe});function Kg(t){var e=this.__data__=new zf(t);this.size=e.size}var su,Wx=O(()=>{"use strict";qx();$te();Gte();qte();Wte();Yte();o(Kg,"Stack");Kg.prototype.clear=Fte;Kg.prototype.delete=zte;Kg.prototype.get=Vte;Kg.prototype.has=Ute;Kg.prototype.set=Hte;su=Kg});var dIe,Qg,cN=O(()=>{"use strict";Ff();dIe=(function(){try{var t=ro(Object,"defineProperty");return t({},"",{}),t}catch{}})(),Qg=dIe});function pIe(t,e,r){e=="__proto__"&&Qg?Qg(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var ou,Zg=O(()=>{"use strict";cN();o(pIe,"baseAssignValue");ou=pIe});function mIe(t,e,r){(r!==void 0&&!vl(t[e],r)||r===void 0&&!(e in t))&&ou(t,e,r)}var Hx,uN=O(()=>{"use strict";Zg();o0();o(mIe,"assignMergeValue");Hx=mIe});function gIe(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),l=s.length;l--;){var u=s[t?l:++i];if(r(a[u],u,a)===!1)break}return e}}var jte,Xte=O(()=>{"use strict";o(gIe,"createBaseFor");jte=gIe});var yIe,Jg,fk=O(()=>{"use strict";Xte();yIe=jte(),Jg=yIe});function xIe(t,e){if(e)return t.slice();var r=t.length,n=Zte?Zte(r):new t.constructor(r);return t.copy(n),n}var Jte,Kte,vIe,Qte,Zte,dk,hN=O(()=>{"use strict";yl();Jte=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Kte=Jte&&typeof module=="object"&&module&&!module.nodeType&&module,vIe=Kte&&Kte.exports===Jte,Qte=vIe?Ri.Buffer:void 0,Zte=Qte?Qte.allocUnsafe:void 0;o(xIe,"cloneBuffer");dk=xIe});var bIe,e1,fN=O(()=>{"use strict";yl();bIe=Ri.Uint8Array,e1=bIe});function TIe(t){var e=new t.constructor(t.byteLength);return new e1(e).set(new e1(t)),e}var t1,pk=O(()=>{"use strict";fN();o(TIe,"cloneArrayBuffer");t1=TIe});function wIe(t,e){var r=e?t1(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var mk,dN=O(()=>{"use strict";pk();o(wIe,"cloneTypedArray");mk=wIe});function kIe(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";o(kIe,"copyArray");gk=kIe});var ere,EIe,tre,rre=O(()=>{"use strict";Vo();ere=Object.create,EIe=(function(){function t(){}return o(t,"object"),function(e){if(!On(e))return{};if(ere)return ere(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}})(),tre=EIe});function SIe(t,e){return function(r){return t(e(r))}}var yk,mN=O(()=>{"use strict";o(SIe,"overArg");yk=SIe});var CIe,r1,vk=O(()=>{"use strict";mN();CIe=yk(Object.getPrototypeOf,Object),r1=CIe});function _Ie(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||AIe;return t===r}var AIe,lu,n1=O(()=>{"use strict";AIe=Object.prototype;o(_Ie,"isPrototype");lu=_Ie});function DIe(t){return typeof t.constructor=="function"&&!lu(t)?tre(r1(t)):{}}var xk,gN=O(()=>{"use strict";rre();vk();n1();o(DIe,"initCloneObject");xk=DIe});function RIe(t){return t!=null&&typeof t=="object"}var wi,xl=O(()=>{"use strict";o(RIe,"isObjectLike");wi=RIe});function NIe(t){return wi(t)&&Pa(t)==LIe}var LIe,yN,nre=O(()=>{"use strict";Th();xl();LIe="[object Arguments]";o(NIe,"baseIsArguments");yN=NIe});var ire,MIe,IIe,OIe,pc,i1=O(()=>{"use strict";nre();xl();ire=Object.prototype,MIe=ire.hasOwnProperty,IIe=ire.propertyIsEnumerable,OIe=yN((function(){return arguments})())?yN:function(t){return wi(t)&&MIe.call(t,"callee")&&!IIe.call(t,"callee")},pc=OIe});var PIe,zt,oi=O(()=>{"use strict";PIe=Array.isArray,zt=PIe});function FIe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=BIe}var BIe,a1,bk=O(()=>{"use strict";BIe=9007199254740991;o(FIe,"isLength");a1=FIe});function $Ie(t){return t!=null&&a1(t.length)&&!Vi(t)}var Li,bl=O(()=>{"use strict";zx();bk();o($Ie,"isArrayLike");Li=$Ie});function zIe(t){return wi(t)&&Li(t)}var c0,Tk=O(()=>{"use strict";bl();xl();o(zIe,"isArrayLikeObject");c0=zIe});function GIe(){return!1}var are,sre=O(()=>{"use strict";o(GIe,"stubFalse");are=GIe});var cre,ore,VIe,lre,qIe,UIe,mc,s1=O(()=>{"use strict";yl();sre();cre=typeof exports=="object"&&exports&&!exports.nodeType&&exports,ore=cre&&typeof module=="object"&&module&&!module.nodeType&&module,VIe=ore&&ore.exports===cre,lre=VIe?Ri.Buffer:void 0,qIe=lre?lre.isBuffer:void 0,UIe=qIe||are,mc=UIe});function KIe(t){if(!wi(t)||Pa(t)!=WIe)return!1;var e=r1(t);if(e===null)return!0;var r=jIe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&ure.call(r)==XIe}var WIe,HIe,YIe,ure,jIe,XIe,hre,fre=O(()=>{"use strict";Th();vk();xl();WIe="[object Object]",HIe=Function.prototype,YIe=Object.prototype,ure=HIe.toString,jIe=YIe.hasOwnProperty,XIe=ure.call(Object);o(KIe,"isPlainObject");hre=KIe});function TOe(t){return wi(t)&&a1(t.length)&&!!ti[Pa(t)]}var QIe,ZIe,JIe,eOe,tOe,rOe,nOe,iOe,aOe,sOe,oOe,lOe,cOe,uOe,hOe,fOe,dOe,pOe,mOe,gOe,yOe,vOe,xOe,bOe,ti,dre,pre=O(()=>{"use strict";Th();bk();xl();QIe="[object Arguments]",ZIe="[object Array]",JIe="[object Boolean]",eOe="[object Date]",tOe="[object Error]",rOe="[object Function]",nOe="[object Map]",iOe="[object Number]",aOe="[object Object]",sOe="[object RegExp]",oOe="[object Set]",lOe="[object String]",cOe="[object WeakMap]",uOe="[object ArrayBuffer]",hOe="[object DataView]",fOe="[object Float32Array]",dOe="[object Float64Array]",pOe="[object Int8Array]",mOe="[object Int16Array]",gOe="[object Int32Array]",yOe="[object Uint8Array]",vOe="[object Uint8ClampedArray]",xOe="[object Uint16Array]",bOe="[object Uint32Array]",ti={};ti[fOe]=ti[dOe]=ti[pOe]=ti[mOe]=ti[gOe]=ti[yOe]=ti[vOe]=ti[xOe]=ti[bOe]=!0;ti[QIe]=ti[ZIe]=ti[uOe]=ti[JIe]=ti[hOe]=ti[eOe]=ti[tOe]=ti[rOe]=ti[nOe]=ti[iOe]=ti[aOe]=ti[sOe]=ti[oOe]=ti[lOe]=ti[cOe]=!1;o(TOe,"baseIsTypedArray");dre=TOe});function wOe(t){return function(e){return t(e)}}var Tl,u0=O(()=>{"use strict";o(wOe,"baseUnary");Tl=wOe});var mre,Yx,kOe,vN,EOe,wl,jx=O(()=>{"use strict";iN();mre=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Yx=mre&&typeof module=="object"&&module&&!module.nodeType&&module,kOe=Yx&&Yx.exports===mre,vN=kOe&&lk.process,EOe=(function(){try{var t=Yx&&Yx.require&&Yx.require("util").types;return t||vN&&vN.binding&&vN.binding("util")}catch{}})(),wl=EOe});var gre,SOe,qf,Xx=O(()=>{"use strict";pre();u0();jx();gre=wl&&wl.isTypedArray,SOe=gre?Tl(gre):dre,qf=SOe});function COe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var Kx,xN=O(()=>{"use strict";o(COe,"safeGet");Kx=COe});function DOe(t,e,r){var n=t[e];(!(_Oe.call(t,e)&&vl(n,r))||r===void 0&&!(e in t))&&ou(t,e,r)}var AOe,_Oe,cu,o1=O(()=>{"use strict";Zg();o0();AOe=Object.prototype,_Oe=AOe.hasOwnProperty;o(DOe,"assignValue");cu=DOe});function ROe(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{"use strict";o1();Zg();o(ROe,"copyObject");kl=ROe});function LOe(t,e){for(var r=-1,n=Array(t);++r{"use strict";o(LOe,"baseTimes");yre=LOe});function IOe(t,e){var r=typeof t;return e=e??NOe,!!e&&(r=="number"||r!="symbol"&&MOe.test(t))&&t>-1&&t%1==0&&t{"use strict";NOe=9007199254740991,MOe=/^(?:0|[1-9]\d*)$/;o(IOe,"isIndex");Uf=IOe});function BOe(t,e){var r=zt(t),n=!r&&pc(t),i=!r&&!n&&mc(t),a=!r&&!n&&!i&&qf(t),s=r||n||i||a,l=s?yre(t.length,String):[],u=l.length;for(var h in t)(e||POe.call(t,h))&&!(s&&(h=="length"||i&&(h=="offset"||h=="parent")||a&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||Uf(h,u)))&&l.push(h);return l}var OOe,POe,wk,bN=O(()=>{"use strict";vre();i1();oi();s1();Qx();Xx();OOe=Object.prototype,POe=OOe.hasOwnProperty;o(BOe,"arrayLikeKeys");wk=BOe});function FOe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var xre,bre=O(()=>{"use strict";o(FOe,"nativeKeysIn");xre=FOe});function GOe(t){if(!On(t))return xre(t);var e=lu(t),r=[];for(var n in t)n=="constructor"&&(e||!zOe.call(t,n))||r.push(n);return r}var $Oe,zOe,Tre,wre=O(()=>{"use strict";Vo();n1();bre();$Oe=Object.prototype,zOe=$Oe.hasOwnProperty;o(GOe,"baseKeysIn");Tre=GOe});function VOe(t){return Li(t)?wk(t,!0):Tre(t)}var no,Wf=O(()=>{"use strict";bN();wre();bl();o(VOe,"keysIn");no=VOe});function qOe(t){return kl(t,no(t))}var kre,Ere=O(()=>{"use strict";h0();Wf();o(qOe,"toPlainObject");kre=qOe});function UOe(t,e,r,n,i,a,s){var l=Kx(t,r),u=Kx(e,r),h=s.get(u);if(h){Hx(t,r,h);return}var f=a?a(l,u,r+"",t,e,s):void 0,d=f===void 0;if(d){var p=zt(u),m=!p&&mc(u),g=!p&&!m&&qf(u);f=u,p||m||g?zt(l)?f=l:c0(l)?f=gk(l):m?(d=!1,f=dk(u,!0)):g?(d=!1,f=mk(u,!0)):f=[]:hre(u)||pc(u)?(f=l,pc(l)?f=kre(l):(!On(l)||Vi(l))&&(f=xk(u))):d=!1}d&&(s.set(u,f),i(f,u,n,a,s),s.delete(u)),Hx(t,r,f)}var Sre,Cre=O(()=>{"use strict";uN();hN();dN();pN();gN();i1();oi();Tk();s1();zx();Vo();fre();Xx();xN();Ere();o(UOe,"baseMergeDeep");Sre=UOe});function Are(t,e,r,n,i){t!==e&&Jg(e,function(a,s){if(i||(i=new su),On(a))Sre(t,e,s,r,Are,n,i);else{var l=n?n(Kx(t,s),a,s+"",t,e,i):void 0;l===void 0&&(l=a),Hx(t,s,l)}},no)}var _re,Dre=O(()=>{"use strict";Wx();uN();fk();Cre();Vo();Wf();xN();o(Are,"baseMerge");_re=Are});function WOe(t){return t}var va,Eh=O(()=>{"use strict";o(WOe,"identity");va=WOe});function HOe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var Rre,Lre=O(()=>{"use strict";o(HOe,"apply");Rre=HOe});function YOe(t,e,r){return e=Nre(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=Nre(n.length-e,0),s=Array(a);++i{"use strict";Lre();Nre=Math.max;o(YOe,"overRest");kk=YOe});function jOe(t){return function(){return t}}var io,wN=O(()=>{"use strict";o(jOe,"constant");io=jOe});var XOe,Mre,Ire=O(()=>{"use strict";wN();cN();Eh();XOe=Qg?function(t,e){return Qg(t,"toString",{configurable:!0,enumerable:!1,value:io(e),writable:!0})}:va,Mre=XOe});function JOe(t){var e=0,r=0;return function(){var n=ZOe(),i=QOe-(n-r);if(r=n,i>0){if(++e>=KOe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var KOe,QOe,ZOe,Ore,Pre=O(()=>{"use strict";KOe=800,QOe=16,ZOe=Date.now;o(JOe,"shortOut");Ore=JOe});var ePe,Ek,kN=O(()=>{"use strict";Ire();Pre();ePe=Ore(Mre),Ek=ePe});function tPe(t,e){return Ek(kk(t,e,va),t+"")}var uu,l1=O(()=>{"use strict";Eh();TN();kN();o(tPe,"baseRest");uu=tPe});function rPe(t,e,r){if(!On(r))return!1;var n=typeof e;return(n=="number"?Li(r)&&Uf(e,r.length):n=="string"&&e in r)?vl(r[e],t):!1}var qo,f0=O(()=>{"use strict";o0();bl();Qx();Vo();o(rPe,"isIterateeCall");qo=rPe});function nPe(t){return uu(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&qo(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{"use strict";l1();f0();o(nPe,"createAssigner");Sk=nPe});var iPe,Hf,SN=O(()=>{"use strict";Dre();EN();iPe=Sk(function(t,e,r){_re(t,e,r)}),Hf=iPe});function _N(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return aPe[r]??e}function cPe(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,$re.sanitizeUrl)(r):r}function Vre(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function hPe(t){let e,r=0;t.forEach(i=>{r+=Vre(i,e),e=i});let n=r/2;return DN(t,n)}function fPe(t){return t.length===1?t[0]:hPe(t)}function pPe(t,e,r){let n=structuredClone(r);K.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=DN(n,i),s=10+t*.5,l=Math.atan2(n[0].y-a.y,n[0].x-a.x),u={x:0,y:0};return e==="start_left"?(u.x=Math.sin(l+Math.PI)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(u.x=Math.sin(l-Math.PI)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(u.x=Math.sin(l)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2-5):(u.x=Math.sin(l)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2),u}function RN(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function mPe(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;iMath.round(parseFloat(a)).toString());return i.includes(r.toString())||i.includes(n.toString())}var $re,AN,aPe,sPe,oPe,zre,Gre,lPe,uPe,Bre,DN,dPe,Fre,LN,NN,gPe,yPe,MN,vPe,IN,CN,Ck,xPe,bPe,Uo,Xt,qre,ao,hu,ar=O(()=>{"use strict";$re=Ra(Wg(),1);Ar();Ur();p8();xt();Fp();sg();lN();SN();Ow();AN="\u200B",aPe={curveBasis:fc,curveBasisClosed:Y5,curveBasisOpen:j5,curveBumpX:Sx,curveBumpY:Cx,curveBundle:W9,curveCardinalClosed:H9,curveCardinalOpen:j9,curveCardinal:Rx,curveCatmullRomClosed:K9,curveCatmullRomOpen:Q9,curveCatmullRom:Mx,curveLinear:au,curveLinearClosed:J5,curveMonotoneX:Ix,curveMonotoneY:Ox,curveNatural:qg,curveStep:Ug,curveStepAfter:Bx,curveStepBefore:Px},sPe=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,oPe=o(function(t,e){let r=zre(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(l=>l.args);cg(s),n=Vn(n,[...s])}else n=r.args;if(!n)return;let i=vg(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),zre=o(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${sPe.source})(?=[}][%]{2}).* -`,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),K.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=Bp.exec(t))!==null;)if(n.index===Bp.lastIndex&&Bp.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return K.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),Gre=o(function(t){return t.replace(Bp,"")},"removeDirectives"),lPe=o(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");o(_N,"interpolateToCurve");o(cPe,"formatUrl");uPe=o((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),DN=o((t,e)=>{let r,n=e;for(let i of t){if(r){let a=Vre(i,r);if(a===0)return r;if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:Bre((1-s)*r.x+s*i.x,5),y:Bre((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),dPe=o((t,e,r)=>{K.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=DN(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(s)*a+(e[0].x+i.x)/2,l.y=-Math.cos(s)*a+(e[0].y+i.y)/2,l},"calcCardinalityPosition");o(pPe,"calcTerminalLabelPosition");o(RN,"getStylesFromArray");Fre=0,LN=o(()=>(Fre++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Fre),"generateId");o(mPe,"makeRandomHex");NN=o(t=>mPe(t.length),"random"),gPe=o(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),yPe=o(function(t,e){let r=e.text.replace(st.lineBreakRegex," "),[,n]=Uo(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),MN=Xg((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
    "},r),st.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,l)=>{let u=xa(`${s} `,r),h=xa(a,r);if(u>e){let{hyphenatedStrings:p,remainingWord:m}=vPe(s,e,"-",r);i.push(a,...p),a=m}else h+u>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");l+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),vPe=Xg((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((l,u)=>{let h=`${s}${l}`;if(xa(h,n)>=e){let d=u+1,p=i.length===d,m=`${h}${r}`;a.push(p?h:m),s=""}else s=h}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);o(Ak,"calculateTextHeight");o(xa,"calculateTextWidth");IN=Xg((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=Uo(r),s=["sans-serif",n],l=t.split(st.lineBreakRegex),u=[],h=je("body");if(!h.remove)return{width:0,height:0,lineHeight:0};let f=h.append("svg");for(let p of s){let m=0,g={width:0,height:0,lineHeight:0};for(let y of l){let v=gPe();v.text=y||AN;let x=yPe(f,v).style("font-size",a).style("font-weight",i).style("font-family",p),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),m=Math.round(b.height),g.height+=m,g.lineHeight=Math.round(Math.max(g.lineHeight,m))}u.push(g)}f.remove();let d=isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1;return u[d]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),CN=class{constructor(e=!1,r){this.count=0;this.count=r?r.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{o(this,"InitIDGenerator")}},xPe=o(function(t){return Ck=Ck||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),Ck.innerHTML=t,unescape(Ck.textContent)},"entityDecode");o(ON,"isDetailedError");bPe=o((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),Uo=o(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");o(Pn,"cleanAndMerge");Xt={assignWithDepth:Vn,wrapLabel:MN,calculateTextHeight:Ak,calculateTextWidth:xa,calculateTextDimensions:IN,cleanAndMerge:Pn,detectInit:oPe,detectDirective:zre,isSubstringInArray:lPe,interpolateToCurve:_N,calcLabelPosition:fPe,calcCardinalityPosition:dPe,calcTerminalLabelPosition:pPe,formatUrl:cPe,getStylesFromArray:RN,generateId:LN,random:NN,runFunc:uPe,entityDecode:xPe,insertTitle:bPe,isLabelCoordinateInPath:TPe,parseFontSize:Uo,InitIDGenerator:CN},qre=o(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),ao=o(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),hu=o((t,e,{counter:r=0,prefix:n,suffix:i},a)=>a||`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");o(Bn,"handleUndefinedAttr");o(TPe,"isLabelCoordinateInPath")});function gc(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=MN(e[t].text,i,n),e[t].textLines=e[t].text.split(st.lineBreakRegex).length,e[t].width=i,e[t].height=Ak(e[t].text,n);else{let a=e[t].text.split(st.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let l of a)e[t].width=Math.max(xa(l,n),e[t].width),s=Ak(l,n),e[t].height=e[t].height+s}}function jre(t,e,r,n,i){let a=new Lk(i);a.data.widthLimit=r.data.widthLimit/Math.min(PN,n.length);for(let[s,l]of n.entries()){let u=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=u,u=l.image.Y+l.image.height);let h=l.wrap&&Jt.wrap,f=_k(Jt);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",gc("label",l,h,f,a.data.widthLimit),l.label.Y=u+8,u=l.label.Y+l.label.height,l.type&&l.type.text!==""){l.type.text="["+l.type.text+"]";let g=_k(Jt);gc("type",l,h,g,a.data.widthLimit),l.type.Y=u+5,u=l.type.Y+l.type.height}if(l.descr&&l.descr.text!==""){let g=_k(Jt);g.fontSize=g.fontSize-2,gc("descr",l,h,g,a.data.widthLimit),l.descr.Y=u+20,u=l.descr.Y+l.descr.height}if(s==0||s%PN===0){let g=r.data.startx+Jt.diagramMarginX,y=r.data.stopy+Jt.diagramMarginY+u;a.setData(g,g,y,y)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Jt.diagramMarginX:a.data.startx,y=a.data.starty;a.setData(g,g,y,y)}a.name=l.alias;let d=i.db.getC4ShapeArray(l.alias),p=i.db.getC4ShapeKeys(l.alias);p.length>0&&Yre(a,t,d,p),e=l.alias;let m=i.db.getBoundaries(e);m.length>0&&jre(t,e,a,m,i),l.alias!=="global"&&Hre(t,l,a),r.data.stopy=Math.max(a.data.stopy+Jt.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Jt.c4ShapeMargin,r.data.stopx),Dk=Math.max(Dk,r.data.stopx),Rk=Math.max(Rk,r.data.stopy)}}var Dk,Rk,Wre,PN,Jt,Lk,BN,Zx,_k,wPe,Hre,Yre,so,Ure,kPe,EPe,SPe,FN,Xre=O(()=>{"use strict";Ar();Uee();xt();TD();Ur();LD();jt();sg();ar();Ti();Dk=0,Rk=0,Wre=4,PN=2;F2.yy=U2;Jt={},Lk=class{static{o(this,"Bounds")}constructor(e){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,BN(e.db.getConfig())}setData(e,r,n,i){this.nextData.startx=this.data.startx=e,this.nextData.stopx=this.data.stopx=r,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(e,r,n,i){e[r]===void 0?e[r]=n:e[r]=i(n,e[r])}insert(e){this.nextData.cnt=this.nextData.cnt+1;let r=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+e.margin:this.nextData.stopx+e.margin*2,n=r+e.width,i=this.nextData.starty+e.margin*2,a=i+e.height;(r>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>Wre)&&(r=this.nextData.startx+e.margin+Jt.nextLinePaddingX,i=this.nextData.stopy+e.margin*2,this.nextData.stopx=n=r+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=a=i+e.height,this.nextData.cnt=1),e.x=r,e.y=i,this.updateVal(this.data,"startx",r,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",a,Math.max),this.updateVal(this.nextData,"startx",r,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",a,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},BN(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},BN=o(function(t){Vn(Jt,t),t.fontFamily&&(Jt.personFontFamily=Jt.systemFontFamily=Jt.messageFontFamily=t.fontFamily),t.fontSize&&(Jt.personFontSize=Jt.systemFontSize=Jt.messageFontSize=t.fontSize),t.fontWeight&&(Jt.personFontWeight=Jt.systemFontWeight=Jt.messageFontWeight=t.fontWeight)},"setConf"),Zx=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),_k=o(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),wPe=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");o(gc,"calcC4ShapeTextWH");Hre=o(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Jt.c4ShapeMargin-35;let n=e.wrap&&Jt.wrap,i=_k(Jt);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=xa(e.label.text,i);gc("label",e,n,i,a),dc.drawBoundary(t,e,Jt)},"drawBoundary"),Yre=o(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],l=Zx(Jt,s.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,s.typeC4Shape.width=xa("\xAB"+s.typeC4Shape.text+"\xBB",l),s.typeC4Shape.height=l.fontSize+2,s.typeC4Shape.Y=Jt.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let u=s.wrap&&Jt.wrap,h=Jt.width-Jt.c4ShapePadding*2,f=Zx(Jt,s.typeC4Shape.text);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",gc("label",s,u,f,h),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let m=Zx(Jt,s.typeC4Shape.text);gc("type",s,u,m,h),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let m=Zx(Jt,s.techn.text);gc("techn",s,u,m,h),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let d=i,p=s.label.width;if(s.descr&&s.descr.text!==""){let m=Zx(Jt,s.typeC4Shape.text);gc("descr",s,u,m,h),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,p=Math.max(s.label.width,s.descr.width),d=i-s.descr.textLines*5}p=p+Jt.c4ShapePadding,s.width=Math.max(s.width||Jt.width,p,Jt.width),s.height=Math.max(s.height||Jt.height,d,Jt.height),s.margin=s.margin||Jt.c4ShapeMargin,t.insert(s),dc.drawC4Shape(e,s,Jt)}t.bumpLastMargin(Jt.c4ShapeMargin)},"drawC4ShapeArray"),so=class{static{o(this,"Point")}constructor(e,r){this.x=e,this.y=r}},Ure=o(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,l=n+t.height/2,u=Math.abs(r-i),h=Math.abs(n-a),f=h/u,d=t.height/t.width,p=null;return n==a&&ri?p=new so(r,l):r==i&&na&&(p=new so(s,n)),r>i&&n=f?p=new so(r,l+f*t.width/2):p=new so(s-u/h*t.height/2,n+t.height):r=f?p=new so(r+t.width,l+f*t.width/2):p=new so(s+u/h*t.height/2,n+t.height):ra?d>=f?p=new so(r+t.width,l-f*t.width/2):p=new so(s+t.height/2*u/h,n):r>i&&n>a&&(d>=f?p=new so(r,l-t.width/2*f):p=new so(s-t.height/2*u/h,n)),p},"getIntersectPoint"),kPe=o(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=Ure(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=Ure(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),EPe=o(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Jt.wrap,l=wPe(Jt);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let h=xa(a.label.text,l);gc("label",a,s,l,h),a.techn&&a.techn.text!==""&&(h=xa(a.techn.text,l),gc("techn",a,s,l,h)),a.descr&&a.descr.text!==""&&(h=xa(a.descr.text,l),gc("descr",a,s,l,h));let f=r(a.from),d=r(a.to),p=kPe(f,d);a.startPoint=p.startPoint,a.endPoint=p.endPoint}dc.drawRels(t,e,Jt)},"drawRels");o(jre,"drawInsideBoundary");SPe=o(function(t,e,r,n){Jt=ve().c4;let i=ve().securityLevel,a;i==="sandbox"&&(a=je("#i"+e));let s=i==="sandbox"?je(a.nodes()[0].contentDocument.body):je("body"),l=n.db;n.db.setWrap(Jt.wrap),Wre=l.getC4ShapeInRow(),PN=l.getC4BoundaryInRow(),K.debug(`C:${JSON.stringify(Jt,null,2)}`);let u=i==="sandbox"?s.select(`[id="${e}"]`):je(`[id="${e}"]`);dc.insertComputerIcon(u),dc.insertDatabaseIcon(u),dc.insertClockIcon(u);let h=new Lk(n);h.setData(Jt.diagramMarginX,Jt.diagramMarginX,Jt.diagramMarginY,Jt.diagramMarginY),h.data.widthLimit=screen.availWidth,Dk=Jt.diagramMarginX,Rk=Jt.diagramMarginY;let f=n.db.getTitle(),d=n.db.getBoundaries("");jre(u,"",h,d,n),dc.insertArrowHead(u),dc.insertArrowEnd(u),dc.insertArrowCrossHead(u),dc.insertArrowFilledHead(u),EPe(u,n.db.getRels(),n.db.getC4Shape,n),h.data.stopx=Dk,h.data.stopy=Rk;let p=h.data,g=p.stopy-p.starty+2*Jt.diagramMarginY,v=p.stopx-p.startx+2*Jt.diagramMarginX;f&&u.append("text").text(f).attr("x",(p.stopx-p.startx)/2-4*Jt.diagramMarginX).attr("y",p.starty+Jt.diagramMarginY),Zr(u,g,v,Jt.useMaxWidth);let x=f?60:0;u.attr("viewBox",p.startx-Jt.diagramMarginX+" -"+(Jt.diagramMarginY+x)+" "+v+" "+(g+x)),K.debug("models:",p)},"draw"),FN={drawPersonOrSystemArray:Yre,drawBoundary:Hre,setConf:BN,draw:SPe}});var CPe,Kre,Qre=O(()=>{"use strict";CPe=o(t=>`.person { - stroke: ${t.personBorder}; - fill: ${t.personBkg}; - } -`,"getStyles"),Kre=CPe});var Zre={};vr(Zre,{diagram:()=>APe});var APe,Jre=O(()=>{"use strict";TD();LD();Xre();Qre();APe={parser:EX,db:U2,renderer:FN,styles:Kre,init:o(({c4:t,wrap:e})=>{FN.setConf(t),U2.setWrap(e)},"init")}});function gne(t){return typeof t>"u"||t===null}function LPe(t){return typeof t=="object"&&t!==null}function NPe(t){return Array.isArray(t)?t:gne(t)?[]:[t]}function MPe(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;rl&&(a=" ... ",e=n-l+a.length),r-n>l&&(s=" ...",r=n+l-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function zN(t,e){return ra.repeat(" ",e-t.length)+t}function VPe(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var l="",u,h,f=Math.min(t.line+e.linesAfter,i.length).toString().length,d=e.maxLength-(e.indent+f+3);for(u=1;u<=e.linesBefore&&!(s-u<0);u++)h=$N(t.buffer,n[s-u],i[s-u],t.position-(n[s]-n[s-u]),d),l=ra.repeat(" ",e.indent)+zN((t.line-u+1).toString(),f)+" | "+h.str+` -`+l;for(h=$N(t.buffer,n[s],i[s],t.position,d),l+=ra.repeat(" ",e.indent)+zN((t.line+1).toString(),f)+" | "+h.str+` -`,l+=ra.repeat("-",e.indent+f+3+h.pos)+`^ -`,u=1;u<=e.linesAfter&&!(s+u>=i.length);u++)h=$N(t.buffer,n[s+u],i[s+u],t.position-(n[s]-n[s+u]),d),l+=ra.repeat(" ",e.indent)+zN((t.line+u+1).toString(),f)+" | "+h.str+` -`;return l.replace(/\n$/,"")}function HPe(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function YPe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(UPe.indexOf(r)===-1)throw new oo('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=HPe(e.styleAliases||null),WPe.indexOf(this.kind)===-1)throw new oo('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function tne(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function jPe(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(o(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function xBe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(ra.isNegativeZero(t))return"-0.0";return r=t.toString(10),vBe.test(r)?r.replace("e",".e"):r}function bBe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||ra.isNegativeZero(t))}function kBe(t){return t===null?!1:xne.exec(t)!==null||bne.exec(t)!==null}function EBe(t){var e,r,n,i,a,s,l,u=0,h=null,f,d,p;if(e=xne.exec(t),e===null&&(e=bne.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],l=+e[6],e[7]){for(u=e[7].slice(0,3);u.length<3;)u+="0";u=+u}return e[9]&&(f=+e[10],d=+(e[11]||0),h=(f*60+d)*6e4,e[9]==="-"&&(h=-h)),p=new Date(Date.UTC(r,n,i,a,s,l,u)),h&&p.setTime(p.getTime()-h),p}function SBe(t){return t.toISOString()}function ABe(t){return t==="<<"||t===null}function DBe(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=YN;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function RBe(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=YN,s=0,l=[];for(e=0;e>16&255),l.push(s>>8&255),l.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(l.push(s>>16&255),l.push(s>>8&255),l.push(s&255)):r===18?(l.push(s>>10&255),l.push(s>>2&255)):r===12&&l.push(s>>4&255),new Uint8Array(l)}function LBe(t){var e="",r=0,n,i,a=t.length,s=YN;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function NBe(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function PBe(t){if(t===null)return!0;var e=[],r,n,i,a,s,l=t;for(r=0,n=l.length;r>10)+55296,(t-65536&1023)+56320)}function Cne(t,e,r){e==="__proto__"?Object.defineProperty(t,e,{configurable:!0,enumerable:!0,writable:!0,value:r}):t[e]=r}function tFe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||Tne,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function Dne(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=qPe(r),new oo(e,r)}function sr(t,e){throw Dne(t,e)}function Ik(t,e){t.onWarning&&t.onWarning.call(null,Dne(t,e))}function Yf(t,e,r,n){var i,a,s,l;if(e1&&(t.result+=ra.repeat(` -`,e-1))}function rFe(t,e,r){var n,i,a,s,l,u,h,f,d=t.kind,p=t.result,m;if(m=t.input.charCodeAt(t.position),lo(m)||u1(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(i=t.input.charCodeAt(t.position+1),lo(i)||r&&u1(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,l=!1;m!==0;){if(m===58){if(i=t.input.charCodeAt(t.position+1),lo(i)||r&&u1(i))break}else if(m===35){if(n=t.input.charCodeAt(t.position-1),lo(n))break}else{if(t.position===t.lineStart&&Bk(t)||r&&u1(m))break;if(fu(m))if(u=t.line,h=t.lineStart,f=t.lineIndent,qi(t,!1,-1),t.lineIndent>=e){l=!0,m=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=u,t.lineStart=h,t.lineIndent=f;break}}l&&(Yf(t,a,s,!1),XN(t,t.line-u),a=s=t.position,l=!1),p0(m)||(s=t.position+1),m=t.input.charCodeAt(++t.position)}return Yf(t,a,s,!1),t.result?!0:(t.kind=d,t.result=p,!1)}function nFe(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Yf(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else fu(r)?(Yf(t,n,i,!0),XN(t,qi(t,!1,e)),n=i=t.position):t.position===t.lineStart&&Bk(t)?sr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);sr(t,"unexpected end of the stream within a single quoted scalar")}function iFe(t,e){var r,n,i,a,s,l;if(l=t.input.charCodeAt(t.position),l!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(l=t.input.charCodeAt(t.position))!==0;){if(l===34)return Yf(t,r,t.position,!0),t.position++,!0;if(l===92){if(Yf(t,r,t.position,!0),l=t.input.charCodeAt(++t.position),fu(l))qi(t,!1,e);else if(l<256&&Ane[l])t.result+=_ne[l],t.position++;else if((s=ZBe(l))>0){for(i=s,a=0;i>0;i--)l=t.input.charCodeAt(++t.position),(s=QBe(l))>=0?a=(a<<4)+s:sr(t,"expected hexadecimal character");t.result+=eFe(a),t.position++}else sr(t,"unknown escape sequence");r=n=t.position}else fu(l)?(Yf(t,r,n,!0),XN(t,qi(t,!1,e)),r=n=t.position):t.position===t.lineStart&&Bk(t)?sr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}sr(t,"unexpected end of the stream within a double quoted scalar")}function aFe(t,e){var r=!0,n,i,a,s=t.tag,l,u=t.anchor,h,f,d,p,m,g=Object.create(null),y,v,x,b;if(b=t.input.charCodeAt(t.position),b===91)f=93,m=!1,l=[];else if(b===123)f=125,m=!0,l={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=l),b=t.input.charCodeAt(++t.position);b!==0;){if(qi(t,!0,e),b=t.input.charCodeAt(t.position),b===f)return t.position++,t.tag=s,t.anchor=u,t.kind=m?"mapping":"sequence",t.result=l,!0;r?b===44&&sr(t,"expected the node content, but found ','"):sr(t,"missed comma between flow collection entries"),v=y=x=null,d=p=!1,b===63&&(h=t.input.charCodeAt(t.position+1),lo(h)&&(d=p=!0,t.position++,qi(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,f1(t,e,Nk,!1,!0),v=t.tag,y=t.result,qi(t,!0,e),b=t.input.charCodeAt(t.position),(p||t.line===n)&&b===58&&(d=!0,b=t.input.charCodeAt(++t.position),qi(t,!0,e),f1(t,e,Nk,!1,!0),x=t.result),m?h1(t,l,g,v,y,x,n,i,a):d?l.push(h1(t,null,g,v,y,x,n,i,a)):l.push(y),qi(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}sr(t,"unexpected end of the stream within a flow collection")}function sFe(t,e){var r,n,i=GN,a=!1,s=!1,l=e,u=0,h=!1,f,d;if(d=t.input.charCodeAt(t.position),d===124)n=!1;else if(d===62)n=!0;else return!1;for(t.kind="scalar",t.result="";d!==0;)if(d=t.input.charCodeAt(++t.position),d===43||d===45)GN===i?i=d===43?rne:YBe:sr(t,"repeat of a chomping mode identifier");else if((f=JBe(d))>=0)f===0?sr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?sr(t,"repeat of an indentation width identifier"):(l=e+f-1,s=!0);else break;if(p0(d)){do d=t.input.charCodeAt(++t.position);while(p0(d));if(d===35)do d=t.input.charCodeAt(++t.position);while(!fu(d)&&d!==0)}for(;d!==0;){for(jN(t),t.lineIndent=0,d=t.input.charCodeAt(t.position);(!s||t.lineIndentl&&(l=t.lineIndent),fu(d)){u++;continue}if(t.lineIndente)&&u!==0)sr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(v&&(s=t.line,l=t.lineStart,u=t.position),f1(t,e,Mk,!0,i)&&(v?g=t.result:y=t.result),v||(h1(t,d,p,m,g,y,s,l,u),m=g=y=null),qi(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)sr(t,"bad indentation of a mapping entry");else if(t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),d=0,p=t.implicitTypes.length;d"),t.result!==null&&g.kind!==t.kind&&sr(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):sr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||f}function hFe(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(qi(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!lo(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&sr(t,"directive name must not be less than one character in length");s!==0;){for(;p0(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!fu(s));break}if(fu(s))break;for(r=t.position;s!==0&&!lo(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&jN(t),jf.call(ane,n)?ane[n](t,n,i):Ik(t,'unknown document directive "'+n+'"')}if(qi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,qi(t,!0,-1)):a&&sr(t,"directives end mark is expected"),f1(t,t.lineIndent-1,Mk,!1,!0),qi(t,!0,-1),t.checkLineBreaks&&XBe.test(t.input.slice(e,t.position))&&Ik(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&Bk(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,qi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=Rne(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function $ne(t){var e=/^\n* /;return e.test(t)}function GFe(t,e,r,n,i,a,s,l){var u,h=0,f=null,d=!1,p=!1,m=n!==-1,g=-1,y=$Fe(Jx(t,0))&&zFe(Jx(t,t.length-1));if(e||s)for(u=0;u=65536?u+=2:u++){if(h=Jx(t,u),!nb(h))return c1;y=y&&une(h,f,l),f=h}else{for(u=0;u=65536?u+=2:u++){if(h=Jx(t,u),h===tb)d=!0,m&&(p=p||u-g-1>n&&t[g+1]!==" ",g=u);else if(!nb(h))return c1;y=y&&une(h,f,l),f=h}p=p||m&&u-g-1>n&&t[g+1]!==" "}return!d&&!p?y&&!s&&!i(t)?zne:a===rb?c1:WN:r>9&&$ne(t)?c1:s?a===rb?c1:WN:p?Vne:Gne}function VFe(t,e,r,n,i){t.dump=(function(){if(e.length===0)return t.quotingType===rb?'""':"''";if(!t.noCompatMode&&(NFe.indexOf(e)!==-1||MFe.test(e)))return t.quotingType===rb?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),l=n||t.flowLevel>-1&&r>=t.flowLevel;function u(h){return FFe(t,h)}switch(o(u,"testAmbiguity"),GFe(e,l,t.indent,s,u,t.quotingType,t.forceQuotes&&!n,i)){case zne:return e;case WN:return"'"+e.replace(/'/g,"''")+"'";case Gne:return"|"+hne(e,t.indent)+fne(lne(e,a));case Vne:return">"+hne(e,t.indent)+fne(lne(qFe(e,s),a));case c1:return'"'+UFe(e)+'"';default:throw new oo("impossible error: invalid scalar style")}})()}function hne(t,e){var r=$ne(t)?String(e):"",n=t[t.length-1]===` -`,i=n&&(t[t.length-2]===` -`||t===` -`),a=i?"+":n?"":"-";return r+a+` -`}function fne(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function qFe(t,e){for(var r=/(\n+)([^\n]*)/g,n=(function(){var h=t.indexOf(` -`);return h=h!==-1?h:t.length,r.lastIndex=h,dne(t.slice(0,h),e)})(),i=t[0]===` -`||t[0]===" ",a,s;s=r.exec(t);){var l=s[1],u=s[2];a=u[0]===" ",n+=l+(!i&&!a&&u!==""?` -`:"")+dne(u,e),i=a}return n}function dne(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,l=0,u="";n=r.exec(t);)l=n.index,l-i>e&&(a=s>i?s:l,u+=` -`+t.slice(i,a),i=a+1),s=l;return u+=` -`,t.length-i>e&&s>i?u+=t.slice(i,s)+` -`+t.slice(s+1):u+=t.slice(i),u.slice(1)}function UFe(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=Jx(t,i),n=ts[r],!n&&nb(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||OFe(r);return e}function WFe(t,e,r){var n="",i=t.tag,a,s,l;for(a=0,s=r.length;a"u"&&Sh(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function pne(t,e,r,n){var i="",a=t.tag,s,l,u;for(s=0,l=r.length;s"u"&&Sh(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=UN(t,e)),t.dump&&tb===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function HFe(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,l,u,h,f;for(s=0,l=a.length;s1024&&(f+="? "),f+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Sh(t,e,h,!1,!1)&&(f+=t.dump,n+=f));t.tag=i,t.dump="{"+n+"}"}function YFe(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),l,u,h,f,d,p;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new oo("sortKeys must be a boolean or a function");for(l=0,u=s.length;l1024,d&&(t.dump&&tb===t.dump.charCodeAt(0)?p+="?":p+="? "),p+=t.dump,d&&(p+=UN(t,e)),Sh(t,e+1,f,!0,d)&&(t.dump&&tb===t.dump.charCodeAt(0)?p+=":":p+=": ",p+=t.dump,i+=p));t.tag=a,t.dump=i||"{}"}function mne(t,e,r){var n,i,a,s,l,u;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+u+'" style');t.dump=n}return!0}return!1}function Sh(t,e,r,n,i,a,s){t.tag=null,t.dump=r,mne(t,r,!1)||mne(t,r,!0);var l=Nne.call(t.dump),u=n,h;n&&(n=t.flowLevel<0||t.flowLevel>e);var f=l==="[object Object]"||l==="[object Array]",d,p;if(f&&(d=t.duplicates.indexOf(r),p=d!==-1),(t.tag!==null&&t.tag!=="?"||p||t.indent!==2&&e>0)&&(i=!1),p&&t.usedDuplicates[d])t.dump="*ref_"+d;else{if(f&&p&&!t.usedDuplicates[d]&&(t.usedDuplicates[d]=!0),l==="[object Object]")n&&Object.keys(t.dump).length!==0?(YFe(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(HFe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?pne(t,e-1,t.dump,i):pne(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(WFe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object String]")t.tag!=="?"&&VFe(t,t.dump,e,a,u);else{if(l==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new oo("unacceptable kind of an object to dump "+l)}t.tag!==null&&t.tag!=="?"&&(h=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?h="!"+h:h.slice(0,18)==="tag:yaml.org,2002:"?h="!!"+h.slice(18):h="!<"+h+">",t.dump=h+" "+t.dump)}return!0}function jFe(t,e){var r=[],n=[],i,a;for(HN(t,r,n),i=0,a=n.length;i{"use strict";o(gne,"isNothing");o(LPe,"isObject");o(NPe,"toArray");o(MPe,"extend");o(IPe,"repeat");o(OPe,"isNegativeZero");PPe=gne,BPe=LPe,FPe=NPe,$Pe=IPe,zPe=OPe,GPe=MPe,ra={isNothing:PPe,isObject:BPe,toArray:FPe,repeat:$Pe,isNegativeZero:zPe,extend:GPe};o(yne,"formatError");o(eb,"YAMLException$1");eb.prototype=Object.create(Error.prototype);eb.prototype.constructor=eb;eb.prototype.toString=o(function(e){return this.name+": "+yne(this,e)},"toString");oo=eb;o($N,"getLine");o(zN,"padStart");o(VPe,"makeSnippet");qPe=VPe,UPe=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],WPe=["scalar","sequence","mapping"];o(HPe,"compileStyleAliases");o(YPe,"Type$1");es=YPe;o(tne,"compileList");o(jPe,"compileMap");o(VN,"Schema$1");VN.prototype.extend=o(function(e){var r=[],n=[];if(e instanceof es)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new oo("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof es))throw new oo("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new oo("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new oo("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof es))throw new oo("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(VN.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=tne(i,"implicit"),i.compiledExplicit=tne(i,"explicit"),i.compiledTypeMap=jPe(i.compiledImplicit,i.compiledExplicit),i},"extend");XPe=VN,KPe=new es("tag:yaml.org,2002:str",{kind:"scalar",construct:o(function(t){return t!==null?t:""},"construct")}),QPe=new es("tag:yaml.org,2002:seq",{kind:"sequence",construct:o(function(t){return t!==null?t:[]},"construct")}),ZPe=new es("tag:yaml.org,2002:map",{kind:"mapping",construct:o(function(t){return t!==null?t:{}},"construct")}),JPe=new XPe({explicit:[KPe,QPe,ZPe]});o(eBe,"resolveYamlNull");o(tBe,"constructYamlNull");o(rBe,"isNull");nBe=new es("tag:yaml.org,2002:null",{kind:"scalar",resolve:eBe,construct:tBe,predicate:rBe,represent:{canonical:o(function(){return"~"},"canonical"),lowercase:o(function(){return"null"},"lowercase"),uppercase:o(function(){return"NULL"},"uppercase"),camelcase:o(function(){return"Null"},"camelcase"),empty:o(function(){return""},"empty")},defaultStyle:"lowercase"});o(iBe,"resolveYamlBoolean");o(aBe,"constructYamlBoolean");o(sBe,"isBoolean");oBe=new es("tag:yaml.org,2002:bool",{kind:"scalar",resolve:iBe,construct:aBe,predicate:sBe,represent:{lowercase:o(function(t){return t?"true":"false"},"lowercase"),uppercase:o(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:o(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});o(lBe,"isHexCode");o(cBe,"isOctCode");o(uBe,"isDecCode");o(hBe,"resolveYamlInteger");o(fBe,"constructYamlInteger");o(dBe,"isInteger");pBe=new es("tag:yaml.org,2002:int",{kind:"scalar",resolve:hBe,construct:fBe,predicate:dBe,represent:{binary:o(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:o(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:o(function(t){return t.toString(10)},"decimal"),hexadecimal:o(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),mBe=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");o(gBe,"resolveYamlFloat");o(yBe,"constructYamlFloat");vBe=/^[-+]?[0-9]+e/;o(xBe,"representYamlFloat");o(bBe,"isFloat");TBe=new es("tag:yaml.org,2002:float",{kind:"scalar",resolve:gBe,construct:yBe,predicate:bBe,represent:xBe,defaultStyle:"lowercase"}),vne=JPe.extend({implicit:[nBe,oBe,pBe,TBe]}),wBe=vne,xne=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),bne=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");o(kBe,"resolveYamlTimestamp");o(EBe,"constructYamlTimestamp");o(SBe,"representYamlTimestamp");CBe=new es("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:kBe,construct:EBe,instanceOf:Date,represent:SBe});o(ABe,"resolveYamlMerge");_Be=new es("tag:yaml.org,2002:merge",{kind:"scalar",resolve:ABe}),YN=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;o(DBe,"resolveYamlBinary");o(RBe,"constructYamlBinary");o(LBe,"representYamlBinary");o(NBe,"isBinary");MBe=new es("tag:yaml.org,2002:binary",{kind:"scalar",resolve:DBe,construct:RBe,predicate:NBe,represent:LBe}),IBe=Object.prototype.hasOwnProperty,OBe=Object.prototype.toString;o(PBe,"resolveYamlOmap");o(BBe,"constructYamlOmap");FBe=new es("tag:yaml.org,2002:omap",{kind:"sequence",resolve:PBe,construct:BBe}),$Be=Object.prototype.toString;o(zBe,"resolveYamlPairs");o(GBe,"constructYamlPairs");VBe=new es("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:zBe,construct:GBe}),qBe=Object.prototype.hasOwnProperty;o(UBe,"resolveYamlSet");o(WBe,"constructYamlSet");HBe=new es("tag:yaml.org,2002:set",{kind:"mapping",resolve:UBe,construct:WBe}),Tne=wBe.extend({implicit:[CBe,_Be],explicit:[MBe,FBe,VBe,HBe]}),jf=Object.prototype.hasOwnProperty,Nk=1,wne=2,kne=3,Mk=4,GN=1,YBe=2,rne=3,jBe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,XBe=/[\x85\u2028\u2029]/,KBe=/[,\[\]\{\}]/,Ene=/^(?:!|!!|![a-z\-]+!)$/i,Sne=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;o(nne,"_class");o(fu,"is_EOL");o(p0,"is_WHITE_SPACE");o(lo,"is_WS_OR_EOL");o(u1,"is_FLOW_INDICATOR");o(QBe,"fromHexCode");o(ZBe,"escapedHexLen");o(JBe,"fromDecimalCode");o(ine,"simpleEscapeSequence");o(eFe,"charFromCodepoint");o(Cne,"setProperty");Ane=new Array(256),_ne=new Array(256);for(d0=0;d0<256;d0++)Ane[d0]=ine(d0)?1:0,_ne[d0]=ine(d0);o(tFe,"State$1");o(Dne,"generateError");o(sr,"throwError");o(Ik,"throwWarning");ane={YAML:o(function(e,r,n){var i,a,s;e.version!==null&&sr(e,"duplication of %YAML directive"),n.length!==1&&sr(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&sr(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&sr(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&Ik(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:o(function(e,r,n){var i,a;n.length!==2&&sr(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],Ene.test(i)||sr(e,"ill-formed tag handle (first argument) of the TAG directive"),jf.call(e.tagMap,i)&&sr(e,'there is a previously declared suffix for "'+i+'" tag handle'),Sne.test(a)||sr(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{sr(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};o(Yf,"captureSegment");o(sne,"mergeMappings");o(h1,"storeMappingPair");o(jN,"readLineBreak");o(qi,"skipSeparationSpace");o(Bk,"testDocumentSeparator");o(XN,"writeFoldedLines");o(rFe,"readPlainScalar");o(nFe,"readSingleQuotedScalar");o(iFe,"readDoubleQuotedScalar");o(aFe,"readFlowCollection");o(sFe,"readBlockScalar");o(one,"readBlockSequence");o(oFe,"readBlockMapping");o(lFe,"readTagProperty");o(cFe,"readAnchorProperty");o(uFe,"readAlias");o(f1,"composeNode");o(hFe,"readDocument");o(Rne,"loadDocuments");o(fFe,"loadAll$1");o(dFe,"load$1");pFe=fFe,mFe=dFe,Lne={loadAll:pFe,load:mFe},Nne=Object.prototype.toString,Mne=Object.prototype.hasOwnProperty,KN=65279,gFe=9,tb=10,yFe=13,vFe=32,xFe=33,bFe=34,qN=35,TFe=37,wFe=38,kFe=39,EFe=42,Ine=44,SFe=45,Ok=58,CFe=61,AFe=62,_Fe=63,DFe=64,One=91,Pne=93,RFe=96,Bne=123,LFe=124,Fne=125,ts={};ts[0]="\\0";ts[7]="\\a";ts[8]="\\b";ts[9]="\\t";ts[10]="\\n";ts[11]="\\v";ts[12]="\\f";ts[13]="\\r";ts[27]="\\e";ts[34]='\\"';ts[92]="\\\\";ts[133]="\\N";ts[160]="\\_";ts[8232]="\\L";ts[8233]="\\P";NFe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],MFe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;o(IFe,"compileStyleMap");o(OFe,"encodeHex");PFe=1,rb=2;o(BFe,"State");o(lne,"indentString");o(UN,"generateNextLine");o(FFe,"testImplicitResolving");o(Pk,"isWhitespace");o(nb,"isPrintable");o(cne,"isNsCharOrWhitespace");o(une,"isPlainSafe");o($Fe,"isPlainSafeFirst");o(zFe,"isPlainSafeLast");o(Jx,"codePointAt");o($ne,"needIndentIndicator");zne=1,WN=2,Gne=3,Vne=4,c1=5;o(GFe,"chooseScalarStyle");o(VFe,"writeScalar");o(hne,"blockHeader");o(fne,"dropEndingNewline");o(qFe,"foldString");o(dne,"foldLine");o(UFe,"escapeString");o(WFe,"writeFlowSequence");o(pne,"writeBlockSequence");o(HFe,"writeFlowMapping");o(YFe,"writeBlockMapping");o(mne,"detectType");o(Sh,"writeNode");o(jFe,"getDuplicateReferences");o(HN,"inspectNode");o(XFe,"dump$1");KFe=XFe,QFe={dump:KFe};o(QN,"renamed");Xf=vne,Kf=Lne.load,EMt=Lne.loadAll,SMt=QFe.dump,CMt=QN("safeLoad","load"),AMt=QN("safeLoadAll","loadAll"),_Mt=QN("safeDump","dump")});function tM(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function jne(t){g0=t}function bn(t,e=""){let r=typeof t=="string"?t:t.source,n={replace:o((i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(Ds.caret,"$1"),r=r.replace(i,s),n},"replace"),getRegex:o(()=>new RegExp(r,e),"getRegex")};return n}function du(t,e){if(e){if(Ds.escapeTest.test(t))return t.replace(Ds.escapeReplace,Une)}else if(Ds.escapeTestNoEncode.test(t))return t.replace(Ds.escapeReplaceNoEncode,Une);return t}function Wne(t){try{t=encodeURI(t).replace(Ds.percentDecode,"%")}catch{return null}return t}function Hne(t,e){let r=t.replace(Ds.findPipe,(a,s,l)=>{let u=!1,h=s;for(;--h>=0&&l[h]==="\\";)u=!u;return u?"|":" |"}),n=r.split(Ds.splitPipe),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length0?-2:-1}function Yne(t,e,r,n,i){let a=e.href,s=e.title||null,l=t[1].replace(i.other.outputLinkReplace,"$1");n.state.inLink=!0;let u={type:t[0].charAt(0)==="!"?"image":"link",raw:r,href:a,title:s,text:l,tokens:n.inlineTokens(l)};return n.state.inLink=!1,u}function N$e(t,e,r){let n=t.match(r.other.indentCodeCompensation);if(n===null)return e;let i=n[1];return e.split(` -`).map(a=>{let s=a.match(r.other.beginningSpace);if(s===null)return a;let[l]=s;return l.length>=i.length?a.slice(i.length):a}).join(` -`)}function yn(t,e){return m0.parse(t,e)}var g0,lb,Ds,ZFe,JFe,e$e,cb,t$e,rM,Xne,Kne,r$e,nM,n$e,iM,i$e,a$e,qk,aM,s$e,Qne,o$e,sM,qne,l$e,c$e,u$e,h$e,Zne,f$e,Uk,oM,Jne,d$e,eie,p$e,m$e,g$e,tie,y$e,v$e,rie,x$e,b$e,T$e,w$e,k$e,E$e,S$e,zk,C$e,nie,iie,A$e,lM,_$e,ZN,D$e,$k,ab,R$e,Une,Gk,Ch,Vk,cM,Ah,ob,M$e,m0,RMt,LMt,NMt,MMt,IMt,OMt,PMt,aie=O(()=>{"use strict";o(tM,"L");g0=tM();o(jne,"G");lb={exec:o(()=>null,"exec")};o(bn,"h");Ds={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:o(t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),"listItemRegex"),nextBulletRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),"nextBulletRegex"),hrRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),"hrRegex"),fencesBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),"fencesBeginRegex"),headingBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),"headingBeginRegex"),htmlBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),"htmlBeginRegex")},ZFe=/^(?:[ \t]*(?:\n|$))+/,JFe=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,e$e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,cb=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,t$e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,rM=/(?:[*+-]|\d{1,9}[.)])/,Xne=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Kne=bn(Xne).replace(/bull/g,rM).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),r$e=bn(Xne).replace(/bull/g,rM).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),nM=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,n$e=/^[^\n]+/,iM=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,i$e=bn(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",iM).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),a$e=bn(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,rM).getRegex(),qk="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",aM=/|$))/,s$e=bn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",aM).replace("tag",qk).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Qne=bn(nM).replace("hr",cb).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qk).getRegex(),o$e=bn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Qne).getRegex(),sM={blockquote:o$e,code:JFe,def:i$e,fences:e$e,heading:t$e,hr:cb,html:s$e,lheading:Kne,list:a$e,newline:ZFe,paragraph:Qne,table:lb,text:n$e},qne=bn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",cb).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qk).getRegex(),l$e={...sM,lheading:r$e,table:qne,paragraph:bn(nM).replace("hr",cb).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",qne).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qk).getRegex()},c$e={...sM,html:bn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",aM).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:lb,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:bn(nM).replace("hr",cb).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",Kne).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},u$e=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,h$e=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Zne=/^( {2,}|\\)\n(?!\s*$)/,f$e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,tie=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,y$e=bn(tie,"u").replace(/punct/g,Uk).getRegex(),v$e=bn(tie,"u").replace(/punct/g,eie).getRegex(),rie="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",x$e=bn(rie,"gu").replace(/notPunctSpace/g,Jne).replace(/punctSpace/g,oM).replace(/punct/g,Uk).getRegex(),b$e=bn(rie,"gu").replace(/notPunctSpace/g,m$e).replace(/punctSpace/g,p$e).replace(/punct/g,eie).getRegex(),T$e=bn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Jne).replace(/punctSpace/g,oM).replace(/punct/g,Uk).getRegex(),w$e=bn(/\\(punct)/,"gu").replace(/punct/g,Uk).getRegex(),k$e=bn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),E$e=bn(aM).replace("(?:-->|$)","-->").getRegex(),S$e=bn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",E$e).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),zk=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`[^`]*`|[^\[\]\\`])*?/,C$e=bn(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",zk).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),nie=bn(/^!?\[(label)\]\[(ref)\]/).replace("label",zk).replace("ref",iM).getRegex(),iie=bn(/^!?\[(ref)\](?:\[\])?/).replace("ref",iM).getRegex(),A$e=bn("reflink|nolink(?!\\()","g").replace("reflink",nie).replace("nolink",iie).getRegex(),lM={_backpedal:lb,anyPunctuation:w$e,autolink:k$e,blockSkip:g$e,br:Zne,code:h$e,del:lb,emStrongLDelim:y$e,emStrongRDelimAst:x$e,emStrongRDelimUnd:T$e,escape:u$e,link:C$e,nolink:iie,punctuation:d$e,reflink:nie,reflinkSearch:A$e,tag:S$e,text:f$e,url:lb},_$e={...lM,link:bn(/^!?\[(label)\]\((.*?)\)/).replace("label",zk).getRegex(),reflink:bn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",zk).getRegex()},ZN={...lM,emStrongRDelimAst:b$e,emStrongLDelim:v$e,url:bn(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},Une=o(t=>R$e[t],"ke");o(du,"w");o(Wne,"J");o(Hne,"V");o(sb,"z");o(L$e,"ge");o(Yne,"fe");o(N$e,"Je");Gk=class{static{o(this,"y")}options;rules;lexer;constructor(t){this.options=t||g0}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let r=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?r:sb(r,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let r=e[0],n=N$e(r,e[3]||"",this.rules);return{type:"code",raw:r,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:n}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let r=e[2].trim();if(this.rules.other.endingHash.test(r)){let n=sb(r,"#");(this.options.pedantic||!n||this.rules.other.endingSpaceChar.test(n))&&(r=n.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:sb(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let r=sb(e[0],` -`).split(` -`),n="",i="",a=[];for(;r.length>0;){let s=!1,l=[],u;for(u=0;u1,i={type:"list",raw:"",ordered:n,start:n?+r.slice(0,-1):"",loose:!1,items:[]};r=n?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=n?r:"[*+-]");let a=this.rules.other.listItemRegex(r),s=!1;for(;t;){let u=!1,h="",f="";if(!(e=a.exec(t))||this.rules.block.hr.test(t))break;h=e[0],t=t.substring(h.length);let d=e[2].split(` -`,1)[0].replace(this.rules.other.listReplaceTabs,x=>" ".repeat(3*x.length)),p=t.split(` -`,1)[0],m=!d.trim(),g=0;if(this.options.pedantic?(g=2,f=d.trimStart()):m?g=e[1].length+1:(g=e[2].search(this.rules.other.nonSpaceChar),g=g>4?1:g,f=d.slice(g),g+=e[1].length),m&&this.rules.other.blankLine.test(p)&&(h+=p+` -`,t=t.substring(p.length+1),u=!0),!u){let x=this.rules.other.nextBulletRegex(g),b=this.rules.other.hrRegex(g),T=this.rules.other.fencesBeginRegex(g),E=this.rules.other.headingBeginRegex(g),w=this.rules.other.htmlBeginRegex(g);for(;t;){let k=t.split(` -`,1)[0],S;if(p=k,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),S=p):S=p.replace(this.rules.other.tabCharGlobal," "),T.test(p)||E.test(p)||w.test(p)||x.test(p)||b.test(p))break;if(S.search(this.rules.other.nonSpaceChar)>=g||!p.trim())f+=` -`+S.slice(g);else{if(m||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||T.test(d)||E.test(d)||b.test(d))break;f+=` -`+p}!m&&!p.trim()&&(m=!0),h+=k+` -`,t=t.substring(k.length+1),d=S.slice(g)}}i.loose||(s?i.loose=!0:this.rules.other.doubleBlankLine.test(h)&&(s=!0));let y=null,v;this.options.gfm&&(y=this.rules.other.listIsTask.exec(f),y&&(v=y[0]!=="[ ] ",f=f.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:h,task:!!y,checked:v,loose:!1,text:f,tokens:[]}),i.raw+=h}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u=0;ud.type==="space"),f=h.length>0&&h.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=f}if(i.loose)for(let u=0;u({text:l,tokens:this.lexer.inline(l),header:!1,align:a.align[u]})));return a}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let r=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:r,tokens:this.lexer.inline(r)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let r=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let a=sb(r.slice(0,-1),"\\");if((r.length-a.length)%2===0)return}else{let a=L$e(e[2],"()");if(a===-2)return;if(a>-1){let s=(e[0].indexOf("!")===0?5:4)+e[1].length+a;e[2]=e[2].substring(0,a),e[0]=e[0].substring(0,s).trim(),e[3]=""}}let n=e[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(n);a&&(n=a[1],i=a[3])}else i=e[3]?e[3].slice(1,-1):"";return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?n=n.slice(1):n=n.slice(1,-1)),Yne(e,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let r;if((r=this.rules.inline.reflink.exec(t))||(r=this.rules.inline.nolink.exec(t))){let n=(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=e[n.toLowerCase()];if(!i){let a=r[0].charAt(0);return{type:"text",raw:a,text:a}}return Yne(r,i,r[0],this.lexer,this.rules)}}emStrong(t,e,r=""){let n=this.rules.inline.emStrongLDelim.exec(t);if(!(!n||n[3]&&r.match(this.rules.other.unicodeAlphaNumeric))&&(!(n[1]||n[2])||!r||this.rules.inline.punctuation.exec(r))){let i=[...n[0]].length-1,a,s,l=i,u=0,h=n[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(h.lastIndex=0,e=e.slice(-1*t.length+i);(n=h.exec(e))!=null;){if(a=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!a)continue;if(s=[...a].length,n[3]||n[4]){l+=s;continue}else if((n[5]||n[6])&&i%3&&!((i+s)%3)){u+=s;continue}if(l-=s,l>0)continue;s=Math.min(s,s+l+u);let f=[...n[0]][0].length,d=t.slice(0,i+n.index+f+s);if(Math.min(i,s)%2){let m=d.slice(1,-1);return{type:"em",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}let p=d.slice(2,-2);return{type:"strong",raw:d,text:p,tokens:this.lexer.inlineTokens(p)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let r=e[2].replace(this.rules.other.newLineCharGlobal," "),n=this.rules.other.nonSpaceChar.test(r),i=this.rules.other.startingSpaceChar.test(r)&&this.rules.other.endingSpaceChar.test(r);return n&&i&&(r=r.substring(1,r.length-1)),{type:"codespan",raw:e[0],text:r}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t){let e=this.rules.inline.del.exec(t);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let r,n;return e[2]==="@"?(r=e[1],n="mailto:"+r):(r=e[1],n=r),{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let r,n;if(e[2]==="@")r=e[0],n="mailto:"+r;else{let i;do i=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(i!==e[0]);r=e[0],e[1]==="www."?n="http://"+e[0]:n=e[0]}return{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let r=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:r}}}},Ch=class JN{static{o(this,"l")}tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||g0,this.options.tokenizer=this.options.tokenizer||new Gk,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:Ds,block:$k.normal,inline:ab.normal};this.options.pedantic?(r.block=$k.pedantic,r.inline=ab.pedantic):this.options.gfm&&(r.block=$k.gfm,this.options.breaks?r.inline=ab.breaks:r.inline=ab.gfm),this.tokenizer.rules=r}static get rules(){return{block:$k,inline:ab}}static lex(e,r){return new JN(r).lex(e)}static lexInline(e,r){return new JN(r).inlineTokens(e)}lex(e){e=e.replace(Ds.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let r=0;r(i=s.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let s=r.at(-1);i.raw.length===1&&s!==void 0?s.raw+=` -`:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` -`)?"":` -`)+i.raw,s.text+=` -`+i.text,this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` -`)?"":` -`)+i.raw,s.text+=` -`+i.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},r.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let s=1/0,l=e.slice(1),u;this.options.extensions.startBlock.forEach(h=>{u=h.call({lexer:this},l),typeof u=="number"&&u>=0&&(s=Math.min(s,u))}),s<1/0&&s>=0&&(a=e.substring(0,s+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let s=r.at(-1);n&&s?.type==="paragraph"?(s.raw+=(s.raw.endsWith(` -`)?"":` -`)+i.raw,s.text+=` -`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="text"?(s.raw+=(s.raw.endsWith(` -`)?"":` -`)+i.raw,s.text+=` -`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n=e,i=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)l.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,i.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(i=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let a=!1,s="";for(;e;){a||(s=""),a=!1;let l;if(this.options.extensions?.inline?.some(h=>(l=h.call({lexer:this},e,r))?(e=e.substring(l.raw.length),r.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let h=r.at(-1);l.type==="text"&&h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(l=this.tokenizer.emStrong(e,n,s)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.del(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),r.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),r.push(l);continue}let u=e;if(this.options.extensions?.startInline){let h=1/0,f=e.slice(1),d;this.options.extensions.startInline.forEach(p=>{d=p.call({lexer:this},f),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(u=e.substring(0,h+1))}if(l=this.tokenizer.inlineText(u)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(s=l.raw.slice(-1)),a=!0;let h=r.at(-1);h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return r}},Vk=class{static{o(this,"P")}options;parser;constructor(t){this.options=t||g0}space(t){return""}code({text:t,lang:e,escaped:r}){let n=(e||"").match(Ds.notSpaceStart)?.[0],i=t.replace(Ds.endingNewline,"")+` -`;return n?'
    '+(r?i:du(i,!0))+`
    -`:"
    "+(r?i:du(i,!0))+`
    -`}blockquote({tokens:t}){return`
    -${this.parser.parse(t)}
    -`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
    -`}list(t){let e=t.ordered,r=t.start,n="";for(let s=0;s -`+n+" -`}listitem(t){let e="";if(t.task){let r=this.checkbox({checked:!!t.checked});t.loose?t.tokens[0]?.type==="paragraph"?(t.tokens[0].text=r+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&t.tokens[0].tokens[0].type==="text"&&(t.tokens[0].tokens[0].text=r+" "+du(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(t.tokens,!!t.loose),`
  1. ${e}
  2. -`}checkbox({checked:t}){return"'}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    -`}table(t){let e="",r="";for(let i=0;i${n}`),` - -`+e+` -`+n+`
    -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),r=t.header?"th":"td";return(t.align?`<${r} align="${t.align}">`:`<${r}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${du(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:r}){let n=this.parser.parseInline(r),i=Wne(t);if(i===null)return n;t=i;let a='
    ",a}image({href:t,title:e,text:r,tokens:n}){n&&(r=this.parser.parseInline(n,this.parser.textRenderer));let i=Wne(t);if(i===null)return du(r);t=i;let a=`${r}{let s=i[a].flat(1/0);r=r.concat(this.walkTokens(s,e))}):i.tokens&&(r=r.concat(this.walkTokens(i.tokens,e)))}}return r}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(r=>{let n={...r};if(n.async=this.defaults.async||n.async||!1,r.extensions&&(r.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=e.renderers[i.name];a?e.renderers[i.name]=function(...s){let l=i.renderer.apply(this,s);return l===!1&&(l=a.apply(this,s)),l}:e.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[i.level];a?a.unshift(i.tokenizer):e[i.level]=[i.tokenizer],i.start&&(i.level==="block"?e.startBlock?e.startBlock.push(i.start):e.startBlock=[i.start]:i.level==="inline"&&(e.startInline?e.startInline.push(i.start):e.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(e.childTokens[i.name]=i.childTokens)}),n.extensions=e),r.renderer){let i=this.defaults.renderer||new Vk(this.defaults);for(let a in r.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,l=r.renderer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f||""}}n.renderer=i}if(r.tokenizer){let i=this.defaults.tokenizer||new Gk(this.defaults);for(let a in r.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,l=r.tokenizer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.tokenizer=i}if(r.hooks){let i=this.defaults.hooks||new ob;for(let a in r.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,l=r.hooks[s],u=i[s];ob.passThroughHooks.has(a)?i[s]=h=>{if(this.defaults.async&&ob.passThroughHooksRespectAsync.has(a))return Promise.resolve(l.call(i,h)).then(d=>u.call(i,d));let f=l.call(i,h);return u.call(i,f)}:i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.hooks=i}if(r.walkTokens){let i=this.defaults.walkTokens,a=r.walkTokens;n.walkTokens=function(s){let l=[];return l.push(a.call(this,s)),i&&(l=l.concat(i.call(this,s))),l}}this.defaults={...this.defaults,...n}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Ch.lex(t,e??this.defaults)}parser(t,e){return Ah.parse(t,e??this.defaults)}parseMarkdown(t){return(e,r)=>{let n={...r},i={...this.defaults,...n},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&n.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));i.hooks&&(i.hooks.options=i,i.hooks.block=t);let s=i.hooks?i.hooks.provideLexer():t?Ch.lex:Ch.lexInline,l=i.hooks?i.hooks.provideParser():t?Ah.parse:Ah.parseInline;if(i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(e):e).then(u=>s(u,i)).then(u=>i.hooks?i.hooks.processAllTokens(u):u).then(u=>i.walkTokens?Promise.all(this.walkTokens(u,i.walkTokens)).then(()=>u):u).then(u=>l(u,i)).then(u=>i.hooks?i.hooks.postprocess(u):u).catch(a);try{i.hooks&&(e=i.hooks.preprocess(e));let u=s(e,i);i.hooks&&(u=i.hooks.processAllTokens(u)),i.walkTokens&&this.walkTokens(u,i.walkTokens);let h=l(u,i);return i.hooks&&(h=i.hooks.postprocess(h)),h}catch(u){return a(u)}}}onError(t,e){return r=>{if(r.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let n="

    An error occurred:

    "+du(r.message+"",!0)+"
    ";return e?Promise.resolve(n):n}if(e)return Promise.reject(r);throw r}}},m0=new M$e;o(yn,"d");yn.options=yn.setOptions=function(t){return m0.setOptions(t),yn.defaults=m0.defaults,jne(yn.defaults),yn};yn.getDefaults=tM;yn.defaults=g0;yn.use=function(...t){return m0.use(...t),yn.defaults=m0.defaults,jne(yn.defaults),yn};yn.walkTokens=function(t,e){return m0.walkTokens(t,e)};yn.parseInline=m0.parseInline;yn.Parser=Ah;yn.parser=Ah.parse;yn.Renderer=Vk;yn.TextRenderer=cM;yn.Lexer=Ch;yn.lexer=Ch.lex;yn.Tokenizer=Gk;yn.Hooks=ob;yn.parse=yn;RMt=yn.options,LMt=yn.setOptions,NMt=yn.use,MMt=yn.walkTokens,IMt=yn.parseInline,OMt=Ah.parse,PMt=Ch.lex});function I$e(t,{markdownAutoWrap:e}){let n=t.replace(//g,` -`).replace(/\n{2,}/g,` -`);return Mw(n)}function sie(t){return t.split(/\\n|\n|/gi).map(e=>e.trim().match(/<[^>]+>|[^\s<>]+/g)?.map(r=>({content:r,type:"normal"}))??[])}function oie(t,e={}){let r=I$e(t,e),n=yn.lexer(r),i=[[]],a=0;function s(l,u="normal"){l.type==="text"?l.text.split(` -`).forEach((f,d)=>{d!==0&&(a++,i.push([])),f.split(" ").forEach(p=>{p=p.replace(/'/g,"'"),p&&i[a].push({content:p,type:u})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(h=>{s(h,l.type)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}return o(s,"processNode"),n.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(u=>{s(u)}):l.type==="html"?i[a].push({content:l.text,type:"normal"}):i[a].push({content:l.raw,type:"normal"})}),i}function lie(t){return t?`

    ${t.replace(/\\n|\n/g,"
    ")}

    `:""}function cie(t,{markdownAutoWrap:e}={}){let r=yn.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
    ").replace(/ /g," "):i.text.replace(/\n */g,"
    "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

    ${i.tokens?.map(n).join("")}

    `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:(K.warn(`Unsupported markdown: ${i.type}`),i.raw)}return o(n,"output"),r.map(n).join("")}var uie=O(()=>{"use strict";aie();vD();xt();o(I$e,"preprocessMarkdown");o(sie,"nonMarkdownToLines");o(oie,"markdownToLines");o(lie,"nonMarkdownToHTML");o(cie,"markdownToHTML")});function O$e(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function P$e(t,e){let r=O$e(e.content);return hie(t,[],r,e.type)}function hie(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?hie(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function fie(t,e){if(t.some(({content:r})=>r.includes(` -`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return uM(t,e)}function uM(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return uM(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[l,u]=P$e(e,a);r.push([l]),u.content&&t.unshift(u)}return uM(t,e,r)}var die=O(()=>{"use strict";o(O$e,"splitTextToChars");o(P$e,"splitWordToFitWidth");o(hie,"splitWordToFitWidthRecursion");o(fie,"splitLineToFitWidth");o(uM,"splitLineToFitWidthRecursion")});function pie(t,e){e&&t.attr("style",e)}async function B$e(t,e,r,n,i=!1,a=Zt()){let s=t.append("foreignObject");s.attr("width",`${Math.min(10*r,mie)}px`),s.attr("height",`${Math.min(10*r,mie)}px`);let l=s.append("xhtml:div"),u=Jn(e.label)?await gg(e.label.replace(st.lineBreakRegex,` -`),a):wr(e.label,a),h=e.isNode?"nodeLabel":"edgeLabel",f=l.append("span");f.html(u),pie(f,e.labelStyle),f.attr("class",`${h} ${n}`),pie(l,e.labelStyle),l.style("display","table-cell"),l.style("white-space","nowrap"),l.style("line-height","1.5"),r!==Number.POSITIVE_INFINITY&&(l.style("max-width",r+"px"),l.style("text-align","center")),l.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&l.attr("class","labelBkg");let d=l.node().getBoundingClientRect();return d.width===r&&(l.style("display","table"),l.style("white-space","break-spaces"),l.style("width",r+"px"),d=l.node().getBoundingClientRect()),s.node()}function hM(t,e,r,n=!1){let i=t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em");return n&&i.attr("text-anchor","middle"),i}function F$e(t,e,r){let n=t.append("text"),i=hM(n,1,e);fM(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function gie(t,e,r){let n=t.append("text"),i=hM(n,1,e);fM(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function $$e(t,e,r,n=!1,i=!1){let s=e.append("g"),l=s.insert("rect").attr("class","background").attr("style","stroke: none"),u=s.append("text").attr("y","-10.1");i&&u.attr("text-anchor","middle");let h=0;for(let f of r){let d=o(m=>F$e(s,1.1,m)<=t,"checkWidth"),p=d(f)?[f]:fie(f,d);for(let m of p){let g=hM(u,h,1.1,i);fM(g,m),h++}}if(n){let f=u.node().getBBox(),d=2;return l.attr("x",f.x-d).attr("y",f.y-d).attr("width",f.width+2*d).attr("height",f.height+2*d),s.node()}else return u.node()}function fM(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}async function z$e(t,e={}){let r=[];t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(i,a,s)=>(r.push((async()=>{let l=`${a}:${s}`;return await TX(l)?await eo(l,void 0,{class:"label-icon"}):``})()),i));let n=await Promise.all(r);return t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>n.shift()??"")}var mie,Fn,co=O(()=>{"use strict";Ar();Ur();xt();uie();ar();Xc();die();$r();o(pie,"applyStyle");mie=16384;o(B$e,"addHtmlSpan");o(hM,"createTspan");o(F$e,"computeWidthOfText");o(gie,"computeDimensionOfText");o($$e,"createFormattedText");o(fM,"updateTextContentAndStyles");o(z$e,"replaceIconSubstring");Fn=o(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,markdown:s=!0,isNode:l=!0,width:u=200,addSvgBackground:h=!1}={},f)=>{if(K.debug("XYZ createText",e,r,n,i,a,l,"addSvgBackground: ",h),a){let d=s?cie(e,f):lie(e),p=await z$e(ao(d),f),m=e.replace(/\\\\/g,"\\"),g={isNode:l,label:Jn(e)?m:p,labelStyle:r.replace("fill:","color:")};return await B$e(t,g,u,i,h,f)}else{let d=e.replace(//g,"
    "),p=s?oie(d.replace("
    ","
    "),f):sie(d),m=$$e(u,t,p,e?h:!1,!l);if(l){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");je(m).attr("style",g)}else{let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");je(m).select("rect").attr("style",g.replace(/background:/g,"fill:"));let y=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");je(m).select("text").attr("style",y)}return n?je(m).selectAll("tspan.text-outer-tspan").classed("title-row",!0):je(m).selectAll("tspan.text-outer-tspan").classed("row",!0),m}},"createText")});async function Wk(t,e){let r=t.getElementsByTagName("img");if(!r||r.length===0)return;let n=e.replace(/]*>/g,"").trim()==="";await Promise.all([...r].map(i=>new Promise(a=>{function s(){if(i.style.display="flex",i.style.flexDirection="column",n){let l=ve().fontSize?ve().fontSize:window.getComputedStyle(document.body).fontSize,u=5,[h=gr.fontSize]=Uo(l),f=h*u+"px";i.style.minWidth=f,i.style.maxWidth=f}else i.style.width="100%";a(i)}o(s,"setupImage"),setTimeout(()=>{i.complete&&s()}),i.addEventListener("error",s),i.addEventListener("load",s)})))}var dM=O(()=>{"use strict";jt();La();ar();o(Wk,"configureLabelImages")});function er(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function El(t,e,r,n,i,a){let s=[],u=r-t,h=n-e,f=u/a,d=2*Math.PI/f,p=e+h/2;for(let m=0;m<=50;m++){let g=m/50,y=t+g*u,v=p+i*Math.sin(d*(y-t));s.push({x:y,y:v})}return s}function y0(t,e,r,n,i,a){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d{"use strict";co();jt();$r();Ar();Ur();ar();dM();pt=o(async(t,e,r)=>{let n,i=e.useHtmlLabels||Xs(ve()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",Bn(e.labelStyle)),l;e.label===void 0?l="":l=typeof e.label=="string"?e.label:e.label[0];let u=!!e.icon||!!e.img,h=e.labelType==="markdown",f=await Fn(s,wr(ao(l),ve()),{useHtmlLabels:i,width:e.width||ve().flowchart?.wrappingWidth,cssClasses:h?"markdown-node-label":void 0,style:e.labelStyle,addSvgBackground:u,markdown:h},ve()),d=f.getBBox(),p=(e?.padding??0)/2;if(i){let m=f.children[0],g=je(f);await Wk(m,l),d=m.getBoundingClientRect(),g.attr("width",d.width),g.attr("height",d.height)}return i?s.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"):s.attr("transform","translate(0, "+-d.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:d,halfPadding:p,label:s}},"labelHelper"),Hk=o(async(t,e,r)=>{let n=r.useHtmlLabels??Sr(ve()),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await Fn(i,wr(ao(e),ve()),{useHtmlLabels:n,width:r.width||ve()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),l=r.padding/2;if(Sr(ve())){let u=a.children[0],h=je(a);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:l,label:i}},"insertLabel"),rt=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),ht=o((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");o(er,"createPathFromPoints");o(El,"generateFullSineWavePoints");o(y0,"generateCirclePoints")});function G$e(t,e){return t.intersect(e)}var yie,vie=O(()=>{"use strict";o(G$e,"intersectNode");yie=G$e});function V$e(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(V$e,"intersectEllipse");Yk=V$e});function q$e(t,e,r){return Yk(t,e,e,r)}var xie,bie=O(()=>{"use strict";pM();o(q$e,"intersectCircle");xie=q$e});function U$e(t,e,r,n){{let i=e.y-t.y,a=t.x-e.x,s=e.x*t.y-t.x*e.y,l=i*r.x+a*r.y+s,u=i*n.x+a*n.y+s,h=1e-6;if(l!==0&&u!==0&&Tie(l,u))return;let f=n.y-r.y,d=r.x-n.x,p=n.x*r.y-r.x*n.y,m=f*t.x+d*t.y+p,g=f*e.x+d*e.y+p;if(Math.abs(m)0}var wie,kie=O(()=>{"use strict";o(U$e,"intersectLine");o(Tie,"sameSign");wie=U$e});function W$e(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(f){s=Math.min(s,f.x),l=Math.min(l,f.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));let u=n-t.width/2-s,h=i-t.height/2-l;for(let f=0;f1&&a.sort(function(f,d){let p=f.x-r.x,m=f.y-r.y,g=Math.sqrt(p*p+m*m),y=d.x-r.x,v=d.y-r.y,x=Math.sqrt(y*y+v*v);return g{"use strict";kie();o(W$e,"intersectPolygon");Eie=W$e});var H$e,Qf,mM=O(()=>{"use strict";H$e=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),Qf=H$e});var Qe,Yt=O(()=>{"use strict";vie();bie();pM();Sie();mM();Qe={node:yie,circle:xie,ellipse:Yk,polygon:Eie,rect:Qf}});var Cie,pu,Y$e,ub,Ze,nt,j$e,Ut=O(()=>{"use strict";jt();Cie=o(t=>{let{handDrawnSeed:e}=ve();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),pu=o(t=>{let e=Y$e([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),Y$e=o(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),ub=o(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),Ze=o(t=>{let{stylesArray:e}=pu(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let l=s[0];ub(l)?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),l.includes("stroke")&&i.push(s.join(":")+" !important"),l==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),nt=o((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=ve(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=pu(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:j$e(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),j$e=o(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let i=isNaN(e[0])?0:e[0];return[i,i]}let r=isNaN(e[0])?0:e[0],n=isNaN(e[1])?0:e[1];return[r,n]},"getStrokeDashArray")});function gM(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),l=Math.sin(a);for(let u of t){let[h,f]=u;u[0]=(h-n)*s-(f-i)*l+n,u[1]=(h-n)*l+(f-i)*s+i}}}function X$e(t,e){return t[0]===e[0]&&t[1]===e[1]}function K$e(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,l=[0,0];if(i)for(let h of s)gM(h,l,i);let u=(function(h,f,d){let p=[];for(let b of h){let T=[...b];X$e(T[0],T[T.length-1])||T.push([T[0][0],T[0][1]]),T.length>2&&p.push(T)}let m=[];f=Math.max(f,.1);let g=[];for(let b of p)for(let T=0;Tb.yminT.ymin?1:b.xT.x?1:b.ymax===T.ymax?0:(b.ymax-T.ymax)/Math.abs(b.ymax-T.ymax))),!g.length)return m;let y=[],v=g[0].ymin,x=0;for(;y.length||g.length;){if(g.length){let b=-1;for(let T=0;Tv);T++)b=T;g.splice(0,b+1).forEach((T=>{y.push({s:v,edge:T})}))}if(y=y.filter((b=>!(b.edge.ymax<=v))),y.sort(((b,T)=>b.edge.x===T.edge.x?0:(b.edge.x-T.edge.x)/Math.abs(b.edge.x-T.edge.x))),(d!==1||x%f==0)&&y.length>1)for(let b=0;b=y.length)break;let E=y[b].edge,w=y[T].edge;m.push([[Math.round(E.x),v],[Math.round(w.x),v]])}v+=d,y.forEach((b=>{b.edge.x=b.edge.x+d*b.edge.islope})),x++}return m})(s,a,n);if(i){for(let h of s)gM(h,l,-i);(function(h,f,d){let p=[];h.forEach((m=>p.push(...m))),gM(p,f,d)})(u,l,-i)}return u}function pb(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),K$e(t,i,n,a||1)}function rE(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function vM(t,e){return t.type===e}function NM(t){let e=[],r=(function(s){let l=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))l[l.length]={type:Q$e,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];l[l.length]={type:yM,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return l[l.length]={type:Aie,text:""},l})(t),n="BOD",i=0,a=r[i];for(;!vM(a,Aie);){let s=0,l=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return NM("M0,0"+t);i++,s=jk[a.text],n=a.text}else vM(a,yM)?s=jk[n]:(i++,s=jk[a.text],n=a.text);if(!(i+sf%2?h+r:h+e));a.push({key:"C",data:u}),e=u[4],r=u[5];break}case"Q":a.push({key:"Q",data:[...l]}),e=l[2],r=l[3];break;case"q":{let u=l.map(((h,f)=>f%2?h+r:h+e));a.push({key:"Q",data:u}),e=u[2],r=u[3];break}case"A":a.push({key:"A",data:[...l]}),e=l[5],r=l[6];break;case"a":e+=l[5],r+=l[6],a.push({key:"A",data:[l[0],l[1],l[2],l[3],l[4],e,r]});break;case"H":a.push({key:"H",data:[...l]}),e=l[0];break;case"h":e+=l[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...l]}),r=l[0];break;case"v":r+=l[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...l]}),e=l[2],r=l[3];break;case"s":{let u=l.map(((h,f)=>f%2?h+r:h+e));a.push({key:"S",data:u}),e=u[2],r=u[3];break}case"T":a.push({key:"T",data:[...l]}),e=l[0],r=l[1];break;case"t":e+=l[0],r+=l[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function Pie(t){let e=[],r="",n=0,i=0,a=0,s=0,l=0,u=0;for(let{key:h,data:f}of t){switch(h){case"M":e.push({key:"M",data:[...f]}),[n,i]=f,[a,s]=f;break;case"C":e.push({key:"C",data:[...f]}),n=f[4],i=f[5],l=f[2],u=f[3];break;case"L":e.push({key:"L",data:[...f]}),[n,i]=f;break;case"H":n=f[0],e.push({key:"L",data:[n,i]});break;case"V":i=f[0],e.push({key:"L",data:[n,i]});break;case"S":{let d=0,p=0;r==="C"||r==="S"?(d=n+(n-l),p=i+(i-u)):(d=n,p=i),e.push({key:"C",data:[d,p,...f]}),l=f[0],u=f[1],n=f[2],i=f[3];break}case"T":{let[d,p]=f,m=0,g=0;r==="Q"||r==="T"?(m=n+(n-l),g=i+(i-u)):(m=n,g=i);let y=n+2*(m-n)/3,v=i+2*(g-i)/3,x=d+2*(m-d)/3,b=p+2*(g-p)/3;e.push({key:"C",data:[y,v,x,b,d,p]}),l=m,u=g,n=d,i=p;break}case"Q":{let[d,p,m,g]=f,y=n+2*(d-n)/3,v=i+2*(p-i)/3,x=m+2*(d-m)/3,b=g+2*(p-g)/3;e.push({key:"C",data:[y,v,x,b,m,g]}),l=d,u=p,n=m,i=g;break}case"A":{let d=Math.abs(f[0]),p=Math.abs(f[1]),m=f[2],g=f[3],y=f[4],v=f[5],x=f[6];d===0||p===0?(e.push({key:"C",data:[n,i,v,x,v,x]}),n=v,i=x):(n!==v||i!==x)&&(Bie(n,i,v,x,d,p,m,g,y).forEach((function(b){e.push({key:"C",data:b})})),n=v,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=h}return e}function hb(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function Bie(t,e,r,n,i,a,s,l,u,h){let f=(d=s,Math.PI*d/180);var d;let p=[],m=0,g=0,y=0,v=0;if(h)[m,g,y,v]=h;else{[t,e]=hb(t,e,-f),[r,n]=hb(r,n,-f);let _=(t-r)/2,D=(e-n)/2,M=_*_/(i*i)+D*D/(a*a);M>1&&(M=Math.sqrt(M),i*=M,a*=M);let R=i*i,P=a*a,B=R*P-R*D*D-P*_*_,F=R*D*D+P*_*_,G=(l===u?-1:1)*Math.sqrt(Math.abs(B/F));y=G*i*D/a+(t+r)/2,v=G*-a*_/i+(e+n)/2,m=Math.asin(parseFloat(((e-v)/a).toFixed(9))),g=Math.asin(parseFloat(((n-v)/a).toFixed(9))),tg&&(m-=2*Math.PI),!u&&g>m&&(g-=2*Math.PI)}let x=g-m;if(Math.abs(x)>120*Math.PI/180){let _=g,D=r,M=n;g=u&&g>m?m+120*Math.PI/180*1:m+120*Math.PI/180*-1,p=Bie(r=y+i*Math.cos(g),n=v+a*Math.sin(g),D,M,i,a,s,0,u,[g,_,y,v])}x=g-m;let b=Math.cos(m),T=Math.sin(m),E=Math.cos(g),w=Math.sin(g),k=Math.tan(x/4),S=4/3*i*k,A=4/3*a*k,L=[t,e],I=[t+S*T,e-A*b],N=[r+S*w,n-A*E],C=[r,n];if(I[0]=2*L[0]-I[0],I[1]=2*L[1]-I[1],h)return[I,N,C].concat(p);{p=[I,N,C].concat(p);let _=[];for(let D=0;D2){let i=[];for(let a=0;a2*Math.PI&&(m=0,g=2*Math.PI);let y=2*Math.PI/u.curveStepCount,v=Math.min(y/2,(g-m)/2),x=Mie(v,h,f,d,p,m,g,1,u);if(!u.disableMultiStroke){let b=Mie(v,h,f,d,p,m,g,1.5,u);x.push(...b)}return s&&(l?x.push(...Zf(h,f,h+d*Math.cos(m),f+p*Math.sin(m),u),...Zf(h,f,h+d*Math.cos(g),f+p*Math.sin(g),u)):x.push({op:"lineTo",data:[h,f]},{op:"lineTo",data:[h+d*Math.cos(m),f+p*Math.sin(m)]})),{type:"path",ops:x}}function Rie(t,e){let r=Pie(Oie(NM(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:l}of r)switch(s){case"M":a=[l[0],l[1]],i=[l[0],l[1]];break;case"L":n.push(...Zf(a[0],a[1],l[0],l[1],e)),a=[l[0],l[1]];break;case"C":{let[u,h,f,d,p,m]=l;n.push(...eze(u,h,f,d,p,m,a,e)),a=[p,m];break}case"Z":n.push(...Zf(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function xM(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+yr(i,e),n[0][1]+yr(i,e)]});for(let s=1;s500?.4:-.0016668*u+1.233334;let f=i.maxRandomnessOffset||0;f*f*100>l&&(f=u/10);let d=f/2,p=.2+.2*zie(i),m=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;m=yr(m,i,h),g=yr(g,i,h);let y=[],v=o(()=>yr(d,i,h),"M"),x=o(()=>yr(f,i,h),"k"),b=i.preserveVertices;return a&&(s?y.push({op:"move",data:[t+(b?0:v()),e+(b?0:v())]}):y.push({op:"move",data:[t+(b?0:yr(f,i,h)),e+(b?0:yr(f,i,h))]})),s?y.push({op:"bcurveTo",data:[m+t+(r-t)*p+v(),g+e+(n-e)*p+v(),m+t+2*(r-t)*p+v(),g+e+2*(n-e)*p+v(),r+(b?0:v()),n+(b?0:v())]}):y.push({op:"bcurveTo",data:[m+t+(r-t)*p+x(),g+e+(n-e)*p+x(),m+t+2*(r-t)*p+x(),g+e+2*(n-e)*p+x(),r+(b?0:x()),n+(b?0:x())]}),y}function Xk(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+yr(e,r),t[0][1]+yr(e,r)]),n.push([t[0][0]+yr(e,r),t[0][1]+yr(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let l=1;l+21&&i.push(l)):i.push(l),i.push(t[e+3])}else{let u=t[e+0],h=t[e+1],f=t[e+2],d=t[e+3],p=v0(u,h,.5),m=v0(h,f,.5),g=v0(f,d,.5),y=v0(p,m,.5),v=v0(m,g,.5),x=v0(y,v,.5);DM([u,p,y,x],0,r,i),DM([x,v,g,d],0,r,i)}var a,s;return i}function rze(t,e){return tE(t,0,t.length,e)}function tE(t,e,r,n,i){let a=i||[],s=t[e],l=t[r-1],u=0,h=1;for(let f=e+1;fu&&(u=d,h=f)}return Math.sqrt(u)>n?(tE(t,e,h+1,n,a),tE(t,h,r,n,a)):(a.length||a.push(s),a.push(l)),a}function bM(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?tE(n,0,n.length,r):n}var db,TM,wM,kM,EM,SM,uo,CM,Q$e,yM,Aie,jk,Z$e,Wo,p1,RM,Kk,LM,Je,Wt=O(()=>{"use strict";o(gM,"t");o(X$e,"e");o(K$e,"s");o(pb,"n");db=class{static{o(this,"o")}constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=pb(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};o(rE,"a");TM=class extends db{static{o(this,"h")}fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=pb(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],l=.5*n*Math.cos(a),u=.5*n*Math.sin(a);for(let[h,f]of i)rE([h,f])&&s.push([[h[0]-l,h[1]+u],[...f]],[[h[0]+l,h[1]-u],[...f]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},wM=class extends db{static{o(this,"r")}fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},kM=class{static{o(this,"i")}constructor(e){this.helper=e}fillPolygons(e,r){let n=pb(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let l of e){let u=rE(l),h=u/i,f=Math.ceil(h)-1,d=u-f*i,p=(l[0][0]+l[1][0])/2-i/4,m=Math.min(l[0][1],l[1][1]);for(let g=0;g{let l=rE(s),u=Math.floor(l/(n+i)),h=(l+i-u*(n+i))/2,f=s[0],d=s[1];f[0]>d[0]&&(f=s[1],d=s[0]);let p=Math.atan((d[1]-f[1])/(d[0]-f[0]));for(let m=0;m{let s=rE(a),l=Math.round(s/(2*r)),u=a[0],h=a[1];u[0]>h[0]&&(u=a[1],h=a[0]);let f=Math.atan((h[1]-u[1])/(h[0]-u[0]));for(let d=0;d2*Math.PI&&(S=0,A=2*Math.PI);let L=(A-S)/b.curveStepCount,I=[];for(let N=S;N<=A;N+=L)I.push([T+w*Math.cos(N),E+k*Math.sin(N)]);return I.push([T+w*Math.cos(A),E+k*Math.sin(A)]),I.push([T,E]),d1([I],b)})(e,r,n,i,a,s,h));return h.stroke!==Wo&&f.push(d),this._d("arc",f,h)}curve(e,r){let n=this._o(r),i=[],a=_ie(e,n);if(n.fill&&n.fill!==Wo)if(n.fillStyle==="solid"){let s=_ie(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],l=e;if(l.length){let u=typeof l[0][0]=="number"?[l]:l;for(let h of u)h.length<3?s.push(...h):h.length===3?s.push(...bM(Iie([h[0],h[0],h[1],h[2]]),10,(1+n.roughness)/2)):s.push(...bM(Iie(h),10,(1+n.roughness)/2))}s.length&&i.push(d1([s],n))}return n.stroke!==Wo&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=Qk(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(xM([e],n)):i.push(d1([e],n))),n.stroke!==Wo&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==Wo,s=n.stroke!==Wo,l=!!(n.simplification&&n.simplification<1),u=(function(f,d,p){let m=Pie(Oie(NM(f))),g=[],y=[],v=[0,0],x=[],b=o(()=>{x.length>=4&&y.push(...bM(x,d)),x=[]},"i"),T=o(()=>{b(),y.length&&(g.push(y),y=[])},"c");for(let{key:w,data:k}of m)switch(w){case"M":T(),v=[k[0],k[1]],y.push(v);break;case"L":b(),y.push([k[0],k[1]]);break;case"C":if(!x.length){let S=y.length?y[y.length-1]:v;x.push([S[0],S[1]])}x.push([k[0],k[1]]),x.push([k[2],k[3]]),x.push([k[4],k[5]]);break;case"Z":b(),y.push([v[0],v[1]])}if(T(),!p)return g;let E=[];for(let w of g){let k=rze(w,p);k.length&&E.push(k)}return E})(e,1,l?4-4*(n.simplification||1):(1+n.roughness)/2),h=Rie(e,n);if(a)if(n.fillStyle==="solid")if(u.length===1){let f=Rie(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(f.ops)})}else i.push(xM(u,n));else i.push(d1(u,n));return s&&(l?u.forEach((f=>{i.push(Qk(f,!1,n))})):i.push(h)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map((s=>+s.toFixed(r))):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:Wo};break;case"fillPath":s={d:this.opsToPath(a),stroke:Wo,strokeWidth:0,fill:n.fill||Wo};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||Wo,strokeWidth:n,fill:Wo}}_mergedShape(e){return e.filter(((r,n)=>n===0||r.op!=="move"))}},RM=class{static{o(this,"st")}constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new p1(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let l=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,l),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map((l=>+l.toFixed(n))):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h),h}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},Kk="http://www.w3.org/2000/svg",LM=class{static{o(this,"ot")}constructor(e,r){this.svg=e,this.gen=new p1(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(Kk,"g"),s=e.options.fixedDecimalPlaceDigits;for(let l of r){let u=null;switch(l.type){case"path":u=i.createElementNS(Kk,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke",n.stroke),u.setAttribute("stroke-width",n.strokeWidth+""),u.setAttribute("fill","none"),n.strokeLineDash&&u.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&u.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":u=i.createElementNS(Kk,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke","none"),u.setAttribute("stroke-width","0"),u.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||u.setAttribute("fill-rule","evenodd");break;case"fillSketch":u=this.fillSketch(i,l,n)}u&&a.appendChild(u)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(Kk,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},Je={canvas:o((t,e)=>new RM(t,e),"canvas"),svg:o((t,e)=>new LM(t,e),"svg"),generator:o(t=>new p1(t),"generator"),newSeed:o(()=>p1.newSeed(),"newSeed")}});function Gie(t,e){let{labelStyles:r}=Ze(e);e.labelStyle=r;let n=ht(e),i=n;n||(i="anchor");let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=1,{cssStyles:l}=e,u=Je.svg(a),h=nt(e,{fill:"black",stroke:"none",fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=u.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.attr("class","anchor").attr("style",Bn(l)),rt(e,d),e.intersect=function(p){return K.info("Circle intersect",e,s,p),Qe.circle(e,s,p)},a}var Vie=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();ar();o(Gie,"anchor")});function qie(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),T=Math.atan2((e-b)/a,(t-x)/i),w=Math.atan2((n-b)/a,(r-x)/i)-T;s&&w<0&&(w+=2*Math.PI),!s&&w>0&&(w-=2*Math.PI);let k=[];for(let S=0;S<20;S++){let A=S/19,L=T+A*w,I=x+i*Math.cos(L),N=b+a*Math.sin(L);k.push({x:I,y:N})}return k}async function Uie(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.width+e.padding+20,l=a.height+e.padding,u=l/2,h=u/(2.5+l/50),{cssStyles:f}=e,d=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...qie(-s/2,-l/2,-s/2,l/2,h,u,!1),{x:s/2,y:l/2},...qie(s/2,l/2,s/2,-l/2,h,u,!0)],p=Je.svg(i),m=nt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=er(d),y=p.path(g,m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(${h/2}, 0)`),rt(e,v),e.intersect=function(x){return Qe.polygon(e,d,x)},i}var Wie=O(()=>{"use strict";$t();Yt();Ut();Wt();o(qie,"generateArcPoints");o(Uie,"bowTieRect")});function rs(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var _h=O(()=>{"use strict";o(rs,"insertPolygonShape")});async function Hie(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.height+e.padding,l=12,u=a.width+e.padding+l,h=0,f=u,d=-s,p=0,m=[{x:h+l,y:d},{x:f,y:d},{x:f,y:p},{x:h,y:p},{x:h,y:d+l},{x:h+l,y:d}],g,{cssStyles:y}=e;if(e.look==="handDrawn"){let v=Je.svg(i),x=nt(e,{}),b=er(m),T=v.path(b,x);g=i.insert(()=>T,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),y&&g.attr("style",y)}else g=rs(i,u,s,m);return n&&g.attr("style",n),rt(e,g),e.intersect=function(v){return Qe.polygon(e,m,v)},i}var Yie=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();$t();o(Hie,"card")});function jie(t,e){let{nodeStyles:r}=Ze(e);e.label="";let n=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],l=Je.svg(n),u=nt(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=er(s),f=l.path(h,u),d=n.insert(()=>f,":first-child");return i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(p){return Qe.polygon(e,s,p)},n}var Xie=O(()=>{"use strict";Yt();Wt();Ut();$t();o(jie,"choice")});async function nE(t,e,r){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n;let{shapeSvg:a,bbox:s,halfPadding:l}=await pt(t,e,ht(e)),u=r?.padding??l,h=s.width/2+u,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Je.svg(a),m=nt(e,{}),g=p.circle(0,0,h*2,m);f=a.insert(()=>g,":first-child"),f.attr("class","basic label-container").attr("style",Bn(d))}else f=a.insert("circle",":first-child").attr("class","basic label-container").attr("style",i).attr("r",h).attr("cx",0).attr("cy",0);return rt(e,f),e.calcIntersect=function(p,m){let g=p.width/2;return Qe.circle(p,g,m)},e.intersect=function(p){return K.info("Circle intersect",e,h,p),Qe.circle(e,h,p)},a}var MM=O(()=>{"use strict";Wt();xt();ar();Yt();Ut();$t();o(nE,"circle")});function nze(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},l={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${l.x},${l.y} - M ${i.x},${i.y} L ${s.x},${s.y}`}function Kie(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,l=Je.svg(i),u=nt(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=l.circle(0,0,a*2,u),f=nze(a),d=l.path(f,u),p=i.insert(()=>h,":first-child");return p.insert(()=>d),s&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",n),rt(e,p),e.intersect=function(m){return K.info("crossedCircle intersect",e,{radius:a,point:m}),Qe.circle(e,a,m)},i}var Qie=O(()=>{"use strict";xt();$t();Ut();Wt();Yt();o(nze,"createLine");o(Kie,"crossedCircle")});function Jf(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),E.insert(()=>x,":first-child"),E.attr("class","text"),f&&e.look!=="handDrawn"&&E.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&E.selectAll("path").attr("style",n),E.attr("transform",`translate(${h}, 0)`),s.attr("transform",`translate(${-l/2+h-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),rt(e,E),e.intersect=function(w){return Qe.polygon(e,p,w)},i}var Jie=O(()=>{"use strict";$t();Yt();Ut();Wt();o(Jf,"generateCirclePoints");o(Zie,"curlyBraceLeft")});function ed(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),E.insert(()=>x,":first-child"),E.attr("class","text"),f&&e.look!=="handDrawn"&&E.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&E.selectAll("path").attr("style",n),E.attr("transform",`translate(${-h}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),rt(e,E),e.intersect=function(w){return Qe.polygon(e,p,w)},i}var tae=O(()=>{"use strict";$t();Yt();Ut();Wt();o(ed,"generateCirclePoints");o(eae,"curlyBraceRight")});function ns(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dS,":first-child").attr("stroke-opacity",0),A.insert(()=>b,":first-child"),A.insert(()=>w,":first-child"),A.attr("class","text"),f&&e.look!=="handDrawn"&&A.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&A.selectAll("path").attr("style",n),A.attr("transform",`translate(${h-h/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),rt(e,A),e.intersect=function(L){return Qe.polygon(e,m,L)},i}var nae=O(()=>{"use strict";$t();Yt();Ut();Wt();o(ns,"generateCirclePoints");o(rae,"curlyBraces")});async function iae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=80,l=20,u=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Je.svg(i),m=nt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=u,y=h,v=g-f,x=y/4,b=[{x:v,y:0},{x,y:0},{x:0,y:y/2},{x,y},{x:v,y},...y0(-v,-y/2,f,50,270,90)],T=er(b),E=p.path(T,m),w=i.insert(()=>E,":first-child");return w.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",n),w.attr("transform",`translate(${-u/2}, ${-h/2})`),rt(e,w),e.intersect=function(k){return Qe.polygon(e,b,k)},i}var aae=O(()=>{"use strict";$t();Yt();Ut();Wt();o(iae,"curvedTrapezoid")});async function sae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+e.padding,e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+e.padding,e.height??0),d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Je.svg(i),g=aze(0,0,l,f,u,h),y=sze(0,h,l,f,u,h),v=m.path(g,nt(e,{})),x=m.path(y,nt(e,{fill:"none"}));d=i.insert(()=>x,":first-child"),d=i.insert(()=>v,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let m=ize(0,0,l,f,u,h);d=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",Bn(p)).attr("style",n)}return d.attr("label-offset-y",h),d.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),rt(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(m){let g=Qe.rect(e,m),y=g.x-(e.x??0);if(u!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-h)){let v=h*h*(1-y*y/(u*u));v>0&&(v=Math.sqrt(v)),v=h-v,m.y-(e.y??0)>0&&(v=-v),g.y+=v}return g},i}var ize,aze,sze,oae=O(()=>{"use strict";$t();Yt();Ut();Wt();ar();ize=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),aze=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),sze=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(sae,"cylinder")});async function lae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=a.width+e.padding,u=a.height+e.padding,h=u*.2,f=-l/2,d=-u/2-h/2,{cssStyles:p}=e,m=Je.svg(i),g=nt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d+h},{x:-f,y:d+h},{x:-f,y:-d},{x:f,y:-d},{x:f,y:d},{x:-f,y:d},{x:-f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${f+(e.padding??0)/2-(a.x-(a.left??0))}, ${d+h+(e.padding??0)/2-(a.y-(a.top??0))})`),rt(e,x),e.intersect=function(b){return Qe.rect(e,b)},i}var cae=O(()=>{"use strict";$t();Yt();Ut();Wt();o(lae,"dividedRectangle")});async function uae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await pt(t,e,ht(e)),u=a.width/2+s+5,h=a.width/2+s,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Je.svg(i),m=nt(e,{roughness:.2,strokeWidth:2.5}),g=nt(e,{roughness:.2,strokeWidth:1.5}),y=p.circle(0,0,u*2,m),v=p.circle(0,0,h*2,g);f=i.insert("g",":first-child"),f.attr("class",Bn(e.cssClasses)).attr("style",Bn(d)),f.node()?.appendChild(y),f.node()?.appendChild(v)}else{f=i.insert("g",":first-child");let p=f.insert("circle",":first-child"),m=f.insert("circle");f.attr("class","basic label-container").attr("style",n),p.attr("class","outer-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0),m.attr("class","inner-circle").attr("style",n).attr("r",h).attr("cx",0).attr("cy",0)}return rt(e,f),e.intersect=function(p){return K.info("DoubleCircle intersect",e,u,p),Qe.circle(e,u,p)},i}var hae=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();ar();o(uae,"doublecircle")});function fae(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),s=7,{cssStyles:l}=e,u=Je.svg(a),{nodeBorder:h}=r,f=nt(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(f.roughness=0);let d=u.circle(0,0,s*2,f),p=a.insert(()=>d,":first-child");return p.selectAll("path").attr("style",`fill: ${h} !important;`),l&&l.length>0&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",l),i&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",i),rt(e,p),e.intersect=function(m){return K.info("filledCircle intersect",e,{radius:s,point:m}),Qe.circle(e,s,m)},a}var dae=O(()=>{"use strict";Wt();xt();Yt();Ut();$t();o(fae,"filledCircle")});async function pae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:-u},{x:h,y:-u},{x:h/2,y:0}],{cssStyles:d}=e,p=Je.svg(i),m=nt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=er(f),y=p.path(g,m),v=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),e.width=l,e.height=u,rt(e,v),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-u/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return K.info("Triangle intersect",e,f,x),Qe.polygon(e,f,x)},i}var mae=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();$t();o(pae,"flippedTriangle")});function gae(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=Ze(e);e.label="";let s=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,u=Math.max(70,e?.width??0),h=Math.max(10,e?.height??0);r==="LR"&&(u=Math.max(10,e?.width??0),h=Math.max(70,e?.height??0));let f=-1*u/2,d=-1*h/2,p=Je.svg(s),m=nt(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=p.rectangle(f,d,u,h,m),y=s.insert(()=>g,":first-child");l&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",l),a&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",a),rt(e,y);let v=n?.padding??0;return e.width&&e.height&&(e.width+=v/2||0,e.height+=v/2||0),e.intersect=function(x){return Qe.rect(e,x)},s}var yae=O(()=>{"use strict";Wt();Yt();Ut();$t();o(gae,"forkJoin")});async function vae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:l}=await pt(t,e,ht(e)),u=Math.max(i,l.width+(e.padding??0)*2,e?.width??0),h=Math.max(a,l.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Je.svg(s),m=nt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-u/2,y:-h/2},{x:u/2-f,y:-h/2},...y0(-u/2+f,0,f,50,90,270),{x:u/2-f,y:h/2},{x:-u/2,y:h/2}],y=er(g),v=p.path(y,m),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),rt(e,x),e.intersect=function(b){return K.info("Pill intersect",e,{radius:f,point:b}),Qe.polygon(e,g,b)},s}var xae=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();o(vae,"halfRoundedRectangle")});async function bae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=4,l=a.height+e.padding,u=l/s,h=a.width+2*u+e.padding,f=[{x:u,y:0},{x:h-u,y:0},{x:h,y:-l/2},{x:h-u,y:-l},{x:u,y:-l},{x:0,y:-l/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Je.svg(i),g=nt(e,{}),y=oze(0,0,h,l,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${l/2})`),p&&d.attr("style",p)}else d=rs(i,h,l,f);return n&&d.attr("style",n),e.width=h,e.height=l,rt(e,d),e.intersect=function(m){return Qe.polygon(e,f,m)},i}var oze,Tae=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();oze=o((t,e,r,n,i)=>[`M${t+i},${e}`,`L${t+r-i},${e}`,`L${t+r},${e-n/2}`,`L${t+r-i},${e-n}`,`L${t+i},${e-n}`,`L${t},${e-n/2}`,"Z"].join(" "),"createHexagonPathD");o(bae,"hexagon")});async function wae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await pt(t,e,ht(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:l}=e,u=Je.svg(i),h=nt(e,{});e.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let f=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],d=er(f),p=u.path(d,h),m=i.insert(()=>p,":first-child");return m.attr("class","basic label-container"),l&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",l),n&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",n),m.attr("transform",`translate(${-a/2}, ${-s/2})`),rt(e,m),e.intersect=function(g){return K.info("Pill intersect",e,{points:f}),Qe.polygon(e,f,g)},i}var kae=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();o(wae,"hourglass")});async function Eae(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await pt(t,e,"icon-shape default"),p=e.pos==="t",m=l,g=l,{nodeBorder:y}=r,{stylesMap:v}=pu(e),x=-g/2,b=-m/2,T=e.label?8:0,E=Je.svg(h),w=nt(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let k=E.rectangle(x,b,g,m,w),S=Math.max(g,f.width),A=m+f.height+T,L=E.rectangle(-S/2,-A/2,S,A,{...w,fill:"transparent",stroke:"none"}),I=h.insert(()=>k,":first-child"),N=h.insert(()=>L);if(e.icon){let C=h.append("g");C.html(`${await eo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let _=C.node().getBBox(),D=_.width,M=_.height,R=_.x,P=_.y;C.attr("transform",`translate(${-D/2-R},${p?f.height/2+T/2-M/2-P:-f.height/2-T/2-M/2-P})`),C.attr("style",`color: ${v.get("stroke")??y};`)}return d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${p?-A/2:A/2-f.height})`),I.attr("transform",`translate(0,${p?f.height/2+T/2:-f.height/2-T/2})`),rt(e,N),e.intersect=function(C){if(K.info("iconSquare intersect",e,C),!e.label)return Qe.rect(e,C);let _=e.x??0,D=e.y??0,M=e.height??0,R=[];return p?R=[{x:_-f.width/2,y:D-M/2},{x:_+f.width/2,y:D-M/2},{x:_+f.width/2,y:D-M/2+f.height+T},{x:_+g/2,y:D-M/2+f.height+T},{x:_+g/2,y:D+M/2},{x:_-g/2,y:D+M/2},{x:_-g/2,y:D-M/2+f.height+T},{x:_-f.width/2,y:D-M/2+f.height+T}]:R=[{x:_-g/2,y:D-M/2},{x:_+g/2,y:D-M/2},{x:_+g/2,y:D-M/2+m},{x:_+f.width/2,y:D-M/2+m},{x:_+f.width/2/2,y:D+M/2},{x:_-f.width/2,y:D+M/2},{x:_-f.width/2,y:D-M/2+m},{x:_-g/2,y:D-M/2+m}],Qe.polygon(e,R,C)},h}var Sae=O(()=>{"use strict";Wt();xt();Xc();Yt();Ut();$t();o(Eae,"icon")});async function Cae(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await pt(t,e,"icon-shape default"),p=20,m=e.label?8:0,g=e.pos==="t",{nodeBorder:y,mainBkg:v}=r,{stylesMap:x}=pu(e),b=Je.svg(h),T=nt(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let E=x.get("fill");T.stroke=E??v;let w=h.append("g");e.icon&&w.html(`${await eo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let k=w.node().getBBox(),S=k.width,A=k.height,L=k.x,I=k.y,N=Math.max(S,A)*Math.SQRT2+p*2,C=b.circle(0,0,N,T),_=Math.max(N,f.width),D=N+f.height+m,M=b.rectangle(-_/2,-D/2,_,D,{...T,fill:"transparent",stroke:"none"}),R=h.insert(()=>C,":first-child"),P=h.insert(()=>M);return w.attr("transform",`translate(${-S/2-L},${g?f.height/2+m/2-A/2-I:-f.height/2-m/2-A/2-I})`),w.attr("style",`color: ${x.get("stroke")??y};`),d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${g?-D/2:D/2-f.height})`),R.attr("transform",`translate(0,${g?f.height/2+m/2:-f.height/2-m/2})`),rt(e,P),e.intersect=function(B){return K.info("iconSquare intersect",e,B),Qe.rect(e,B)},h}var Aae=O(()=>{"use strict";Wt();xt();Xc();Yt();Ut();$t();o(Cae,"iconCircle")});var ho,x0=O(()=>{"use strict";ho=o((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD")});async function _ae(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await pt(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=pu(e),T=-y/2,E=-g/2,w=e.label?8:0,k=Je.svg(h),S=nt(e,{});e.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let A=b.get("fill");S.stroke=A??x;let L=k.path(ho(T,E,y,g,5),S),I=Math.max(y,f.width),N=g+f.height+w,C=k.rectangle(-I/2,-N/2,I,N,{...S,fill:"transparent",stroke:"none"}),_=h.insert(()=>L,":first-child").attr("class","icon-shape2"),D=h.insert(()=>C);if(e.icon){let M=h.append("g");M.html(`${await eo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let R=M.node().getBBox(),P=R.width,B=R.height,F=R.x,G=R.y;M.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-G:-f.height/2-w/2-B/2-G})`),M.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-N/2:N/2-f.height})`),_.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),rt(e,D),e.intersect=function(M){if(K.info("iconSquare intersect",e,M),!e.label)return Qe.rect(e,M);let R=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:R-f.width/2,y:P-B/2},{x:R+f.width/2,y:P-B/2},{x:R+f.width/2,y:P-B/2+f.height+w},{x:R+y/2,y:P-B/2+f.height+w},{x:R+y/2,y:P+B/2},{x:R-y/2,y:P+B/2},{x:R-y/2,y:P-B/2+f.height+w},{x:R-f.width/2,y:P-B/2+f.height+w}]:F=[{x:R-y/2,y:P-B/2},{x:R+y/2,y:P-B/2},{x:R+y/2,y:P-B/2+g},{x:R+f.width/2,y:P-B/2+g},{x:R+f.width/2/2,y:P+B/2},{x:R-f.width/2,y:P+B/2},{x:R-f.width/2,y:P-B/2+g},{x:R-y/2,y:P-B/2+g}],Qe.polygon(e,F,M)},h}var Dae=O(()=>{"use strict";Wt();xt();Xc();Yt();Ut();x0();$t();o(_ae,"iconRounded")});async function Rae(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ze(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await pt(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=pu(e),T=-y/2,E=-g/2,w=e.label?8:0,k=Je.svg(h),S=nt(e,{});e.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let A=b.get("fill");S.stroke=A??x;let L=k.path(ho(T,E,y,g,.1),S),I=Math.max(y,f.width),N=g+f.height+w,C=k.rectangle(-I/2,-N/2,I,N,{...S,fill:"transparent",stroke:"none"}),_=h.insert(()=>L,":first-child"),D=h.insert(()=>C);if(e.icon){let M=h.append("g");M.html(`${await eo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let R=M.node().getBBox(),P=R.width,B=R.height,F=R.x,G=R.y;M.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-G:-f.height/2-w/2-B/2-G})`),M.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-N/2:N/2-f.height})`),_.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),rt(e,D),e.intersect=function(M){if(K.info("iconSquare intersect",e,M),!e.label)return Qe.rect(e,M);let R=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:R-f.width/2,y:P-B/2},{x:R+f.width/2,y:P-B/2},{x:R+f.width/2,y:P-B/2+f.height+w},{x:R+y/2,y:P-B/2+f.height+w},{x:R+y/2,y:P+B/2},{x:R-y/2,y:P+B/2},{x:R-y/2,y:P-B/2+f.height+w},{x:R-f.width/2,y:P-B/2+f.height+w}]:F=[{x:R-y/2,y:P-B/2},{x:R+y/2,y:P-B/2},{x:R+y/2,y:P-B/2+g},{x:R+f.width/2,y:P-B/2+g},{x:R+f.width/2/2,y:P+B/2},{x:R-f.width/2,y:P+B/2},{x:R-f.width/2,y:P-B/2+g},{x:R-y/2,y:P-B/2+g}],Qe.polygon(e,F,M)},h}var Lae=O(()=>{"use strict";Wt();xt();Xc();Yt();x0();Ut();$t();o(Rae,"iconSquare")});async function Nae(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=Ze(e);e.labelStyle=s;let l=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let u=Math.max(e.label?l??0:0,e?.assetWidth??i),h=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:u,f=e.constraint==="on"?h/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(h,l??0);let{shapeSvg:d,bbox:p,label:m}=await pt(t,e,"image-shape default"),g=e.pos==="t",y=-h/2,v=-f/2,x=e.label?8:0,b=Je.svg(d),T=nt(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let E=b.rectangle(y,v,h,f,T),w=Math.max(h,p.width),k=f+p.height+x,S=b.rectangle(-w/2,-k/2,w,k,{...T,fill:"none",stroke:"none"}),A=d.insert(()=>E,":first-child"),L=d.insert(()=>S);if(e.img){let I=d.append("image");I.attr("href",e.img),I.attr("width",h),I.attr("height",f),I.attr("preserveAspectRatio","none"),I.attr("transform",`translate(${-h/2},${g?k/2-f:-k/2})`)}return m.attr("transform",`translate(${-p.width/2-(p.x-(p.left??0))},${g?-f/2-p.height/2-x/2:f/2-p.height/2+x/2})`),A.attr("transform",`translate(0,${g?p.height/2+x/2:-p.height/2-x/2})`),rt(e,L),e.intersect=function(I){if(K.info("iconSquare intersect",e,I),!e.label)return Qe.rect(e,I);let N=e.x??0,C=e.y??0,_=e.height??0,D=[];return g?D=[{x:N-p.width/2,y:C-_/2},{x:N+p.width/2,y:C-_/2},{x:N+p.width/2,y:C-_/2+p.height+x},{x:N+h/2,y:C-_/2+p.height+x},{x:N+h/2,y:C+_/2},{x:N-h/2,y:C+_/2},{x:N-h/2,y:C-_/2+p.height+x},{x:N-p.width/2,y:C-_/2+p.height+x}]:D=[{x:N-h/2,y:C-_/2},{x:N+h/2,y:C-_/2},{x:N+h/2,y:C-_/2+f},{x:N+p.width/2,y:C-_/2+f},{x:N+p.width/2/2,y:C+_/2},{x:N-p.width/2,y:C+_/2},{x:N-p.width/2,y:C-_/2+f},{x:N-h/2,y:C-_/2+f}],Qe.polygon(e,D,I)},d}var Mae=O(()=>{"use strict";Wt();xt();Yt();Ut();$t();o(Nae,"imageSquare")});async function Iae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Je.svg(i),p=nt(e,{}),m=er(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=rs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,rt(e,h),e.intersect=function(d){return Qe.polygon(e,u,d)},i}var Oae=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();o(Iae,"inv_trapezoid")});async function Dh(t,e,r){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await pt(t,e,ht(e)),l=Math.max(s.width+r.labelPaddingX*2,e?.width||0),u=Math.max(s.height+r.labelPaddingY*2,e?.height||0),h=-l/2,f=-u/2,d,{rx:p,ry:m}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(p=r.rx,m=r.ry),e.look==="handDrawn"){let y=Je.svg(a),v=nt(e,{}),x=p||m?y.path(ho(h,f,l,u,p||0),v):y.rectangle(h,f,l,u,v);d=a.insert(()=>x,":first-child"),d.attr("class","basic label-container").attr("style",Bn(g))}else d=a.insert("rect",":first-child"),d.attr("class","basic label-container").attr("style",i).attr("rx",Bn(p)).attr("ry",Bn(m)).attr("x",h).attr("y",f).attr("width",l).attr("height",u);return rt(e,d),e.calcIntersect=function(y,v){return Qe.rect(y,v)},e.intersect=function(y){return Qe.rect(e,y)},a}var m1=O(()=>{"use strict";$t();Yt();x0();Ut();Wt();ar();o(Dh,"drawRect")});async function Pae(t,e){let{shapeSvg:r,bbox:n,label:i}=await pt(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),rt(e,a),e.intersect=function(u){return Qe.rect(e,u)},r}var Bae=O(()=>{"use strict";m1();$t();Yt();o(Pae,"labelRect")});async function Fae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-(3*l)/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Je.svg(i),p=nt(e,{}),m=er(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=rs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,rt(e,h),e.intersect=function(d){return Qe.polygon(e,u,d)},i}var $ae=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();o(Fae,"lean_left")});async function zae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Je.svg(i),p=nt(e,{}),m=er(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=rs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,rt(e,h),e.intersect=function(d){return Qe.polygon(e,u,d)},i}var Gae=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();o(zae,"lean_right")});function Vae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),l=Math.max(35,e?.height??0),u=7,h=[{x:s,y:0},{x:0,y:l+u/2},{x:s-2*u,y:l+u/2},{x:0,y:2*l},{x:s,y:l-u/2},{x:2*u,y:l-u/2}],f=Je.svg(i),d=nt(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=er(h),m=f.path(p,d),g=i.insert(()=>m,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-l})`),rt(e,g),e.intersect=function(y){return K.info("lightningBolt intersect",e,y),Qe.polygon(e,h,y)},i}var qae=O(()=>{"use strict";xt();$t();Ut();Wt();Yt();$t();o(Vae,"lightningBolt")});async function Uae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0),e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+(e.padding??0),e.height??0),d=f*.1,p,{cssStyles:m}=e;if(e.look==="handDrawn"){let g=Je.svg(i),y=cze(0,0,l,f,u,h,d),v=uze(0,h,l,f,u,h),x=nt(e,{}),b=g.path(y,x),T=g.path(v,x);i.insert(()=>T,":first-child").attr("class","line"),p=i.insert(()=>b,":first-child"),p.attr("class","basic label-container"),m&&p.attr("style",m)}else{let g=lze(0,0,l,f,u,h,d);p=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",Bn(m)).attr("style",n)}return p.attr("label-offset-y",h),p.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),rt(e,p),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),e.intersect=function(g){let y=Qe.rect(e,g),v=y.x-(e.x??0);if(u!=0&&(Math.abs(v)<(e.width??0)/2||Math.abs(v)==(e.width??0)/2&&Math.abs(y.y-(e.y??0))>(e.height??0)/2-h)){let x=h*h*(1-v*v/(u*u));x>0&&(x=Math.sqrt(x)),x=h-x,g.y-(e.y??0)>0&&(x=-x),y.y+=x}return y},i}var lze,cze,uze,Wae=O(()=>{"use strict";$t();Yt();Ut();Wt();ar();lze=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),cze=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),uze=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(Uae,"linedCylinder")});async function Hae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,{cssStyles:d}=e,p=Je.svg(i),m=nt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-l/2-l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:f/2},...El(-l/2-l/2*.1,f/2,l/2+l/2*.1,f/2,h,.8),{x:l/2+l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:-f/2},{x:-l/2,y:-f/2},{x:-l/2,y:f/2*1.1},{x:-l/2,y:-f/2}],y=p.polygon(g.map(x=>[x.x,x.y]),m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),rt(e,v),e.intersect=function(x){return Qe.polygon(e,g,x)},i}var Yae=O(()=>{"use strict";$t();Yt();Wt();Ut();o(Hae,"linedWaveEdgedRect")});async function jae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Je.svg(i),g=nt(e,{}),y=[{x:f-h,y:d+h},{x:f-h,y:d+u+h},{x:f+l-h,y:d+u+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d+u-h},{x:f+l+h,y:d+u-h},{x:f+l+h,y:d-h},{x:f+h,y:d-h},{x:f+h,y:d},{x:f,y:d},{x:f,y:d+h}],v=[{x:f,y:d+h},{x:f+l-h,y:d+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d},{x:f,y:d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=er(y),b=m.path(x,g),T=er(v),E=m.path(T,{...g,fill:"none"}),w=i.insert(()=>E,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-h-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),rt(e,w),e.intersect=function(k){return Qe.polygon(e,y,k)},i}var Xae=O(()=>{"use strict";$t();Ut();Wt();Yt();o(jae,"multiRect")});async function Kae(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,d=-l/2,p=-f/2,m=5,{cssStyles:g}=e,y=El(d-m,p+f+m,d+l-m,p+f+m,h,.8),v=y?.[y.length-1],x=[{x:d-m,y:p+m},{x:d-m,y:p+f+m},...y,{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:v.y-2*m},{x:d+l+m,y:v.y-2*m},{x:d+l+m,y:p-m},{x:d+m,y:p-m},{x:d+m,y:p},{x:d,y:p},{x:d,y:p+m}],b=[{x:d,y:p+m},{x:d+l-m,y:p+m},{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:p},{x:d,y:p}],T=Je.svg(i),E=nt(e,{});e.look!=="handDrawn"&&(E.roughness=0,E.fillStyle="solid");let w=er(x),k=T.path(w,E),S=er(b),A=T.path(S,E),L=i.insert(()=>k,":first-child");return L.insert(()=>A),L.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&L.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&L.selectAll("path").attr("style",n),L.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-(a.width/2)-m-(a.x-(a.left??0))}, ${-(a.height/2)+m-h/2-(a.y-(a.top??0))})`),rt(e,L),e.intersect=function(I){return Qe.polygon(e,x,I)},i}var Qae=O(()=>{"use strict";$t();Yt();Wt();Ut();o(Kae,"multiWaveEdgedRectangle")});async function Zae(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n,e.useHtmlLabels||Sr(Zt())||(e.centerLabel=!0);let{shapeSvg:s,bbox:l,label:u}=await pt(t,e,ht(e)),h=Math.max(l.width+(e.padding??0)*2,e?.width??0),f=Math.max(l.height+(e.padding??0)*2,e?.height??0),d=-h/2,p=-f/2,{cssStyles:m}=e,g=Je.svg(s),y=nt(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=g.rectangle(d,p,h,f,y),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",m),i&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",i),u.attr("transform",`translate(${-l.width/2-(l.x-(l.left??0))}, ${-(l.height/2)-(l.y-(l.top??0))})`),rt(e,x),e.intersect=function(b){return Qe.rect(e,b)},s}var Jae=O(()=>{"use strict";Wt();Yt();Ut();$t();$r();$r();o(Zae,"note")});async function ese(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.width+e.padding,l=a.height+e.padding,u=s+l,h=.5,f=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Je.svg(i),g=nt(e,{}),y=hze(0,0,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-u/2+h}, ${u/2})`),p&&d.attr("style",p)}else d=rs(i,u,u,f),d.attr("transform",`translate(${-u/2+h}, ${u/2})`);return n&&d.attr("style",n),rt(e,d),e.calcIntersect=function(m,g){let y=m.width,v=[{x:y/2,y:0},{x:y,y:-y/2},{x:y/2,y:-y},{x:0,y:-y/2}],x=Qe.polygon(m,v,g);return{x:x.x-.5,y:x.y-.5}},e.intersect=function(m){return this.calcIntersect(e,m)},i}var hze,tse=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();hze=o((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");o(ese,"question")});async function rse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0),e?.width??0),u=Math.max(a.height+(e.padding??0),e?.height??0),h=-l/2,f=-u/2,d=f/2,p=[{x:h+d,y:f},{x:h,y:0},{x:h+d,y:-f},{x:-h,y:-f},{x:-h,y:f}],{cssStyles:m}=e,g=Je.svg(i),y=nt(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=er(p),x=g.path(v,y),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-d/2},0)`),s.attr("transform",`translate(${-d/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),rt(e,b),e.intersect=function(T){return Qe.polygon(e,p,T)},i}var nse=O(()=>{"use strict";$t();Yt();Ut();Wt();o(rse,"rect_left_inv_arrow")});var fze,yc,iE=O(()=>{"use strict";$r();jt();co();fze=o(async(t,e,r,n=!1,i=!1)=>{let a=e||"";typeof a=="object"&&(a=a[0]);let s=ve(),l=Sr(s);return await Fn(t,a,{style:r,isTitle:n,useHtmlLabels:l,markdown:!1,isNode:i,width:Number.POSITIVE_INFINITY},s)},"createLabel"),yc=fze});async function ise(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),l=a.insert("g").attr("class","label").attr("style",n),u=e.description,h=e.label,f=await yc(l,h,e.labelStyle,!0,!0),d={width:0,height:0};if(Sr(ve())){let A=f.children[0],L=je(f);d=A.getBoundingClientRect(),L.attr("width",d.width),L.attr("height",d.height)}K.info("Text 2",u);let p=u||[],m=f.getBBox(),g=await yc(l,Array.isArray(p)?p.join("
    "):p,e.labelStyle,!0,!0),y=g.children[0],v=je(g);d=y.getBoundingClientRect(),v.attr("width",d.width),v.attr("height",d.height);let x=(e.padding||0)/2;je(g).attr("transform","translate( "+(d.width>m.width?0:(m.width-d.width)/2)+", "+(m.height+x+5)+")"),je(f).attr("transform","translate( "+(d.width(K.debug("Rough node insert CXC",I),N),":first-child"),k=a.insert(()=>(K.debug("Rough node insert CXC",I),I),":first-child")}else k=s.insert("rect",":first-child"),S=s.insert("line"),k.attr("class","outer title-state").attr("style",n).attr("x",-d.width/2-x).attr("y",-d.height/2-x).attr("width",d.width+(e.padding||0)).attr("height",d.height+(e.padding||0)),S.attr("class","divider").attr("x1",-d.width/2-x).attr("x2",d.width/2+x).attr("y1",-d.height/2-x+m.height+x).attr("y2",-d.height/2-x+m.height+x);return rt(e,k),e.intersect=function(A){return Qe.rect(e,A)},a}var ase=O(()=>{"use strict";Ar();$t();iE();Yt();Ut();Wt();jt();x0();xt();$r();o(ise,"rectWithTitle")});async function sse(t,e){let r={rx:5,ry:5,classes:"",labelPaddingX:(e?.padding||0)*1,labelPaddingY:(e?.padding||0)*1};return Dh(t,e,r)}var ose=O(()=>{"use strict";m1();o(sse,"roundedRect")});async function lse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=e?.padding??0,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=-a.width/2-l,d=-a.height/2-l,{cssStyles:p}=e,m=Je.svg(i),g=nt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d},{x:f+u+8,y:d},{x:f+u+8,y:d+h},{x:f-8,y:d+h},{x:f-8,y:d},{x:f,y:d},{x:f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container").attr("style",Bn(p)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-u/2+4+(e.padding??0)-(a.x-(a.left??0))},${-h/2+(e.padding??0)-(a.y-(a.top??0))})`),rt(e,x),e.intersect=function(b){return Qe.rect(e,b)},i}var cse=O(()=>{"use strict";$t();Yt();Ut();Wt();ar();o(lse,"shadedProcess")});async function use(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=Je.svg(i),m=nt(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:h,y:f},{x:h,y:f+u},{x:h+l,y:f+u},{x:h+l,y:f-u/2}],y=er(g),v=p.path(y,m),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))}, ${-u/4+(e.padding??0)-(a.y-(a.top??0))})`),rt(e,x),e.intersect=function(b){return Qe.polygon(e,g,b)},i}var hse=O(()=>{"use strict";$t();Yt();Ut();Wt();o(use,"slopedRect")});async function fse(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:e.labelPaddingX??(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return Dh(t,e,r)}var dse=O(()=>{"use strict";m1();o(fse,"squareRect")});async function pse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.height+e.padding,l=a.width+s/4+e.padding,u=s/2,{cssStyles:h}=e,f=Je.svg(i),d=nt(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=[{x:-l/2+u,y:-s/2},{x:l/2-u,y:-s/2},...y0(-l/2+u,0,u,50,90,270),{x:l/2-u,y:s/2},...y0(l/2-u,0,u,50,270,450)],m=er(p),g=f.path(m,d),y=i.insert(()=>g,":first-child");return y.attr("class","basic label-container outer-path"),h&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",h),n&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",n),rt(e,y),e.intersect=function(v){return Qe.polygon(e,p,v)},i}var mse=O(()=>{"use strict";$t();Yt();Ut();Wt();o(pse,"stadium")});async function gse(t,e){return Dh(t,e,{rx:5,ry:5,classes:"flowchart-node"})}var yse=O(()=>{"use strict";m1();o(gse,"state")});function vse(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:l,nodeBorder:u}=r,h=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),f=Je.svg(h),d=nt(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=f.circle(0,0,14,{...d,stroke:s,strokeWidth:2}),m=l??u,g=f.circle(0,0,5,{...d,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),y=h.insert(()=>p,":first-child");return y.insert(()=>g),a&&y.selectAll("path").attr("style",a),i&&y.selectAll("path").attr("style",i),rt(e,y),e.intersect=function(v){return Qe.circle(e,7,v)},h}var xse=O(()=>{"use strict";Wt();Yt();Ut();$t();o(vse,"stateEnd")});function bse(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let l=Je.svg(i).circle(0,0,14,Cie(n));a=i.insert(()=>l),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return rt(e,a),e.intersect=function(s){return Qe.circle(e,7,s)},i}var Tse=O(()=>{"use strict";Wt();Yt();Ut();$t();o(bse,"stateStart")});async function wse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=(e?.padding||0)/2,l=a.width+e.padding,u=a.height+e.padding,h=-a.width/2-s,f=-a.height/2-s,d=[{x:0,y:0},{x:l,y:0},{x:l,y:-u},{x:0,y:-u},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-u},{x:-8,y:-u},{x:-8,y:0}];if(e.look==="handDrawn"){let p=Je.svg(i),m=nt(e,{}),g=p.rectangle(h-8,f,l+16,u,m),y=p.line(h,f,h,f+u,m),v=p.line(h+l,f,h+l,f+u,m);i.insert(()=>y,":first-child"),i.insert(()=>v,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",Bn(b)),rt(e,x)}else{let p=rs(i,l,u,d);n&&p.attr("style",n),rt(e,p)}return e.intersect=function(p){return Qe.polygon(e,d,p)},i}var kse=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();ar();o(wse,"subroutine")});async function Ese(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-s/2,h=-l/2,f=.2*l,d=.2*l,{cssStyles:p}=e,m=Je.svg(i),g=nt(e,{}),y=[{x:u-f/2,y:h},{x:u+s+f/2,y:h},{x:u+s+f/2,y:h+l},{x:u-f/2,y:h+l}],v=[{x:u+s-f/2,y:h+l},{x:u+s+f/2,y:h+l},{x:u+s+f/2,y:h+l-d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=er(y),b=m.path(x,g),T=er(v),E=m.path(T,{...g,fillStyle:"solid"}),w=i.insert(()=>E,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),rt(e,w),e.intersect=function(k){return Qe.polygon(e,y,k)},i}var Sse=O(()=>{"use strict";$t();Ut();Wt();Yt();o(Ese,"taggedRect")});async function Cse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=.2*l,d=.2*u,p=u+h,{cssStyles:m}=e,g=Je.svg(i),y=nt(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=[{x:-l/2-l/2*.1,y:p/2},...El(-l/2-l/2*.1,p/2,l/2+l/2*.1,p/2,h,.8),{x:l/2+l/2*.1,y:-p/2},{x:-l/2-l/2*.1,y:-p/2}],x=-l/2+l/2*.1,b=-p/2-d*.4,T=[{x:x+l-f,y:(b+u)*1.4},{x:x+l,y:b+u-d},{x:x+l,y:(b+u)*.9},...El(x+l,(b+u)*1.3,x+l-f,(b+u)*1.5,-u*.03,.5)],E=er(v),w=g.path(E,y),k=er(T),S=g.path(k,{...y,fillStyle:"solid"}),A=i.insert(()=>S,":first-child");return A.insert(()=>w,":first-child"),A.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&A.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&A.selectAll("path").attr("style",n),A.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),rt(e,A),e.intersect=function(L){return Qe.polygon(e,v,L)},i}var Ase=O(()=>{"use strict";$t();Yt();Wt();Ut();o(Cse,"taggedWaveEdgedRectangle")});async function _se(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+e.padding,e?.width||0),l=Math.max(a.height+e.padding,e?.height||0),u=-s/2,h=-l/2,f=i.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",u).attr("y",h).attr("width",s).attr("height",l),rt(e,f),e.intersect=function(d){return Qe.rect(e,d)},i}var Dse=O(()=>{"use strict";$t();Yt();Ut();o(_se,"text")});async function Rse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:l}=await pt(t,e,ht(e)),u=e.look==="neo"?l*2:l,h=a.height+u,f=h/2,d=f/(2.5+h/50),p=a.width+d+u,{cssStyles:m}=e,g;if(e.look==="handDrawn"){let y=Je.svg(i),v=pze(0,0,p,h,d,f),x=mze(0,0,p,h,d,f),b=y.path(v,nt(e,{})),T=y.path(x,nt(e,{fill:"none"}));g=i.insert(()=>T,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),m&&g.attr("style",m)}else{let y=dze(0,0,p,h,d,f);g=i.insert("path",":first-child").attr("d",y).attr("class","basic label-container").attr("style",Bn(m)).attr("style",n),g.attr("class","basic label-container"),m&&g.selectAll("path").attr("style",m),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",d),g.attr("transform",`translate(${-p/2}, ${h/2} )`),s.attr("transform",`translate(${-(a.width/2)-d-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),rt(e,g),e.intersect=function(y){let v=Qe.rect(e,y),x=v.y-(e.y??0);if(f!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(v.x-(e.x??0))>(e.width??0)/2-d)){let b=d*d*(1-x*x/(f*f));b!=0&&(b=Math.sqrt(Math.abs(b))),b=d-b,y.x-(e.x??0)>0&&(b=-b),v.x+=b}return v},i}var dze,pze,mze,Lse=O(()=>{"use strict";$t();Ut();Wt();Yt();ar();dze=o((t,e,r,n,i,a)=>`M${t},${e} - a${i},${a} 0,0,1 0,${-n} - l${r},0 - a${i},${a} 0,0,1 0,${n} - M${r},${-n} - a${i},${a} 0,0,0 0,${n} - l${-r},0`,"createCylinderPathD"),pze=o((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),mze=o((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");o(Rse,"tiltedCylinder")});async function Nse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.width+e.padding,l=a.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Je.svg(i),p=nt(e,{}),m=er(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=rs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,rt(e,h),e.intersect=function(d){return Qe.polygon(e,u,d)},i}var Mse=O(()=>{"use strict";$t();Yt();Ut();Wt();_h();o(Nse,"trapezoid")});async function Ise(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=60,l=20,u=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:f}=e,d=Je.svg(i),p=nt(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let m=[{x:-u/2*.8,y:-h/2},{x:u/2*.8,y:-h/2},{x:u/2,y:-h/2*.6},{x:u/2,y:h/2},{x:-u/2,y:h/2},{x:-u/2,y:-h/2*.6}],g=er(m),y=d.path(g,p),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),rt(e,v),e.intersect=function(x){return Qe.polygon(e,m,x)},i}var Ose=O(()=>{"use strict";$t();Yt();Ut();Wt();o(Ise,"trapezoidalPentagon")});async function Pse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=e.useHtmlLabels||Sr(ve()),u=a.width+(e.padding??0),h=u+a.height,f=u+a.height,d=[{x:0,y:0},{x:f,y:0},{x:f/2,y:-h}],{cssStyles:p}=e,m=Je.svg(i),g=nt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=er(d),v=m.path(y,g),x=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${h/2})`);return p&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=u,e.height=h,rt(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${h/2-(a.height+(e.padding??0)/(l?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return K.info("Triangle intersect",e,d,b),Qe.polygon(e,d,b)},i}var Bse=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();$t();jt();$r();o(Pse,"triangle")});async function Fse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/8,f=u+h,{cssStyles:d}=e,m=70-l,g=m>0?m/2:0,y=Je.svg(i),v=nt(e,{});e.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let x=[{x:-l/2-g,y:f/2},...El(-l/2-g,f/2,l/2+g,f/2,h,.8),{x:l/2+g,y:-f/2},{x:-l/2-g,y:-f/2}],b=er(x),T=y.path(b,v),E=i.insert(()=>T,":first-child");return E.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&E.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&E.selectAll("path").attr("style",n),E.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h-(a.y-(a.top??0))})`),rt(e,E),e.intersect=function(w){return Qe.polygon(e,x,w)},i}var $se=O(()=>{"use strict";$t();Yt();Wt();Ut();o(Fse,"waveEdgedRectangle")});async function zse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=100,l=50,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=u/h,d=u,p=h;d>p*f?p=d/f:d=p*f,d=Math.max(d,s),p=Math.max(p,l);let m=Math.min(p*.2,p/4),g=p+m*2,{cssStyles:y}=e,v=Je.svg(i),x=nt(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-d/2,y:g/2},...El(-d/2,g/2,d/2,g/2,m,1),{x:d/2,y:-g/2},...El(d/2,-g/2,-d/2,-g/2,m,-1)],T=er(b),E=v.path(T,x),w=i.insert(()=>E,":first-child");return w.attr("class","basic label-container"),y&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",y),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),rt(e,w),e.intersect=function(k){return Qe.polygon(e,b,k)},i}var Gse=O(()=>{"use strict";$t();Yt();Ut();Wt();o(zse,"waveRectangle")});async function Vse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Je.svg(i),g=nt(e,{}),y=[{x:f-h,y:d-h},{x:f-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d-h}],v=`M${f-h},${d-h} L${f+l},${d-h} L${f+l},${d+u} L${f-h},${d+u} L${f-h},${d-h} - M${f-h},${d} L${f+l},${d} - M${f},${d-h} L${f},${d+u}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${h/2}, ${h/2})`),b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+h/2-(a.x-(a.left??0))}, ${-(a.height/2)+h/2-(a.y-(a.top??0))})`),rt(e,b),e.intersect=function(T){return Qe.polygon(e,y,T)},i}var qse=O(()=>{"use strict";$t();Ut();Wt();Yt();o(Vse,"windowPane")});async function IM(t,e){let r=e;if(r.alias&&(e.label=r.alias),e.look==="handDrawn"){let{themeVariables:V}=Zt(),{background:X}=V,Q={...e,id:e.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${X}`]};await IM(t,Q)}let n=Zt();e.useHtmlLabels=n.htmlLabels;let i=n.er?.diagramPadding??10,a=n.er?.entityPadding??6,{cssStyles:s}=e,{labelStyles:l,nodeStyles:u}=Ze(e);if(r.attributes.length===0&&e.label){let V={rx:0,ry:0,labelPaddingX:i,labelPaddingY:i*1.5,classes:""};xa(e.label,n)+V.labelPaddingX*20){let V=d.width+i*2-(y+v+x+b);y+=V/w,v+=V/w,x>0&&(x+=V/w),b>0&&(b+=V/w)}let S=y+v+x+b,A=Je.svg(f),L=nt(e,{});e.look!=="handDrawn"&&(L.roughness=0,L.fillStyle="solid");let I=0;g.length>0&&(I=g.reduce((V,X)=>V+(X?.rowHeight??0),0));let N=Math.max(k.width+i*2,e?.width||0,S),C=Math.max((I??0)+d.height,e?.height||0),_=-N/2,D=-C/2;f.selectAll("g:not(:first-child)").each((V,X,Q)=>{let H=je(Q[X]),ie=H.attr("transform"),Y=0,le=0;if(ie){let J=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(ie);J&&(Y=parseFloat(J[1]),le=parseFloat(J[2]),H.attr("class").includes("attribute-name")?Y+=y:H.attr("class").includes("attribute-keys")?Y+=y+v:H.attr("class").includes("attribute-comment")&&(Y+=y+v+x))}H.attr("transform",`translate(${_+i/2+Y}, ${le+D+d.height+a/2})`)}),f.select(".name").attr("transform","translate("+-d.width/2+", "+(D+a/2)+")");let M=A.rectangle(_,D,N,C,L),R=f.insert(()=>M,":first-child").attr("style",s.join("")),{themeVariables:P}=Zt(),{rowEven:B,rowOdd:F,nodeBorder:G}=P;m.push(0);for(let[V,X]of g.entries()){let H=(V+1)%2===0&&X.yOffset!==0,ie=A.rectangle(_,d.height+D+X?.yOffset,N,X?.rowHeight,{...L,fill:H?B:F,stroke:G});f.insert(()=>ie,"g.label").attr("style",s.join("")).attr("class",`row-rect-${H?"even":"odd"}`)}let $=A.line(_,d.height+D,N+_,d.height+D,L);f.insert(()=>$).attr("class","divider"),$=A.line(y+_,d.height+D,y+_,C+D,L),f.insert(()=>$).attr("class","divider"),T&&($=A.line(y+v+_,d.height+D,y+v+_,C+D,L),f.insert(()=>$).attr("class","divider")),E&&($=A.line(y+v+x+_,d.height+D,y+v+x+_,C+D,L),f.insert(()=>$).attr("class","divider"));for(let V of m)$=A.line(_,d.height+D+V,N+_,d.height+D+V,L),f.insert(()=>$).attr("class","divider");if(rt(e,R),u&&e.look!=="handDrawn"){let X=u.split(";")?.filter(Q=>Q.includes("stroke"))?.map(Q=>`${Q}`).join("; ");f.selectAll("path").attr("style",X??""),f.selectAll(".row-rect-even path").attr("style",u)}return e.intersect=function(V){return Qe.rect(e,V)},f}async function mb(t,e,r,n=0,i=0,a=[],s=""){let l=t.insert("g").attr("class",`label ${a.join(" ")}`).attr("transform",`translate(${n}, ${i})`).attr("style",s);e!==jc(e)&&(e=jc(e),e=e.replaceAll("<","<").replaceAll(">",">"));let u=l.node().appendChild(await Fn(l,e,{width:xa(e,r)+100,style:s,useHtmlLabels:r.htmlLabels},r));if(e.includes("<")||e.includes(">")){let f=u.children[0];for(f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">");f.childNodes[0];)f=f.childNodes[0],f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">")}let h=u.getBBox();if(Xs(r.htmlLabels)){let f=u.children[0];f.style.textAlign="start";let d=je(u);h=f.getBoundingClientRect(),d.attr("width",h.width),d.attr("height",h.height)}return h}var Use=O(()=>{"use strict";$t();Yt();Ut();Wt();m1();$r();co();Ur();Ar();ar();o(IM,"erBox");o(mb,"addText")});async function Wse(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",ht(e)).attr("id",e.domId||e.id),l=null,u=null,h=null,f=null,d=0,p=0,m=0;if(l=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await aE(l,{text:`\xAB${b}\xBB`},0),d=l.node().getBBox().height}u=s.insert("g").attr("class","label-group text"),await aE(u,e,0,["font-weight: bolder"]);let g=u.node().getBBox();p=g.height,h=s.insert("g").attr("class","members-group text");let y=0;for(let b of e.members){let T=await aE(h,b,y,[b.parseClassifier()]);y+=T+a}m=h.node().getBBox().height,m<=0&&(m=i/2),f=s.insert("g").attr("class","methods-group text");let v=0;for(let b of e.methods){let T=await aE(f,b,v,[b.parseClassifier()]);v+=T+a}let x=s.node().getBBox();if(l!==null){let b=l.node().getBBox();l.attr("transform",`translate(${-b.width/2})`)}return u.attr("transform",`translate(${-g.width/2}, ${d})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${d+p+i*2})`),x=s.node().getBBox(),f.attr("transform",`translate(0, ${d+p+(m?m+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function aE(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=Zt(),s="useHtmlLabels"in e?e.useHtmlLabels:Xs(a.htmlLabels)??!0,l="";"text"in e?l=e.text:l=e.label,!s&&l.startsWith("\\")&&(l=l.substring(1)),Jn(l)&&(s=!0);let u=await Fn(i,G2(ao(l)),{width:xa(l,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),h,f=1;if(s){let d=u.children[0],p=je(u);f=d.innerHTML.split("
    ").length,d.innerHTML.includes("")&&(f+=d.innerHTML.split("").length-1);let m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,E=parseInt(b,10)*5+"px";y.style.minWidth=E,y.style.maxWidth=E}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}else{n.includes("font-weight: bolder")&&je(u).selectAll("tspan").attr("font-weight",""),f=u.children.length;let d=u.children[0];(u.textContent===""||u.textContent.includes(">"))&&(d.textContent=l[0]+l.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),l[1]===" "&&(d.textContent=d.textContent[0]+" "+d.textContent.substring(1))),d.textContent==="undefined"&&(d.textContent=""),h=u.getBBox()}return i.attr("transform","translate(0,"+(-h.height/(2*f)+r)+")"),h.height}var Hse=O(()=>{"use strict";Ar();$r();$t();ar();jt();co();Ur();o(Wse,"textHelper");o(aE,"addText")});async function Yse(t,e){let r=ve(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??Xs(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:l,bbox:u}=await Wse(t,e,r,a,i),{labelStyles:h,nodeStyles:f}=Ze(e);e.labelStyle=h,e.cssStyles=s.styles||"";let d=s.styles?.join(";")||f||"";e.cssStyles||(e.cssStyles=d.replaceAll("!important","").split(";"));let p=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,m=Je.svg(l),g=nt(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=u.width,v=u.height;s.members.length===0&&s.methods.length===0?v+=i:s.members.length>0&&s.methods.length===0&&(v+=i*2);let x=-y/2,b=-v/2,T=m.rectangle(x-n,b-n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0),y+2*n,v+2*n+(p?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),E=l.insert(()=>T,":first-child");E.attr("class","basic label-container");let w=E.node().getBBox();l.selectAll(".text").each((L,I,N)=>{let C=je(N[I]),_=C.attr("transform"),D=0;if(_){let B=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(_);B&&(D=parseFloat(B[2]))}let M=D+b+n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(M-=4);let R=x;(C.attr("class").includes("label-group")||C.attr("class").includes("annotation-group"))&&(R=-C.node()?.getBBox().width/2||0,l.selectAll("text").each(function(P,B,F){window.getComputedStyle(F[B]).textAnchor==="middle"&&(R=0)})),C.attr("transform",`translate(${R}, ${M})`)});let k=l.select(".annotation-group").node().getBBox().height-(p?n/2:0)||0,S=l.select(".label-group").node().getBBox().height-(p?n/2:0)||0,A=l.select(".members-group").node().getBBox().height-(p?n/2:0)||0;if(s.members.length>0||s.methods.length>0||p){let L=m.line(w.x,k+S+b+n,w.x+w.width,k+S+b+n,g);l.insert(()=>L).attr("class","divider").attr("style",d)}if(p||s.members.length>0||s.methods.length>0){let L=m.line(w.x,k+S+A+b+i*2+n,w.x+w.width,k+S+A+b+n+i*2,g);l.insert(()=>L).attr("class","divider").attr("style",d)}if(s.look!=="handDrawn"&&l.selectAll("path").attr("style",d),E.select(":nth-child(2)").attr("style",d),l.selectAll(".divider").select("path").attr("style",d),e.labelStyle?l.selectAll("span").attr("style",e.labelStyle):l.selectAll("span").attr("style",d),!a){let L=RegExp(/color\s*:\s*([^;]*)/),I=L.exec(d);if(I){let N=I[0].replace("color","fill");l.selectAll("tspan").attr("style",N)}else if(h){let N=L.exec(h);if(N){let C=N[0].replace("color","fill");l.selectAll("tspan").attr("style",C)}}}return rt(e,E),e.intersect=function(L){return Qe.rect(e,L)},l}var jse=O(()=>{"use strict";$t();jt();Ar();Wt();Ut();Yt();Hse();Ur();o(Yse,"classBox")});async function Xse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let i=e,a=e,s=20,l=20,u="verifyMethod"in e,h=ht(e),f=t.insert("g").attr("class",h).attr("id",e.domId??e.id),d;u?d=await Rh(f,`<<${i.type}>>`,0,e.labelStyle):d=await Rh(f,"<<Element>>",0,e.labelStyle);let p=d,m=await Rh(f,i.name,p,e.labelStyle+"; font-weight: bold;");if(p+=m+l,u){let k=await Rh(f,`${i.requirementId?`ID: ${i.requirementId}`:""}`,p,e.labelStyle);p+=k;let S=await Rh(f,`${i.text?`Text: ${i.text}`:""}`,p,e.labelStyle);p+=S;let A=await Rh(f,`${i.risk?`Risk: ${i.risk}`:""}`,p,e.labelStyle);p+=A,await Rh(f,`${i.verifyMethod?`Verification: ${i.verifyMethod}`:""}`,p,e.labelStyle)}else{let k=await Rh(f,`${a.type?`Type: ${a.type}`:""}`,p,e.labelStyle);p+=k,await Rh(f,`${a.docRef?`Doc Ref: ${a.docRef}`:""}`,p,e.labelStyle)}let g=(f.node()?.getBBox().width??200)+s,y=(f.node()?.getBBox().height??200)+s,v=-g/2,x=-y/2,b=Je.svg(f),T=nt(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let E=b.rectangle(v,x,g,y,T),w=f.insert(()=>E,":first-child");if(w.attr("class","basic label-container").attr("style",n),f.selectAll(".label").each((k,S,A)=>{let L=je(A[S]),I=L.attr("transform"),N=0,C=0;if(I){let R=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);R&&(N=parseFloat(R[1]),C=parseFloat(R[2]))}let _=C-y/2,D=v+s/2;(S===0||S===1)&&(D=N),L.attr("transform",`translate(${D}, ${_+s})`)}),p>d+m+l){let k=b.line(v,x+d+m+l,v+g,x+d+m+l,T);f.insert(()=>k).attr("style",n)}return rt(e,w),e.intersect=function(k){return Qe.rect(e,k)},f}async function Rh(t,e,r,n=""){if(e==="")return 0;let i=t.insert("g").attr("class","label").attr("style",n),a=ve(),s=a.htmlLabels??!0,l=await Fn(i,G2(ao(e)),{width:xa(e,a)+50,classes:"markdown-node-label",useHtmlLabels:s,style:n},a),u;if(s){let h=l.children[0],f=je(l);u=h.getBoundingClientRect(),f.attr("width",u.width),f.attr("height",u.height)}else{let h=l.children[0];for(let f of h.children)f.textContent=f.textContent.replaceAll(">",">").replaceAll("<","<"),n&&f.setAttribute("style",n);u=l.getBBox(),u.height+=6}return i.attr("transform",`translate(${-u.width/2},${-u.height/2+r})`),u.height}var Kse=O(()=>{"use strict";$t();Yt();Ut();Wt();ar();jt();co();Ar();o(Xse,"requirementBox");o(Rh,"addText")});async function Qse(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=Ze(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:l,bbox:u,label:h}=await pt(t,e,ht(e)),f=e.padding||10,d="",p;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(d=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),p=l.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",d).attr("target","_blank"));let m={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,y;p?{label:g,bbox:y}=await Hk(p,"ticket"in e&&e.ticket||"",m):{label:g,bbox:y}=await Hk(l,"ticket"in e&&e.ticket||"",m);let{label:v,bbox:x}=await Hk(l,"assigned"in e&&e.assigned||"",m);e.width=s;let b=10,T=e?.width||0,E=Math.max(y.height,x.height)/2,w=Math.max(u.height+b*2,e?.height||0)+E,k=-T/2,S=-w/2;h.attr("transform","translate("+(f-T/2)+", "+(-E-u.height/2)+")"),g.attr("transform","translate("+(f-T/2)+", "+(-E+u.height/2)+")"),v.attr("transform","translate("+(f+T/2-x.width-2*a)+", "+(-E+u.height/2)+")");let A,{rx:L,ry:I}=e,{cssStyles:N}=e;if(e.look==="handDrawn"){let C=Je.svg(l),_=nt(e,{}),D=L||I?C.path(ho(k,S,T,w,L||0),_):C.rectangle(k,S,T,w,_);A=l.insert(()=>D,":first-child"),A.attr("class","basic label-container").attr("style",N||null)}else{A=l.insert("rect",":first-child"),A.attr("class","basic label-container __APA__").attr("style",i).attr("rx",L??5).attr("ry",I??5).attr("x",k).attr("y",S).attr("width",T).attr("height",w);let C="priority"in e&&e.priority;if(C){let _=l.append("line"),D=k+2,M=S+Math.floor((L??0)/2),R=S+w-Math.floor((L??0)/2);_.attr("x1",D).attr("y1",M).attr("x2",D).attr("y2",R).attr("stroke-width","4").attr("stroke",gze(C))}}return rt(e,A),e.height=w,e.intersect=function(C){return Qe.rect(e,C)},l}var gze,Zse=O(()=>{"use strict";$t();Yt();x0();Ut();Wt();gze=o(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");o(Qse,"kanbanItem")});async function Jse(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await pt(t,e,ht(e)),u=a.width+10*s,h=a.height+8*s,f=.15*u,{cssStyles:d}=e,p=a.width+20,m=a.height+20,g=Math.max(u,p),y=Math.max(h,m);l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`);let v,x=`M0 0 - a${f},${f} 1 0,0 ${g*.25},${-1*y*.1} - a${f},${f} 1 0,0 ${g*.25},0 - a${f},${f} 1 0,0 ${g*.25},0 - a${f},${f} 1 0,0 ${g*.25},${y*.1} - - a${f},${f} 1 0,0 ${g*.15},${y*.33} - a${f*.8},${f*.8} 1 0,0 0,${y*.34} - a${f},${f} 1 0,0 ${-1*g*.15},${y*.33} - - a${f},${f} 1 0,0 ${-1*g*.25},${y*.15} - a${f},${f} 1 0,0 ${-1*g*.25},0 - a${f},${f} 1 0,0 ${-1*g*.25},0 - a${f},${f} 1 0,0 ${-1*g*.25},${-1*y*.15} - - a${f},${f} 1 0,0 ${-1*g*.1},${-1*y*.33} - a${f*.8},${f*.8} 1 0,0 0,${-1*y*.34} - a${f},${f} 1 0,0 ${g*.1},${-1*y*.33} - H0 V0 Z`;if(e.look==="handDrawn"){let b=Je.svg(i),T=nt(e,{}),E=b.path(x,T);v=i.insert(()=>E,":first-child"),v.attr("class","basic label-container").attr("style",Bn(d))}else v=i.insert("path",":first-child").attr("class","basic label-container").attr("style",n).attr("d",x);return v.attr("transform",`translate(${-g/2}, ${-y/2})`),rt(e,v),e.calcIntersect=function(b,T){return Qe.rect(b,T)},e.intersect=function(b){return K.info("Bang intersect",e,b),Qe.rect(e,b)},i}var eoe=O(()=>{"use strict";xt();$t();Yt();Ut();Wt();ar();o(Jse,"bang")});async function toe(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await pt(t,e,ht(e)),u=a.width+2*s,h=a.height+2*s,f=.15*u,d=.25*u,p=.35*u,m=.2*u,{cssStyles:g}=e,y,v=`M0 0 - a${f},${f} 0 0,1 ${u*.25},${-1*u*.1} - a${p},${p} 1 0,1 ${u*.4},${-1*u*.1} - a${d},${d} 1 0,1 ${u*.35},${u*.2} - - a${f},${f} 1 0,1 ${u*.15},${h*.35} - a${m},${m} 1 0,1 ${-1*u*.15},${h*.65} - - a${d},${f} 1 0,1 ${-1*u*.25},${u*.15} - a${p},${p} 1 0,1 ${-1*u*.5},0 - a${f},${f} 1 0,1 ${-1*u*.25},${-1*u*.15} - - a${f},${f} 1 0,1 ${-1*u*.1},${-1*h*.35} - a${m},${m} 1 0,1 ${u*.1},${-1*h*.65} - H0 V0 Z`;if(e.look==="handDrawn"){let x=Je.svg(i),b=nt(e,{}),T=x.path(v,b);y=i.insert(()=>T,":first-child"),y.attr("class","basic label-container").attr("style",Bn(g))}else y=i.insert("path",":first-child").attr("class","basic label-container").attr("style",n).attr("d",v);return l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`),y.attr("transform",`translate(${-u/2}, ${-h/2})`),rt(e,y),e.calcIntersect=function(x,b){return Qe.rect(x,b)},e.intersect=function(x){return K.info("Cloud intersect",e,x),Qe.rect(e,x)},i}var roe=O(()=>{"use strict";Wt();xt();ar();Yt();Ut();$t();o(toe,"cloud")});async function noe(t,e){let{labelStyles:r,nodeStyles:n}=Ze(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await pt(t,e,ht(e)),u=a.width+8*s,h=a.height+2*s,f=5,d=` - M${-u/2} ${h/2-f} - v${-h+2*f} - q0,-${f} ${f},-${f} - h${u-2*f} - q${f},0 ${f},${f} - v${h-2*f} - q0,${f} -${f},${f} - h${-u+2*f} - q-${f},0 -${f},-${f} - Z - `,p=i.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("style",n).attr("d",d);return i.append("line").attr("class","node-line-").attr("x1",-u/2).attr("y1",h/2).attr("x2",u/2).attr("y2",h/2),l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`),i.append(()=>l.node()),rt(e,p),e.calcIntersect=function(m,g){return Qe.rect(m,g)},e.intersect=function(m){return Qe.rect(e,m)},i}var ioe=O(()=>{"use strict";Yt();Ut();$t();o(noe,"defaultMindmapNode")});async function aoe(t,e){let r={padding:e.padding??0};return nE(t,e,r)}var soe=O(()=>{"use strict";MM();o(aoe,"mindmapCircle")});function ooe(t){return t in OM}var yze,vze,OM,PM=O(()=>{"use strict";Vie();Wie();Yie();Xie();MM();Qie();Jie();tae();nae();aae();oae();cae();hae();dae();mae();yae();xae();Tae();kae();Sae();Aae();Dae();Lae();Mae();Oae();Bae();$ae();Gae();qae();Wae();Yae();Xae();Qae();Jae();tse();nse();ase();ose();cse();hse();dse();mse();yse();xse();Tse();kse();Sse();Ase();Dse();Lse();Mse();Ose();Bse();$se();Gse();qse();Use();jse();Kse();Zse();eoe();roe();ioe();soe();yze=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:fse},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:sse},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:pse},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:wse},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:sae},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:nE},{semanticName:"Bang",name:"Bang",shortName:"bang",description:"Bang",aliases:["bang"],handler:Jse},{semanticName:"Cloud",name:"Cloud",shortName:"cloud",description:"cloud",aliases:["cloud"],handler:toe},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:ese},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:bae},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:zae},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:Fae},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:Nse},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:Iae},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:uae},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:_se},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:Hie},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:lse},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:bse},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:vse},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:gae},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:wae},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:Zie},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:eae},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:rae},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:Vae},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:Fse},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:vae},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:Rse},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:Uae},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:iae},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:lae},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:Pse},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:Vse},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:fae},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:Ise},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:pae},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:use},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:Kae},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:jae},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:Uie},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:Kie},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:Cse},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:Ese},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:zse},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:rse},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:Hae}],vze=o(()=>{let e=[...Object.entries({state:gse,choice:jie,note:Zae,rectWithTitle:ise,labelRect:Pae,iconSquare:Rae,iconCircle:Cae,icon:Eae,iconRounded:_ae,imageSquare:Nae,anchor:Gie,kanbanItem:Qse,mindmapCircle:aoe,defaultMindmapNode:noe,classBox:Yse,erBox:IM,requirementBox:Xse}),...yze.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),OM=vze();o(ooe,"isValidShape")});var xze,sE,loe=O(()=>{"use strict";Ar();ib();jt();xt();PM();ar();Ur();si();a0();S2();xze="flowchart-",sE=class{constructor(){this.vertexCounter=0;this.config=ve();this.vertices=new Map;this.edges=[];this.classes=new Map;this.subGraphs=[];this.subGraphLookup=new Map;this.tooltips=new Map;this.subCount=0;this.firstGraphFlag=!0;this.secCount=-1;this.posCrossRef=[];this.funs=[];this.setAccTitle=Lr;this.setAccDescription=Pr;this.setDiagramTitle=zr;this.getAccTitle=Or;this.getAccDescription=Br;this.getDiagramTitle=Fr;this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{o(this,"FlowDB")}sanitizeText(e){return st.sanitizeText(e,this.config)}sanitizeNodeLabelType(e){switch(e){case"markdown":case"string":case"text":return e;default:return"markdown"}}lookUpDomId(e){for(let r of this.vertices.values())if(r.id===e)return r.domId;return e}addVertex(e,r,n,i,a,s,l={},u){if(!e||e.trim().length===0)return;let h;if(u!==void 0){let m;u.includes(` -`)?m=u+` -`:m=`{ -`+u+` -}`,h=Kf(m,{schema:Xf})}let f=this.edges.find(m=>m.id===e);if(f){let m=h;m?.animate!==void 0&&(f.animate=m.animate),m?.animation!==void 0&&(f.animation=m.animation),m?.curve!==void 0&&(f.interpolate=m.curve);return}let d,p=this.vertices.get(e);if(p===void 0&&(p={id:e,labelType:"text",domId:xze+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,p)),this.vertexCounter++,r!==void 0?(this.config=ve(),d=this.sanitizeText(r.text.trim()),p.labelType=r.type,d.startsWith('"')&&d.endsWith('"')&&(d=d.substring(1,d.length-1)),p.text=d):p.text===void 0&&(p.text=e),n!==void 0&&(p.type=n),i?.forEach(m=>{p.styles.push(m)}),a?.forEach(m=>{p.classes.push(m)}),s!==void 0&&(p.dir=s),p.props===void 0?p.props=l:l!==void 0&&Object.assign(p.props,l),h!==void 0){if(h.shape){if(h.shape!==h.shape.toLowerCase()||h.shape.includes("_"))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);if(!ooe(h.shape))throw new Error(`No such shape: ${h.shape}.`);p.type=h?.shape}h?.label&&(p.text=h?.label,p.labelType=this.sanitizeNodeLabelType(h?.labelType)),h?.icon&&(p.icon=h?.icon,!h.label?.trim()&&p.text===e&&(p.text="")),h?.form&&(p.form=h?.form),h?.pos&&(p.pos=h?.pos),h?.img&&(p.img=h?.img,!h.label?.trim()&&p.text===e&&(p.text="")),h?.constraint&&(p.constraint=h.constraint),h.w&&(p.assetWidth=Number(h.w)),h.h&&(p.assetHeight=Number(h.h))}}addSingleLink(e,r,n,i){let l={start:e,end:r,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};K.info("abc78 Got edge...",l);let u=n.text;if(u!==void 0&&(l.text=this.sanitizeText(u.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=this.sanitizeNodeLabelType(u.type)),n!==void 0&&(l.type=n.type,l.stroke=n.stroke,l.length=n.length>10?10:n.length),i&&!this.edges.some(h=>h.id===i))l.id=i,l.isUserDefinedId=!0;else{let h=this.edges.filter(f=>f.start===l.start&&f.end===l.end);h.length===0?l.id=hu(l.start,l.end,{counter:0,prefix:"L"}):l.id=hu(l.start,l.end,{counter:h.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))K.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. - -Initialize mermaid with maxEdges set to a higher number to allow more edges. -You cannot set this config via configuration inside the diagram as it is a secure config. -You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,r,n){let i=this.isLinkData(n)?n.id.replace("@",""):void 0;K.info("addLink",e,r,i);for(let a of e)for(let s of r){let l=a===e[e.length-1],u=s===r[0];l&&u?this.addSingleLink(a,s,n,i):this.addSingleLink(a,s,n,void 0)}}updateLinkInterpolate(e,r){e.forEach(n=>{n==="default"?this.edges.defaultInterpolate=r:this.edges[n].interpolate=r})}updateLink(e,r){e.forEach(n=>{if(typeof n=="number"&&n>=this.edges.length)throw new Error(`The index ${n} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);n==="default"?this.edges.defaultStyle=r:(this.edges[n].style=r,(this.edges[n]?.style?.length??0)>0&&!this.edges[n]?.style?.some(i=>i?.startsWith("fill"))&&this.edges[n]?.style?.push("fill:none"))})}addClass(e,r){let n=r.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(i=>{let a=this.classes.get(i);a===void 0&&(a={id:i,styles:[],textStyles:[]},this.classes.set(i,a)),n?.forEach(s=>{if(/color/.exec(s)){let l=s.replace("fill","bgFill");a.textStyles.push(l)}a.styles.push(s)})})}setDirection(e){this.direction=e.trim(),/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,r){for(let n of e.split(",")){let i=this.vertices.get(n);i&&i.classes.push(r);let a=this.edges.find(l=>l.id===n);a&&a.classes.push(r);let s=this.subGraphLookup.get(n);s&&s.classes.push(r)}}setTooltip(e,r){if(r!==void 0){r=this.sanitizeText(r);for(let n of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(n):n,r)}}setClickFun(e,r,n){let i=this.lookUpDomId(e);if(ve().securityLevel!=="loose"||r===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${i}"]`);l!==null&&l.addEventListener("click",()=>{Xt.runFunc(r,...a)},!1)}))}setLink(e,r,n){e.split(",").forEach(i=>{let a=this.vertices.get(i);a!==void 0&&(a.link=Xt.formatUrl(r,this.config),a.linkTarget=n)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFun(i,r,n)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(r=>{r(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let r=sk();je(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=je(a.currentTarget),l=s.attr("title");if(l===null)return;let u=a.currentTarget?.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.bottom+"px"),r.html(fl.sanitize(l)),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),je(a.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=ve(),_r()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,r,n){let i=e.text.trim(),a=n.text;e===n&&/\s/.exec(n.text)&&(i=void 0);let l=o(p=>{let m={boolean:{},number:{},string:{}},g=[],y;return{nodeList:p.filter(function(x){let b=typeof x;return x.stmt&&x.stmt==="dir"?(y=x.value,!1):x.trim()===""?!1:b in m?m[b].hasOwnProperty(x)?!1:m[b][x]=!0:g.includes(x)?!1:g.push(x)}),dir:y}},"uniq")(r.flat()),u=l.nodeList,h=l.dir,f=ve().flowchart??{};if(h=h??(f.inheritDir?this.getDirection()??ve().direction??void 0:void 0),this.version==="gen-1")for(let p=0;p2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=r,this.subGraphs[r].id===e)return{result:!0,count:0};let i=0,a=1;for(;i=0){let l=this.indexNodes2(e,s);if(l.result)return{result:!0,count:a+l.count};a=a+l.count}i=i+1}return{result:!1,count:a}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let r=e.trim(),n="arrow_open";switch(r[0]){case"<":n="arrow_point",r=r.slice(1);break;case"x":n="arrow_cross",r=r.slice(1);break;case"o":n="arrow_circle",r=r.slice(1);break}let i="normal";return r.includes("=")&&(i="thick"),r.includes(".")&&(i="dotted"),{type:n,stroke:i}}countChar(e,r){let n=r.length,i=0;for(let a=0;a":i="arrow_point",r.startsWith("<")&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle",r.startsWith("o")&&(i="double_"+i,n=n.slice(1));break}let a="normal",s=n.length-1;n.startsWith("=")&&(a="thick"),n.startsWith("~")&&(a="invisible");let l=this.countChar(".",n);return l&&(a="dotted",s=l),{type:i,stroke:a,length:s}}destructLink(e,r){let n=this.destructEndLink(e),i;if(r){if(i=this.destructStartLink(r),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if(i.type==="arrow_open")i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return i.type==="double_arrow"&&(i.type="double_arrow_point"),i.length=n.length,i}return n}exists(e,r){for(let n of e)if(n.nodes.includes(r))return!0;return!1}makeUniq(e,r){let n=[];return e.nodes.forEach((i,a)=>{this.exists(r,i)||n.push(e.nodes[a])}),{nodes:n}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,r){return e.find(n=>n.id===r)}destructEdgeType(e){let r="none",n="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":n=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":r=e.replace("double_",""),n=r;break}return{arrowTypeStart:r,arrowTypeEnd:n}}addNodeFromVertex(e,r,n,i,a,s){let l=n.get(e.id),u=i.get(e.id)??!1,h=this.findNode(r,e.id);if(h)h.cssStyles=e.styles,h.cssCompiledStyles=this.getCompiledStyles(e.classes),h.cssClasses=e.classes.join(" ");else{let f={id:e.id,label:e.text,labelType:e.labelType,labelStyle:"",parentId:l,padding:a.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:s,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};u?r.push({...f,isGroup:!0,shape:"rect"}):r.push({...f,isGroup:!1,shape:this.getTypeFromVertex(e)})}}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}getData(){let e=ve(),r=[],n=[],i=this.getSubGraphs(),a=new Map,s=new Map;for(let h=i.length-1;h>=0;h--){let f=i[h];f.nodes.length>0&&s.set(f.id,!0);for(let d of f.nodes)a.set(d,f.id)}for(let h=i.length-1;h>=0;h--){let f=i[h];r.push({id:f.id,label:f.title,labelStyle:"",labelType:f.labelType,parentId:a.get(f.id),padding:8,cssCompiledStyles:this.getCompiledStyles(f.classes),cssClasses:f.classes.join(" "),shape:"rect",dir:f.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(h=>{this.addNodeFromVertex(h,r,a,s,e,e.look||"classic")});let u=this.getEdges();return u.forEach((h,f)=>{let{arrowTypeStart:d,arrowTypeEnd:p}=this.destructEdgeType(h.type),m=[...u.defaultStyle??[]];h.style&&m.push(...h.style);let g={id:hu(h.start,h.end,{counter:f,prefix:"L"},h.id),isUserDefinedId:h.isUserDefinedId,start:h.start,end:h.end,type:h.type??"normal",label:h.text,labelType:h.labelType,labelpos:"c",thickness:h.stroke,minlen:h.length,classes:h?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":d,arrowTypeEnd:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":p,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(h.classes),labelStyle:m,style:m,pattern:h.stroke,look:e.look,animate:h.animate,animation:h.animation,curve:h.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};n.push(g)}),{nodes:r,edges:n,other:{},config:e}}defaultConfig(){return Fw.flowchart}}});var Sl,b0=O(()=>{"use strict";Ar();Sl=o((t,e)=>{let r;return e==="sandbox"&&(r=je("#i"+t)),(e==="sandbox"?je(r.nodes()[0].contentDocument.body):je("body")).select(`[id="${t}"]`)},"getDiagramElement")});var Lh,gb=O(()=>{"use strict";Lh=o(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var coe,bze,Tze,wze,kze,Eze,Sze,uoe,g1,hoe,oE=O(()=>{"use strict";jt();$r();xt();gb();Ar();Wt();co();mM();iE();x0();Ut();coe=o(async(t,e)=>{K.info("Creating subgraph rect for ",e.id,e);let r=ve(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Ze(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=Sr(r),m=d.insert("g").attr("class","cluster-label "),g;e.labelType==="markdown"?g=await Fn(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}):g=await yc(m,e.label,e.labelStyle||"",!1,!0);let y=g.getBBox();if(Sr(r)){let S=g.children[0],A=je(g);y=S.getBoundingClientRect(),A.attr("width",y.width),A.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;K.trace("Data ",e,JSON.stringify(e));let E;if(e.look==="handDrawn"){let S=Je.svg(d),A=nt(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),L=S.path(ho(b,T,v,x,0),A);E=d.insert(()=>(K.debug("Rough node insert CXC",L),L),":first-child"),E.select("path:nth-child(2)").attr("style",h.join(";")),E.select("path").attr("style",f.join(";").replace("fill","stroke"))}else E=d.insert("rect",":first-child"),E.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Lh(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let S=m.select("span");S&&S.attr("style",l)}let k=E.node().getBBox();return e.offsetX=0,e.width=k.width,e.height=k.height,e.offsetY=y.height-e.padding/2,e.intersect=function(S){return Qf(e,S)},{cluster:d,labelBBox:y}},"rect"),bze=o((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(l){return Qf(e,l)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),Tze=o(async(t,e)=>{let r=ve(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:l,nodeBorder:u}=n,h=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),f=h.insert("g",":first-child"),d=h.insert("g").attr("class","cluster-label"),p=h.append("rect"),m=await yc(d,e.label,e.labelStyle,void 0,!0),g=m.getBBox();if(Sr(r)){let L=m.children[0],I=je(m);g=L.getBoundingClientRect(),I.attr("width",g.width),I.attr("height",g.height)}let y=0*e.padding,v=y/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+y;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+y,T=e.height+y-g.height-6,E=e.x-x/2,w=e.y-b/2;e.width=x;let k=e.y-e.height/2-v+g.height+2,S;if(e.look==="handDrawn"){let L=e.cssClasses.includes("statediagram-cluster-alt"),I=Je.svg(h),N=e.rx||e.ry?I.path(ho(E,w,x,b,10),{roughness:.7,fill:l,fillStyle:"solid",stroke:u,seed:i}):I.rectangle(E,w,x,b,{seed:i});S=h.insert(()=>N,":first-child");let C=I.rectangle(E,k,x,T,{fill:L?a:s,fillStyle:L?"hachure":"solid",stroke:u,seed:i});S=h.insert(()=>N,":first-child"),p=h.insert(()=>C)}else S=f.insert("rect",":first-child"),S.attr("class","outer").attr("x",E).attr("y",w).attr("width",x).attr("height",b).attr("data-look",e.look),p.attr("class","inner").attr("x",E).attr("y",k).attr("width",x).attr("height",T);d.attr("transform",`translate(${e.x-g.width/2}, ${w+1-(Sr(r)?0:3)})`);let A=S.node().getBBox();return e.height=A.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(L){return Qf(e,L)},{cluster:h,labelBBox:g}},"roundedWithTitle"),wze=o(async(t,e)=>{K.info("Creating subgraph rect for ",e.id,e);let r=ve(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Ze(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=Sr(r),m=d.insert("g").attr("class","cluster-label "),g=await Fn(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}),y=g.getBBox();if(Sr(r)){let S=g.children[0],A=je(g);y=S.getBoundingClientRect(),A.attr("width",y.width),A.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;K.trace("Data ",e,JSON.stringify(e));let E;if(e.look==="handDrawn"){let S=Je.svg(d),A=nt(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),L=S.path(ho(b,T,v,x,e.rx),A);E=d.insert(()=>(K.debug("Rough node insert CXC",L),L),":first-child"),E.select("path:nth-child(2)").attr("style",h.join(";")),E.select("path").attr("style",f.join(";").replace("fill","stroke"))}else E=d.insert("rect",":first-child"),E.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Lh(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let S=m.select("span");S&&S.attr("style",l)}let k=E.node().getBBox();return e.offsetX=0,e.width=k.width,e.height=k.height,e.offsetY=y.height-e.padding/2,e.intersect=function(S){return Qf(e,S)},{cluster:d,labelBBox:y}},"kanbanSection"),kze=o((t,e)=>{let r=ve(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=s.insert("g",":first-child"),u=0*e.padding,h=e.width+u;e.diff=-e.padding;let f=e.height+u,d=e.x-h/2,p=e.y-f/2;e.width=h;let m;if(e.look==="handDrawn"){let v=Je.svg(s).rectangle(d,p,h,f,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});m=s.insert(()=>v,":first-child")}else m=l.insert("rect",":first-child"),m.attr("class","divider").attr("x",d).attr("y",p).attr("width",h).attr("height",f).attr("data-look",e.look);let g=m.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(y){return Qf(e,y)},{cluster:s,labelBBox:{}}},"divider"),Eze=coe,Sze={rect:coe,squareRect:Eze,roundedWithTitle:Tze,noteGroup:bze,divider:kze,kanbanSection:wze},uoe=new Map,g1=o(async(t,e)=>{let r=e.shape||"rect",n=await Sze[r](t,e);return uoe.set(e.id,n),n},"insertCluster"),hoe=o(()=>{uoe=new Map},"clear")});var Cl,BM=O(()=>{"use strict";Cl=o((t,e)=>{if(e)return"translate("+-t.width/2+", "+-t.height/2+")";let r=t.x??0,n=t.y??0;return"translate("+-(r+t.width/2)+", "+-(n+t.height/2)+")"},"computeLabelTransform")});function lE(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=li(t),e=li(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}var Ba,FM,li,cE,$M=O(()=>{"use strict";Ba={aggregation:17.25,extension:17.25,composition:17.25,dependency:6,lollipop:13.5,arrow_point:4},FM={arrow_point:9,arrow_cross:12.5,arrow_circle:12.5};o(lE,"calculateDeltaAndAngle");li=o(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),cE=o(t=>({x:o(function(e,r,n){let i=0,a=li(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(Ba,t.arrowTypeEnd)){let{angle:m,deltaX:g}=lE(n[n.length-1],n[n.length-2]);i=Ba[t.arrowTypeEnd]*Math.cos(m)*(g>=0?1:-1)}let s=Math.abs(li(e).x-li(n[n.length-1]).x),l=Math.abs(li(e).y-li(n[n.length-1]).y),u=Math.abs(li(e).x-li(n[0]).x),h=Math.abs(li(e).y-li(n[0]).y),f=Ba[t.arrowTypeStart],d=Ba[t.arrowTypeEnd],p=1;if(s0&&l0&&h=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(Ba,t.arrowTypeEnd)){let{angle:m,deltaY:g}=lE(n[n.length-1],n[n.length-2]);i=Ba[t.arrowTypeEnd]*Math.abs(Math.sin(m))*(g>=0?1:-1)}let s=Math.abs(li(e).y-li(n[n.length-1]).y),l=Math.abs(li(e).x-li(n[n.length-1]).x),u=Math.abs(li(e).y-li(n[0]).y),h=Math.abs(li(e).x-li(n[0]).x),f=Ba[t.arrowTypeStart],d=Ba[t.arrowTypeEnd],p=1;if(s0&&l0&&h{"use strict";xt();doe=o((t,e,r,n,i,a)=>{e.arrowTypeStart&&foe(t,"start",e.arrowTypeStart,r,n,i,a),e.arrowTypeEnd&&foe(t,"end",e.arrowTypeEnd,r,n,i,a)},"addEdgeMarkers"),Cze={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},foe=o((t,e,r,n,i,a,s)=>{let l=Cze[r];if(!l){K.warn(`Unknown arrow type: ${r}`);return}let u=l.type,f=`${i}_${a}-${u}${e==="start"?"Start":"End"}`;if(s&&s.trim()!==""){let d=s.replace(/[^\dA-Za-z]/g,"_"),p=`${f}_${d}`;if(!document.getElementById(p)){let m=document.getElementById(f);if(m){let g=m.cloneNode(!0);g.id=p,g.querySelectorAll("path, circle, line").forEach(v=>{v.setAttribute("stroke",s),l.fill&&v.setAttribute("fill",s)}),m.parentNode?.appendChild(g)}}t.attr(`marker-${e}`,`url(${n}#${p})`)}else t.attr(`marker-${e}`,`url(${n}#${f})`)},"addEdgeMarker")});function uE(t,e){Sr(ve())&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function Rze(t){let e=[],r=[];for(let n=1;n5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}function Mze(t,e){if(t.length<2)return"";let r="",n=t.length,i=1e-5;for(let a=0;a({...i}));if(t.length>=2&&Ba[e.arrowTypeStart]){let i=Ba[e.arrowTypeStart],a=t[0],s=t[1],{angle:l}=yoe(a,s),u=i*Math.cos(l),h=i*Math.sin(l);r[0].x=a.x+u,r[0].y=a.y+h}let n=t.length;if(n>=2&&Ba[e.arrowTypeEnd]){let i=Ba[e.arrowTypeEnd],a=t[n-1],s=t[n-2],{angle:l}=yoe(s,a),u=i*Math.cos(l),h=i*Math.sin(l);r[n-1].x=a.x-u,r[n-1].y=a.y-h}return r}var Aze,hE,Fa,voe,yb,fE,dE,_ze,Dze,moe,goe,Lze,Nze,pE,zM=O(()=>{"use strict";jt();$r();xt();co();BM();ar();$M();gb();Ar();Wt();iE();poe();Ut();Aze=o(t=>typeof t=="string"?t:ve()?.flowchart?.curve,"resolveEdgeCurveType"),hE=new Map,Fa=new Map,voe=o(()=>{hE.clear(),Fa.clear()},"clear"),yb=o(t=>t?typeof t=="string"?t:t.reduce((e,r)=>e+";"+r,""):"","getLabelStyles"),fE=o(async(t,e)=>{let r=ve(),n=Sr(r),{labelStyles:i}=Ze(e);e.labelStyle=i;let a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label").attr("data-id",e.id),l=e.labelType==="markdown",h=await Fn(t,e.label,{style:yb(e.labelStyle),useHtmlLabels:n,addSvgBackground:!0,isNode:!1,markdown:l,width:l?void 0:void 0},r);s.node().appendChild(h),K.info("abc82",e,e.labelType);let f=h.getBBox(),d=f;if(n){let m=h.children[0],g=je(h);f=m.getBoundingClientRect(),d=f,g.attr("width",f.width),g.attr("height",f.height)}else{let m=je(h).select("text").node();m&&typeof m.getBBox=="function"&&(d=m.getBBox())}s.attr("transform",Cl(d,n)),hE.set(e.id,a),e.width=f.width,e.height=f.height;let p;if(e.startLabelLeft){let m=t.insert("g").attr("class","edgeTerminals"),g=m.insert("g").attr("class","inner"),y=await yc(g,e.startLabelLeft,yb(e.labelStyle)||"",!1,!1);p=y;let v=y.getBBox();if(n){let x=y.children[0],b=je(y);v=x.getBoundingClientRect(),b.attr("width",v.width),b.attr("height",v.height)}g.attr("transform",Cl(v,n)),Fa.get(e.id)||Fa.set(e.id,{}),Fa.get(e.id).startLeft=m,uE(p,e.startLabelLeft)}if(e.startLabelRight){let m=t.insert("g").attr("class","edgeTerminals"),g=m.insert("g").attr("class","inner"),y=await yc(g,e.startLabelRight,yb(e.labelStyle)||"",!1,!1);p=y,g.node().appendChild(y);let v=y.getBBox();if(n){let x=y.children[0],b=je(y);v=x.getBoundingClientRect(),b.attr("width",v.width),b.attr("height",v.height)}g.attr("transform",Cl(v,n)),Fa.get(e.id)||Fa.set(e.id,{}),Fa.get(e.id).startRight=m,uE(p,e.startLabelRight)}if(e.endLabelLeft){let m=t.insert("g").attr("class","edgeTerminals"),g=m.insert("g").attr("class","inner"),y=await yc(g,e.endLabelLeft,yb(e.labelStyle)||"",!1,!1);p=y;let v=y.getBBox();if(n){let x=y.children[0],b=je(y);v=x.getBoundingClientRect(),b.attr("width",v.width),b.attr("height",v.height)}g.attr("transform",Cl(v,n)),m.node().appendChild(y),Fa.get(e.id)||Fa.set(e.id,{}),Fa.get(e.id).endLeft=m,uE(p,e.endLabelLeft)}if(e.endLabelRight){let m=t.insert("g").attr("class","edgeTerminals"),g=m.insert("g").attr("class","inner"),y=await yc(g,e.endLabelRight,yb(e.labelStyle)||"",!1,!1);p=y;let v=y.getBBox();if(n){let x=y.children[0],b=je(y);v=x.getBoundingClientRect(),b.attr("width",v.width),b.attr("height",v.height)}g.attr("transform",Cl(v,n)),m.node().appendChild(y),Fa.get(e.id)||Fa.set(e.id,{}),Fa.get(e.id).endRight=m,uE(p,e.endLabelRight)}return h},"insertEdgeLabel");o(uE,"setTerminalWidth");dE=o((t,e)=>{K.debug("Moving label abc88 ",t.id,t.label,hE.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=ve(),{subGraphTitleTotalMargin:i}=Lh(n);if(t.label){let a=hE.get(t.id),s=t.x,l=t.y;if(r){let u=Xt.calcLabelPosition(r);K.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=Fa.get(t.id).startLeft,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=Fa.get(t.id).startRight,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=Fa.get(t.id).endLeft,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=Fa.get(t.id).endRight,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),_ze=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),Dze=o((t,e,r)=>{K.debug(`intersection calc abc89: - outsidePoint: ${JSON.stringify(e)} - insidePoint : ${JSON.stringify(r)} - node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{K.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(K.info("abc88 checking point",a,e),!_ze(e,a)&&!i){let s=Dze(e,n,a);K.debug("abc88 inside",a,n,s),K.debug("abc88 intersection",s,e);let l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)?K.warn("abc88 no intersect",s,r):r.push(s),i=!0}else K.warn("abc88 outside",a,n),n=a,i||r.push(a)}),K.debug("returning points",r),r},"cutPathAtIntersect");o(Rze,"extractCornerPoints");goe=o(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),Lze=o(function(t){let{cornerPointPositions:e}=Rze(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){K.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let m=5;s.x===l.x?p={x:h<0?l.x-m+d:l.x+m-d,y:f<0?l.y-d:l.y+d}:p={x:h<0?l.x-d:l.x+d,y:f<0?l.y-m+d:l.y+m-d}}else K.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(p,u)}else r.push(t[n]);return r},"fixCorners"),Nze=o((t,e,r)=>{let n=t-e-r,i=2,a=2,s=i+a,l=Math.floor(n/s),u=Array(l).fill(`${i} ${a}`).join(" ");return`0 ${e} ${u} ${r}`},"generateDashArray"),pE=o(function(t,e,r,n,i,a,s,l=!1){let{handDrawnSeed:u}=ve(),h=e.points,f=!1,d=i;var p=a;let m=[];for(let R in e.cssCompiledStyles)ub(R)||m.push(e.cssCompiledStyles[R]);K.debug("UIO intersect check",e.points,p.x,d.x),p.intersect&&d.intersect&&!l&&(h=h.slice(1,e.points.length-1),h.unshift(d.intersect(h[0])),K.debug("Last point UIO",e.start,"-->",e.end,h[h.length-1],p,p.intersect(h[h.length-1])),h.push(p.intersect(h[h.length-1])));let g=btoa(JSON.stringify(h));e.toCluster&&(K.info("to cluster abc88",r.get(e.toCluster)),h=moe(e.points,r.get(e.toCluster).node),f=!0),e.fromCluster&&(K.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(h,null,2)),h=moe(h.reverse(),r.get(e.fromCluster).node).reverse(),f=!0);let y=h.filter(R=>!Number.isNaN(R.y)),v=Aze(e.curve);v!=="rounded"&&(y=Lze(y));let x=au;switch(v){case"linear":x=au;break;case"basis":x=fc;break;case"cardinal":x=Rx;break;case"bumpX":x=Sx;break;case"bumpY":x=Cx;break;case"catmullRom":x=Mx;break;case"monotoneX":x=Ix;break;case"monotoneY":x=Ox;break;case"natural":x=qg;break;case"step":x=Ug;break;case"stepAfter":x=Bx;break;case"stepBefore":x=Px;break;case"rounded":x=au;break;default:x=fc}let{x:b,y:T}=cE(e),E=hc().x(b).y(T).curve(x),w;switch(e.thickness){case"normal":w="edge-thickness-normal";break;case"thick":w="edge-thickness-thick";break;case"invisible":w="edge-thickness-invisible";break;default:w="edge-thickness-normal"}switch(e.pattern){case"solid":w+=" edge-pattern-solid";break;case"dotted":w+=" edge-pattern-dotted";break;case"dashed":w+=" edge-pattern-dashed";break;default:w+=" edge-pattern-solid"}let k,S=v==="rounded"?Mze(Ize(y,e),5):E(y),A=Array.isArray(e.style)?e.style:[e.style],L=A.find(R=>R?.startsWith("stroke:")),I="";e.animate&&(I="edge-animation-fast"),e.animation&&(I="edge-animation-"+e.animation);let N=!1;if(e.look==="handDrawn"){let R=Je.svg(t);Object.assign([],y);let P=R.path(S,{roughness:.3,seed:u});w+=" transition",k=je(P).select("path").attr("id",e.id).attr("class"," "+w+(e.classes?" "+e.classes:"")+(I?" "+I:"")).attr("style",A?A.reduce((F,G)=>F+";"+G,""):"");let B=k.attr("d");k.attr("d",B),t.node().appendChild(k.node())}else{let R=m.join(";"),P=A?A.reduce((X,Q)=>X+Q+";",""):"",B=(R?R+";"+P+";":P)+";"+(A?A.reduce((X,Q)=>X+";"+Q,""):"");k=t.append("path").attr("d",S).attr("id",e.id).attr("class"," "+w+(e.classes?" "+e.classes:"")+(I?" "+I:"")).attr("style",B),L=B.match(/stroke:([^;]+)/)?.[1],N=e.animate===!0||!!e.animation||R.includes("animation");let F=k.node(),G=typeof F.getTotalLength=="function"?F.getTotalLength():0,$=FM[e.arrowTypeStart]||0,V=FM[e.arrowTypeEnd]||0;if(e.look==="neo"&&!N){let Q=`stroke-dasharray: ${e.pattern==="dotted"||e.pattern==="dashed"?Nze(G,$,V):`0 ${$} ${G-$-V} ${V}`}; stroke-dashoffset: 0;`;k.attr("style",Q+k.attr("style"))}}k.attr("data-edge",!0),k.attr("data-et","edge"),k.attr("data-id",e.id),k.attr("data-points",g),e.showPoints&&y.forEach(R=>{t.append("circle").style("stroke","red").style("fill","red").attr("r",1).attr("cx",R.x).attr("cy",R.y)});let C="";(ve().flowchart.arrowMarkerAbsolute||ve().state.arrowMarkerAbsolute)&&(C=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,C=C.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),K.info("arrowTypeStart",e.arrowTypeStart),K.info("arrowTypeEnd",e.arrowTypeEnd),doe(k,e,C,s,n,L);let _=Math.floor(h.length/2),D=h[_];Xt.isLabelCoordinateInPath(D,k.attr("d"))||(f=!0);let M={};return f&&(M.updatedPath=h),M.originalPath=e.points,M},"insertEdge");o(Mze,"generateRoundedPath");o(yoe,"calculateDeltaAndAngle");o(Ize,"applyMarkerOffsetsToPoints")});var Oze,Pze,Bze,Fze,$ze,zze,Gze,Vze,qze,Uze,Wze,Hze,Yze,jze,Xze,Kze,Qze,mE,GM=O(()=>{"use strict";xt();Oze=o((t,e,r,n)=>{e.forEach(i=>{Qze[i](t,r,n)})},"insertMarkers"),Pze=o((t,e,r)=>{K.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Bze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),Fze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),$ze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),zze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),Gze=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Vze=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),qze=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Uze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Wze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneStart").attr("class","marker onlyOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneEnd").attr("class","marker onlyOne "+e).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),Hze=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneStart").attr("class","marker zeroOrOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+e).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),Yze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreStart").attr("class","marker oneOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreEnd").attr("class","marker oneOrMore "+e).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),jze=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+e).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),Xze=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 - L20,10 - M20,10 - L0,20`)},"requirement_arrow"),Kze=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),Qze={extension:Pze,composition:Bze,aggregation:Fze,dependency:$ze,lollipop:zze,point:Gze,circle:Vze,cross:qze,barb:Uze,only_one:Wze,zero_or_one:Hze,one_or_more:Yze,zero_or_more:jze,requirement_arrow:Xze,requirement_contains:Kze},mE=Oze});async function y1(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?OM[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),gE.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var gE,xoe,boe,vb,yE=O(()=>{"use strict";xt();PM();gE=new Map;o(y1,"insertNode");xoe=o((t,e)=>{gE.set(e.id,t)},"setNodeElem"),boe=o(()=>{gE.clear()},"clear"),vb=o(t=>{let e=gE.get(t.id);K.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});var Toe,woe=O(()=>{"use strict";$r();Ur();xt();oE();zM();GM();yE();$t();ar();Toe={common:st,getConfig:Zt,insertCluster:g1,insertEdge:pE,insertEdgeLabel:fE,insertMarkers:mE,insertNode:y1,interpolateToCurve:_N,labelHelper:pt,log:K,positionEdgeLabel:dE}});function Jze(t){return typeof t=="symbol"||wi(t)&&Pa(t)==Zze}var Zze,Ho,T0=O(()=>{"use strict";Th();xl();Zze="[object Symbol]";o(Jze,"isSymbol");Ho=Jze});function eGe(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{"use strict";o(eGe,"arrayMap");fo=eGe});function Soe(t){if(typeof t=="string")return t;if(zt(t))return fo(t,Soe)+"";if(Ho(t))return Eoe?Eoe.call(t):"";var e=t+"";return e=="0"&&1/t==-tGe?"-0":e}var tGe,koe,Eoe,Coe,Aoe=O(()=>{"use strict";s0();w0();oi();T0();tGe=1/0,koe=ya?ya.prototype:void 0,Eoe=koe?koe.toString:void 0;o(Soe,"baseToString");Coe=Soe});function nGe(t){for(var e=t.length;e--&&rGe.test(t.charAt(e)););return e}var rGe,_oe,Doe=O(()=>{"use strict";rGe=/\s/;o(nGe,"trimmedEndIndex");_oe=nGe});function aGe(t){return t&&t.slice(0,_oe(t)+1).replace(iGe,"")}var iGe,Roe,Loe=O(()=>{"use strict";Doe();iGe=/^\s+/;o(aGe,"baseTrim");Roe=aGe});function uGe(t){if(typeof t=="number")return t;if(Ho(t))return Noe;if(On(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=On(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Roe(t);var r=oGe.test(t);return r||lGe.test(t)?cGe(t.slice(2),r?2:8):sGe.test(t)?Noe:+t}var Noe,sGe,oGe,lGe,cGe,Moe,Ioe=O(()=>{"use strict";Loe();Vo();T0();Noe=NaN,sGe=/^[-+]0x[0-9a-f]+$/i,oGe=/^0b[01]+$/i,lGe=/^0o[0-7]+$/i,cGe=parseInt;o(uGe,"toNumber");Moe=uGe});function fGe(t){if(!t)return t===0?t:0;if(t=Moe(t),t===Ooe||t===-Ooe){var e=t<0?-1:1;return e*hGe}return t===t?t:0}var Ooe,hGe,v1,VM=O(()=>{"use strict";Ioe();Ooe=1/0,hGe=17976931348623157e292;o(fGe,"toFinite");v1=fGe});function dGe(t){var e=v1(t),r=e%1;return e===e?r?e-r:e:0}var mu,x1=O(()=>{"use strict";VM();o(dGe,"toInteger");mu=dGe});var pGe,vE,Poe=O(()=>{"use strict";Ff();yl();pGe=ro(Ri,"WeakMap"),vE=pGe});function mGe(){}var ki,qM=O(()=>{"use strict";o(mGe,"noop");ki=mGe});function gGe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(gGe,"arrayEach");xE=gGe});function yGe(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{"use strict";o(yGe,"baseFindIndex");bE=yGe});function vGe(t){return t!==t}var Boe,Foe=O(()=>{"use strict";o(vGe,"baseIsNaN");Boe=vGe});function xGe(t,e,r){for(var n=r-1,i=t.length;++n{"use strict";o(xGe,"strictIndexOf");$oe=xGe});function bGe(t,e,r){return e===e?$oe(t,e,r):bE(t,Boe,r)}var b1,TE=O(()=>{"use strict";WM();Foe();zoe();o(bGe,"baseIndexOf");b1=bGe});function TGe(t,e){var r=t==null?0:t.length;return!!r&&b1(t,e,0)>-1}var wE,HM=O(()=>{"use strict";TE();o(TGe,"arrayIncludes");wE=TGe});var wGe,Goe,Voe=O(()=>{"use strict";mN();wGe=yk(Object.keys,Object),Goe=wGe});function SGe(t){if(!lu(t))return Goe(t);var e=[];for(var r in Object(t))EGe.call(t,r)&&r!="constructor"&&e.push(r);return e}var kGe,EGe,T1,kE=O(()=>{"use strict";n1();Voe();kGe=Object.prototype,EGe=kGe.hasOwnProperty;o(SGe,"baseKeys");T1=SGe});function CGe(t){return Li(t)?wk(t):T1(t)}var nn,gu=O(()=>{"use strict";bN();kE();bl();o(CGe,"keys");nn=CGe});var AGe,_Ge,DGe,$a,qoe=O(()=>{"use strict";o1();h0();EN();bl();n1();gu();AGe=Object.prototype,_Ge=AGe.hasOwnProperty,DGe=Sk(function(t,e){if(lu(e)||Li(e)){kl(e,nn(e),t);return}for(var r in e)_Ge.call(e,r)&&cu(t,r,e[r])}),$a=DGe});function NGe(t,e){if(zt(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Ho(t)?!0:LGe.test(t)||!RGe.test(t)||e!=null&&t in Object(e)}var RGe,LGe,w1,EE=O(()=>{"use strict";oi();T0();RGe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,LGe=/^\w*$/;o(NGe,"isKey");w1=NGe});function IGe(t){var e=Xg(t,function(n){return r.size===MGe&&r.clear(),n}),r=e.cache;return e}var MGe,Uoe,Woe=O(()=>{"use strict";lN();MGe=500;o(IGe,"memoizeCapped");Uoe=IGe});var OGe,PGe,BGe,Hoe,Yoe=O(()=>{"use strict";Woe();OGe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,PGe=/\\(\\)?/g,BGe=Uoe(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(OGe,function(r,n,i,a){e.push(i?a.replace(PGe,"$1"):n||r)}),e}),Hoe=BGe});function FGe(t){return t==null?"":Coe(t)}var SE,YM=O(()=>{"use strict";Aoe();o(FGe,"toString");SE=FGe});function $Ge(t,e){return zt(t)?t:w1(t,e)?[t]:Hoe(SE(t))}var td,xb=O(()=>{"use strict";oi();EE();Yoe();YM();o($Ge,"castPath");td=$Ge});function GGe(t){if(typeof t=="string"||Ho(t))return t;var e=t+"";return e=="0"&&1/t==-zGe?"-0":e}var zGe,yu,k1=O(()=>{"use strict";T0();zGe=1/0;o(GGe,"toKey");yu=GGe});function VGe(t,e){e=td(e,t);for(var r=0,n=e.length;t!=null&&r{"use strict";xb();k1();o(VGe,"baseGet");rd=VGe});function qGe(t,e,r){var n=t==null?void 0:rd(t,e);return n===void 0?r:n}var joe,Xoe=O(()=>{"use strict";bb();o(qGe,"get");joe=qGe});function UGe(t,e){for(var r=-1,n=e.length,i=t.length;++r{"use strict";o(UGe,"arrayPush");E1=UGe});function WGe(t){return zt(t)||pc(t)||!!(Koe&&t&&t[Koe])}var Koe,Qoe,Zoe=O(()=>{"use strict";s0();i1();oi();Koe=ya?ya.isConcatSpreadable:void 0;o(WGe,"isFlattenable");Qoe=WGe});function Joe(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=Qoe),i||(i=[]);++a0&&r(l)?e>1?Joe(l,e-1,r,n,i):E1(i,l):n||(i[i.length]=l)}return i}var vu,S1=O(()=>{"use strict";CE();Zoe();o(Joe,"baseFlatten");vu=Joe});function HGe(t){var e=t==null?0:t.length;return e?vu(t,1):[]}var fn,AE=O(()=>{"use strict";S1();o(HGe,"flatten");fn=HGe});function YGe(t){return Ek(kk(t,void 0,fn),t+"")}var ele,tle=O(()=>{"use strict";AE();TN();kN();o(YGe,"flatRest");ele=YGe});function jGe(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{"use strict";o(jGe,"baseSlice");_E=jGe});function nVe(t){return rVe.test(t)}var XGe,KGe,QGe,ZGe,JGe,eVe,tVe,rVe,rle,nle=O(()=>{"use strict";XGe="\\ud800-\\udfff",KGe="\\u0300-\\u036f",QGe="\\ufe20-\\ufe2f",ZGe="\\u20d0-\\u20ff",JGe=KGe+QGe+ZGe,eVe="\\ufe0e\\ufe0f",tVe="\\u200d",rVe=RegExp("["+tVe+XGe+JGe+eVe+"]");o(nVe,"hasUnicode");rle=nVe});function iVe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{"use strict";o(iVe,"arrayReduce");ile=iVe});function aVe(t,e){return t&&kl(e,nn(e),t)}var sle,ole=O(()=>{"use strict";h0();gu();o(aVe,"baseAssign");sle=aVe});function sVe(t,e){return t&&kl(e,no(e),t)}var lle,cle=O(()=>{"use strict";h0();Wf();o(sVe,"baseAssignIn");lle=sVe});function oVe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{"use strict";o(oVe,"arrayFilter");C1=oVe});function lVe(){return[]}var RE,XM=O(()=>{"use strict";o(lVe,"stubArray");RE=lVe});var cVe,uVe,ule,hVe,A1,LE=O(()=>{"use strict";DE();XM();cVe=Object.prototype,uVe=cVe.propertyIsEnumerable,ule=Object.getOwnPropertySymbols,hVe=ule?function(t){return t==null?[]:(t=Object(t),C1(ule(t),function(e){return uVe.call(t,e)}))}:RE,A1=hVe});function fVe(t,e){return kl(t,A1(t),e)}var hle,fle=O(()=>{"use strict";h0();LE();o(fVe,"copySymbols");hle=fVe});var dVe,pVe,NE,KM=O(()=>{"use strict";CE();vk();LE();XM();dVe=Object.getOwnPropertySymbols,pVe=dVe?function(t){for(var e=[];t;)E1(e,A1(t)),t=r1(t);return e}:RE,NE=pVe});function mVe(t,e){return kl(t,NE(t),e)}var dle,ple=O(()=>{"use strict";h0();KM();o(mVe,"copySymbolsIn");dle=mVe});function gVe(t,e,r){var n=e(t);return zt(t)?n:E1(n,r(t))}var ME,QM=O(()=>{"use strict";CE();oi();o(gVe,"baseGetAllKeys");ME=gVe});function yVe(t){return ME(t,nn,A1)}var Tb,ZM=O(()=>{"use strict";QM();LE();gu();o(yVe,"getAllKeys");Tb=yVe});function vVe(t){return ME(t,no,NE)}var IE,JM=O(()=>{"use strict";QM();KM();Wf();o(vVe,"getAllKeysIn");IE=vVe});var xVe,OE,mle=O(()=>{"use strict";Ff();yl();xVe=ro(Ri,"DataView"),OE=xVe});var bVe,PE,gle=O(()=>{"use strict";Ff();yl();bVe=ro(Ri,"Promise"),PE=bVe});var TVe,nd,eI=O(()=>{"use strict";Ff();yl();TVe=ro(Ri,"Set"),nd=TVe});var yle,wVe,vle,xle,ble,Tle,kVe,EVe,SVe,CVe,AVe,k0,Yo,E0=O(()=>{"use strict";mle();uk();gle();eI();Poe();Th();aN();yle="[object Map]",wVe="[object Object]",vle="[object Promise]",xle="[object Set]",ble="[object WeakMap]",Tle="[object DataView]",kVe=wh(OE),EVe=wh(Gf),SVe=wh(PE),CVe=wh(nd),AVe=wh(vE),k0=Pa;(OE&&k0(new OE(new ArrayBuffer(1)))!=Tle||Gf&&k0(new Gf)!=yle||PE&&k0(PE.resolve())!=vle||nd&&k0(new nd)!=xle||vE&&k0(new vE)!=ble)&&(k0=o(function(t){var e=Pa(t),r=e==wVe?t.constructor:void 0,n=r?wh(r):"";if(n)switch(n){case kVe:return Tle;case EVe:return yle;case SVe:return vle;case CVe:return xle;case AVe:return ble}return e},"getTag"));Yo=k0});function RVe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&DVe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var _Ve,DVe,wle,kle=O(()=>{"use strict";_Ve=Object.prototype,DVe=_Ve.hasOwnProperty;o(RVe,"initCloneArray");wle=RVe});function LVe(t,e){var r=e?t1(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var Ele,Sle=O(()=>{"use strict";pk();o(LVe,"cloneDataView");Ele=LVe});function MVe(t){var e=new t.constructor(t.source,NVe.exec(t));return e.lastIndex=t.lastIndex,e}var NVe,Cle,Ale=O(()=>{"use strict";NVe=/\w*$/;o(MVe,"cloneRegExp");Cle=MVe});function IVe(t){return Dle?Object(Dle.call(t)):{}}var _le,Dle,Rle,Lle=O(()=>{"use strict";s0();_le=ya?ya.prototype:void 0,Dle=_le?_le.valueOf:void 0;o(IVe,"cloneSymbol");Rle=IVe});function eqe(t,e,r){var n=t.constructor;switch(e){case qVe:return t1(t);case OVe:case PVe:return new n(+t);case UVe:return Ele(t,r);case WVe:case HVe:case YVe:case jVe:case XVe:case KVe:case QVe:case ZVe:case JVe:return mk(t,r);case BVe:return new n;case FVe:case GVe:return new n(t);case $Ve:return Cle(t);case zVe:return new n;case VVe:return Rle(t)}}var OVe,PVe,BVe,FVe,$Ve,zVe,GVe,VVe,qVe,UVe,WVe,HVe,YVe,jVe,XVe,KVe,QVe,ZVe,JVe,Nle,Mle=O(()=>{"use strict";pk();Sle();Ale();Lle();dN();OVe="[object Boolean]",PVe="[object Date]",BVe="[object Map]",FVe="[object Number]",$Ve="[object RegExp]",zVe="[object Set]",GVe="[object String]",VVe="[object Symbol]",qVe="[object ArrayBuffer]",UVe="[object DataView]",WVe="[object Float32Array]",HVe="[object Float64Array]",YVe="[object Int8Array]",jVe="[object Int16Array]",XVe="[object Int32Array]",KVe="[object Uint8Array]",QVe="[object Uint8ClampedArray]",ZVe="[object Uint16Array]",JVe="[object Uint32Array]";o(eqe,"initCloneByTag");Nle=eqe});function rqe(t){return wi(t)&&Yo(t)==tqe}var tqe,Ile,Ole=O(()=>{"use strict";E0();xl();tqe="[object Map]";o(rqe,"baseIsMap");Ile=rqe});var Ple,nqe,Ble,Fle=O(()=>{"use strict";Ole();u0();jx();Ple=wl&&wl.isMap,nqe=Ple?Tl(Ple):Ile,Ble=nqe});function aqe(t){return wi(t)&&Yo(t)==iqe}var iqe,$le,zle=O(()=>{"use strict";E0();xl();iqe="[object Set]";o(aqe,"baseIsSet");$le=aqe});var Gle,sqe,Vle,qle=O(()=>{"use strict";zle();u0();jx();Gle=wl&&wl.isSet,sqe=Gle?Tl(Gle):$le,Vle=sqe});function BE(t,e,r,n,i,a){var s,l=e&oqe,u=e&lqe,h=e&cqe;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!On(t))return t;var f=zt(t);if(f){if(s=wle(t),!l)return gk(t,s)}else{var d=Yo(t),p=d==Wle||d==pqe;if(mc(t))return dk(t,l);if(d==Hle||d==Ule||p&&!i){if(s=u||p?{}:xk(t),!l)return u?dle(t,lle(s,t)):hle(t,sle(s,t))}else{if(!Un[d])return i?t:{};s=Nle(t,d,l)}}a||(a=new su);var m=a.get(t);if(m)return m;a.set(t,s),Vle(t)?t.forEach(function(v){s.add(BE(v,e,r,v,t,a))}):Ble(t)&&t.forEach(function(v,x){s.set(x,BE(v,e,r,x,t,a))});var g=h?u?IE:Tb:u?no:nn,y=f?void 0:g(t);return xE(y||t,function(v,x){y&&(x=v,v=t[x]),cu(s,x,BE(v,e,r,x,t,a))}),s}var oqe,lqe,cqe,Ule,uqe,hqe,fqe,dqe,Wle,pqe,mqe,gqe,Hle,yqe,vqe,xqe,bqe,Tqe,wqe,kqe,Eqe,Sqe,Cqe,Aqe,_qe,Dqe,Rqe,Lqe,Nqe,Un,FE,tI=O(()=>{"use strict";Wx();UM();o1();ole();cle();hN();pN();fle();ple();ZM();JM();E0();kle();Mle();gN();oi();s1();Fle();Vo();qle();gu();Wf();oqe=1,lqe=2,cqe=4,Ule="[object Arguments]",uqe="[object Array]",hqe="[object Boolean]",fqe="[object Date]",dqe="[object Error]",Wle="[object Function]",pqe="[object GeneratorFunction]",mqe="[object Map]",gqe="[object Number]",Hle="[object Object]",yqe="[object RegExp]",vqe="[object Set]",xqe="[object String]",bqe="[object Symbol]",Tqe="[object WeakMap]",wqe="[object ArrayBuffer]",kqe="[object DataView]",Eqe="[object Float32Array]",Sqe="[object Float64Array]",Cqe="[object Int8Array]",Aqe="[object Int16Array]",_qe="[object Int32Array]",Dqe="[object Uint8Array]",Rqe="[object Uint8ClampedArray]",Lqe="[object Uint16Array]",Nqe="[object Uint32Array]",Un={};Un[Ule]=Un[uqe]=Un[wqe]=Un[kqe]=Un[hqe]=Un[fqe]=Un[Eqe]=Un[Sqe]=Un[Cqe]=Un[Aqe]=Un[_qe]=Un[mqe]=Un[gqe]=Un[Hle]=Un[yqe]=Un[vqe]=Un[xqe]=Un[bqe]=Un[Dqe]=Un[Rqe]=Un[Lqe]=Un[Nqe]=!0;Un[dqe]=Un[Wle]=Un[Tqe]=!1;o(BE,"baseClone");FE=BE});function Iqe(t){return FE(t,Mqe)}var Mqe,Tn,rI=O(()=>{"use strict";tI();Mqe=4;o(Iqe,"clone");Tn=Iqe});function Bqe(t){return FE(t,Oqe|Pqe)}var Oqe,Pqe,nI,Yle=O(()=>{"use strict";tI();Oqe=1,Pqe=4;o(Bqe,"cloneDeep");nI=Bqe});function Fqe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{"use strict";o(Fqe,"compact");xu=Fqe});function zqe(t){return this.__data__.set(t,$qe),this}var $qe,Xle,Kle=O(()=>{"use strict";$qe="__lodash_hash_undefined__";o(zqe,"setCacheAdd");Xle=zqe});function Gqe(t){return this.__data__.has(t)}var Qle,Zle=O(()=>{"use strict";o(Gqe,"setCacheHas");Qle=Gqe});function $E(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new l0;++e{"use strict";hk();Kle();Zle();o($E,"SetCache");$E.prototype.add=$E.prototype.push=Xle;$E.prototype.has=Qle;_1=$E});function Vqe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(Vqe,"arraySome");GE=Vqe});function qqe(t,e){return t.has(e)}var D1,VE=O(()=>{"use strict";o(qqe,"cacheHas");D1=qqe});function Hqe(t,e,r,n,i,a){var s=r&Uqe,l=t.length,u=e.length;if(l!=u&&!(s&&u>l))return!1;var h=a.get(t),f=a.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,m=r&Wqe?new _1:void 0;for(a.set(t,e),a.set(e,t);++d{"use strict";zE();iI();VE();Uqe=1,Wqe=2;o(Hqe,"equalArrays");qE=Hqe});function Yqe(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var Jle,ece=O(()=>{"use strict";o(Yqe,"mapToArray");Jle=Yqe});function jqe(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var R1,UE=O(()=>{"use strict";o(jqe,"setToArray");R1=jqe});function lUe(t,e,r,n,i,a,s){switch(r){case oUe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case sUe:return!(t.byteLength!=e.byteLength||!a(new e1(t),new e1(e)));case Qqe:case Zqe:case tUe:return vl(+t,+e);case Jqe:return t.name==e.name&&t.message==e.message;case rUe:case iUe:return t==e+"";case eUe:var l=Jle;case nUe:var u=n&Xqe;if(l||(l=R1),t.size!=e.size&&!u)return!1;var h=s.get(t);if(h)return h==e;n|=Kqe,s.set(t,e);var f=qE(l(t),l(e),n,i,a,s);return s.delete(t),f;case aUe:if(sI)return sI.call(t)==sI.call(e)}return!1}var Xqe,Kqe,Qqe,Zqe,Jqe,eUe,tUe,rUe,nUe,iUe,aUe,sUe,oUe,tce,sI,rce,nce=O(()=>{"use strict";s0();fN();o0();aI();ece();UE();Xqe=1,Kqe=2,Qqe="[object Boolean]",Zqe="[object Date]",Jqe="[object Error]",eUe="[object Map]",tUe="[object Number]",rUe="[object RegExp]",nUe="[object Set]",iUe="[object String]",aUe="[object Symbol]",sUe="[object ArrayBuffer]",oUe="[object DataView]",tce=ya?ya.prototype:void 0,sI=tce?tce.valueOf:void 0;o(lUe,"equalByTag");rce=lUe});function fUe(t,e,r,n,i,a){var s=r&cUe,l=Tb(t),u=l.length,h=Tb(e),f=h.length;if(u!=f&&!s)return!1;for(var d=u;d--;){var p=l[d];if(!(s?p in e:hUe.call(e,p)))return!1}var m=a.get(t),g=a.get(e);if(m&&g)return m==e&&g==t;var y=!0;a.set(t,e),a.set(e,t);for(var v=s;++d{"use strict";ZM();cUe=1,uUe=Object.prototype,hUe=uUe.hasOwnProperty;o(fUe,"equalObjects");ice=fUe});function mUe(t,e,r,n,i,a){var s=zt(t),l=zt(e),u=s?oce:Yo(t),h=l?oce:Yo(e);u=u==sce?WE:u,h=h==sce?WE:h;var f=u==WE,d=h==WE,p=u==h;if(p&&mc(t)){if(!mc(e))return!1;s=!0,f=!1}if(p&&!f)return a||(a=new su),s||qf(t)?qE(t,e,r,n,i,a):rce(t,e,u,r,n,i,a);if(!(r&dUe)){var m=f&&lce.call(t,"__wrapped__"),g=d&&lce.call(e,"__wrapped__");if(m||g){var y=m?t.value():t,v=g?e.value():e;return a||(a=new su),i(y,v,r,n,a)}}return p?(a||(a=new su),ice(t,e,r,n,i,a)):!1}var dUe,sce,oce,WE,pUe,lce,cce,uce=O(()=>{"use strict";Wx();aI();nce();ace();E0();oi();s1();Xx();dUe=1,sce="[object Arguments]",oce="[object Array]",WE="[object Object]",pUe=Object.prototype,lce=pUe.hasOwnProperty;o(mUe,"baseIsEqualDeep");cce=mUe});function hce(t,e,r,n,i){return t===e?!0:t==null||e==null||!wi(t)&&!wi(e)?t!==t&&e!==e:cce(t,e,r,n,hce,i)}var HE,oI=O(()=>{"use strict";uce();xl();o(hce,"baseIsEqual");HE=hce});function vUe(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var l=r[i];if(s&&l[2]?l[1]!==t[l[0]]:!(l[0]in t))return!1}for(;++i{"use strict";Wx();oI();gUe=1,yUe=2;o(vUe,"baseIsMatch");fce=vUe});function xUe(t){return t===t&&!On(t)}var YE,lI=O(()=>{"use strict";Vo();o(xUe,"isStrictComparable");YE=xUe});function bUe(t){for(var e=nn(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,YE(i)]}return e}var pce,mce=O(()=>{"use strict";lI();gu();o(bUe,"getMatchData");pce=bUe});function TUe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var jE,cI=O(()=>{"use strict";o(TUe,"matchesStrictComparable");jE=TUe});function wUe(t){var e=pce(t);return e.length==1&&e[0][2]?jE(e[0][0],e[0][1]):function(r){return r===t||fce(r,t,e)}}var gce,yce=O(()=>{"use strict";dce();mce();cI();o(wUe,"baseMatches");gce=wUe});function kUe(t,e){return t!=null&&e in Object(t)}var vce,xce=O(()=>{"use strict";o(kUe,"baseHasIn");vce=kUe});function EUe(t,e,r){e=td(e,t);for(var n=-1,i=e.length,a=!1;++n{"use strict";xb();i1();oi();Qx();bk();k1();o(EUe,"hasPath");XE=EUe});function SUe(t,e){return t!=null&&XE(t,e,vce)}var KE,hI=O(()=>{"use strict";xce();uI();o(SUe,"hasIn");KE=SUe});function _Ue(t,e){return w1(t)&&YE(e)?jE(yu(t),e):function(r){var n=joe(r,t);return n===void 0&&n===e?KE(r,t):HE(e,n,CUe|AUe)}}var CUe,AUe,bce,Tce=O(()=>{"use strict";oI();Xoe();hI();EE();lI();cI();k1();CUe=1,AUe=2;o(_Ue,"baseMatchesProperty");bce=_Ue});function DUe(t){return function(e){return e?.[t]}}var QE,fI=O(()=>{"use strict";o(DUe,"baseProperty");QE=DUe});function RUe(t){return function(e){return rd(e,t)}}var wce,kce=O(()=>{"use strict";bb();o(RUe,"basePropertyDeep");wce=RUe});function LUe(t){return w1(t)?QE(yu(t)):wce(t)}var Ece,Sce=O(()=>{"use strict";fI();kce();EE();k1();o(LUe,"property");Ece=LUe});function NUe(t){return typeof t=="function"?t:t==null?va:typeof t=="object"?zt(t)?bce(t[0],t[1]):gce(t):Ece(t)}var Ln,Rs=O(()=>{"use strict";yce();Tce();Eh();oi();Sce();o(NUe,"baseIteratee");Ln=NUe});function MUe(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{"use strict";o(MUe,"arrayAggregator");Cce=MUe});function IUe(t,e){return t&&Jg(t,e,nn)}var L1,ZE=O(()=>{"use strict";fk();gu();o(IUe,"baseForOwn");L1=IUe});function OUe(t,e){return function(r,n){if(r==null)return r;if(!Li(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";bl();o(OUe,"createBaseEach");_ce=OUe});var PUe,po,id=O(()=>{"use strict";ZE();Dce();PUe=_ce(L1),po=PUe});function BUe(t,e,r,n){return po(t,function(i,a,s){e(n,i,r(i),s)}),n}var Rce,Lce=O(()=>{"use strict";id();o(BUe,"baseAggregator");Rce=BUe});function FUe(t,e){return function(r,n){var i=zt(r)?Cce:Rce,a=e?e():{};return i(r,t,Ln(n,2),a)}}var Nce,Mce=O(()=>{"use strict";Ace();Lce();Rs();oi();o(FUe,"createAggregator");Nce=FUe});var $Ue,JE,Ice=O(()=>{"use strict";yl();$Ue=o(function(){return Ri.Date.now()},"now"),JE=$Ue});var Oce,zUe,GUe,ad,Pce=O(()=>{"use strict";l1();o0();f0();Wf();Oce=Object.prototype,zUe=Oce.hasOwnProperty,GUe=uu(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&qo(e[0],e[1],i)&&(n=1);++r{"use strict";o(VUe,"arrayIncludesWith");eS=VUe});function UUe(t,e,r,n){var i=-1,a=wE,s=!0,l=t.length,u=[],h=e.length;if(!l)return u;r&&(e=fo(e,Tl(r))),n?(a=eS,s=!1):e.length>=qUe&&(a=D1,s=!1,e=new _1(e));e:for(;++i{"use strict";zE();HM();dI();w0();u0();VE();qUe=200;o(UUe,"baseDifference");Bce=UUe});var WUe,sd,$ce=O(()=>{"use strict";Fce();S1();l1();Tk();WUe=uu(function(t,e){return c0(t)?Bce(t,vu(e,1,c0,!0)):[]}),sd=WUe});function HUe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ba,zce=O(()=>{"use strict";o(HUe,"last");ba=HUe});function YUe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:mu(e),_E(t,e<0?0:e,n)):[]}var Pi,Gce=O(()=>{"use strict";jM();x1();o(YUe,"drop");Pi=YUe});function jUe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:mu(e),e=n-e,_E(t,0,e<0?0:e)):[]}var Nh,Vce=O(()=>{"use strict";jM();x1();o(jUe,"dropRight");Nh=jUe});function XUe(t){return typeof t=="function"?t:va}var N1,tS=O(()=>{"use strict";Eh();o(XUe,"castFunction");N1=XUe});function KUe(t,e){var r=zt(t)?xE:po;return r(t,N1(e))}var Oe,rS=O(()=>{"use strict";UM();id();tS();oi();o(KUe,"forEach");Oe=KUe});var qce=O(()=>{"use strict";rS()});function QUe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(QUe,"arrayEvery");Uce=QUe});function ZUe(t,e){var r=!0;return po(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var Hce,Yce=O(()=>{"use strict";id();o(ZUe,"baseEvery");Hce=ZUe});function JUe(t,e,r){var n=zt(t)?Uce:Hce;return r&&qo(t,e,r)&&(e=void 0),n(t,Ln(e,3))}var is,jce=O(()=>{"use strict";Wce();Yce();Rs();oi();f0();o(JUe,"every");is=JUe});function eWe(t,e){var r=[];return po(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var nS,pI=O(()=>{"use strict";id();o(eWe,"baseFilter");nS=eWe});function tWe(t,e){var r=zt(t)?C1:nS;return r(t,Ln(e,3))}var dn,mI=O(()=>{"use strict";DE();pI();Rs();oi();o(tWe,"filter");dn=tWe});function rWe(t){return function(e,r,n){var i=Object(e);if(!Li(e)){var a=Ln(r,3);e=nn(e),r=o(function(l){return a(i[l],l,i)},"predicate")}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var Xce,Kce=O(()=>{"use strict";Rs();bl();gu();o(rWe,"createFind");Xce=rWe});function iWe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:mu(r);return i<0&&(i=nWe(n+i,0)),bE(t,Ln(e,3),i)}var nWe,Qce,Zce=O(()=>{"use strict";WM();Rs();x1();nWe=Math.max;o(iWe,"findIndex");Qce=iWe});var aWe,Ls,Jce=O(()=>{"use strict";Kce();Zce();aWe=Xce(Qce),Ls=aWe});function sWe(t){return t&&t.length?t[0]:void 0}var Ta,eue=O(()=>{"use strict";o(sWe,"head");Ta=sWe});var tue=O(()=>{"use strict";eue()});function oWe(t,e){var r=-1,n=Li(t)?Array(t.length):[];return po(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var iS,gI=O(()=>{"use strict";id();bl();o(oWe,"baseMap");iS=oWe});function lWe(t,e){var r=zt(t)?fo:iS;return r(t,Ln(e,3))}var lt,M1=O(()=>{"use strict";w0();Rs();gI();oi();o(lWe,"map");lt=lWe});function cWe(t,e){return vu(lt(t,e),1)}var za,yI=O(()=>{"use strict";S1();M1();o(cWe,"flatMap");za=cWe});function uWe(t,e){return t==null?t:Jg(t,N1(e),no)}var vI,rue=O(()=>{"use strict";fk();tS();Wf();o(uWe,"forIn");vI=uWe});function hWe(t,e){return t&&L1(t,N1(e))}var xI,nue=O(()=>{"use strict";ZE();tS();o(hWe,"forOwn");xI=hWe});var fWe,dWe,pWe,bI,iue=O(()=>{"use strict";Zg();Mce();fWe=Object.prototype,dWe=fWe.hasOwnProperty,pWe=Nce(function(t,e,r){dWe.call(t,r)?t[r].push(e):ou(t,r,[e])}),bI=pWe});function mWe(t,e){return t>e}var aue,sue=O(()=>{"use strict";o(mWe,"baseGt");aue=mWe});function vWe(t,e){return t!=null&&yWe.call(t,e)}var gWe,yWe,oue,lue=O(()=>{"use strict";gWe=Object.prototype,yWe=gWe.hasOwnProperty;o(vWe,"baseHas");oue=vWe});function xWe(t,e){return t!=null&&XE(t,e,oue)}var Gt,cue=O(()=>{"use strict";lue();uI();o(xWe,"has");Gt=xWe});function TWe(t){return typeof t=="string"||!zt(t)&&wi(t)&&Pa(t)==bWe}var bWe,Bi,aS=O(()=>{"use strict";Th();oi();xl();bWe="[object String]";o(TWe,"isString");Bi=TWe});function wWe(t,e){return fo(e,function(r){return t[r]})}var uue,hue=O(()=>{"use strict";w0();o(wWe,"baseValues");uue=wWe});function kWe(t){return t==null?[]:uue(t,nn(t))}var Gr,TI=O(()=>{"use strict";hue();gu();o(kWe,"values");Gr=kWe});function SWe(t,e,r,n){t=Li(t)?t:Gr(t),r=r&&!n?mu(r):0;var i=t.length;return r<0&&(r=EWe(i+r,0)),Bi(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&b1(t,e,r)>-1}var EWe,ci,fue=O(()=>{"use strict";TE();bl();aS();x1();TI();EWe=Math.max;o(SWe,"includes");ci=SWe});function AWe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:mu(r);return i<0&&(i=CWe(n+i,0)),b1(t,e,i)}var CWe,sS,due=O(()=>{"use strict";TE();x1();CWe=Math.max;o(AWe,"indexOf");sS=AWe});function NWe(t){if(t==null)return!0;if(Li(t)&&(zt(t)||typeof t=="string"||typeof t.splice=="function"||mc(t)||qf(t)||pc(t)))return!t.length;var e=Yo(t);if(e==_We||e==DWe)return!t.size;if(lu(t))return!T1(t).length;for(var r in t)if(LWe.call(t,r))return!1;return!0}var _We,DWe,RWe,LWe,Er,oS=O(()=>{"use strict";kE();E0();i1();oi();bl();s1();n1();Xx();_We="[object Map]",DWe="[object Set]",RWe=Object.prototype,LWe=RWe.hasOwnProperty;o(NWe,"isEmpty");Er=NWe});function IWe(t){return wi(t)&&Pa(t)==MWe}var MWe,pue,mue=O(()=>{"use strict";Th();xl();MWe="[object RegExp]";o(IWe,"baseIsRegExp");pue=IWe});var gue,OWe,Al,yue=O(()=>{"use strict";mue();u0();jx();gue=wl&&wl.isRegExp,OWe=gue?Tl(gue):pue,Al=OWe});function PWe(t){return t===void 0}var Dr,vue=O(()=>{"use strict";o(PWe,"isUndefined");Dr=PWe});function BWe(t,e){return t{"use strict";o(BWe,"baseLt");lS=BWe});function FWe(t,e){var r={};return e=Ln(e,3),L1(t,function(n,i,a){ou(r,i,e(n,i,a))}),r}var S0,xue=O(()=>{"use strict";Zg();ZE();Rs();o(FWe,"mapValues");S0=FWe});function $We(t,e,r){for(var n=-1,i=t.length;++n{"use strict";T0();o($We,"baseExtremum");I1=$We});function zWe(t){return t&&t.length?I1(t,va,aue):void 0}var mo,bue=O(()=>{"use strict";cS();sue();Eh();o(zWe,"max");mo=zWe});function GWe(t){return t&&t.length?I1(t,va,lS):void 0}var vc,kI=O(()=>{"use strict";cS();wI();Eh();o(GWe,"min");vc=GWe});function VWe(t,e){return t&&t.length?I1(t,Ln(e,2),lS):void 0}var C0,Tue=O(()=>{"use strict";cS();Rs();wI();o(VWe,"minBy");C0=VWe});function UWe(t){if(typeof t!="function")throw new TypeError(qWe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var qWe,wue,kue=O(()=>{"use strict";qWe="Expected a function";o(UWe,"negate");wue=UWe});function WWe(t,e,r,n){if(!On(t))return t;e=td(e,t);for(var i=-1,a=e.length,s=a-1,l=t;l!=null&&++i{"use strict";o1();xb();Qx();Vo();k1();o(WWe,"baseSet");Eue=WWe});function HWe(t,e,r){for(var n=-1,i=e.length,a={};++n{"use strict";bb();Sue();xb();o(HWe,"basePickBy");uS=HWe});function YWe(t,e){if(t==null)return{};var r=fo(IE(t),function(n){return[n]});return e=Ln(e),uS(t,r,function(n,i){return e(n,i[0])})}var go,Cue=O(()=>{"use strict";w0();Rs();EI();JM();o(YWe,"pickBy");go=YWe});function jWe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var Aue,_ue=O(()=>{"use strict";o(jWe,"baseSortBy");Aue=jWe});function XWe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=Ho(t),s=e!==void 0,l=e===null,u=e===e,h=Ho(e);if(!l&&!h&&!a&&t>e||a&&s&&u&&!l&&!h||n&&s&&u||!r&&u||!i)return 1;if(!n&&!a&&!h&&t{"use strict";T0();o(XWe,"compareAscending");Due=XWe});function KWe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,l=r.length;++n=l)return u;var h=r[n];return u*(h=="desc"?-1:1)}}return t.index-e.index}var Lue,Nue=O(()=>{"use strict";Rue();o(KWe,"compareMultiple");Lue=KWe});function QWe(t,e,r){e.length?e=fo(e,function(a){return zt(a)?function(s){return rd(s,a.length===1?a[0]:a)}:a}):e=[va];var n=-1;e=fo(e,Tl(Ln));var i=iS(t,function(a,s,l){var u=fo(e,function(h){return h(a)});return{criteria:u,index:++n,value:a}});return Aue(i,function(a,s){return Lue(a,s,r)})}var Mue,Iue=O(()=>{"use strict";w0();bb();Rs();gI();_ue();u0();Nue();Eh();oi();o(QWe,"baseOrderBy");Mue=QWe});var ZWe,Oue,Pue=O(()=>{"use strict";fI();ZWe=QE("length"),Oue=ZWe});function uHe(t){for(var e=Bue.lastIndex=0;Bue.test(t);)++e;return e}var Fue,JWe,eHe,tHe,rHe,nHe,iHe,SI,CI,aHe,$ue,zue,Gue,sHe,Vue,que,oHe,lHe,cHe,Bue,Uue,Wue=O(()=>{"use strict";Fue="\\ud800-\\udfff",JWe="\\u0300-\\u036f",eHe="\\ufe20-\\ufe2f",tHe="\\u20d0-\\u20ff",rHe=JWe+eHe+tHe,nHe="\\ufe0e\\ufe0f",iHe="["+Fue+"]",SI="["+rHe+"]",CI="\\ud83c[\\udffb-\\udfff]",aHe="(?:"+SI+"|"+CI+")",$ue="[^"+Fue+"]",zue="(?:\\ud83c[\\udde6-\\uddff]){2}",Gue="[\\ud800-\\udbff][\\udc00-\\udfff]",sHe="\\u200d",Vue=aHe+"?",que="["+nHe+"]?",oHe="(?:"+sHe+"(?:"+[$ue,zue,Gue].join("|")+")"+que+Vue+")*",lHe=que+Vue+oHe,cHe="(?:"+[$ue+SI+"?",SI,zue,Gue,iHe].join("|")+")",Bue=RegExp(CI+"(?="+CI+")|"+cHe+lHe,"g");o(uHe,"unicodeSize");Uue=uHe});function hHe(t){return rle(t)?Uue(t):Oue(t)}var Hue,Yue=O(()=>{"use strict";Pue();nle();Wue();o(hHe,"stringSize");Hue=hHe});function fHe(t,e){return uS(t,e,function(r,n){return KE(t,n)})}var jue,Xue=O(()=>{"use strict";EI();hI();o(fHe,"basePick");jue=fHe});var dHe,A0,Kue=O(()=>{"use strict";Xue();tle();dHe=ele(function(t,e){return t==null?{}:jue(t,e)}),A0=dHe});function gHe(t,e,r,n){for(var i=-1,a=mHe(pHe((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var pHe,mHe,Que,Zue=O(()=>{"use strict";pHe=Math.ceil,mHe=Math.max;o(gHe,"baseRange");Que=gHe});function yHe(t){return function(e,r,n){return n&&typeof n!="number"&&qo(e,r,n)&&(r=n=void 0),e=v1(e),r===void 0?(r=e,e=0):r=v1(r),n=n===void 0?e{"use strict";Zue();f0();VM();o(yHe,"createRange");Jue=yHe});var vHe,_l,the=O(()=>{"use strict";ehe();vHe=Jue(),_l=vHe});function xHe(t,e,r,n,i){return i(t,function(a,s,l){r=n?(n=!1,a):e(r,a,s,l)}),r}var rhe,nhe=O(()=>{"use strict";o(xHe,"baseReduce");rhe=xHe});function bHe(t,e,r){var n=zt(t)?ile:rhe,i=arguments.length<3;return n(t,Ln(e,4),r,i,po)}var pn,AI=O(()=>{"use strict";ale();id();Rs();nhe();oi();o(bHe,"reduce");pn=bHe});function THe(t,e){var r=zt(t)?C1:nS;return r(t,wue(Ln(e,3)))}var od,ihe=O(()=>{"use strict";DE();pI();Rs();oi();kue();o(THe,"reject");od=THe});function EHe(t){if(t==null)return 0;if(Li(t))return Bi(t)?Hue(t):t.length;var e=Yo(t);return e==wHe||e==kHe?t.size:T1(t).length}var wHe,kHe,_I,ahe=O(()=>{"use strict";kE();E0();bl();aS();Yue();wHe="[object Map]",kHe="[object Set]";o(EHe,"size");_I=EHe});function SHe(t,e){var r;return po(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var she,ohe=O(()=>{"use strict";id();o(SHe,"baseSome");she=SHe});function CHe(t,e,r){var n=zt(t)?GE:she;return r&&qo(t,e,r)&&(e=void 0),n(t,Ln(e,3))}var wb,lhe=O(()=>{"use strict";iI();Rs();ohe();oi();f0();o(CHe,"some");wb=CHe});var AHe,bu,che=O(()=>{"use strict";S1();Iue();l1();f0();AHe=uu(function(t,e){if(t==null)return[];var r=e.length;return r>1&&qo(t,e[0],e[1])?e=[]:r>2&&qo(e[0],e[1],e[2])&&(e=[e[0]]),Mue(t,vu(e,1),[])}),bu=AHe});var _He,DHe,uhe,hhe=O(()=>{"use strict";eI();qM();UE();_He=1/0,DHe=nd&&1/R1(new nd([,-0]))[1]==_He?function(t){return new nd(t)}:ki,uhe=DHe});function LHe(t,e,r){var n=-1,i=wE,a=t.length,s=!0,l=[],u=l;if(r)s=!1,i=eS;else if(a>=RHe){var h=e?null:uhe(t);if(h)return R1(h);s=!1,i=D1,u=new _1}else u=e?[]:l;e:for(;++n{"use strict";zE();HM();dI();VE();hhe();UE();RHe=200;o(LHe,"baseUniq");O1=LHe});var NHe,DI,fhe=O(()=>{"use strict";S1();l1();hS();Tk();NHe=uu(function(t){return O1(vu(t,1,c0,!0))}),DI=NHe});function MHe(t){return t&&t.length?O1(t):[]}var P1,dhe=O(()=>{"use strict";hS();o(MHe,"uniq");P1=MHe});function IHe(t,e){return t&&t.length?O1(t,Ln(e,2)):[]}var phe,mhe=O(()=>{"use strict";Rs();hS();o(IHe,"uniqBy");phe=IHe});function PHe(t){var e=++OHe;return SE(t)+e}var OHe,_0,ghe=O(()=>{"use strict";YM();OHe=0;o(PHe,"uniqueId");_0=PHe});function BHe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{"use strict";o(BHe,"baseZipObject");yhe=BHe});function FHe(t,e){return yhe(t||[],e||[],cu)}var fS,xhe=O(()=>{"use strict";o1();vhe();o(FHe,"zipObject");fS=FHe});var rr=O(()=>{"use strict";qoe();rI();Yle();jle();wN();Pce();$ce();Gce();Vce();qce();jce();mI();Jce();tue();yI();AE();rS();rue();nue();iue();cue();Eh();fue();due();oi();oS();zx();Vo();yue();aS();vue();gu();zce();M1();xue();bue();SN();kI();Tue();qM();Ice();Kue();Cue();the();AI();ihe();ahe();lhe();che();fhe();dhe();ghe();TI();xhe();});function The(t,e){t[e]?t[e]++:t[e]=1}function whe(t,e){--t[e]||delete t[e]}function kb(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+bhe+a+bhe+(Dr(n)?$He:n)}function zHe(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var l={v:i,w:a};return n&&(l.name=n),l}function RI(t,e){return kb(t,e.v,e.w,e.name)}var $He,D0,bhe,wn,dS=O(()=>{"use strict";rr();$He="\0",D0="\0",bhe="",wn=class{static{o(this,"Graph")}constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=io(void 0),this._defaultEdgeLabelFn=io(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[D0]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return Vi(e)||(e=io(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return nn(this._nodes)}sources(){var e=this;return dn(this.nodes(),function(r){return Er(e._in[r])})}sinks(){var e=this;return dn(this.nodes(),function(r){return Er(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Oe(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=D0,this._children[e]={},this._children[D0][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=o(n=>this.removeEdge(this._edgeObjs[n]),"removeEdge");delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Oe(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Oe(nn(this._in[e]),r),delete this._in[e],delete this._preds[e],Oe(nn(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(Dr(r))r=D0;else{r+="";for(var n=r;!Dr(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==D0)return r}}children(e){if(Dr(e)&&(e=D0),this._isCompound){var r=this._children[e];if(r)return nn(r)}else{if(e===D0)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return nn(r)}successors(e){var r=this._sucs[e];if(r)return nn(r)}neighbors(e){var r=this.predecessors(e);if(r)return DI(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Oe(this._nodes,function(s,l){e(l)&&r.setNode(l,s)}),Oe(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var l=n.parent(s);return l===void 0||r.hasNode(l)?(i[s]=l,l):l in i?i[l]:a(l)}return o(a,"findParent"),this._isCompound&&Oe(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return Vi(e)||(e=io(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return Gr(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return pn(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,Dr(n)||(n=""+n);var l=kb(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,l))return a&&(this._edgeLabels[l]=i),this;if(!Dr(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[l]=a?i:this._defaultEdgeLabelFn(e,r,n);var u=zHe(this._isDirected,e,r,n);return e=u.v,r=u.w,Object.freeze(u),this._edgeObjs[l]=u,The(this._preds[r],e),The(this._sucs[e],r),this._in[r][l]=u,this._out[e][l]=u,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?RI(this._isDirected,arguments[0]):kb(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?RI(this._isDirected,arguments[0]):kb(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?RI(this._isDirected,arguments[0]):kb(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],whe(this._preds[r],e),whe(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=Gr(n);return r?dn(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=Gr(n);return r?dn(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};wn.prototype._nodeCount=0;wn.prototype._edgeCount=0;o(The,"incrementOrInitEntry");o(whe,"decrementOrRemoveEntry");o(kb,"edgeArgsToId");o(zHe,"edgeArgsToObj");o(RI,"edgeObjToId")});var Dl=O(()=>{"use strict";dS()});function khe(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function GHe(t,e){if(t!=="_next"&&t!=="_prev")return e}var mS,Ehe=O(()=>{"use strict";mS=class{static{o(this,"List")}constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return khe(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&khe(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,GHe)),n=n._prev;return"["+e.join(", ")+"]"}};o(khe,"unlink");o(GHe,"filterOutLinks")});function She(t,e){if(t.nodeCount()<=1)return[];var r=UHe(t,e||VHe),n=qHe(r.graph,r.buckets,r.zeroIdx);return fn(lt(n,function(i){return t.outEdges(i.v,i.w)}))}function qHe(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)LI(t,e,r,s);for(;s=i.dequeue();)LI(t,e,r,s);if(t.nodeCount()){for(var l=e.length-2;l>0;--l)if(s=e[l].dequeue(),s){n=n.concat(LI(t,e,r,s,!0));break}}}return n}function LI(t,e,r,n,i){var a=i?[]:void 0;return Oe(t.inEdges(n.v),function(s){var l=t.edge(s),u=t.node(s.v);i&&a.push({v:s.v,w:s.w}),u.out-=l,NI(e,r,u)}),Oe(t.outEdges(n.v),function(s){var l=t.edge(s),u=s.w,h=t.node(u);h.in-=l,NI(e,r,h)}),t.removeNode(n.v),a}function UHe(t,e){var r=new wn,n=0,i=0;Oe(t.nodes(),function(l){r.setNode(l,{v:l,in:0,out:0})}),Oe(t.edges(),function(l){var u=r.edge(l.v,l.w)||0,h=e(l),f=u+h;r.setEdge(l.v,l.w,f),i=Math.max(i,r.node(l.v).out+=h),n=Math.max(n,r.node(l.w).in+=h)});var a=_l(i+n+3).map(function(){return new mS}),s=n+1;return Oe(r.nodes(),function(l){NI(a,s,r.node(l))}),{graph:r,buckets:a,zeroIdx:s}}function NI(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var VHe,Che=O(()=>{"use strict";rr();Dl();Ehe();VHe=io(1);o(She,"greedyFAS");o(qHe,"doGreedyFAS");o(LI,"removeNode");o(UHe,"buildState");o(NI,"assignBucket")});function Ahe(t){var e=t.graph().acyclicer==="greedy"?She(t,r(t)):WHe(t);Oe(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,_0("rev"))});function r(n){return function(i){return n.edge(i).weight}}o(r,"weightFn")}function WHe(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Oe(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return o(i,"dfs"),Oe(t.nodes(),i),e}function _he(t){Oe(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var MI=O(()=>{"use strict";rr();Che();o(Ahe,"run");o(WHe,"dfsFAS");o(_he,"undo")});function Tu(t,e,r,n){var i;do i=_0(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function Rhe(t){var e=new wn().setGraph(t.graph());return Oe(t.nodes(),function(r){e.setNode(r,t.node(r))}),Oe(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function gS(t){var e=new wn({multigraph:t.isMultigraph()}).setGraph(t.graph());return Oe(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Oe(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function II(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=l*i/a,h=l):(i<0&&(s=-s),u=s,h=s*a/i),{x:r+u,y:n+h}}function ld(t){var e=lt(_l(PI(t)+1),function(){return[]});return Oe(t.nodes(),function(r){var n=t.node(r),i=n.rank;Dr(i)||(e[i][n.order]=r)}),e}function Lhe(t){var e=vc(lt(t.nodes(),function(r){return t.node(r).rank}));Oe(t.nodes(),function(r){var n=t.node(r);Gt(n,"rank")&&(n.rank-=e)})}function Nhe(t){var e=vc(lt(t.nodes(),function(a){return t.node(a).rank})),r=[];Oe(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Oe(r,function(a,s){Dr(a)&&s%i!==0?--n:n&&Oe(a,function(l){t.node(l).rank+=n})})}function OI(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),Tu(t,"border",i,e)}function PI(t){return mo(lt(t.nodes(),function(e){var r=t.node(e).rank;if(!Dr(r))return r}))}function Mhe(t,e){var r={lhs:[],rhs:[]};return Oe(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function Ihe(t,e){var r=JE();try{return e()}finally{console.log(t+" time: "+(JE()-r)+"ms")}}function Ohe(t,e){return e()}var wu=O(()=>{"use strict";rr();Dl();o(Tu,"addDummyNode");o(Rhe,"simplify");o(gS,"asNonCompoundGraph");o(II,"intersectRect");o(ld,"buildLayerMatrix");o(Lhe,"normalizeRanks");o(Nhe,"removeEmptyRanks");o(OI,"addBorderNode");o(PI,"maxRank");o(Mhe,"partition");o(Ihe,"time");o(Ohe,"notime")});function Bhe(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Oe(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{"use strict";rr();wu();o(Bhe,"addBorderSegments");o(Phe,"addBorderNode")});function zhe(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&Vhe(t)}function Ghe(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&HHe(t),(e==="lr"||e==="rl")&&(YHe(t),Vhe(t))}function Vhe(t){Oe(t.nodes(),function(e){$he(t.node(e))}),Oe(t.edges(),function(e){$he(t.edge(e))})}function $he(t){var e=t.width;t.width=t.height,t.height=e}function HHe(t){Oe(t.nodes(),function(e){BI(t.node(e))}),Oe(t.edges(),function(e){var r=t.edge(e);Oe(r.points,BI),Object.prototype.hasOwnProperty.call(r,"y")&&BI(r)})}function BI(t){t.y=-t.y}function YHe(t){Oe(t.nodes(),function(e){FI(t.node(e))}),Oe(t.edges(),function(e){var r=t.edge(e);Oe(r.points,FI),Object.prototype.hasOwnProperty.call(r,"x")&&FI(r)})}function FI(t){var e=t.x;t.x=t.y,t.y=e}var qhe=O(()=>{"use strict";rr();o(zhe,"adjust");o(Ghe,"undo");o(Vhe,"swapWidthHeight");o($he,"swapWidthHeightOne");o(HHe,"reverseY");o(BI,"reverseYOne");o(YHe,"swapXY");o(FI,"swapXYOne")});function Uhe(t){t.graph().dummyChains=[],Oe(t.edges(),function(e){XHe(t,e)})}function XHe(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,l=t.edge(e),u=l.labelRank;if(a!==n+1){t.removeEdge(e);var h=void 0,f,d;for(d=0,++n;n{"use strict";rr();wu();o(Uhe,"run");o(XHe,"normalizeEdge");o(Whe,"undo")});function Eb(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=vc(lt(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}o(r,"dfs"),Oe(t.sources(),r)}function R0(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var yS=O(()=>{"use strict";rr();o(Eb,"longestPath");o(R0,"slack")});function vS(t){var e=new wn({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;KHe(e,t){"use strict";rr();Dl();yS();o(vS,"feasibleTree");o(KHe,"tightTree");o(QHe,"findMinSlackEdge");o(ZHe,"shiftRanks")});var Yhe=O(()=>{"use strict"});var GI=O(()=>{"use strict"});var msr,VI=O(()=>{"use strict";rr();GI();msr=io(1)});var jhe=O(()=>{"use strict";VI()});var qI=O(()=>{"use strict"});var Xhe=O(()=>{"use strict";qI()});var Csr,Khe=O(()=>{"use strict";rr();Csr=io(1)});function UI(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new Sb;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Oe(t.predecessors(a),i),delete r[a],n.push(a))}if(o(i,"visit"),Oe(t.sinks(),i),_I(e)!==t.nodeCount())throw new Sb;return n}function Sb(){}var WI=O(()=>{"use strict";rr();UI.CycleException=Sb;o(UI,"topsort");o(Sb,"CycleException");Sb.prototype=new Error});var Qhe=O(()=>{"use strict";WI()});function xS(t,e,r){zt(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Oe(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);Zhe(t,s,r==="post",a,n,i)}),i}function Zhe(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Oe(i(e),function(s){Zhe(t,s,r,n,i,a)}),r&&a.push(e))}var HI=O(()=>{"use strict";rr();o(xS,"dfs");o(Zhe,"doDfs")});function YI(t,e){return xS(t,e,"post")}var Jhe=O(()=>{"use strict";HI();o(YI,"postorder")});function jI(t,e){return xS(t,e,"pre")}var efe=O(()=>{"use strict";HI();o(jI,"preorder")});var tfe=O(()=>{"use strict";GI();dS()});var rfe=O(()=>{"use strict";Yhe();VI();jhe();Xhe();Khe();Qhe();Jhe();efe();tfe();qI();WI()});function ud(t){t=Rhe(t),Eb(t);var e=vS(t);KI(e),XI(e,t);for(var r,n;r=sfe(e);)n=ofe(e,t,r),lfe(e,t,r,n)}function XI(t,e){var r=YI(t,t.nodes());r=r.slice(0,r.length-1),Oe(r,function(n){nYe(t,e,n)})}function nYe(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=ife(t,e,r)}function ife(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),l=0;return s||(a=!1,s=e.edge(i,r)),l=s.weight,Oe(e.nodeEdges(r),function(u){var h=u.v===r,f=h?u.w:u.v;if(f!==i){var d=h===a,p=e.edge(u).weight;if(l+=d?p:-p,aYe(t,r,f)){var m=t.edge(r,f).cutvalue;l+=d?-m:m}}}),l}function KI(t,e){arguments.length<2&&(e=t.nodes()[0]),afe(t,{},1,e)}function afe(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Oe(t.neighbors(n),function(l){Object.prototype.hasOwnProperty.call(e,l)||(r=afe(t,e,r,l,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function sfe(t){return Ls(t.edges(),function(e){return t.edge(e).cutvalue<0})}function ofe(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),l=a,u=!1;a.lim>s.lim&&(l=s,u=!0);var h=dn(e.edges(),function(f){return u===nfe(t,t.node(f.v),l)&&u!==nfe(t,t.node(f.w),l)});return C0(h,function(f){return R0(e,f)})}function lfe(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),KI(t),XI(t,e),iYe(t,e)}function iYe(t,e){var r=Ls(t.nodes(),function(i){return!e.node(i).parent}),n=jI(t,r);n=n.slice(1),Oe(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),l=!1;s||(s=e.edge(a,i),l=!0),e.node(i).rank=e.node(a).rank+(l?s.minlen:-s.minlen)})}function aYe(t,e,r){return t.hasEdge(e,r)}function nfe(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var cfe=O(()=>{"use strict";rr();rfe();wu();zI();yS();ud.initLowLimValues=KI;ud.initCutValues=XI;ud.calcCutValue=ife;ud.leaveEdge=sfe;ud.enterEdge=ofe;ud.exchangeEdges=lfe;o(ud,"networkSimplex");o(XI,"initCutValues");o(nYe,"assignCutValue");o(ife,"calcCutValue");o(KI,"initLowLimValues");o(afe,"dfsAssignLowLim");o(sfe,"leaveEdge");o(ofe,"enterEdge");o(lfe,"exchangeEdges");o(iYe,"updateRanks");o(aYe,"isTreeEdge");o(nfe,"isDescendant")});function QI(t){switch(t.graph().ranker){case"network-simplex":ufe(t);break;case"tight-tree":oYe(t);break;case"longest-path":sYe(t);break;default:ufe(t)}}function oYe(t){Eb(t),vS(t)}function ufe(t){ud(t)}var sYe,ZI=O(()=>{"use strict";zI();cfe();yS();o(QI,"rank");sYe=Eb;o(oYe,"tightTreeRanker");o(ufe,"networkSimplexRanker")});function hfe(t){var e=Tu(t,"root",{},"_root"),r=lYe(t),n=mo(Gr(r))-1,i=2*n+1;t.graph().nestingRoot=e,Oe(t.edges(),function(s){t.edge(s).minlen*=i});var a=cYe(t)+1;Oe(t.children(),function(s){ffe(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function ffe(t,e,r,n,i,a,s){var l=t.children(s);if(!l.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var u=OI(t,"_bt"),h=OI(t,"_bb"),f=t.node(s);t.setParent(u,s),f.borderTop=u,t.setParent(h,s),f.borderBottom=h,Oe(l,function(d){ffe(t,e,r,n,i,a,d);var p=t.node(d),m=p.borderTop?p.borderTop:d,g=p.borderBottom?p.borderBottom:d,y=p.borderTop?n:2*n,v=m!==g?1:i-a[s]+1;t.setEdge(u,m,{weight:y,minlen:v,nestingEdge:!0}),t.setEdge(g,h,{weight:y,minlen:v,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,u,{weight:0,minlen:i+a[s]})}function lYe(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Oe(a,function(s){r(s,i+1)}),e[n]=i}return o(r,"dfs"),Oe(t.children(),function(n){r(n,1)}),e}function cYe(t){return pn(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function dfe(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Oe(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var pfe=O(()=>{"use strict";rr();wu();o(hfe,"run");o(ffe,"dfs");o(lYe,"treeDepths");o(cYe,"sumWeights");o(dfe,"cleanup")});function mfe(t,e,r){var n={},i;Oe(r,function(a){for(var s=t.parent(a),l,u;s;){if(l=t.parent(s),l?(u=n[l],n[l]=s):(u=i,i=s),u&&u!==s){e.setEdge(u,s);return}s=l}})}var gfe=O(()=>{"use strict";rr();o(mfe,"addSubgraphConstraints")});function yfe(t,e,r){var n=hYe(t),i=new wn({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Oe(t.nodes(),function(a){var s=t.node(a),l=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,l||n),Oe(t[r](a),function(u){var h=u.v===a?u.w:u.v,f=i.edge(h,a),d=Dr(f)?0:f.weight;i.setEdge(h,a,{weight:t.edge(u).weight+d})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function hYe(t){for(var e;t.hasNode(e=_0("_root")););return e}var vfe=O(()=>{"use strict";rr();Dl();o(yfe,"buildLayerGraph");o(hYe,"createRootNode")});function xfe(t,e){for(var r=0,n=1;n0;)f%2&&(d+=l[f+1]),f=f-1>>1,l[f]+=h.weight;u+=h.weight*d})),u}var bfe=O(()=>{"use strict";rr();o(xfe,"crossCount");o(fYe,"twoLayerCrossCount")});function Tfe(t){var e={},r=dn(t.nodes(),function(l){return!t.children(l).length}),n=mo(lt(r,function(l){return t.node(l).rank})),i=lt(_l(n+1),function(){return[]});function a(l){if(!Gt(e,l)){e[l]=!0;var u=t.node(l);i[u.rank].push(l),Oe(t.successors(l),a)}}o(a,"dfs");var s=bu(r,function(l){return t.node(l).rank});return Oe(s,a),i}var wfe=O(()=>{"use strict";rr();o(Tfe,"initOrder")});function kfe(t,e){return lt(e,function(r){var n=t.inEdges(r);if(n.length){var i=pn(n,function(a,s){var l=t.edge(s),u=t.node(s.v);return{sum:a.sum+l.weight*u.order,weight:a.weight+l.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var Efe=O(()=>{"use strict";rr();o(kfe,"barycenter")});function Sfe(t,e){var r={};Oe(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};Dr(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Oe(e.edges(),function(i){var a=r[i.v],s=r[i.w];!Dr(a)&&!Dr(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=dn(r,function(i){return!i.indegree});return dYe(n)}function dYe(t){var e=[];function r(a){return function(s){s.merged||(Dr(s.barycenter)||Dr(a.barycenter)||s.barycenter>=a.barycenter)&&pYe(a,s)}}o(r,"handleIn");function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(o(n,"handleOut");t.length;){var i=t.pop();e.push(i),Oe(i.in.reverse(),r(i)),Oe(i.out,n(i))}return lt(dn(e,function(a){return!a.merged}),function(a){return A0(a,["vs","i","barycenter","weight"])})}function pYe(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var Cfe=O(()=>{"use strict";rr();o(Sfe,"resolveConflicts");o(dYe,"doResolveConflicts");o(pYe,"mergeEntries")});function _fe(t,e){var r=Mhe(t,function(f){return Object.prototype.hasOwnProperty.call(f,"barycenter")}),n=r.lhs,i=bu(r.rhs,function(f){return-f.i}),a=[],s=0,l=0,u=0;n.sort(mYe(!!e)),u=Afe(a,i,u),Oe(n,function(f){u+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,l+=f.weight,u=Afe(a,i,u)});var h={vs:fn(a)};return l&&(h.barycenter=s/l,h.weight=l),h}function Afe(t,e,r){for(var n;e.length&&(n=ba(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function mYe(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var Dfe=O(()=>{"use strict";rr();wu();o(_fe,"sort");o(Afe,"consumeUnsortable");o(mYe,"compareWithBias")});function JI(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,l=a?a.borderRight:void 0,u={};s&&(i=dn(i,function(g){return g!==s&&g!==l}));var h=kfe(t,i);Oe(h,function(g){if(t.children(g.v).length){var y=JI(t,g.v,r,n);u[g.v]=y,Object.prototype.hasOwnProperty.call(y,"barycenter")&&yYe(g,y)}});var f=Sfe(h,r);gYe(f,u);var d=_fe(f,n);if(s&&(d.vs=fn([s,d.vs,l]),t.predecessors(s).length)){var p=t.node(t.predecessors(s)[0]),m=t.node(t.predecessors(l)[0]);Object.prototype.hasOwnProperty.call(d,"barycenter")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+p.order+m.order)/(d.weight+2),d.weight+=2}return d}function gYe(t,e){Oe(t,function(r){r.vs=fn(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function yYe(t,e){Dr(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var Rfe=O(()=>{"use strict";rr();Efe();Cfe();Dfe();o(JI,"sortSubgraph");o(gYe,"expandSubgraphs");o(yYe,"mergeBarycenters")});function Mfe(t){var e=PI(t),r=Lfe(t,_l(1,e+1),"inEdges"),n=Lfe(t,_l(e-1,-1,-1),"outEdges"),i=Tfe(t);Nfe(t,i);for(var a=Number.POSITIVE_INFINITY,s,l=0,u=0;u<4;++l,++u){vYe(l%2?r:n,l%4>=2),i=ld(t);var h=xfe(t,i);h{"use strict";rr();Dl();wu();gfe();vfe();bfe();wfe();Rfe();o(Mfe,"order");o(Lfe,"buildLayerGraphs");o(vYe,"sweepLayerGraphs");o(Nfe,"assignOrder")});function Ofe(t){var e=bYe(t);Oe(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=xYe(t,e,i.v,i.w),s=a.path,l=a.lca,u=0,h=s[u],f=!0;r!==i.w;){if(n=t.node(r),f){for(;(h=s[u])!==l&&t.node(h).maxRanks||l>e[u].lim));for(h=u,u=n;(u=t.parent(u))!==h;)a.push(u);return{path:i.concat(a.reverse()),lca:h}}function bYe(t){var e={},r=0;function n(i){var a=r;Oe(t.children(i),n),e[i]={low:a,lim:r++}}return o(n,"dfs"),Oe(t.children(),n),e}var Pfe=O(()=>{"use strict";rr();o(Ofe,"parentDummyChains");o(xYe,"findPath");o(bYe,"postorder")});function TYe(t,e){var r={};function n(i,a){var s=0,l=0,u=i.length,h=ba(a);return Oe(a,function(f,d){var p=kYe(t,f),m=p?t.node(p).order:u;(p||f===h)&&(Oe(a.slice(l,d+1),function(g){Oe(t.predecessors(g),function(y){var v=t.node(y),x=v.order;(xh)&&Bfe(r,p,f)})})}o(n,"scan");function i(a,s){var l=-1,u,h=0;return Oe(s,function(f,d){if(t.node(f).dummy==="border"){var p=t.predecessors(f);p.length&&(u=t.node(p[0]).order,n(s,h,d,l,u),h=d,l=u)}n(s,h,s.length,u,a.length)}),s}return o(i,"visitLayer"),pn(e,i),r}function kYe(t,e){if(t.node(e).dummy)return Ls(t.predecessors(e),function(r){return t.node(r).dummy})}function Bfe(t,e,r){if(e>r){var n=e;e=r,r=n}Object.prototype.hasOwnProperty.call(t,e)||Object.defineProperty(t,e,{enumerable:!0,configurable:!0,value:{},writable:!0});var i=t[e];Object.defineProperty(i,r,{enumerable:!0,configurable:!0,value:!0,writable:!0})}function EYe(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function SYe(t,e,r,n){var i={},a={},s={};return Oe(e,function(l){Oe(l,function(u,h){i[u]=u,a[u]=u,s[u]=h})}),Oe(e,function(l){var u=-1;Oe(l,function(h){var f=n(h);if(f.length){f=bu(f,function(y){return s[y]});for(var d=(f.length-1)/2,p=Math.floor(d),m=Math.ceil(d);p<=m;++p){var g=f[p];a[h]===h&&u{"use strict";rr();Dl();wu();o(TYe,"findType1Conflicts");o(wYe,"findType2Conflicts");o(kYe,"findOtherInnerSegmentNode");o(Bfe,"addConflict");o(EYe,"hasConflict");o(SYe,"verticalAlignment");o(CYe,"horizontalCompaction");o(AYe,"buildBlockGraph");o(_Ye,"findSmallestWidthAlignment");o(DYe,"alignCoordinates");o(RYe,"balance");o(Ffe,"positionX");o(LYe,"sep");o(NYe,"width")});function zfe(t){t=gS(t),MYe(t),xI(Ffe(t),function(e,r){t.node(r).x=e})}function MYe(t){var e=ld(t),r=t.graph().ranksep,n=0;Oe(e,function(i){var a=mo(lt(i,function(s){return t.node(s).height}));Oe(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var Gfe=O(()=>{"use strict";rr();wu();$fe();o(zfe,"position");o(MYe,"positionY")});function Cb(t,e){var r=e&&e.debugTiming?Ihe:Ohe;r("layout",()=>{var n=r(" buildLayoutGraph",()=>UYe(t));r(" runLayout",()=>IYe(n,r)),r(" updateInputGraph",()=>OYe(t,n))})}function IYe(t,e){e(" makeSpaceForEdgeLabels",()=>WYe(t)),e(" removeSelfEdges",()=>eje(t)),e(" acyclic",()=>Ahe(t)),e(" nestingGraph.run",()=>hfe(t)),e(" rank",()=>QI(gS(t))),e(" injectEdgeLabelProxies",()=>HYe(t)),e(" removeEmptyRanks",()=>Nhe(t)),e(" nestingGraph.cleanup",()=>dfe(t)),e(" normalizeRanks",()=>Lhe(t)),e(" assignRankMinMax",()=>YYe(t)),e(" removeEdgeLabelProxies",()=>jYe(t)),e(" normalize.run",()=>Uhe(t)),e(" parentDummyChains",()=>Ofe(t)),e(" addBorderSegments",()=>Bhe(t)),e(" order",()=>Mfe(t)),e(" insertSelfEdges",()=>tje(t)),e(" adjustCoordinateSystem",()=>zhe(t)),e(" position",()=>zfe(t)),e(" positionSelfEdges",()=>rje(t)),e(" removeBorderNodes",()=>JYe(t)),e(" normalize.undo",()=>Whe(t)),e(" fixupEdgeLabelCoords",()=>QYe(t)),e(" undoCoordinateSystem",()=>Ghe(t)),e(" translateGraph",()=>XYe(t)),e(" assignNodeIntersects",()=>KYe(t)),e(" reversePoints",()=>ZYe(t)),e(" acyclic.undo",()=>_he(t))}function OYe(t,e){Oe(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Oe(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function UYe(t){var e=new wn({multigraph:!0,compound:!0}),r=tO(t.graph());return e.setGraph(Hf({},BYe,eO(r,PYe),A0(r,FYe))),Oe(t.nodes(),function(n){var i=tO(t.node(n));e.setNode(n,ad(eO(i,$Ye),zYe)),e.setParent(n,t.parent(n))}),Oe(t.edges(),function(n){var i=tO(t.edge(n));e.setEdge(n,Hf({},VYe,eO(i,GYe),A0(i,qYe)))}),e}function WYe(t){var e=t.graph();e.ranksep/=2,Oe(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function HYe(t){Oe(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};Tu(t,"edge-proxy",a,"_ep")}})}function YYe(t){var e=0;Oe(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=mo(e,n.maxRank))}),t.graph().maxRank=e}function jYe(t){Oe(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function XYe(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,l=a.marginy||0;function u(h){var f=h.x,d=h.y,p=h.width,m=h.height;e=Math.min(e,f-p/2),r=Math.max(r,f+p/2),n=Math.min(n,d-m/2),i=Math.max(i,d+m/2)}o(u,"getExtremes"),Oe(t.nodes(),function(h){u(t.node(h))}),Oe(t.edges(),function(h){var f=t.edge(h);Object.prototype.hasOwnProperty.call(f,"x")&&u(f)}),e-=s,n-=l,Oe(t.nodes(),function(h){var f=t.node(h);f.x-=e,f.y-=n}),Oe(t.edges(),function(h){var f=t.edge(h);Oe(f.points,function(d){d.x-=e,d.y-=n}),Object.prototype.hasOwnProperty.call(f,"x")&&(f.x-=e),Object.prototype.hasOwnProperty.call(f,"y")&&(f.y-=n)}),a.width=r-e+s,a.height=i-n+l}function KYe(t){Oe(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(II(n,a)),r.points.push(II(i,s))})}function QYe(t){Oe(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function ZYe(t){Oe(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function JYe(t){Oe(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(ba(r.borderLeft)),s=t.node(ba(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Oe(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function eje(t){Oe(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function tje(t){var e=ld(t);Oe(e,function(r){var n=0;Oe(r,function(i,a){var s=t.node(i);s.order=a+n,Oe(s.selfEdges,function(l){Tu(t,"selfedge",{width:l.label.width,height:l.label.height,rank:s.rank,order:a+ ++n,e:l.e,label:l.label},"_se")}),delete s.selfEdges})})}function rje(t){Oe(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,l=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-l},{x:i+5*s/6,y:a-l},{x:i+s,y:a},{x:i+5*s/6,y:a+l},{x:i+2*s/3,y:a+l}],r.label.x=r.x,r.label.y=r.y}})}function eO(t,e){return S0(A0(t,e),Number)}function tO(t){var e={};return Oe(t,function(r,n){e[n.toLowerCase()]=r}),e}var PYe,BYe,FYe,$Ye,zYe,GYe,VYe,qYe,Vfe=O(()=>{"use strict";rr();Dl();Fhe();qhe();MI();$I();ZI();pfe();Ife();Pfe();Gfe();wu();o(Cb,"layout");o(IYe,"runLayout");o(OYe,"updateInputGraph");PYe=["nodesep","edgesep","ranksep","marginx","marginy"],BYe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},FYe=["acyclicer","ranker","rankdir","align"],$Ye=["width","height"],zYe={width:0,height:0},GYe=["minlen","weight","width","height","labeloffset"],VYe={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},qYe=["labelpos"];o(UYe,"buildLayoutGraph");o(WYe,"makeSpaceForEdgeLabels");o(HYe,"injectEdgeLabelProxies");o(YYe,"assignRankMinMax");o(jYe,"removeEdgeLabelProxies");o(XYe,"translateGraph");o(KYe,"assignNodeIntersects");o(QYe,"fixupEdgeLabelCoords");o(ZYe,"reversePointsForReversedEdges");o(JYe,"removeBorderNodes");o(eje,"removeSelfEdges");o(tje,"insertSelfEdges");o(rje,"positionSelfEdges");o(eO,"selectNumberAttrs");o(tO,"canonicalize")});var rO=O(()=>{"use strict";MI();Vfe();$I();ZI()});function Rl(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:nje(t),edges:ije(t)};return Dr(t.graph())||(e.value=Tn(t.graph())),e}function nje(t){return lt(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return Dr(r)||(i.value=r),Dr(n)||(i.parent=n),i})}function ije(t){return lt(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return Dr(e.name)||(n.name=e.name),Dr(r)||(n.value=r),n})}var nO=O(()=>{"use strict";rr();dS();o(Rl,"write");o(nje,"writeNodes");o(ije,"writeEdges")});var Vr,L0,Wfe,Hfe,bS,aje,Yfe,jfe,sje,B1,Ufe,Xfe,Kfe,Qfe,Zfe,Jfe=O(()=>{"use strict";xt();Dl();nO();Vr=new Map,L0=new Map,Wfe=new Map,Hfe=o(()=>{L0.clear(),Wfe.clear(),Vr.clear()},"clear"),bS=o((t,e)=>{let r=L0.get(e)||[];return K.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),aje=o((t,e)=>{let r=L0.get(e)||[];return K.info("Descendants of ",e," is ",r),K.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||bS(t.v,e)||bS(t.w,e)||r.includes(t.w):(K.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),Yfe=o((t,e,r,n)=>{K.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),K.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)Yfe(a,e,r,n);else{let s=e.node(a);K.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(K.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(K.debug("Setting parent",a,t),r.setParent(a,t)):(K.info("In copy ",t,"root",n,"data",e.node(t),n),K.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let l=e.edges(a);K.debug("Copying Edges",l),l.forEach(u=>{K.info("Edge",u);let h=e.edge(u.v,u.w,u.name);K.info("Edge data",h,n);try{aje(u,n)?(K.info("Copying as ",u.v,u.w,h,u.name),r.setEdge(u.v,u.w,h,u.name),K.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):K.info("Skipping copy of edge ",u.v,"-->",u.w," rootId: ",n," clusterId:",t)}catch(f){K.error(f)}})}K.debug("Removing node",a),e.removeNode(a)})},"copy"),jfe=o((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)Wfe.set(i,t),n=[...n,...jfe(i,e)];return n},"extractDescendants"),sje=o((t,e,r)=>{let n=t.edges().filter(u=>u.v===e||u.w===e),i=t.edges().filter(u=>u.v===r||u.w===r),a=n.map(u=>({v:u.v===e?r:u.v,w:u.w===e?e:u.w})),s=i.map(u=>({v:u.v,w:u.w}));return a.filter(u=>s.some(h=>u.v===h.v&&u.w===h.w))},"findCommonEdges"),B1=o((t,e,r)=>{let n=e.children(t);if(K.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=B1(a,e,r),l=sje(e,r,s);if(s)if(l.length>0)i=s;else return s}return i},"findNonClusterChild"),Ufe=o(t=>!Vr.has(t)||!Vr.get(t).externalConnections?t:Vr.has(t)?Vr.get(t).id:t,"getAnchorId"),Xfe=o((t,e)=>{if(!t||e>10){K.debug("Opting out, no graph ");return}else K.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(K.warn("Cluster identified",r," Replacement id in edges: ",B1(r,t,r)),L0.set(r,jfe(r,t)),Vr.set(r,{id:B1(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(K.debug("Cluster identified",r,L0),i.forEach(a=>{let s=bS(a.v,r),l=bS(a.w,r);s^l&&(K.warn("Edge: ",a," leaves cluster ",r),K.warn("Descendants of XXX ",r,": ",L0.get(r)),Vr.get(r).externalConnections=!0)})):K.debug("Not a cluster ",r,L0)});for(let r of Vr.keys()){let n=Vr.get(r).id,i=t.parent(n);i!==r&&Vr.has(i)&&!Vr.get(i).externalConnections&&(Vr.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);K.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),K.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(K.warn("Fix XXX",Vr,"ids:",r.v,r.w,"Translating: ",Vr.get(r.v)," --- ",Vr.get(r.w)),Vr.get(r.v)||Vr.get(r.w)){if(K.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=Ufe(r.v),a=Ufe(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);Vr.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);Vr.get(s).externalConnections=!0,n.toCluster=r.w}K.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),K.warn("Adjusted Graph",Rl(t)),Kfe(t,0),K.trace(Vr)},"adjustClustersAndEdges"),Kfe=o((t,e)=>{if(K.warn("extractor - ",e,Rl(t),t.children("D")),e>10){K.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){K.debug("Done, no node has children",t.nodes());return}K.debug("Nodes = ",r,e);for(let i of r)if(K.debug("Extracting node",i,Vr,Vr.has(i)&&!Vr.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!Vr.has(i))K.debug("Not a cluster",i,e);else if(!Vr.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){K.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";Vr.get(i)?.clusterData?.dir&&(s=Vr.get(i).clusterData.dir,K.warn("Fixing dir",Vr.get(i).clusterData.dir,s));let l=new wn({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});K.warn("Old graph before copy",Rl(t)),Yfe(i,t,l,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:Vr.get(i).clusterData,label:Vr.get(i).label,graph:l}),K.warn("New graph after copy node: (",i,")",Rl(l)),K.debug("Old graph after copy",Rl(t))}else K.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!Vr.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),K.debug(Vr);r=t.nodes(),K.warn("New list of nodes",r);for(let i of r){let a=t.node(i);K.warn(" Now next level",i,a),a?.clusterNode&&Kfe(a.graph,e+1)}},"extractor"),Qfe=o((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Qfe(t,i);r=[...r,...a]}),r},"sorter"),Zfe=o(t=>Qfe(t,t.children()),"sortNodesByHierarchy")});var tde={};vr(tde,{render:()=>oje});var ede,oje,rde=O(()=>{"use strict";rO();nO();Dl();GM();$t();Jfe();yE();oE();zM();xt();gb();jt();ede=o(async(t,e,r,n,i,a)=>{K.warn("Graph in recursive render:XAX",Rl(e),i);let s=e.graph().rankdir;K.trace("Dir in recursive render - dir:",s);let l=t.insert("g").attr("class","root");e.nodes()?K.info("Recursive render XXX",e.nodes()):K.info("No nodes found for",e),e.edges().length>0&&K.info("Recursive edges",e.edge(e.edges()[0]));let u=l.insert("g").attr("class","clusters"),h=l.insert("g").attr("class","edgePaths"),f=l.insert("g").attr("class","edgeLabels"),d=l.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(y){let v=e.node(y);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));K.trace(`Setting data for parent cluster XXX - Node.id = `,y,` - data=`,x.height,` -Parent cluster`,i.height),e.setNode(i.id,x),e.parent(y)||(K.trace("Setting parent",y,i.id),e.setParent(y,i.id,x))}if(K.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),v?.clusterNode){K.info("Cluster identified XBX",y,v.width,e.node(y));let{ranksep:x,nodesep:b}=e.graph();v.graph.setGraph({...v.graph.graph(),ranksep:x+25,nodesep:b});let T=await ede(d,v.graph,r,n,e.node(y),a),E=T.elem;rt(v,E),v.diff=T.diff||0,K.info("New compound node after recursive render XAX",y,"width",v.width,"height",v.height),xoe(E,v)}else e.children(y).length>0?(K.trace("Cluster - the non recursive path XBX",y,v.id,v,v.width,"Graph:",e),K.trace(B1(v.id,e)),Vr.set(v.id,{id:B1(v.id,e),node:v})):(K.trace("Node - the non recursive path XAX",y,d,e.node(y),s),await y1(d,e.node(y),{config:a,dir:s}))})),await o(async()=>{let y=e.edges().map(async function(v){let x=e.edge(v.v,v.w,v.name);K.info("Edge "+v.v+" -> "+v.w+": "+JSON.stringify(v)),K.info("Edge "+v.v+" -> "+v.w+": ",v," ",JSON.stringify(e.edge(v))),K.info("Fix",Vr,"ids:",v.v,v.w,"Translating: ",Vr.get(v.v),Vr.get(v.w)),await fE(f,x)});await Promise.all(y)},"processEdges")(),K.info("Graph before layout:",JSON.stringify(Rl(e))),K.info("############################################# XXX"),K.info("### Layout ### XXX"),K.info("############################################# XXX"),Cb(e),K.info("Graph after layout:",JSON.stringify(Rl(e)));let m=0,{subGraphTitleTotalMargin:g}=Lh(a);return await Promise.all(Zfe(e).map(async function(y){let v=e.node(y);if(K.info("Position XBX => "+y+": ("+v.x,","+v.y,") width: ",v.width," height: ",v.height),v?.clusterNode)v.y+=g,K.info("A tainted cluster node XBX1",y,v.id,v.width,v.height,v.x,v.y,e.parent(y)),Vr.get(v.id).node=v,vb(v);else if(e.children(y).length>0){K.info("A pure cluster node XBX1",y,v.id,v.x,v.y,v.width,v.height,e.parent(y)),v.height+=g,e.node(v.parentId);let x=v?.padding/2||0,b=v?.labelBBox?.height||0,T=b-x||0;K.debug("OffsetY",T,"labelHeight",b,"halfPadding",x),await g1(u,v),Vr.get(v.id).node=v}else{let x=e.node(v.parentId);v.y+=g/2,K.info("A regular node XBX1 - using the padding",v.id,"parent",v.parentId,v.width,v.height,v.x,v.y,"offsetY",v.offsetY,"parent",x,x?.offsetY,v),vb(v)}})),e.edges().forEach(function(y){let v=e.edge(y);K.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(v),v),v.points.forEach(E=>E.y+=g/2);let x=e.node(y.v);var b=e.node(y.w);let T=pE(h,v,Vr,r,x,b,n);dE(v,T)}),e.nodes().forEach(function(y){let v=e.node(y);K.info(y,v.type,v.diff),v.isGroup&&(m=v.diff)}),K.warn("Returning from recursive render XAX",l,m),{elem:l,diff:m}},"recursiveRender"),oje=o(async(t,e)=>{let r=new wn({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");mE(n,t.markers,t.type,t.diagramId),boe(),voe(),hoe(),Hfe(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),K.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,l=s+"---"+s+"---1",u=s+"---"+s+"---2",h=r.node(s);r.setNode(l,{domId:l,id:l,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(l,h.parentId),r.setNode(u,{domId:u,id:u,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(u,h.parentId);let f=structuredClone(a),d=structuredClone(a),p=structuredClone(a);f.label="",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=s+"-cyclic-special-mid",p.label="",h.isGroup&&(f.fromCluster=s,p.toCluster=s),p.id=s+"-cyclic-special-2",p.arrowTypeStart="none",r.setEdge(s,l,f,s+"-cyclic-special-0"),r.setEdge(l,u,d,s+"-cyclic-special-1"),r.setEdge(u,s,p,s+"-cyct.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},"n"),e:o(function(u){throw u},"e"),f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,s=!0,l=!1;return{s:o(function(){r=r.call(t)},"s"),n:o(function(){var u=r.next();return s=u.done,u},"n"),e:o(function(u){l=!0,a=u},"e"),f:o(function(){try{s||r.return==null||r.return()}finally{if(l)throw a}},"f")}}function L0e(t,e,r){return(e=N0e(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function hje(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}function fje(t,e){var r=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(r!=null){var n,i,a,s,l=[],u=!0,h=!1;try{if(a=(r=r.call(t)).next,e===0){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(l.push(n.value),l.length!==e);u=!0);}catch(f){h=!0,i=f}finally{try{if(!u&&r.return!=null&&(s=r.return(),Object(s)!==s))return}finally{if(h)throw i}}return l}}function dje(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function pje(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Wi(t,e){return lje(t)||fje(t,e)||eB(t,e)||dje()}function WS(t){return cje(t)||hje(t)||eB(t)||pje()}function mje(t,e){if(typeof t!="object"||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var n=r.call(t,e);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}function N0e(t){var e=mje(t,"string");return typeof e=="symbol"?e:e+""}function aa(t){"@babel/helpers - typeof";return aa=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},aa(t)}function eB(t,e){if(t){if(typeof t=="string")return IP(t,e);var r={}.toString.call(t).slice(8,-1);return r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set"?Array.from(t):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?IP(t,e):void 0}}function Zb(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function Jb(){if(ade)return iO;ade=1;function t(e){var r=typeof e;return e!=null&&(r=="object"||r=="function")}return o(t,"isObject"),iO=t,iO}function Fje(){if(sde)return aO;sde=1;var t=typeof TS=="object"&&TS&&TS.Object===Object&&TS;return aO=t,aO}function sC(){if(ode)return sO;ode=1;var t=Fje(),e=typeof self=="object"&&self&&self.Object===Object&&self,r=t||e||Function("return this")();return sO=r,sO}function $je(){if(lde)return oO;lde=1;var t=sC(),e=o(function(){return t.Date.now()},"now");return oO=e,oO}function zje(){if(cde)return lO;cde=1;var t=/\s/;function e(r){for(var n=r.length;n--&&t.test(r.charAt(n)););return n}return o(e,"trimmedEndIndex"),lO=e,lO}function Gje(){if(ude)return cO;ude=1;var t=zje(),e=/^\s+/;function r(n){return n&&n.slice(0,t(n)+1).replace(e,"")}return o(r,"baseTrim"),cO=r,cO}function nB(){if(hde)return uO;hde=1;var t=sC(),e=t.Symbol;return uO=e,uO}function Vje(){if(fde)return hO;fde=1;var t=nB(),e=Object.prototype,r=e.hasOwnProperty,n=e.toString,i=t?t.toStringTag:void 0;function a(s){var l=r.call(s,i),u=s[i];try{s[i]=void 0;var h=!0}catch{}var f=n.call(s);return h&&(l?s[i]=u:delete s[i]),f}return o(a,"getRawTag"),hO=a,hO}function qje(){if(dde)return fO;dde=1;var t=Object.prototype,e=t.toString;function r(n){return e.call(n)}return o(r,"objectToString"),fO=r,fO}function G0e(){if(pde)return dO;pde=1;var t=nB(),e=Vje(),r=qje(),n="[object Null]",i="[object Undefined]",a=t?t.toStringTag:void 0;function s(l){return l==null?l===void 0?i:n:a&&a in Object(l)?e(l):r(l)}return o(s,"baseGetTag"),dO=s,dO}function Uje(){if(mde)return pO;mde=1;function t(e){return e!=null&&typeof e=="object"}return o(t,"isObjectLike"),pO=t,pO}function eT(){if(gde)return mO;gde=1;var t=G0e(),e=Uje(),r="[object Symbol]";function n(i){return typeof i=="symbol"||e(i)&&t(i)==r}return o(n,"isSymbol"),mO=n,mO}function Wje(){if(yde)return gO;yde=1;var t=Gje(),e=Jb(),r=eT(),n=NaN,i=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,s=/^0o[0-7]+$/i,l=parseInt;function u(h){if(typeof h=="number")return h;if(r(h))return n;if(e(h)){var f=typeof h.valueOf=="function"?h.valueOf():h;h=e(f)?f+"":f}if(typeof h!="string")return h===0?h:+h;h=t(h);var d=a.test(h);return d||s.test(h)?l(h.slice(2),d?2:8):i.test(h)?n:+h}return o(u,"toNumber"),gO=u,gO}function Hje(){if(vde)return yO;vde=1;var t=Jb(),e=$je(),r=Wje(),n="Expected a function",i=Math.max,a=Math.min;function s(l,u,h){var f,d,p,m,g,y,v=0,x=!1,b=!1,T=!0;if(typeof l!="function")throw new TypeError(n);u=r(u)||0,t(h)&&(x=!!h.leading,b="maxWait"in h,p=b?i(r(h.maxWait)||0,u):p,T="trailing"in h?!!h.trailing:T);function E(_){var D=f,M=d;return f=d=void 0,v=_,m=l.apply(M,D),m}o(E,"invokeFunc");function w(_){return v=_,g=setTimeout(A,u),x?E(_):m}o(w,"leadingEdge");function k(_){var D=_-y,M=_-v,R=u-D;return b?a(R,p-M):R}o(k,"remainingWait");function S(_){var D=_-y,M=_-v;return y===void 0||D>=u||D<0||b&&M>=p}o(S,"shouldInvoke");function A(){var _=e();if(S(_))return L(_);g=setTimeout(A,k(_))}o(A,"timerExpired");function L(_){return g=void 0,T&&f?E(_):(f=d=void 0,m)}o(L,"trailingEdge");function I(){g!==void 0&&clearTimeout(g),v=0,f=y=d=g=void 0}o(I,"cancel");function N(){return g===void 0?m:L(e())}o(N,"flush");function C(){var _=e(),D=S(_);if(f=arguments,d=this,y=_,D){if(g===void 0)return w(y);if(b)return clearTimeout(g),g=setTimeout(A,u),E(y)}return g===void 0&&(g=setTimeout(A,u)),m}return o(C,"debounced"),C.cancel=I,C.flush=N,C}return o(s,"debounce"),yO=s,yO}function Qje(t,e,r,n,i){var a=i*Math.PI/180,s=Math.cos(a)*(t-r)-Math.sin(a)*(e-n)+r,l=Math.sin(a)*(t-r)+Math.cos(a)*(e-n)+n;return{x:s,y:l}}function Jje(t,e,r){if(r===0)return t;var n=(e.x1+e.x2)/2,i=(e.y1+e.y2)/2,a=e.w/e.h,s=1/a,l=Qje(t.x,t.y,n,i,r),u=Zje(l.x,l.y,n,i,a,s);return{x:u.x,y:u.y}}function uXe(){return kde||(kde=1,(function(t,e){(function(){var r,n,i,a,s,l,u,h,f,d,p,m,g,y,v;i=Math.floor,d=Math.min,n=o(function(x,b){return xb?1:0},"defaultCmp"),f=o(function(x,b,T,E,w){var k;if(T==null&&(T=0),w==null&&(w=n),T<0)throw new Error("lo must be non-negative");for(E==null&&(E=x.length);TI;0<=I?L++:L--)A.push(L);return A}).apply(this).reverse(),S=[],E=0,w=k.length;EN;0<=N?++A:--A)C.push(s(x,T));return C},"nsmallest"),y=o(function(x,b,T,E){var w,k,S;for(E==null&&(E=n),w=x[T];T>b;){if(S=T-1>>1,k=x[S],E(w,k)<0){x[T]=k,T=S;continue}break}return x[T]=w},"_siftdown"),v=o(function(x,b,T){var E,w,k,S,A;for(T==null&&(T=n),w=x.length,A=b,k=x[b],E=2*b+1;E-1}return o(e,"listCacheHas"),HO=e,HO}function nQe(){if(upe)return YO;upe=1;var t=fC();function e(r,n){var i=this.__data__,a=t(i,r);return a<0?(++this.size,i.push([r,n])):i[a][1]=n,this}return o(e,"listCacheSet"),YO=e,YO}function iQe(){if(hpe)return jO;hpe=1;var t=JKe(),e=eQe(),r=tQe(),n=rQe(),i=nQe();function a(s){var l=-1,u=s==null?0:s.length;for(this.clear();++l-1&&n%1==0&&n0;){var f=i.shift();e(f),a.add(f.id()),l&&n(i,a,f)}return t}function vme(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:pZe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?C=D:N=D;while(Math.abs(_)>s&&++M=a?b(I,M):R===0?M:E(I,N,N+h)}o(w,"getTForX");var k=!1;function S(){k=!0,(t!==e||r!==n)&&T()}o(S,"precompute");var A=o(function(N){return k||S(),t===e&&r===n?N:N===0?0:N===1?1:v(w(N),e,n)},"f");A.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var L="generateBezier("+[t,e,r,n]+")";return A.toString=function(){return L},A}function e0e(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function t0e(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function z1(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=t0e(t,i),l=t0e(e,i);if(Nt(s)&&Nt(l))return e0e(a,s,l,r,n);if($n(s)&&$n(l)){for(var u=[],h=0;h0?(m==="spring"&&g.push(s.duration),s.easingImpl=$S[m].apply(null,g)):s.easingImpl=$S[m]}var y=s.easingImpl,v;if(s.duration===0?v=1:v=(r-u)/s.duration,s.applying&&(v=s.progress),v<0?v=0:v>1&&(v=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var T={};Rb(x.x,b.x)&&(T.x=z1(x.x,b.x,v,y)),Rb(x.y,b.y)&&(T.y=z1(x.y,b.y,v,y)),t.position(T)}var E=s.startPan,w=s.pan,k=a.pan,S=w!=null&&n;S&&(Rb(E.x,w.x)&&(k.x=z1(E.x,w.x,v,y)),Rb(E.y,w.y)&&(k.y=z1(E.y,w.y,v,y)),t.emit("pan"));var A=s.startZoom,L=s.zoom,I=L!=null&&n;I&&(Rb(A,L)&&(a.zoom=qb(a.minZoom,z1(A,L,v,y),a.maxZoom)),t.emit("zoom")),(S||I)&&t.emit("viewport");var N=s.style;if(N&&N.length>0&&i){for(var C=0;C=0;S--){var A=k[S];A()}k.splice(0,k.length)},"callbacks"),b=m.length-1;b>=0;b--){var T=m[b],E=T._private;if(E.stopped){m.splice(b,1),E.hooked=!1,E.playing=!1,E.started=!1,x(E.frames);continue}!E.playing&&!E.applying||(E.playing&&E.applying&&(E.applying=!1),E.started||_Ze(f,T,t),AZe(f,T,t,d),E.applying&&(E.applying=!1),x(E.frames),E.step!=null&&E.step(t),T.completed()&&(m.splice(b,1),E.hooked=!1,E.playing=!1,E.started=!1,x(E.completes)),y=!0)}return!d&&m.length===0&&g.length===0&&n.push(f),y}o(i,"stepOne");for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function Pme(t){this.options=pr({},PZe,BZe,t)}function Bme(t){this.options=pr({},FZe,t)}function Fme(t){this.options=pr({},$Ze,t)}function bC(t){this.options=pr({},zZe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),l=e.some(function(h){return h.data("id")===a}),u=e.some(function(h){return h.data("id")===s});return!l||!u});this.options.eles=this.options.eles.not(n)}function Vme(t){this.options=pr({},tJe,t)}function xB(t){this.options=pr({},rJe,t)}function qme(t){this.options=pr({},nJe,t)}function Ume(t){this.options=pr({},iJe,t)}function Wme(t){this.options=t,this.notifications=0}function jme(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function TB(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(oJe(t,e,r,n,i),{cx:WP,cy:HP,radius:P0,startX:Hme,startY:Yme,stopX:YP,stopY:jP,startAngle:Su.ang+Math.PI/2*F0,endAngle:Ll.ang-Math.PI/2*F0,counterClockwise:VS})}function Xme(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=Math.min(a,n/2,i/2);t.beginPath(),t.moveTo(e+s,r),t.lineTo(e+n-s,r),t.quadraticCurveTo(e+n,r,e+n,r+s),t.lineTo(e+n,r+i-s),t.quadraticCurveTo(e+n,r+i,e+n-s,r+i),t.lineTo(e+s,r+i),t.quadraticCurveTo(e,r+i,e,r+i-s),t.lineTo(e,r+s),t.quadraticCurveTo(e,r,e+s,r),t.closePath()}function w0e(t,e,r){var n=t.createShader(e);if(t.shaderSource(n,r),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error(t.getShaderInfoLog(n));return n}function KJe(t,e,r){var n=w0e(t,t.VERTEX_SHADER,e),i=w0e(t,t.FRAGMENT_SHADER,r),a=t.createProgram();if(t.attachShader(a,n),t.attachShader(a,i),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new Error("Could not initialize shaders");return a}function QJe(t,e,r){r===void 0&&(r=e);var n=t.makeOffscreenCanvas(e,r),i=n.context=n.getContext("2d");return n.clear=function(){return i.clearRect(0,0,n.width,n.height)},n.clear(),n}function EB(t){var e=t.pixelRatio,r=t.cy.zoom(),n=t.cy.pan();return{zoom:r*e,pan:{x:n.x*e,y:n.y*e}}}function ZJe(t){var e=t.pixelRatio,r=t.cy.zoom();return r*e}function JJe(t,e,r,n,i){var a=n*r+e.x,s=i*r+e.y;return s=Math.round(t.canvasHeight-s),[a,s]}function eet(t){return t.pstyle("background-fill").value!=="solid"||t.pstyle("background-image").strValue!=="none"?!1:t.pstyle("border-width").value===0||t.pstyle("border-opacity").value===0?!0:t.pstyle("border-style").value==="solid"}function tet(t,e){if(t.length!==e.length)return!1;for(var r=0;r>0&255)/255,r[1]=(t>>8&255)/255,r[2]=(t>>16&255)/255,r[3]=(t>>24&255)/255,r}function ret(t){return t[0]+(t[1]<<8)+(t[2]<<16)+(t[3]<<24)}function net(t,e){var r=t.createTexture();return r.buffer=function(n){t.bindTexture(t.TEXTURE_2D,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_NEAREST),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,n),t.generateMipmap(t.TEXTURE_2D),t.bindTexture(t.TEXTURE_2D,null)},r.deleteTexture=function(){t.deleteTexture(r)},r}function lge(t,e){switch(e){case"float":return[1,t.FLOAT,4];case"vec2":return[2,t.FLOAT,4];case"vec3":return[3,t.FLOAT,4];case"vec4":return[4,t.FLOAT,4];case"int":return[1,t.INT,4];case"ivec2":return[2,t.INT,4]}}function cge(t,e,r){switch(e){case t.FLOAT:return new Float32Array(r);case t.INT:return new Int32Array(r)}}function iet(t,e,r,n,i,a){switch(e){case t.FLOAT:return new Float32Array(r.buffer,a*n,i);case t.INT:return new Int32Array(r.buffer,a*n,i)}}function aet(t,e,r,n){var i=lge(t,e),a=Wi(i,2),s=a[0],l=a[1],u=cge(t,l,n),h=t.createBuffer();return t.bindBuffer(t.ARRAY_BUFFER,h),t.bufferData(t.ARRAY_BUFFER,u,t.STATIC_DRAW),l===t.FLOAT?t.vertexAttribPointer(r,s,l,!1,0,0):l===t.INT&&t.vertexAttribIPointer(r,s,l,0,0),t.enableVertexAttribArray(r),t.bindBuffer(t.ARRAY_BUFFER,null),h}function Eu(t,e,r,n){var i=lge(t,r),a=Wi(i,3),s=a[0],l=a[1],u=a[2],h=cge(t,l,e*s),f=s*u,d=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,d),t.bufferData(t.ARRAY_BUFFER,e*f,t.DYNAMIC_DRAW),t.enableVertexAttribArray(n),l===t.FLOAT?t.vertexAttribPointer(n,s,l,!1,f,0):l===t.INT&&t.vertexAttribIPointer(n,s,l,f,0),t.vertexAttribDivisor(n,1),t.bindBuffer(t.ARRAY_BUFFER,null);for(var p=new Array(e),m=0;mnge?(ket(t),e.call(t,a)):(Eet(t),dge(t,a,$b.SCREEN)))}}{var r=t.matchCanvasSize;t.matchCanvasSize=function(a){r.call(t,a),t.pickingFrameBuffer.setFramebufferAttachmentSizes(t.canvasWidth,t.canvasHeight),t.pickingFrameBuffer.needsDraw=!0}}t.findNearestElements=function(a,s,l,u){return Let(t,a,s)};{var n=t.invalidateCachedZSortedEles;t.invalidateCachedZSortedEles=function(){n.call(t),t.pickingFrameBuffer.needsDraw=!0}}{var i=t.notify;t.notify=function(a,s){i.call(t,a,s),a==="viewport"||a==="bounds"?t.pickingFrameBuffer.needsDraw=!0:a==="background"&&t.drawing.invalidate(s,{type:"node-body"})}}}function ket(t){var e=t.data.contexts[t.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function Eet(t){var e=o(function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.canvasWidth,t.canvasHeight),n.restore()},"clear");e(t.data.contexts[t.NODE]),e(t.data.contexts[t.DRAG])}function Cet(t){var e=t.canvasWidth,r=t.canvasHeight,n=EB(t),i=n.pan,a=n.zoom,s=_P();US(s,s,[i.x,i.y]),KP(s,s,[a,a]);var l=_P();uet(l,e,r);var u=_P();return cet(u,l,s),u}function fge(t,e){var r=t.canvasWidth,n=t.canvasHeight,i=EB(t),a=i.pan,s=i.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,r,n),e.translate(a.x,a.y),e.scale(s,s)}function Aet(t,e){t.drawSelectionRectangle(e,function(r){return fge(t,r)})}function _et(t){var e=t.data.contexts[t.NODE];e.save(),fge(t,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function Det(t){var e=o(function(i,a,s){for(var l=i.atlasManager.getAtlasCollection(a),u=t.data.contexts[t.NODE],h=l.atlases,f=0;f=0&&E.add(S)}return E}function Let(t,e,r){var n=Ret(t,e,r),i=t.getCachedZSortedEles(),a,s,l=xo(n),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,f=i[h];if(!a&&f.isNode()&&(a=f),!s&&f.isEdge()&&(s=f),a&&s)break}}catch(d){l.e(d)}finally{l.f()}return[a,s].filter(Boolean)}function MP(t,e,r){var n=t.drawing;e+=1,r.isNode()?(n.drawNode(r,e,"node-underlay"),n.drawNode(r,e,"node-body"),n.drawTexture(r,e,"label"),n.drawNode(r,e,"node-overlay")):(n.drawEdgeLine(r,e),n.drawEdgeArrow(r,e,"source"),n.drawEdgeArrow(r,e,"target"),n.drawTexture(r,e,"label"),n.drawTexture(r,e,"edge-source-label"),n.drawTexture(r,e,"edge-target-label"))}function dge(t,e,r){var n;t.webglDebug&&(n=performance.now());var i=t.drawing,a=0;if(r.screen&&t.data.canvasNeedsRedraw[t.SELECT_BOX]&&Aet(t,e),t.data.canvasNeedsRedraw[t.NODE]||r.picking){var s=t.data.contexts[t.WEBGL];r.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var l=Cet(t),u=t.getCachedZSortedEles();if(a=u.length,i.startFrame(l,r),r.screen){for(var h=0;h{"use strict";o(IP,"_arrayLikeToArray");o(lje,"_arrayWithHoles");o(cje,"_arrayWithoutHoles");o(Sd,"_classCallCheck");o(uje,"_defineProperties");o(Cd,"_createClass");o(xo,"_createForOfIteratorHelper");o(L0e,"_defineProperty$1");o(hje,"_iterableToArray");o(fje,"_iterableToArrayLimit");o(dje,"_nonIterableRest");o(pje,"_nonIterableSpread");o(Wi,"_slicedToArray");o(WS,"_toConsumableArray");o(mje,"_toPrimitive");o(N0e,"_toPropertyKey");o(aa,"_typeof");o(eB,"_unsupportedIterableToArray");na=typeof window>"u"?null:window,nde=na?na.navigator:null;na&&na.document;gje=aa(""),M0e=aa({}),yje=aa(function(){}),vje=typeof HTMLElement>"u"?"undefined":aa(HTMLElement),Kb=o(function(e){return e&&e.instanceString&&Ei(e.instanceString)?e.instanceString():null},"instanceStr"),or=o(function(e){return e!=null&&aa(e)==gje},"string"),Ei=o(function(e){return e!=null&&aa(e)===yje},"fn"),$n=o(function(e){return!jo(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),sn=o(function(e){return e!=null&&aa(e)===M0e&&!$n(e)&&e.constructor===Object},"plainObject"),xje=o(function(e){return e!=null&&aa(e)===M0e},"object"),Nt=o(function(e){return e!=null&&aa(e)===aa(1)&&!isNaN(e)},"number"),bje=o(function(e){return Nt(e)&&Math.floor(e)===e},"integer"),HS=o(function(e){if(vje!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),jo=o(function(e){return Qb(e)||I0e(e)},"elementOrCollection"),Qb=o(function(e){return Kb(e)==="collection"&&e._private.single},"element"),I0e=o(function(e){return Kb(e)==="collection"&&!e._private.single},"collection"),tB=o(function(e){return Kb(e)==="core"},"core"),O0e=o(function(e){return Kb(e)==="stylesheet"},"stylesheet"),Tje=o(function(e){return Kb(e)==="event"},"event"),xd=o(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),wje=o(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),kje=o(function(e){return sn(e)&&Nt(e.x1)&&Nt(e.x2)&&Nt(e.y1)&&Nt(e.y2)},"boundingBox"),Eje=o(function(e){return xje(e)&&Ei(e.then)},"promise"),Sje=o(function(){return nde&&nde.userAgent.match(/msie|trident|edge/i)},"ms"),J1=o(function(e,r){r||(r=o(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},"ascending"),Nje=o(function(e,r){return-1*B0e(e,r)},"descending"),pr=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(v-=1),v<1/6?g+(y-g)*6*v:v<1/2?y:v<2/3?g+(y-g)*(2/3-v)*6:g}o(f,"hue2rgb");var d=new RegExp("^"+_je+"$").exec(e);if(d){if(n=parseInt(d[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(d[2]),i<0||i>100||(i=i/100,a=parseFloat(d[3]),a<0||a>100)||(a=a/100,s=d[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)l=u=h=Math.round(a*255);else{var p=a<.5?a*(1+i):a+i-a*i,m=2*a-p;l=Math.round(255*f(m,p,n+1/3)),u=Math.round(255*f(m,p,n)),h=Math.round(255*f(m,p,n-1/3))}r=[l,u,h,s]}return r},"hsl2tuple"),Oje=o(function(e){var r,n=new RegExp("^"+Cje+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var l=i[1]||i[2]||i[3],u=i[1]&&i[2]&&i[3];if(l&&!u)return;var h=n[4];if(h!==void 0){if(h=parseFloat(h),h<0||h>1)return;r.push(h)}}return r},"rgb2tuple"),Pje=o(function(e){return Bje[e.toLowerCase()]},"colorname2tuple"),F0e=o(function(e){return($n(e)?e:null)||Pje(e)||Mje(e)||Oje(e)||Ije(e)},"color2tuple"),Bje={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},$0e=o(function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:B0,n=r,i;i=e.next(),!i.done;)n=n*q0e+i.value|0;return n},"hashIterableInts"),zb=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:B0;return r*q0e+e|0},"hashInt"),Gb=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:W1;return(r<<5)+r+e|0},"hashIntAlt"),Xje=o(function(e,r){return e*2097152+r},"combineHashes"),hd=o(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),wS=o(function(e,r){return[zb(e[0],r[0]),Gb(e[1],r[1])]},"hashArrays"),xde=o(function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:o(function(){return i=0;i--)e[i]===r&&e.splice(i,1)},"removeFromArray"),sB=o(function(e){e.splice(0,e.length)},"clearArray"),aXe=o(function(e,r){for(var n=0;n"u"?"undefined":aa(Set))!==oXe?Set:lXe,oC=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!tB(e)){ui("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){ui("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new ry,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,l=e.pan(),u=e.zoom();a.position={x:(s.x-l.x)/u,y:(s.y-l.y)/u}}var h=[];$n(r.classes)?h=r.classes:or(r.classes)&&(h=r.classes.split(/\s+/));for(var f=0,d=h.length;f0;){var k=b.pop(),S=v(k),A=k.id();if(p[A]=S,S!==1/0)for(var L=k.neighborhood().intersect(g),I=0;I0)for(B.unshift(P);d[G];){var $=d[G];B.unshift($.edge),B.unshift($.node),F=$.node,G=F.id()}return l.spawn(B)},"pathTo")}},"dijkstra")},mXe={kruskal:o(function(e){e=e||function(T){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),l=n,u=o(function(E){for(var w=0;w0;){if(w(),S++,E===f){for(var A=[],L=a,I=f,N=x[I];A.unshift(L),N!=null&&A.unshift(N),L=v[I],L!=null;)I=L.id(),N=x[I];return{found:!0,distance:d[E],path:this.spawn(A),steps:S}}m[E]=!0;for(var C=T._private.edges,_=0;_N&&(g[I]=N,b[I]=L,T[I]=w),!a){var C=L*f+A;!a&&g[C]>N&&(g[C]=N,b[C]=A,T[C]=w)}}}for(var _=0;_1&&arguments[1]!==void 0?arguments[1]:s,$e=T(we),fe=[],Ke=$e;;){if(Ke==null)return r.spawn();var Te=b(Ke),Be=Te.edge,Ue=Te.pred;if(fe.unshift(Ke[0]),Ke.same(_e)&&fe.length>0)break;Be!=null&&fe.unshift(Be),Ke=Ue}return u.spawn(fe)},"pathTo"),k=0;k=0;f--){var d=h[f],p=d[1],m=d[2];(r[p]===l&&r[m]===u||r[p]===u&&r[m]===l)&&h.splice(f,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=kXe(a,e,r),n--}return r},"contractUntil"),EXe={kargerStein:o(function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(B){return B.isLoop()});var a=n.length,s=i.length,l=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),u=Math.floor(a/wXe);if(a<2){ui("At least 2 nodes are required for Karger-Stein algorithm");return}for(var h=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var l=0,u=e.length-1;u>=0;u--){var h=e[u];s?isFinite(h)||(e[u]=-1/0,l++):e.splice(u,1)}a&&e.sort(function(p,m){return p-m});var f=e.length,d=Math.floor(f/2);return f%2!==0?e[d+1+l]:(e[d-1+l]+e[d+l])/2},"median"),RXe=o(function(e){return Math.PI*e/180},"deg2rad"),kS=o(function(e,r){return Math.atan2(r,e)-Math.PI/2},"getAngleFromDisp"),oB=Math.log2||function(t){return Math.log(t)/Math.log(2)},lB=o(function(e){return e>0?1:e<0?-1:0},"signum"),G0=o(function(e,r){return Math.sqrt(O0(e,r))},"dist"),O0=o(function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},"sqdist"),LXe=o(function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),MXe=o(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),IXe=o(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),OXe=o(function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},"updateBoundingBox"),Q0e=o(function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),OS=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),PS=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var l=Wi(r,4);n=l[0],i=l[1],a=l[2],s=l[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),Sde=o(function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),cB=o(function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},"boundingBoxesIntersect"),md=o(function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},"inBoundingBox"),Cde=o(function(e,r){return md(e,r.x,r.y)},"pointInBoundingBox"),Z0e=o(function(e,r){return md(e,r.x1,r.y1)&&md(e,r.x2,r.y2)},"boundingBoxInBoundingBox"),PXe=(TO=Math.hypot)!==null&&TO!==void 0?TO:function(t,e){return Math.sqrt(t*t+e*e)};o(BXe,"inflatePolygon");o(FXe,"miterBox");J0e=o(function(e,r,n,i,a,s,l){var u=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",h=u==="auto"?Td(a,s):u,f=a/2,d=s/2;h=Math.min(h,f,d);var p=h!==f,m=h!==d,g;if(p){var y=n-f+h-l,v=i-d-l,x=n+f-h+l,b=v;if(g=gd(e,r,n,i,y,v,x,b,!1),g.length>0)return g}if(m){var T=n+f+l,E=i-d+h-l,w=T,k=i+d-h+l;if(g=gd(e,r,n,i,T,E,w,k,!1),g.length>0)return g}if(p){var S=n-f+h-l,A=i+d+l,L=n+f-h+l,I=A;if(g=gd(e,r,n,i,S,A,L,I,!1),g.length>0)return g}if(m){var N=n-f-l,C=i-d+h-l,_=N,D=i+d-h+l;if(g=gd(e,r,n,i,N,C,_,D,!1),g.length>0)return g}var M;{var R=n-f+h,P=i-d+h;if(M=Ib(e,r,n,i,R,P,h+l),M.length>0&&M[0]<=R&&M[1]<=P)return[M[0],M[1]]}{var B=n+f-h,F=i-d+h;if(M=Ib(e,r,n,i,B,F,h+l),M.length>0&&M[0]>=B&&M[1]<=F)return[M[0],M[1]]}{var G=n+f-h,$=i+d-h;if(M=Ib(e,r,n,i,G,$,h+l),M.length>0&&M[0]>=G&&M[1]>=$)return[M[0],M[1]]}{var V=n-f+h,X=i+d-h;if(M=Ib(e,r,n,i,V,X,h+l),M.length>0&&M[0]<=V&&M[1]>=X)return[M[0],M[1]]}return[]},"roundRectangleIntersectLine"),$Xe=o(function(e,r,n,i,a,s,l){var u=l,h=Math.min(n,a),f=Math.max(n,a),d=Math.min(i,s),p=Math.max(i,s);return h-u<=e&&e<=f+u&&d-u<=r&&r<=p+u},"inLineVicinity"),zXe=o(function(e,r,n,i,a,s,l,u,h){var f={x1:Math.min(n,l,a)-h,x2:Math.max(n,l,a)+h,y1:Math.min(i,u,s)-h,y2:Math.max(i,u,s)+h};return!(ef.x2||rf.y2)},"inBezierVicinity"),GXe=o(function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),l=2*e,u=(-r+s)/l,h=(-r-s)/l;return[u,h]},"solveQuadratic"),VXe=o(function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var l,u,h,f,d,p,m,g;if(u=(3*n-r*r)/9,h=-(27*i)+r*(9*n-2*(r*r)),h/=54,l=u*u*u+h*h,a[1]=0,m=r/3,l>0){d=h+Math.sqrt(l),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),p=h-Math.sqrt(l),p=p<0?-Math.pow(-p,1/3):Math.pow(p,1/3),a[0]=-m+d+p,m+=(d+p)/2,a[4]=a[2]=-m,m=Math.sqrt(3)*(-p+d)/2,a[3]=m,a[5]=-m;return}if(a[5]=a[3]=0,l===0){g=h<0?-Math.pow(-h,1/3):Math.pow(h,1/3),a[0]=-m+2*g,a[4]=a[2]=-(g+m);return}u=-u,f=u*u*u,f=Math.acos(h/Math.sqrt(f)),g=2*Math.sqrt(u),a[0]=-m+g*Math.cos(f/3),a[2]=-m+g*Math.cos((f+2*Math.PI)/3),a[4]=-m+g*Math.cos((f+4*Math.PI)/3)},"solveCubic"),qXe=o(function(e,r,n,i,a,s,l,u){var h=1*n*n-4*n*a+2*n*l+4*a*a-4*a*l+l*l+i*i-4*i*s+2*i*u+4*s*s-4*s*u+u*u,f=9*n*a-3*n*n-3*n*l-6*a*a+3*a*l+9*i*s-3*i*i-3*i*u-6*s*s+3*s*u,d=3*n*n-6*n*a+n*l-n*e+2*a*a+2*a*e-l*e+3*i*i-6*i*s+i*u-i*r+2*s*s+2*s*r-u*r,p=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,m=[];VXe(h,f,d,p,m);for(var g=1e-7,y=[],v=0;v<6;v+=2)Math.abs(m[v+1])=0&&m[v]<=1&&y.push(m[v]);y.push(1),y.push(0);for(var x=-1,b,T,E,w=0;w=0?Eh?(e-a)*(e-a)+(r-s)*(r-s):f-p},"sqdistToFiniteLine"),vo=o(function(e,r,n){for(var i,a,s,l,u,h=0,f=0;f=e&&e>=s||i<=e&&e<=s)u=(e-i)/(s-i)*(l-a)+a,u>r&&h++;else continue;return h%2!==0},"pointInsidePolygonPoints"),Bh=o(function(e,r,n,i,a,s,l,u,h){var f=new Array(n.length),d;u[0]!=null?(d=Math.atan(u[1]/u[0]),u[0]<0?d=d+Math.PI/2:d=-d-Math.PI/2):d=u;for(var p=Math.cos(-d),m=Math.sin(-d),g=0;g0){var v=KS(f,-h);y=XS(v)}else y=f;return vo(e,r,y)},"pointInsidePolygon"),WXe=o(function(e,r,n,i,a,s,l,u){for(var h=new Array(n.length*2),f=0;f=0&&v<=1&&b.push(v),x>=0&&x<=1&&b.push(x),b.length===0)return[];var T=b[0]*u[0]+e,E=b[0]*u[1]+r;if(b.length>1){if(b[0]==b[1])return[T,E];var w=b[1]*u[0]+e,k=b[1]*u[1]+r;return[T,E,w,k]}else return[T,E]},"intersectLineCircle"),wO=o(function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},"midOfThree"),gd=o(function(e,r,n,i,a,s,l,u,h){var f=e-a,d=n-e,p=l-a,m=r-s,g=i-r,y=u-s,v=p*m-y*f,x=d*m-g*f,b=y*d-p*g;if(b!==0){var T=v/b,E=x/b,w=.001,k=0-w,S=1+w;return k<=T&&T<=S&&k<=E&&E<=S?[e+T*d,r+T*g]:h?[e+T*d,r+T*g]:[]}else return v===0||x===0?wO(e,n,l)===l?[l,u]:wO(e,n,a)===a?[a,s]:wO(a,l,n)===n?[n,i]:[]:[]},"finiteLinesIntersect"),YXe=o(function(e,r,n,i,a){var s=[],l=i/2,u=a/2,h=r,f=n;s.push({x:h+l*e[0],y:f+u*e[1]});for(var d=1;d0){var y=KS(d,-u);m=XS(y)}else m=d}else m=n;for(var v,x,b,T,E=0;E2){for(var g=[f[0],f[1]],y=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),v=1;vf&&(f=E)},"set"),get:o(function(T){return h[T]},"get")},p=0;p0?M=D.edgesTo(_)[0]:M=_.edgesTo(D)[0];var R=i(M);_=_.id(),S[_]>S[N]+R&&(S[_]=S[N]+R,A.nodes.indexOf(_)<0?A.push(_):A.updateItem(_),k[_]=0,w[_]=[]),S[_]==S[N]+R&&(k[_]=k[_]+k[N],w[_].push(N))}else for(var P=0;P0;){for(var $=E.pop(),V=0;V0&&l.push(n[u]);l.length!==0&&a.push(i.collection(l))}return a},"assign"),lKe=o(function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:hKe,l=i,u,h,f=0;f=2?Ab(e,r,n,0,Lde,fKe):Ab(e,r,n,0,Rde)},"euclidean"),squaredEuclidean:o(function(e,r,n){return Ab(e,r,n,0,Lde)},"squaredEuclidean"),manhattan:o(function(e,r,n){return Ab(e,r,n,0,Rde)},"manhattan"),max:o(function(e,r,n){return Ab(e,r,n,-1/0,dKe)},"max")};ey["squared-euclidean"]=ey.squaredEuclidean;ey.squaredeuclidean=ey.squaredEuclidean;o(cC,"clusteringDistance");pKe=qa({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),hB=o(function(e){return pKe(e)},"setOptions"),QS=o(function(e,r,n,i,a){var s=a!=="kMedoids",l=s?function(d){return n[d]}:function(d){return i[d](n)},u=o(function(p){return i[p](r)},"getQ"),h=n,f=r;return cC(e,i.length,l,u,h,f)},"getDist"),EO=o(function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),l=new Array(r),u=null,h=0;hn)return!1}return!0},"haveMatricesConverged"),yKe=o(function(e,r,n){for(var i=0;il&&(l=r[h][f],u=f);a[u].push(e[h])}for(var d=0;d=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],y=r[i[s]],v;a.mode==="dendrogram"?v={left:g,right:y,key:g.key}:v={value:g.value.concat(y.value),key:g.key},e[g.index]=v,e.splice(y.index,1),r[g.key]=v;for(var x=0;xn[y.key][b.key]&&(u=n[y.key][b.key])):a.linkage==="max"?(u=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},"findExemplars"),Bde=o(function(e,r,n){for(var i=[],a=0;al&&(s=h,l=r[a*e+h])}s>0&&i.push(s)}for(var f=0;fh&&(u=f,h=d)}n[a]=s[u]}return i=Bde(e,r,n),i},"assign"),Fde=o(function(e){for(var r=this.cy(),n=this.nodes(),i=DKe(e),a={},s=0;s=N?(C=N,N=D,_=M):D>C&&(C=D);for(var R=0;R0?1:0;S[L%i.minIterations*l+V]=X,$+=X}if($>0&&(L>=i.minIterations-1||L==i.maxIterations-1)){for(var Q=0,H=0;H1||k>1)&&(l=!0),d[T]=[],b.outgoers().forEach(function(A){A.isEdge()&&d[T].push(A.id())})}else p[T]=[void 0,b.target().id()]}):s.forEach(function(b){var T=b.id();if(b.isNode()){var E=b.degree(!0);E%2&&(u?h?l=!0:h=T:u=T),d[T]=[],b.connectedEdges().forEach(function(w){return d[T].push(w.id())})}else p[T]=[b.source().id(),b.target().id()]});var m={found:!1,trail:void 0};if(l)return m;if(h&&u)if(a){if(f&&h!=f)return m;f=h}else{if(f&&h!=f&&u!=f)return m;f||(f=h)}else f||(f=s[0].id());var g=o(function(T){for(var E=T,w=[T],k,S,A;d[E].length;)k=d[E].shift(),S=p[k][0],A=p[k][1],E!=A?(d[A]=d[A].filter(function(L){return L!=k}),E=A):!a&&E!=S&&(d[S]=d[S].filter(function(L){return L!=k}),E=S),w.unshift(k),w.unshift(E);return w},"walk"),y=[],v=[];for(v=g(f);v.length!=1;)d[v[0]].length==0?(y.unshift(s.getElementById(v.shift())),y.unshift(s.getElementById(v.shift()))):v=g(v.shift()).concat(v);y.unshift(s.getElementById(v.shift()));for(var x in d)if(d[x].length)return m;return m.found=!0,m.trail=this.spawn(y,!0),m},"hierholzer")},SS=o(function(){var e=this,r={},n=0,i=0,a=[],s=[],l={},u=o(function(p,m){for(var g=s.length-1,y=[],v=e.spawn();s[g].x!=p||s[g].y!=m;)y.push(s.pop().edge),g--;y.push(s.pop().edge),y.forEach(function(x){var b=x.connectedNodes().intersection(e);v.merge(x),b.forEach(function(T){var E=T.id(),w=T.connectedEdges().intersection(e);v.merge(T),r[E].cutVertex?v.merge(w.filter(function(k){return k.isLoop()})):v.merge(w)})}),a.push(v)},"buildComponent"),h=o(function(p,m,g){p===g&&(i+=1),r[m]={id:n,low:n++,cutVertex:!1};var y=e.getElementById(m).connectedEdges().intersection(e);if(y.size()===0)a.push(e.spawn(e.getElementById(m)));else{var v,x,b,T;y.forEach(function(E){v=E.source().id(),x=E.target().id(),b=v===m?x:v,b!==g&&(T=E.id(),l[T]||(l[T]=!0,s.push({x:m,y:b,edge:E})),b in r?r[m].low=Math.min(r[m].low,r[b].id):(h(p,b,m),r[m].low=Math.min(r[m].low,r[b].low),r[m].id<=r[b].low&&(r[m].cutVertex=!0,u(m,b))))})}},"biconnectedSearch");e.forEach(function(d){if(d.isNode()){var p=d.id();p in r||(i=0,h(p,p),r[p].cutVertex=i>1)}});var f=Object.keys(r).filter(function(d){return r[d].cutVertex}).map(function(d){return e.getElementById(d)});return{cut:e.spawn(f),components:a}},"hopcroftTarjanBiconnected"),BKe={hopcroftTarjanBiconnected:SS,htbc:SS,htb:SS,hopcroftTarjanBiconnectedComponents:SS},CS=o(function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),l=o(function(h){a.push(h),r[h]={index:n,low:n++,explored:!1};var f=e.getElementById(h).connectedEdges().intersection(e);if(f.forEach(function(y){var v=y.target().id();v!==h&&(v in r||l(v),r[v].explored||(r[h].low=Math.min(r[h].low,r[v].low)))}),r[h].index===r[h].low){for(var d=e.spawn();;){var p=a.pop();if(d.merge(e.getElementById(p)),r[p].low=r[h].index,r[p].explored=!0,p===h)break}var m=d.edgesWith(d),g=d.merge(m);i.push(g),s=s.difference(g)}},"stronglyConnectedSearch");return e.forEach(function(u){if(u.isNode()){var h=u.id();h in r||l(h)}}),{cut:s,components:i}},"tarjanStronglyConnected"),FKe={tarjanStronglyConnected:CS,tsc:CS,tscc:CS,tarjanStronglyConnectedComponents:CS},sme={};[Vb,pXe,mXe,yXe,xXe,TXe,EXe,QXe,K1,Q1,BP,uKe,kKe,AKe,IKe,PKe,BKe,FKe].forEach(function(t){pr(sme,t)});ome=0,lme=1,cme=2,Tc=o(function(e){if(!(this instanceof Tc))return new Tc(e);this.id="Thenable/1.0.7",this.state=ome,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");Tc.prototype={fulfill:o(function(e){return $de(this,lme,"fulfillValue",e)},"fulfill"),reject:o(function(e){return $de(this,cme,"rejectReason",e)},"reject"),then:o(function(e,r){var n=this,i=new Tc;return n.onFulfilled.push(Gde(e,i,"fulfill")),n.onRejected.push(Gde(r,i,"reject")),ume(n),i.proxy},"then")};$de=o(function(e,r,n,i){return e.state===ome&&(e.state=r,e[n]=i,ume(e)),e},"deliver"),ume=o(function(e){e.state===lme?zde(e,"onFulfilled",e.fulfillValue):e.state===cme&&zde(e,"onRejected",e.rejectReason)},"execute"),zde=o(function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=o(function(){for(var l=0;l0},"animatedImpl")},"animated"),clearQueue:o(function(){return o(function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},"classes"),addClass:o(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:o(function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},"hasClass"),toggleClass:o(function(e,r){$n(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,l=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},"toggleClass"),removeClass:o(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:o(function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n},"flashClass")};BS.className=BS.classNames=BS.classes;an={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:ia,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};an.variable="(?:[\\w-.]|(?:\\\\"+an.metaChar+"))+";an.className="(?:[\\w-]|(?:\\\\"+an.metaChar+"))+";an.value=an.string+"|"+an.number;an.id=an.variable;(function(){var t,e,r;for(t=an.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(an.comparatorOp+="|\\!"+e)})();Nn=o(function(){return{checks:[]}},"newQuery"),qt={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},GP=[{selector:":selected",matches:o(function(e){return e.selected()},"matches")},{selector:":unselected",matches:o(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:o(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:o(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:o(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:o(function(e){return!e.locked()},"matches")},{selector:":visible",matches:o(function(e){return e.visible()},"matches")},{selector:":hidden",matches:o(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:o(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:o(function(e){return e.grabbed()},"matches")},{selector:":free",matches:o(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:o(function(e){return e.removed()},"matches")},{selector:":inside",matches:o(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:o(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:o(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:o(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:o(function(e){return!e.animated()},"matches")},{selector:":parent",matches:o(function(e){return e.isParent()},"matches")},{selector:":childless",matches:o(function(e){return e.isChildless()},"matches")},{selector:":child",matches:o(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:o(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:o(function(e){return e.isChild()},"matches")},{selector:":compound",matches:o(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:o(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:o(function(e){return e.isSimple()},"matches")},{selector:":active",matches:o(function(e){return e.active()},"matches")},{selector:":inactive",matches:o(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:o(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:o(function(e){return!e.backgrounding()},"matches")}].sort(function(t,e){return Nje(t.selector,e.selector)}),OQe=(function(){for(var t={},e,r=0;r0&&f.edgeCount>0)return En("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return En("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&En("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),GQe=o(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=o(function(f){return f??""},"clean"),r=o(function(f){return or(f)?'"'+f+'"':e(f)},"cleanVal"),n=o(function(f){return" "+f+" "},"space"),i=o(function(f,d){var p=f.type,m=f.value;switch(p){case qt.GROUP:{var g=e(m);return g.substring(0,g.length-1)}case qt.DATA_COMPARE:{var y=f.field,v=f.operator;return"["+y+n(e(v))+r(m)+"]"}case qt.DATA_BOOL:{var x=f.operator,b=f.field;return"["+e(x)+b+"]"}case qt.DATA_EXIST:{var T=f.field;return"["+T+"]"}case qt.META_COMPARE:{var E=f.operator,w=f.field;return"[["+w+n(e(E))+r(m)+"]]"}case qt.STATE:return m;case qt.ID:return"#"+m;case qt.CLASS:return"."+m;case qt.PARENT:case qt.CHILD:return a(f.parent,d)+n(">")+a(f.child,d);case qt.ANCESTOR:case qt.DESCENDANT:return a(f.ancestor,d)+" "+a(f.descendant,d);case qt.COMPOUND_SPLIT:{var k=a(f.left,d),S=a(f.subject,d),A=a(f.right,d);return k+(k.length>0?" ":"")+S+A}case qt.TRUE:return""}},"checkToString"),a=o(function(f,d){return f.checks.reduce(function(p,m,g){return p+(d===f&&g===0?"$":"")+i(m,d)},"")},"queryToString"),s="",l=0;l1&&l=0&&(r=r.replace("!",""),d=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),f=!0),(a||l||f)&&(u=!a&&!s?"":""+e,h=""+n),f&&(e=u=u.toLowerCase(),n=h=h.toLowerCase()),r){case"*=":i=u.indexOf(h)>=0;break;case"$=":i=u.indexOf(h,u.length-h.length)>=0;break;case"^=":i=u.indexOf(h)===0;break;case"=":i=e===n;break;case">":p=!0,i=e>n;break;case">=":p=!0,i=e>=n;break;case"<":p=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return mB(this,t,e,vme)};o(xme,"addParent");ty.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return mB(this,t,e,xme)};o(XQe,"addParentAndChildren");ty.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return mB(this,t,e,XQe)};ty.ancestors=ty.parents;Wb=bme={data:kn.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:kn.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:kn.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:kn.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:kn.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:kn.removeData({field:"rscratch",triggerEvent:!1}),id:o(function(){var e=this[0];if(e)return e._private.data.id},"id")};Wb.attr=Wb.data;Wb.removeAttr=Wb.removeData;KQe=bme,pC={};o(wP,"defineDegreeFunction");pr(pC,{degree:wP(function(t,e){return e.source().same(e.target())?2:1}),indegree:wP(function(t,e){return e.target().same(t)?1:0}),outdegree:wP(function(t,e){return e.source().same(t)?1:0})});o($1,"defineDegreeBoundsFunction");pr(pC,{minDegree:$1("degree",function(t,e){return te}),minIndegree:$1("indegree",function(t,e){return te}),minOutdegree:$1("outdegree",function(t,e){return te})});pr(pC,{totalDegree:o(function(e){for(var r=0,n=this.nodes(),i=0;i0,p=d;d&&(f=f[0]);var m=p?f.position():{x:0,y:0};r!==void 0?h.position(e,r+m[e]):a!==void 0&&h.position({x:a.x+m.x,y:a.y+m.y})}else{var g=n.position(),y=l?n.parent():null,v=y&&y.length>0,x=v;v&&(y=y[0]);var b=x?y.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this},"relativePosition")};bc.modelPosition=bc.point=bc.position;bc.modelPositions=bc.points=bc.positions;bc.renderedPoint=bc.renderedPosition;bc.relativePoint=bc.relativePosition;QQe=Tme;Z1=Ad={};Ad.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,l=e.y1*n+i.y,u=e.y2*n+i.y;return{x1:a,x2:s,y1:l,y2:u,w:s-a,h:u-l}};Ad.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};Ad.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var l=s._private,u=s.children(),h=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},d=u.boundingBox({includeLabels:h,includeOverlays:!1,useCache:!1}),p=l.position;(d.w===0||d.h===0)&&(d={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},d.x1=p.x-d.w/2,d.x2=p.x+d.w/2,d.y1=p.y-d.h/2,d.y2=p.y+d.h/2);function m(L,I,N){var C=0,_=0,D=I+N;return L>0&&D>0&&(C=I/D*L,_=N/D*L),{biasDiff:C,biasComplementDiff:_}}o(m,"computeBiasValues");function g(L,I,N,C){if(N.units==="%")switch(C){case"width":return L>0?N.pfValue*L:0;case"height":return I>0?N.pfValue*I:0;case"average":return L>0&&I>0?N.pfValue*(L+I)/2:0;case"min":return L>0&&I>0?L>I?N.pfValue*I:N.pfValue*L:0;case"max":return L>0&&I>0?L>I?N.pfValue*L:N.pfValue*I:0;default:return 0}else return N.units==="px"?N.pfValue:0}o(g,"computePaddingValues");var y=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(y=y*100/f.width.val);var v=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(v=v*100/f.width.val);var x=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(x=x*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var T=m(f.width.val-d.w,y,v),E=T.biasDiff,w=T.biasComplementDiff,k=m(f.height.val-d.h,x,b),S=k.biasDiff,A=k.biasComplementDiff;l.autoPadding=g(d.w,d.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),l.autoWidth=Math.max(d.w,f.width.val),p.x=(-E+d.x1+d.x2+w)/2,l.autoHeight=Math.max(d.h,f.height.val),p.y=(-S+d.y1+d.y2+A)/2}o(r,"update");for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),dd=o(function(e,r){return r==null?e:xc(e,r.x1,r.y1,r.x2,r.y2)},"updateBoundsFromBox"),_b=o(function(e,r,n){return yo(e,r,n)},"prefixedProperty"),AS=o(function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,l=r.pstyle(n+"-arrow-shape").value,u,h;if(l!=="none"){n==="source"?(u=a.srcX,h=a.srcY):n==="target"?(u=a.tgtX,h=a.tgtY):(u=a.midX,h=a.midY);var f=i.arrowBounds=i.arrowBounds||{},d=f[n]=f[n]||{};d.x1=u-s,d.y1=h-s,d.x2=u+s,d.y2=h+s,d.w=d.x2-d.x1,d.h=d.y2-d.y1,OS(d,1),xc(e,d.x1,d.y1,d.x2,d.y2)}}},"updateBoundsFromArrow"),kP=o(function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,l=r.pstyle(i+"label").strValue;if(l){var u=r.pstyle("text-halign"),h=r.pstyle("text-valign"),f=_b(s,"labelWidth",n),d=_b(s,"labelHeight",n),p=_b(s,"labelX",n),m=_b(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,y=r.pstyle(i+"text-margin-y").pfValue,v=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,T=r.pstyle("text-border-width").pfValue,E=T/2,w=r.pstyle("text-background-padding").pfValue,k=2,S=d,A=f,L=A/2,I=S/2,N,C,_,D;if(v)N=p-L,C=p+L,_=m-I,D=m+I;else{switch(u.value){case"left":N=p-A,C=p;break;case"center":N=p-L,C=p+L;break;case"right":N=p,C=p+A;break}switch(h.value){case"top":_=m-S,D=m;break;case"center":_=m-I,D=m+I;break;case"bottom":_=m,D=m+S;break}}var M=g-Math.max(b,E)-w-k,R=g+Math.max(b,E)+w+k,P=y-Math.max(b,E)-w-k,B=y+Math.max(b,E)+w+k;N+=M,C+=R,_+=P,D+=B;var F=n||"main",G=a.labelBounds,$=G[F]=G[F]||{};$.x1=N,$.y1=_,$.x2=C,$.y2=D,$.w=C-N,$.h=D-_,$.leftPad=M,$.rightPad=R,$.topPad=P,$.botPad=B;var V=v&&x.strValue==="autorotate",X=x.pfValue!=null&&x.pfValue!==0;if(V||X){var Q=V?_b(a.rstyle,"labelAngle",n):x.pfValue,H=Math.cos(Q),ie=Math.sin(Q),Y=(N+C)/2,le=(_+D)/2;if(!v){switch(u.value){case"left":Y=C;break;case"right":Y=N;break}switch(h.value){case"top":le=D;break;case"bottom":le=_;break}}var ee=o(function(ke,we){return ke=ke-Y,we=we-le,{x:ke*H-we*ie+Y,y:ke*ie+we*H+le}},"rotate"),J=ee(N,_),te=ee(N,D),Z=ee(C,_),xe=ee(C,D);N=Math.min(J.x,te.x,Z.x,xe.x),C=Math.max(J.x,te.x,Z.x,xe.x),_=Math.min(J.y,te.y,Z.y,xe.y),D=Math.max(J.y,te.y,Z.y,xe.y)}var de=F+"Rot",Se=G[de]=G[de]||{};Se.x1=N,Se.y1=_,Se.x2=C,Se.y2=D,Se.w=C-N,Se.h=D-_,xc(e,N,_,C,D),xc(a.labelBounds.all,N,_,C,D)}return e}},"updateBoundsFromLabel"),zpe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value,a=r.pstyle("outline-offset").value,s=i+a;kme(e,r,n,s,"outside",s/2)}},"updateBoundsFromOutline"),kme=o(function(e,r,n,i,a,s){if(!(n===0||i<=0||a==="inside")){var l=r.cy(),u=r.pstyle("shape").value,h=l.renderer().nodeShapes[u],f=r.position(),d=f.x,p=f.y,m=r.width(),g=r.height();if(h.hasMiterBounds){a==="center"&&(i/=2);var y=h.miterBounds(d,p,m,g,i);dd(e,y)}else s!=null&&s>0&&PS(e,[s,s,s,s])}},"updateBoundsFromMiter"),ZQe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("border-opacity").value,i=r.pstyle("border-width").pfValue,a=r.pstyle("border-position").value;kme(e,r,n,i,a)}},"updateBoundsFromMiterBorder"),JQe=o(function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=Ms(),l=e._private,u=e.isNode(),h=e.isEdge(),f,d,p,m,g,y,v=l.rstyle,x=u&&i?e.pstyle("bounds-expansion").pfValue:[0],b=o(function(Me){return Me.pstyle("display").value!=="none"},"isDisplayed"),T=!i||b(e)&&(!h||b(e.source())&&b(e.target()));if(T){var E=0,w=0;i&&r.includeOverlays&&(E=e.pstyle("overlay-opacity").value,E!==0&&(w=e.pstyle("overlay-padding").value));var k=0,S=0;i&&r.includeUnderlays&&(k=e.pstyle("underlay-opacity").value,k!==0&&(S=e.pstyle("underlay-padding").value));var A=Math.max(w,S),L=0,I=0;if(i&&(L=e.pstyle("width").pfValue,I=L/2),u&&r.includeNodes){var N=e.position();g=N.x,y=N.y;var C=e.outerWidth(),_=C/2,D=e.outerHeight(),M=D/2;f=g-_,d=g+_,p=y-M,m=y+M,xc(s,f,p,d,m),i&&zpe(s,e),i&&r.includeOutlines&&!a&&zpe(s,e),i&&ZQe(s,e)}else if(h&&r.includeEdges)if(i&&!a){var R=e.pstyle("curve-style").strValue;if(f=Math.min(v.srcX,v.midX,v.tgtX),d=Math.max(v.srcX,v.midX,v.tgtX),p=Math.min(v.srcY,v.midY,v.tgtY),m=Math.max(v.srcY,v.midY,v.tgtY),f-=I,d+=I,p-=I,m+=I,xc(s,f,p,d,m),R==="haystack"){var P=v.haystackPts;if(P&&P.length===2){if(f=P[0].x,p=P[0].y,d=P[1].x,m=P[1].y,f>d){var B=f;f=d,d=B}if(p>m){var F=p;p=m,m=F}xc(s,f-I,p-I,d+I,m+I)}}else if(R==="bezier"||R==="unbundled-bezier"||pd(R,"segments")||pd(R,"taxi")){var G;switch(R){case"bezier":case"unbundled-bezier":G=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":G=v.linePts;break}if(G!=null)for(var $=0;$d){var Y=f;f=d,d=Y}if(p>m){var le=p;p=m,m=le}f-=I,d+=I,p-=I,m+=I,xc(s,f,p,d,m)}if(i&&r.includeEdges&&h&&(AS(s,e,"mid-source"),AS(s,e,"mid-target"),AS(s,e,"source"),AS(s,e,"target")),i){var ee=e.pstyle("ghost").value==="yes";if(ee){var J=e.pstyle("ghost-offset-x").pfValue,te=e.pstyle("ghost-offset-y").pfValue;xc(s,s.x1+J,s.y1+te,s.x2+J,s.y2+te)}}var Z=l.bodyBounds=l.bodyBounds||{};Sde(Z,s),PS(Z,x),OS(Z,1),i&&(f=s.x1,d=s.x2,p=s.y1,m=s.y2,xc(s,f-A,p-A,d+A,m+A));var xe=l.overlayBounds=l.overlayBounds||{};Sde(xe,s),PS(xe,x),OS(xe,1);var de=l.labelBounds=l.labelBounds||{};de.all!=null?IXe(de.all):de.all=Ms(),i&&r.includeLabels&&(r.includeMainLabels&&kP(s,e,null),h&&(r.includeSourceLabels&&kP(s,e,"source"),r.includeTargetLabels&&kP(s,e,"target")))}return s.x1=Nl(s.x1),s.y1=Nl(s.y1),s.x2=Nl(s.x2),s.y2=Nl(s.y2),s.w=Nl(s.x2-s.x1),s.h=Nl(s.y2-s.y1),s.w>0&&s.h>0&&T&&(PS(s,x),OS(s,1)),s},"boundingBoxImpl"),Eme=o(function(e){var r=0,n=o(function(s){return(s?1:0)<=0;l--)s(l);return this};Ed.removeAllListeners=function(){return this.removeListener("*")};Ed.emit=Ed.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,$n(e)||(e=[e]),mZe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var l=o(function(){var f=n[u];if(f.type===s.type&&(!f.namespace||f.namespace===s.namespace||f.namespace===dZe)&&a.eventMatches(a.context,f,s)){var d=[s];e!=null&&aXe(d,e),a.beforeEmit(a.context,f,s),f.conf&&f.conf.one&&(a.listeners=a.listeners.filter(function(g){return g!==f}));var p=a.callbackContext(a.context,f,s),m=f.callback.apply(p,d);a.afterEmit(a.context,f,s),m===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),u=0;u1&&!s){var l=this.length-1,u=this[l],h=u._private.data.id;this[l]=void 0,this[e]=u,a.set(h,{ele:u,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:o(function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:o(function(e){var r=this._private.cy;if(!e)return this;if(e&&or(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},"unmergeBy"),map:o(function(e,r){for(var n=[],i=this,a=0;an&&(n=u,i=l)}return{value:n,ele:i}},"max"),min:o(function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":aa(Symbol))!=e&&aa(Symbol.iterator)!=e;r&&(ZS[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return L0e({next:o(function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,i.style().apply(n));var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},"numericStyle"),numericStyleUnits:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},"numericStyleUnits"),renderedStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},"renderedStyle"),style:o(function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(sn(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(or(e))if(r===void 0){var l=this[0];return l?a.getStylePropertyValue(l,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var u=this[0];return u?a.getRawStyle(u):void 0}return this},"style"),removeStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(l[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:o(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:o(function(e){return this.neighborhood(e)},"openNeighborhood")});as.neighbourhood=as.neighborhood;as.closedNeighbourhood=as.closedNeighborhood;as.openNeighbourhood=as.openNeighborhood;pr(as,{source:Ml(o(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"sourceImpl"),"source"),target:Ml(o(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"targetImpl"),"target"),sources:Qpe({attr:"source"}),targets:Qpe({attr:"target"})});o(Qpe,"defineSourceFunction");pr(as,{edgesWith:Ml(Zpe(),"edgesWith"),edgesTo:Ml(Zpe({thisIsSrc:!0}),"edgesTo")});o(Zpe,"defineEdgesWithFunction");pr(as,{connectedEdges:Ml(function(t){for(var e=[],r=this,n=0;n0);return s},"components"),component:o(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});as.componentsOf=as.components;Va=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){ui("A collection must have a reference to the core");return}var a=new Oh,s=!1;if(!r)r=[];else if(r.length>0&&sn(r[0])&&!Qb(r[0])){s=!0;for(var l=[],u=new ry,h=0,f=r.length;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],l,u=0,h=r.length;u0){for(var F=l.length===r.length?r:new Va(n,l),G=0;G0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(D){for(var M=D._private.edges,R=0;R0&&(t?N.emitAndNotify("remove"):e&&N.emit("remove"));for(var C=0;Cf&&Math.abs(g.v)>f;);return p?function(y){return u[y*(u.length-1)|0]}:h},"springRK4Factory")})(),Wn=o(function(e,r,n,i){var a=SZe(e,r,n,i);return function(s,l,u){return s+(l-s)*a(u)}},"cubicBezier"),$S={linear:o(function(e,r,n){return e+(r-e)*n},"linear"),ease:Wn(.25,.1,.25,1),"ease-in":Wn(.42,0,1,1),"ease-out":Wn(0,0,.58,1),"ease-in-out":Wn(.42,0,.58,1),"ease-in-sine":Wn(.47,0,.745,.715),"ease-out-sine":Wn(.39,.575,.565,1),"ease-in-out-sine":Wn(.445,.05,.55,.95),"ease-in-quad":Wn(.55,.085,.68,.53),"ease-out-quad":Wn(.25,.46,.45,.94),"ease-in-out-quad":Wn(.455,.03,.515,.955),"ease-in-cubic":Wn(.55,.055,.675,.19),"ease-out-cubic":Wn(.215,.61,.355,1),"ease-in-out-cubic":Wn(.645,.045,.355,1),"ease-in-quart":Wn(.895,.03,.685,.22),"ease-out-quart":Wn(.165,.84,.44,1),"ease-in-out-quart":Wn(.77,0,.175,1),"ease-in-quint":Wn(.755,.05,.855,.06),"ease-out-quint":Wn(.23,1,.32,1),"ease-in-out-quint":Wn(.86,0,.07,1),"ease-in-expo":Wn(.95,.05,.795,.035),"ease-out-expo":Wn(.19,1,.22,1),"ease-in-out-expo":Wn(1,0,0,1),"ease-in-circ":Wn(.6,.04,.98,.335),"ease-out-circ":Wn(.075,.82,.165,1),"ease-in-out-circ":Wn(.785,.135,.15,.86),spring:o(function(e,r,n){if(n===0)return $S.linear;var i=CZe(e,r,n);return function(a,s,l){return a+(s-a)*i(l)}},"spring"),"cubic-bezier":Wn};o(e0e,"getEasedValue");o(t0e,"getValue");o(z1,"ease");o(AZe,"step$1");o(Rb,"valid");o(_Ze,"startAnimation");o(r0e,"stepAll");DZe={animate:kn.animate(),animation:kn.animation(),animated:kn.animated(),clearQueue:kn.clearQueue(),delay:kn.delay(),delayAnimation:kn.delayAnimation(),stop:kn.stop(),addToAnimationPool:o(function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:o(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:o(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&YS(o(function(a){r0e(a,e),r()},"animationStep"))}o(r,"headlessStep");var n=e.renderer();n&&n.beforeRender?n.beforeRender(o(function(a,s){r0e(s,e)},"rendererAnimationStep"),n.beforeRenderPriorities.animations):r()},"startAnimationLoop")},RZe={qualifierCompare:o(function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},"qualifierCompare"),eventMatches:o(function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&Qb(n.target)&&i.matches(n.target):!0},"eventMatches"),addEventFields:o(function(e,r){r.cy=e,r.target=e},"addEventFields"),callbackContext:o(function(e,r,n){return r.qualifier!=null?n.target:e},"callbackContext")},RS=o(function(e){return or(e)?new wd(e):e},"argSelector"),Ome={createEmitter:o(function(){var e=this._private;return e.emitter||(e.emitter=new mC(RZe,this)),this},"createEmitter"),emitter:o(function(){return this._private.emitter},"emitter"),on:o(function(e,r,n){return this.emitter().on(e,RS(r),n),this},"on"),removeListener:o(function(e,r,n){return this.emitter().removeListener(e,RS(r),n),this},"removeListener"),removeAllListeners:o(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:o(function(e,r,n){return this.emitter().one(e,RS(r),n),this},"one"),once:o(function(e,r,n){return this.emitter().one(e,RS(r),n),this},"once"),emit:o(function(e,r){return this.emitter().emit(e,r),this},"emit"),emitAndNotify:o(function(e,r){return this.emit(e),this.notify(e,r),this},"emitAndNotify")};kn.eventAliasesOn(Ome);qP={png:o(function(e){var r=this._private.renderer;return e=e||{},r.png(e)},"png"),jpg:o(function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)},"jpg")};qP.jpeg=qP.jpg;zS={layout:o(function(e){var r=this;if(e==null){ui("Layout options must be specified to make a layout");return}if(e.name==null){ui("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){ui("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;or(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(pr({},e,{cy:r,eles:a}));return s},"layout")};zS.createLayout=zS.makeLayout=zS.layout;LZe={notify:o(function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},"notify"),notifications:o(function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},"notifications"),noNotifications:o(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:o(function(){return this._private.batchCount>0},"batching"),startBatch:o(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:o(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},"endBatch"),batch:o(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:o(function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},"destroyRenderer"),onRender:o(function(e){return this.on("render",e)},"onRender"),offRender:o(function(e){return this.off("render",e)},"offRender")};UP.invalidateDimensions=UP.resize;GS={collection:o(function(e,r){return or(e)?this.$(e):jo(e)?e.collection():$n(e)?(r||(r={}),new Va(this,e,r.unique,r.removed)):new Va(this)},"collection"),nodes:o(function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},"nodes"),edges:o(function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},"edges"),$:o(function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},"$"),mutableElements:o(function(){return this._private.elements},"mutableElements")};GS.elements=GS.filter=GS.$;Ea={},Bb="t",MZe="f";Ea.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(p||d&&m){var g=void 0;p&&m||p?g=h.properties:m&&(g=h.mappedProperties);for(var y=0;y1&&(E=1),l.color){var k=n.valueMin[0],S=n.valueMax[0],A=n.valueMin[1],L=n.valueMax[1],I=n.valueMin[2],N=n.valueMax[2],C=n.valueMin[3]==null?1:n.valueMin[3],_=n.valueMax[3]==null?1:n.valueMax[3],D=[Math.round(k+(S-k)*E),Math.round(A+(L-A)*E),Math.round(I+(N-I)*E),Math.round(C+(_-C)*E)];a={bypass:n.bypass,name:n.name,value:D,strValue:"rgb("+D[0]+", "+D[1]+", "+D[2]+")"}}else if(l.number){var M=n.valueMin+(n.valueMax-n.valueMin)*E;a=this.parse(n.name,M,n.bypass,p)}else return!1;if(!a)return y(),!1;a.mapping=n,n=a;break}case s.data:{for(var R=n.field.split("."),P=d.data,B=0;B0&&a>0){for(var l={},u=!1,h=0;h0?t.delayAnimation(s).play().promise().then(T):T()}).then(function(){return t.animation({style:l,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};Ea.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],l=i(s);t.removed()||l!=null&&l(r,n,t)&&a(s)};Ea.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};Ea.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache()})};Ea.checkConnectedEdgesBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBoundsOfConnectedEdges},function(i){t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};Ea.checkParallelEdgesBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBoundsOfParallelEdges},function(i){t.parallelEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};Ea.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n),this.checkConnectedEdgesBoundsTrigger(t,e,r,n),this.checkParallelEdgesBoundsTrigger(t,e,r,n)};iT={};iT.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var l=0;li.length?n=n.substr(i.length):n=""}o(l,"removeSelAndBlockFromRemaining");function u(){a.length>s.length?a=a.substr(s.length):a=""}for(o(u,"removePropAndValFromRem");;){var h=n.match(/^\s*$/);if(h)break;var f=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){En("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=f[0];var d=f[1];if(d!=="core"){var p=new wd(d);if(p.invalid){En("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),l();continue}}var m=f[2],g=!1;a=m;for(var y=[];;){var v=a.match(/^\s*$/);if(v)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){En("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+m),g=!0;break}s=x[0];var b=x[1],T=x[2],E=e.properties[b];if(!E){En("Skipping property: Invalid property name in: "+s),u();continue}var w=r.parse(b,T);if(!w){En("Skipping property: Invalid property definition in: "+s),u();continue}y.push({name:b,val:T}),u()}if(g){l();break}r.selector(d);for(var k=0;k=7&&e[0]==="d"&&(f=new RegExp(l.data.regex).exec(e))){if(r)return!1;var p=l.data;return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(d=new RegExp(l.mapData.regex).exec(e))){if(r||h.multiple)return!1;var m=l.mapData;if(!(h.color||h.number))return!1;var g=this.parse(t,d[4]);if(!g||g.mapped)return!1;var y=this.parse(t,d[5]);if(!y||y.mapped)return!1;if(g.pfValue===y.pfValue||g.strValue===y.strValue)return En("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(h.color){var v=g.value,x=y.value,b=v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2]&&(v[3]===x[3]||(v[3]==null||v[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:d,strValue:""+e,mapped:m,field:d[1],fieldMin:parseFloat(d[2]),fieldMax:parseFloat(d[3]),valueMin:g.value,valueMax:y.value,bypass:r}}}if(h.multiple&&n!=="multiple"){var T;if(u?T=e.split(/\s+/):$n(e)?T=e:T=[e],h.evenMultiple&&T.length%2!==0)return null;for(var E=[],w=[],k=[],S="",A=!1,L=0;L0?" ":"")+I.strValue}return h.validate&&!h.validate(E,w)?null:h.singleEnum&&A?E.length===1&&or(E[0])?{name:t,value:E[0],strValue:E[0],bypass:r}:null:{name:t,value:E,pfValue:k,strValue:S,bypass:r,units:w}}var N=o(function(){for(var ee=0;eeh.max||h.strictMax&&e===h.max))return null;var R={name:t,value:e,strValue:""+e+(C||""),units:C,bypass:r};return h.unitless||C!=="px"&&C!=="em"?R.pfValue=e:R.pfValue=C==="px"||!C?e:this.getEmSizeInPixels()*e,(C==="ms"||C==="s")&&(R.pfValue=C==="ms"?e:1e3*e),(C==="deg"||C==="rad")&&(R.pfValue=C==="rad"?e:RXe(e)),C==="%"&&(R.pfValue=e/100),R}else if(h.propList){var P=[],B=""+e;if(B!=="none"){for(var F=B.split(/\s*,\s*|\s+/),G=0;G0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){u=Math.min((s-2*r)/n.w,(l-2*r)/n.h),u=u>this._private.maxZoom?this._private.maxZoom:u,u=u=n.minZoom&&(n.maxZoom=r),this},"zoomRange"),minZoom:o(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:o(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:o(function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,l=!1;if(r.zoomingEnabled||(l=!0),Nt(e)?s=e:sn(e)&&(s=e.level,e.position!=null?a=lC(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(l=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=u,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var h=e.pan;Nt(h.x)&&(r.pan.x=h.x,l=!1),Nt(h.y)&&(r.pan.y=h.y,l=!1),l||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},"viewport"),center:o(function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:o(function(e,r){if(this._private.panningEnabled){if(or(e)){var n=e;e=this.mutableElements().filter(n)}else jo(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var l={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return l}}},"getCenterPan"),reset:o(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:o(function(){this._private.sizeCache=null},"invalidateSize"),size:o(function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?(function(){var i=n.window().getComputedStyle(r),a=o(function(l){return parseFloat(i.getPropertyValue(l))},"val");return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}})():{width:1,height:1})},"size"),width:o(function(){return this.size().width},"width"),height:o(function(){return this.size().height},"height"),extent:o(function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},"extent"),renderedExtent:o(function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},"renderedExtent"),multiClickDebounceTime:o(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};q0.centre=q0.center;q0.autolockNodes=q0.autolock;q0.autoungrabifyNodes=q0.autoungrabify;Yb={data:kn.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:kn.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:kn.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:kn.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Yb.attr=Yb.data;Yb.removeAttr=Yb.removeData;jb=o(function(e){var r=this;e=pr({},e);var n=e.container;n&&!HS(n)&&HS(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=na!==void 0&&n!==void 0&&!e.headless,l=e;l.layout=pr({name:s?"grid":"null"},l.layout),l.renderer=pr({name:s?"canvas":"null"},l.renderer);var u=o(function(g,y,v){return y!==void 0?y:v!==void 0?v:g},"defVal"),h=this._private={container:n,ready:!1,options:l,elements:new Va(this),listeners:[],aniEles:new Va(this),data:l.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:u(!0,l.zoomingEnabled),userZoomingEnabled:u(!0,l.userZoomingEnabled),panningEnabled:u(!0,l.panningEnabled),userPanningEnabled:u(!0,l.userPanningEnabled),boxSelectionEnabled:u(!0,l.boxSelectionEnabled),autolock:u(!1,l.autolock,l.autolockNodes),autoungrabify:u(!1,l.autoungrabify,l.autoungrabifyNodes),autounselectify:u(!1,l.autounselectify),styleEnabled:l.styleEnabled===void 0?s:l.styleEnabled,zoom:Nt(l.zoom)?l.zoom:1,pan:{x:sn(l.pan)&&Nt(l.pan.x)?l.pan.x:0,y:sn(l.pan)&&Nt(l.pan.y)?l.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:u(250,l.multiClickDebounceTime)};this.createEmitter(),this.selectionType(l.selectionType),this.zoomRange({min:l.minZoom,max:l.maxZoom});var f=o(function(g,y){var v=g.some(Eje);if(v)return ny.all(g).then(y);y(g)},"loadExtData");h.styleEnabled&&r.setStyle([]);var d=pr({},l,l.renderer);r.initRenderer(d);var p=o(function(g,y,v){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(sn(g)||$n(g))&&r.add(g),r.one("layoutready",function(T){r.notifications(!0),r.emit(T),r.one("load",y),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",v),r.emit("done")});var b=pr({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()},"setElesAndLayout");f([l.style,l.elements],function(m){var g=m[0],y=m[1];h.styleEnabled&&r.style().append(g),p(y,function(){r.startAnimationLoop(),h.ready=!0,Ei(l.ready)&&r.on("ready",l.ready);for(var v=0;v0,l=!!t.boundingBox,u=Ms(l?t.boundingBox:structuredClone(e.extent())),h;if(jo(t.roots))h=t.roots;else if($n(t.roots)){for(var f=[],d=0;d0;){var D=_(),M=L(D,N);if(M)D.outgoers().filter(function(_e){return _e.isNode()&&r.has(_e)}).forEach(C);else if(M===null){En("Detected double maximal shift for node `"+D.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var R=0;if(t.avoidOverlap)for(var P=0;P0&&x[0].length<=3?Be/2:0),Ge=2*Math.PI/x[Ke].length*Te;return Ke===0&&x[0].length===1&&(Ue=1),{x:Z.x+Ue*Math.cos(Ge),y:Z.y+Ue*Math.sin(Ge)}}else{var Ne=x[Ke].length,We=Math.max(Ne===1?0:l?(u.w-t.padding*2-xe.w)/((t.grid?Se:Ne)-1):(u.w-t.padding*2-xe.w)/((t.grid?Se:Ne)+1),R),j={x:Z.x+(Te+1-(Ne+1)/2)*We,y:Z.y+(Ke+1-(H+1)/2)*de};return j}},"getPositionTopBottom"),ke={downward:0,leftward:90,upward:180,rightward:-90};Object.keys(ke).indexOf(t.direction)===-1&&ui("Invalid direction '".concat(t.direction,"' specified for breadthfirst layout. Valid values are: ").concat(Object.keys(ke).join(", ")));var we=o(function($e){return Jje(Me($e),u,ke[t.direction])},"getPosition");return r.nodes().layoutPositions(this,t,we),this};FZe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(Bme,"CircleLayout");Bme.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=Ms(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,h=u/Math.max(1,a.length-1),f,d=0,p=0;p1&&e.avoidOverlap){d*=1.75;var x=Math.cos(h)-Math.cos(0),b=Math.sin(h)-Math.sin(0),T=Math.sqrt(d*d/(x*x+b*b));f=Math.max(T,f)}var E=o(function(k,S){var A=e.startAngle+S*h*(i?1:-1),L=f*Math.cos(A),I=f*Math.sin(A),N={x:l.x+L,y:l.y+I};return N},"getPos");return n.nodes().layoutPositions(this,e,E),this};$Ze={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:o(function(e){return e.degree()},"concentric"),levelWidth:o(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(Fme,"ConcentricLayout");Fme.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=Ms(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=[],h=0,f=0;f0){var w=Math.abs(b[0].value-E.value);w>=v&&(b=[],x.push(b))}b.push(E)}var k=h+e.minNodeSpacing;if(!e.avoidOverlap){var S=x.length>0&&x[0].length>1,A=Math.min(s.w,s.h)/2-k,L=A/(x.length+S?1:0);k=Math.min(k,L)}for(var I=0,N=0;N1&&e.avoidOverlap){var M=Math.cos(D)-Math.cos(0),R=Math.sin(D)-Math.sin(0),P=Math.sqrt(k*k/(M*M+R*R));I=Math.max(P,I)}C.r=I,I+=k}if(e.equidistant){for(var B=0,F=0,G=0;G=t.numIter||(HZe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),YS(f)}},"frame");f()}else{for(;h;)h=s(u),u++;a0e(n,t),l()}return this};bC.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};bC.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};GZe=o(function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=Ms(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),l={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},u=n.eles.components(),h={},f=0;f0){l.graphSet.push(A);for(var f=0;fi.count?0:i.graph},"findLCA"),$me=o(function(e,r,n,i){var a=i.graphSet[n];if(-10)var d=i.nodeOverlap*f,p=Math.sqrt(l*l+u*u),m=d*l/p,g=d*u/p;else var y=eC(e,l,u),v=eC(r,-1*l,-1*u),x=v.x-y.x,b=v.y-y.y,T=x*x+b*b,p=Math.sqrt(T),d=(e.nodeRepulsion+r.nodeRepulsion)/T,m=d*x/p,g=d*b/p;e.isLocked||(e.offsetX-=m,e.offsetY-=g),r.isLocked||(r.offsetX+=m,r.offsetY+=g)}},"nodeRepulsion"),XZe=o(function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},"nodesOverlap"),eC=o(function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,l=e.width||1,u=n/r,h=s/l,f={};return r===0&&0n?(f.x=i,f.y=a+s/2,f):0r&&-1*h<=u&&u<=h?(f.x=i-l/2,f.y=a-l*n/2/r,f):0=h)?(f.x=i+s*r/2/n,f.y=a+s/2,f):(0>n&&(u<=-1*h||u>=h)&&(f.x=i-s*r/2/n,f.y=a-s/2),f)},"findClippingPoint"),KZe=o(function(e,r){for(var n=0;nn){var v=r.gravity*m/y,x=r.gravity*g/y;p.offsetX+=v,p.offsetY+=x}}}}},"calculateGravityForces"),ZZe=o(function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],l=e.idToIndex[s],u=e.layoutNodes[l],h=u.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},"limitForce"),Gme=o(function(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=v+r.componentSpacing,m=0,y=0,v=0)}}},"separateComponents"),tJe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:o(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(Vme,"GridLayout");Vme.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=Ms(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(X){return{x:a.x1,y:a.y1}});else{var s=i.size(),l=Math.sqrt(s*a.h/a.w),u=Math.round(l),h=Math.round(a.w/a.h*l),f=o(function(Q){if(Q==null)return Math.min(u,h);var H=Math.min(u,h);H==u?u=Q:h=Q},"small"),d=o(function(Q){if(Q==null)return Math.max(u,h);var H=Math.max(u,h);H==u?u=Q:h=Q},"large"),p=e.rows,m=e.cols!=null?e.cols:e.columns;if(p!=null&&m!=null)u=p,h=m;else if(p!=null&&m==null)u=p,h=Math.ceil(s/u);else if(p==null&&m!=null)h=m,u=Math.ceil(s/h);else if(h*u>s){var g=f(),y=d();(g-1)*y>=s?f(g-1):(y-1)*g>=s&&d(y-1)}else for(;h*u=s?d(x+1):f(v+1)}var b=a.w/h,T=a.h/u;if(e.condense&&(b=0,T=0),e.avoidOverlap)for(var E=0;E=h&&(M=0,D++)},"moveToNextCell"),P={},B=0;B(M=UXe(t,e,R[P],R[P+1],R[P+2],R[P+3])))return v(S,M),!0}else if(L.edgeType==="bezier"||L.edgeType==="multibezier"||L.edgeType==="self"||L.edgeType==="compound"){for(var R=L.allpts,P=0;P+5(M=qXe(t,e,R[P],R[P+1],R[P+2],R[P+3],R[P+4],R[P+5])))return v(S,M),!0}for(var B=B||A.source,F=F||A.target,G=i.getArrowWidth(I,N),$=[{name:"source",x:L.arrowStartX,y:L.arrowStartY,angle:L.srcArrowAngle},{name:"target",x:L.arrowEndX,y:L.arrowEndY,angle:L.tgtArrowAngle},{name:"mid-source",x:L.midX,y:L.midY,angle:L.midsrcArrowAngle},{name:"mid-target",x:L.midX,y:L.midY,angle:L.midtgtArrowAngle}],P=0;P<$.length;P++){var V=$[P],X=a.arrowShapes[S.pstyle(V.name+"-arrow-shape").value],Q=S.pstyle("width").pfValue;if(X.roughCollide(t,e,G,V.angle,{x:V.x,y:V.y},Q,f)&&X.collide(t,e,G,V.angle,{x:V.x,y:V.y},Q,f))return v(S),!0}h&&l.length>0&&(x(B),x(F))}o(b,"checkEdge");function T(S,A,L){return yo(S,A,L)}o(T,"preprop");function E(S,A){var L=S._private,I=p,N;A?N=A+"-":N="",S.boundingBox();var C=L.labelBounds[A||"main"],_=S.pstyle(N+"label").value,D=S.pstyle("text-events").strValue==="yes";if(!(!D||!_)){var M=T(L.rscratch,"labelX",A),R=T(L.rscratch,"labelY",A),P=T(L.rscratch,"labelAngle",A),B=S.pstyle(N+"text-margin-x").pfValue,F=S.pstyle(N+"text-margin-y").pfValue,G=C.x1-I-B,$=C.x2+I-B,V=C.y1-I-F,X=C.y2+I-F;if(P){var Q=Math.cos(P),H=Math.sin(P),ie=o(function(xe,de){return xe=xe-M,de=de-R,{x:xe*Q-de*H+M,y:xe*H+de*Q+R}},"rotate"),Y=ie(G,V),le=ie(G,X),ee=ie($,V),J=ie($,X),te=[Y.x+B,Y.y+F,ee.x+B,ee.y+F,J.x+B,J.y+F,le.x+B,le.y+F];if(vo(t,e,te))return v(S),!0}else if(md(C,t,e))return v(S),!0}}o(E,"checkLabel");for(var w=s.length-1;w>=0;w--){var k=s[w];k.isNode()?x(k)||E(k):b(k)||E(k)||E(k,"source")||E(k,"target")}return l};W0.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=this.cy.zoom(),s=2/a,l=[],u=Math.min(t,r),h=Math.max(t,r),f=Math.min(e,n),d=Math.max(e,n);t=u,r=h,e=f,n=d;var p=Ms({x1:t,y1:e,x2:r,y2:n}),m=[{x:p.x1,y:p.y1},{x:p.x2,y:p.y1},{x:p.x2,y:p.y2},{x:p.x1,y:p.y2}],g=[[m[0],m[1]],[m[1],m[2]],[m[2],m[3]],[m[3],m[0]]];function y(xe,de,Se){return yo(xe,de,Se)}o(y,"preprop");function v(xe,de){var Se=xe._private,Me=s,ke="";xe.boundingBox();var we=Se.labelBounds.main;if(!we)return null;var _e=y(Se.rscratch,"labelX",de),$e=y(Se.rscratch,"labelY",de),fe=y(Se.rscratch,"labelAngle",de),Ke=xe.pstyle(ke+"text-margin-x").pfValue,Te=xe.pstyle(ke+"text-margin-y").pfValue,Be=we.x1-Me-Ke,Ue=we.x2+Me-Ke,Ge=we.y1-Me-Te,Ne=we.y2+Me-Te;if(fe){var We=Math.cos(fe),j=Math.sin(fe),ae=o(function(ce,z){return ce=ce-_e,z=z-$e,{x:ce*We-z*j+_e,y:ce*j+z*We+$e}},"rotate");return[ae(Be,Ge),ae(Ue,Ge),ae(Ue,Ne),ae(Be,Ne)]}else return[{x:Be,y:Ge},{x:Ue,y:Ge},{x:Ue,y:Ne},{x:Be,y:Ne}]}o(v,"getRotatedLabelBox");function x(xe,de,Se,Me){function ke(we,_e,$e){return($e.y-we.y)*(_e.x-we.x)>(_e.y-we.y)*($e.x-we.x)}return o(ke,"ccw"),ke(xe,Se,Me)!==ke(de,Se,Me)&&ke(xe,de,Se)!==ke(xe,de,Me)}o(x,"doLinesIntersect");for(var b=0;b0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),oJe=o(function(e,r,n,i,a){if(e!==u0e?h0e(r,e,Su):sJe(Ll,Su),h0e(r,n,Ll),l0e=Su.nx*Ll.ny-Su.ny*Ll.nx,c0e=Su.nx*Ll.nx-Su.ny*-Ll.ny,Mh=Math.asin(Math.max(-1,Math.min(1,l0e))),Math.abs(Mh)<1e-6){WP=r.x,HP=r.y,P0=V1=0;return}F0=1,VS=!1,c0e<0?Mh<0?Mh=Math.PI+Mh:(Mh=Math.PI-Mh,F0=-1,VS=!0):Mh>0&&(F0=-1,VS=!0),r.radius!==void 0?V1=r.radius:V1=i,N0=Mh/2,LS=Math.min(Su.len/2,Ll.len/2),a?(ku=Math.abs(Math.cos(N0)*V1/Math.sin(N0)),ku>LS?(ku=LS,P0=Math.abs(ku*Math.sin(N0)/Math.cos(N0))):P0=V1):(ku=Math.min(LS,V1),P0=Math.abs(ku*Math.sin(N0)/Math.cos(N0))),YP=r.x+Ll.nx*ku,jP=r.y+Ll.ny*ku,WP=YP-Ll.ny*P0*F0,HP=jP+Ll.nx*P0*F0,Hme=r.x+Su.nx*ku,Yme=r.y+Su.ny*ku,u0e=r},"calcCornerArc");o(jme,"drawPreparedRoundCorner");o(TB,"getRoundCorner");Xb=.01,lJe=Math.sqrt(2*Xb),os={};os.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),l=t.pstyle("target-endpoint"),u=s.units!=null&&l.units!=null,h=o(function(w,k,S,A){var L=A-k,I=S-w,N=Math.sqrt(I*I+L*L);return{x:-L/N,y:I/N}},"recalcVectorNormInverse"),f=t.pstyle("edge-distances").value;switch(f){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(u){var d=this.manualEndptToPx(t.source()[0],s),p=Wi(d,2),m=p[0],g=p[1],y=this.manualEndptToPx(t.target()[0],l),v=Wi(y,2),x=v[0],b=v[1],T={x1:m,y1:g,x2:x,y2:b};i=h(m,g,x,b),a=T}else En("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};os.findHaystackPoints=function(t){for(var e=0;e0?Math.max(z-ne,0):Math.min(z+ne,0)},"subDWH"),_=C(I,A),D=C(N,L),M=!1;b===h?x=Math.abs(_)>Math.abs(D)?i:n:b===u||b===l?(x=n,M=!0):(b===a||b===s)&&(x=i,M=!0);var R=x===n,P=R?D:_,B=R?N:I,F=lB(B),G=!1;!(M&&(E||k))&&(b===l&&B<0||b===u&&B>0||b===a&&B>0||b===s&&B<0)&&(F*=-1,P=F*Math.abs(P),G=!0);var $;if(E){var V=w<0?1+w:w;$=V*P}else{var X=w<0?P:0;$=X+w*F}var Q=o(function(z){return Math.abs(z)=Math.abs(P)},"getIsTooClose"),H=Q($),ie=Q(Math.abs(P)-Math.abs($)),Y=H||ie;if(Y&&!G)if(R){var le=Math.abs(B)<=p/2,ee=Math.abs(I)<=m/2;if(le){var J=(f.x1+f.x2)/2,te=f.y1,Z=f.y2;r.segpts=[J,te,J,Z]}else if(ee){var xe=(f.y1+f.y2)/2,de=f.x1,Se=f.x2;r.segpts=[de,xe,Se,xe]}else r.segpts=[f.x1,f.y2]}else{var Me=Math.abs(B)<=d/2,ke=Math.abs(N)<=g/2;if(Me){var we=(f.y1+f.y2)/2,_e=f.x1,$e=f.x2;r.segpts=[_e,we,$e,we]}else if(ke){var fe=(f.x1+f.x2)/2,Ke=f.y1,Te=f.y2;r.segpts=[fe,Ke,fe,Te]}else r.segpts=[f.x2,f.y1]}else if(R){var Be=f.y1+$+(v?p/2*F:0),Ue=f.x1,Ge=f.x2;r.segpts=[Ue,Be,Ge,Be]}else{var Ne=f.x1+$+(v?d/2*F:0),We=f.y1,j=f.y2;r.segpts=[Ne,We,Ne,j]}if(r.isRound){var ae=t.pstyle("taxi-radius").value,U=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(ae),r.isArcRadius=new Array(r.segpts.length/2).fill(U)}};os.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,l=e.tgtW,u=e.tgtH,h=e.srcShape,f=e.tgtShape,d=e.srcCornerRadius,p=e.tgtCornerRadius,m=e.srcRs,g=e.tgtRs,y=!Nt(r.startX)||!Nt(r.startY),v=!Nt(r.arrowStartX)||!Nt(r.arrowStartY),x=!Nt(r.endX)||!Nt(r.endY),b=!Nt(r.arrowEndX)||!Nt(r.arrowEndY),T=3,E=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,w=T*E,k=G0({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),S=kB.poolIndex()){var F=P;P=B,B=F}var G=_.srcPos=P.position(),$=_.tgtPos=B.position(),V=_.srcW=P.outerWidth(),X=_.srcH=P.outerHeight(),Q=_.tgtW=B.outerWidth(),H=_.tgtH=B.outerHeight(),ie=_.srcShape=r.nodeShapes[e.getNodeShape(P)],Y=_.tgtShape=r.nodeShapes[e.getNodeShape(B)],le=_.srcCornerRadius=P.pstyle("corner-radius").value==="auto"?"auto":P.pstyle("corner-radius").pfValue,ee=_.tgtCornerRadius=B.pstyle("corner-radius").value==="auto"?"auto":B.pstyle("corner-radius").pfValue,J=_.tgtRs=B._private.rscratch,te=_.srcRs=P._private.rscratch;_.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var Z=0;Z<_.eles.length;Z++){var xe=_.eles[Z],de=xe[0]._private.rscratch,Se=xe.pstyle("curve-style").value,Me=Se==="unbundled-bezier"||pd(Se,"segments")||pd(Se,"taxi"),ke=!P.same(xe.source());if(!_.calculatedIntersection&&P!==B&&(_.hasBezier||_.hasUnbundled)){_.calculatedIntersection=!0;var we=ie.intersectLine(G.x,G.y,V,X,$.x,$.y,0,le,te),_e=_.srcIntn=we,$e=Y.intersectLine($.x,$.y,Q,H,G.x,G.y,0,ee,J),fe=_.tgtIntn=$e,Ke=_.intersectionPts={x1:we[0],x2:$e[0],y1:we[1],y2:$e[1]},Te=_.posPts={x1:G.x,x2:$.x,y1:G.y,y2:$.y},Be=$e[1]-we[1],Ue=$e[0]-we[0],Ge=Math.sqrt(Ue*Ue+Be*Be);Nt(Ge)&&Ge>=lJe||(Ge=Math.sqrt(Math.max(Ue*Ue,Xb)+Math.max(Be*Be,Xb)));var Ne=_.vector={x:Ue,y:Be},We=_.vectorNorm={x:Ne.x/Ge,y:Ne.y/Ge},j={x:-We.y,y:We.x};_.nodesOverlap=!Nt(Ge)||Y.checkPoint(we[0],we[1],0,Q,H,$.x,$.y,ee,J)||ie.checkPoint($e[0],$e[1],0,V,X,G.x,G.y,le,te),_.vectorNormInverse=j,D={nodesOverlap:_.nodesOverlap,dirCounts:_.dirCounts,calculatedIntersection:!0,hasBezier:_.hasBezier,hasUnbundled:_.hasUnbundled,eles:_.eles,srcPos:$,srcRs:J,tgtPos:G,tgtRs:te,srcW:Q,srcH:H,tgtW:V,tgtH:X,srcIntn:fe,tgtIntn:_e,srcShape:Y,tgtShape:ie,posPts:{x1:Te.x2,y1:Te.y2,x2:Te.x1,y2:Te.y1},intersectionPts:{x1:Ke.x2,y1:Ke.y2,x2:Ke.x1,y2:Ke.y1},vector:{x:-Ne.x,y:-Ne.y},vectorNorm:{x:-We.x,y:-We.y},vectorNormInverse:{x:-j.x,y:-j.y}}}var ae=ke?D:_;de.nodesOverlap=ae.nodesOverlap,de.srcIntn=ae.srcIntn,de.tgtIntn=ae.tgtIntn,de.isRound=Se.startsWith("round"),i&&(P.isParent()||P.isChild()||B.isParent()||B.isChild())&&(P.parents().anySame(B)||B.parents().anySame(P)||P.same(B)&&P.isParent())?e.findCompoundLoopPoints(xe,ae,Z,Me):P===B?e.findLoopPoints(xe,ae,Z,Me):Se.endsWith("segments")?e.findSegmentsPoints(xe,ae):Se.endsWith("taxi")?e.findTaxiPoints(xe,ae):Se==="straight"||!Me&&_.eles.length%2===1&&Z===Math.floor(_.eles.length/2)?e.findStraightEdgePoints(xe):e.findBezierPoints(xe,ae,Z,Me,ke),e.findEndpoints(xe),e.tryToCorrectInvalidPoints(xe,ae),e.checkForInvalidEdgeWarning(xe),e.storeAllpts(xe),e.storeEdgeProjections(xe),e.calculateArrowAngles(xe),e.recalculateEdgeLabelProjections(xe),e.calculateLabelAngles(xe)}},"_loop"),S=0;S0){var we=h,_e=O0(we,H1(s)),$e=O0(we,H1(ke)),fe=_e;if($e<_e&&(s=ke,fe=$e),ke.length>2){var Ke=O0(we,{x:ke[2],y:ke[3]});Ke0){var se=f,be=O0(se,H1(s)),pe=O0(se,H1(ne)),me=be;if(pe2){var Re=O0(se,{x:ne[2],y:ne[3]});Re=g||S){v={cp:E,segment:k};break}}if(v)break}var A=v.cp,L=v.segment,I=(g-x)/L.length,N=L.t1-L.t0,C=m?L.t0+N*I:L.t1-N*I;C=qb(0,C,1),e=X1(A.p0,A.p1,A.p2,C),p=uJe(A.p0,A.p1,A.p2,C);break}case"straight":case"segments":case"haystack":{for(var _=0,D,M,R,P,B=n.allpts.length,F=0;F+3=g));F+=2);var G=g-M,$=G/D;$=qb(0,$,1),e=NXe(R,P,$),p=Qme(R,P);break}}s("labelX",d,e.x),s("labelY",d,e.y),s("labelAutoAngle",d,p)}},"calculateEndProjection");h("source"),h("target"),this.applyLabelDimensions(t)}};_u.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};_u.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=z0(n,t._private.labelDimsKey);if(yo(r.rscratch,"prefixedLabelDimsKey",e)!==i){Ih(r.rscratch,"prefixedLabelDimsKey",e,i);var a=this.calculateLabelDimensions(t,n),s=t.pstyle("line-height").pfValue,l=t.pstyle("text-wrap").strValue,u=yo(r.rscratch,"labelWrapCachedLines",e)||[],h=l!=="wrap"?1:Math.max(u.length,1),f=a.height/h,d=f*s,p=a.width,m=a.height+(h-1)*(s-1)*f;Ih(r.rstyle,"labelWidth",e,p),Ih(r.rscratch,"labelWidth",e,p),Ih(r.rstyle,"labelHeight",e,m),Ih(r.rscratch,"labelHeight",e,m),Ih(r.rscratch,"labelLineHeight",e,d)}};_u.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=o(function(X,Q){return Q?(Ih(r.rscratch,X,e,Q),Q):yo(r.rscratch,X,e)},"rscratch");if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var l=t.pstyle("text-wrap").value;if(l==="wrap"){var u=s("labelKey");if(u!=null&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var h="\u200B",f=i.split(` -`),d=t.pstyle("text-max-width").pfValue,p=t.pstyle("text-overflow-wrap").value,m=p==="anywhere",g=[],y=/[\s\u200b]+|$/g,v=0;vd){var w=x.matchAll(y),k="",S=0,A=xo(w),L;try{for(A.s();!(L=A.n()).done;){var I=L.value,N=I[0],C=x.substring(S,I.index);S=I.index+N.length;var _=k.length===0?C:k+C+N,D=this.calculateLabelDimensions(t,_),M=D.width;M<=d?k+=C+N:(k&&g.push(k),k=C+N)}}catch(V){A.e(V)}finally{A.f()}k.match(/^[\s\u200b]+$/)||g.push(k)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` -`)),s("labelWrapKey",u)}else if(l==="ellipsis"){var R=t.pstyle("text-max-width").pfValue,P="",B="\u2026",F=!1;if(this.calculateLabelDimensions(t,i).widthR)break;P+=i[G],G===i.length-1&&(F=!0)}return F||(P+=B),P}return i};_u.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};_u.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=0,s=t.pstyle("font-style").strValue,l=t.pstyle("font-size").pfValue,u=t.pstyle("font-family").strValue,h=t.pstyle("font-weight").strValue,f=this.labelCalcCanvas,d=this.labelCalcCanvasContext;if(!f){f=this.labelCalcCanvas=i.createElement("canvas"),d=this.labelCalcCanvasContext=f.getContext("2d");var p=f.style;p.position="absolute",p.left="-9999px",p.top="-9999px",p.zIndex="-1",p.visibility="hidden",p.pointerEvents="none"}d.font="".concat(s," ").concat(h," ").concat(l,"px ").concat(u);for(var m=0,g=0,y=e.split(` -`),v=0;v1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),l)for(var u=0;u=t.desktopTapThreshold2}var at=a(z);ot&&(t.hoverData.tapholdCancelled=!0);var Ct=o(function(){var mt=t.hoverData.dragDelta=t.hoverData.dragDelta||[];mt.length===0?(mt.push(et[0]),mt.push(et[1])):(mt[0]+=et[0],mt[1]+=et[1])},"updateDragDelta");se=!0,i(Pe,["mousemove","vmousemove","tapdrag"],z,{x:Re[0],y:Re[1]});var yt=o(function(mt){return{originalEvent:z,type:mt,position:{x:Re[0],y:Re[1]}}},"makeEvent"),dt=o(function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||be.emit(yt("boxstart")),qe[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()},"goIntoBoxMode");if(t.hoverData.which===3){if(ot){var Ht=yt("cxtdrag");oe?oe.emit(Ht):be.emit(Ht),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||Pe!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit(yt("cxtdragout")),t.hoverData.cxtOver=Pe,Pe&&Pe.emit(yt("cxtdragover")))}}else if(t.hoverData.dragging){if(se=!0,be.panningEnabled()&&be.userPanningEnabled()){var cr;if(t.hoverData.justStartedPan){var Kt=t.hoverData.mdownPos;cr={x:(Re[0]-Kt[0])*pe,y:(Re[1]-Kt[1])*pe},t.hoverData.justStartedPan=!1}else cr={x:et[0]*pe,y:et[1]*pe};be.panBy(cr),be.emit(yt("dragpan")),t.hoverData.dragged=!0}Re=t.projectIntoViewport(z.clientX,z.clientY)}else if(qe[4]==1&&(oe==null||oe.pannable())){if(ot){if(!t.hoverData.dragging&&be.boxSelectionEnabled()&&(at||!be.panningEnabled()||!be.userPanningEnabled()))dt();else if(!t.hoverData.selecting&&be.panningEnabled()&&be.userPanningEnabled()){var kr=s(oe,t.hoverData.downs);kr&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,qe[4]=0,t.data.bgActivePosistion=H1(ge),t.redrawHint("select",!0),t.redraw())}oe&&oe.pannable()&&oe.active()&&oe.unactivate()}}else{if(oe&&oe.pannable()&&oe.active()&&oe.unactivate(),(!oe||!oe.grabbed())&&Pe!=Xe&&(Xe&&i(Xe,["mouseout","tapdragout"],z,{x:Re[0],y:Re[1]}),Pe&&i(Pe,["mouseover","tapdragover"],z,{x:Re[0],y:Re[1]}),t.hoverData.last=Pe),oe)if(ot){if(be.boxSelectionEnabled()&&at)oe&&oe.grabbed()&&(x(he),oe.emit(yt("freeon")),he.emit(yt("free")),t.dragData.didDrag&&(oe.emit(yt("dragfreeon")),he.emit(yt("dragfree")))),dt();else if(oe&&oe.grabbed()&&t.nodeIsDraggable(oe)){var ur=!t.dragData.didDrag;ur&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||y(he,{inDragLayer:!0});var tr={x:0,y:0};if(Nt(et[0])&&Nt(et[1])&&(tr.x+=et[0],tr.y+=et[1],ur)){var hr=t.hoverData.dragDelta;hr&&Nt(hr[0])&&Nt(hr[1])&&(tr.x+=hr[0],tr.y+=hr[1])}t.hoverData.draggingEles=!0,he.silentShift(tr).emit(yt("position")).emit(yt("drag")),t.redrawHint("drag",!0),t.redraw()}}else Ct();se=!0}if(qe[2]=Re[0],qe[3]=Re[1],se)return z.stopPropagation&&z.stopPropagation(),z.preventDefault&&z.preventDefault(),!1}},"mousemoveHandler"),!1);var C,_,D;t.registerBinding(e,"mouseup",o(function(z){if(!(t.hoverData.which===1&&z.which!==1&&t.hoverData.capture)){var ne=t.hoverData.capture;if(ne){t.hoverData.capture=!1;var se=t.cy,be=t.projectIntoViewport(z.clientX,z.clientY),pe=t.selection,me=t.findNearestElement(be[0],be[1],!0,!1),Re=t.dragData.possibleDragElements,ge=t.hoverData.down,Ie=a(z);t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,ge&&ge.unactivate();var qe=o(function(Dt){return{originalEvent:z,type:Dt,position:{x:be[0],y:be[1]}}},"makeEvent");if(t.hoverData.which===3){var Pe=qe("cxttapend");if(ge?ge.emit(Pe):se.emit(Pe),!t.hoverData.cxtDragged){var Xe=qe("cxttap");ge?ge.emit(Xe):se.emit(Xe)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(i(me,["mouseup","tapend","vmouseup"],z,{x:be[0],y:be[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(i(ge,["click","tap","vclick"],z,{x:be[0],y:be[1]}),_=!1,z.timeStamp-D<=se.multiClickDebounceTime()?(C&&clearTimeout(C),_=!0,D=null,i(ge,["dblclick","dbltap","vdblclick"],z,{x:be[0],y:be[1]})):(C=setTimeout(function(){_||i(ge,["oneclick","onetap","voneclick"],z,{x:be[0],y:be[1]})},se.multiClickDebounceTime()),D=z.timeStamp)),ge==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!a(z)&&(se.$(r).unselect(["tapunselect"]),Re.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=Re=se.collection()),me==ge&&!t.dragData.didDrag&&!t.hoverData.selecting&&me!=null&&me._private.selectable&&(t.hoverData.dragging||(se.selectionType()==="additive"||Ie?me.selected()?me.unselect(["tapunselect"]):me.select(["tapselect"]):Ie||(se.$(r).unmerge(me).unselect(["tapunselect"]),me.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var oe=se.collection(t.getAllInBox(pe[0],pe[1],pe[2],pe[3]));t.redrawHint("select",!0),oe.length>0&&t.redrawHint("eles",!0),se.emit(qe("boxend"));var et=o(function(Dt){return Dt.selectable()&&!Dt.selected()},"eleWouldBeSelected");se.selectionType()==="additive"||Ie||se.$(r).unmerge(oe).unselect(),oe.emit(qe("box")).stdFilter(et).select().emit(qe("boxselect")),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!pe[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var he=ge&&ge.grabbed();x(Re),he&&(ge.emit(qe("freeon")),Re.emit(qe("free")),t.dragData.didDrag&&(ge.emit(qe("dragfreeon")),Re.emit(qe("dragfree"))))}}pe[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},"mouseupHandler"),!1);var M=[],R=4,P,B=1e5,F=o(function(z,ne){for(var se=0;se=R){var be=M;if(P=F(be,5),!P){var pe=Math.abs(be[0]);P=G(be)&&pe>5}if(P)for(var me=0;me5&&(se=lB(se)*5),Xe=se/-250,P&&(Xe/=B,Xe*=3),Xe=Xe*t.wheelSensitivity;var oe=z.deltaMode===1;oe&&(Xe*=33);var et=Re.zoom()*Math.pow(10,Xe);z.type==="gesturechange"&&(et=t.gestureStartZoom*z.scale),Re.zoom({level:et,renderedPosition:{x:Pe[0],y:Pe[1]}}),Re.emit({type:z.type==="gesturechange"?"pinchzoom":"scrollzoom",originalEvent:z,position:{x:qe[0],y:qe[1]}})}}}},"wheelHandler");t.registerBinding(t.container,"wheel",$,!0),t.registerBinding(e,"scroll",o(function(z){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},"scrollHandler"),!0),t.registerBinding(t.container,"gesturestart",o(function(z){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||z.preventDefault()},"gestureStartHandler"),!0),t.registerBinding(t.container,"gesturechange",function(ce){t.hasTouchStarted||$(ce)},!0),t.registerBinding(t.container,"mouseout",o(function(z){var ne=t.projectIntoViewport(z.clientX,z.clientY);t.cy.emit({originalEvent:z,type:"mouseout",position:{x:ne[0],y:ne[1]}})},"mouseOutHandler"),!1),t.registerBinding(t.container,"mouseover",o(function(z){var ne=t.projectIntoViewport(z.clientX,z.clientY);t.cy.emit({originalEvent:z,type:"mouseover",position:{x:ne[0],y:ne[1]}})},"mouseOverHandler"),!1);var V,X,Q,H,ie,Y,le,ee,J,te,Z,xe,de,Se=o(function(z,ne,se,be){return Math.sqrt((se-z)*(se-z)+(be-ne)*(be-ne))},"distance"),Me=o(function(z,ne,se,be){return(se-z)*(se-z)+(be-ne)*(be-ne)},"distanceSq"),ke;t.registerBinding(t.container,"touchstart",ke=o(function(z){if(t.hasTouchStarted=!0,!!I(z)){T(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var ne=t.cy,se=t.touchData.now,be=t.touchData.earlier;if(z.touches[0]){var pe=t.projectIntoViewport(z.touches[0].clientX,z.touches[0].clientY);se[0]=pe[0],se[1]=pe[1]}if(z.touches[1]){var pe=t.projectIntoViewport(z.touches[1].clientX,z.touches[1].clientY);se[2]=pe[0],se[3]=pe[1]}if(z.touches[2]){var pe=t.projectIntoViewport(z.touches[2].clientX,z.touches[2].clientY);se[4]=pe[0],se[5]=pe[1]}var me=o(function(at){return{originalEvent:z,type:at,position:{x:se[0],y:se[1]}}},"makeEvent");if(z.touches[1]){t.touchData.singleTouchMoved=!0,x(t.dragData.touchDragEles);var Re=t.findContainerClientCoords();J=Re[0],te=Re[1],Z=Re[2],xe=Re[3],V=z.touches[0].clientX-J,X=z.touches[0].clientY-te,Q=z.touches[1].clientX-J,H=z.touches[1].clientY-te,de=0<=V&&V<=Z&&0<=Q&&Q<=Z&&0<=X&&X<=xe&&0<=H&&H<=xe;var ge=ne.pan(),Ie=ne.zoom();ie=Se(V,X,Q,H),Y=Me(V,X,Q,H),le=[(V+Q)/2,(X+H)/2],ee=[(le[0]-ge.x)/Ie,(le[1]-ge.y)/Ie];var qe=200,Pe=qe*qe;if(Y=1){for(var It=t.touchData.startPosition=[null,null,null,null,null,null],wt=0;wt=t.touchTapThreshold2}if(ne&&t.touchData.cxt){z.preventDefault();var wt=z.touches[0].clientX-J,Rt=z.touches[0].clientY-te,it=z.touches[1].clientX-J,at=z.touches[1].clientY-te,Ct=Me(wt,Rt,it,at),yt=Ct/Y,dt=150,Ht=dt*dt,cr=1.5,Kt=cr*cr;if(yt>=Kt||Ct>=Ht){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var kr=Ie("cxttapend");t.touchData.start?(t.touchData.start.unactivate().emit(kr),t.touchData.start=null):be.emit(kr)}}if(ne&&t.touchData.cxt){var kr=Ie("cxtdrag");t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(kr):be.emit(kr),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var ur=t.findNearestElement(pe[0],pe[1],!0,!0);(!t.touchData.cxtOver||ur!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit(Ie("cxtdragout")),t.touchData.cxtOver=ur,ur&&ur.emit(Ie("cxtdragover")))}else if(ne&&z.touches[2]&&be.boxSelectionEnabled())z.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||be.emit(Ie("boxstart")),t.touchData.selecting=!0,t.touchData.didSelect=!0,se[4]=1,!se||se.length===0||se[0]===void 0?(se[0]=(pe[0]+pe[2]+pe[4])/3,se[1]=(pe[1]+pe[3]+pe[5])/3,se[2]=(pe[0]+pe[2]+pe[4])/3+1,se[3]=(pe[1]+pe[3]+pe[5])/3+1):(se[2]=(pe[0]+pe[2]+pe[4])/3,se[3]=(pe[1]+pe[3]+pe[5])/3),t.redrawHint("select",!0),t.redraw();else if(ne&&z.touches[1]&&!t.touchData.didSelect&&be.zoomingEnabled()&&be.panningEnabled()&&be.userZoomingEnabled()&&be.userPanningEnabled()){z.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var tr=t.dragData.touchDragEles;if(tr){t.redrawHint("drag",!0);for(var hr=0;hr0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},"touchmoveHandler"),!1);var _e;t.registerBinding(e,"touchcancel",_e=o(function(z){var ne=t.touchData.start;t.touchData.capture=!1,ne&&ne.unactivate()},"touchcancelHandler"));var $e,fe,Ke,Te;if(t.registerBinding(e,"touchend",$e=o(function(z){var ne=t.touchData.start,se=t.touchData.capture;if(se)z.touches.length===0&&(t.touchData.capture=!1),z.preventDefault();else return;var be=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var pe=t.cy,me=pe.zoom(),Re=t.touchData.now,ge=t.touchData.earlier;if(z.touches[0]){var Ie=t.projectIntoViewport(z.touches[0].clientX,z.touches[0].clientY);Re[0]=Ie[0],Re[1]=Ie[1]}if(z.touches[1]){var Ie=t.projectIntoViewport(z.touches[1].clientX,z.touches[1].clientY);Re[2]=Ie[0],Re[3]=Ie[1]}if(z.touches[2]){var Ie=t.projectIntoViewport(z.touches[2].clientX,z.touches[2].clientY);Re[4]=Ie[0],Re[5]=Ie[1]}var qe=o(function(Ht){return{originalEvent:z,type:Ht,position:{x:Re[0],y:Re[1]}}},"makeEvent");ne&&ne.unactivate();var Pe;if(t.touchData.cxt){if(Pe=qe("cxttapend"),ne?ne.emit(Pe):pe.emit(Pe),!t.touchData.cxtDragged){var Xe=qe("cxttap");ne?ne.emit(Xe):pe.emit(Xe)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!z.touches[2]&&pe.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var oe=pe.collection(t.getAllInBox(be[0],be[1],be[2],be[3]));be[0]=void 0,be[1]=void 0,be[2]=void 0,be[3]=void 0,be[4]=0,t.redrawHint("select",!0),pe.emit(qe("boxend"));var et=o(function(Ht){return Ht.selectable()&&!Ht.selected()},"eleWouldBeSelected");oe.emit(qe("box")).stdFilter(et).select().emit(qe("boxselect")),oe.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(ne?.unactivate(),z.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!z.touches[1]){if(!z.touches[0]){if(!z.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var he=t.dragData.touchDragEles;if(ne!=null){var ot=ne._private.grabbed;x(he),t.redrawHint("drag",!0),t.redrawHint("eles",!0),ot&&(ne.emit(qe("freeon")),he.emit(qe("free")),t.dragData.didDrag&&(ne.emit(qe("dragfreeon")),he.emit(qe("dragfree")))),i(ne,["touchend","tapend","vmouseup","tapdragout"],z,{x:Re[0],y:Re[1]}),ne.unactivate(),t.touchData.start=null}else{var Dt=t.findNearestElement(Re[0],Re[1],!0,!0);i(Dt,["touchend","tapend","vmouseup","tapdragout"],z,{x:Re[0],y:Re[1]})}var It=t.touchData.startPosition[0]-Re[0],wt=It*It,Rt=t.touchData.startPosition[1]-Re[1],it=Rt*Rt,at=wt+it,Ct=at*me*me;t.touchData.singleTouchMoved||(ne||pe.$(":selected").unselect(["tapunselect"]),i(ne,["tap","vclick"],z,{x:Re[0],y:Re[1]}),fe=!1,z.timeStamp-Te<=pe.multiClickDebounceTime()?(Ke&&clearTimeout(Ke),fe=!0,Te=null,i(ne,["dbltap","vdblclick"],z,{x:Re[0],y:Re[1]})):(Ke=setTimeout(function(){fe||i(ne,["onetap","voneclick"],z,{x:Re[0],y:Re[1]})},pe.multiClickDebounceTime()),Te=z.timeStamp)),ne!=null&&!t.dragData.didDrag&&ne._private.selectable&&Ct"u"){var Be=[],Ue=o(function(z){return{clientX:z.clientX,clientY:z.clientY,force:1,identifier:z.pointerId,pageX:z.pageX,pageY:z.pageY,radiusX:z.width/2,radiusY:z.height/2,screenX:z.screenX,screenY:z.screenY,target:z.target}},"makeTouch"),Ge=o(function(z){return{event:z,touch:Ue(z)}},"makePointer"),Ne=o(function(z){Be.push(Ge(z))},"addPointer"),We=o(function(z){for(var ne=0;ne0)return V[0]}return null},"getCurveT"),g=Object.keys(p),y=0;y0?m:J0e(a,s,e,r,n,i,l,u)},"intersectLine"),checkPoint:o(function(e,r,n,i,a,s,l,u){u=u==="auto"?Td(i,a):u;var h=2*u;if(Bh(e,r,this.points,s,l,i,a-h,[0,-1],n)||Bh(e,r,this.points,s,l,i-h,a,[0,-1],n))return!0;var f=i/2+2*n,d=a/2+2*n,p=[s-f,l-d,s-f,l,s+f,l,s+f,l-d];return!!(vo(e,r,p)||$0(e,r,h,h,s+i/2-u,l+a/2-u,n)||$0(e,r,h,h,s-i/2+u,l+a/2-u,n))},"checkPoint")}};Fh.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",Ns(3,0)),this.generateRoundPolygon("round-triangle",Ns(3,0)),this.generatePolygon("rectangle",Ns(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",Ns(5,0)),this.generateRoundPolygon("round-pentagon",Ns(5,0)),this.generatePolygon("hexagon",Ns(6,0)),this.generateRoundPolygon("round-hexagon",Ns(6,0)),this.generatePolygon("heptagon",Ns(7,0)),this.generateRoundPolygon("round-heptagon",Ns(7,0)),this.generatePolygon("octagon",Ns(8,0)),this.generateRoundPolygon("round-octagon",Ns(8,0));var n=new Array(20);{var i=OP(5,0),a=OP(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var l=0;l=e.deqFastCost*E)break}else if(h){if(b>=e.deqCost*m||b>=e.deqAvgCost*p)break}else if(T>=e.deqNoDrawCost*CP)break;var w=e.deq(n,v,y);if(w.length>0)for(var k=0;k0&&(e.onDeqd(n,g),!h&&e.shouldRedraw(n,g,v,y)&&a())},"dequeue"),l=e.priority||aB;i.beforeRender(s,l(n))}},"setupDequeueingImpl")},"setupDequeueing")},fJe=(function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:jS;Sd(this,t),this.idsByKey=new Oh,this.keyForId=new Oh,this.cachesByLvl=new Oh,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return o(t,"ElementTextureCacheLookup"),Cd(t,[{key:"getIdsFor",value:o(function(r){r==null&&ui("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new ry,n.set(r,i)),i},"getIdsFor")},{key:"addIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).add(n)},"addIdForKey")},{key:"deleteIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).delete(n)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:o(function(r){return r==null?0:this.getIdsFor(r).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a},"keyHasChangedFor")},{key:"isInvalid",value:o(function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)},"isInvalid")},{key:"getCachesAt",value:o(function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new Oh,n.set(r,a),i.push(r)),a},"getCachesAt")},{key:"getCache",value:o(function(r,n){return this.getCachesAt(n).get(r)},"getCache")},{key:"get",value:o(function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a},"get")},{key:"getForCachedKey",value:o(function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a},"getForCachedKey")},{key:"hasCache",value:o(function(r,n){return this.getCachesAt(n).has(r)},"hasCache")},{key:"has",value:o(function(r,n){var i=this.getKey(r);return this.hasCache(i,n)},"has")},{key:"setCache",value:o(function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)},"setCache")},{key:"set",value:o(function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)},"set")},{key:"deleteCache",value:o(function(r,n){this.getCachesAt(n).delete(r)},"deleteCache")},{key:"delete",value:o(function(r,n){var i=this.getKey(r);this.deleteCache(i,n)},"_delete")},{key:"invalidateKey",value:o(function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})},"invalidateKey")},{key:"invalidate",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0},"invalidate")}])})(),m0e=25,NS=50,qS=-4,XP=3,nge=7.99,dJe=8,pJe=1024,mJe=1024,gJe=1024,yJe=.2,vJe=.8,xJe=10,bJe=.15,TJe=.1,wJe=.9,kJe=.9,EJe=100,SJe=1,j1={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},CJe=qa({getKey:null,doesEleInvalidateKey:jS,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:H0e,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),Pb=o(function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=CJe(r);pr(n,i),n.lookup=new fJe(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},"ElementTextureCache"),sa=Pb.prototype;sa.reasons=j1;sa.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};sa.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};sa.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new rT(function(r,n){return n.reqs-r.reqs});return e};sa.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};sa.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,l=s.cy.zoom(),u=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(oB(l*r))),n=nge||n>XP)return null;var h=Math.pow(2,n),f=e.h*h,d=e.w*h,p=s.eleTextBiggerThanMin(t,h);if(!this.isVisible(t,p))return null;var m=u.get(t,n);if(m&&m.invalidated&&(m.invalidated=!1,m.texture.invalidatedWidth-=m.width),m)return m;var g;if(f<=m0e?g=m0e:f<=NS?g=NS:g=Math.ceil(f/NS)*NS,f>gJe||d>mJe)return null;var y=a.getTextureQueue(g),v=y[y.length-2],x=o(function(){return a.recycleTexture(g,d)||a.addTexture(g,d)},"addNewTxr");v||(v=y[y.length-1]),v||(v=x()),v.width-v.usedWidthn;N--)L=a.getElement(t,e,r,N,j1.downscale);I()}else return a.queueElement(t,k.level-1),k;else{var C;if(!T&&!E&&!w)for(var _=n-1;_>=qS;_--){var D=u.get(t,_);if(D){C=D;break}}if(b(C))return a.queueElement(t,n),C;v.context.translate(v.usedWidth,0),v.context.scale(h,h),this.drawElement(v.context,t,e,p,!1),v.context.scale(1/h,1/h),v.context.translate(-v.usedWidth,0)}return m={x:v.usedWidth,texture:v,level:n,scale:h,width:d,height:f,scaledLabelShown:p},v.usedWidth+=Math.ceil(d+dJe),v.eleCaches.push(m),u.set(t,n,m),a.checkTextureFullness(v),m};sa.invalidateElements=function(t){for(var e=0;e=yJe*t.width&&this.retireTexture(t)};sa.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>vJe&&t.fullnessChecks>=xJe?bd(r,t):t.fullnessChecks++};sa.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;bd(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,sB(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),bd(i,s),n.push(s),s}};sa.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var l={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(l),i[a]=l}};sa.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var l=r.pop(),u=l.key,h=l.eles[0],f=a.hasCache(h,l.level);if(n[u]=null,f)continue;i.push(l);var d=e.getBoundingBox(h);e.getElement(h,d,t,l.level,j1.dequeue)}return i};sa.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=iB,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};sa.onDequeue=function(t){this.onDequeues.push(t)};sa.offDequeue=function(t){bd(this.onDequeues,t)};sa.setupDequeueing=rge.setupDequeueing({deqRedrawThreshold:EJe,deqCost:bJe,deqAvgCost:TJe,deqNoDrawCost:wJe,deqFastCost:kJe,deq:o(function(e,r,n){return e.dequeue(r,n)},"deq"),onDeqd:o(function(e,r){for(var n=0;n=_Je||r>rC)return null}n.validateLayersElesOrdering(r,t);var u=n.layersByLevel,h=Math.pow(2,r),f=u[r]=u[r]||[],d,p=n.levelIsComplete(r,t),m,g=o(function(){var I=o(function(M){if(n.validateLayersElesOrdering(M,t),n.levelIsComplete(M,t))return m=u[M],!0},"canUseAsTmpLvl"),N=o(function(M){if(!m)for(var R=r+M;Fb<=R&&R<=rC&&!I(R);R+=M);},"checkLvls");N(1),N(-1);for(var C=f.length-1;C>=0;C--){var _=f[C];_.invalid&&bd(f,_)}},"checkTempLevels");if(!p)g();else return f;var y=o(function(){if(!d){d=Ms();for(var I=0;Iy0e||_>y0e)return null;var D=C*_;if(D>PJe)return null;var M=n.makeLayer(d,r);if(N!=null){var R=f.indexOf(N)+1;f.splice(R,0,M)}else(I.insert===void 0||I.insert)&&f.unshift(M);return M},"makeLayer");if(n.skipping&&!l)return null;for(var x=null,b=t.length/AJe,T=!l,E=0;E=b||!Z0e(x.bb,w.boundingBox()))&&(x=v({insert:!0,after:x}),!x))return null;m||T?n.queueLayer(x,w):n.drawEleInLayer(x,w,r,e),x.eles.push(w),S[r]=x}return m||(T?null:f)};Ua.getEleLevelForLayerLevel=function(t,e){return t};Ua.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,l=e.boundingBox();l.w===0||l.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,BJe),a.setImgSmoothing(s,!0))};Ua.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};Ua.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};Ua.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=Ph(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,o(function(n,i,a){e.invalidateLayer(n)},"invalAssocLayers")))};Ua.invalidateLayer=function(t){if(this.lastInvalidationTime=Ph(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];bd(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l=e._private.rscratch;if(!(a&&!e.visible())&&!(l.badLine||l.allpts==null||isNaN(l.allpts[0]))){var u;r&&(u=r,t.translate(-u.x1,-u.y1));var h=a?e.pstyle("opacity").value:1,f=a?e.pstyle("line-opacity").value:1,d=e.pstyle("curve-style").value,p=e.pstyle("line-style").value,m=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,v=e.pstyle("line-outline-color").value,x=h*f,b=h*f,T=o(function(){var M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;d==="straight-triangle"?(s.eleStrokeStyle(t,e,M),s.drawEdgeTrianglePath(e,t,l.allpts)):(t.lineWidth=m,t.lineCap=g,s.eleStrokeStyle(t,e,M),s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLine"),E=o(function(){var M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=m+y,t.lineCap=g,y>0)s.colorStrokeStyle(t,v[0],v[1],v[2],M);else{t.lineCap="butt";return}d==="straight-triangle"?s.drawEdgeTrianglePath(e,t,l.allpts):(s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLineOutline"),w=o(function(){i&&s.drawEdgeOverlay(t,e)},"drawOverlay"),k=o(function(){i&&s.drawEdgeUnderlay(t,e)},"drawUnderlay"),S=o(function(){var M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,M)},"drawArrows"),A=o(function(){s.drawElementText(t,e,null,n)},"drawText");t.lineJoin="round";var L=e.pstyle("ghost").value==="yes";if(L){var I=e.pstyle("ghost-offset-x").pfValue,N=e.pstyle("ghost-offset-y").pfValue,C=e.pstyle("ghost-opacity").value,_=x*C;t.translate(I,N),T(_),S(_),t.translate(-I,-N)}else E();k(),T(),S(),w(),A(),r&&t.translate(u.x1,u.y1)}};sge=o(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),l=n._private.rscratch,u=n.pstyle("".concat(e,"-padding")).pfValue,h=2*u,f=n.pstyle("".concat(e,"-color")).value;r.lineWidth=h,l.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,f[0],f[1],f[2],i),a.drawEdgePath(n,r,l.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");$h.drawEdgeOverlay=sge("overlay");$h.drawEdgeUnderlay=sge("underlay");$h.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,l=!1,u=this.usePaths(),h=t.pstyle("line-dash-pattern").pfValue,f=t.pstyle("line-dash-offset").pfValue;if(u){var d=r.join("$"),p=i.pathCacheKey&&i.pathCacheKey===d;p?(s=e=i.pathCache,l=!0):(s=e=new Path2D,i.pathCacheKey=d,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(h),a.lineDashOffset=f;break;case"solid":a.setLineDash([]);break}if(!l&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var m=2;m+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var l=e.pstyle("label");if(!l||!l.value)return;var u=s.getLabelJustification(e);t.textAlign=u,t.textBaseline="bottom"}else{var h=e.element()._private.rscratch.badLine,f=e.pstyle("label"),d=e.pstyle("source-label"),p=e.pstyle("target-label");if(h||(!f||!f.value)&&(!d||!d.value)&&(!p||!p.value))return;t.textAlign="center",t.textBaseline="bottom"}var m=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,m,a),e.isEdge()&&(s.drawText(t,e,"source",m,a),s.drawText(t,e,"target",m,a))):s.drawText(t,e,i,m,a),r&&t.translate(g.x1,g.y1)};H0.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,l=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,u=e.pstyle("text-outline-opacity").value*l,h=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,h[0],h[1],h[2],l),this.colorStrokeStyle(t,f[0],f[1],f[2],u)};o(jJe,"circle");o(T0e,"roundRect");H0.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation");if(s.strValue==="autorotate"){var l=yo(i,"labelAngle",e);r=t.isEdge()?l:0}else s.strValue==="none"?r=0:r=s.pfValue;return r};H0.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,l=i?e.effectiveOpacity():1;if(!(i&&(l===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var u=yo(s,"labelX",r),h=yo(s,"labelY",r),f,d,p=this.getLabelText(e,r);if(p!=null&&p!==""&&!isNaN(u)&&!isNaN(h)){this.setupTextStyle(t,e,i);var m=r?r+"-":"",g=yo(s,"labelWidth",r),y=yo(s,"labelHeight",r),v=e.pstyle(m+"text-margin-x").pfValue,x=e.pstyle(m+"text-margin-y").pfValue,b=e.isEdge(),T=e.pstyle("text-halign").value,E=e.pstyle("text-valign").value;b&&(T="center",E="center"),u+=v,h+=x;var w;switch(n?w=this.getTextAngle(e,r):w=0,w!==0&&(f=u,d=h,t.translate(f,d),t.rotate(w),u=0,h=0),E){case"top":break;case"center":h+=y/2;break;case"bottom":h+=y;break}var k=e.pstyle("text-background-opacity").value,S=e.pstyle("text-border-opacity").value,A=e.pstyle("text-border-width").pfValue,L=e.pstyle("text-background-padding").pfValue,I=e.pstyle("text-background-shape").strValue,N=I==="round-rectangle"||I==="roundrectangle",C=I==="circle",_=2;if(k>0||A>0&&S>0){var D=t.fillStyle,M=t.strokeStyle,R=t.lineWidth,P=e.pstyle("text-background-color").value,B=e.pstyle("text-border-color").value,F=e.pstyle("text-border-style").value,G=k>0,$=A>0&&S>0,V=u-L;switch(T){case"left":V-=g;break;case"center":V-=g/2;break}var X=h-y-L,Q=g+2*L,H=y+2*L;if(G&&(t.fillStyle="rgba(".concat(P[0],",").concat(P[1],",").concat(P[2],",").concat(k*l,")")),$&&(t.strokeStyle="rgba(".concat(B[0],",").concat(B[1],",").concat(B[2],",").concat(S*l,")"),t.lineWidth=A,t.setLineDash))switch(F){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=A/4,t.setLineDash([]);break;case"solid":default:t.setLineDash([]);break}if(N?(t.beginPath(),T0e(t,V,X,Q,H,_)):C?(t.beginPath(),jJe(t,V,X,Q,H)):(t.beginPath(),t.rect(V,X,Q,H)),G&&t.fill(),$&&t.stroke(),$&&F==="double"){var ie=A/2;t.beginPath(),N?T0e(t,V+ie,X+ie,Q-2*ie,H-2*ie,_):t.rect(V+ie,X+ie,Q-2*ie,H-2*ie),t.stroke()}t.fillStyle=D,t.strokeStyle=M,t.lineWidth=R,t.setLineDash&&t.setLineDash([])}var Y=2*e.pstyle("text-outline-width").pfValue;if(Y>0&&(t.lineWidth=Y),e.pstyle("text-wrap").value==="wrap"){var le=yo(s,"labelWrapCachedLines",r),ee=yo(s,"labelLineHeight",r),J=g/2,te=this.getLabelJustification(e);switch(te==="auto"||(T==="left"?te==="left"?u+=-g:te==="center"&&(u+=-J):T==="center"?te==="left"?u+=-J:te==="right"&&(u+=J):T==="right"&&(te==="center"?u+=J:te==="right"&&(u+=g))),E){case"top":h-=(le.length-1)*ee;break;case"center":case"bottom":h-=(le.length-1)*ee;break}for(var Z=0;Z0&&t.strokeText(le[Z],u,h),t.fillText(le[Z],u,h),h+=ee}else Y>0&&t.strokeText(p,u,h),t.fillText(p,u,h);w!==0&&(t.rotate(-w),t.translate(-f,-d))}}};_d={};_d.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l,u,h=e._private,f=h.rscratch,d=e.position();if(!(!Nt(d.x)||!Nt(d.y))&&!(a&&!e.visible())){var p=a?e.effectiveOpacity():1,m=s.usePaths(),g,y=!1,v=e.padding();l=e.width()+2*v,u=e.height()+2*v;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),T=b.value,E=new Array(T.length),w=new Array(T.length),k=0,S=0;S0&&arguments[0]!==void 0?arguments[0]:_;s.eleFillStyle(t,e,U)},"setupShapeColor"),ee=o(function(){var U=arguments.length>0&&arguments[0]!==void 0?arguments[0]:$;s.colorStrokeStyle(t,D[0],D[1],D[2],U)},"setupBorderColor"),J=o(function(){var U=arguments.length>0&&arguments[0]!==void 0?arguments[0]:H;s.colorStrokeStyle(t,X[0],X[1],X[2],U)},"setupOutlineColor"),te=o(function(U,ce,z,ne){var se=s.nodePathCache=s.nodePathCache||[],be=W0e(z==="polygon"?z+","+ne.join(","):z,""+ce,""+U,""+Y),pe=se[be],me,Re=!1;return pe!=null?(me=pe,Re=!0,f.pathCache=me):(me=new Path2D,se[be]=f.pathCache=me),{path:me,cacheHit:Re}},"getPath"),Z=e.pstyle("shape").strValue,xe=e.pstyle("shape-polygon-points").pfValue;if(m){t.translate(d.x,d.y);var de=te(l,u,Z,xe);g=de.path,y=de.cacheHit}var Se=o(function(){if(!y){var U=d;m&&(U={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,U.x,U.y,l,u,Y,f)}m?t.fill(g):t.fill()},"drawShape"),Me=o(function(){for(var U=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,ce=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,z=h.backgrounding,ne=0,se=0;se0&&arguments[0]!==void 0?arguments[0]:!1,ce=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasPie(e)&&(s.drawPie(t,e,ce),U&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,Y,f)))},"drawPie"),we=o(function(){var U=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,ce=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasStripe(e)&&(t.save(),m?t.clip(f.pathCache):(s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,Y,f),t.clip()),s.drawStripe(t,e,ce),t.restore(),U&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,Y,f)))},"drawStripe"),_e=o(function(){var U=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,ce=(N>0?N:-N)*U,z=N>0?0:255;N!==0&&(s.colorFillStyle(t,z,z,z,ce),m?t.fill(g):t.fill())},"darken"),$e=o(function(){if(C>0){if(t.lineWidth=C,t.lineCap=P,t.lineJoin=R,t.setLineDash)switch(M){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(F),t.lineDashOffset=G;break;case"solid":case"double":t.setLineDash([]);break}if(B!=="center"){if(t.save(),t.lineWidth*=2,B==="inside")m?t.clip(g):t.clip();else{var U=new Path2D;U.rect(-l/2-C,-u/2-C,l+2*C,u+2*C),U.addPath(g),t.clip(U,"evenodd")}m?t.stroke(g):t.stroke(),t.restore()}else m?t.stroke(g):t.stroke();if(M==="double"){t.lineWidth=C/3;var ce=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",m?t.stroke(g):t.stroke(),t.globalCompositeOperation=ce}t.setLineDash&&t.setLineDash([])}},"drawBorder"),fe=o(function(){if(V>0){if(t.lineWidth=V,t.lineCap="butt",t.setLineDash)switch(Q){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var U=d;m&&(U={x:0,y:0});var ce=s.getNodeShape(e),z=C;B==="inside"&&(z=0),B==="outside"&&(z*=2);var ne=(l+z+(V+ie))/l,se=(u+z+(V+ie))/u,be=l*ne,pe=u*se,me=s.nodeShapes[ce].points,Re;if(m){var ge=te(be,pe,ce,me);Re=ge.path}if(ce==="ellipse")s.drawEllipsePath(Re||t,U.x,U.y,be,pe);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(ce)){var Ie=0,qe=0,Pe=0;ce==="round-diamond"?Ie=(z+ie+V)*1.4:ce==="round-heptagon"?(Ie=(z+ie+V)*1.075,Pe=-(z/2+ie+V)/35):ce==="round-hexagon"?Ie=(z+ie+V)*1.12:ce==="round-pentagon"?(Ie=(z+ie+V)*1.13,Pe=-(z/2+ie+V)/15):ce==="round-tag"?(Ie=(z+ie+V)*1.12,qe=(z/2+V+ie)*.07):ce==="round-triangle"&&(Ie=(z+ie+V)*(Math.PI/2),Pe=-(z+ie/2+V)/Math.PI),Ie!==0&&(ne=(l+Ie)/l,be=l*ne,["round-hexagon","round-tag"].includes(ce)||(se=(u+Ie)/u,pe=u*se)),Y=Y==="auto"?tme(be,pe):Y;for(var Xe=be/2,oe=pe/2,et=Y+(z+V+ie)/2,he=new Array(me.length/2),ot=new Array(me.length/2),Dt=0;Dt0){if(i=i||n.position(),a==null||s==null){var m=n.padding();a=n.width()+2*m,s=n.height()+2*m}l.colorFillStyle(r,f[0],f[1],f[2],h),l.nodeShapes[d].draw(r,i.x,i.y,a+u*2,s+u*2,p),r.fill()}}}},"drawNodeOverlayUnderlay");_d.drawNodeOverlay=oge("overlay");_d.drawNodeUnderlay=oge("underlay");_d.hasPie=function(t){return t=t[0],t._private.hasPie};_d.hasStripe=function(t){return t=t[0],t._private.hasStripe};_d.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=e.pstyle("pie-hole"),l=e.pstyle("pie-start-angle").pfValue,u=n.x,h=n.y,f=e.width(),d=e.height(),p=Math.min(f,d)/2,m,g=0,y=this.usePaths();if(y&&(u=0,h=0),a.units==="%"?p=p*a.pfValue:a.pfValue!==void 0&&(p=a.pfValue/2),s.units==="%"?m=p*s.pfValue:s.pfValue!==void 0&&(m=s.pfValue/2),!(m>=p))for(var v=1;v<=i.pieBackgroundN;v++){var x=e.pstyle("pie-"+v+"-background-size").value,b=e.pstyle("pie-"+v+"-background-color").value,T=e.pstyle("pie-"+v+"-background-opacity").value*r,E=x/100;E+g>1&&(E=1-g);var w=1.5*Math.PI+2*Math.PI*g;w+=l;var k=2*Math.PI*E,S=w+k;x===0||g>=1||g+E>1||(m===0?(t.beginPath(),t.moveTo(u,h),t.arc(u,h,p,w,S),t.closePath()):(t.beginPath(),t.arc(u,h,p,w,S),t.arc(u,h,m,S,w,!0),t.closePath()),this.colorFillStyle(t,b[0],b[1],b[2],T),t.fill(),g+=E)}};_d.drawStripe=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=n.x,s=n.y,l=e.width(),u=e.height(),h=0,f=this.usePaths();t.save();var d=e.pstyle("stripe-direction").value,p=e.pstyle("stripe-size");switch(d){case"vertical":break;case"righward":t.rotate(-Math.PI/2);break}var m=l,g=u;p.units==="%"?(m=m*p.pfValue,g=g*p.pfValue):p.pfValue!==void 0&&(m=p.pfValue,g=p.pfValue),f&&(a=0,s=0),s-=m/2,a-=g/2;for(var y=1;y<=i.stripeBackgroundN;y++){var v=e.pstyle("stripe-"+y+"-background-size").value,x=e.pstyle("stripe-"+y+"-background-color").value,b=e.pstyle("stripe-"+y+"-background-opacity").value*r,T=v/100;T+h>1&&(T=1-h),!(v===0||h>=1||h+T>1)&&(t.beginPath(),t.rect(a,s+g*h,m,g*T),t.closePath(),this.colorFillStyle(t,x[0],x[1],x[2],b),t.fill(),h+=T)}t.restore()};Is={},XJe=100;Is.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};Is.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;ie.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!d&&(f[e.NODE]=!0,f[e.SELECT_BOX]=!0);var b=r.style(),T=r.zoom(),E=s!==void 0?s:T,w=r.pan(),k={x:w.x,y:w.y},S={zoom:T,pan:{x:w.x,y:w.y}},A=e.prevViewport,L=A===void 0||S.zoom!==A.zoom||S.pan.x!==A.pan.x||S.pan.y!==A.pan.y;!L&&!(y&&!g)&&(e.motionBlurPxRatio=1),l&&(k=l),E*=u,k.x*=u,k.y*=u;var I=e.getCachedZSortedEles();function N(ee,J,te,Z,xe){var de=ee.globalCompositeOperation;ee.globalCompositeOperation="destination-out",e.colorFillStyle(ee,255,255,255,e.motionBlurTransparency),ee.fillRect(J,te,Z,xe),ee.globalCompositeOperation=de}o(N,"mbclear");function C(ee,J){var te,Z,xe,de;!e.clearingMotionBlur&&(ee===h.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||ee===h.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(te={x:w.x*m,y:w.y*m},Z=T*m,xe=e.canvasWidth*m,de=e.canvasHeight*m):(te=k,Z=E,xe=e.canvasWidth,de=e.canvasHeight),ee.setTransform(1,0,0,1,0,0),J==="motionBlur"?N(ee,0,0,xe,de):!n&&(J===void 0||J)&&ee.clearRect(0,0,xe,de),i||(ee.translate(te.x,te.y),ee.scale(Z,Z)),l&&ee.translate(l.x,l.y),s&&ee.scale(s,s)}if(o(C,"setContextTransform"),d||(e.textureDrawLastFrame=!1),d){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=r.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var _=e.data.bufferContexts[e.TEXTURE_BUFFER];_.setTransform(1,0,0,1,0,0),_.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:_,drawOnlyNodeLayer:!0,forcedPxRatio:u*e.textureMult});var S=e.textureCache.viewport={zoom:r.zoom(),pan:r.pan(),width:e.canvasWidth,height:e.canvasHeight};S.mpan={x:(0-S.pan.x)/S.zoom,y:(0-S.pan.y)/S.zoom}}f[e.DRAG]=!1,f[e.NODE]=!1;var D=h.contexts[e.NODE],M=e.textureCache.texture,S=e.textureCache.viewport;D.setTransform(1,0,0,1,0,0),p?N(D,0,0,S.width,S.height):D.clearRect(0,0,S.width,S.height);var R=b.core("outside-texture-bg-color").value,P=b.core("outside-texture-bg-opacity").value;e.colorFillStyle(D,R[0],R[1],R[2],P),D.fillRect(0,0,S.width,S.height);var T=r.zoom();C(D,!1),D.clearRect(S.mpan.x,S.mpan.y,S.width/S.zoom/u,S.height/S.zoom/u),D.drawImage(M,S.mpan.x,S.mpan.y,S.width/S.zoom/u,S.height/S.zoom/u)}else e.textureOnViewport&&!n&&(e.textureCache=null);var B=r.extent(),F=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),G=e.hideEdgesOnViewport&&F,$=[];if($[e.NODE]=!f[e.NODE]&&p&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,$[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),$[e.DRAG]=!f[e.DRAG]&&p&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,$[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),f[e.NODE]||i||a||$[e.NODE]){var V=p&&!$[e.NODE]&&m!==1,D=n||(V?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:h.contexts[e.NODE]),X=p&&!V?"motionBlur":void 0;C(D,X),G?e.drawCachedNodes(D,I.nondrag,u,B):e.drawLayeredElements(D,I.nondrag,u,B),e.debug&&e.drawDebugPoints(D,I.nondrag),!i&&!p&&(f[e.NODE]=!1)}if(!a&&(f[e.DRAG]||i||$[e.DRAG])){var V=p&&!$[e.DRAG]&&m!==1,D=n||(V?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:h.contexts[e.DRAG]);C(D,p&&!V?"motionBlur":void 0),G?e.drawCachedNodes(D,I.drag,u,B):e.drawCachedElements(D,I.drag,u,B),e.debug&&e.drawDebugPoints(D,I.drag),!i&&!p&&(f[e.DRAG]=!1)}if(this.drawSelectionRectangle(t,C),p&&m!==1){var Q=h.contexts[e.NODE],H=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],ie=h.contexts[e.DRAG],Y=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],le=o(function(J,te,Z){J.setTransform(1,0,0,1,0,0),Z||!x?J.clearRect(0,0,e.canvasWidth,e.canvasHeight):N(J,0,0,e.canvasWidth,e.canvasHeight);var xe=m;J.drawImage(te,0,0,e.canvasWidth*xe,e.canvasHeight*xe,0,0,e.canvasWidth,e.canvasHeight)},"drawMotionBlur");(f[e.NODE]||$[e.NODE])&&(le(Q,H,$[e.NODE]),f[e.NODE]=!1),(f[e.DRAG]||$[e.DRAG])&&(le(ie,Y,$[e.DRAG]),f[e.DRAG]=!1)}e.prevViewport=S,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),p&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!d,e.mbFrames=0,f[e.NODE]=!0,f[e.DRAG]=!0,e.redraw()},XJe)),n||r.emit("render")};Is.drawSelectionRectangle=function(t,e){var r=this,n=r.cy,i=r.data,a=n.style(),s=t.drawOnlyNodeLayer,l=t.drawAllLayers,u=i.canvasNeedsRedraw,h=t.forcedContext;if(r.showFps||!s&&u[r.SELECT_BOX]&&!l){var f=h||i.contexts[r.SELECT_BOX];if(e(f),r.selection[4]==1&&(r.hoverData.selecting||r.touchData.selecting)){var d=r.cy.zoom(),p=a.core("selection-box-border-width").value/d;f.lineWidth=p,f.fillStyle="rgba("+a.core("selection-box-color").value[0]+","+a.core("selection-box-color").value[1]+","+a.core("selection-box-color").value[2]+","+a.core("selection-box-opacity").value+")",f.fillRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]),p>0&&(f.strokeStyle="rgba("+a.core("selection-box-border-color").value[0]+","+a.core("selection-box-border-color").value[1]+","+a.core("selection-box-border-color").value[2]+","+a.core("selection-box-opacity").value+")",f.strokeRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]))}if(i.bgActivePosistion&&!r.hoverData.selecting){var d=r.cy.zoom(),m=i.bgActivePosistion;f.fillStyle="rgba("+a.core("active-bg-color").value[0]+","+a.core("active-bg-color").value[1]+","+a.core("active-bg-color").value[2]+","+a.core("active-bg-opacity").value+")",f.beginPath(),f.arc(m.x,m.y,a.core("active-bg-size").pfValue/d,0,2*Math.PI),f.fill()}var g=r.lastRedrawTime;if(r.showFps&&g){g=Math.round(g);var y=Math.round(1e3/g),v="1 frame = "+g+" ms = "+y+" fps";if(f.setTransform(1,0,0,1,0,0),f.fillStyle="rgba(255, 0, 0, 0.75)",f.strokeStyle="rgba(255, 0, 0, 0.75)",f.font="30px Arial",!Lb){var x=f.measureText(v);Lb=x.actualBoundingBoxAscent}f.fillText(v,0,Lb);var b=60;f.strokeRect(0,Lb+10,250,20),f.fillRect(0,Lb+10,250*Math.min(y/b,1),20)}l||(u[r.SELECT_BOX]=!1)}};o(w0e,"compileShader");o(KJe,"createProgram");o(QJe,"createTextureCanvas");o(EB,"getEffectivePanZoom");o(ZJe,"getEffectiveZoom");o(JJe,"modelToRenderedPosition");o(eet,"isSimpleShape");o(tet,"arrayEqual");o(M0,"toWebGLColor");o(q1,"indexToVec4");o(ret,"vec4ToIndex");o(net,"createTexture");o(lge,"getTypeInfo");o(cge,"createTypedArray");o(iet,"createTypedArrayView");o(aet,"createBufferStaticDraw");o(Eu,"createBufferDynamicDraw");o(set,"create3x3MatrixBufferDynamicDraw");o(oet,"createPickingFrameBuffer");k0e=typeof Float32Array<"u"?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});o(_P,"create");o(E0e,"identity");o(cet,"multiply");o(US,"translate");o(S0e,"rotate");o(KP,"scale");o(uet,"projection");het=(function(){function t(e,r,n,i){Sd(this,t),this.debugID=Math.floor(Math.random()*1e4),this.r=e,this.texSize=r,this.texRows=n,this.texHeight=Math.floor(r/n),this.enableWrapping=!0,this.locked=!1,this.texture=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=i(e,r,r),this.scratch=i(e,r,this.texHeight,"scratch")}return o(t,"Atlas"),Cd(t,[{key:"lock",value:o(function(){this.locked=!0},"lock")},{key:"getKeys",value:o(function(){return new Set(this.keyToLocation.keys())},"getKeys")},{key:"getScale",value:o(function(r){var n=r.w,i=r.h,a=this.texHeight,s=this.texSize,l=a/i,u=n*l,h=i*l;return u>s&&(l=s/n,u=n*l,h=i*l),{scale:l,texW:u,texH:h}},"getScale")},{key:"draw",value:o(function(r,n,i){var a=this;if(this.locked)throw new Error("can't draw, atlas is locked");var s=this.texSize,l=this.texRows,u=this.texHeight,h=this.getScale(n),f=h.scale,d=h.texW,p=h.texH,m=o(function(T,E){if(i&&E){var w=E.context,k=T.x,S=T.row,A=k,L=u*S;w.save(),w.translate(A,L),w.scale(f,f),i(w,n),w.restore()}},"drawAt"),g=[null,null],y=o(function(){m(a.freePointer,a.canvas),g[0]={x:a.freePointer.x,y:a.freePointer.row*u,w:d,h:p},g[1]={x:a.freePointer.x+d,y:a.freePointer.row*u,w:0,h:p},a.freePointer.x+=d,a.freePointer.x==s&&(a.freePointer.x=0,a.freePointer.row++)},"drawNormal"),v=o(function(){var T=a.scratch,E=a.canvas;T.clear(),m({x:0,row:0},T);var w=s-a.freePointer.x,k=d-w,S=u;{var A=a.freePointer.x,L=a.freePointer.row*u,I=w;E.context.drawImage(T,0,0,I,S,A,L,I,S),g[0]={x:A,y:L,w:I,h:p}}{var N=w,C=(a.freePointer.row+1)*u,_=k;E&&E.context.drawImage(T,N,0,_,S,0,C,_,S),g[1]={x:0,y:C,w:_,h:p}}a.freePointer.x=k,a.freePointer.row++},"drawWrapped"),x=o(function(){a.freePointer.x=0,a.freePointer.row++},"moveToStartOfNextRow");if(this.freePointer.x+d<=s)y();else{if(this.freePointer.row>=l-1)return!1;this.freePointer.x===s?(x(),y()):this.enableWrapping?v():(x(),y())}return this.keyToLocation.set(r,g),this.needsBuffer=!0,g},"draw")},{key:"getOffsets",value:o(function(r){return this.keyToLocation.get(r)},"getOffsets")},{key:"isEmpty",value:o(function(){return this.freePointer.x===0&&this.freePointer.row===0},"isEmpty")},{key:"canFit",value:o(function(r){if(this.locked)return!1;var n=this.texSize,i=this.texRows,a=this.getScale(r),s=a.texW;return this.freePointer.x+s>n?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},a=i.forceRedraw,s=a===void 0?!1:a,l=i.filterEle,u=l===void 0?function(){return!0}:l,h=i.filterType,f=h===void 0?function(){return!0}:h,d=!1,p=!1,m=xo(r),g;try{for(m.s();!(g=m.n()).done;){var y=g.value;if(u(y)){var v=xo(this.renderTypes.values()),x;try{var b=o(function(){var E=x.value,w=E.type;if(f(w)){var k=n.collections.get(E.collection),S=E.getKey(y),A=Array.isArray(S)?S:[S];if(s)A.forEach(function(C){return k.markKeyForGC(C)}),p=!0;else{var L=E.getID?E.getID(y):y.id(),I=n._key(w,L),N=n.typeAndIdToKey.get(I);N!==void 0&&!tet(A,N)&&(d=!0,n.typeAndIdToKey.delete(I),N.forEach(function(C){return k.markKeyForGC(C)}))}}},"_loop2");for(v.s();!(x=v.n()).done;)b()}catch(T){v.e(T)}finally{v.f()}}}}catch(T){m.e(T)}finally{m.f()}return p&&(this.gc(),d=!1),d},"invalidate")},{key:"gc",value:o(function(){var r=xo(this.collections.values()),n;try{for(r.s();!(n=r.n()).done;){var i=n.value;i.gc()}}catch(a){r.e(a)}finally{r.f()}},"gc")},{key:"getOrCreateAtlas",value:o(function(r,n,i,a){var s=this.renderTypes.get(n),l=this.collections.get(s.collection),u=!1,h=l.draw(a,i,function(p){s.drawClipped?(p.save(),p.beginPath(),p.rect(0,0,i.w,i.h),p.clip(),s.drawElement(p,r,i,!0,!0),p.restore()):s.drawElement(p,r,i,!0,!0),u=!0});if(u){var f=s.getID?s.getID(r):r.id(),d=this._key(n,f);this.typeAndIdToKey.has(d)?this.typeAndIdToKey.get(d).push(a):this.typeAndIdToKey.set(d,[a])}return h},"getOrCreateAtlas")},{key:"getAtlasInfo",value:o(function(r,n){var i=this,a=this.renderTypes.get(n),s=a.getKey(r),l=Array.isArray(s)?s:[s];return l.map(function(u){var h=a.getBoundingBox(r,u),f=i.getOrCreateAtlas(r,n,h,u),d=f.getOffsets(u),p=Wi(d,2),m=p[0],g=p[1];return{atlas:f,tex:m,tex1:m,tex2:g,bb:h}})},"getAtlasInfo")},{key:"getDebugInfo",value:o(function(){var r=[],n=xo(this.collections),i;try{for(n.s();!(i=n.n()).done;){var a=Wi(i.value,2),s=a[0],l=a[1],u=l.getCounts(),h=u.keyCount,f=u.atlasCount;r.push({type:s,keyCount:h,atlasCount:f})}}catch(d){n.e(d)}finally{n.f()}return r},"getDebugInfo")}])})(),met=(function(){function t(e){Sd(this,t),this.globalOptions=e,this.atlasSize=e.webglTexSize,this.maxAtlasesPerBatch=e.webglTexPerBatch,this.batchAtlases=[]}return o(t,"AtlasBatchManager"),Cd(t,[{key:"getMaxAtlasesPerBatch",value:o(function(){return this.maxAtlasesPerBatch},"getMaxAtlasesPerBatch")},{key:"getAtlasSize",value:o(function(){return this.atlasSize},"getAtlasSize")},{key:"getIndexArray",value:o(function(){return Array.from({length:this.maxAtlasesPerBatch},function(r,n){return n})},"getIndexArray")},{key:"startBatch",value:o(function(){this.batchAtlases=[]},"startBatch")},{key:"getAtlasCount",value:o(function(){return this.batchAtlases.length},"getAtlasCount")},{key:"getAtlases",value:o(function(){return this.batchAtlases},"getAtlases")},{key:"canAddToCurrentBatch",value:o(function(r){return this.batchAtlases.length===this.maxAtlasesPerBatch?this.batchAtlases.includes(r):!0},"canAddToCurrentBatch")},{key:"getAtlasIndexForBatch",value:o(function(r){var n=this.batchAtlases.indexOf(r);if(n<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(r),n=this.batchAtlases.length-1}return n},"getAtlasIndexForBatch")}])})(),get=` - float circleSD(vec2 p, float r) { - return distance(vec2(0), p) - r; // signed distance - } -`,yet=` - float rectangleSD(vec2 p, vec2 b) { - vec2 d = abs(p)-b; - return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0); - } -`,vet=` - float roundRectangleSD(vec2 p, vec2 b, vec4 cr) { - cr.xy = (p.x > 0.0) ? cr.xy : cr.zw; - cr.x = (p.y > 0.0) ? cr.x : cr.y; - vec2 q = abs(p) - b + cr.x; - return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x; - } -`,xet=` - float ellipseSD(vec2 p, vec2 ab) { - p = abs( p ); // symmetry - - // find root with Newton solver - vec2 q = ab*(p-ab); - float w = (q.x1.0) ? d : -d; - } -`,$b={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},nC={IGNORE:1,USE_BB:2},DP=0,C0e=1,A0e=2,RP=3,U1=4,MS=5,Nb=6,Mb=7,bet=(function(){function t(e,r,n){Sd(this,t),this.r=e,this.gl=r,this.maxInstances=n.webglBatchSize,this.atlasSize=n.webglTexSize,this.bgColor=n.bgColor,this.debug=n.webglDebug,this.batchDebugInfo=[],n.enableWrapping=!0,n.createTextureCanvas=QJe,this.atlasManager=new pet(e,n),this.batchManager=new met(n),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram($b.SCREEN),this.pickingProgram=this._createShaderProgram($b.PICKING),this.vao=this._createVAO()}return o(t,"ElementDrawingWebGL"),Cd(t,[{key:"addAtlasCollection",value:o(function(r,n){this.atlasManager.addAtlasCollection(r,n)},"addAtlasCollection")},{key:"addTextureAtlasRenderType",value:o(function(r,n){this.atlasManager.addRenderType(r,n)},"addTextureAtlasRenderType")},{key:"addSimpleShapeRenderType",value:o(function(r,n){this.simpleShapeOptions.set(r,n)},"addSimpleShapeRenderType")},{key:"invalidate",value:o(function(r){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=n.type,a=this.atlasManager;return i?a.invalidate(r,{filterType:o(function(l){return l===i},"filterType"),forceRedraw:!0}):a.invalidate(r)},"invalidate")},{key:"gc",value:o(function(){this.atlasManager.gc()},"gc")},{key:"_createShaderProgram",value:o(function(r){var n=this.gl,i=`#version 300 es - precision highp float; - - uniform mat3 uPanZoomMatrix; - uniform int uAtlasSize; - - // instanced - in vec2 aPosition; // a vertex from the unit square - - in mat3 aTransform; // used to transform verticies, eg into a bounding box - in int aVertType; // the type of thing we are rendering - - // the z-index that is output when using picking mode - in vec4 aIndex; - - // For textures - in int aAtlasId; // which shader unit/atlas to use - in vec4 aTex; // x/y/w/h of texture in atlas - - // for edges - in vec4 aPointAPointB; - in vec4 aPointCPointD; - in vec2 aLineWidth; // also used for node border width - - // simple shapes - in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left] - in vec4 aColor; // also used for edges - in vec4 aBorderColor; // aLineWidth is used for border width - - // output values passed to the fragment shader - out vec2 vTexCoord; - out vec4 vColor; - out vec2 vPosition; - // flat values are not interpolated - flat out int vAtlasId; - flat out int vVertType; - flat out vec2 vTopRight; - flat out vec2 vBotLeft; - flat out vec4 vCornerRadius; - flat out vec4 vBorderColor; - flat out vec2 vBorderWidth; - flat out vec4 vIndex; - - void main(void) { - int vid = gl_VertexID; - vec2 position = aPosition; // TODO make this a vec3, simplifies some code below - - if(aVertType == `.concat(DP,`) { - float texX = aTex.x; // texture coordinates - float texY = aTex.y; - float texW = aTex.z; - float texH = aTex.w; - - if(vid == 1 || vid == 2 || vid == 4) { - texX += texW; - } - if(vid == 2 || vid == 4 || vid == 5) { - texY += texH; - } - - float d = float(uAtlasSize); - vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 - - gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); - } - else if(aVertType == `).concat(U1," || aVertType == ").concat(Mb,` - || aVertType == `).concat(MS," || aVertType == ").concat(Nb,`) { // simple shapes - - // the bounding box is needed by the fragment shader - vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat - vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat - vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated - - // calculations are done in the fragment shader, just pass these along - vColor = aColor; - vCornerRadius = aCornerRadius; - vBorderColor = aBorderColor; - vBorderWidth = aLineWidth; - - gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); - } - else if(aVertType == `).concat(C0e,`) { - vec2 source = aPointAPointB.xy; - vec2 target = aPointAPointB.zw; - - // adjust the geometry so that the line is centered on the edge - position.y = position.y - 0.5; - - // stretch the unit square into a long skinny rectangle - vec2 xBasis = target - source; - vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); - vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y; - - gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); - vColor = aColor; - } - else if(aVertType == `).concat(A0e,`) { - vec2 pointA = aPointAPointB.xy; - vec2 pointB = aPointAPointB.zw; - vec2 pointC = aPointCPointD.xy; - vec2 pointD = aPointCPointD.zw; - - // adjust the geometry so that the line is centered on the edge - position.y = position.y - 0.5; - - vec2 p0, p1, p2, pos; - if(position.x == 0.0) { // The left side of the unit square - p0 = pointA; - p1 = pointB; - p2 = pointC; - pos = position; - } else { // The right side of the unit square, use same approach but flip the geometry upside down - p0 = pointD; - p1 = pointC; - p2 = pointB; - pos = vec2(0.0, -position.y); - } - - vec2 p01 = p1 - p0; - vec2 p12 = p2 - p1; - vec2 p21 = p1 - p2; - - // Find the normal vector. - vec2 tangent = normalize(normalize(p12) + normalize(p01)); - vec2 normal = vec2(-tangent.y, tangent.x); - - // Find the vector perpendicular to p0 -> p1. - vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); - - // Determine the bend direction. - float sigma = sign(dot(p01 + p21, normal)); - float width = aLineWidth[0]; - - if(sign(pos.y) == -sigma) { - // This is an intersecting vertex. Adjust the position so that there's no overlap. - vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); - gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); - } else { - // This is a non-intersecting vertex. Treat it like a mitre join. - vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); - gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); - } - - vColor = aColor; - } - else if(aVertType == `).concat(RP,` && vid < 3) { - // massage the first triangle into an edge arrow - if(vid == 0) - position = vec2(-0.15, -0.3); - if(vid == 1) - position = vec2( 0.0, 0.0); - if(vid == 2) - position = vec2( 0.15, -0.3); - - gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); - vColor = aColor; - } - else { - gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space - } - - vAtlasId = aAtlasId; - vVertType = aVertType; - vIndex = aIndex; - } - `),a=this.batchManager.getIndexArray(),s=`#version 300 es - precision highp float; - - // declare texture unit for each texture atlas in the batch - `.concat(a.map(function(h){return"uniform sampler2D uTexture".concat(h,";")}).join(` - `),` - - uniform vec4 uBGColor; - uniform float uZoom; - - in vec2 vTexCoord; - in vec4 vColor; - in vec2 vPosition; // model coordinates - - flat in int vAtlasId; - flat in vec4 vIndex; - flat in int vVertType; - flat in vec2 vTopRight; - flat in vec2 vBotLeft; - flat in vec4 vCornerRadius; - flat in vec4 vBorderColor; - flat in vec2 vBorderWidth; - - out vec4 outColor; - - `).concat(get,` - `).concat(yet,` - `).concat(vet,` - `).concat(xet,` - - vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha - return vec4( - top.rgb + (bot.rgb * (1.0 - top.a)), - top.a + (bot.a * (1.0 - top.a)) - ); - } - - vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance - // scale to the zoom level so that borders don't look blurry when zoomed in - // note 1.5 is an aribitrary value chosen because it looks good - return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); - } - - void main(void) { - if(vVertType == `).concat(DP,`) { - // look up the texel from the texture unit - `).concat(a.map(function(h){return"if(vAtlasId == ".concat(h,") outColor = texture(uTexture").concat(h,", vTexCoord);")}).join(` - else `),` - } - else if(vVertType == `).concat(RP,`) { - // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; - outColor = blend(vColor, uBGColor); - outColor.a = 1.0; // make opaque, masks out line under arrow - } - else if(vVertType == `).concat(U1,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border - outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done - } - else if(vVertType == `).concat(U1," || vVertType == ").concat(Mb,` - || vVertType == `).concat(MS," || vVertType == ").concat(Nb,`) { // use SDF - - float outerBorder = vBorderWidth[0]; - float innerBorder = vBorderWidth[1]; - float borderPadding = outerBorder * 2.0; - float w = vTopRight.x - vBotLeft.x - borderPadding; - float h = vTopRight.y - vBotLeft.y - borderPadding; - vec2 b = vec2(w/2.0, h/2.0); // half width, half height - vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center - - float d; // signed distance - if(vVertType == `).concat(U1,`) { - d = rectangleSD(p, b); - } else if(vVertType == `).concat(Mb,` && w == h) { - d = circleSD(p, b.x); // faster than ellipse - } else if(vVertType == `).concat(Mb,`) { - d = ellipseSD(p, b); - } else { - d = roundRectangleSD(p, b, vCornerRadius.wzyx); - } - - // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling - // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box - if(d > 0.0) { - if(d > outerBorder) { - discard; - } else { - outColor = distInterp(vBorderColor, vec4(0), d - outerBorder); - } - } else { - if(d > innerBorder) { - vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; - vec4 innerBorderColor = blend(vBorderColor, vColor); - outColor = distInterp(innerBorderColor, outerColor, d); - } - else { - vec4 outerColor; - if(innerBorder == 0.0 && outerBorder == 0.0) { - outerColor = vec4(0); - } else if(innerBorder == 0.0) { - outerColor = vBorderColor; - } else { - outerColor = blend(vBorderColor, vColor); - } - outColor = distInterp(vColor, outerColor, d - innerBorder); - } - } - } - else { - outColor = vColor; - } - - `).concat(r.picking?`if(outColor.a == 0.0) discard; - else outColor = vIndex;`:"",` - } - `),l=KJe(n,i,s);l.aPosition=n.getAttribLocation(l,"aPosition"),l.aIndex=n.getAttribLocation(l,"aIndex"),l.aVertType=n.getAttribLocation(l,"aVertType"),l.aTransform=n.getAttribLocation(l,"aTransform"),l.aAtlasId=n.getAttribLocation(l,"aAtlasId"),l.aTex=n.getAttribLocation(l,"aTex"),l.aPointAPointB=n.getAttribLocation(l,"aPointAPointB"),l.aPointCPointD=n.getAttribLocation(l,"aPointCPointD"),l.aLineWidth=n.getAttribLocation(l,"aLineWidth"),l.aColor=n.getAttribLocation(l,"aColor"),l.aCornerRadius=n.getAttribLocation(l,"aCornerRadius"),l.aBorderColor=n.getAttribLocation(l,"aBorderColor"),l.uPanZoomMatrix=n.getUniformLocation(l,"uPanZoomMatrix"),l.uAtlasSize=n.getUniformLocation(l,"uAtlasSize"),l.uBGColor=n.getUniformLocation(l,"uBGColor"),l.uZoom=n.getUniformLocation(l,"uZoom"),l.uTextures=[];for(var u=0;u1&&arguments[1]!==void 0?arguments[1]:$b.SCREEN;this.panZoomMatrix=r,this.renderTarget=n,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()},"startFrame")},{key:"startBatch",value:o(function(){this.instanceCount=0,this.batchManager.startBatch()},"startBatch")},{key:"endFrame",value:o(function(){this.endBatch()},"endFrame")},{key:"_isVisible",value:o(function(r,n){return r.visible()?n&&n.isVisible?n.isVisible(r):!0:!1},"_isVisible")},{key:"drawTexture",value:o(function(r,n,i){var a=this.atlasManager,s=this.batchManager,l=a.getRenderTypeOpts(i);if(this._isVisible(r,l)&&!(r.isEdge()&&!this._isValidEdge(r))){if(this.renderTarget.picking&&l.getTexPickingMode){var u=l.getTexPickingMode(r);if(u===nC.IGNORE)return;if(u==nC.USE_BB){this.drawPickingRectangle(r,n,i);return}}var h=a.getAtlasInfo(r,i),f=xo(h),d;try{for(f.s();!(d=f.n()).done;){var p=d.value,m=p.atlas,g=p.tex1,y=p.tex2;s.canAddToCurrentBatch(m)||this.endBatch();for(var v=s.getAtlasIndexForBatch(m),x=0,b=[[g,!0],[y,!1]];x=this.maxInstances&&this.endBatch()}}}}catch(N){f.e(N)}finally{f.f()}}},"drawTexture")},{key:"setTransformMatrix",value:o(function(r,n,i,a){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,l=0;if(i.shapeProps&&i.shapeProps.padding&&(l=r.pstyle(i.shapeProps.padding).pfValue),a){var u=a.bb,h=a.tex1,f=a.tex2,d=h.w/(h.w+f.w);s||(d=1-d);var p=this._getAdjustedBB(u,l,s,d);this._applyTransformMatrix(n,p,i,r)}else{var m=i.getBoundingBox(r),g=this._getAdjustedBB(m,l,!0,1);this._applyTransformMatrix(n,g,i,r)}},"setTransformMatrix")},{key:"_applyTransformMatrix",value:o(function(r,n,i,a){var s,l;E0e(r);var u=i.getRotation?i.getRotation(a):0;if(u!==0){var h=i.getRotationPoint(a),f=h.x,d=h.y;US(r,r,[f,d]),S0e(r,r,u);var p=i.getRotationOffset(a);s=p.x+(n.xOffset||0),l=p.y+(n.yOffset||0)}else s=n.x1,l=n.y1;US(r,r,[s,l]),KP(r,r,[n.w,n.h])},"_applyTransformMatrix")},{key:"_getAdjustedBB",value:o(function(r,n,i,a){var s=r.x1,l=r.y1,u=r.w,h=r.h,f=r.yOffset;n&&(s-=n,l-=n,u+=2*n,h+=2*n);var d=0,p=u*a;return i&&a<1?u=p:!i&&a<1&&(d=u-p,s+=d,u=p),{x1:s,y1:l,w:u,h,xOffset:d,yOffset:f}},"_getAdjustedBB")},{key:"drawPickingRectangle",value:o(function(r,n,i){var a=this.atlasManager.getRenderTypeOpts(i),s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=U1;var l=this.indexBuffer.getView(s);q1(n,l);var u=this.colorBuffer.getView(s);M0([0,0,0],1,u);var h=this.transformBuffer.getMatrixView(s);this.setTransformMatrix(r,h,a),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()},"drawPickingRectangle")},{key:"drawNode",value:o(function(r,n,i){var a=this.simpleShapeOptions.get(i);if(this._isVisible(r,a)){var s=a.shapeProps,l=this._getVertTypeForShape(r,s.shape);if(l===void 0||a.isSimple&&!a.isSimple(r)){this.drawTexture(r,n,i);return}var u=this.instanceCount;if(this.vertTypeBuffer.getView(u)[0]=l,l===MS||l===Nb){var h=a.getBoundingBox(r),f=this._getCornerRadius(r,s.radius,h),d=this.cornerRadiusBuffer.getView(u);d[0]=f,d[1]=f,d[2]=f,d[3]=f,l===Nb&&(d[0]=0,d[2]=0)}var p=this.indexBuffer.getView(u);q1(n,p);var m=r.pstyle(s.color).value,g=r.pstyle(s.opacity).value,y=this.colorBuffer.getView(u);M0(m,g,y);var v=this.lineWidthBuffer.getView(u);if(v[0]=0,v[1]=0,s.border){var x=r.pstyle("border-width").value;if(x>0){var b=r.pstyle("border-color").value,T=r.pstyle("border-opacity").value,E=this.borderColorBuffer.getView(u);M0(b,T,E);var w=r.pstyle("border-position").value;if(w==="inside")v[0]=0,v[1]=-x;else if(w==="outside")v[0]=x,v[1]=0;else{var k=x/2;v[0]=k,v[1]=-k}}}var S=this.transformBuffer.getMatrixView(u);this.setTransformMatrix(r,S,a),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},"drawNode")},{key:"_getVertTypeForShape",value:o(function(r,n){var i=r.pstyle(n).value;switch(i){case"rectangle":return U1;case"ellipse":return Mb;case"roundrectangle":case"round-rectangle":return MS;case"bottom-round-rectangle":return Nb;default:return}},"_getVertTypeForShape")},{key:"_getCornerRadius",value:o(function(r,n,i){var a=i.w,s=i.h;if(r.pstyle(n).value==="auto")return Td(a,s);var l=r.pstyle(n).pfValue,u=a/2,h=s/2;return Math.min(l,h,u)},"_getCornerRadius")},{key:"drawEdgeArrow",value:o(function(r,n,i){if(r.visible()){var a=r._private.rscratch,s,l,u;if(i==="source"?(s=a.arrowStartX,l=a.arrowStartY,u=a.srcArrowAngle):(s=a.arrowEndX,l=a.arrowEndY,u=a.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(l)||l==null||isNaN(u)||u==null)){var h=r.pstyle(i+"-arrow-shape").value;if(h!=="none"){var f=r.pstyle(i+"-arrow-color").value,d=r.pstyle("opacity").value,p=r.pstyle("line-opacity").value,m=d*p,g=r.pstyle("width").pfValue,y=r.pstyle("arrow-scale").value,v=this.r.getArrowWidth(g,y),x=this.instanceCount,b=this.transformBuffer.getMatrixView(x);E0e(b),US(b,b,[s,l]),KP(b,b,[v,v]),S0e(b,b,u),this.vertTypeBuffer.getView(x)[0]=RP;var T=this.indexBuffer.getView(x);q1(n,T);var E=this.colorBuffer.getView(x);M0(f,m,E),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},"drawEdgeArrow")},{key:"drawEdgeLine",value:o(function(r,n){if(r.visible()){var i=this._getEdgePoints(r);if(i){var a=r.pstyle("opacity").value,s=r.pstyle("line-opacity").value,l=r.pstyle("width").pfValue,u=r.pstyle("line-color").value,h=a*s;if(i.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),i.length==4){var f=this.instanceCount;this.vertTypeBuffer.getView(f)[0]=C0e;var d=this.indexBuffer.getView(f);q1(n,d);var p=this.colorBuffer.getView(f);M0(u,h,p);var m=this.lineWidthBuffer.getView(f);m[0]=l;var g=this.pointAPointBBuffer.getView(f);g[0]=i[0],g[1]=i[1],g[2]=i[2],g[3]=i[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}}}},"drawEdgeLine")},{key:"_isValidEdge",value:o(function(r){var n=r._private.rscratch;return!(n.badLine||n.allpts==null||isNaN(n.allpts[0]))},"_isValidEdge")},{key:"_getEdgePoints",value:o(function(r){var n=r._private.rscratch;if(this._isValidEdge(r)){var i=n.allpts;if(i.length==4)return i;var a=this._getNumSegments(r);return this._getCurveSegmentPoints(i,a)}},"_getEdgePoints")},{key:"_getNumSegments",value:o(function(r){var n=15;return Math.min(Math.max(n,5),this.maxInstances)},"_getNumSegments")},{key:"_getCurveSegmentPoints",value:o(function(r,n){if(r.length==4)return r;for(var i=Array((n+1)*2),a=0;a<=n;a++)if(a==0)i[0]=r[0],i[1]=r[1];else if(a==n)i[a*2]=r[r.length-2],i[a*2+1]=r[r.length-1];else{var s=a/n;this._setCurvePoint(r,s,i,a*2)}return i},"_getCurveSegmentPoints")},{key:"_setCurvePoint",value:o(function(r,n,i,a){if(r.length<=2)i[a]=r[0],i[a+1]=r[1];else{for(var s=Array(r.length-2),l=0;l0}},"isLayerVisible"),l=o(function(d){var p=d.pstyle("text-events").strValue==="yes";return p?nC.USE_BB:nC.IGNORE},"getTexPickingMode"),u=o(function(d){var p=d.position(),m=p.x,g=p.y,y=d.outerWidth(),v=d.outerHeight();return{w:y,h:v,x1:m-y/2,y1:g-v/2}},"getBBForSimpleShape");r.drawing.addAtlasCollection("node",{texRows:t.webglTexRowsNodes}),r.drawing.addAtlasCollection("label",{texRows:t.webglTexRows}),r.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement}),r.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:u,isSimple:eet,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),r.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:u,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),r.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:u,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),r.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:l,getKey:LP(e.getLabelKey,null),getBoundingBox:NP(e.getLabelBox,null),drawClipped:!0,drawElement:e.drawLabel,getRotation:i(null),getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:a("label")}),r.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:l,getKey:LP(e.getSourceLabelKey,"source"),getBoundingBox:NP(e.getSourceLabelBox,"source"),drawClipped:!0,drawElement:e.drawSourceLabel,getRotation:i("source"),getRotationPoint:e.getSourceLabelRotationPoint,getRotationOffset:e.getSourceLabelRotationOffset,isVisible:a("source-label")}),r.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:l,getKey:LP(e.getTargetLabelKey,"target"),getBoundingBox:NP(e.getTargetLabelBox,"target"),drawClipped:!0,drawElement:e.drawTargetLabel,getRotation:i("target"),getRotationPoint:e.getTargetLabelRotationPoint,getRotationOffset:e.getTargetLabelRotationOffset,isVisible:a("target-label")});var h=tT(function(){console.log("garbage collect flag set"),r.data.gc=!0},1e4);r.onUpdateEleCalcs(function(f,d){var p=!1;d&&d.length>0&&(p|=r.drawing.invalidate(d)),p&&h()}),wet(r)};o(Tet,"getBGColor");o(hge,"getLabelLines");LP=o(function(e,r){return function(n){var i=e(n),a=hge(n,r);return a.length>1?a.map(function(s,l){return"".concat(i,"_").concat(l)}):i}},"getStyleKeysForLabel"),NP=o(function(e,r){return function(n,i){var a=e(n);if(typeof i=="string"){var s=i.indexOf("_");if(s>0){var l=Number(i.substring(s+1)),u=hge(n,r),h=a.h/u.length,f=h*l,d=a.y1+f;return{x1:a.x1,w:a.w,y1:d,h,yOffset:f}}}return a}},"getBoundingBoxForLabel");o(wet,"overrideCanvasRendererFunctions");o(ket,"clearWebgl");o(Eet,"clearCanvas");o(Cet,"createPanZoomMatrix");o(fge,"setContextTransform");o(Aet,"drawSelectionRectangle");o(_et,"drawAxes");o(Det,"drawAtlases");o(Ret,"getPickingIndexes");o(Let,"findNearestElementsWebgl");o(MP,"drawEle");o(dge,"renderWebgl");Dd={};Dd.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,l=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+l*a[1]);for(var u=1;u0&&s>0){m.clearRect(0,0,a,s),m.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)m.translate(-n.x1*h,-n.y1*h),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(n.x1*h,n.y1*h);else{var y=e.pan(),v={x:y.x*h,y:y.y*h};h*=e.zoom(),m.translate(v.x,v.y),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(-v.x,-v.y)}t.bg&&(m.globalCompositeOperation="destination-over",m.fillStyle=t.bg,m.rect(0,0,a,s),m.fill())}return p};o(Net,"b64ToBlob");o(R0e,"b64UriToB64");o(mge,"output");oT.png=function(t){return mge(t,this.bufferCanvasImage(t),"image/png")};oT.jpg=function(t){return mge(t,this.bufferCanvasImage(t),"image/jpeg")};gge={};gge.nodeShapeImpl=function(t,e,r,n,i,a,s,l){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,l);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,l);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,l);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,l);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};Met=yge,Wr=yge.prototype;Wr.CANVAS_LAYERS=3;Wr.SELECT_BOX=0;Wr.DRAG=1;Wr.NODE=2;Wr.WEBGL=3;Wr.CANVAS_TYPES=["2d","2d","2d","webgl2"];Wr.BUFFER_COUNT=3;Wr.TEXTURE_BUFFER=0;Wr.MOTIONBLUR_BUFFER_NODE=1;Wr.MOTIONBLUR_BUFFER_DRAG=2;o(yge,"CanvasRenderer");Wr.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Wr.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Wr.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Wr.SELECT_BOX]=e;break;case"gc":r.data.gc=!0;break}};Iet=typeof Path2D<"u";Wr.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Wr.usePaths=function(){return Iet&&this.pathsEnabled};Wr.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Wr.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Wr.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":aa(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[age,Du,$h,kB,H0,_d,Is,uge,Dd,oT,gge].forEach(function(t){pr(Wr,t)});Oet=[{name:"null",impl:Wme},{name:"base",impl:tge},{name:"canvas",impl:Met}],Pet=[{type:"layout",extensions:aJe},{type:"renderer",extensions:Oet}],vge={},xge={};o(bge,"setExtension");o(Tge,"getExtension");o(Bet,"setModule");o(Fet,"getModule");JP=o(function(){if(arguments.length===2)return Tge.apply(null,arguments);if(arguments.length===3)return bge.apply(null,arguments);if(arguments.length===4)return Fet.apply(null,arguments);if(arguments.length===5)return Bet.apply(null,arguments);ui("Invalid extension access syntax")},"extension");jb.prototype.extension=JP;Pet.forEach(function(t){t.extensions.forEach(function(e){bge(t.type,e.name,e.impl)})});iC=o(function(){if(!(this instanceof iC))return new iC;this.length=0},"Stylesheet"),U0=iC.prototype;U0.instanceString=function(){return"stylesheet"};U0.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};U0.css=function(t,e){var r=this.length-1;if(or(t))this[r].properties.push({name:t,value:e});else if(sn(t))for(var n=t,i=Object.keys(n),a=0;a{"use strict";o((function(e,r){typeof lT=="object"&&typeof CB=="object"?CB.exports=r():typeof define=="function"&&define.amd?define([],r):typeof lT=="object"?lT.layoutBase=r():e.layoutBase=r()}),"webpackUniversalModuleDefinition")(lT,function(){return(function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)})([(function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s}),(function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(4);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp&&(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)),this.labelHeight>m&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-m)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-m),this.setHeight(this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h}),(function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&k>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(k,1);var E=x.source.owner.getEdges().indexOf(x);if(E==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(E,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),E=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,E,w,k,S,A=this.nodes,L=A.length,I=0;IT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var L=0;v.forEach(function(I){I.owner==g&&L++}),L==this.nodes.length&&(this.isConnected=!0)}},t.exports=p}),(function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=A,!1;if(hf)return l[0]=p,l[1]=h,l[2]=k,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,C=!0):(l[0]=g,l[1]=m,C=!0):D===R&&(u>f?(l[0]=p,l[1]=m,C=!0):(l[0]=x,l[1]=v,C=!0)),-M===R?f>u?(l[2]=S,l[3]=A,_=!0):(l[2]=k,l[3]=w,_=!0):M===R&&(f>u?(l[2]=E,l[3]=w,_=!0):(l[2]=L,l[3]=A,_=!0)),C&&_)return!1;if(u>f?h>d?(P=this.getCardinalDirection(D,R,4),B=this.getCardinalDirection(M,R,2)):(P=this.getCardinalDirection(-D,R,3),B=this.getCardinalDirection(-M,R,1)):h>d?(P=this.getCardinalDirection(-D,R,1),B=this.getCardinalDirection(-M,R,3)):(P=this.getCardinalDirection(D,R,2),B=this.getCardinalDirection(M,R,4)),!C)switch(P){case 1:G=m,F=u+-T/R,l[0]=F,l[1]=G;break;case 2:F=x,G=h+b*R,l[0]=F,l[1]=G;break;case 3:G=v,F=u+T/R,l[0]=F,l[1]=G;break;case 4:F=y,G=h+-b*R,l[0]=F,l[1]=G;break}if(!_)switch(B){case 1:V=w,$=f+-N/R,l[2]=$,l[3]=V;break;case 2:$=L,V=d+I*R,l[2]=$,l[3]=V;break;case 3:V=A,$=f+N/R,l[2]=$,l[3]=V;break;case 4:$=S,V=d+-I*R,l[2]=$,l[3]=V;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,E=void 0,w=void 0,k=void 0,S=void 0,A=void 0,L=void 0;return T=p-f,w=h-d,S=d*f-h*p,E=v-g,k=m-y,A=y*g-m*v,L=T*k-E*w,L===0?null:(x=(w*A-k*S)/L,b=(E*S-T*A)/L,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n}),(function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i}),(function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var k=T[0];T.splice(0,1),b.add(k);for(var S=k.getEdges(),x=0;x-1&&w.splice(N,1)}b=new Set,E=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(A,1);var L=E.getNeighborsList();L.forEach(function(C){if(y.indexOf(C)<0){var _=v.get(C),D=_-1;D==1&&k.push(C),v.set(C,D)}})}y=y.concat(k),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p}),(function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n}),(function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i}),(function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var E=0;Eh},"_defaultCompareFunction")}]),l})();t.exports=s}),(function(t,e,r){"use strict";var n=(function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o((function(e,r){typeof cT=="object"&&typeof _B=="object"?_B.exports=r(AB()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof cT=="object"?cT.coseBase=r(AB()):e.coseBase=r(e.layoutBase)}),"webpackUniversalModuleDefinition")(cT,function(t){return(function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)})([(function(e,r){e.exports=t}),(function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}o(a,"CoSEConstants");for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a}),(function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEEdge"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).LGraph;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEGraph"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(l){i.call(this,l)}o(a,"CoSEGraphManager"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(u,h,f,d){i.call(this,u,h,f,d)}o(s,"CoSENode"),s.prototype=Object.create(i.prototype);for(var l in i)s[l]=i[l];s.prototype.move=function(){var u=this.graphManager.getLayout();this.displacementX=u.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=u.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementX=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementY=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),u.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(u,h){for(var f=this.getChild().getNodes(),d,p=0;p0)this.positionNodesRadially(w);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),S=this.nodesWithGravity.filter(function(A){return k.has(A)});this.graphManager.setAllNodesToApplyGravitation(S),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%f.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var w=new Set(this.getAllNodes()),k=this.nodesWithGravity.filter(function(L){return w.has(L)});this.graphManager.setAllNodesToApplyGravitation(k),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var S=!this.isTreeGrowing&&!this.isGrowthFinished,A=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(S,A),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var w=this.graphManager.getAllNodes(),k={},S=0;S1){var C;for(C=0;CA&&(A=Math.floor(N.y)),I=Math.floor(N.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new m(d.WORLD_CENTER_X-N.x/2,d.WORLD_CENTER_Y-N.y/2))},T.radialLayout=function(w,k,S){var A=Math.max(this.maxDiagonalInTree(w),h.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(k,null,0,359,0,A);var L=x.calculateBounds(w),I=new b;I.setDeviceOrgX(L.getMinX()),I.setDeviceOrgY(L.getMinY()),I.setWorldOrgX(S.x),I.setWorldOrgY(S.y);for(var N=0;N1;){var X=V[0];V.splice(0,1);var Q=P.indexOf(X);Q>=0&&P.splice(Q,1),G--,B--}k!=null?$=(P.indexOf(V[0])+1)%G:$=0;for(var H=Math.abs(A-S)/B,ie=$;F!=B;ie=++ie%G){var Y=P[ie].getOtherEnd(w);if(Y!=k){var le=(S+F*H)%360,ee=(le+H)%360;T.branchRadialLayout(Y,w,le,ee,L+I,I),F++}}},T.maxDiagonalInTree=function(w){for(var k=y.MIN_VALUE,S=0;Sk&&(k=L)}return k},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var w=this,k={};this.memberGroups={},this.idToDummyNode={};for(var S=[],A=this.graphManager.getAllNodes(),L=0;L"u"&&(k[C]=[]),k[C]=k[C].concat(I)}Object.keys(k).forEach(function(_){if(k[_].length>1){var D="DummyCompound_"+_;w.memberGroups[D]=k[_];var M=k[_][0].getParent(),R=new l(w.graphManager);R.id=D,R.paddingLeft=M.paddingLeft||0,R.paddingRight=M.paddingRight||0,R.paddingBottom=M.paddingBottom||0,R.paddingTop=M.paddingTop||0,w.idToDummyNode[D]=R;var P=w.getGraphManager().add(w.newGraph(),R),B=M.getChild();B.add(R);for(var F=0;F=0;w--){var k=this.compoundOrder[w],S=k.id,A=k.paddingLeft,L=k.paddingTop;this.adjustLocations(this.tiledMemberPack[S],k.rect.x,k.rect.y,A,L)}},T.prototype.repopulateZeroDegreeMembers=function(){var w=this,k=this.tiledZeroDegreePack;Object.keys(k).forEach(function(S){var A=w.idToDummyNode[S],L=A.paddingLeft,I=A.paddingTop;w.adjustLocations(k[S],A.rect.x,A.rect.y,L,I)})},T.prototype.getToBeTiled=function(w){var k=w.id;if(this.toBeTiled[k]!=null)return this.toBeTiled[k];var S=w.getChild();if(S==null)return this.toBeTiled[k]=!1,!1;for(var A=S.getNodes(),L=0;L0)return this.toBeTiled[k]=!1,!1;if(I.getChild()==null){this.toBeTiled[I.id]=!1;continue}if(!this.getToBeTiled(I))return this.toBeTiled[k]=!1,!1}return this.toBeTiled[k]=!0,!0},T.prototype.getNodeDegree=function(w){for(var k=w.id,S=w.getEdges(),A=0,L=0;L_&&(_=M.rect.height)}S+=_+w.verticalPadding}},T.prototype.tileCompoundMembers=function(w,k){var S=this;this.tiledMemberPack=[],Object.keys(w).forEach(function(A){var L=k[A];S.tiledMemberPack[A]=S.tileNodes(w[A],L.paddingLeft+L.paddingRight),L.rect.width=S.tiledMemberPack[A].width,L.rect.height=S.tiledMemberPack[A].height})},T.prototype.tileNodes=function(w,k){var S=h.TILING_PADDING_VERTICAL,A=h.TILING_PADDING_HORIZONTAL,L={rows:[],rowWidth:[],rowHeight:[],width:0,height:k,verticalPadding:S,horizontalPadding:A};w.sort(function(C,_){return C.rect.width*C.rect.height>_.rect.width*_.rect.height?-1:C.rect.width*C.rect.height<_.rect.width*_.rect.height?1:0});for(var I=0;I0&&(N+=w.horizontalPadding),w.rowWidth[S]=N,w.width0&&(C+=w.verticalPadding);var _=0;C>w.rowHeight[S]&&(_=w.rowHeight[S],w.rowHeight[S]=C,_=w.rowHeight[S]-_),w.height+=_,w.rows[S].push(k)},T.prototype.getShortestRowIndex=function(w){for(var k=-1,S=Number.MAX_VALUE,A=0;AS&&(k=A,S=w.rowWidth[A]);return k},T.prototype.canAddHorizontal=function(w,k,S){var A=this.getShortestRowIndex(w);if(A<0)return!0;var L=w.rowWidth[A];if(L+w.horizontalPadding+k<=w.width)return!0;var I=0;w.rowHeight[A]0&&(I=S+w.verticalPadding-w.rowHeight[A]);var N;w.width-L>=k+w.horizontalPadding?N=(w.height+I)/(L+k+w.horizontalPadding):N=(w.height+I)/w.width,I=S+w.verticalPadding;var C;return w.widthI&&k!=S){A.splice(-1,1),w.rows[S].push(L),w.rowWidth[k]=w.rowWidth[k]-I,w.rowWidth[S]=w.rowWidth[S]+I,w.width=w.rowWidth[instance.getLongestRowIndex(w)];for(var N=Number.MIN_VALUE,C=0;CN&&(N=A[C].height);k>0&&(N+=w.verticalPadding);var _=w.rowHeight[k]+w.rowHeight[S];w.rowHeight[k]=N,w.rowHeight[S]0)for(var B=L;B<=I;B++)P[0]+=this.grid[B][N-1].length+this.grid[B][N].length-1;if(I0)for(var B=N;B<=C;B++)P[3]+=this.grid[L-1][B].length+this.grid[L][B].length-1;for(var F=y.MAX_VALUE,G,$,V=0;V{"use strict";o((function(e,r){typeof uT=="object"&&typeof RB=="object"?RB.exports=r(DB()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof uT=="object"?uT.cytoscapeCoseBilkent=r(DB()):e.cytoscapeCoseBilkent=r(e.coseBase)}),"webpackUniversalModuleDefinition")(uT,function(t){return(function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)})([(function(e,r){e.exports=t}),(function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,l=n(0).CoSELayout,u=n(0).CoSENode,h=n(0).layoutBase.PointD,f=n(0).layoutBase.DimensionD,d={ready:o(function(){},"ready"),stop:o(function(){},"stop"),quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function p(v,x){var b={};for(var T in v)b[T]=v[T];for(var T in x)b[T]=x[T];return b}o(p,"extend");function m(v){this.options=p(d,v),g(this.options)}o(m,"_CoSELayout");var g=o(function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal},"getUserOptions");m.prototype.run=function(){var v,x,b=this.options,T=this.idToLNode={},E=this.layout=new l,w=this;w.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var k=E.newGraphManager();this.gm=k;var S=this.options.eles.nodes(),A=this.options.eles.edges();this.root=k.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(S),E);for(var L=0;L0){var C;C=b.getGraphManager().add(b.newGraph(),S),this.processChildrenList(C,k,b)}}},m.prototype.stop=function(){return this.stopped=!0,this};var y=o(function(x){x("layout","cose-bilkent",m)},"register");typeof cytoscape<"u"&&y(cytoscape),e.exports=y})])})});function zet(t,e){t.forEach(r=>{let n={id:r.id,labelText:r.label,height:r.height,width:r.width,padding:r.padding??0};Object.keys(r).forEach(i=>{["id","label","height","width","padding","x","y"].includes(i)||(n[i]=r[i])}),e.add({group:"nodes",data:n,position:{x:r.x??0,y:r.y??0}})})}function Get(t,e){t.forEach(r=>{let n={id:r.id,source:r.start,target:r.end};Object.keys(r).forEach(i=>{["id","start","end"].includes(i)||(n[i]=r[i])}),e.add({group:"edges",data:n})})}function Ege(t){return new Promise(e=>{let r=je("body").append("div").attr("id","cy").attr("style","display:none"),n=Il({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});r.remove(),zet(t.nodes,n),Get(t.edges,n),n.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}});let i={name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1};n.layout(i).run(),n.ready(a=>{K.info("Cytoscape ready",a),e(n)})})}function Sge(t){return t.nodes().map(e=>{let r=e.data(),n=e.position(),i={id:r.id,x:n.x,y:n.y};return Object.keys(r).forEach(a=>{a!=="id"&&(i[a]=r[a])}),i})}function Cge(t){return t.edges().map(e=>{let r=e.data(),n=e._private.rscratch,i={id:r.id,source:r.source,target:r.target,startX:n.startX,startY:n.startY,midX:n.midX,midY:n.midY,endX:n.endX,endY:n.endY};return Object.keys(r).forEach(a=>{["id","source","target"].includes(a)||(i[a]=r[a])}),i})}var kge,Age=O(()=>{"use strict";SB();kge=Ra(wge(),1);Ar();xt();Il.use(kge.default);o(zet,"addNodes");o(Get,"addEdges");o(Ege,"createCytoscapeInstance");o(Sge,"extractPositionedNodes");o(Cge,"extractPositionedEdges")});async function _ge(t,e){K.debug("Starting cose-bilkent layout algorithm");try{Vet(t);let r=await Ege(t),n=Sge(r),i=Cge(r);return K.debug(`Layout completed: ${n.length} nodes, ${i.length} edges`),{nodes:n,edges:i}}catch(r){throw K.error("Error in cose-bilkent layout algorithm:",r),r}}function Vet(t){if(!t)throw new Error("Layout data is required");if(!t.config)throw new Error("Configuration is required in layout data");if(!t.rootNode)throw new Error("Root node is required");if(!t.nodes||!Array.isArray(t.nodes))throw new Error("No nodes found in layout data");if(!Array.isArray(t.edges))throw new Error("Edges array is required in layout data");return!0}var Dge=O(()=>{"use strict";xt();Age();o(_ge,"executeCoseBilkentLayout");o(Vet,"validateLayoutData")});var Rge,Lge=O(()=>{"use strict";Dge();Rge=o(async(t,e,{insertCluster:r,insertEdge:n,insertEdgeLabel:i,insertMarkers:a,insertNode:s,log:l,positionEdgeLabel:u},{algorithm:h})=>{let f={},d={},p=e.select("g");a(p,t.markers,t.type,t.diagramId);let m=p.insert("g").attr("class","subgraphs"),g=p.insert("g").attr("class","edgePaths"),y=p.insert("g").attr("class","edgeLabels"),v=p.insert("g").attr("class","nodes");l.debug("Inserting nodes into DOM for dimension calculation"),await Promise.all(t.nodes.map(async T=>{if(T.isGroup){let E={...T};d[T.id]=E,f[T.id]=E,await r(m,T)}else{let E={...T};f[T.id]=E;let w=await s(v,T,{config:t.config,dir:t.direction||"TB"}),k=w.node().getBBox();E.width=k.width,E.height=k.height,E.domId=w,l.debug(`Node ${T.id} dimensions: ${k.width}x${k.height}`)}})),l.debug("Running cose-bilkent layout algorithm");let x={...t,nodes:t.nodes.map(T=>{let E=f[T.id];return{...T,width:E.width,height:E.height}})},b=await _ge(x,t.config);l.debug("Positioning nodes based on layout results"),b.nodes.forEach(T=>{let E=f[T.id];E?.domId&&(E.domId.attr("transform",`translate(${T.x}, ${T.y})`),E.x=T.x,E.y=T.y,l.debug(`Positioned node ${E.id} at center (${T.x}, ${T.y})`))}),b.edges.forEach(T=>{let E=t.edges.find(w=>w.id===T.id);E&&(E.points=[{x:T.startX,y:T.startY},{x:T.midX,y:T.midY},{x:T.endX,y:T.endY}])}),l.debug("Inserting and positioning edges"),await Promise.all(t.edges.map(async T=>{let E=await i(y,T),w=f[T.start??""],k=f[T.end??""];if(w&&k){let S=b.edges.find(A=>A.id===T.id);if(S){l.debug("APA01 positionedEdge",S);let A={...T},L=n(g,A,d,t.type,w,k,t.diagramId);u(A,L)}else{let A={...T,points:[{x:w.x||0,y:w.y||0},{x:k.x||0,y:k.y||0}]},L=n(g,A,d,t.type,w,k,t.diagramId);u(A,L)}}})),l.debug("Cose-bilkent rendering completed")},"render")});var Nge={};vr(Nge,{render:()=>qet});var qet,Mge=O(()=>{"use strict";Lge();qet=Rge});var hT,LB,Uet,Ol,Ru,Rd=O(()=>{"use strict";woe();xt();hT={},LB=o(t=>{for(let e of t)hT[e.name]=e},"registerLayoutLoaders"),Uet=o(()=>{LB([{name:"dagre",loader:o(async()=>await Promise.resolve().then(()=>(rde(),tde)),"loader")},{name:"cose-bilkent",loader:o(async()=>await Promise.resolve().then(()=>(Mge(),Nge)),"loader")}])},"registerDefaultLayoutLoaders");Uet();Ol=o(async(t,e)=>{if(!(t.layoutAlgorithm in hT))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=hT[t.layoutAlgorithm];return(await r.loader()).render(t,e,Toe,{algorithm:r.algorithm})},"render"),Ru=o((t="",{fallback:e="dagre"}={})=>{if(t in hT)return t;if(e in hT)return K.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var bo,Wet,Het,Ld=O(()=>{"use strict";Ti();xt();bo=o((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:l}=Wet(t,e);Zr(t,a,i,n);let u=Het(s,l,i,a,e);t.attr("viewBox",u),K.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),Wet=o((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),Het=o((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var Yet,jet,Ige,Oge=O(()=>{"use strict";Ar();jt();xt();b0();Rd();Ld();ar();Yet=o(function(t,e){return e.db.getClasses()},"getClasses"),jet=o(async function(t,e,r,n){K.info("REF0:"),K.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=ve(),l;i==="sandbox"&&(l=je("#i"+e));let u=i==="sandbox"?l.nodes()[0].contentDocument:document;K.debug("Before getData: ");let h=n.db.getData();K.debug("Data: ",h);let f=Sl(e,i),d=n.db.getDirection();h.type=n.type,h.layoutAlgorithm=Ru(s),h.layoutAlgorithm==="dagre"&&s==="elk"&&K.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),h.direction=d,h.nodeSpacing=a?.nodeSpacing||50,h.rankSpacing=a?.rankSpacing||50,h.markers=["point","circle","cross"],h.diagramId=e,K.debug("REF1:",h),await Ol(h,f);let p=h.config.flowchart?.diagramPadding??8;Xt.insertTitle(f,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),bo(f,p,"flowchart",a?.useMaxWidth||!1);for(let m of h.nodes){let g=je(`#${e} [id="${m.id}"]`);if(!g||!m.link)continue;let y=u.createElementNS("http://www.w3.org/2000/svg","a");y.setAttributeNS("http://www.w3.org/2000/svg","class",m.cssClasses),y.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?y.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):m.linkTarget&&y.setAttributeNS("http://www.w3.org/2000/svg","target",m.linkTarget);let v=g.insert(function(){return y},":first-child"),x=g.select(".label-container");x&&v.append(function(){return x.node()});let b=g.select(".label");b&&v.append(function(){return b.node()})}},"draw"),Ige={getClasses:Yet,draw:jet}});var NB,MB,Pge=O(()=>{"use strict";NB=(function(){var t=o(function(Pt,Tt,Vt,Qt){for(Vt=Vt||{},Qt=Pt.length;Qt--;Vt[Pt[Qt]]=Tt);return Vt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],a=[2,2],s=[1,13],l=[1,14],u=[1,15],h=[1,16],f=[1,23],d=[1,25],p=[1,26],m=[1,27],g=[1,50],y=[1,49],v=[1,29],x=[1,30],b=[1,31],T=[1,32],E=[1,33],w=[1,45],k=[1,47],S=[1,43],A=[1,48],L=[1,44],I=[1,51],N=[1,46],C=[1,52],_=[1,53],D=[1,34],M=[1,35],R=[1,36],P=[1,37],B=[1,38],F=[1,58],G=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],$=[1,62],V=[1,61],X=[1,63],Q=[8,9,11,75,77,78],H=[1,79],ie=[1,92],Y=[1,97],le=[1,96],ee=[1,93],J=[1,89],te=[1,95],Z=[1,91],xe=[1,98],de=[1,94],Se=[1,99],Me=[1,90],ke=[8,9,10,11,40,75,77,78],we=[8,9,10,11,40,46,75,77,78],_e=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],$e=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],fe=[44,60,89,102,105,106,109,111,114,115,116],Ke=[1,122],Te=[1,123],Be=[1,125],Ue=[1,124],Ge=[44,60,62,74,89,102,105,106,109,111,114,115,116],Ne=[1,134],We=[1,148],j=[1,149],ae=[1,150],U=[1,151],ce=[1,136],z=[1,138],ne=[1,142],se=[1,143],be=[1,144],pe=[1,145],me=[1,146],Re=[1,147],ge=[1,152],Ie=[1,153],qe=[1,132],Pe=[1,133],Xe=[1,140],oe=[1,135],et=[1,139],he=[1,137],ot=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],Dt=[1,155],It=[1,157],wt=[8,9,11],Rt=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],it=[1,177],at=[1,173],Ct=[1,174],yt=[1,178],dt=[1,175],Ht=[1,176],cr=[77,116,119],Kt=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],kr=[10,106],ur=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],tr=[1,248],hr=[1,246],_n=[1,250],mt=[1,244],Le=[1,245],ct=[1,247],St=[1,249],Mr=[1,251],tn=[1,269],cn=[8,9,11,106],Cr=[8,9,10,11,60,84,105,106,109,110,111,112],Ki={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,direction_td:125,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr",125:"direction_td"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1],[33,1]],performAction:o(function(Tt,Vt,Qt,gt,xn,ye,Mo){var Ee=ye.length-1;switch(xn){case 2:this.$=[];break;case 3:(!Array.isArray(ye[Ee])||ye[Ee].length>0)&&ye[Ee-1].push(ye[Ee]),this.$=ye[Ee-1];break;case 4:case 183:this.$=ye[Ee];break;case 11:gt.setDirection("TB"),this.$="TB";break;case 12:gt.setDirection(ye[Ee-1]),this.$=ye[Ee-1];break;case 27:this.$=ye[Ee-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=gt.addSubGraph(ye[Ee-6],ye[Ee-1],ye[Ee-4]);break;case 34:this.$=gt.addSubGraph(ye[Ee-3],ye[Ee-1],ye[Ee-3]);break;case 35:this.$=gt.addSubGraph(void 0,ye[Ee-1],void 0);break;case 37:this.$=ye[Ee].trim(),gt.setAccTitle(this.$);break;case 38:case 39:this.$=ye[Ee].trim(),gt.setAccDescription(this.$);break;case 43:this.$=ye[Ee-1]+ye[Ee];break;case 44:this.$=ye[Ee];break;case 45:gt.addVertex(ye[Ee-1][ye[Ee-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ye[Ee]),gt.addLink(ye[Ee-3].stmt,ye[Ee-1],ye[Ee-2]),this.$={stmt:ye[Ee-1],nodes:ye[Ee-1].concat(ye[Ee-3].nodes)};break;case 46:gt.addLink(ye[Ee-2].stmt,ye[Ee],ye[Ee-1]),this.$={stmt:ye[Ee],nodes:ye[Ee].concat(ye[Ee-2].nodes)};break;case 47:gt.addLink(ye[Ee-3].stmt,ye[Ee-1],ye[Ee-2]),this.$={stmt:ye[Ee-1],nodes:ye[Ee-1].concat(ye[Ee-3].nodes)};break;case 48:this.$={stmt:ye[Ee-1],nodes:ye[Ee-1]};break;case 49:gt.addVertex(ye[Ee-1][ye[Ee-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ye[Ee]),this.$={stmt:ye[Ee-1],nodes:ye[Ee-1],shapeData:ye[Ee]};break;case 50:this.$={stmt:ye[Ee],nodes:ye[Ee]};break;case 51:this.$=[ye[Ee]];break;case 52:gt.addVertex(ye[Ee-5][ye[Ee-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ye[Ee-4]),this.$=ye[Ee-5].concat(ye[Ee]);break;case 53:this.$=ye[Ee-4].concat(ye[Ee]);break;case 54:this.$=ye[Ee];break;case 55:this.$=ye[Ee-2],gt.setClass(ye[Ee-2],ye[Ee]);break;case 56:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"square");break;case 57:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"doublecircle");break;case 58:this.$=ye[Ee-5],gt.addVertex(ye[Ee-5],ye[Ee-2],"circle");break;case 59:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"ellipse");break;case 60:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"stadium");break;case 61:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"subroutine");break;case 62:this.$=ye[Ee-7],gt.addVertex(ye[Ee-7],ye[Ee-1],"rect",void 0,void 0,void 0,Object.fromEntries([[ye[Ee-5],ye[Ee-3]]]));break;case 63:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"cylinder");break;case 64:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"round");break;case 65:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"diamond");break;case 66:this.$=ye[Ee-5],gt.addVertex(ye[Ee-5],ye[Ee-2],"hexagon");break;case 67:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"odd");break;case 68:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"trapezoid");break;case 69:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"inv_trapezoid");break;case 70:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"lean_right");break;case 71:this.$=ye[Ee-3],gt.addVertex(ye[Ee-3],ye[Ee-1],"lean_left");break;case 72:this.$=ye[Ee],gt.addVertex(ye[Ee]);break;case 73:ye[Ee-1].text=ye[Ee],this.$=ye[Ee-1];break;case 74:case 75:ye[Ee-2].text=ye[Ee-1],this.$=ye[Ee-2];break;case 76:this.$=ye[Ee];break;case 77:var _i=gt.destructLink(ye[Ee],ye[Ee-2]);this.$={type:_i.type,stroke:_i.stroke,length:_i.length,text:ye[Ee-1]};break;case 78:var _i=gt.destructLink(ye[Ee],ye[Ee-2]);this.$={type:_i.type,stroke:_i.stroke,length:_i.length,text:ye[Ee-1],id:ye[Ee-3]};break;case 79:this.$={text:ye[Ee],type:"text"};break;case 80:this.$={text:ye[Ee-1].text+""+ye[Ee],type:ye[Ee-1].type};break;case 81:this.$={text:ye[Ee],type:"string"};break;case 82:this.$={text:ye[Ee],type:"markdown"};break;case 83:var _i=gt.destructLink(ye[Ee]);this.$={type:_i.type,stroke:_i.stroke,length:_i.length};break;case 84:var _i=gt.destructLink(ye[Ee]);this.$={type:_i.type,stroke:_i.stroke,length:_i.length,id:ye[Ee-1]};break;case 85:this.$=ye[Ee-1];break;case 86:this.$={text:ye[Ee],type:"text"};break;case 87:this.$={text:ye[Ee-1].text+""+ye[Ee],type:ye[Ee-1].type};break;case 88:this.$={text:ye[Ee],type:"string"};break;case 89:case 104:this.$={text:ye[Ee],type:"markdown"};break;case 101:this.$={text:ye[Ee],type:"text"};break;case 102:this.$={text:ye[Ee-1].text+""+ye[Ee],type:ye[Ee-1].type};break;case 103:this.$={text:ye[Ee],type:"text"};break;case 105:this.$=ye[Ee-4],gt.addClass(ye[Ee-2],ye[Ee]);break;case 106:this.$=ye[Ee-4],gt.setClass(ye[Ee-2],ye[Ee]);break;case 107:case 115:this.$=ye[Ee-1],gt.setClickEvent(ye[Ee-1],ye[Ee]);break;case 108:case 116:this.$=ye[Ee-3],gt.setClickEvent(ye[Ee-3],ye[Ee-2]),gt.setTooltip(ye[Ee-3],ye[Ee]);break;case 109:this.$=ye[Ee-2],gt.setClickEvent(ye[Ee-2],ye[Ee-1],ye[Ee]);break;case 110:this.$=ye[Ee-4],gt.setClickEvent(ye[Ee-4],ye[Ee-3],ye[Ee-2]),gt.setTooltip(ye[Ee-4],ye[Ee]);break;case 111:this.$=ye[Ee-2],gt.setLink(ye[Ee-2],ye[Ee]);break;case 112:this.$=ye[Ee-4],gt.setLink(ye[Ee-4],ye[Ee-2]),gt.setTooltip(ye[Ee-4],ye[Ee]);break;case 113:this.$=ye[Ee-4],gt.setLink(ye[Ee-4],ye[Ee-2],ye[Ee]);break;case 114:this.$=ye[Ee-6],gt.setLink(ye[Ee-6],ye[Ee-4],ye[Ee]),gt.setTooltip(ye[Ee-6],ye[Ee-2]);break;case 117:this.$=ye[Ee-1],gt.setLink(ye[Ee-1],ye[Ee]);break;case 118:this.$=ye[Ee-3],gt.setLink(ye[Ee-3],ye[Ee-2]),gt.setTooltip(ye[Ee-3],ye[Ee]);break;case 119:this.$=ye[Ee-3],gt.setLink(ye[Ee-3],ye[Ee-2],ye[Ee]);break;case 120:this.$=ye[Ee-5],gt.setLink(ye[Ee-5],ye[Ee-4],ye[Ee]),gt.setTooltip(ye[Ee-5],ye[Ee-2]);break;case 121:this.$=ye[Ee-4],gt.addVertex(ye[Ee-2],void 0,void 0,ye[Ee]);break;case 122:this.$=ye[Ee-4],gt.updateLink([ye[Ee-2]],ye[Ee]);break;case 123:this.$=ye[Ee-4],gt.updateLink(ye[Ee-2],ye[Ee]);break;case 124:this.$=ye[Ee-8],gt.updateLinkInterpolate([ye[Ee-6]],ye[Ee-2]),gt.updateLink([ye[Ee-6]],ye[Ee]);break;case 125:this.$=ye[Ee-8],gt.updateLinkInterpolate(ye[Ee-6],ye[Ee-2]),gt.updateLink(ye[Ee-6],ye[Ee]);break;case 126:this.$=ye[Ee-6],gt.updateLinkInterpolate([ye[Ee-4]],ye[Ee]);break;case 127:this.$=ye[Ee-6],gt.updateLinkInterpolate(ye[Ee-4],ye[Ee]);break;case 128:case 130:this.$=[ye[Ee]];break;case 129:case 131:ye[Ee-2].push(ye[Ee]),this.$=ye[Ee-2];break;case 133:this.$=ye[Ee-1]+ye[Ee];break;case 181:this.$=ye[Ee];break;case 182:this.$=ye[Ee-1]+""+ye[Ee];break;case 184:this.$=ye[Ee-1]+""+ye[Ee];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break;case 189:this.$={stmt:"dir",value:"TD"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,33:24,34:d,36:p,38:m,42:28,43:39,44:g,45:40,47:41,60:y,84:v,85:x,86:b,87:T,88:E,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_,121:D,122:M,123:R,124:P,125:B},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,55],9:[1,56],10:F,15:54,18:57},t(G,[2,3]),t(G,[2,4]),t(G,[2,5]),t(G,[2,6]),t(G,[2,7]),t(G,[2,8]),{8:$,9:V,11:X,21:59,41:60,72:64,75:[1,65],77:[1,67],78:[1,66]},{8:$,9:V,11:X,21:68},{8:$,9:V,11:X,21:69},{8:$,9:V,11:X,21:70},{8:$,9:V,11:X,21:71},{8:$,9:V,11:X,21:72},{8:$,9:V,10:[1,73],11:X,21:74},t(G,[2,36]),{35:[1,75]},{37:[1,76]},t(G,[2,39]),t(Q,[2,50],{18:77,39:78,10:F,40:H}),{10:[1,80]},{10:[1,81]},{10:[1,82]},{10:[1,83]},{14:ie,44:Y,60:le,80:[1,87],89:ee,95:[1,84],97:[1,85],101:86,105:J,106:te,109:Z,111:xe,114:de,115:Se,116:Me,120:88},t(G,[2,185]),t(G,[2,186]),t(G,[2,187]),t(G,[2,188]),t(G,[2,189]),t(ke,[2,51]),t(ke,[2,54],{46:[1,100]}),t(we,[2,72],{113:113,29:[1,101],44:g,48:[1,102],50:[1,103],52:[1,104],54:[1,105],56:[1,106],58:[1,107],60:y,63:[1,108],65:[1,109],67:[1,110],68:[1,111],70:[1,112],89:w,102:k,105:S,106:A,109:L,111:I,114:N,115:C,116:_}),t(_e,[2,181]),t(_e,[2,142]),t(_e,[2,143]),t(_e,[2,144]),t(_e,[2,145]),t(_e,[2,146]),t(_e,[2,147]),t(_e,[2,148]),t(_e,[2,149]),t(_e,[2,150]),t(_e,[2,151]),t(_e,[2,152]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,114]},t($e,[2,26],{18:115,10:F}),t(G,[2,27]),{42:116,43:39,44:g,45:40,47:41,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},t(G,[2,40]),t(G,[2,41]),t(G,[2,42]),t(fe,[2,76],{73:117,62:[1,119],74:[1,118]}),{76:120,79:121,80:Ke,81:Te,116:Be,119:Ue},{75:[1,126],77:[1,127]},t(Ge,[2,83]),t(G,[2,28]),t(G,[2,29]),t(G,[2,30]),t(G,[2,31]),t(G,[2,32]),{10:Ne,12:We,14:j,27:ae,28:128,32:U,44:ce,60:z,75:ne,80:[1,130],81:[1,131],83:141,84:se,85:be,86:pe,87:me,88:Re,89:ge,90:Ie,91:129,105:qe,109:Pe,111:Xe,114:oe,115:et,116:he},t(ot,a,{5:154}),t(G,[2,37]),t(G,[2,38]),t(Q,[2,48],{44:Dt}),t(Q,[2,49],{18:156,10:F,40:It}),t(ke,[2,44]),{44:g,47:158,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},{102:[1,159],103:160,105:[1,161]},{44:g,47:162,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},{44:g,47:163,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},t(wt,[2,107],{10:[1,164],96:[1,165]}),{80:[1,166]},t(wt,[2,115],{120:168,10:[1,167],14:ie,44:Y,60:le,89:ee,105:J,106:te,109:Z,111:xe,114:de,115:Se,116:Me}),t(wt,[2,117],{10:[1,169]}),t(Rt,[2,183]),t(Rt,[2,170]),t(Rt,[2,171]),t(Rt,[2,172]),t(Rt,[2,173]),t(Rt,[2,174]),t(Rt,[2,175]),t(Rt,[2,176]),t(Rt,[2,177]),t(Rt,[2,178]),t(Rt,[2,179]),t(Rt,[2,180]),{44:g,47:170,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},{30:171,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:179,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:181,50:[1,180],67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:182,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:183,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:184,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{109:[1,185]},{30:186,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:187,65:[1,188],67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:189,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:190,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{30:191,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},t(_e,[2,182]),t(i,[2,20]),t($e,[2,25]),t(Q,[2,46],{39:192,18:193,10:F,40:H}),t(fe,[2,73],{10:[1,194]}),{10:[1,195]},{30:196,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{77:[1,197],79:198,116:Be,119:Ue},t(cr,[2,79]),t(cr,[2,81]),t(cr,[2,82]),t(cr,[2,168]),t(cr,[2,169]),{76:199,79:121,80:Ke,81:Te,116:Be,119:Ue},t(Ge,[2,84]),{8:$,9:V,10:Ne,11:X,12:We,14:j,21:201,27:ae,29:[1,200],32:U,44:ce,60:z,75:ne,83:141,84:se,85:be,86:pe,87:me,88:Re,89:ge,90:Ie,91:202,105:qe,109:Pe,111:Xe,114:oe,115:et,116:he},t(Kt,[2,101]),t(Kt,[2,103]),t(Kt,[2,104]),t(Kt,[2,157]),t(Kt,[2,158]),t(Kt,[2,159]),t(Kt,[2,160]),t(Kt,[2,161]),t(Kt,[2,162]),t(Kt,[2,163]),t(Kt,[2,164]),t(Kt,[2,165]),t(Kt,[2,166]),t(Kt,[2,167]),t(Kt,[2,90]),t(Kt,[2,91]),t(Kt,[2,92]),t(Kt,[2,93]),t(Kt,[2,94]),t(Kt,[2,95]),t(Kt,[2,96]),t(Kt,[2,97]),t(Kt,[2,98]),t(Kt,[2,99]),t(Kt,[2,100]),{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,203],33:24,34:d,36:p,38:m,42:28,43:39,44:g,45:40,47:41,60:y,84:v,85:x,86:b,87:T,88:E,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_,121:D,122:M,123:R,124:P,125:B},{10:F,18:204},{44:[1,205]},t(ke,[2,43]),{10:[1,206],44:g,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:113,114:N,115:C,116:_},{10:[1,207]},{10:[1,208],106:[1,209]},t(kr,[2,128]),{10:[1,210],44:g,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:113,114:N,115:C,116:_},{10:[1,211],44:g,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:113,114:N,115:C,116:_},{80:[1,212]},t(wt,[2,109],{10:[1,213]}),t(wt,[2,111],{10:[1,214]}),{80:[1,215]},t(Rt,[2,184]),{80:[1,216],98:[1,217]},t(ke,[2,55],{113:113,44:g,60:y,89:w,102:k,105:S,106:A,109:L,111:I,114:N,115:C,116:_}),{31:[1,218],67:it,82:219,116:yt,117:dt,118:Ht},t(ur,[2,86]),t(ur,[2,88]),t(ur,[2,89]),t(ur,[2,153]),t(ur,[2,154]),t(ur,[2,155]),t(ur,[2,156]),{49:[1,220],67:it,82:219,116:yt,117:dt,118:Ht},{30:221,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{51:[1,222],67:it,82:219,116:yt,117:dt,118:Ht},{53:[1,223],67:it,82:219,116:yt,117:dt,118:Ht},{55:[1,224],67:it,82:219,116:yt,117:dt,118:Ht},{57:[1,225],67:it,82:219,116:yt,117:dt,118:Ht},{60:[1,226]},{64:[1,227],67:it,82:219,116:yt,117:dt,118:Ht},{66:[1,228],67:it,82:219,116:yt,117:dt,118:Ht},{30:229,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},{31:[1,230],67:it,82:219,116:yt,117:dt,118:Ht},{67:it,69:[1,231],71:[1,232],82:219,116:yt,117:dt,118:Ht},{67:it,69:[1,234],71:[1,233],82:219,116:yt,117:dt,118:Ht},t(Q,[2,45],{18:156,10:F,40:It}),t(Q,[2,47],{44:Dt}),t(fe,[2,75]),t(fe,[2,74]),{62:[1,235],67:it,82:219,116:yt,117:dt,118:Ht},t(fe,[2,77]),t(cr,[2,80]),{77:[1,236],79:198,116:Be,119:Ue},{30:237,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},t(ot,a,{5:238}),t(Kt,[2,102]),t(G,[2,35]),{43:239,44:g,45:40,47:41,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},{10:F,18:240},{10:tr,60:hr,84:_n,92:241,105:mt,107:242,108:243,109:Le,110:ct,111:St,112:Mr},{10:tr,60:hr,84:_n,92:252,104:[1,253],105:mt,107:242,108:243,109:Le,110:ct,111:St,112:Mr},{10:tr,60:hr,84:_n,92:254,104:[1,255],105:mt,107:242,108:243,109:Le,110:ct,111:St,112:Mr},{105:[1,256]},{10:tr,60:hr,84:_n,92:257,105:mt,107:242,108:243,109:Le,110:ct,111:St,112:Mr},{44:g,47:258,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},t(wt,[2,108]),{80:[1,259]},{80:[1,260],98:[1,261]},t(wt,[2,116]),t(wt,[2,118],{10:[1,262]}),t(wt,[2,119]),t(we,[2,56]),t(ur,[2,87]),t(we,[2,57]),{51:[1,263],67:it,82:219,116:yt,117:dt,118:Ht},t(we,[2,64]),t(we,[2,59]),t(we,[2,60]),t(we,[2,61]),{109:[1,264]},t(we,[2,63]),t(we,[2,65]),{66:[1,265],67:it,82:219,116:yt,117:dt,118:Ht},t(we,[2,67]),t(we,[2,68]),t(we,[2,70]),t(we,[2,69]),t(we,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(fe,[2,78]),{31:[1,266],67:it,82:219,116:yt,117:dt,118:Ht},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,267],33:24,34:d,36:p,38:m,42:28,43:39,44:g,45:40,47:41,60:y,84:v,85:x,86:b,87:T,88:E,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_,121:D,122:M,123:R,124:P,125:B},t(ke,[2,53]),{43:268,44:g,45:40,47:41,60:y,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_},t(wt,[2,121],{106:tn}),t(cn,[2,130],{108:270,10:tr,60:hr,84:_n,105:mt,109:Le,110:ct,111:St,112:Mr}),t(Cr,[2,132]),t(Cr,[2,134]),t(Cr,[2,135]),t(Cr,[2,136]),t(Cr,[2,137]),t(Cr,[2,138]),t(Cr,[2,139]),t(Cr,[2,140]),t(Cr,[2,141]),t(wt,[2,122],{106:tn}),{10:[1,271]},t(wt,[2,123],{106:tn}),{10:[1,272]},t(kr,[2,129]),t(wt,[2,105],{106:tn}),t(wt,[2,106],{113:113,44:g,60:y,89:w,102:k,105:S,106:A,109:L,111:I,114:N,115:C,116:_}),t(wt,[2,110]),t(wt,[2,112],{10:[1,273]}),t(wt,[2,113]),{98:[1,274]},{51:[1,275]},{62:[1,276]},{66:[1,277]},{8:$,9:V,11:X,21:278},t(G,[2,34]),t(ke,[2,52]),{10:tr,60:hr,84:_n,105:mt,107:279,108:243,109:Le,110:ct,111:St,112:Mr},t(Cr,[2,133]),{14:ie,44:Y,60:le,89:ee,101:280,105:J,106:te,109:Z,111:xe,114:de,115:Se,116:Me,120:88},{14:ie,44:Y,60:le,89:ee,101:281,105:J,106:te,109:Z,111:xe,114:de,115:Se,116:Me,120:88},{98:[1,282]},t(wt,[2,120]),t(we,[2,58]),{30:283,67:it,80:at,81:Ct,82:172,116:yt,117:dt,118:Ht},t(we,[2,66]),t(ot,a,{5:284}),t(cn,[2,131],{108:270,10:tr,60:hr,84:_n,105:mt,109:Le,110:ct,111:St,112:Mr}),t(wt,[2,126],{120:168,10:[1,285],14:ie,44:Y,60:le,89:ee,105:J,106:te,109:Z,111:xe,114:de,115:Se,116:Me}),t(wt,[2,127],{120:168,10:[1,286],14:ie,44:Y,60:le,89:ee,105:J,106:te,109:Z,111:xe,114:de,115:Se,116:Me}),t(wt,[2,114]),{31:[1,287],67:it,82:219,116:yt,117:dt,118:Ht},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,288],33:24,34:d,36:p,38:m,42:28,43:39,44:g,45:40,47:41,60:y,84:v,85:x,86:b,87:T,88:E,89:w,102:k,105:S,106:A,109:L,111:I,113:42,114:N,115:C,116:_,121:D,122:M,123:R,124:P,125:B},{10:tr,60:hr,84:_n,92:289,105:mt,107:242,108:243,109:Le,110:ct,111:St,112:Mr},{10:tr,60:hr,84:_n,92:290,105:mt,107:242,108:243,109:Le,110:ct,111:St,112:Mr},t(we,[2,62]),t(G,[2,33]),t(wt,[2,124],{106:tn}),t(wt,[2,125],{106:tn})],defaultActions:{},parseError:o(function(Tt,Vt){if(Vt.recoverable)this.trace(Tt);else{var Qt=new Error(Tt);throw Qt.hash=Vt,Qt}},"parseError"),parse:o(function(Tt){var Vt=this,Qt=[0],gt=[],xn=[null],ye=[],Mo=this.table,Ee="",_i=0,$_=0,B3=0,MAe=2,lH=1,IAe=ye.slice.call(arguments,1),fa=Object.create(this.lexer),Sp={yy:{}};for(var z_ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,z_)&&(Sp.yy[z_]=this.yy[z_]);fa.setInput(Tt,Sp.yy),Sp.yy.lexer=fa,Sp.yy.parser=this,typeof fa.yylloc>"u"&&(fa.yylloc={});var G_=fa.yylloc;ye.push(G_);var OAe=fa.options&&fa.options.ranges;typeof Sp.yy.parseError=="function"?this.parseError=Sp.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Amt(Io){Qt.length=Qt.length-2*Io,xn.length=xn.length-Io,ye.length=ye.length-Io}o(Amt,"popStack");function PAe(){var Io;return Io=gt.pop()||fa.lex()||lH,typeof Io!="number"&&(Io instanceof Array&&(gt=Io,Io=gt.pop()),Io=Vt.symbols_[Io]||Io),Io}o(PAe,"lex");for(var xs,V_,Cp,ll,_mt,q_,ig={},F3,Ju,cH,$3;;){if(Cp=Qt[Qt.length-1],this.defaultActions[Cp]?ll=this.defaultActions[Cp]:((xs===null||typeof xs>"u")&&(xs=PAe()),ll=Mo[Cp]&&Mo[Cp][xs]),typeof ll>"u"||!ll.length||!ll[0]){var U_="";$3=[];for(F3 in Mo[Cp])this.terminals_[F3]&&F3>MAe&&$3.push("'"+this.terminals_[F3]+"'");fa.showPosition?U_="Parse error on line "+(_i+1)+`: -`+fa.showPosition()+` -Expecting `+$3.join(", ")+", got '"+(this.terminals_[xs]||xs)+"'":U_="Parse error on line "+(_i+1)+": Unexpected "+(xs==lH?"end of input":"'"+(this.terminals_[xs]||xs)+"'"),this.parseError(U_,{text:fa.match,token:this.terminals_[xs]||xs,line:fa.yylineno,loc:G_,expected:$3})}if(ll[0]instanceof Array&&ll.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Cp+", token: "+xs);switch(ll[0]){case 1:Qt.push(xs),xn.push(fa.yytext),ye.push(fa.yylloc),Qt.push(ll[1]),xs=null,V_?(xs=V_,V_=null):($_=fa.yyleng,Ee=fa.yytext,_i=fa.yylineno,G_=fa.yylloc,B3>0&&B3--);break;case 2:if(Ju=this.productions_[ll[1]][1],ig.$=xn[xn.length-Ju],ig._$={first_line:ye[ye.length-(Ju||1)].first_line,last_line:ye[ye.length-1].last_line,first_column:ye[ye.length-(Ju||1)].first_column,last_column:ye[ye.length-1].last_column},OAe&&(ig._$.range=[ye[ye.length-(Ju||1)].range[0],ye[ye.length-1].range[1]]),q_=this.performAction.apply(ig,[Ee,$_,_i,Sp.yy,ll[1],xn,ye].concat(IAe)),typeof q_<"u")return q_;Ju&&(Qt=Qt.slice(0,-1*Ju*2),xn=xn.slice(0,-1*Ju),ye=ye.slice(0,-1*Ju)),Qt.push(this.productions_[ll[1]][0]),xn.push(ig.$),ye.push(ig._$),cH=Mo[Qt[Qt.length-2]][Qt[Qt.length-1]],Qt.push(cH);break;case 3:return!0}}return!0},"parse")},Da=(function(){var Pt={EOF:1,parseError:o(function(Vt,Qt){if(this.yy.parser)this.yy.parser.parseError(Vt,Qt);else throw new Error(Vt)},"parseError"),setInput:o(function(Tt,Vt){return this.yy=Vt||this.yy||{},this._input=Tt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Tt=this._input[0];this.yytext+=Tt,this.yyleng++,this.offset++,this.match+=Tt,this.matched+=Tt;var Vt=Tt.match(/(?:\r\n?|\n).*/g);return Vt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Tt},"input"),unput:o(function(Tt){var Vt=Tt.length,Qt=Tt.split(/(?:\r\n?|\n)/g);this._input=Tt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Vt),this.offset-=Vt;var gt=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Qt.length-1&&(this.yylineno-=Qt.length-1);var xn=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Qt?(Qt.length===gt.length?this.yylloc.first_column:0)+gt[gt.length-Qt.length].length-Qt[0].length:this.yylloc.first_column-Vt},this.options.ranges&&(this.yylloc.range=[xn[0],xn[0]+this.yyleng-Vt]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Tt){this.unput(this.match.slice(Tt))},"less"),pastInput:o(function(){var Tt=this.matched.substr(0,this.matched.length-this.match.length);return(Tt.length>20?"...":"")+Tt.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Tt=this.match;return Tt.length<20&&(Tt+=this._input.substr(0,20-Tt.length)),(Tt.substr(0,20)+(Tt.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Tt=this.pastInput(),Vt=new Array(Tt.length+1).join("-");return Tt+this.upcomingInput()+` -`+Vt+"^"},"showPosition"),test_match:o(function(Tt,Vt){var Qt,gt,xn;if(this.options.backtrack_lexer&&(xn={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(xn.yylloc.range=this.yylloc.range.slice(0))),gt=Tt[0].match(/(?:\r\n?|\n).*/g),gt&&(this.yylineno+=gt.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:gt?gt[gt.length-1].length-gt[gt.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Tt[0].length},this.yytext+=Tt[0],this.match+=Tt[0],this.matches=Tt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Tt[0].length),this.matched+=Tt[0],Qt=this.performAction.call(this,this.yy,this,Vt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Qt)return Qt;if(this._backtrack){for(var ye in xn)this[ye]=xn[ye];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Tt,Vt,Qt,gt;this._more||(this.yytext="",this.match="");for(var xn=this._currentRules(),ye=0;yeVt[0].length)){if(Vt=Qt,gt=ye,this.options.backtrack_lexer){if(Tt=this.test_match(Qt,xn[ye]),Tt!==!1)return Tt;if(this._backtrack){Vt=!1;continue}else return!1}else if(!this.options.flex)break}return Vt?(Tt=this.test_match(Vt,xn[gt]),Tt!==!1?Tt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Vt=this.next();return Vt||this.lex()},"lex"),begin:o(function(Vt){this.conditionStack.push(Vt)},"begin"),popState:o(function(){var Vt=this.conditionStack.length-1;return Vt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Vt){return Vt=this.conditionStack.length-1-Math.abs(Vt||0),Vt>=0?this.conditionStack[Vt]:"INITIAL"},"topState"),pushState:o(function(Vt){this.begin(Vt)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Vt,Qt,gt,xn){var ye=xn;switch(gt){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),Qt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Mo=/\n\s*/g;return Qt.yytext=Qt.yytext.replace(Mo,"
    "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return Vt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return Vt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return Vt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 125;case 60:return 78;case 61:return 105;case 62:return 111;case 63:return 46;case 64:return 60;case 65:return 44;case 66:return 8;case 67:return 106;case 68:return 115;case 69:return this.popState(),77;break;case 70:return this.pushState("edgeText"),75;break;case 71:return 119;case 72:return this.popState(),77;break;case 73:return this.pushState("thickEdgeText"),75;break;case 74:return 119;case 75:return this.popState(),77;break;case 76:return this.pushState("dottedEdgeText"),75;break;case 77:return 119;case 78:return 77;case 79:return this.popState(),53;break;case 80:return"TEXT";case 81:return this.pushState("ellipseText"),52;break;case 82:return this.popState(),55;break;case 83:return this.pushState("text"),54;break;case 84:return this.popState(),57;break;case 85:return this.pushState("text"),56;break;case 86:return 58;case 87:return this.pushState("text"),67;break;case 88:return this.popState(),64;break;case 89:return this.pushState("text"),63;break;case 90:return this.popState(),49;break;case 91:return this.pushState("text"),48;break;case 92:return this.popState(),69;break;case 93:return this.popState(),71;break;case 94:return 117;case 95:return this.pushState("trapText"),68;break;case 96:return this.pushState("trapText"),70;break;case 97:return 118;case 98:return 67;case 99:return 90;case 100:return"SEP";case 101:return 89;case 102:return 115;case 103:return 111;case 104:return 44;case 105:return 109;case 106:return 114;case 107:return 116;case 108:return this.popState(),62;break;case 109:return this.pushState("text"),62;break;case 110:return this.popState(),51;break;case 111:return this.pushState("text"),50;break;case 112:return this.popState(),31;break;case 113:return this.pushState("text"),29;break;case 114:return this.popState(),66;break;case 115:return this.pushState("text"),65;break;case 116:return"TEXT";case 117:return"QUOTE";case 118:return 9;case 119:return 10;case 120:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:.*direction\s+TD[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},shapeData:{rules:[8,11,12,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},callbackargs:{rules:[17,18,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},callbackname:{rules:[14,15,16,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},href:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},click:{rules:[21,24,33,34,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},dottedEdgeText:{rules:[21,24,75,77,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},thickEdgeText:{rules:[21,24,72,74,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},edgeText:{rules:[21,24,69,71,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},trapText:{rules:[21,24,78,81,83,85,89,91,92,93,94,95,96,109,111,113,115],inclusive:!1},ellipseText:{rules:[21,24,78,79,80,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},text:{rules:[21,24,78,81,82,83,84,85,88,89,90,91,95,96,108,109,110,111,112,113,114,115,116],inclusive:!1},vertex:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_descr:{rules:[3,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_title:{rules:[1,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},md_string:{rules:[19,20,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},string:{rules:[21,22,23,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,73,75,76,78,81,83,85,86,87,89,91,95,96,97,98,99,100,101,102,103,104,105,106,107,109,111,113,115,117,118,119,120],inclusive:!0}}};return Pt})();Ki.lexer=Da;function Dn(){this.yy={}}return o(Dn,"Parser"),Dn.prototype=Ki,Ki.Parser=Dn,new Dn})();NB.parser=NB;MB=NB});var Bge,Fge,$ge=O(()=>{"use strict";Pge();Bge=Object.assign({},MB);Bge.parse=t=>{let e=t.replace(/}\s*\n/g,`} -`);return MB.parse(e)};Fge=Bge});var Lu,ly=O(()=>{"use strict";Lu=o(()=>` - /* Font Awesome icon styling - consolidated */ - .label-icon { - display: inline-block; - height: 1em; - overflow: visible; - vertical-align: -0.125em; - } - - .node .label-icon path { - fill: currentColor; - stroke: revert; - stroke-width: revert; - } -`,"getIconStyles")});var Xet,Ket,zge,Gge=O(()=>{"use strict";Ys();ly();Xet=o((t,e)=>{let r=_p,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return bs(n,i,a,e)},"fade"),Ket=o(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - .cluster-label text { - fill: ${t.titleColor}; - } - .cluster-label span { - color: ${t.titleColor}; - } - .cluster-label span p { - background-color: transparent; - } - - .label text,span { - fill: ${t.nodeTextColor||t.textColor}; - color: ${t.nodeTextColor||t.textColor}; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { - text-anchor: middle; - } - // .flowchart-label .text-outer-tspan { - // text-anchor: middle; - // } - // .flowchart-label .text-inner-tspan { - // text-anchor: start; - // } - - .node .katex path { - fill: #000; - stroke: #000; - stroke-width: 1px; - } - - .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - - .root .anchor path { - fill: ${t.lineColor} !important; - stroke-width: 0; - stroke: ${t.lineColor}; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 2.0px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; - } - - /* For html labels only */ - .labelBkg { - background-color: ${Xet(t.edgeLabelBackground,.5)}; - // background-color: - } - - .cluster rect { - fill: ${t.clusterBkg}; - stroke: ${t.clusterBorder}; - stroke-width: 1px; - } - - .cluster text { - fill: ${t.titleColor}; - } - - .cluster span { - color: ${t.titleColor}; - } - /* .cluster div { - color: ${t.titleColor}; - } */ - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .flowchartTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; - } - - rect.text { - fill: none; - stroke-width: 0; - } - - .icon-shape, .image-shape { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - padding: 2px; - } - .label rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; - } - ${Lu()} -`,"getStyles"),zge=Ket});var kC={};vr(kC,{diagram:()=>Qet});var Qet,EC=O(()=>{"use strict";jt();loe();Oge();$ge();Gge();Qet={parser:Fge,get db(){return new sE},renderer:Ige,styles:zge,init:o(t=>{t.flowchart||(t.flowchart={}),t.layout&&z2({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,z2({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})},"init")}});var IB,Hge,Yge=O(()=>{"use strict";IB=(function(){var t=o(function(Se,Me,ke,we){for(ke=ke||{},we=Se.length;we--;ke[Se[we]]=Me);return ke},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,23],l=[1,24],u=[1,25],h=[1,26],f=[1,27],d=[1,19],p=[1,28],m=[1,29],g=[1,20],y=[1,18],v=[1,21],x=[1,22],b=[1,36],T=[1,37],E=[1,38],w=[1,39],k=[1,40],S=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52,65,66,67,68,69],A=[1,45],L=[1,46],I=[1,55],N=[40,48,50,51,52,70,71],C=[1,66],_=[1,64],D=[1,61],M=[1,65],R=[1,67],P=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,51,52,65,66,67,68,69],B=[65,66,67,68,69],F=[1,84],G=[1,83],$=[1,81],V=[1,82],X=[6,10,42,47],Q=[6,10,13,41,42,47,48,49],H=[1,92],ie=[1,91],Y=[1,90],le=[19,58],ee=[1,101],J=[1,100],te=[19,58,60,62],Z={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,DECIMAL_NUM:51,ENTITY_ONE:52,attribute:53,attributeType:54,attributeName:55,attributeKeyTypeList:56,attributeComment:57,ATTRIBUTE_WORD:58,attributeKeyType:59,",":60,ATTRIBUTE_KEY:61,COMMENT:62,cardinality:63,relType:64,ZERO_OR_ONE:65,ZERO_OR_MORE:66,ONE_OR_MORE:67,ONLY_ONE:68,MD_PARENT:69,NON_IDENTIFYING:70,IDENTIFYING:71,WORD:72,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",51:"DECIMAL_NUM",52:"ENTITY_ONE",58:"ATTRIBUTE_WORD",60:",",61:"ATTRIBUTE_KEY",62:"COMMENT",65:"ZERO_OR_ONE",66:"ZERO_OR_MORE",67:"ONE_OR_MORE",68:"ONLY_ONE",69:"MD_PARENT",70:"NON_IDENTIFYING",71:"IDENTIFYING",72:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[11,1],[11,1],[11,1],[18,1],[18,2],[53,2],[53,3],[53,3],[53,4],[54,1],[55,1],[56,1],[56,3],[59,1],[57,1],[12,3],[63,1],[63,1],[63,1],[63,1],[63,1],[64,1],[64,1],[14,1],[14,1],[14,1]],performAction:o(function(Me,ke,we,_e,$e,fe,Ke){var Te=fe.length-1;switch($e){case 1:break;case 2:this.$=[];break;case 3:fe[Te-1].push(fe[Te]),this.$=fe[Te-1];break;case 4:case 5:this.$=fe[Te];break;case 6:case 7:this.$=[];break;case 8:_e.addEntity(fe[Te-4]),_e.addEntity(fe[Te-2]),_e.addRelationship(fe[Te-4],fe[Te],fe[Te-2],fe[Te-3]);break;case 9:_e.addEntity(fe[Te-8]),_e.addEntity(fe[Te-4]),_e.addRelationship(fe[Te-8],fe[Te],fe[Te-4],fe[Te-5]),_e.setClass([fe[Te-8]],fe[Te-6]),_e.setClass([fe[Te-4]],fe[Te-2]);break;case 10:_e.addEntity(fe[Te-6]),_e.addEntity(fe[Te-2]),_e.addRelationship(fe[Te-6],fe[Te],fe[Te-2],fe[Te-3]),_e.setClass([fe[Te-6]],fe[Te-4]);break;case 11:_e.addEntity(fe[Te-6]),_e.addEntity(fe[Te-4]),_e.addRelationship(fe[Te-6],fe[Te],fe[Te-4],fe[Te-5]),_e.setClass([fe[Te-4]],fe[Te-2]);break;case 12:_e.addEntity(fe[Te-3]),_e.addAttributes(fe[Te-3],fe[Te-1]);break;case 13:_e.addEntity(fe[Te-5]),_e.addAttributes(fe[Te-5],fe[Te-1]),_e.setClass([fe[Te-5]],fe[Te-3]);break;case 14:_e.addEntity(fe[Te-2]);break;case 15:_e.addEntity(fe[Te-4]),_e.setClass([fe[Te-4]],fe[Te-2]);break;case 16:_e.addEntity(fe[Te]);break;case 17:_e.addEntity(fe[Te-2]),_e.setClass([fe[Te-2]],fe[Te]);break;case 18:_e.addEntity(fe[Te-6],fe[Te-4]),_e.addAttributes(fe[Te-6],fe[Te-1]);break;case 19:_e.addEntity(fe[Te-8],fe[Te-6]),_e.addAttributes(fe[Te-8],fe[Te-1]),_e.setClass([fe[Te-8]],fe[Te-3]);break;case 20:_e.addEntity(fe[Te-5],fe[Te-3]);break;case 21:_e.addEntity(fe[Te-7],fe[Te-5]),_e.setClass([fe[Te-7]],fe[Te-2]);break;case 22:_e.addEntity(fe[Te-3],fe[Te-1]);break;case 23:_e.addEntity(fe[Te-5],fe[Te-3]),_e.setClass([fe[Te-5]],fe[Te]);break;case 24:case 25:this.$=fe[Te].trim(),_e.setAccTitle(this.$);break;case 26:case 27:this.$=fe[Te].trim(),_e.setAccDescription(this.$);break;case 32:_e.setDirection("TB");break;case 33:_e.setDirection("BT");break;case 34:_e.setDirection("RL");break;case 35:_e.setDirection("LR");break;case 36:this.$=fe[Te-3],_e.addClass(fe[Te-2],fe[Te-1]);break;case 37:case 38:case 59:case 67:this.$=[fe[Te]];break;case 39:case 40:this.$=fe[Te-2].concat([fe[Te]]);break;case 41:this.$=fe[Te-2],_e.setClass(fe[Te-1],fe[Te]);break;case 42:this.$=fe[Te-3],_e.addCssStyles(fe[Te-2],fe[Te-1]);break;case 43:this.$=[fe[Te]];break;case 44:fe[Te-2].push(fe[Te]),this.$=fe[Te-2];break;case 46:this.$=fe[Te-1]+fe[Te];break;case 54:case 79:case 80:this.$=fe[Te].replace(/"/g,"");break;case 55:case 56:case 57:case 58:case 81:this.$=fe[Te];break;case 60:fe[Te].push(fe[Te-1]),this.$=fe[Te];break;case 61:this.$={type:fe[Te-1],name:fe[Te]};break;case 62:this.$={type:fe[Te-2],name:fe[Te-1],keys:fe[Te]};break;case 63:this.$={type:fe[Te-2],name:fe[Te-1],comment:fe[Te]};break;case 64:this.$={type:fe[Te-3],name:fe[Te-2],keys:fe[Te-1],comment:fe[Te]};break;case 65:case 66:case 69:this.$=fe[Te];break;case 68:fe[Te-2].push(fe[Te]),this.$=fe[Te-2];break;case 70:this.$=fe[Te].replace(/"/g,"");break;case 71:this.$={cardA:fe[Te],relType:fe[Te-1],cardB:fe[Te-2]};break;case 72:this.$=_e.Cardinality.ZERO_OR_ONE;break;case 73:this.$=_e.Cardinality.ZERO_OR_MORE;break;case 74:this.$=_e.Cardinality.ONE_OR_MORE;break;case 75:this.$=_e.Cardinality.ONLY_ONE;break;case 76:this.$=_e.Cardinality.MD_PARENT;break;case 77:this.$=_e.Identification.NON_IDENTIFYING;break;case 78:this.$=_e.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,48:g,50:y,51:v,52:x},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:30,11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,48:g,50:y,51:v,52:x},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:31,63:35,15:[1,32],17:[1,33],20:[1,34],65:b,66:T,67:E,68:w,69:k}),{23:[1,41]},{25:[1,42]},{27:[1,43]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(S,[2,54]),t(S,[2,55]),t(S,[2,56]),t(S,[2,57]),t(S,[2,58]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:44,40:A,41:L},{16:47,40:A,41:L},{16:48,40:A,41:L},t(e,[2,4]),{11:49,40:d,48:g,50:y,51:v,52:x},{16:50,40:A,41:L},{18:51,19:[1,52],53:53,54:54,58:I},{11:56,40:d,48:g,50:y,51:v,52:x},{64:57,70:[1,58],71:[1,59]},t(N,[2,72]),t(N,[2,73]),t(N,[2,74]),t(N,[2,75]),t(N,[2,76]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:C,38:60,41:_,42:D,45:62,46:63,48:M,49:R},t(P,[2,37]),t(P,[2,38]),{16:68,40:A,41:L,42:D},{13:C,38:69,41:_,42:D,45:62,46:63,48:M,49:R},{13:[1,70],15:[1,71]},t(e,[2,17],{63:35,12:72,17:[1,73],42:D,65:b,66:T,67:E,68:w,69:k}),{19:[1,74]},t(e,[2,14]),{18:75,19:[2,59],53:53,54:54,58:I},{55:76,58:[1,77]},{58:[2,65]},{21:[1,78]},{63:79,65:b,66:T,67:E,68:w,69:k},t(B,[2,77]),t(B,[2,78]),{6:F,10:G,39:80,42:$,47:V},{40:[1,85],41:[1,86]},t(X,[2,43],{46:87,13:C,41:_,48:M,49:R}),t(Q,[2,45]),t(Q,[2,50]),t(Q,[2,51]),t(Q,[2,52]),t(Q,[2,53]),t(e,[2,41],{42:D}),{6:F,10:G,39:88,42:$,47:V},{14:89,40:H,50:ie,72:Y},{16:93,40:A,41:L},{11:94,40:d,48:g,50:y,51:v,52:x},{18:95,19:[1,96],53:53,54:54,58:I},t(e,[2,12]),{19:[2,60]},t(le,[2,61],{56:97,57:98,59:99,61:ee,62:J}),t([19,58,61,62],[2,66]),t(e,[2,22],{15:[1,103],17:[1,102]}),t([40,48,50,51,52],[2,71]),t(e,[2,36]),{13:C,41:_,45:104,46:63,48:M,49:R},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(P,[2,39]),t(P,[2,40]),t(Q,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,79]),t(e,[2,80]),t(e,[2,81]),{13:[1,105],42:D},{13:[1,107],15:[1,106]},{19:[1,108]},t(e,[2,15]),t(le,[2,62],{57:109,60:[1,110],62:J}),t(le,[2,63]),t(te,[2,67]),t(le,[2,70]),t(te,[2,69]),{18:111,19:[1,112],53:53,54:54,58:I},{16:113,40:A,41:L},t(X,[2,44],{46:87,13:C,41:_,48:M,49:R}),{14:114,40:H,50:ie,72:Y},{16:115,40:A,41:L},{14:116,40:H,50:ie,72:Y},t(e,[2,13]),t(le,[2,64]),{59:117,61:ee},{19:[1,118]},t(e,[2,20]),t(e,[2,23],{17:[1,119],42:D}),t(e,[2,11]),{13:[1,120],42:D},t(e,[2,10]),t(te,[2,68]),t(e,[2,18]),{18:121,19:[1,122],53:53,54:54,58:I},{14:123,40:H,50:ie,72:Y},{19:[1,124]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{55:[2,65],75:[2,60]},parseError:o(function(Me,ke){if(ke.recoverable)this.trace(Me);else{var we=new Error(Me);throw we.hash=ke,we}},"parseError"),parse:o(function(Me){var ke=this,we=[0],_e=[],$e=[null],fe=[],Ke=this.table,Te="",Be=0,Ue=0,Ge=0,Ne=2,We=1,j=fe.slice.call(arguments,1),ae=Object.create(this.lexer),U={yy:{}};for(var ce in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ce)&&(U.yy[ce]=this.yy[ce]);ae.setInput(Me,U.yy),U.yy.lexer=ae,U.yy.parser=this,typeof ae.yylloc>"u"&&(ae.yylloc={});var z=ae.yylloc;fe.push(z);var ne=ae.options&&ae.options.ranges;typeof U.yy.parseError=="function"?this.parseError=U.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function se(Dt){we.length=we.length-2*Dt,$e.length=$e.length-Dt,fe.length=fe.length-Dt}o(se,"popStack");function be(){var Dt;return Dt=_e.pop()||ae.lex()||We,typeof Dt!="number"&&(Dt instanceof Array&&(_e=Dt,Dt=_e.pop()),Dt=ke.symbols_[Dt]||Dt),Dt}o(be,"lex");for(var pe,me,Re,ge,Ie,qe,Pe={},Xe,oe,et,he;;){if(Re=we[we.length-1],this.defaultActions[Re]?ge=this.defaultActions[Re]:((pe===null||typeof pe>"u")&&(pe=be()),ge=Ke[Re]&&Ke[Re][pe]),typeof ge>"u"||!ge.length||!ge[0]){var ot="";he=[];for(Xe in Ke[Re])this.terminals_[Xe]&&Xe>Ne&&he.push("'"+this.terminals_[Xe]+"'");ae.showPosition?ot="Parse error on line "+(Be+1)+`: -`+ae.showPosition()+` -Expecting `+he.join(", ")+", got '"+(this.terminals_[pe]||pe)+"'":ot="Parse error on line "+(Be+1)+": Unexpected "+(pe==We?"end of input":"'"+(this.terminals_[pe]||pe)+"'"),this.parseError(ot,{text:ae.match,token:this.terminals_[pe]||pe,line:ae.yylineno,loc:z,expected:he})}if(ge[0]instanceof Array&&ge.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Re+", token: "+pe);switch(ge[0]){case 1:we.push(pe),$e.push(ae.yytext),fe.push(ae.yylloc),we.push(ge[1]),pe=null,me?(pe=me,me=null):(Ue=ae.yyleng,Te=ae.yytext,Be=ae.yylineno,z=ae.yylloc,Ge>0&&Ge--);break;case 2:if(oe=this.productions_[ge[1]][1],Pe.$=$e[$e.length-oe],Pe._$={first_line:fe[fe.length-(oe||1)].first_line,last_line:fe[fe.length-1].last_line,first_column:fe[fe.length-(oe||1)].first_column,last_column:fe[fe.length-1].last_column},ne&&(Pe._$.range=[fe[fe.length-(oe||1)].range[0],fe[fe.length-1].range[1]]),qe=this.performAction.apply(Pe,[Te,Ue,Be,U.yy,ge[1],$e,fe].concat(j)),typeof qe<"u")return qe;oe&&(we=we.slice(0,-1*oe*2),$e=$e.slice(0,-1*oe),fe=fe.slice(0,-1*oe)),we.push(this.productions_[ge[1]][0]),$e.push(Pe.$),fe.push(Pe._$),et=Ke[we[we.length-2]][we[we.length-1]],we.push(et);break;case 3:return!0}}return!0},"parse")},xe=(function(){var Se={EOF:1,parseError:o(function(ke,we){if(this.yy.parser)this.yy.parser.parseError(ke,we);else throw new Error(ke)},"parseError"),setInput:o(function(Me,ke){return this.yy=ke||this.yy||{},this._input=Me,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Me=this._input[0];this.yytext+=Me,this.yyleng++,this.offset++,this.match+=Me,this.matched+=Me;var ke=Me.match(/(?:\r\n?|\n).*/g);return ke?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Me},"input"),unput:o(function(Me){var ke=Me.length,we=Me.split(/(?:\r\n?|\n)/g);this._input=Me+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ke),this.offset-=ke;var _e=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),we.length-1&&(this.yylineno-=we.length-1);var $e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:we?(we.length===_e.length?this.yylloc.first_column:0)+_e[_e.length-we.length].length-we[0].length:this.yylloc.first_column-ke},this.options.ranges&&(this.yylloc.range=[$e[0],$e[0]+this.yyleng-ke]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Me){this.unput(this.match.slice(Me))},"less"),pastInput:o(function(){var Me=this.matched.substr(0,this.matched.length-this.match.length);return(Me.length>20?"...":"")+Me.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Me=this.match;return Me.length<20&&(Me+=this._input.substr(0,20-Me.length)),(Me.substr(0,20)+(Me.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Me=this.pastInput(),ke=new Array(Me.length+1).join("-");return Me+this.upcomingInput()+` -`+ke+"^"},"showPosition"),test_match:o(function(Me,ke){var we,_e,$e;if(this.options.backtrack_lexer&&($e={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&($e.yylloc.range=this.yylloc.range.slice(0))),_e=Me[0].match(/(?:\r\n?|\n).*/g),_e&&(this.yylineno+=_e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:_e?_e[_e.length-1].length-_e[_e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Me[0].length},this.yytext+=Me[0],this.match+=Me[0],this.matches=Me,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Me[0].length),this.matched+=Me[0],we=this.performAction.call(this,this.yy,this,ke,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),we)return we;if(this._backtrack){for(var fe in $e)this[fe]=$e[fe];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Me,ke,we,_e;this._more||(this.yytext="",this.match="");for(var $e=this._currentRules(),fe=0;fe<$e.length;fe++)if(we=this._input.match(this.rules[$e[fe]]),we&&(!ke||we[0].length>ke[0].length)){if(ke=we,_e=fe,this.options.backtrack_lexer){if(Me=this.test_match(we,$e[fe]),Me!==!1)return Me;if(this._backtrack){ke=!1;continue}else return!1}else if(!this.options.flex)break}return ke?(Me=this.test_match(ke,$e[_e]),Me!==!1?Me:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var ke=this.next();return ke||this.lex()},"lex"),begin:o(function(ke){this.conditionStack.push(ke)},"begin"),popState:o(function(){var ke=this.conditionStack.length-1;return ke>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(ke){return ke=this.conditionStack.length-1-Math.abs(ke||0),ke>=0?this.conditionStack[ke]:"INITIAL"},"topState"),pushState:o(function(ke){this.begin(ke)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(ke,we,_e,$e){var fe=$e;switch(_e){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 72;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 61;case 25:return 58;case 26:return 58;case 27:return 62;case 28:break;case 29:return this.popState(),19;break;case 30:return we.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 65;case 42:return 67;case 43:return 67;case 44:return 67;case 45:return 65;case 46:return 65;case 47:return 66;case 48:return 66;case 49:return 66;case 50:return 66;case 51:return 66;case 52:return 67;case 53:return 66;case 54:return 67;case 55:return 68;case 56:return 68;case 57:return 51;case 58:return 68;case 59:return 68;case 60:return 52;case 61:return 48;case 62:return 68;case 63:return 65;case 64:return 66;case 65:return 67;case 66:return 69;case 67:return 70;case 68:return 71;case 69:return 71;case 70:return 70;case 71:return 70;case 72:return 70;case 73:return 41;case 74:return 47;case 75:return 40;case 76:return we.yytext[0];case 77:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:[0-9]+\.[0-9]+)/i,/^(?:1(?=\s+[A-Za-z_"']))/i,/^(?:1(?=(--|\.\.|\.-|-\.)))/i,/^(?:1\b)/i,/^(?:[0-9]+)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:u(?=[\.\-\|]))/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*|\.)+)/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,73,74],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,75,76,77],inclusive:!0}}};return Se})();Z.lexer=xe;function de(){this.yy={}}return o(de,"Parser"),de.prototype=Z,Z.Parser=de,new de})();IB.parser=IB;Hge=IB});var SC,jge=O(()=>{"use strict";xt();jt();si();ar();SC=class{constructor(){this.entities=new Map;this.relationships=[];this.classes=new Map;this.direction="TB";this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"};this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"};this.setAccTitle=Lr;this.getAccTitle=Or;this.setAccDescription=Pr;this.getAccDescription=Br;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.getConfig=o(()=>ve().er,"getConfig");this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"ErDB")}addEntity(e,r=""){return this.entities.has(e)?!this.entities.get(e)?.alias&&r&&(this.entities.get(e).alias=r,K.info(`Add alias '${r}' to entity '${e}'`)):(this.entities.set(e,{id:`entity-${e}-${this.entities.size}`,label:e,attributes:[],alias:r,shape:"erBox",look:ve().look??"default",cssClasses:"default",cssStyles:[],labelType:"markdown"}),K.info("Added new entity :",e)),this.entities.get(e)}getEntity(e){return this.entities.get(e)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(e,r){let n=this.addEntity(e),i;for(i=r.length-1;i>=0;i--)r[i].keys||(r[i].keys=[]),r[i].comment||(r[i].comment=""),n.attributes.push(r[i]),K.debug("Added attribute ",r[i].name)}addRelationship(e,r,n,i){let a=this.entities.get(e),s=this.entities.get(n);if(!a||!s)return;let l={entityA:a.id,roleA:r,entityB:s.id,relSpec:i};this.relationships.push(l),K.debug("Added new relationship :",l)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(e){this.direction=e}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}addCssStyles(e,r){for(let n of e){let i=this.entities.get(n);if(!r||!i)return;for(let a of r)i.cssStyles.push(a)}}addClass(e,r){e.forEach(n=>{let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)})})}setClass(e,r){for(let n of e){let i=this.entities.get(n);if(i)for(let a of r)i.cssClasses+=" "+a}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],_r()}getData(){let e=[],r=[],n=ve();for(let a of this.entities.keys()){let s=this.entities.get(a);s&&(s.cssCompiledStyles=this.getCompiledStyles(s.cssClasses.split(" ")),e.push(s))}let i=0;for(let a of this.relationships){let s={id:hu(a.entityA,a.entityB,{prefix:"id",counter:i++}),type:"normal",curve:"basis",start:a.entityA,end:a.entityB,label:a.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:a.relSpec.cardB.toLowerCase(),arrowTypeEnd:a.relSpec.cardA.toLowerCase(),pattern:a.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:n.look,labelType:"markdown"};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:"TB"}}}});var OB={};vr(OB,{draw:()=>itt});var itt,Xge=O(()=>{"use strict";jt();xt();b0();Rd();Ld();ar();Ar();itt=o(async function(t,e,r,n){K.info("REF0:"),K.info("Drawing er diagram (unified)",e);let{securityLevel:i,er:a,layout:s}=ve(),l=n.db.getData(),u=Sl(e,i);l.type=n.type,l.layoutAlgorithm=Ru(s),l.config.flowchart.nodeSpacing=a?.nodeSpacing||140,l.config.flowchart.rankSpacing=a?.rankSpacing||80,l.direction=n.db.getDirection(),l.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],l.diagramId=e,await Ol(l,u),l.layoutAlgorithm==="elk"&&u.select(".edges").lower();let h=u.selectAll('[id*="-background"]');Array.from(h).length>0&&h.each(function(){let d=je(this),m=d.attr("id").replace("-background",""),g=u.select(`#${CSS.escape(m)}`);if(!g.empty()){let y=g.attr("transform");d.attr("transform",y)}});let f=8;Xt.insertTitle(u,"erDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),bo(u,f,"erDiagram",a?.useMaxWidth??!0)},"draw")});var att,stt,Kge,Qge=O(()=>{"use strict";Ys();att=o((t,e)=>{let r=_p,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return bs(n,i,a,e)},"fade"),stt=o(t=>` - .entityBox { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - } - - .relationshipLabelBox { - fill: ${t.tertiaryColor}; - opacity: 0.7; - background-color: ${t.tertiaryColor}; - rect { - opacity: 0.5; - } - } - - .labelBkg { - background-color: ${att(t.tertiaryColor,.5)}; - } - - .edgeLabel .label { - fill: ${t.nodeBorder}; - font-size: 14px; - } - - .label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - - .edge-pattern-dashed { - stroke-dasharray: 8,8; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon - { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - .relationshipLine { - stroke: ${t.lineColor}; - stroke-width: 1; - fill: none; - } - - .marker { - fill: none !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - } - .edgeLabel .label rect { - fill: ${t.edgeLabelBackground}; - } - .edgeLabel .label text { - fill: ${t.textColor}; - } -`,"getStyles"),Kge=stt});var Zge={};vr(Zge,{diagram:()=>ott});var ott,Jge=O(()=>{"use strict";Yge();jge();Xge();Qge();ott={parser:Hge,get db(){return new SC},renderer:OB,styles:Kge}});function Si(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function oa(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"&&"ref"in t}function Xo(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"&&"items"in t}function PB(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function j0(t){return typeof t=="object"&&t!==null&&typeof t.info=="object"&&typeof t.message=="string"}function wc(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function Nd(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function fT(t){return wc(t)&&typeof t.fullText=="string"}var Y0,kc=O(()=>{"use strict";o(Si,"isAstNode");o(oa,"isReference");o(Xo,"isMultiReference");o(PB,"isAstNodeDescription");o(j0,"isLinkingError");Y0=class{static{o(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}getAllTypes(){return Object.keys(this.types)}getReferenceType(e){let r=this.types[e.container.$type];if(!r)throw new Error(`Type ${e.container.$type||"undefined"} not found.`);let n=r.properties[e.property]?.referenceType;if(!n)throw new Error(`Property ${e.property||"undefined"} of type ${e.container.$type} is not a reference.`);return n}getTypeMetaData(e){let r=this.types[e];return r||{name:e,properties:{},superTypes:[]}}isInstance(e,r){return Si(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.types[e],s=a?a.superTypes.some(l=>this.isSubtype(l,r)):!1;return n[r]=s,s}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}};o(wc,"isCompositeCstNode");o(Nd,"isLeafCstNode");o(fT,"isRootCstNode")});function ftt(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function CC(t){return!!t&&typeof t[Symbol.iterator]=="function"}function Hr(...t){if(t.length===1){let e=t[0];if(e instanceof Ko)return e;if(CC(e))return new Ko(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new Ko(()=>({index:0}),r=>r.index1?new Ko(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{"use strict";Ko=class t{static{o(this,"StreamImpl")}constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return ls})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=ftt(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?ls:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return ls})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(CC(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return ls})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(CC(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return ls})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?ls:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return ls})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};o(ftt,"toString");o(CC,"isIterable");Md=new Ko(()=>{},()=>ls),ls=Object.freeze({done:!0,value:void 0});o(Hr,"stream");Nu=class extends Ko{static{o(this,"TreeStreamImpl")}constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return ls})}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),prune:o(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,l)=>s+l,0)}o(e,"sum"),t.sum=e;function r(a){return a.reduce((s,l)=>s*l,0)}o(r,"product"),t.product=r;function n(a){return a.reduce((s,l)=>Math.min(s,l))}o(n,"min"),t.min=n;function i(a){return a.reduce((s,l)=>Math.max(s,l))}o(i,"max"),t.max=i})(cy||(cy={}))});var _C={};vr(_C,{assignMandatoryProperties:()=>$B,copyAstNode:()=>FB,findRootNode:()=>hy,getContainerOfType:()=>zh,getDocument:()=>cs,getReferenceNodes:()=>AC,hasContainerOfType:()=>dtt,linkContentToContainer:()=>uy,streamAllContents:()=>Ec,streamAst:()=>Ps,streamContents:()=>dT,streamReferences:()=>Id});function uy(t,e={}){for(let[r,n]of Object.entries(t))r.startsWith("$")||(Array.isArray(n)?n.forEach((i,a)=>{Si(i)&&(i.$container=t,i.$containerProperty=r,i.$containerIndex=a,e.deep&&uy(i,e))}):Si(n)&&(n.$container=t,n.$containerProperty=r,e.deep&&uy(n,e)))}function zh(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function dtt(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function cs(t){let r=hy(t).$document;if(!r)throw new Error("AST node has no document.");return r}function hy(t){for(;t.$container;)t=t.$container;return t}function AC(t){return oa(t)?t.ref?[t.ref]:[]:Xo(t)?t.items.map(e=>e.ref):[]}function dT(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new Ko(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexdT(r,e))}function Ps(t,e){if(t){if(e?.range&&!BB(t,e.range))return new Nu(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new Nu(t,r=>dT(r,e),{includeRoot:!0})}function BB(t,e){if(!e)return!0;let r=t.$cstNode?.range;return r?zB(r,e):!1}function Id(t){return new Ko(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{"use strict";kc();Os();Sc();o(uy,"linkContentToContainer");o(zh,"getContainerOfType");o(dtt,"hasContainerOfType");o(cs,"getDocument");o(hy,"findRootNode");o(AC,"getReferenceNodes");o(dT,"streamContents");o(Ec,"streamAllContents");o(Ps,"streamAst");o(BB,"isAstNodeInRange");o(Id,"streamReferences");o($B,"assignMandatoryProperties");o(t1e,"copyDefaultValue");o(FB,"copyAstNode")});var ET={};vr(ET,{AbstractElement:()=>To,AbstractParserRule:()=>pT,AbstractRule:()=>fy,AbstractType:()=>Qo,Action:()=>Od,Alternatives:()=>mT,ArrayLiteral:()=>DC,ArrayType:()=>RC,Assignment:()=>Pd,BooleanLiteral:()=>LC,CharacterRange:()=>Bd,Condition:()=>Fd,Conjunction:()=>gT,CrossReference:()=>$d,Disjunction:()=>yT,EndOfFile:()=>NC,Grammar:()=>Gh,GrammarImport:()=>MC,Group:()=>X0,InferredType:()=>IC,InfixRule:()=>Mu,InfixRuleOperatorList:()=>vT,InfixRuleOperators:()=>OC,Interface:()=>dy,Keyword:()=>py,LangiumGrammarAstReflection:()=>xy,LangiumGrammarTerminals:()=>ptt,NamedArgument:()=>my,NegatedToken:()=>K0,Negation:()=>PC,NumberLiteral:()=>BC,Parameter:()=>gy,ParameterReference:()=>FC,ParserRule:()=>Cc,ReferenceType:()=>xT,RegexToken:()=>Q0,ReturnType:()=>$C,RuleCall:()=>Z0,SimpleType:()=>yy,StringLiteral:()=>zC,TerminalAlternatives:()=>J0,TerminalElement:()=>wo,TerminalGroup:()=>em,TerminalRule:()=>Vh,TerminalRuleCall:()=>tm,Type:()=>bT,TypeAttribute:()=>rm,TypeDefinition:()=>nm,UnionType:()=>GC,UnorderedGroup:()=>TT,UntilToken:()=>im,ValueLiteral:()=>am,Wildcard:()=>vy,isAbstractElement:()=>wT,isAbstractParserRule:()=>qh,isAbstractRule:()=>mtt,isAbstractType:()=>gtt,isAction:()=>Uh,isAlternatives:()=>VC,isArrayLiteral:()=>ytt,isArrayType:()=>GB,isAssignment:()=>Ac,isBooleanLiteral:()=>VB,isCharacterRange:()=>qB,isCondition:()=>vtt,isConjunction:()=>UB,isCrossReference:()=>_c,isDisjunction:()=>WB,isEndOfFile:()=>HB,isGrammar:()=>xtt,isGrammarImport:()=>btt,isGroup:()=>zd,isInferredType:()=>kT,isInfixRule:()=>Gd,isInfixRuleOperatorList:()=>Ttt,isInfixRuleOperators:()=>wtt,isInterface:()=>YB,isKeyword:()=>Pl,isNamedArgument:()=>ktt,isNegatedToken:()=>jB,isNegation:()=>XB,isNumberLiteral:()=>Ett,isParameter:()=>Stt,isParameterReference:()=>KB,isParserRule:()=>Sa,isReferenceType:()=>QB,isRegexToken:()=>ZB,isReturnType:()=>JB,isRuleCall:()=>Dc,isSimpleType:()=>qC,isStringLiteral:()=>Ctt,isTerminalAlternatives:()=>eF,isTerminalElement:()=>Att,isTerminalGroup:()=>tF,isTerminalRule:()=>Bs,isTerminalRuleCall:()=>UC,isType:()=>WC,isTypeAttribute:()=>_tt,isTypeDefinition:()=>Dtt,isUnionType:()=>rF,isUnorderedGroup:()=>HC,isUntilToken:()=>nF,isValueLiteral:()=>Rtt,isWildcard:()=>iF,reflection:()=>mr});function wT(t){return mr.isInstance(t,To.$type)}function qh(t){return mr.isInstance(t,pT.$type)}function mtt(t){return mr.isInstance(t,fy.$type)}function gtt(t){return mr.isInstance(t,Qo.$type)}function Uh(t){return mr.isInstance(t,Od.$type)}function VC(t){return mr.isInstance(t,mT.$type)}function ytt(t){return mr.isInstance(t,DC.$type)}function GB(t){return mr.isInstance(t,RC.$type)}function Ac(t){return mr.isInstance(t,Pd.$type)}function VB(t){return mr.isInstance(t,LC.$type)}function qB(t){return mr.isInstance(t,Bd.$type)}function vtt(t){return mr.isInstance(t,Fd.$type)}function UB(t){return mr.isInstance(t,gT.$type)}function _c(t){return mr.isInstance(t,$d.$type)}function WB(t){return mr.isInstance(t,yT.$type)}function HB(t){return mr.isInstance(t,NC.$type)}function xtt(t){return mr.isInstance(t,Gh.$type)}function btt(t){return mr.isInstance(t,MC.$type)}function zd(t){return mr.isInstance(t,X0.$type)}function kT(t){return mr.isInstance(t,IC.$type)}function Gd(t){return mr.isInstance(t,Mu.$type)}function Ttt(t){return mr.isInstance(t,vT.$type)}function wtt(t){return mr.isInstance(t,OC.$type)}function YB(t){return mr.isInstance(t,dy.$type)}function Pl(t){return mr.isInstance(t,py.$type)}function ktt(t){return mr.isInstance(t,my.$type)}function jB(t){return mr.isInstance(t,K0.$type)}function XB(t){return mr.isInstance(t,PC.$type)}function Ett(t){return mr.isInstance(t,BC.$type)}function Stt(t){return mr.isInstance(t,gy.$type)}function KB(t){return mr.isInstance(t,FC.$type)}function Sa(t){return mr.isInstance(t,Cc.$type)}function QB(t){return mr.isInstance(t,xT.$type)}function ZB(t){return mr.isInstance(t,Q0.$type)}function JB(t){return mr.isInstance(t,$C.$type)}function Dc(t){return mr.isInstance(t,Z0.$type)}function qC(t){return mr.isInstance(t,yy.$type)}function Ctt(t){return mr.isInstance(t,zC.$type)}function eF(t){return mr.isInstance(t,J0.$type)}function Att(t){return mr.isInstance(t,wo.$type)}function tF(t){return mr.isInstance(t,em.$type)}function Bs(t){return mr.isInstance(t,Vh.$type)}function UC(t){return mr.isInstance(t,tm.$type)}function WC(t){return mr.isInstance(t,bT.$type)}function _tt(t){return mr.isInstance(t,rm.$type)}function Dtt(t){return mr.isInstance(t,nm.$type)}function rF(t){return mr.isInstance(t,GC.$type)}function HC(t){return mr.isInstance(t,TT.$type)}function nF(t){return mr.isInstance(t,im.$type)}function Rtt(t){return mr.isInstance(t,am.$type)}function iF(t){return mr.isInstance(t,vy.$type)}var ptt,To,pT,fy,Qo,Od,mT,DC,RC,Pd,LC,Bd,Fd,gT,$d,yT,NC,Gh,MC,X0,IC,Mu,vT,OC,dy,py,my,K0,PC,BC,gy,FC,Cc,xT,Q0,$C,Z0,yy,zC,J0,wo,em,Vh,tm,bT,rm,nm,GC,TT,im,am,vy,xy,mr,Zo=O(()=>{"use strict";kc();ptt={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},To={$type:"AbstractElement",cardinality:"cardinality"};o(wT,"isAbstractElement");pT={$type:"AbstractParserRule"};o(qh,"isAbstractParserRule");fy={$type:"AbstractRule"};o(mtt,"isAbstractRule");Qo={$type:"AbstractType"};o(gtt,"isAbstractType");Od={$type:"Action",cardinality:"cardinality",feature:"feature",inferredType:"inferredType",operator:"operator",type:"type"};o(Uh,"isAction");mT={$type:"Alternatives",cardinality:"cardinality",elements:"elements"};o(VC,"isAlternatives");DC={$type:"ArrayLiteral",elements:"elements"};o(ytt,"isArrayLiteral");RC={$type:"ArrayType",elementType:"elementType"};o(GB,"isArrayType");Pd={$type:"Assignment",cardinality:"cardinality",feature:"feature",operator:"operator",predicate:"predicate",terminal:"terminal"};o(Ac,"isAssignment");LC={$type:"BooleanLiteral",true:"true"};o(VB,"isBooleanLiteral");Bd={$type:"CharacterRange",cardinality:"cardinality",left:"left",lookahead:"lookahead",parenthesized:"parenthesized",right:"right"};o(qB,"isCharacterRange");Fd={$type:"Condition"};o(vtt,"isCondition");gT={$type:"Conjunction",left:"left",right:"right"};o(UB,"isConjunction");$d={$type:"CrossReference",cardinality:"cardinality",deprecatedSyntax:"deprecatedSyntax",isMulti:"isMulti",terminal:"terminal",type:"type"};o(_c,"isCrossReference");yT={$type:"Disjunction",left:"left",right:"right"};o(WB,"isDisjunction");NC={$type:"EndOfFile",cardinality:"cardinality"};o(HB,"isEndOfFile");Gh={$type:"Grammar",imports:"imports",interfaces:"interfaces",isDeclared:"isDeclared",name:"name",rules:"rules",types:"types"};o(xtt,"isGrammar");MC={$type:"GrammarImport",path:"path"};o(btt,"isGrammarImport");X0={$type:"Group",cardinality:"cardinality",elements:"elements",guardCondition:"guardCondition",predicate:"predicate"};o(zd,"isGroup");IC={$type:"InferredType",name:"name"};o(kT,"isInferredType");Mu={$type:"InfixRule",call:"call",dataType:"dataType",inferredType:"inferredType",name:"name",operators:"operators",parameters:"parameters",returnType:"returnType"};o(Gd,"isInfixRule");vT={$type:"InfixRuleOperatorList",associativity:"associativity",operators:"operators"};o(Ttt,"isInfixRuleOperatorList");OC={$type:"InfixRuleOperators",precedences:"precedences"};o(wtt,"isInfixRuleOperators");dy={$type:"Interface",attributes:"attributes",name:"name",superTypes:"superTypes"};o(YB,"isInterface");py={$type:"Keyword",cardinality:"cardinality",predicate:"predicate",value:"value"};o(Pl,"isKeyword");my={$type:"NamedArgument",calledByName:"calledByName",parameter:"parameter",value:"value"};o(ktt,"isNamedArgument");K0={$type:"NegatedToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",terminal:"terminal"};o(jB,"isNegatedToken");PC={$type:"Negation",value:"value"};o(XB,"isNegation");BC={$type:"NumberLiteral",value:"value"};o(Ett,"isNumberLiteral");gy={$type:"Parameter",name:"name"};o(Stt,"isParameter");FC={$type:"ParameterReference",parameter:"parameter"};o(KB,"isParameterReference");Cc={$type:"ParserRule",dataType:"dataType",definition:"definition",entry:"entry",fragment:"fragment",inferredType:"inferredType",name:"name",parameters:"parameters",returnType:"returnType"};o(Sa,"isParserRule");xT={$type:"ReferenceType",isMulti:"isMulti",referenceType:"referenceType"};o(QB,"isReferenceType");Q0={$type:"RegexToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",regex:"regex"};o(ZB,"isRegexToken");$C={$type:"ReturnType",name:"name"};o(JB,"isReturnType");Z0={$type:"RuleCall",arguments:"arguments",cardinality:"cardinality",predicate:"predicate",rule:"rule"};o(Dc,"isRuleCall");yy={$type:"SimpleType",primitiveType:"primitiveType",stringType:"stringType",typeRef:"typeRef"};o(qC,"isSimpleType");zC={$type:"StringLiteral",value:"value"};o(Ctt,"isStringLiteral");J0={$type:"TerminalAlternatives",cardinality:"cardinality",elements:"elements",lookahead:"lookahead",parenthesized:"parenthesized"};o(eF,"isTerminalAlternatives");wo={$type:"TerminalElement",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized"};o(Att,"isTerminalElement");em={$type:"TerminalGroup",cardinality:"cardinality",elements:"elements",lookahead:"lookahead",parenthesized:"parenthesized"};o(tF,"isTerminalGroup");Vh={$type:"TerminalRule",definition:"definition",fragment:"fragment",hidden:"hidden",name:"name",type:"type"};o(Bs,"isTerminalRule");tm={$type:"TerminalRuleCall",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",rule:"rule"};o(UC,"isTerminalRuleCall");bT={$type:"Type",name:"name",type:"type"};o(WC,"isType");rm={$type:"TypeAttribute",defaultValue:"defaultValue",isOptional:"isOptional",name:"name",type:"type"};o(_tt,"isTypeAttribute");nm={$type:"TypeDefinition"};o(Dtt,"isTypeDefinition");GC={$type:"UnionType",types:"types"};o(rF,"isUnionType");TT={$type:"UnorderedGroup",cardinality:"cardinality",elements:"elements"};o(HC,"isUnorderedGroup");im={$type:"UntilToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",terminal:"terminal"};o(nF,"isUntilToken");am={$type:"ValueLiteral"};o(Rtt,"isValueLiteral");vy={$type:"Wildcard",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized"};o(iF,"isWildcard");xy=class extends Y0{static{o(this,"LangiumGrammarAstReflection")}constructor(){super(...arguments),this.types={AbstractElement:{name:To.$type,properties:{cardinality:{name:To.cardinality}},superTypes:[]},AbstractParserRule:{name:pT.$type,properties:{},superTypes:[fy.$type,Qo.$type]},AbstractRule:{name:fy.$type,properties:{},superTypes:[]},AbstractType:{name:Qo.$type,properties:{},superTypes:[]},Action:{name:Od.$type,properties:{cardinality:{name:Od.cardinality},feature:{name:Od.feature},inferredType:{name:Od.inferredType},operator:{name:Od.operator},type:{name:Od.type,referenceType:Qo.$type}},superTypes:[To.$type]},Alternatives:{name:mT.$type,properties:{cardinality:{name:mT.cardinality},elements:{name:mT.elements,defaultValue:[]}},superTypes:[To.$type]},ArrayLiteral:{name:DC.$type,properties:{elements:{name:DC.elements,defaultValue:[]}},superTypes:[am.$type]},ArrayType:{name:RC.$type,properties:{elementType:{name:RC.elementType}},superTypes:[nm.$type]},Assignment:{name:Pd.$type,properties:{cardinality:{name:Pd.cardinality},feature:{name:Pd.feature},operator:{name:Pd.operator},predicate:{name:Pd.predicate},terminal:{name:Pd.terminal}},superTypes:[To.$type]},BooleanLiteral:{name:LC.$type,properties:{true:{name:LC.true,defaultValue:!1}},superTypes:[Fd.$type,am.$type]},CharacterRange:{name:Bd.$type,properties:{cardinality:{name:Bd.cardinality},left:{name:Bd.left},lookahead:{name:Bd.lookahead},parenthesized:{name:Bd.parenthesized,defaultValue:!1},right:{name:Bd.right}},superTypes:[wo.$type]},Condition:{name:Fd.$type,properties:{},superTypes:[]},Conjunction:{name:gT.$type,properties:{left:{name:gT.left},right:{name:gT.right}},superTypes:[Fd.$type]},CrossReference:{name:$d.$type,properties:{cardinality:{name:$d.cardinality},deprecatedSyntax:{name:$d.deprecatedSyntax,defaultValue:!1},isMulti:{name:$d.isMulti,defaultValue:!1},terminal:{name:$d.terminal},type:{name:$d.type,referenceType:Qo.$type}},superTypes:[To.$type]},Disjunction:{name:yT.$type,properties:{left:{name:yT.left},right:{name:yT.right}},superTypes:[Fd.$type]},EndOfFile:{name:NC.$type,properties:{cardinality:{name:NC.cardinality}},superTypes:[To.$type]},Grammar:{name:Gh.$type,properties:{imports:{name:Gh.imports,defaultValue:[]},interfaces:{name:Gh.interfaces,defaultValue:[]},isDeclared:{name:Gh.isDeclared,defaultValue:!1},name:{name:Gh.name},rules:{name:Gh.rules,defaultValue:[]},types:{name:Gh.types,defaultValue:[]}},superTypes:[]},GrammarImport:{name:MC.$type,properties:{path:{name:MC.path}},superTypes:[]},Group:{name:X0.$type,properties:{cardinality:{name:X0.cardinality},elements:{name:X0.elements,defaultValue:[]},guardCondition:{name:X0.guardCondition},predicate:{name:X0.predicate}},superTypes:[To.$type]},InferredType:{name:IC.$type,properties:{name:{name:IC.name}},superTypes:[Qo.$type]},InfixRule:{name:Mu.$type,properties:{call:{name:Mu.call},dataType:{name:Mu.dataType},inferredType:{name:Mu.inferredType},name:{name:Mu.name},operators:{name:Mu.operators},parameters:{name:Mu.parameters,defaultValue:[]},returnType:{name:Mu.returnType,referenceType:Qo.$type}},superTypes:[pT.$type]},InfixRuleOperatorList:{name:vT.$type,properties:{associativity:{name:vT.associativity},operators:{name:vT.operators,defaultValue:[]}},superTypes:[]},InfixRuleOperators:{name:OC.$type,properties:{precedences:{name:OC.precedences,defaultValue:[]}},superTypes:[]},Interface:{name:dy.$type,properties:{attributes:{name:dy.attributes,defaultValue:[]},name:{name:dy.name},superTypes:{name:dy.superTypes,defaultValue:[],referenceType:Qo.$type}},superTypes:[Qo.$type]},Keyword:{name:py.$type,properties:{cardinality:{name:py.cardinality},predicate:{name:py.predicate},value:{name:py.value}},superTypes:[To.$type]},NamedArgument:{name:my.$type,properties:{calledByName:{name:my.calledByName,defaultValue:!1},parameter:{name:my.parameter,referenceType:gy.$type},value:{name:my.value}},superTypes:[]},NegatedToken:{name:K0.$type,properties:{cardinality:{name:K0.cardinality},lookahead:{name:K0.lookahead},parenthesized:{name:K0.parenthesized,defaultValue:!1},terminal:{name:K0.terminal}},superTypes:[wo.$type]},Negation:{name:PC.$type,properties:{value:{name:PC.value}},superTypes:[Fd.$type]},NumberLiteral:{name:BC.$type,properties:{value:{name:BC.value}},superTypes:[am.$type]},Parameter:{name:gy.$type,properties:{name:{name:gy.name}},superTypes:[]},ParameterReference:{name:FC.$type,properties:{parameter:{name:FC.parameter,referenceType:gy.$type}},superTypes:[Fd.$type]},ParserRule:{name:Cc.$type,properties:{dataType:{name:Cc.dataType},definition:{name:Cc.definition},entry:{name:Cc.entry,defaultValue:!1},fragment:{name:Cc.fragment,defaultValue:!1},inferredType:{name:Cc.inferredType},name:{name:Cc.name},parameters:{name:Cc.parameters,defaultValue:[]},returnType:{name:Cc.returnType,referenceType:Qo.$type}},superTypes:[pT.$type]},ReferenceType:{name:xT.$type,properties:{isMulti:{name:xT.isMulti,defaultValue:!1},referenceType:{name:xT.referenceType}},superTypes:[nm.$type]},RegexToken:{name:Q0.$type,properties:{cardinality:{name:Q0.cardinality},lookahead:{name:Q0.lookahead},parenthesized:{name:Q0.parenthesized,defaultValue:!1},regex:{name:Q0.regex}},superTypes:[wo.$type]},ReturnType:{name:$C.$type,properties:{name:{name:$C.name}},superTypes:[]},RuleCall:{name:Z0.$type,properties:{arguments:{name:Z0.arguments,defaultValue:[]},cardinality:{name:Z0.cardinality},predicate:{name:Z0.predicate},rule:{name:Z0.rule,referenceType:fy.$type}},superTypes:[To.$type]},SimpleType:{name:yy.$type,properties:{primitiveType:{name:yy.primitiveType},stringType:{name:yy.stringType},typeRef:{name:yy.typeRef,referenceType:Qo.$type}},superTypes:[nm.$type]},StringLiteral:{name:zC.$type,properties:{value:{name:zC.value}},superTypes:[am.$type]},TerminalAlternatives:{name:J0.$type,properties:{cardinality:{name:J0.cardinality},elements:{name:J0.elements,defaultValue:[]},lookahead:{name:J0.lookahead},parenthesized:{name:J0.parenthesized,defaultValue:!1}},superTypes:[wo.$type]},TerminalElement:{name:wo.$type,properties:{cardinality:{name:wo.cardinality},lookahead:{name:wo.lookahead},parenthesized:{name:wo.parenthesized,defaultValue:!1}},superTypes:[To.$type]},TerminalGroup:{name:em.$type,properties:{cardinality:{name:em.cardinality},elements:{name:em.elements,defaultValue:[]},lookahead:{name:em.lookahead},parenthesized:{name:em.parenthesized,defaultValue:!1}},superTypes:[wo.$type]},TerminalRule:{name:Vh.$type,properties:{definition:{name:Vh.definition},fragment:{name:Vh.fragment,defaultValue:!1},hidden:{name:Vh.hidden,defaultValue:!1},name:{name:Vh.name},type:{name:Vh.type}},superTypes:[fy.$type]},TerminalRuleCall:{name:tm.$type,properties:{cardinality:{name:tm.cardinality},lookahead:{name:tm.lookahead},parenthesized:{name:tm.parenthesized,defaultValue:!1},rule:{name:tm.rule,referenceType:Vh.$type}},superTypes:[wo.$type]},Type:{name:bT.$type,properties:{name:{name:bT.name},type:{name:bT.type}},superTypes:[Qo.$type]},TypeAttribute:{name:rm.$type,properties:{defaultValue:{name:rm.defaultValue},isOptional:{name:rm.isOptional,defaultValue:!1},name:{name:rm.name},type:{name:rm.type}},superTypes:[]},TypeDefinition:{name:nm.$type,properties:{},superTypes:[]},UnionType:{name:GC.$type,properties:{types:{name:GC.types,defaultValue:[]}},superTypes:[nm.$type]},UnorderedGroup:{name:TT.$type,properties:{cardinality:{name:TT.cardinality},elements:{name:TT.elements,defaultValue:[]}},superTypes:[To.$type]},UntilToken:{name:im.$type,properties:{cardinality:{name:im.cardinality},lookahead:{name:im.lookahead},parenthesized:{name:im.parenthesized,defaultValue:!1},terminal:{name:im.terminal}},superTypes:[wo.$type]},ValueLiteral:{name:am.$type,properties:{},superTypes:[]},Wildcard:{name:vy.$type,properties:{cardinality:{name:vy.cardinality},lookahead:{name:vy.lookahead},parenthesized:{name:vy.parenthesized,defaultValue:!1}},superTypes:[wo.$type]}}}},mr=new xy});var jC={};vr(jC,{DefaultNameRegexp:()=>YC,RangeComparison:()=>Iu,compareRange:()=>n1e,findCommentNode:()=>oF,findDeclarationNodeAtOffset:()=>Mtt,findLeafNodeAtOffset:()=>lF,findLeafNodeBeforeOffset:()=>i1e,flattenCst:()=>Ntt,getDatatypeNode:()=>Ltt,getInteriorNodes:()=>Ptt,getNextNode:()=>Itt,getPreviousNode:()=>s1e,getStartlineNode:()=>Ott,inRange:()=>zB,isChildNode:()=>sF,isCommentNode:()=>aF,streamCst:()=>sm,toDocumentSegment:()=>om,tokenToRange:()=>by});function Ltt(t){let e=t,r=!1;for(;e;){let n=zh(e.grammarSource,Sa);if(n&&n.dataType)e=e.container,r=!0;else return r?e:void 0}}function sm(t){return new Nu(t,e=>wc(e)?e.content:[],{includeRoot:!0})}function Ntt(t){return sm(t).filter(Nd)}function sF(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function by(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function om(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function n1e(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return Iu.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineIu.After}function Mtt(t,e,r=YC){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return lF(t,e)}}function oF(t,e){if(t){let r=s1e(t,!0);if(r&&aF(r,e))return r;if(fT(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(aF(a,e))return a}}}}function aF(t,e){return Nd(t)&&e.includes(t.tokenType.name)}function lF(t,e){if(Nd(t))return t;if(wc(t)){let r=a1e(t,e,!1);if(r)return lF(r,e)}}function i1e(t,e){if(Nd(t))return t;if(wc(t)){let r=a1e(t,e,!0);if(r)return i1e(r,e)}}function a1e(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),l=t.content[s];if(l.offset<=e&&l.end>e)return l;l.end<=e?(a=r?l:void 0,n=s+1):i=s-1}return a}function s1e(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function Itt(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{"use strict";kc();Os();us();Zo();o(Ltt,"getDatatypeNode");o(sm,"streamCst");o(Ntt,"flattenCst");o(sF,"isChildNode");o(by,"tokenToRange");o(om,"toDocumentSegment");(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside"})(Iu||(Iu={}));o(n1e,"compareRange");o(zB,"inRange");YC=/^[\w\p{L}]$/u;o(Mtt,"findDeclarationNodeAtOffset");o(oF,"findCommentNode");o(aF,"isCommentNode");o(lF,"findLeafNodeAtOffset");o(i1e,"findLeafNodeBeforeOffset");o(a1e,"binarySearch");o(s1e,"getPreviousNode");o(Itt,"getNextNode");o(Ott,"getStartlineNode");o(Ptt,"getInteriorNodes");o(Btt,"getCommonParent");o(r1e,"getParentChain")});function Ou(t,e="Error: Got unexpected value."){throw new Error(e)}function o1e(t,e="Error: Condition is violated."){if(!t)throw new Error(e)}var lm,XC=O(()=>{"use strict";lm=class extends Error{static{o(this,"ErrorWithLocation")}constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};o(Ou,"assertUnreachable");o(o1e,"assertCondition")});function xr(t){return t.charCodeAt(0)}function KC(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function Ty(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function cm(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function ST(){throw Error("Internal Error - Should never get here!")}function cF(t){return t.type==="Character"}var uF=O(()=>{"use strict";o(xr,"cc");o(KC,"insertToSet");o(Ty,"addFlag");o(cm,"ASSERT_EXISTS");o(ST,"ASSERT_NEVER_REACH_HERE");o(cF,"isCharacter")});var CT,AT,hF,l1e=O(()=>{"use strict";uF();CT=[];for(let t=xr("0");t<=xr("9");t++)CT.push(t);AT=[xr("_")].concat(CT);for(let t=xr("a");t<=xr("z");t++)AT.push(t);for(let t=xr("A");t<=xr("Z");t++)AT.push(t);hF=[xr(" "),xr("\f"),xr(` -`),xr("\r"),xr(" "),xr("\v"),xr(" "),xr("\xA0"),xr("\u1680"),xr("\u2000"),xr("\u2001"),xr("\u2002"),xr("\u2003"),xr("\u2004"),xr("\u2005"),xr("\u2006"),xr("\u2007"),xr("\u2008"),xr("\u2009"),xr("\u200A"),xr("\u2028"),xr("\u2029"),xr("\u202F"),xr("\u205F"),xr("\u3000"),xr("\uFEFF")]});var Ftt,QC,$tt,um,c1e=O(()=>{"use strict";uF();l1e();Ftt=/[0-9a-fA-F]/,QC=/[0-9]/,$tt=/[1-9]/,um=class{static{o(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":Ty(n,"global");break;case"i":Ty(n,"ignoreCase");break;case"m":Ty(n,"multiLine");break;case"u":Ty(n,"unicode");break;case"y":Ty(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break;case"<":{switch(this.popChar()){case"=":r="Lookbehind";break;case"!":r="NegativeLookbehind"}break}}cm(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return ST()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;cm(r);break}if(!(e===!0&&r===void 0)&&cm(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),cm(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):ST()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[xr(` -`),xr("\r"),xr("\u2028"),xr("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=CT;break;case"D":e=CT,r=!0;break;case"s":e=hF;break;case"S":e=hF,r=!0;break;case"w":e=AT;break;case"W":e=AT,r=!0;break}return cm(e)?{type:"Set",value:e,complement:r}:ST()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=xr("\f");break;case"n":e=xr(` -`);break;case"r":e=xr("\r");break;case"t":e=xr(" ");break;case"v":e=xr("\v");break}return cm(e)?{type:"Character",value:e}:ST()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:xr("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:xr(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:xr(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(cF(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(cF(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var Pu,u1e=O(()=>{"use strict";Pu=class{static{o(this,"BaseRegExpVisitor")}visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Lookbehind":this.visitLookbehind(e);break;case"NegativeLookbehind":this.visitNegativeLookbehind(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitLookbehind(e){}visitNegativeLookbehind(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var _T=O(()=>{"use strict";c1e();u1e()});var ZC={};vr(ZC,{NEWLINE_REGEXP:()=>dF,escapeRegExp:()=>Vd,getTerminalParts:()=>ztt,isMultilineComment:()=>pF,isWhitespace:()=>DT,partialMatches:()=>mF,partialRegExp:()=>d1e,whitespaceCharacters:()=>f1e});function ztt(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=h1e.pattern(t),r=[];for(let n of e.value.value)hm.reset(t),hm.visit(n),r.push({start:hm.startRegexp,end:hm.endRegex});return r}catch{return[]}}function pF(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),hm.reset(t),hm.visit(h1e.pattern(t)),hm.multiline}catch{return!1}}function DT(t){let e=typeof t=="string"?new RegExp(t):t;return f1e.some(r=>e.test(r))}function Vd(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function mF(t,e){let r=d1e(t),n=e.match(r);return!!n&&n[0].length>0}function d1e(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function l(h){a+=r.substr(n,h),n+=h}o(l,"appendRaw");function u(h){a+="(?:"+r.substr(n,h)+"|$)",n+=h}for(o(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],u(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?l(s[0].length):u(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:l(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else l(1),a+=i()+"|$)";break;case")":return++n,a;default:u(1);break}return a}return o(i,"process"),new RegExp(i(),t.flags)}var dF,h1e,fF,hm,f1e,wy=O(()=>{"use strict";_T();dF=/\r?\n/gm,h1e=new um,fF=class extends Pu{static{o(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` -`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=Vd(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` -`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},hm=new fF;o(ztt,"getTerminalParts");o(pF,"isMultilineComment");f1e=`\f -\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");o(DT,"isWhitespace");o(Vd,"escapeRegExp");o(mF,"partialMatches");o(d1e,"partialRegExp")});var t6={};vr(t6,{findAssignment:()=>EF,findNameAssignment:()=>JC,findNodeForKeyword:()=>wF,findNodeForProperty:()=>LT,findNodesForKeyword:()=>Vtt,findNodesForKeywordInternal:()=>kF,findNodesForProperty:()=>bF,getActionAtElement:()=>v1e,getActionType:()=>b1e,getAllReachableRules:()=>RT,getAllRulesUsedForCrossReferences:()=>Gtt,getCrossReferenceTerminal:()=>vF,getEntryRule:()=>p1e,getExplicitRuleType:()=>e6,getHiddenRules:()=>m1e,getRuleType:()=>SF,getRuleTypeName:()=>Ytt,getTypeName:()=>qd,isArrayCardinality:()=>Utt,isArrayOperator:()=>Wtt,isCommentTerminal:()=>xF,isDataType:()=>Htt,isDataTypeRule:()=>NT,isOptionalCardinality:()=>qtt,terminalRegex:()=>ky});function p1e(t){return t.rules.find(e=>Sa(e)&&e.entry)}function m1e(t){return t.rules.filter(e=>Bs(e)&&e.hidden)}function RT(t,e){let r=new Set,n=p1e(t);if(!n)return new Set(t.rules);let i=[n].concat(m1e(t));for(let s of i)g1e(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||Bs(s)&&s.hidden)&&a.add(s);return a}function g1e(t,e,r){e.add(t.name),Ec(t).forEach(n=>{if(Dc(n)||r&&UC(n)){let i=n.rule.ref;i&&!e.has(i.name)&&g1e(i,e,r)}})}function Gtt(t){let e=new Set;return Ec(t).forEach(r=>{_c(r)&&(Sa(r.type.ref)&&e.add(r.type.ref),kT(r.type.ref)&&Sa(r.type.ref.$container)&&e.add(r.type.ref.$container))}),e}function vF(t){if(t.terminal)return t.terminal;if(t.type.ref)return JC(t.type.ref)?.terminal}function xF(t){return t.hidden&&!DT(ky(t))}function bF(t,e){return!t||!e?[]:TF(t,e,t.astNode,!0)}function LT(t,e,r){if(!t||!e)return;let n=TF(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function TF(t,e,r,n){if(!n){let i=zh(t.grammarSource,Ac);if(i&&i.feature===e)return[t]}return wc(t)&&t.astNode===r?t.content.flatMap(i=>TF(i,e,r,!1)):[]}function Vtt(t,e){return t?kF(t,e,t?.astNode):[]}function wF(t,e,r){if(!t)return;let n=kF(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function kF(t,e,r){if(t.astNode!==r)return[];if(Pl(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=sm(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?Pl(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function EF(t){let e=t.astNode;for(;e===t.container?.astNode;){let r=zh(t.grammarSource,Ac);if(r)return r;t=t.container}}function JC(t){let e=t;return kT(e)&&(Uh(e.$container)?e=e.$container.$container:qh(e.$container)?e=e.$container:Ou(e.$container)),y1e(t,e,new Map)}function y1e(t,e,r){function n(i,a){let s;return zh(i,Ac)||(s=y1e(a,a,r)),r.set(t,s),s}if(o(n,"go"),r.has(t))return r.get(t);r.set(t,void 0);for(let i of Ec(e)){if(Ac(i)&&i.feature.toLowerCase()==="name")return r.set(t,i),i;if(Dc(i)&&Sa(i.rule.ref))return n(i,i.rule.ref);if(qC(i)&&i.typeRef?.ref)return n(i,i.typeRef.ref)}}function v1e(t){let e=t.$container;if(zd(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if(Uh(a))return a;{let s=Ec(r[i]).find(Uh);if(s)return s}}}if(wT(e))return v1e(e)}function qtt(t,e){return t==="?"||t==="*"||zd(e)&&!!e.guardCondition}function Utt(t){return t==="*"||t==="+"}function Wtt(t){return t==="+="}function NT(t){return x1e(t,new Set)}function x1e(t,e){if(e.has(t))return!0;e.add(t);for(let r of Ec(t))if(Dc(r)){if(!r.rule.ref||Sa(r.rule.ref)&&!x1e(r.rule.ref,e)||Gd(r.rule.ref))return!1}else{if(Ac(r))return!1;if(Uh(r))return!1}return!!t.definition}function Htt(t){return yF(t.type,new Set)}function yF(t,e){if(e.has(t))return!0;if(e.add(t),GB(t))return!1;if(QB(t))return!1;if(rF(t))return t.types.every(r=>yF(r,e));if(qC(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return WC(r)?yF(r.type,e):!1}else return!1}else return!1}function e6(t){if(!Bs(t)){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e)return e.name}}}function qd(t){if(qh(t))return Sa(t)&&NT(t)?t.name:e6(t)??t.name;if(YB(t)||WC(t)||JB(t))return t.name;if(Uh(t)){let e=b1e(t);if(e)return e}else if(kT(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function b1e(t){if(t.inferredType)return t.inferredType.name;if(t.type?.ref)return qd(t.type.ref)}function Ytt(t){return Bs(t)?t.type?.name??"string":Sa(t)&&NT(t)?t.name:e6(t)??t.name}function SF(t){return Bs(t)?t.type?.name??"string":e6(t)??t.name}function ky(t){let e={s:!1,i:!1,u:!1},r=Ey(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function Ey(t,e){if(eF(t))return jtt(t);if(tF(t))return Xtt(t);if(qB(t))return Ztt(t);if(UC(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return Wh(Ey(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}else{if(jB(t))return Qtt(t);if(nF(t))return Ktt(t);if(ZB(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),Wh(n,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}else{if(iF(t))return Wh(CF,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized});throw new Error(`Invalid terminal element: ${t?.$type}, ${t?.$cstNode?.text}`)}}}function jtt(t){return Wh(t.elements.map(e=>Ey(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function Xtt(t){return Wh(t.elements.map(e=>Ey(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function Ktt(t){return Wh(`${CF}*?${Ey(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}function Qtt(t){return Wh(`(?!${Ey(t.terminal)})${CF}*?`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}function Ztt(t){return t.right?Wh(`[${gF(t.left)}-${gF(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1}):Wh(gF(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function gF(t){return Vd(t.value)}function Wh(t,e){return(e.parenthesized||e.lookahead||e.wrap!==!1)&&(t=`(${e.lookahead??(e.parenthesized?"":"?:")}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var CF,Rc=O(()=>{"use strict";XC();Zo();kc();us();Sc();wy();o(p1e,"getEntryRule");o(m1e,"getHiddenRules");o(RT,"getAllReachableRules");o(g1e,"ruleDfs");o(Gtt,"getAllRulesUsedForCrossReferences");o(vF,"getCrossReferenceTerminal");o(xF,"isCommentTerminal");o(bF,"findNodesForProperty");o(LT,"findNodeForProperty");o(TF,"findNodesForPropertyInternal");o(Vtt,"findNodesForKeyword");o(wF,"findNodeForKeyword");o(kF,"findNodesForKeywordInternal");o(EF,"findAssignment");o(JC,"findNameAssignment");o(y1e,"findNameAssignmentInternal");o(v1e,"getActionAtElement");o(qtt,"isOptionalCardinality");o(Utt,"isArrayCardinality");o(Wtt,"isArrayOperator");o(NT,"isDataTypeRule");o(x1e,"isDataTypeRuleInternal");o(Htt,"isDataType");o(yF,"isDataTypeInternal");o(e6,"getExplicitRuleType");o(qd,"getTypeName");o(b1e,"getActionType");o(Ytt,"getRuleTypeName");o(SF,"getRuleType");o(ky,"terminalRegex");CF=/[\s\S]/.source;o(Ey,"abstractElementToRegex");o(jtt,"terminalAlternativesToRegex");o(Xtt,"terminalGroupToRegex");o(Ktt,"untilTokenToRegex");o(Qtt,"negateTokenToRegex");o(Ztt,"characterRangeToRegex");o(gF,"keywordToRegex");o(Wh,"withCardinality")});function AF(t){let e=[],r=t.Grammar;for(let n of r.rules)Bs(n)&&xF(n)&&pF(ky(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:YC}}var _F=O(()=>{"use strict";Sc();Rc();wy();Zo();o(AF,"createGrammarConfig")});var DF=O(()=>{"use strict"});function Sy(t){console&&console.error&&console.error(`Error: ${t}`)}function MT(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var T1e=O(()=>{"use strict";o(Sy,"PRINT_ERROR");o(MT,"PRINT_WARNING")});function IT(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var w1e=O(()=>{"use strict";o(IT,"timer")});function OT(t){function e(){}o(e,"FakeConstructor"),e.prototype=t;let r=new e;function n(){return typeof r.bar}return o(n,"fakeAccess"),n(),n(),t;(0,eval)(t)}var k1e=O(()=>{"use strict";o(OT,"toFastProperties")});var Cy=O(()=>{"use strict";T1e();w1e();k1e()});function Jtt(t){return ert(t)?t.LABEL:t.name}function ert(t){return Bi(t.LABEL)&&t.LABEL!==""}function r6(t){return lt(t,Ay)}function Ay(t){function e(r){return lt(r,Ay)}if(o(e,"convertDefinition"),t instanceof Sn){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return Bi(t.label)&&(r.label=t.label),r}else{if(t instanceof Yn)return{type:"Alternative",definition:e(t.definition)};if(t instanceof Cn)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof jn)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Xn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Ay(new Yr({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof zn)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Ay(new Yr({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Jr)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof Gn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof Yr){let r={type:"Terminal",name:t.terminalType.name,label:Jtt(t.terminalType),idx:t.idx};Bi(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=Al(n)?n.source:n),r}else{if(t instanceof Fs)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var Jo,Sn,Fs,Yn,Cn,jn,Xn,Jr,zn,Gn,Yr,n6=O(()=>{"use strict";rr();o(Jtt,"tokenLabel");o(ert,"hasTokenLabel");Jo=class{static{o(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Oe(this.definition,r=>{r.accept(e)})}},Sn=class extends Jo{static{o(this,"NonTerminal")}constructor(e){super([]),this.idx=1,$a(this,go(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},Fs=class extends Jo{static{o(this,"Rule")}constructor(e){super(e.definition),this.orgText="",$a(this,go(e,r=>r!==void 0))}},Yn=class extends Jo{static{o(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,$a(this,go(e,r=>r!==void 0))}},Cn=class extends Jo{static{o(this,"Option")}constructor(e){super(e.definition),this.idx=1,$a(this,go(e,r=>r!==void 0))}},jn=class extends Jo{static{o(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,$a(this,go(e,r=>r!==void 0))}},Xn=class extends Jo{static{o(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,$a(this,go(e,r=>r!==void 0))}},Jr=class extends Jo{static{o(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,$a(this,go(e,r=>r!==void 0))}},zn=class extends Jo{static{o(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,$a(this,go(e,r=>r!==void 0))}},Gn=class extends Jo{static{o(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,$a(this,go(e,r=>r!==void 0))}},Yr=class{static{o(this,"Terminal")}constructor(e){this.idx=1,$a(this,go(e,r=>r!==void 0))}accept(e){e.visit(this)}};o(r6,"serializeGrammar");o(Ay,"serializeProduction")});var $s,E1e=O(()=>{"use strict";n6();$s=class{static{o(this,"GAstVisitor")}visit(e){let r=e;switch(r.constructor){case Sn:return this.visitNonTerminal(r);case Yn:return this.visitAlternative(r);case Cn:return this.visitOption(r);case jn:return this.visitRepetitionMandatory(r);case Xn:return this.visitRepetitionMandatoryWithSeparator(r);case zn:return this.visitRepetitionWithSeparator(r);case Jr:return this.visitRepetition(r);case Gn:return this.visitAlternation(r);case Yr:return this.visitTerminal(r);case Fs:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function RF(t){return t instanceof Yn||t instanceof Cn||t instanceof Jr||t instanceof jn||t instanceof Xn||t instanceof zn||t instanceof Yr||t instanceof Fs}function fm(t,e=[]){return t instanceof Cn||t instanceof Jr||t instanceof zn?!0:t instanceof Gn?wb(t.definition,n=>fm(n,e)):t instanceof Sn&&ci(e,t)?!1:t instanceof Jo?(t instanceof Sn&&e.push(t),is(t.definition,n=>fm(n,e))):!1}function LF(t){return t instanceof Gn}function ko(t){if(t instanceof Sn)return"SUBRULE";if(t instanceof Cn)return"OPTION";if(t instanceof Gn)return"OR";if(t instanceof jn)return"AT_LEAST_ONE";if(t instanceof Xn)return"AT_LEAST_ONE_SEP";if(t instanceof zn)return"MANY_SEP";if(t instanceof Jr)return"MANY";if(t instanceof Yr)return"CONSUME";throw Error("non exhaustive match")}var S1e=O(()=>{"use strict";rr();n6();o(RF,"isSequenceProd");o(fm,"isOptionalProd");o(LF,"isBranchingProd");o(ko,"getProductionDslName")});var zs=O(()=>{"use strict";n6();E1e();S1e()});function C1e(t,e,r){return[new Cn({definition:[new Yr({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var Hh,i6=O(()=>{"use strict";rr();zs();Hh=class{static{o(this,"RestWalker")}walk(e,r=[]){Oe(e.definition,(n,i)=>{let a=Pi(e.definition,i+1);if(n instanceof Sn)this.walkProdRef(n,a,r);else if(n instanceof Yr)this.walkTerminal(n,a,r);else if(n instanceof Yn)this.walkFlat(n,a,r);else if(n instanceof Cn)this.walkOption(n,a,r);else if(n instanceof jn)this.walkAtLeastOne(n,a,r);else if(n instanceof Xn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof zn)this.walkManySep(n,a,r);else if(n instanceof Jr)this.walkMany(n,a,r);else if(n instanceof Gn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new Cn({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=C1e(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new Cn({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=C1e(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Oe(e.definition,a=>{let s=new Yn({definition:[a]});this.walk(s,i)})}};o(C1e,"restForRepetitionWithSeparator")});function dm(t){if(t instanceof Sn)return dm(t.referencedRule);if(t instanceof Yr)return nrt(t);if(RF(t))return trt(t);if(LF(t))return rrt(t);throw Error("non exhaustive match")}function trt(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=fm(a),e=e.concat(dm(a)),n=n+1,i=r.length>n;return P1(e)}function rrt(t){let e=lt(t.definition,r=>dm(r));return P1(fn(e))}function nrt(t){return[t.terminalType]}var NF=O(()=>{"use strict";rr();zs();o(dm,"first");o(trt,"firstForSequence");o(rrt,"firstForBranching");o(nrt,"firstForTerminal")});var a6,MF=O(()=>{"use strict";a6="_~IN~_"});function A1e(t){let e={};return Oe(t,r=>{let n=new IF(r).startWalking();$a(e,n)}),e}function irt(t,e){return t.name+e+a6}var IF,_1e=O(()=>{"use strict";i6();NF();rr();MF();zs();IF=class extends Hh{static{o(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=irt(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new Yn({definition:a}),l=dm(s);this.follows[i]=l}};o(A1e,"computeAllProdsFollows");o(irt,"buildBetweenProdsFollowPrefix")});function _y(t){let e=t.toString();if(s6.hasOwnProperty(e))return s6[e];{let r=art.pattern(e);return s6[e]=r,r}}function D1e(){s6={}}var s6,art,o6=O(()=>{"use strict";_T();s6={},art=new um;o(_y,"getRegExpAst");o(D1e,"clearRegExpParserCache")});function N1e(t,e=!1){try{let r=_y(t);return OF(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===L1e)e&&MT(`${PT} Unable to optimize: < ${t.toString()} > - Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),Sy(`${PT} - Failed parsing: < ${t.toString()} > - Using the @chevrotain/regexp-to-ast library - Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function OF(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")l6(u,e,r);else{let h=u;if(r===!0)for(let f=h.from;f<=h.to;f++)l6(f,e,r);else{for(let f=h.from;f<=h.to&&f=Dy){let f=h.from>=Dy?h.from:Dy,d=h.to,p=Bu(f),m=Bu(d);for(let g=p;g<=m;g++)e[g]=g}}}});break;case"Group":OF(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let l=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&PF(s)===!1||s.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return Gr(e)}function l6(t,e,r){let n=Bu(t);e[n]=n,r===!0&&srt(t,e)}function srt(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=Bu(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=Bu(i.charCodeAt(0));e[a]=a}}}function R1e(t,e){return Ls(t.value,r=>{if(typeof r=="number")return ci(e,r);{let n=r;return Ls(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function PF(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?zt(t.value)?is(t.value,PF):PF(t.value):!1}function c6(t,e){if(e instanceof RegExp){let r=_y(e),n=new BF(t);return n.visit(r),n.found}else return Ls(e,r=>ci(t,r.charCodeAt(0)))!==void 0}var L1e,PT,BF,M1e=O(()=>{"use strict";_T();rr();Cy();o6();FF();L1e="Complement Sets are not supported for first char optimization",PT=`Unable to use "first char" lexer optimizations: -`;o(N1e,"getOptimizedStartCodesIndices");o(OF,"firstCharOptimizedIndices");o(l6,"addOptimizedIdxToResult");o(srt,"handleIgnoreCase");o(R1e,"findCode");o(PF,"isWholeOptional");BF=class extends Pu{static{o(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return;case"Lookbehind":this.visitLookbehind(e);return;case"NegativeLookbehind":this.visitNegativeLookbehind(e);return}super.visitChildren(e)}}visitCharacter(e){ci(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?R1e(e,this.targetCharCodes)===void 0&&(this.found=!0):R1e(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};o(c6,"canMatchCharCode")});function P1e(t,e){e=ad(e,{useSticky:zF,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:o((b,T)=>T(),"tracer")});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{Srt()});let n;r("Reject Lexer.NA",()=>{n=od(t,b=>b[pm]===fi.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=lt(n,b=>{let T=b[pm];if(Al(T)){let E=T.source;return E.length===1&&E!=="^"&&E!=="$"&&E!=="."&&!T.ignoreCase?E:E.length===2&&E[0]==="\\"&&!ci(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],E[1])?E[1]:e.useSticky?O1e(T):I1e(T)}else{if(Vi(T))return i=!0,{exec:T};if(typeof T=="object")return i=!0,T;if(typeof T=="string"){if(T.length===1)return T;{let E=T.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),w=new RegExp(E);return e.useSticky?O1e(w):I1e(w)}}else throw Error("non exhaustive match")}})});let s,l,u,h,f;r("misc mapping",()=>{s=lt(n,b=>b.tokenTypeIdx),l=lt(n,b=>{let T=b.GROUP;if(T!==fi.SKIPPED){if(Bi(T))return T;if(Dr(T))return!1;throw Error("non exhaustive match")}}),u=lt(n,b=>{let T=b.LONGER_ALT;if(T)return zt(T)?lt(T,w=>sS(n,w)):[sS(n,T)]}),h=lt(n,b=>b.PUSH_MODE),f=lt(n,b=>Gt(b,"POP_MODE"))});let d;r("Line Terminator Handling",()=>{let b=U1e(e.lineTerminatorCharacters);d=lt(n,T=>!1),e.positionTracking!=="onlyOffset"&&(d=lt(n,T=>Gt(T,"LINE_BREAKS")?!!T.LINE_BREAKS:q1e(T,b)===!1&&c6(b,T.PATTERN)))});let p,m,g,y;r("Misc Mapping #2",()=>{p=lt(n,G1e),m=lt(a,krt),g=pn(n,(b,T)=>{let E=T.GROUP;return Bi(E)&&E!==fi.SKIPPED&&(b[E]=[]),b},{}),y=lt(a,(b,T)=>({pattern:a[T],longerAlt:u[T],canLineTerminator:d[T],isCustom:p[T],short:m[T],group:l[T],push:h[T],pop:f[T],tokenTypeIdx:s[T],tokenType:n[T]}))});let v=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=pn(n,(b,T,E)=>{if(typeof T.PATTERN=="string"){let w=T.PATTERN.charCodeAt(0),k=Bu(w);$F(b,k,y[E])}else if(zt(T.START_CHARS_HINT)){let w;Oe(T.START_CHARS_HINT,k=>{let S=typeof k=="string"?k.charCodeAt(0):k,A=Bu(S);w!==A&&(w=A,$F(b,A,y[E]))})}else if(Al(T.PATTERN))if(T.PATTERN.unicode)v=!1,e.ensureOptimizations&&Sy(`${PT} Unable to analyze < ${T.PATTERN.toString()} > pattern. - The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let w=N1e(T.PATTERN,e.ensureOptimizations);Er(w)&&(v=!1),Oe(w,k=>{$F(b,k,y[E])})}else e.ensureOptimizations&&Sy(`${PT} TokenType: <${T.name}> is using a custom token pattern without providing parameter. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}function B1e(t,e){let r=[],n=lrt(t);r=r.concat(n.errors);let i=crt(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(ort(a)),r=r.concat(yrt(a)),r=r.concat(vrt(a,e)),r=r.concat(xrt(a)),r}function ort(t){let e=[],r=dn(t,n=>Al(n[pm]));return e=e.concat(hrt(r)),e=e.concat(prt(r)),e=e.concat(mrt(r)),e=e.concat(grt(r)),e=e.concat(frt(r)),e}function lrt(t){let e=dn(t,i=>!Gt(i,pm)),r=lt(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:hi.MISSING_PATTERN,tokenTypes:[i]})),n=sd(t,e);return{errors:r,valid:n}}function crt(t){let e=dn(t,i=>{let a=i[pm];return!Al(a)&&!Vi(a)&&!Gt(a,"exec")&&!Bi(a)}),r=lt(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:hi.INVALID_PATTERN,tokenTypes:[i]})),n=sd(t,e);return{errors:r,valid:n}}function hrt(t){class e extends Pu{static{o(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=dn(t,i=>{let a=i.PATTERN;try{let s=_y(a),l=new e;return l.visit(s),l.found}catch{return urt.test(a.source)}});return lt(r,i=>({message:`Unexpected RegExp Anchor Error: - Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:hi.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function frt(t){let e=dn(t,n=>n.PATTERN.test(""));return lt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:hi.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function prt(t){class e extends Pu{static{o(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=dn(t,i=>{let a=i.PATTERN;try{let s=_y(a),l=new e;return l.visit(s),l.found}catch{return drt.test(a.source)}});return lt(r,i=>({message:`Unexpected RegExp Anchor Error: - Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:hi.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function mrt(t){let e=dn(t,n=>{let i=n[pm];return i instanceof RegExp&&(i.multiline||i.global)});return lt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:hi.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function grt(t){let e=[],r=lt(t,a=>pn(t,(s,l)=>(a.PATTERN.source===l.PATTERN.source&&!ci(e,l)&&l.PATTERN!==fi.NA&&(e.push(l),s.push(l)),s),[]));r=xu(r);let n=dn(r,a=>a.length>1);return lt(n,a=>{let s=lt(a,u=>u.name);return{message:`The same RegExp pattern ->${Ta(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:hi.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function yrt(t){let e=dn(t,n=>{if(!Gt(n,"GROUP"))return!1;let i=n.GROUP;return i!==fi.SKIPPED&&i!==fi.NA&&!Bi(i)});return lt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:hi.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function vrt(t,e){let r=dn(t,i=>i.PUSH_MODE!==void 0&&!ci(e,i.PUSH_MODE));return lt(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:hi.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function xrt(t){let e=[],r=pn(t,(n,i,a)=>{let s=i.PATTERN;return s===fi.NA||(Bi(s)?n.push({str:s,idx:a,tokenType:i}):Al(s)&&Trt(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Oe(t,(n,i)=>{Oe(r,({str:a,idx:s,tokenType:l})=>{if(i${l.name}<- can never be matched. -Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:hi.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}function brt(t,e){if(Al(e)){if(wrt(e))return!1;let r=e.exec(t);return r!==null&&r.index===0}else{if(Vi(e))return e(t,0,[],{});if(Gt(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function Trt(t){return Ls([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function wrt(t){return/(\(\?=)|(\(\?!)|(\(\?<=)|(\(\? property in its definition -`,type:hi.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),Gt(t,u6)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+u6+`> property in its definition -`,type:hi.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),Gt(t,u6)&&Gt(t,Ry)&&!Gt(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${Ry}: <${t.defaultMode}>which does not exist -`,type:hi.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),Gt(t,u6)&&Oe(t.modes,(i,a)=>{Oe(i,(s,l)=>{if(Dr(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${l}> -`,type:hi.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(Gt(s,"LONGER_ALT")){let u=zt(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Oe(u,h=>{!Dr(h)&&!ci(i,h)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${h.name}> on token <${s.name}> outside of mode <${a}> -`,type:hi.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function $1e(t,e,r){let n=[],i=!1,a=xu(fn(Gr(t.modes))),s=od(a,u=>u[pm]===fi.NA),l=U1e(r);return e&&Oe(s,u=>{let h=q1e(u,l);if(h!==!1){let d={message:Ert(u,h),type:h.issue,tokenType:u};n.push(d)}else Gt(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):c6(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:hi.NO_LINE_BREAKS_FLAGS}),n}function z1e(t){let e={},r=nn(t);return Oe(r,n=>{let i=t[n];if(zt(i))e[n]=[];else throw Error("non exhaustive match")}),e}function G1e(t){let e=t.PATTERN;if(Al(e))return!1;if(Vi(e))return!0;if(Gt(e,"exec"))return!0;if(Bi(e))return!1;throw Error("non exhaustive match")}function krt(t){return Bi(t)&&t.length===1?t.charCodeAt(0):!1}function q1e(t,e){if(Gt(t,"LINE_BREAKS"))return!1;if(Al(t.PATTERN)){try{c6(e,t.PATTERN)}catch(r){return{issue:hi.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(Bi(t.PATTERN))return!1;if(G1e(t))return{issue:hi.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function Ert(t,e){if(e.issue===hi.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. - The problem is in the <${t.name}> Token Type - Root cause: ${e.errMsg}. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===hi.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. - The problem is in the <${t.name}> Token Type - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function U1e(t){return lt(t,r=>Bi(r)?r.charCodeAt(0):r)}function $F(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function Bu(t){return t255?255+~~(t/255):t}}var pm,Ry,u6,zF,urt,drt,V1e,Dy,h6,FF=O(()=>{"use strict";_T();BT();rr();Cy();M1e();o6();pm="PATTERN",Ry="defaultMode",u6="modes",zF=typeof new RegExp("(?:)").sticky=="boolean";o(P1e,"analyzeTokenTypes");o(B1e,"validatePatterns");o(ort,"validateRegExpPattern");o(lrt,"findMissingPatterns");o(crt,"findInvalidPatterns");urt=/[^\\][$]/;o(hrt,"findEndOfInputAnchor");o(frt,"findEmptyMatchRegExps");drt=/[^\\[][\^]|^\^/;o(prt,"findStartOfInputAnchor");o(mrt,"findUnsupportedFlags");o(grt,"findDuplicatePatterns");o(yrt,"findInvalidGroupType");o(vrt,"findModesThatDoNotExist");o(xrt,"findUnreachablePatterns");o(brt,"tryToMatchStrToPattern");o(Trt,"noMetaChar");o(wrt,"usesLookAheadOrBehind");o(I1e,"addStartOfInput");o(O1e,"addStickyFlag");o(F1e,"performRuntimeChecks");o($1e,"performWarningRuntimeChecks");o(z1e,"cloneEmptyGroups");o(G1e,"isCustomPattern");o(krt,"isShortPattern");V1e={test:o(function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function Crt(t){let e=Tn(t),r=t,n=!0;for(;n;){r=xu(fn(lt(r,a=>a.CATEGORIES)));let i=sd(r,e);e=e.concat(i),Er(i)?n=!1:r=i}return e}function Art(t){Oe(t,e=>{GF(e)||(Y1e[W1e]=e,e.tokenTypeIdx=W1e++),H1e(e)&&!zt(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),H1e(e)||(e.CATEGORIES=[]),Rrt(e)||(e.categoryMatches=[]),Lrt(e)||(e.categoryMatchesMap={})})}function _rt(t){Oe(t,e=>{e.categoryMatches=[],Oe(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(Y1e[n].tokenTypeIdx)})})}function Drt(t){Oe(t,e=>{j1e([],e)})}function j1e(t,e){Oe(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Oe(e.CATEGORIES,r=>{let n=t.concat(e);ci(n,r)||j1e(n,r)})}function GF(t){return Gt(t,"tokenTypeIdx")}function H1e(t){return Gt(t,"CATEGORIES")}function Rrt(t){return Gt(t,"categoryMatches")}function Lrt(t){return Gt(t,"categoryMatchesMap")}function X1e(t){return Gt(t,"tokenTypeIdx")}var W1e,Y1e,mm=O(()=>{"use strict";rr();o(Yh,"tokenStructuredMatcher");o(Ly,"tokenStructuredMatcherNoCategories");W1e=1,Y1e={};o(jh,"augmentTokenTypes");o(Crt,"expandCategories");o(Art,"assignTokenDefaultProps");o(_rt,"assignCategoriesTokensProp");o(Drt,"assignCategoriesMapProp");o(j1e,"singleAssignCategoriesToksMap");o(GF,"hasShortKeyProperty");o(H1e,"hasCategoriesProperty");o(Rrt,"hasExtendingTokensTypesProperty");o(Lrt,"hasExtendingTokensTypesMapProperty");o(X1e,"isTokenType")});var Ny,VF=O(()=>{"use strict";Ny={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i,a){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var hi,FT,fi,BT=O(()=>{"use strict";FF();rr();Cy();mm();VF();o6();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(hi||(hi={}));FT={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:Ny,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(FT);fi=class{static{o(this,"Lexer")}constructor(e,r=FT){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=IT(a),h=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=$a({},FT,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===FT.lineTerminatorsPattern)this.config.lineTerminatorsPattern=V1e;else if(this.config.lineTerminatorCharacters===FT.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),zt(e)?i={modes:{defaultMode:Tn(e)},defaultMode:Ry}:(a=!1,i=Tn(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(F1e(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat($1e(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Oe(i.modes,(l,u)=>{i.modes[u]=od(l,h=>Dr(h))});let s=nn(i.modes);if(Oe(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(B1e(l,s))}),Er(this.lexerDefinitionErrors)){jh(l);let h;this.TRACE_INIT("analyzeTokenTypes",()=>{h=P1e(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=h.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=h.charCodeToPatternIdxToConfig,this.emptyGroups=$a({},this.emptyGroups,h.emptyGroups),this.hasCustom=h.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=h.canBeOptimized}})}),this.defaultMode=i.defaultMode,!Er(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=lt(this.lexerDefinitionErrors,h=>h.message).join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+u)}Oe(this.lexerDefinitionWarning,l=>{MT(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(zF?(this.chopInput=va,this.match=this.matchWithTest):(this.updateLastIndex=ki,this.match=this.matchWithExec),a&&(this.handleModes=ki),this.trackStartLines===!1&&(this.computeNewColumn=va),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=ki),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=pn(this.canModeBeOptimized,(u,h,f)=>(h===!1&&u.push(f),u),[]);if(r.ensureOptimizations&&!Er(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{D1e()}),this.TRACE_INIT("toFastProperties",()=>{OT(this)})})}tokenize(e,r=this.defaultMode){if(!Er(this.lexerDefinitionErrors)){let i=lt(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,l,u,h,f,d,p,m,g,y,v,x,b,T=e,E=T.length,w=0,k=0,S=this.hasCustom?0:Math.floor(e.length/10),A=new Array(S),L=[],I=this.trackStartLines?1:void 0,N=this.trackStartLines?1:void 0,C=z1e(this.emptyGroups),_=this.trackStartLines,D=this.config.lineTerminatorsPattern,M=0,R=[],P=[],B=[],F=[];Object.freeze(F);let G;function $(){return R}o($,"getPossiblePatternsSlow");function V(Y){let le=Bu(Y),ee=P[le];return ee===void 0?F:ee}o(V,"getPossiblePatternsOptimized");let X=o(Y=>{if(B.length===1&&Y.tokenType.PUSH_MODE===void 0){let le=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(Y);L.push({offset:Y.startOffset,line:Y.startLine,column:Y.startColumn,length:Y.image.length,message:le})}else{B.pop();let le=ba(B);R=this.patternIdxToConfig[le],P=this.charCodeToPatternIdxToConfig[le],M=R.length;let ee=this.canModeBeOptimized[le]&&this.config.safeMode===!1;P&&ee?G=V:G=$}},"pop_mode");function Q(Y){B.push(Y),P=this.charCodeToPatternIdxToConfig[Y],R=this.patternIdxToConfig[Y],M=R.length,M=R.length;let le=this.canModeBeOptimized[Y]&&this.config.safeMode===!1;P&&le?G=V:G=$}o(Q,"push_mode"),Q.call(this,r);let H,ie=this.config.recoveryEnabled;for(;wu.length){u=s,h=f,H=xe;break}}}break}}if(u!==null){if(d=u.length,p=H.group,p!==void 0&&(m=H.tokenTypeIdx,g=this.createTokenInstance(u,w,m,H.tokenType,I,N,d),this.handlePayload(g,h),p===!1?k=this.addToken(A,k,g):C[p].push(g)),e=this.chopInput(e,d),w=w+d,N=this.computeNewColumn(N,d),_===!0&&H.canLineTerminator===!0){let J=0,te,Z;D.lastIndex=0;do te=D.test(u),te===!0&&(Z=D.lastIndex-1,J++);while(te===!0);J!==0&&(I=I+J,N=d-Z,this.updateTokenEndLineColumnLocation(g,p,Z,J,I,N,d))}this.handleModes(H,X,Q,g)}else{let J=w,te=I,Z=N,xe=ie===!1;for(;xe===!1&&w{"use strict";rr();BT();mm();o(Xh,"tokenLabel");o(qF,"hasTokenLabel");Nrt="parent",K1e="categories",Q1e="label",Z1e="group",J1e="push_mode",eye="pop_mode",tye="longer_alt",rye="line_breaks",nye="start_chars_hint";o(Ud,"createToken");o(Mrt,"createTokenInternal");el=Ud({name:"EOF",pattern:fi.NA});jh([el]);o(Kh,"createTokenInstance");o($T,"tokenMatcher")});var Qh,iye,Lc,My=O(()=>{"use strict";gm();rr();zs();Qh={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${qF(t)?`--> ${Xh(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",l=` -but found: '`+Ta(e).image+"'";if(n)return a+n+l;{let u=pn(t,(p,m)=>p.concat(m),[]),h=lt(u,p=>`[${lt(p,m=>Xh(m)).join(", ")}]`),d=`one of these possible Token sequences: -${lt(h,(p,m)=>` ${m+1}. ${p}`).join(` -`)}`;return a+d+l}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` -but found: '`+Ta(e).image+"'";if(r)return i+r+s;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: - <${lt(t,h=>`[${lt(h,f=>Xh(f)).join(",")}]`).join(" ,")}>`;return i+u+s}}};Object.freeze(Qh);iye={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+t.name+"<-"}},Lc={buildDuplicateFoundError(t,e){function r(f){return f instanceof Yr?f.terminalType.name:f instanceof Sn?f.nonTerminalName:""}o(r,"getExtraProductionArgument");let n=t.name,i=Ta(e),a=i.idx,s=ko(i),l=r(i),u=a>0,h=`->${s}${u?a:""}<- ${l?`with argument: ->${l}<-`:""} - appears more than once (${e.length} times) in the top level rule: ->${n}<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return h=h.replace(/[ \t]+/g," "),h=h.replace(/\s\s+/g,` -`),h},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. -The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. -To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=lt(t.prefixPath,i=>Xh(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix -in inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`},buildAlternationAmbiguityError(t){let e=lt(t.prefixPath,i=>Xh(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,n},buildEmptyRepetitionError(t){let e=ko(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. -This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. -Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: - inside <${t.topLevelRule.name}> Rule. - has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=lt(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. -rule: <${e}> can be invoked from itself (directly or indirectly) -without consuming any Tokens. The grammar path that causes this is: - ${n} - To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof Fs?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function aye(t,e){let r=new UF(t,e);return r.resolveRefs(),r.errors}var UF,sye=O(()=>{"use strict";Eo();rr();zs();o(aye,"resolveGrammar");UF=class extends $s{static{o(this,"GastRefResolverVisitor")}constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Oe(Gr(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:la.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function m6(t,e,r=[]){r=Tn(r);let n=[],i=0;function a(l){return l.concat(Pi(t,i+1))}o(a,"remainingPathWith");function s(l){let u=m6(a(l),e,r);return n.concat(u)}for(o(s,"getAlternativesForProd");r.length{Er(u.definition)===!1&&(n=s(u.definition))}),n;if(l instanceof Yr)r.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:Pi(t,i)}),n}function g6(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",l=!1,u=e.length,h=u-n-1,f=[],d=[];for(d.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!Er(d);){let p=d.pop();if(p===s){l&&ba(d).idx<=h&&d.pop();continue}let m=p.def,g=p.idx,y=p.ruleStack,v=p.occurrenceStack;if(Er(m))continue;let x=m[0];if(x===i){let b={idx:g,def:Pi(m),ruleStack:Nh(y),occurrenceStack:Nh(v)};d.push(b)}else if(x instanceof Yr)if(g=0;b--){let T=x.definition[b],E={idx:g,def:T.definition.concat(Pi(m)),ruleStack:y,occurrenceStack:v};d.push(E),d.push(s)}else if(x instanceof Yn)d.push({idx:g,def:x.definition.concat(Pi(m)),ruleStack:y,occurrenceStack:v});else if(x instanceof Fs)d.push(Irt(x,g,y,v));else throw Error("non exhaustive match")}return f}function Irt(t,e,r,n){let i=Tn(r);i.push(t.name);let a=Tn(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var WF,f6,Iy,d6,zT,p6,GT,VT=O(()=>{"use strict";rr();NF();i6();zs();WF=class extends Hh{static{o(this,"AbstractNextPossibleTokensWalker")}constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=Tn(this.path.ruleStack).reverse(),this.occurrenceStack=Tn(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){Er(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},f6=class extends WF{static{o(this,"NextAfterTokenWalker")}constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new Yn({definition:i});this.possibleTokTypes=dm(a),this.found=!0}}},Iy=class extends Hh{static{o(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},d6=class extends Iy{static{o(this,"NextTerminalAfterManyWalker")}walkMany(e,r,n){if(e.idx===this.occurrence){let i=Ta(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Yr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},zT=class extends Iy{static{o(this,"NextTerminalAfterManySepWalker")}walkManySep(e,r,n){if(e.idx===this.occurrence){let i=Ta(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Yr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},p6=class extends Iy{static{o(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=Ta(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Yr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},GT=class extends Iy{static{o(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=Ta(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Yr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};o(m6,"possiblePathsFrom");o(g6,"nextPossibleTokensAfter");o(Irt,"expandTopLevelRule")});function qT(t){if(t instanceof Cn||t==="Option")return di.OPTION;if(t instanceof Jr||t==="Repetition")return di.REPETITION;if(t instanceof jn||t==="RepetitionMandatory")return di.REPETITION_MANDATORY;if(t instanceof Xn||t==="RepetitionMandatoryWithSeparator")return di.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof zn||t==="RepetitionWithSeparator")return di.REPETITION_WITH_SEPARATOR;if(t instanceof Gn||t==="Alternation")return di.ALTERNATION;throw Error("non exhaustive match")}function v6(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=qT(n);return a===di.ALTERNATION?Oy(e,r,i):Py(e,r,a,i)}function lye(t,e,r,n,i,a){let s=Oy(t,e,r),l=pye(s)?Ly:Yh;return a(s,n,l,i)}function cye(t,e,r,n,i,a){let s=Py(t,e,i,r),l=pye(s)?Ly:Yh;return a(s[0],l,n)}function uye(t,e,r,n){let i=t.length,a=is(t,s=>is(s,l=>l.length===1));if(e)return function(s){let l=lt(s,u=>u.GATE);for(let u=0;ufn(u)),l=pn(s,(u,h,f)=>(Oe(h,d=>{Gt(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),Oe(d.categoryMatches,p=>{Gt(u,p)||(u[p]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=fn(t);if(a.length===1&&Er(a[0].categoryMatches)){let l=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let s=pn(a,(l,u,h)=>(l[u.tokenTypeIdx]=!0,Oe(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return s[l.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;am6([s],1)),n=oye(r.length),i=lt(r,s=>{let l={};return Oe(s,u=>{let h=HF(u.partialPath);Oe(h,f=>{l[f]=!0})}),l}),a=r;for(let s=1;s<=e;s++){let l=a;a=oye(l.length);for(let u=0;u{let x=HF(v.partialPath);Oe(x,b=>{i[u][b]=!0})})}}}}return n}function Oy(t,e,r,n){let i=new y6(t,di.ALTERNATION,n);return e.accept(i),fye(i.result,r)}function Py(t,e,r,n){let i=new y6(t,r);e.accept(i);let a=i.result,l=new YF(e,t,r).startWalking(),u=new Yn({definition:a}),h=new Yn({definition:l});return fye([u,h],n)}function x6(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function pye(t){return is(t,e=>is(e,r=>is(r,n=>Er(n.categoryMatches))))}var di,YF,y6,By=O(()=>{"use strict";rr();VT();i6();mm();zs();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(di||(di={}));o(qT,"getProdType");o(v6,"getLookaheadPaths");o(lye,"buildLookaheadFuncForOr");o(cye,"buildLookaheadFuncForOptionalProd");o(uye,"buildAlternativesLookAheadFunc");o(hye,"buildSingleAlternativeLookaheadFunction");YF=class extends Hh{static{o(this,"RestDefinitionFinderWalker")}constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,di.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,di.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,di.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,di.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,di.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},y6=class extends $s{static{o(this,"InsideDefinitionFinderVisitor")}constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,di.OPTION)}visitRepetition(e){this.checkIsTarget(e,di.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,di.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,di.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,di.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,di.ALTERNATION)}};o(oye,"initializeArrayOfArrays");o(HF,"pathToHashKeys");o(Ort,"isUniquePrefixHash");o(fye,"lookAheadSequenceFromAlternatives");o(Oy,"getLookaheadPathsForOr");o(Py,"getLookaheadPathsForOptionalProd");o(x6,"containsPath");o(dye,"isStrictPrefixOfPath");o(pye,"areTokenCategoriesNotUsed")});function mye(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return lt(e,r=>Object.assign({type:la.CUSTOM_LOOKAHEAD_VALIDATION},r))}function gye(t,e,r,n){let i=za(t,u=>Prt(u,r)),a=Vrt(t,e,r),s=za(t,u=>$rt(u,r)),l=za(t,u=>Frt(u,t,n,r));return i.concat(a,s,l)}function Prt(t,e){let r=new jF;t.accept(r);let n=r.allProductions,i=bI(n,Brt),a=go(i,l=>l.length>1);return lt(Gr(a),l=>{let u=Ta(l),h=e.buildDuplicateFoundError(t,l),f=ko(u),d={message:h,type:la.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:f,occurrence:u.idx},p=yye(u);return p&&(d.parameter=p),d})}function Brt(t){return`${ko(t)}_#_${t.idx}_#_${yye(t)}`}function yye(t){return t instanceof Yr?t.terminalType.name:t instanceof Sn?t.nonTerminalName:""}function Frt(t,e,r,n){let i=[];if(pn(e,(s,l)=>l.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:la.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function vye(t,e,r){let n=[],i;return ci(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:la.INVALID_RULE_OVERRIDE,ruleName:t})),n}function KF(t,e,r,n=[]){let i=[],a=b6(e.definition);if(Er(a))return[];{let s=t.name;ci(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:la.LEFT_RECURSION,ruleName:s});let u=sd(a,n.concat([t])),h=za(u,f=>{let d=Tn(n);return d.push(f),KF(t,f,r,d)});return i.concat(h)}}function b6(t){let e=[];if(Er(t))return e;let r=Ta(t);if(r instanceof Sn)e.push(r.referencedRule);else if(r instanceof Yn||r instanceof Cn||r instanceof jn||r instanceof Xn||r instanceof zn||r instanceof Jr)e=e.concat(b6(r.definition));else if(r instanceof Gn)e=fn(lt(r.definition,a=>b6(a.definition)));else if(!(r instanceof Yr))throw Error("non exhaustive match");let n=fm(r),i=t.length>1;if(n&&i){let a=Pi(t);return e.concat(b6(a))}else return e}function xye(t,e){let r=new UT;t.accept(r);let n=r.alternations;return za(n,a=>{let s=Nh(a.definition);return za(s,(l,u)=>{let h=g6([l],[],Yh,1);return Er(h)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:u}),type:la.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:u+1}]:[]})})}function bye(t,e,r){let n=new UT;t.accept(n);let i=n.alternations;return i=od(i,s=>s.ignoreAmbiguities===!0),za(i,s=>{let l=s.idx,u=s.maxLookahead||e,h=Oy(l,t,u,s),f=zrt(h,s,t,r),d=Grt(h,s,t,r);return f.concat(d)})}function $rt(t,e){let r=new UT;t.accept(r);let n=r.alternations;return za(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:la.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function Tye(t,e,r){let n=[];return Oe(t,i=>{let a=new XF;i.accept(a);let s=a.allProductions;Oe(s,l=>{let u=qT(l),h=l.maxLookahead||e,f=l.idx,p=Py(f,i,u,h)[0];if(Er(fn(p))){let m=r.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:m,type:la.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function zrt(t,e,r,n){let i=[],a=pn(t,(l,u,h)=>(e.definition[h].ignoreAmbiguities===!0||Oe(u,f=>{let d=[h];Oe(t,(p,m)=>{h!==m&&x6(p,f)&&e.definition[m].ignoreAmbiguities!==!0&&d.push(m)}),d.length>1&&!x6(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return lt(a,l=>{let u=lt(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:la.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:l.alts}})}function Grt(t,e,r,n){let i=pn(t,(s,l,u)=>{let h=lt(l,f=>({idx:u,path:f}));return s.concat(h)},[]);return xu(za(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let u=s.idx,h=s.path,f=dn(i,p=>e.definition[p.idx].ignoreAmbiguities!==!0&&p.idx{let m=[p.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:m,prefixPath:p.path}),type:la.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:m}})}))}function Vrt(t,e,r){let n=[],i=lt(e,a=>a.name);return Oe(t,a=>{let s=a.name;if(ci(i,s)){let l=r.buildNamespaceConflictError(a);n.push({message:l,type:la.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var jF,UT,XF,WT=O(()=>{"use strict";rr();Eo();zs();By();VT();mm();o(mye,"validateLookahead");o(gye,"validateGrammar");o(Prt,"validateDuplicateProductions");o(Brt,"identifyProductionForDuplicates");o(yye,"getExtraProductionArgument");jF=class extends $s{static{o(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};o(Frt,"validateRuleDoesNotAlreadyExist");o(vye,"validateRuleIsOverridden");o(KF,"validateNoLeftRecursion");o(b6,"getFirstNoneTerminal");UT=class extends $s{static{o(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};o(xye,"validateEmptyOrAlternative");o(bye,"validateAmbiguousAlternationAlternatives");XF=class extends $s{static{o(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};o($rt,"validateTooManyAlts");o(Tye,"validateSomeNonEmptyLookaheadPath");o(zrt,"checkAlternativesAmbiguities");o(Grt,"checkPrefixAlternativesAmbiguities");o(Vrt,"checkTerminalAndNoneTerminalsNameSpace")});function wye(t){let e=ad(t,{errMsgProvider:iye}),r={};return Oe(t.rules,n=>{r[n.name]=n}),aye(r,e.errMsgProvider)}function kye(t){return t=ad(t,{errMsgProvider:Lc}),gye(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var Eye=O(()=>{"use strict";rr();sye();WT();My();o(wye,"resolveGrammar");o(kye,"validateGrammar")});function Wd(t){return ci(Dye,t.name)}var Sye,Cye,Aye,_ye,Dye,Fy,ym,HT,YT,jT,$y=O(()=>{"use strict";rr();Sye="MismatchedTokenException",Cye="NoViableAltException",Aye="EarlyExitException",_ye="NotAllInputParsedException",Dye=[Sye,Cye,Aye,_ye];Object.freeze(Dye);o(Wd,"isRecognitionException");Fy=class extends Error{static{o(this,"RecognitionException")}constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},ym=class extends Fy{static{o(this,"MismatchedTokenException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Sye}},HT=class extends Fy{static{o(this,"NoViableAltException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Cye}},YT=class extends Fy{static{o(this,"NotAllInputParsedException")}constructor(e,r){super(e,r),this.name=_ye}},jT=class extends Fy{static{o(this,"EarlyExitException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Aye}}});function qrt(t,e,r,n,i,a,s){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let p=this.getCurrRuleFullName(),m=this.getGAstProductions()[p];u=new a(m,i).startWalking(),this.firstAfterRepMap[l]=u}let h=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=el,f=1),!(h===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(h,f,s)&&this.tryInRepetitionRecovery(t,e,r,h)}var QF,JF,ZF,T6,e$=O(()=>{"use strict";gm();rr();$y();MF();Eo();QF={},JF="InRuleRecoveryException",ZF=class extends Error{static{o(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=JF}},T6=class{static{o(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=Gt(e,"recoveryEnabled")?e.recoveryEnabled:Gs.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=qrt)}getTokenToInsert(e){let r=Kh(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),l=[],u=!1,h=this.LA(1),f=this.LA(1),d=o(()=>{let p=this.LA(0),m=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:h,previous:p,ruleName:this.getCurrRuleFullName()}),g=new ym(m,h,this.LA(0));g.resyncedTokens=Nh(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,r);return}else this.tokenMatcher(f,a)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new ZF("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||Er(r))return!1;let n=this.LA(1);return Ls(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return ci(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=Ls(e,a=>$T(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return QF;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return lt(e,(n,i)=>i===0?QF:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=lt(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return fn(e)}getFollowSetFromFollowKey(e){if(e===QF)return[el];let r=e.ruleName+e.idxInCallingRule+a6+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,el)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return Nh(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,l){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=Tn(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return lt(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};o(qrt,"attemptInRepetitionRecovery")});function w6(t,e,r){return r|e|t}var k6=O(()=>{"use strict";o(w6,"getKeyForAutomaticLookahead")});var Zh,t$=O(()=>{"use strict";rr();My();Eo();WT();By();Zh=class{static{o(this,"LLkLookaheadStrategy")}constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:Gs.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(Er(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return za(e,r=>KF(r,r,Lc))}validateEmptyOrAlternatives(e){return za(e,r=>xye(r,Lc))}validateAmbiguousAlternationAlternatives(e,r){return za(e,n=>bye(n,r,Lc))}validateSomeNonEmptyLookaheadPath(e,r){return Tye(e,r,Lc)}buildLookaheadForAlternation(e){return lye(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,uye)}buildLookaheadForOptional(e){return cye(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,qT(e.prodType),hye)}}});function Urt(t){E6.reset(),t.accept(E6);let e=E6.dslMethods;return E6.reset(),e}var S6,r$,E6,Rye=O(()=>{"use strict";rr();Eo();k6();zs();t$();S6=class{static{o(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=Gt(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Gs.dynamicTokensEnabled,this.maxLookahead=Gt(e,"maxLookahead")?e.maxLookahead:Gs.maxLookahead,this.lookaheadStrategy=Gt(e,"lookaheadStrategy")?e.lookaheadStrategy:new Zh({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Oe(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=Urt(r);Oe(n,h=>{let f=h.idx===0?"":h.idx;this.TRACE_INIT(`${ko(h)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:h.idx,rule:r,maxLookahead:h.maxLookahead||this.maxLookahead,hasPredicates:h.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),p=w6(this.fullRuleNameToShort[r.name],256,h.idx);this.setLaFuncCache(p,d)})}),Oe(i,h=>{this.computeLookaheadFunc(r,h.idx,768,"Repetition",h.maxLookahead,ko(h))}),Oe(a,h=>{this.computeLookaheadFunc(r,h.idx,512,"Option",h.maxLookahead,ko(h))}),Oe(s,h=>{this.computeLookaheadFunc(r,h.idx,1024,"RepetitionMandatory",h.maxLookahead,ko(h))}),Oe(l,h=>{this.computeLookaheadFunc(r,h.idx,1536,"RepetitionMandatoryWithSeparator",h.maxLookahead,ko(h))}),Oe(u,h=>{this.computeLookaheadFunc(r,h.idx,1280,"RepetitionWithSeparator",h.maxLookahead,ko(h))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=w6(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return w6(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},r$=class extends $s{static{o(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},E6=new r$;o(Urt,"collectMethods")});function a$(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";o(a$,"setNodeLocationOnlyOffset");o(s$,"setNodeLocationFull");o(Lye,"addTerminalToCst");o(Nye,"addNoneTerminalToCst")});function o$(t,e){Object.defineProperty(t,Wrt,{enumerable:!1,configurable:!0,writable:!1,value:e})}var Wrt,Iye=O(()=>{"use strict";Wrt="name";o(o$,"defineNameProp")});function Hrt(t,e){let r=nn(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: - ${a.join(` - -`).replace(/\n/g,` - `)}`)}},"validateVisitor")};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function Pye(t,e,r){let n=o(function(){},"derivedConstructor");o$(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Oe(e,a=>{i[a]=Hrt}),n.prototype=i,n.prototype.constructor=n,n}function Yrt(t,e){return jrt(t,e)}function jrt(t,e){let r=dn(e,i=>Vi(t[i])===!1),n=lt(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:l$.MISSING_METHOD,methodName:i}));return xu(n)}var l$,Bye=O(()=>{"use strict";rr();Iye();o(Hrt,"defaultVisit");o(Oye,"createBaseSemanticVisitorConstructor");o(Pye,"createBaseVisitorConstructorWithDefaults");(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(l$||(l$={}));o(Yrt,"validateVisitor");o(jrt,"validateMissingCstMethods")});var D6,Fye=O(()=>{"use strict";Mye();rr();Bye();Eo();D6=class{static{o(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=Gt(e,"nodeLocationTracking")?e.nodeLocationTracking:Gs.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ki,this.cstFinallyStateUpdate=ki,this.cstPostTerminal=ki,this.cstPostNonTerminal=ki,this.cstPostRule=ki;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=s$,this.setNodeLocationFromNode=s$,this.cstPostRule=ki,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ki,this.setNodeLocationFromNode=ki,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=a$,this.setNodeLocationFromNode=a$,this.cstPostRule=ki,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ki,this.setNodeLocationFromNode=ki,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ki,this.setNodeLocationFromNode=ki,this.cstPostRule=ki,this.setInitialNodeLocation=ki;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];Lye(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];Nye(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(Dr(this.baseCstVisitorConstructor)){let e=Oye(this.className,nn(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(Dr(this.baseCstVisitorWithDefaultsConstructor)){let e=Pye(this.className,nn(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var R6,$ye=O(()=>{"use strict";Eo();R6=class{static{o(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):zy}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?zy:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var L6,zye=O(()=>{"use strict";rr();$y();Eo();My();WT();zs();L6=class{static{o(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=Gy){if(ci(this.definedRulesNames,e)){let s={message:Lc.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:la.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=Gy){let i=vye(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(Wd(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return r6(Gr(this.gastProductionsCache))}}});var N6,Gye=O(()=>{"use strict";rr();k6();$y();By();VT();Eo();e$();gm();mm();N6=class{static{o(this,"RecognizerEngine")}initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Ly,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},Gt(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if(zt(e)){if(Er(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if(zt(e))this.tokensMap=pn(e,(a,s)=>(a[s.name]=s,a),{});else if(Gt(e,"modes")&&is(fn(Gr(e.modes)),X1e)){let a=fn(Gr(e.modes)),s=P1(a);this.tokensMap=pn(s,(l,u)=>(l[u.name]=u,l),{})}else if(On(e))this.tokensMap=Tn(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=el;let n=Gt(e,"modes")?fn(Gr(e.modes)):Gr(e),i=is(n,a=>Er(a.categoryMatches));this.tokenMatcher=i?Ly:Yh,jh(Gr(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=Gt(n,"resyncEnabled")?n.resyncEnabled:Gy.resyncEnabled,a=Gt(n,"recoveryValueFunc")?n.recoveryValueFunc:Gy.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let l;return this.outputCst===!0?l=o(function(...f){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=o(function(...f){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(Wd(e)){let s=e;if(a){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(s.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,s.partialCstResult=u}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,di.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,p6)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,GT],l,1536,e,GT)}else throw this.raiseEarlyExitException(e,di.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let l=r.GATE;if(l!==void 0){let u=i;i=o(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,d6,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,zT],l,1280,e,zT)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=zt(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new YT(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw Wd(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new ym(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===JF?n:a}}else throw n}saveRecogState(){let e=this.errors,r=Tn(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),el)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var M6,Vye=O(()=>{"use strict";$y();rr();By();Eo();M6=class{static{o(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=Gt(e,"errorMessageProvider")?e.errorMessageProvider:Gs.errorMessageProvider}SAVE_ERROR(e){if(Wd(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:Tn(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return Tn(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],l=Py(e,a,r,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let h=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new jT(h,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=Oy(e,i,this.maxLookahead),s=[];for(let h=1;h<=this.maxLookahead;h++)s.push(this.LA(h));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new HT(u,this.LA(1),l))}}});var I6,qye=O(()=>{"use strict";VT();rr();I6=class{static{o(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(Dr(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return g6([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=Ta(e.ruleStack),i=this.getGAstProductions()[r];return new f6(i,e).startWalking()}}});function KT(t,e,r,n=!1){P6(r);let i=ba(this.recordingProdStack),a=Vi(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),Gt(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),B6}function Qrt(t,e){P6(e);let r=ba(this.recordingProdStack),n=zt(t)===!1,i=n===!1?t:t.DEF,a=new Gn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});Gt(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=wb(i,l=>Vi(l.GATE));return a.hasPredicates=s,r.definition.push(a),Oe(i,l=>{let u=new Yn({definition:[]});a.definition.push(u),Gt(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:Gt(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),B6}function Hye(t){return t===0?"":`${t}`}function P6(t){if(t<0||t>Wye){let e=new Error(`Invalid DSL Method idx value: <${t}> - Idx value must be a none negative value smaller than ${Wye+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var B6,Uye,Wye,Yye,jye,Krt,O6,Xye=O(()=>{"use strict";rr();zs();BT();mm();gm();Eo();k6();B6={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(B6);Uye=!0,Wye=Math.pow(2,8)-1,Yye=Ud({name:"RECORDING_PHASE_TOKEN",pattern:fi.NA});jh([Yye]);jye=Kh(Yye,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(jye);Krt={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},O6=class{static{o(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return zy}topLevelRuleRecord(e,r){try{let n=new Fs({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return KT.call(this,Cn,e,r)}atLeastOneInternalRecord(e,r){KT.call(this,jn,r,e)}atLeastOneSepFirstInternalRecord(e,r){KT.call(this,Xn,r,e,Uye)}manyInternalRecord(e,r){KT.call(this,Jr,r,e)}manySepFirstInternalRecord(e,r){KT.call(this,zn,r,e,Uye)}orInternalRecord(e,r){return Qrt.call(this,e,r)}subruleInternalRecord(e,r,n){if(P6(r),!e||Gt(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> - inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=ba(this.recordingProdStack),a=e.ruleName,s=new Sn({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?Krt:B6}consumeInternalRecord(e,r,n){if(P6(r),!GF(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> - inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=ba(this.recordingProdStack),a=new Yr({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),jye}};o(KT,"recordProd");o(Qrt,"recordOrProd");o(Hye,"getIdxSuffix");o(P6,"assertMethodIdxIsValid")});var F6,Kye=O(()=>{"use strict";rr();Cy();Eo();F6=class{static{o(this,"PerformanceTracer")}initPerformanceTracer(e){if(Gt(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=Gs.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=IT(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function Qye(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var Zye=O(()=>{"use strict";o(Qye,"applyMixins")});function $6(t=void 0){return function(){return t}}var zy,Gs,Gy,la,QT,ZT,Eo=O(()=>{"use strict";rr();Cy();_1e();gm();My();Eye();e$();Rye();Fye();$ye();zye();Gye();Vye();qye();Xye();Kye();Zye();WT();zy=Kh(el,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(zy);Gs=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Qh,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),Gy=Object.freeze({recoveryValueFunc:o(()=>{},"recoveryValueFunc"),resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(la||(la={}));o($6,"EMPTY_ALT");QT=class t{static{o(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{OT(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Oe(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=wye({rules:Gr(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(Er(n)&&this.skipValidations===!1){let i=kye({rules:Gr(this.gastProductionsCache),tokenTypes:Gr(this.tokensMap),errMsgProvider:Lc,grammarName:r}),a=mye({lookaheadStrategy:this.lookaheadStrategy,rules:Gr(this.gastProductionsCache),tokenTypes:Gr(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),Er(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=A1e(Gr(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:Gr(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(Gr(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!Er(this.definitionErrors))throw e=lt(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: - ${e.join(` -------------------------------- -`)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),Gt(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=Gt(r,"skipValidations")?r.skipValidations:Gs.skipValidations}};QT.DEFER_DEFINITION_ERRORS_HANDLING=!1;Qye(QT,[T6,S6,D6,R6,N6,L6,M6,I6,O6,F6]);ZT=class extends QT{static{o(this,"EmbeddedActionsParser")}constructor(e,r=Gs){let n=Tn(r);n.outputCst=!1,super(e,n)}}});var Jye=O(()=>{"use strict";zs()});var eve=O(()=>{"use strict"});var tve=O(()=>{"use strict";Jye();eve()});var rve=O(()=>{"use strict";DF()});var Hd=O(()=>{"use strict";DF();Eo();BT();gm();By();t$();My();$y();VF();zs();zs();tve();rve()});function vm(t,e,r){return`${t.name}_${e}_${r}`}function sve(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};int(e,t);let r=t.length;for(let n=0;nove(t,e,s));return Wy(t,e,n,r,...i)}function unt(t,e,r){let n=Ca(t,e,r,{type:Yd});jd(t,n);let i=Wy(t,e,n,r,xm(t,e,r));return hnt(t,e,r,i)}function xm(t,e,r){let n=dn(lt(r.definition,i=>ove(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:dnt(t,n)}function lve(t,e,r,n,i){let a=n.left,s=n.right,l=Ca(t,e,r,{type:nnt});jd(t,l);let u=Ca(t,e,r,{type:ave});return a.loopback=l,u.loopback=l,t.decisionMap[vm(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=l,Hi(s,l),i===void 0?(Hi(l,a),Hi(l,u)):(Hi(l,u),Hi(l,i.left),Hi(i.right,a)),{left:a,right:u}}function cve(t,e,r,n,i){let a=n.left,s=n.right,l=Ca(t,e,r,{type:rnt});jd(t,l);let u=Ca(t,e,r,{type:ave}),h=Ca(t,e,r,{type:tnt});return l.loopback=h,u.loopback=h,Hi(l,a),Hi(l,u),Hi(s,h),i!==void 0?(Hi(h,u),Hi(h,i.left),Hi(i.right,a)):Hi(h,l),t.decisionMap[vm(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=l,{left:l,right:u}}function hnt(t,e,r,n){let i=n.left,a=n.right;return Hi(i,a),t.decisionMap[vm(e,"Option",r.idx)]=i,n}function jd(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function Wy(t,e,r,n,...i){let a=Ca(t,e,n,{type:ent,start:r});r.end=a;for(let l of i)l!==void 0?(Hi(r,l.left),Hi(l.right,a)):Hi(r,a);let s={left:r,right:a};return t.decisionMap[vm(e,fnt(n),n.idx)]=r,s}function fnt(t){if(t instanceof Gn)return"Alternation";if(t instanceof Cn)return"Option";if(t instanceof Jr)return"Repetition";if(t instanceof zn)return"RepetitionWithSeparator";if(t instanceof jn)return"RepetitionMandatory";if(t instanceof Xn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function dnt(t,e){let r=e.length;for(let a=0;a{"use strict";M1();mI();Hd();o(vm,"buildATNKey");Yd=1,Jrt=2,nve=4,ive=5,Uy=7,ent=8,tnt=9,rnt=10,nnt=11,ave=12,JT=class{static{o(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},Vy=class extends JT{static{o(this,"AtomTransition")}constructor(e,r){super(e),this.tokenType=r}},e4=class extends JT{static{o(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},qy=class extends JT{static{o(this,"RuleTransition")}constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};o(sve,"createATN");o(int,"createRuleStartAndStopATNStates");o(ove,"atom");o(ant,"repetition");o(snt,"repetitionSep");o(ont,"repetitionMandatory");o(lnt,"repetitionMandatorySep");o(cnt,"alternation");o(unt,"option");o(xm,"block");o(lve,"plus");o(cve,"star");o(hnt,"optional");o(jd,"defineDecisionState");o(Wy,"makeAlts");o(fnt,"getProdType");o(dnt,"makeBlock");o(u$,"tokenRef");o(pnt,"ruleRef");o(mnt,"buildRuleHandle");o(Hi,"epsilon");o(Ca,"newState");o(h$,"addTransition");o(gnt,"removeState")});function f$(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var t4,Hy,hve=O(()=>{"use strict";M1();t4={},Hy=class{static{o(this,"ATNConfigSet")}constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=f$(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return lt(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};o(f$,"getATNConfigKey")});function ynt(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function dve(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let l of s)if(r.has(l)){if(!i.has(l))return!1}else r.add(l),i.add(l)}}return!0}function vnt(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nXh(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${knt(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,n}function knt(t){if(t instanceof Sn)return"SUBRULE";if(t instanceof Cn)return"OPTION";if(t instanceof Gn)return"OR";if(t instanceof jn)return"AT_LEAST_ONE";if(t instanceof Xn)return"AT_LEAST_ONE_SEP";if(t instanceof zn)return"MANY_SEP";if(t instanceof Jr)return"MANY";if(t instanceof Yr)return"CONSUME";throw Error("non exhaustive match")}function Ent(t,e,r){let n=za(e.configs.elements,a=>a.state.transitions),i=phe(n.filter(a=>a instanceof Vy).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function Snt(t,e){return t.edges[e.tokenTypeIdx]}function Cnt(t,e,r){let n=new Hy,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===Uy){i.push(s);continue}let l=s.state.transitions.length;for(let u=0;u0&&!Lnt(a))for(let s of i)a.add(s);return a}function Ant(t,e){if(t instanceof Vy&&$T(e,t.tokenType))return t.target}function _nt(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function mve(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function pve(t,e,r,n){return n=gve(t,n),e.edges[r.tokenTypeIdx]=n,n}function gve(t,e){if(e===t4)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function Dnt(t){let e=new Hy,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};G6(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function Pnt(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var z6,fve,r4,yve=O(()=>{"use strict";Hd();uve();hve();kI();yI();mhe();M1();AE();rS();oS();AI();o(ynt,"createDFACache");z6=class{static{o(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n))}initialize(e){this.atn=sve(e.rules),this.dfas=vnt(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,l=this.logging,u=vm(n,"Alternation",r),f=this.atn.decisionMap[u].decision,d=lt(v6({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),p=>lt(p,m=>m[0]));if(dve(d,!1)&&!a){let p=pn(d,(m,g,y)=>(Oe(g,v=>{v&&(m[v.tokenTypeIdx]=y,Oe(v.categoryMatches,x=>{m[x]=y}))}),m),{});return i?function(m){var g;let y=this.LA(1),v=p[y.tokenTypeIdx];if(m!==void 0&&v!==void 0){let x=(g=m[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let m=this.LA(1);return p[m.tokenTypeIdx]}}else return i?function(p){let m=new z6,g=p===void 0?0:p.length;for(let v=0;vlt(p,m=>m[0]));if(dve(d)&&d[0][0]&&!a){let p=d[0],m=fn(p);if(m.length===1&&Er(m[0].categoryMatches)){let y=m[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=pn(m,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,Oe(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let p=d$.call(this,s,f,fve,l);return typeof p=="object"?!1:p===0}}};o(dve,"isLL1Sequence");o(vnt,"initATNSimulator");o(d$,"adaptivePredict");o(xnt,"performLookahead");o(bnt,"computeLookaheadTarget");o(Tnt,"reportLookaheadAmbiguity");o(wnt,"buildAmbiguityError");o(knt,"getProductionDslName");o(Ent,"buildAdaptivePredictError");o(Snt,"getExistingTargetState");o(Cnt,"computeReachSet");o(Ant,"getReachableTarget");o(_nt,"getUniqueAlt");o(mve,"newDFAState");o(pve,"addDFAEdge");o(gve,"addDFAState");o(Dnt,"computeStartState");o(G6,"closure");o(Rnt,"getEpsilonTarget");o(Lnt,"hasConfigInRuleStopState");o(Nnt,"allConfigsInRuleStopStates");o(Mnt,"hasConflictTerminatingPrediction");o(Int,"getConflictingAltSets");o(Ont,"hasConflictingAltSet");o(Pnt,"hasStateAssociatedWithOneAlt")});var vve=O(()=>{"use strict";yve()});var K6={};vr(K6,{AnnotatedTextEdit:()=>Jh,ChangeAnnotation:()=>bm,ChangeAnnotationIdentifier:()=>Wa,CodeAction:()=>j$,CodeActionContext:()=>Y$,CodeActionKind:()=>H$,CodeActionTriggerKind:()=>c4,CodeDescription:()=>k$,CodeLens:()=>X$,Color:()=>q6,ColorInformation:()=>y$,ColorPresentation:()=>v$,Command:()=>Tm,CompletionItem:()=>I$,CompletionItemKind:()=>_$,CompletionItemLabelDetails:()=>M$,CompletionItemTag:()=>R$,CompletionList:()=>O$,CreateFile:()=>jy,DeleteFile:()=>Ky,Diagnostic:()=>a4,DiagnosticRelatedInformation:()=>U6,DiagnosticSeverity:()=>T$,DiagnosticTag:()=>w$,DocumentHighlight:()=>z$,DocumentHighlightKind:()=>$$,DocumentLink:()=>Q$,DocumentSymbol:()=>W$,DocumentUri:()=>p$,EOL:()=>Bnt,FoldingRange:()=>b$,FoldingRangeKind:()=>x$,FormattingOptions:()=>K$,Hover:()=>P$,InlayHint:()=>sz,InlayHintKind:()=>j6,InlayHintLabelPart:()=>X6,InlineCompletionContext:()=>fz,InlineCompletionItem:()=>lz,InlineCompletionList:()=>cz,InlineCompletionTriggerKind:()=>uz,InlineValueContext:()=>az,InlineValueEvaluatableExpression:()=>iz,InlineValueText:()=>rz,InlineValueVariableLookup:()=>nz,InsertReplaceEdit:()=>L$,InsertTextFormat:()=>D$,InsertTextMode:()=>N$,Location:()=>i4,LocationLink:()=>g$,MarkedString:()=>l4,MarkupContent:()=>Qy,MarkupKind:()=>Y6,OptionalVersionedTextDocumentIdentifier:()=>o4,ParameterInformation:()=>B$,Position:()=>on,Range:()=>Kr,RenameFile:()=>Xy,SelectedCompletionInfo:()=>hz,SelectionRange:()=>Z$,SemanticTokenModifiers:()=>ez,SemanticTokenTypes:()=>J$,SemanticTokens:()=>tz,SignatureInformation:()=>F$,StringValue:()=>oz,SymbolInformation:()=>q$,SymbolKind:()=>G$,SymbolTag:()=>V$,TextDocument:()=>pz,TextDocumentEdit:()=>s4,TextDocumentIdentifier:()=>S$,TextDocumentItem:()=>A$,TextEdit:()=>Fu,URI:()=>V6,VersionedTextDocumentIdentifier:()=>C$,WorkspaceChange:()=>E$,WorkspaceEdit:()=>W6,WorkspaceFolder:()=>dz,WorkspaceSymbol:()=>U$,integer:()=>m$,uinteger:()=>n4});var p$,V6,m$,n4,on,Kr,i4,g$,q6,y$,v$,x$,b$,U6,T$,w$,k$,a4,Tm,Fu,bm,Wa,Jh,s4,jy,Xy,Ky,W6,Yy,H6,E$,S$,C$,o4,A$,Y6,Qy,_$,D$,R$,L$,N$,M$,I$,O$,l4,P$,B$,F$,$$,z$,G$,V$,q$,U$,W$,H$,c4,Y$,j$,X$,K$,Q$,Z$,J$,ez,tz,rz,nz,iz,az,j6,X6,sz,oz,lz,cz,uz,hz,fz,dz,Bnt,pz,mz,Ye,Zy=O(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(p$||(p$={}));(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(V6||(V6={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(m$||(m$={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(n4||(n4={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=n4.MAX_VALUE),i===Number.MAX_VALUE&&(i=n4.MAX_VALUE),{line:n,character:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Ye.uinteger(i.line)&&Ye.uinteger(i.character)}o(r,"is"),t.is=r})(on||(on={}));(function(t){function e(n,i,a,s){if(Ye.uinteger(n)&&Ye.uinteger(i)&&Ye.uinteger(a)&&Ye.uinteger(s))return{start:on.create(n,i),end:on.create(a,s)};if(on.is(n)&&on.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&on.is(i.start)&&on.is(i.end)}o(r,"is"),t.is=r})(Kr||(Kr={}));(function(t){function e(n,i){return{uri:n,range:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Kr.is(i.range)&&(Ye.string(i.uri)||Ye.undefined(i.uri))}o(r,"is"),t.is=r})(i4||(i4={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Kr.is(i.targetRange)&&Ye.string(i.targetUri)&&Kr.is(i.targetSelectionRange)&&(Kr.is(i.originSelectionRange)||Ye.undefined(i.originSelectionRange))}o(r,"is"),t.is=r})(g$||(g$={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Ye.numberRange(i.red,0,1)&&Ye.numberRange(i.green,0,1)&&Ye.numberRange(i.blue,0,1)&&Ye.numberRange(i.alpha,0,1)}o(r,"is"),t.is=r})(q6||(q6={}));(function(t){function e(n,i){return{range:n,color:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Kr.is(i.range)&&q6.is(i.color)}o(r,"is"),t.is=r})(y$||(y$={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Ye.string(i.label)&&(Ye.undefined(i.textEdit)||Fu.is(i))&&(Ye.undefined(i.additionalTextEdits)||Ye.typedArray(i.additionalTextEdits,Fu.is))}o(r,"is"),t.is=r})(v$||(v$={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(x$||(x$={}));(function(t){function e(n,i,a,s,l,u){let h={startLine:n,endLine:i};return Ye.defined(a)&&(h.startCharacter=a),Ye.defined(s)&&(h.endCharacter=s),Ye.defined(l)&&(h.kind=l),Ye.defined(u)&&(h.collapsedText=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Ye.uinteger(i.startLine)&&Ye.uinteger(i.startLine)&&(Ye.undefined(i.startCharacter)||Ye.uinteger(i.startCharacter))&&(Ye.undefined(i.endCharacter)||Ye.uinteger(i.endCharacter))&&(Ye.undefined(i.kind)||Ye.string(i.kind))}o(r,"is"),t.is=r})(b$||(b$={}));(function(t){function e(n,i){return{location:n,message:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&i4.is(i.location)&&Ye.string(i.message)}o(r,"is"),t.is=r})(U6||(U6={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(T$||(T$={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(w$||(w$={}));(function(t){function e(r){let n=r;return Ye.objectLiteral(n)&&Ye.string(n.href)}o(e,"is"),t.is=e})(k$||(k$={}));(function(t){function e(n,i,a,s,l,u){let h={range:n,message:i};return Ye.defined(a)&&(h.severity=a),Ye.defined(s)&&(h.code=s),Ye.defined(l)&&(h.source=l),Ye.defined(u)&&(h.relatedInformation=u),h}o(e,"create"),t.create=e;function r(n){var i;let a=n;return Ye.defined(a)&&Kr.is(a.range)&&Ye.string(a.message)&&(Ye.number(a.severity)||Ye.undefined(a.severity))&&(Ye.integer(a.code)||Ye.string(a.code)||Ye.undefined(a.code))&&(Ye.undefined(a.codeDescription)||Ye.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&(Ye.string(a.source)||Ye.undefined(a.source))&&(Ye.undefined(a.relatedInformation)||Ye.typedArray(a.relatedInformation,U6.is))}o(r,"is"),t.is=r})(a4||(a4={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return Ye.defined(a)&&a.length>0&&(s.arguments=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.string(i.title)&&Ye.string(i.command)}o(r,"is"),t.is=r})(Tm||(Tm={}));(function(t){function e(a,s){return{range:a,newText:s}}o(e,"replace"),t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}o(r,"insert"),t.insert=r;function n(a){return{range:a,newText:""}}o(n,"del"),t.del=n;function i(a){let s=a;return Ye.objectLiteral(s)&&Ye.string(s.newText)&&Kr.is(s.range)}o(i,"is"),t.is=i})(Fu||(Fu={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Ye.string(i.label)&&(Ye.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(Ye.string(i.description)||i.description===void 0)}o(r,"is"),t.is=r})(bm||(bm={}));(function(t){function e(r){let n=r;return Ye.string(n)}o(e,"is"),t.is=e})(Wa||(Wa={}));(function(t){function e(a,s,l){return{range:a,newText:s,annotationId:l}}o(e,"replace"),t.replace=e;function r(a,s,l){return{range:{start:a,end:a},newText:s,annotationId:l}}o(r,"insert"),t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}o(n,"del"),t.del=n;function i(a){let s=a;return Fu.is(s)&&(bm.is(s.annotationId)||Wa.is(s.annotationId))}o(i,"is"),t.is=i})(Jh||(Jh={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&o4.is(i.textDocument)&&Array.isArray(i.edits)}o(r,"is"),t.is=r})(s4||(s4={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&Ye.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||Ye.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Ye.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||Wa.is(i.annotationId))}o(r,"is"),t.is=r})(jy||(jy={}));(function(t){function e(n,i,a,s){let l={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),s!==void 0&&(l.annotationId=s),l}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&Ye.string(i.oldUri)&&Ye.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||Ye.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Ye.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||Wa.is(i.annotationId))}o(r,"is"),t.is=r})(Xy||(Xy={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&Ye.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||Ye.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||Ye.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||Wa.is(i.annotationId))}o(r,"is"),t.is=r})(Ky||(Ky={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>Ye.string(i.kind)?jy.is(i)||Xy.is(i)||Ky.is(i):s4.is(i)))}o(e,"is"),t.is=e})(W6||(W6={}));Yy=class{static{o(this,"TextEditChangeImpl")}constructor(e,r){this.edits=e,this.changeAnnotations=r}insert(e,r,n){let i,a;if(n===void 0?i=Fu.insert(e,r):Wa.is(n)?(a=n,i=Jh.insert(e,r,n)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(n),i=Jh.insert(e,r,a)),this.edits.push(i),a!==void 0)return a}replace(e,r,n){let i,a;if(n===void 0?i=Fu.replace(e,r):Wa.is(n)?(a=n,i=Jh.replace(e,r,n)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(n),i=Jh.replace(e,r,a)),this.edits.push(i),a!==void 0)return a}delete(e,r){let n,i;if(r===void 0?n=Fu.del(e):Wa.is(r)?(i=r,n=Jh.del(e,r)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(r),n=Jh.del(e,i)),this.edits.push(n),i!==void 0)return i}add(e){this.edits.push(e)}all(){return this.edits}clear(){this.edits.splice(0,this.edits.length)}assertChangeAnnotations(e){if(e===void 0)throw new Error("Text edit change is not configured to manage change annotations.")}},H6=class{static{o(this,"ChangeAnnotations")}constructor(e){this._annotations=e===void 0?Object.create(null):e,this._counter=0,this._size=0}all(){return this._annotations}get size(){return this._size}manage(e,r){let n;if(Wa.is(e)?n=e:(n=this.nextId(),r=e),this._annotations[n]!==void 0)throw new Error(`Id ${n} is already in use.`);if(r===void 0)throw new Error(`No annotation provided for id ${n}`);return this._annotations[n]=r,this._size++,n}nextId(){return this._counter++,this._counter.toString()}},E$=class{static{o(this,"WorkspaceChange")}constructor(e){this._textEditChanges=Object.create(null),e!==void 0?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new H6(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach(r=>{if(s4.is(r)){let n=new Yy(r.edits,this._changeAnnotations);this._textEditChanges[r.textDocument.uri]=n}})):e.changes&&Object.keys(e.changes).forEach(r=>{let n=new Yy(e.changes[r]);this._textEditChanges[r]=n})):this._workspaceEdit={}}get edit(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit}getTextEditChange(e){if(o4.is(e)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let r={uri:e.uri,version:e.version},n=this._textEditChanges[r.uri];if(!n){let i=[],a={textDocument:r,edits:i};this._workspaceEdit.documentChanges.push(a),n=new Yy(i,this._changeAnnotations),this._textEditChanges[r.uri]=n}return n}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");let r=this._textEditChanges[e];if(!r){let n=[];this._workspaceEdit.changes[e]=n,r=new Yy(n),this._textEditChanges[e]=r}return r}}initDocumentChanges(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new H6,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())}initChanges(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))}createFile(e,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let i;bm.is(r)||Wa.is(r)?i=r:n=r;let a,s;if(i===void 0?a=jy.create(e,n):(s=Wa.is(i)?i:this._changeAnnotations.manage(i),a=jy.create(e,n,s)),this._workspaceEdit.documentChanges.push(a),s!==void 0)return s}renameFile(e,r,n,i){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let a;bm.is(n)||Wa.is(n)?a=n:i=n;let s,l;if(a===void 0?s=Xy.create(e,r,i):(l=Wa.is(a)?a:this._changeAnnotations.manage(a),s=Xy.create(e,r,i,l)),this._workspaceEdit.documentChanges.push(s),l!==void 0)return l}deleteFile(e,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let i;bm.is(r)||Wa.is(r)?i=r:n=r;let a,s;if(i===void 0?a=Ky.create(e,n):(s=Wa.is(i)?i:this._changeAnnotations.manage(i),a=Ky.create(e,n,s)),this._workspaceEdit.documentChanges.push(a),s!==void 0)return s}};(function(t){function e(n){return{uri:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.string(i.uri)}o(r,"is"),t.is=r})(S$||(S$={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.string(i.uri)&&Ye.integer(i.version)}o(r,"is"),t.is=r})(C$||(C$={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.string(i.uri)&&(i.version===null||Ye.integer(i.version))}o(r,"is"),t.is=r})(o4||(o4={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.string(i.uri)&&Ye.string(i.languageId)&&Ye.integer(i.version)&&Ye.string(i.text)}o(r,"is"),t.is=r})(A$||(A$={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}o(e,"is"),t.is=e})(Y6||(Y6={}));(function(t){function e(r){let n=r;return Ye.objectLiteral(r)&&Y6.is(n.kind)&&Ye.string(n.value)}o(e,"is"),t.is=e})(Qy||(Qy={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(_$||(_$={}));(function(t){t.PlainText=1,t.Snippet=2})(D$||(D$={}));(function(t){t.Deprecated=1})(R$||(R$={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ye.string(i.newText)&&Kr.is(i.insert)&&Kr.is(i.replace)}o(r,"is"),t.is=r})(L$||(L$={}));(function(t){t.asIs=1,t.adjustIndentation=2})(N$||(N$={}));(function(t){function e(r){let n=r;return n&&(Ye.string(n.detail)||n.detail===void 0)&&(Ye.string(n.description)||n.description===void 0)}o(e,"is"),t.is=e})(M$||(M$={}));(function(t){function e(r){return{label:r}}o(e,"create"),t.create=e})(I$||(I$={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}o(e,"create"),t.create=e})(O$||(O$={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}o(e,"fromPlainText"),t.fromPlainText=e;function r(n){let i=n;return Ye.string(i)||Ye.objectLiteral(i)&&Ye.string(i.language)&&Ye.string(i.value)}o(r,"is"),t.is=r})(l4||(l4={}));(function(t){function e(r){let n=r;return!!n&&Ye.objectLiteral(n)&&(Qy.is(n.contents)||l4.is(n.contents)||Ye.typedArray(n.contents,l4.is))&&(r.range===void 0||Kr.is(r.range))}o(e,"is"),t.is=e})(P$||(P$={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}o(e,"create"),t.create=e})(B$||(B$={}));(function(t){function e(r,n,...i){let a={label:r};return Ye.defined(n)&&(a.documentation=n),Ye.defined(i)?a.parameters=i:a.parameters=[],a}o(e,"create"),t.create=e})(F$||(F$={}));(function(t){t.Text=1,t.Read=2,t.Write=3})($$||($$={}));(function(t){function e(r,n){let i={range:r};return Ye.number(n)&&(i.kind=n),i}o(e,"create"),t.create=e})(z$||(z$={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(G$||(G$={}));(function(t){t.Deprecated=1})(V$||(V$={}));(function(t){function e(r,n,i,a,s){let l={name:r,kind:n,location:{uri:a,range:i}};return s&&(l.containerName=s),l}o(e,"create"),t.create=e})(q$||(q$={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}o(e,"create"),t.create=e})(U$||(U$={}));(function(t){function e(n,i,a,s,l,u){let h={name:n,detail:i,kind:a,range:s,selectionRange:l};return u!==void 0&&(h.children=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ye.string(i.name)&&Ye.number(i.kind)&&Kr.is(i.range)&&Kr.is(i.selectionRange)&&(i.detail===void 0||Ye.string(i.detail))&&(i.deprecated===void 0||Ye.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}o(r,"is"),t.is=r})(W$||(W$={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(H$||(H$={}));(function(t){t.Invoked=1,t.Automatic=2})(c4||(c4={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.typedArray(i.diagnostics,a4.is)&&(i.only===void 0||Ye.typedArray(i.only,Ye.string))&&(i.triggerKind===void 0||i.triggerKind===c4.Invoked||i.triggerKind===c4.Automatic)}o(r,"is"),t.is=r})(Y$||(Y$={}));(function(t){function e(n,i,a){let s={title:n},l=!0;return typeof i=="string"?(l=!1,s.kind=i):Tm.is(i)?s.command=i:s.edit=i,l&&a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ye.string(i.title)&&(i.diagnostics===void 0||Ye.typedArray(i.diagnostics,a4.is))&&(i.kind===void 0||Ye.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||Tm.is(i.command))&&(i.isPreferred===void 0||Ye.boolean(i.isPreferred))&&(i.edit===void 0||W6.is(i.edit))}o(r,"is"),t.is=r})(j$||(j$={}));(function(t){function e(n,i){let a={range:n};return Ye.defined(i)&&(a.data=i),a}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Kr.is(i.range)&&(Ye.undefined(i.command)||Tm.is(i.command))}o(r,"is"),t.is=r})(X$||(X$={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Ye.uinteger(i.tabSize)&&Ye.boolean(i.insertSpaces)}o(r,"is"),t.is=r})(K$||(K$={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Kr.is(i.range)&&(Ye.undefined(i.target)||Ye.string(i.target))}o(r,"is"),t.is=r})(Q$||(Q$={}));(function(t){function e(n,i){return{range:n,parent:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&Kr.is(i.range)&&(i.parent===void 0||t.is(i.parent))}o(r,"is"),t.is=r})(Z$||(Z$={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(J$||(J$={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(ez||(ez={}));(function(t){function e(r){let n=r;return Ye.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}o(e,"is"),t.is=e})(tz||(tz={}));(function(t){function e(n,i){return{range:n,text:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Kr.is(i.range)&&Ye.string(i.text)}o(r,"is"),t.is=r})(rz||(rz={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Kr.is(i.range)&&Ye.boolean(i.caseSensitiveLookup)&&(Ye.string(i.variableName)||i.variableName===void 0)}o(r,"is"),t.is=r})(nz||(nz={}));(function(t){function e(n,i){return{range:n,expression:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Kr.is(i.range)&&(Ye.string(i.expression)||i.expression===void 0)}o(r,"is"),t.is=r})(iz||(iz={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.defined(i)&&Kr.is(n.stoppedLocation)}o(r,"is"),t.is=r})(az||(az={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(j6||(j6={}));(function(t){function e(n){return{value:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&(i.tooltip===void 0||Ye.string(i.tooltip)||Qy.is(i.tooltip))&&(i.location===void 0||i4.is(i.location))&&(i.command===void 0||Tm.is(i.command))}o(r,"is"),t.is=r})(X6||(X6={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ye.objectLiteral(i)&&on.is(i.position)&&(Ye.string(i.label)||Ye.typedArray(i.label,X6.is))&&(i.kind===void 0||j6.is(i.kind))&&i.textEdits===void 0||Ye.typedArray(i.textEdits,Fu.is)&&(i.tooltip===void 0||Ye.string(i.tooltip)||Qy.is(i.tooltip))&&(i.paddingLeft===void 0||Ye.boolean(i.paddingLeft))&&(i.paddingRight===void 0||Ye.boolean(i.paddingRight))}o(r,"is"),t.is=r})(sz||(sz={}));(function(t){function e(r){return{kind:"snippet",value:r}}o(e,"createSnippet"),t.createSnippet=e})(oz||(oz={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}o(e,"create"),t.create=e})(lz||(lz={}));(function(t){function e(r){return{items:r}}o(e,"create"),t.create=e})(cz||(cz={}));(function(t){t.Invoked=0,t.Automatic=1})(uz||(uz={}));(function(t){function e(r,n){return{range:r,text:n}}o(e,"create"),t.create=e})(hz||(hz={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}o(e,"create"),t.create=e})(fz||(fz={}));(function(t){function e(r){let n=r;return Ye.objectLiteral(n)&&V6.is(n.uri)&&Ye.string(n.name)}o(e,"is"),t.is=e})(dz||(dz={}));Bnt=[` -`,`\r -`,"\r"];(function(t){function e(a,s,l,u){return new mz(a,s,l,u)}o(e,"create"),t.create=e;function r(a){let s=a;return!!(Ye.defined(s)&&Ye.string(s.uri)&&(Ye.undefined(s.languageId)||Ye.string(s.languageId))&&Ye.uinteger(s.lineCount)&&Ye.func(s.getText)&&Ye.func(s.positionAt)&&Ye.func(s.offsetAt))}o(r,"is"),t.is=r;function n(a,s){let l=a.getText(),u=i(s,(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),h=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],p=a.offsetAt(d.range.start),m=a.offsetAt(d.range.end);if(m<=h)l=l.substring(0,p)+d.newText+l.substring(m,l.length);else throw new Error("Overlapping edit");h=p}return l}o(n,"applyEdits"),t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let l=a.length/2|0,u=a.slice(0,l),h=a.slice(l);i(u,s),i(h,s);let f=0,d=0,p=0;for(;f0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return on.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return on.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}o(n,"undefined"),t.undefined=n;function i(m){return m===!0||m===!1}o(i,"boolean"),t.boolean=i;function a(m){return e.call(m)==="[object String]"}o(a,"string"),t.string=a;function s(m){return e.call(m)==="[object Number]"}o(s,"number"),t.number=s;function l(m,g,y){return e.call(m)==="[object Number]"&&g<=m&&m<=y}o(l,"numberRange"),t.numberRange=l;function u(m){return e.call(m)==="[object Number]"&&-2147483648<=m&&m<=2147483647}o(u,"integer"),t.integer=u;function h(m){return e.call(m)==="[object Number]"&&0<=m&&m<=2147483647}o(h,"uinteger"),t.uinteger=h;function f(m){return e.call(m)==="[object Function]"}o(f,"func"),t.func=f;function d(m){return m!==null&&typeof m=="object"}o(d,"objectLiteral"),t.objectLiteral=d;function p(m,g){return Array.isArray(m)&&m.every(g)}o(p,"typedArray"),t.typedArray=p})(Ye||(Ye={}))});var u4,h4,wm,km,gz,Jy,Q6=O(()=>{"use strict";Zy();Sc();u4=class{static{o(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){return this.nodeStack[this.nodeStack.length-1]??this.rootNode}buildRootNode(e){return this.rootNode=new Jy(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new km;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new wm(e.startOffset,e.image.length,by(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let a of e){let s=new wm(a.startOffset,a.image.length,by(a),a.tokenType,!0);s.root=this.rootNode,r.push(s)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let a=n.container.content.indexOf(n);if(a>0){n.container.content.splice(a,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&!e.$infix&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},h4=class{static{o(this,"AbstractCstNode")}get hidden(){return!1}get astNode(){let e=typeof this._astNode?.$type=="string"?this._astNode:this.container?.astNode;if(!e)throw new Error("This node has no associated AST element");return e}set astNode(e){this._astNode=e}get text(){return this.root.fullText.substring(this.offset,this.end)}},wm=class extends h4{static{o(this,"LeafCstNodeImpl")}get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,a=!1){super(),this._hidden=a,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},km=class extends h4{static{o(this,"CompositeCstNodeImpl")}constructor(){super(...arguments),this.content=new gz(this)}get offset(){return this.firstNonHiddenNode?.offset??0}get length(){return this.end-this.offset}get end(){return this.lastNonHiddenNode?.end??0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},gz=class t extends Array{static{o(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},Jy=class extends km{static{o(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function yz(t){return t.$type===Z6}var Z6,xve,bve,f4,d4,J6,ev,p4,Fnt,eA,vz,m4=O(()=>{"use strict";Zo();Hd();vve();Zo();Rc();us();Q6();Z6=Symbol("Datatype");o(yz,"isDataTypeNode");xve="\u200B",bve=o(t=>t.endsWith(xve)?t:t+xve,"withRuleSuffix"),f4=class{static{o(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";e.shared.profilers.LangiumProfiler?.isActive("parsing")?this.wrapper=new vz(r,{...e.parser.ParserConfig,skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider},e.shared.profilers.LangiumProfiler.createTask("parsing",e.LanguageMetaData.languageId)):this.wrapper=new eA(r,{...e.parser.ParserConfig,skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider})}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},d4=class extends f4{static{o(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new u4,this.stack=[],this.assignmentMap=new Map,this.operatorPrecedence=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i;Gd(e)&&(i=e.name,this.registerPrecedenceMap(e));let a=this.wrapper.DEFINE_RULE(bve(e.name),this.startImplementation(n,i,r).bind(this));return this.allRules.set(e.name,a),Sa(e)&&e.entry&&(this.mainRule=a),a}registerPrecedenceMap(e){let r=e.name,n=new Map;for(let i=0;i0&&(r=this.construct()),r===void 0)throw new Error("No result from parser");if(this.stack.length>0)throw new Error("Parser stack is not empty after parsing");return r}startImplementation(e,r,n){return i=>{let a=!this.isRecording()&&e!==void 0;if(a){let s={$type:e};this.stack.push(s),e===Z6?s.value="":r!==void 0&&(s.$infixName=r)}return n(i),a?this.construct():void 0}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(a);let s=this.nodeBuilder.buildLeafNode(i,n),{assignment:l,crossRef:u}=this.getAssignment(n),h=this.current;if(l){let f=Pl(n)?i.image:this.converter.convert(i.image,s);this.assign(l.operator,l.feature,f,s,u)}else if(yz(h)){let f=i.image;Pl(n)||(f=this.converter.convert(f,s).toString()),h.value+=f}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,a){let s;!this.isRecording()&&!n&&(s=this.nodeBuilder.buildCompositeNode(i));let l;try{l=this.wrapper.wrapSubrule(e,r,a)}finally{this.isRecording()||(l===void 0&&!n&&(l=this.construct()),l!==void 0&&s&&s.length>0&&this.performSubruleAssignment(l,i,s))}}performSubruleAssignment(e,r,n){let{assignment:i,crossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if(yz(s))s.value+=e.toString();else if(typeof e=="object"&&e){let u=this.assignWithoutOverride(e,s);this.stack.pop(),this.stack.push(u)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let a={$type:e};this.stack.push(a),this.assign(r.operator,r.feature,n,n.$cstNode)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.stack.pop();return this.nodeBuilder.construct(e),"$infixName"in e?this.constructInfix(e,this.operatorPrecedence.get(e.$infixName)):yz(e)?this.converter.convert(e.value,e.$cstNode):($B(this.astReflection,e),e)}constructInfix(e,r){let n=e.parts;if(!Array.isArray(n)||n.length===0)return;let i=e.operators;if(!Array.isArray(i)||n.length<2)return n[0];let a=0,s=-1;for(let y=0;ys?(s=x.precedence,a=y):x.precedence===s&&(x.rightAssoc||(a=y))}let l=i.slice(0,a),u=i.slice(a+1),h=n.slice(0,a+1),f=n.slice(a+1),d={$infixName:e.$infixName,$type:e.$type,$cstNode:e.$cstNode,parts:h,operators:l},p={$infixName:e.$infixName,$type:e.$type,$cstNode:e.$cstNode,parts:f,operators:u},m=this.constructInfix(d,r),g=this.constructInfix(p,r);return{$type:e.$type,$cstNode:e.$cstNode,left:m,operator:i[a],right:g}}getAssignment(e){if(!this.assignmentMap.has(e)){let r=zh(e,Ac);this.assignmentMap.set(e,{assignment:r,crossRef:r&&_c(r.terminal)?r.terminal.isMulti?"multi":"single":void 0})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,l;switch(a==="single"&&typeof n=="string"?l=this.linker.buildReference(s,r,i,n):a==="multi"&&typeof n=="string"?l=this.linker.buildMultiReference(s,r,i,n):l=n,e){case"=":{s[r]=l;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(l)}}assignWithoutOverride(e,r){for(let[i,a]of Object.entries(r)){let s=e[i];s===void 0?e[i]=a:Array.isArray(s)&&Array.isArray(a)&&(a.push(...s),e[i]=a)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},J6=class{static{o(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return Qh.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Qh.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Qh.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Qh.buildEarlyExitMessage(e)}},ev=class extends J6{static{o(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},p4=class extends f4{static{o(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(bve(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,a){this.before(i),this.wrapper.wrapSubrule(e,r,a),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},Fnt={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new ev},eA=class extends ZT{static{o(this,"ChevrotainWrapper")}constructor(e,r){let n=r&&"maxLookahead"in r;super(e,{...Fnt,lookaheadStrategy:n?new Zh({maxLookahead:r.maxLookahead}):new r4({logging:r.skipValidations?()=>{}:void 0}),...r})}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r,n){return this.RULE(e,r,n)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r,void 0)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}rule(e){return e.call(this,{})}},vz=class extends eA{static{o(this,"ProfilerWrapper")}constructor(e,r,n){super(e,r),this.task=n}rule(e){this.task.start(),this.task.startSubTask(this.ruleName(e));try{return super.rule(e)}finally{this.task.stopSubTask(this.ruleName(e)),this.task.stop()}}ruleName(e){return e.ruleName}subrule(e,r,n){this.task.startSubTask(this.ruleName(r));try{return super.subrule(e,r,n)}finally{this.task.stopSubTask(this.ruleName(r))}}}});function g4(t,e,r){return $nt({parser:e,tokens:r,ruleNames:new Map},t),e}function $nt(t,e){let r=RT(e,!1),n=Hr(e.rules).filter(Sa).filter(a=>r.has(a));for(let a of n){let s={...t,consume:1,optional:1,subrule:1,many:1,or:1};t.parser.rule(a,Em(s,a.definition))}let i=Hr(e.rules).filter(Gd).filter(a=>r.has(a));for(let a of i)t.parser.rule(a,znt(t,a))}function znt(t,e){let r=e.call.rule.ref;if(!r)throw new Error("Could not resolve reference to infix operator rule: "+e.call.rule.$refText);if(Bs(r))throw new Error("Cannot use terminal rule in infix expression");let n=e.operators.precedences.flatMap(m=>m.operators),i={$type:"Group",elements:[]},a={$container:i,$type:"Assignment",feature:"parts",operator:"+=",terminal:e.call},s={$container:i,$type:"Group",elements:[],cardinality:"*"};i.elements.push(a,s);let u={$container:s,$type:"Assignment",feature:"operators",operator:"+=",terminal:{$type:"Alternatives",elements:n}},h={...a,$container:s};s.elements.push(u,h);let d=n.map(m=>t.tokens[m.value]).map((m,g)=>({ALT:o(()=>t.parser.consume(g,m,u),"ALT")})),p;return m=>{p??(p=bz(t,r)),t.parser.subrule(0,p,!1,a,m),t.parser.many(0,{DEF:o(()=>{t.parser.alternatives(0,d),t.parser.subrule(1,p,!1,h,m)},"DEF")})}}function Em(t,e,r=!1){let n;if(Pl(e))n=Ynt(t,e);else if(Uh(e))n=Gnt(t,e);else if(Ac(e))n=Em(t,e.terminal);else if(_c(e))n=Tve(t,e);else if(Dc(e))n=Vnt(t,e);else if(VC(e))n=Unt(t,e);else if(HC(e))n=Wnt(t,e);else if(zd(e))n=Hnt(t,e);else if(HB(e)){let i=t.consume++;n=o(()=>t.parser.consume(i,el,e),"method")}else throw new lm(e.$cstNode,`Unexpected element type: ${e.$type}`);return wve(t,r?void 0:tA(e),n,e.cardinality)}function Gnt(t,e){let r=qd(e);return()=>t.parser.action(r,e)}function Vnt(t,e){let r=e.rule.ref;if(qh(r)){let n=t.subrule++,i=Sa(r)&&r.fragment,a=e.arguments.length>0?qnt(r,e.arguments):()=>({}),s;return l=>{s??(s=bz(t,r)),t.parser.subrule(n,s,i,e,a(l))}}else if(Bs(r)){let n=t.consume++,i=xz(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Ou(r);else throw new lm(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function qnt(t,e){if(e.some(n=>n.calledByName)){let n=e.map(i=>({parameterName:i.parameter?.ref?.name,predicate:$u(i.value)}));return i=>{let a={};for(let{parameterName:s,predicate:l}of n)s&&(a[s]=l(i));return a}}else{let n=e.map(i=>$u(i.value));return i=>{let a={};for(let s=0;se(n)||r(n)}else if(UB(t)){let e=$u(t.left),r=$u(t.right);return n=>e(n)&&r(n)}else if(XB(t)){let e=$u(t.value);return r=>!e(r)}else if(KB(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(VB(t)){let e=!!t.true;return()=>e}Ou(t)}function Unt(t,e){if(e.elements.length===1)return Em(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:Em(t,i,!0)},s=tA(i);s&&(a.GATE=$u(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:o(()=>a.ALT(i),"ALT")},l=a.GATE;return l&&(s.GATE=()=>l(i)),s}))}}function Wnt(t,e){if(e.elements.length===1)return Em(t,e.elements[0]);let r=[];for(let l of e.elements){let u={ALT:Em(t,l,!0)},h=tA(l);h&&(u.GATE=$u(h)),r.push(u)}let n=t.or++,i=o((l,u)=>{let h=u.getRuleStack().join("-");return`uGroup_${l}_${h}`},"idFunc"),a=o(l=>t.parser.alternatives(n,r.map((u,h)=>{let f={ALT:o(()=>!0,"ALT")},d=t.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let m=i(n,d);d.unorderedGroups.get(m)||d.unorderedGroups.set(m,[]);let g=d.unorderedGroups.get(m);typeof g?.[h]>"u"&&(g[h]=!0)}};let p=u.GATE;return p?f.GATE=()=>p(l):f.GATE=()=>!d.unorderedGroups.get(i(n,d))?.[h],f})),"alternatives"),s=wve(t,tA(e),a,"*");return l=>{s(l),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function Hnt(t,e){let r=e.elements.map(n=>Em(t,n));return n=>r.forEach(i=>i(n))}function tA(t){if(zd(t))return t.guardCondition}function Tve(t,e,r=e.terminal){if(r)if(Dc(r)&&Sa(r.rule.ref)){let n=r.rule.ref,i=t.subrule++,a;return s=>{a??(a=bz(t,n)),t.parser.subrule(i,a,!1,e,s)}}else if(Dc(r)&&Bs(r.rule.ref)){let n=t.consume++,i=xz(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Pl(r)){let n=t.consume++,i=xz(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let i=JC(e.type.ref)?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+qd(e.type.ref));return Tve(t,e,i)}}function Ynt(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function wve(t,e,r,n){let i=e&&$u(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:o(()=>r(s),"ALT"),GATE:o(()=>i(s),"GATE")},{ALT:$6(),GATE:o(()=>!i(s),"GATE")}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return l=>t.parser.alternatives(s,[{ALT:o(()=>t.parser.atLeastOne(a,{DEF:o(()=>r(l),"DEF")}),"ALT"),GATE:o(()=>i(l),"GATE")},{ALT:$6(),GATE:o(()=>!i(l),"GATE")}])}else return s=>t.parser.atLeastOne(a,{DEF:o(()=>r(s),"DEF")})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else Ou(n)}function bz(t,e){let r=jnt(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function jnt(t,e){if(qh(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Sa(n);)(zd(n)||VC(n)||HC(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function xz(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var rA=O(()=>{"use strict";Hd();Zo();XC();Os();Rc();o(g4,"createParser");o($nt,"buildRules");o(znt,"buildInfixRule");o(Em,"buildElement");o(Gnt,"buildAction");o(Vnt,"buildRuleCall");o(qnt,"buildRuleCallPredicate");o($u,"buildPredicate");o(Unt,"buildAlternatives");o(Wnt,"buildUnorderedGroup");o(Hnt,"buildGroup");o(tA,"getGuardCondition");o(Tve,"buildCrossReference");o(Ynt,"buildKeyword");o(wve,"wrap");o(bz,"getRule");o(jnt,"getRuleName");o(xz,"getToken")});function Tz(t){let e=t.Grammar,r=t.parser.Lexer,n=new p4(t);return g4(e,n,r.definition),n.finalize(),n}var wz=O(()=>{"use strict";m4();rA();o(Tz,"createCompletionParser")});function kz(t){let e=kve(t);return e.finalize(),e}function kve(t){let e=t.Grammar,r=t.parser.Lexer,n=new d4(t);return g4(e,n,r.definition)}var Ez=O(()=>{"use strict";m4();rA();o(kz,"createLangiumParser");o(kve,"prepareLangiumParser")});var ef,nA=O(()=>{"use strict";Hd();Zo();us();Rc();wy();Os();ef=class{static{o(this,"DefaultTokenBuilder")}constructor(){this.diagnostics=[]}buildTokens(e,r){let n=Hr(RT(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return a.push(...i),a}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(Bs).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=ky(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=DT(r)?fi.SKIPPED:"hidden"),i}requiresCustomPattern(e){return!!(e.flags.includes("u")||e.flags.includes("s"))}regexPatternFunction(e){let r=new RegExp(e,e.flags+"y");return(n,i)=>(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(qh).flatMap(i=>Ec(i).filter(Pl)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),a={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(a.LINE_BREAKS=!0),a}buildKeywordPattern(e,r){return r?new RegExp(Vd(e.value),"i"):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&mF("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var Sm,zu,Sz=O(()=>{"use strict";Zo();Rc();Sm=class{static{o(this,"DefaultValueConverter")}convert(e,r){let n=r.grammarSource;if(_c(n)&&(n=vF(n)),Dc(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){switch(e.name.toUpperCase()){case"INT":return zu.convertInt(r);case"STRING":return zu.convertString(r);case"ID":return zu.convertID(r)}switch(SF(e)?.toLowerCase()){case"number":return zu.convertNumber(r);case"boolean":return zu.convertBoolean(r);case"bigint":return zu.convertBigint(r);case"date":return zu.convertDate(r);default:return r}}};(function(t){function e(h){let f="";for(let d=1;d{"use strict";Object.defineProperty(_z,"__esModule",{value:!0});var Cz;function Az(){if(Cz===void 0)throw new Error("No runtime abstraction layer installed");return Cz}o(Az,"RAL");(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");Cz=r}o(e,"install"),t.install=e})(Az||(Az={}));_z.default=Az});var tv=nr(hs=>{"use strict";Object.defineProperty(hs,"__esModule",{value:!0});hs.stringArray=hs.array=hs.func=hs.error=hs.number=hs.string=hs.boolean=void 0;function Xnt(t){return t===!0||t===!1}o(Xnt,"boolean");hs.boolean=Xnt;function Eve(t){return typeof t=="string"||t instanceof String}o(Eve,"string");hs.string=Eve;function Knt(t){return typeof t=="number"||t instanceof Number}o(Knt,"number");hs.number=Knt;function Qnt(t){return t instanceof Error}o(Qnt,"error");hs.error=Qnt;function Znt(t){return typeof t=="function"}o(Znt,"func");hs.func=Znt;function Sve(t){return Array.isArray(t)}o(Sve,"array");hs.array=Sve;function Jnt(t){return Sve(t)&&t.every(e=>Eve(e))}o(Jnt,"stringArray");hs.stringArray=Jnt});var Cm=nr(rv=>{"use strict";Object.defineProperty(rv,"__esModule",{value:!0});rv.Emitter=rv.Event=void 0;var eit=Xd(),Cve;(function(t){let e={dispose(){}};t.None=function(){return e}})(Cve||(rv.Event=Cve={}));var Dz=class{static{o(this,"CallbackList")}add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:o(()=>this.remove(e,r),"dispose")})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new Dz),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:o(()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};rv.Emitter=iA;iA._noop=function(){}});var y4=nr(nv=>{"use strict";Object.defineProperty(nv,"__esModule",{value:!0});nv.CancellationTokenSource=nv.CancellationToken=void 0;var tit=Xd(),rit=tv(),Rz=Cm(),aA;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:Rz.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:Rz.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||rit.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}o(e,"is"),t.is=e})(aA||(nv.CancellationToken=aA={}));var nit=Object.freeze(function(t,e){let r=(0,tit.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),sA=class{static{o(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?nit:(this._emitter||(this._emitter=new Rz.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},Lz=class{static{o(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new sA),this._token}cancel(){this._token?this._token.cancel():this._token=aA.Cancelled}dispose(){this._token?this._token instanceof sA&&this._token.dispose():this._token=aA.None}};nv.CancellationTokenSource=Lz});var Nr={};var Bl=O(()=>{"use strict";jr(Nr,Ra(y4(),1))});function Nz(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function lA(){return oA=performance.now(),new Nr.CancellationTokenSource}function _ve(t){Ave=t}function Gu(t){return t===Fl}async function Ci(t){if(t===Nr.CancellationToken.None)return;let e=performance.now();if(e-oA>=Ave&&(oA=e,await Nz(),oA=performance.now()),t.isCancellationRequested)throw Fl}var oA,Ave,Fl,Vs,$l=O(()=>{"use strict";Bl();o(Nz,"delayNextTick");oA=0,Ave=10;o(lA,"startCancelableOperation");o(_ve,"setInterruptionPeriod");Fl=Symbol("OperationCancelled");o(Gu,"isOperationCancelled");o(Ci,"interruptAndCheck");Vs=class{static{o(this,"Deferred")}constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function Mz(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);Mz(n,e),Mz(i,e);let a=0,s=0,l=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function iit(t){let e=Lve(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var cA,iv,Nve=O(()=>{"use strict";cA=class t{static{o(this,"FullTextDocument")}constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=Lve(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),h=this._lineOffsets,f=Dve(n.text,!1,a);if(u-l===f.length)for(let p=0,m=f.length;pe?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&Rve(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,l){return new cA(i,a,s,l)}o(e,"create"),t.create=e;function r(i,a,s){if(i instanceof cA)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}o(r,"update"),t.update=r;function n(i,a){let s=i.getText(),l=Mz(a.map(iit),(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),u=0,h=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&h.push(s.substring(u,d)),f.newText.length&&h.push(f.newText),u=i.offsetAt(f.range.end)}return h.push(s.substr(u)),h.join("")}o(n,"applyEdits"),t.applyEdits=n})(iv||(iv={}));o(Mz,"mergeSort");o(Dve,"computeLineOffsets");o(Rve,"isEOL");o(Lve,"getWellformedRange");o(iit,"getWellformedEdit")});var Mve,ca,av,Iz=O(()=>{"use strict";(()=>{"use strict";var t={975:N=>{function C(M){if(typeof M!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(M))}o(C,"e");function _(M,R){for(var P,B="",F=0,G=-1,$=0,V=0;V<=M.length;++V){if(V2){var X=B.lastIndexOf("/");if(X!==B.length-1){X===-1?(B="",F=0):F=(B=B.slice(0,X)).length-1-B.lastIndexOf("/"),G=V,$=0;continue}}else if(B.length===2||B.length===1){B="",F=0,G=V,$=0;continue}}R&&(B.length>0?B+="/..":B="..",F=2)}else B.length>0?B+="/"+M.slice(G+1,V):B=M.slice(G+1,V),F=V-G-1;G=V,$=0}else P===46&&$!==-1?++$:$=-1}return B}o(_,"r");var D={resolve:o(function(){for(var M,R="",P=!1,B=arguments.length-1;B>=-1&&!P;B--){var F;B>=0?F=arguments[B]:(M===void 0&&(M=process.cwd()),F=M),C(F),F.length!==0&&(R=F+"/"+R,P=F.charCodeAt(0)===47)}return R=_(R,!P),P?R.length>0?"/"+R:"/":R.length>0?R:"."},"resolve"),normalize:o(function(M){if(C(M),M.length===0)return".";var R=M.charCodeAt(0)===47,P=M.charCodeAt(M.length-1)===47;return(M=_(M,!R)).length!==0||R||(M="."),M.length>0&&P&&(M+="/"),R?"/"+M:M},"normalize"),isAbsolute:o(function(M){return C(M),M.length>0&&M.charCodeAt(0)===47},"isAbsolute"),join:o(function(){if(arguments.length===0)return".";for(var M,R=0;R0&&(M===void 0?M=P:M+="/"+P)}return M===void 0?".":D.normalize(M)},"join"),relative:o(function(M,R){if(C(M),C(R),M===R||(M=D.resolve(M))===(R=D.resolve(R)))return"";for(var P=1;PV){if(R.charCodeAt(G+Q)===47)return R.slice(G+Q+1);if(Q===0)return R.slice(G+Q)}else F>V&&(M.charCodeAt(P+Q)===47?X=Q:Q===0&&(X=0));break}var H=M.charCodeAt(P+Q);if(H!==R.charCodeAt(G+Q))break;H===47&&(X=Q)}var ie="";for(Q=P+X+1;Q<=B;++Q)Q!==B&&M.charCodeAt(Q)!==47||(ie.length===0?ie+="..":ie+="/..");return ie.length>0?ie+R.slice(G+X):(G+=X,R.charCodeAt(G)===47&&++G,R.slice(G))},"relative"),_makeLong:o(function(M){return M},"_makeLong"),dirname:o(function(M){if(C(M),M.length===0)return".";for(var R=M.charCodeAt(0),P=R===47,B=-1,F=!0,G=M.length-1;G>=1;--G)if((R=M.charCodeAt(G))===47){if(!F){B=G;break}}else F=!1;return B===-1?P?"/":".":P&&B===1?"//":M.slice(0,B)},"dirname"),basename:o(function(M,R){if(R!==void 0&&typeof R!="string")throw new TypeError('"ext" argument must be a string');C(M);var P,B=0,F=-1,G=!0;if(R!==void 0&&R.length>0&&R.length<=M.length){if(R.length===M.length&&R===M)return"";var $=R.length-1,V=-1;for(P=M.length-1;P>=0;--P){var X=M.charCodeAt(P);if(X===47){if(!G){B=P+1;break}}else V===-1&&(G=!1,V=P+1),$>=0&&(X===R.charCodeAt($)?--$==-1&&(F=P):($=-1,F=V))}return B===F?F=V:F===-1&&(F=M.length),M.slice(B,F)}for(P=M.length-1;P>=0;--P)if(M.charCodeAt(P)===47){if(!G){B=P+1;break}}else F===-1&&(G=!1,F=P+1);return F===-1?"":M.slice(B,F)},"basename"),extname:o(function(M){C(M);for(var R=-1,P=0,B=-1,F=!0,G=0,$=M.length-1;$>=0;--$){var V=M.charCodeAt($);if(V!==47)B===-1&&(F=!1,B=$+1),V===46?R===-1?R=$:G!==1&&(G=1):R!==-1&&(G=-1);else if(!F){P=$+1;break}}return R===-1||B===-1||G===0||G===1&&R===B-1&&R===P+1?"":M.slice(R,B)},"extname"),format:o(function(M){if(M===null||typeof M!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof M);return(function(R,P){var B=P.dir||P.root,F=P.base||(P.name||"")+(P.ext||"");return B?B===P.root?B+F:B+"/"+F:F})(0,M)},"format"),parse:o(function(M){C(M);var R={root:"",dir:"",base:"",ext:"",name:""};if(M.length===0)return R;var P,B=M.charCodeAt(0),F=B===47;F?(R.root="/",P=1):P=0;for(var G=-1,$=0,V=-1,X=!0,Q=M.length-1,H=0;Q>=P;--Q)if((B=M.charCodeAt(Q))!==47)V===-1&&(X=!1,V=Q+1),B===46?G===-1?G=Q:H!==1&&(H=1):G!==-1&&(H=-1);else if(!X){$=Q+1;break}return G===-1||V===-1||H===0||H===1&&G===V-1&&G===$+1?V!==-1&&(R.base=R.name=$===0&&F?M.slice(1,V):M.slice($,V)):($===0&&F?(R.name=M.slice(1,G),R.base=M.slice(1,V)):(R.name=M.slice($,G),R.base=M.slice($,V)),R.ext=M.slice(G,V)),$>0?R.dir=M.slice(0,$-1):F&&(R.dir="/"),R},"parse"),sep:"/",delimiter:":",win32:null,posix:null};D.posix=D,N.exports=D}},e={};function r(N){var C=e[N];if(C!==void 0)return C.exports;var _=e[N]={exports:{}};return t[N](_,_.exports,r),_.exports}o(r,"r"),r.d=(N,C)=>{for(var _ in C)r.o(C,_)&&!r.o(N,_)&&Object.defineProperty(N,_,{enumerable:!0,get:C[_]})},r.o=(N,C)=>Object.prototype.hasOwnProperty.call(N,C),r.r=N=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(N,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(N,"__esModule",{value:!0})};var n={};let i;r.r(n),r.d(n,{URI:o(()=>p,"URI"),Utils:o(()=>I,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,l=/^\/\//;function u(N,C){if(!N.scheme&&C)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${N.authority}", path: "${N.path}", query: "${N.query}", fragment: "${N.fragment}"}`);if(N.scheme&&!a.test(N.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(N.path){if(N.authority){if(!s.test(N.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(N.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}o(u,"a");let h="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class p{static{o(this,"l")}static isUri(C){return C instanceof p||!!C&&typeof C.authority=="string"&&typeof C.fragment=="string"&&typeof C.path=="string"&&typeof C.query=="string"&&typeof C.scheme=="string"&&typeof C.fsPath=="string"&&typeof C.with=="function"&&typeof C.toString=="function"}scheme;authority;path;query;fragment;constructor(C,_,D,M,R,P=!1){typeof C=="object"?(this.scheme=C.scheme||h,this.authority=C.authority||h,this.path=C.path||h,this.query=C.query||h,this.fragment=C.fragment||h):(this.scheme=(function(B,F){return B||F?B:"file"})(C,P),this.authority=_||h,this.path=(function(B,F){switch(B){case"https":case"http":case"file":F?F[0]!==f&&(F=f+F):F=f}return F})(this.scheme,D||h),this.query=M||h,this.fragment=R||h,u(this,P))}get fsPath(){return b(this,!1)}with(C){if(!C)return this;let{scheme:_,authority:D,path:M,query:R,fragment:P}=C;return _===void 0?_=this.scheme:_===null&&(_=h),D===void 0?D=this.authority:D===null&&(D=h),M===void 0?M=this.path:M===null&&(M=h),R===void 0?R=this.query:R===null&&(R=h),P===void 0?P=this.fragment:P===null&&(P=h),_===this.scheme&&D===this.authority&&M===this.path&&R===this.query&&P===this.fragment?this:new g(_,D,M,R,P)}static parse(C,_=!1){let D=d.exec(C);return D?new g(D[2]||h,k(D[4]||h),k(D[5]||h),k(D[7]||h),k(D[9]||h),_):new g(h,h,h,h,h)}static file(C){let _=h;if(i&&(C=C.replace(/\\/g,f)),C[0]===f&&C[1]===f){let D=C.indexOf(f,2);D===-1?(_=C.substring(2),C=f):(_=C.substring(2,D),C=C.substring(D)||f)}return new g("file",_,C,h,h)}static from(C){let _=new g(C.scheme,C.authority,C.path,C.query,C.fragment);return u(_,!0),_}toString(C=!1){return T(this,C)}toJSON(){return this}static revive(C){if(C){if(C instanceof p)return C;{let _=new g(C);return _._formatted=C.external,_._fsPath=C._sep===m?C.fsPath:null,_}}return C}}let m=i?1:void 0;class g extends p{static{o(this,"d")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(C=!1){return C?T(this,!0):(this._formatted||(this._formatted=T(this,!1)),this._formatted)}toJSON(){let C={$mid:1};return this._fsPath&&(C.fsPath=this._fsPath,C._sep=m),this._formatted&&(C.external=this._formatted),this.path&&(C.path=this.path),this.scheme&&(C.scheme=this.scheme),this.authority&&(C.authority=this.authority),this.query&&(C.query=this.query),this.fragment&&(C.fragment=this.fragment),C}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(N,C,_){let D,M=-1;for(let R=0;R=97&&P<=122||P>=65&&P<=90||P>=48&&P<=57||P===45||P===46||P===95||P===126||C&&P===47||_&&P===91||_&&P===93||_&&P===58)M!==-1&&(D+=encodeURIComponent(N.substring(M,R)),M=-1),D!==void 0&&(D+=N.charAt(R));else{D===void 0&&(D=N.substr(0,R));let B=y[P];B!==void 0?(M!==-1&&(D+=encodeURIComponent(N.substring(M,R)),M=-1),D+=B):M===-1&&(M=R)}}return M!==-1&&(D+=encodeURIComponent(N.substring(M))),D!==void 0?D:N}o(v,"m");function x(N){let C;for(let _=0;_1&&N.scheme==="file"?`//${N.authority}${N.path}`:N.path.charCodeAt(0)===47&&(N.path.charCodeAt(1)>=65&&N.path.charCodeAt(1)<=90||N.path.charCodeAt(1)>=97&&N.path.charCodeAt(1)<=122)&&N.path.charCodeAt(2)===58?C?N.path.substr(1):N.path[1].toLowerCase()+N.path.substr(2):N.path,i&&(_=_.replace(/\//g,"\\")),_}o(b,"v");function T(N,C){let _=C?x:v,D="",{scheme:M,authority:R,path:P,query:B,fragment:F}=N;if(M&&(D+=M,D+=":"),(R||M==="file")&&(D+=f,D+=f),R){let G=R.indexOf("@");if(G!==-1){let $=R.substr(0,G);R=R.substr(G+1),G=$.lastIndexOf(":"),G===-1?D+=_($,!1,!1):(D+=_($.substr(0,G),!1,!1),D+=":",D+=_($.substr(G+1),!1,!0)),D+="@"}R=R.toLowerCase(),G=R.lastIndexOf(":"),G===-1?D+=_(R,!1,!0):(D+=_(R.substr(0,G),!1,!0),D+=R.substr(G))}if(P){if(P.length>=3&&P.charCodeAt(0)===47&&P.charCodeAt(2)===58){let G=P.charCodeAt(1);G>=65&&G<=90&&(P=`/${String.fromCharCode(G+32)}:${P.substr(3)}`)}else if(P.length>=2&&P.charCodeAt(1)===58){let G=P.charCodeAt(0);G>=65&&G<=90&&(P=`${String.fromCharCode(G+32)}:${P.substr(2)}`)}D+=_(P,!0,!1)}return B&&(D+="?",D+=_(B,!1,!1)),F&&(D+="#",D+=C?F:v(F,!1,!1)),D}o(T,"b");function E(N){try{return decodeURIComponent(N)}catch{return N.length>3?N.substr(0,3)+E(N.substr(3)):N}}o(E,"C");let w=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function k(N){return N.match(w)?N.replace(w,(C=>E(C))):N}o(k,"w");var S=r(975);let A=S.posix||S,L="/";var I;(function(N){N.joinPath=function(C,..._){return C.with({path:A.join(C.path,..._)})},N.resolvePath=function(C,..._){let D=C.path,M=!1;D[0]!==L&&(D=L+D,M=!0);let R=A.resolve(D,..._);return M&&R[0]===L&&!C.authority&&(R=R.substring(1)),C.with({path:R})},N.dirname=function(C){if(C.path.length===0||C.path===L)return C;let _=A.dirname(C.path);return _.length===1&&_.charCodeAt(0)===46&&(_=""),C.with({path:_})},N.basename=function(C){return A.basename(C.path)},N.extname=function(C){return A.extname(C.path)}})(I||(I={})),Mve=n})();({URI:ca,Utils:av}=Mve)});var Fi,sv,Nc=O(()=>{"use strict";Iz();(function(t){t.basename=av.basename,t.dirname=av.dirname,t.extname=av.extname,t.joinPath=av.joinPath,t.resolvePath=av.resolvePath;let e=typeof process=="object"&&process?.platform==="win32";function r(s,l){return s?.toString()===l?.toString()}o(r,"equals"),t.equals=r;function n(s,l){let u=typeof s=="string"?ca.parse(s).path:s.path,h=typeof l=="string"?ca.parse(l).path:l.path,f=u.split("/").filter(y=>y.length>0),d=h.split("/").filter(y=>y.length>0);if(e){let y=/^[A-Z]:$/;if(f[0]&&y.test(f[0])&&(f[0]=f[0].toLowerCase()),d[0]&&y.test(d[0])&&(d[0]=d[0].toLowerCase()),f[0]!==d[0])return h.substring(1)}let p=0;for(;p({name:i.name,uri:Fi.joinPath(ca.parse(r),i.name).toString(),element:i.element})):[]}all(){return this.collectValues(this.root)}findAll(e){let r=this.getNode(Fi.normalize(e),!1);return r?this.collectValues(r):[]}getNode(e,r){let n=e.split("/");e.charAt(e.length-1)==="/"&&n.pop();let i=this.root;for(let a of n){let s=i.children.get(a);if(!s)if(r)s={name:a,children:new Map,parent:i},i.children.set(a,s);else return;i=s}return i}collectValues(e){let r=[];e.element&&r.push(e.element);for(let n of e.children.values())r.push(...this.collectValues(n));return r}}});var qr,v4,x4,ov=O(()=>{"use strict";Nve();ov();Bl();Os();Nc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(qr||(qr={}));v4=class{static{o(this,"DefaultLangiumDocumentFactory")}constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=Nr.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??ca.parse(e.uri),Nr.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return Nr.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:qr.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:qr.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){let n=e.parseResult.value.$cstNode?.root.fullText,i=this.textDocuments?.get(e.uri.toString()),a=i?i.getText():await this.fileSystemProvider.readFile(e.uri);if(i)Object.defineProperty(e,"textDocument",{value:i});else{let s=this.createTextDocumentGetter(e.uri,a);Object.defineProperty(e,"textDocument",{get:s})}return n!==a&&(e.parseResult=await this.parseAsync(e.uri,a,r),e.parseResult.value.$document=e),e.state=qr.Parsed,e}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=iv.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},x4=class{static{o(this,"DefaultLangiumDocuments")}constructor(e){this.documentTrie=new sv,this.services=e,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.documentBuilder=()=>e.workspace.DocumentBuilder}get all(){return Hr(this.documentTrie.all())}addDocument(e){let r=e.uri.toString();if(this.documentTrie.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentTrie.insert(r,e)}getDocument(e){let r=e.toString();return this.documentTrie.find(r)}getDocuments(e){let r=e.toString();return this.documentTrie.findAll(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentTrie.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentTrie.find(r);return n&&this.documentBuilder().resetToState(n,qr.Changed),n}deleteDocument(e){let r=e.toString(),n=this.documentTrie.find(r);return n&&(n.state=qr.Changed,this.documentTrie.delete(r)),n}deleteDocuments(e){let r=e.toString(),n=this.documentTrie.findAll(r);for(let i of n)i.state=qr.Changed;return this.documentTrie.delete(r),n}}});var Am,b4,Oz=O(()=>{"use strict";Bl();kc();us();$l();ov();Am=Symbol("RefResolving"),b4=class{static{o(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator,this.profiler=e.shared.profilers.LangiumProfiler,this.languageId=e.LanguageMetaData.languageId}async link(e,r=Nr.CancellationToken.None){if(this.profiler?.isActive("linking")){let n=this.profiler.createTask("linking",this.languageId);n.start();try{for(let i of Ps(e.parseResult.value))await Ci(r),Id(i).forEach(a=>{let s=`${i.$type}:${a.property}`;n.startSubTask(s);try{this.doLink(a,e)}finally{n.stopSubTask(s)}})}finally{n.stop()}}else for(let n of Ps(e.parseResult.value))await Ci(r),Id(n).forEach(i=>this.doLink(i,e))}doLink(e,r){let n=e.reference;if("_ref"in n&&n._ref===void 0){n._ref=Am;try{let i=this.getCandidate(e);if(j0(i))n._ref=i;else{n._nodeDescription=i;let a=this.loadAstNode(i);n._ref=a??this.createLinkingError(e,i)}}catch(i){console.error(`An error occurred while resolving reference to '${n.$refText}':`,i);let a=i.message??String(i);n._ref={info:e,message:`An error occurred while resolving reference to '${n.$refText}': ${a}`}}r.references.push(n)}else if("_items"in n&&n._items===void 0){n._items=Am;try{let i=this.getCandidates(e),a=[];if(j0(i))n._linkingError=i;else for(let s of i){let l=this.loadAstNode(s);l&&a.push({ref:l,$nodeDescription:s})}n._items=a}catch(i){n._linkingError={info:e,message:`An error occurred while resolving reference to '${n.$refText}': ${i}`},n._items=[]}r.references.push(n)}}unlink(e){for(let r of e.references)"_ref"in r?(r._ref=void 0,delete r._nodeDescription):"_items"in r&&(r._items=void 0,delete r._linkingError);e.references=[]}getCandidate(e){return this.scopeProvider.getScope(e).getElement(e.reference.$refText)??this.createLinkingError(e)}getCandidates(e){let n=this.scopeProvider.getScope(e).getElements(e.reference.$refText).distinct(i=>`${i.documentUri}#${i.path}`).toArray();return n.length>0?n:this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,_ref:void 0,get ref(){if(Si(this._ref))return this._ref;if(PB(this._nodeDescription)){let l=a.loadAstNode(this._nodeDescription);this._ref=l??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=Am;let l=hy(e).$document,u=a.getLinkedNode({reference:s,container:e,property:r});if(u.error&&l&&l.state0))return this._linkingError=a.createLinkingError({reference:s,container:e,property:r})}};return s}throwCyclicReferenceError(e,r,n){throw new Error(`Cyclic reference resolution detected: ${this.astNodeLocator.getAstNodePath(e)}/${r} (symbol '${n}')`)}getLinkedNode(e){try{let r=this.getCandidate(e);if(j0(r))return{error:r};let n=this.loadAstNode(r);return n?{node:n,descr:r}:{descr:r,error:this.createLinkingError(e,r)}}catch(r){console.error(`An error occurred while resolving reference to '${e.reference.$refText}':`,r);let n=r.message??String(r);return{error:{info:e,message:`An error occurred while resolving reference to '${e.reference.$refText}': ${n}`}}}}loadAstNode(e){if(e.node)return e.node;let r=this.langiumDocuments().getDocument(e.documentUri);if(r)return this.astNodeLocator.getAstNode(r.parseResult.value,e.path)}createLinkingError(e,r){let n=hy(e.container).$document;n&&n.state{"use strict";Rc();o(Ive,"isNamed");T4=class{static{o(this,"DefaultNameProvider")}getName(e){if(Ive(e))return e.name}getNameNode(e){return LT(e.$cstNode,"name")}}});var w4,Bz=O(()=>{"use strict";Rc();kc();us();Sc();Os();Nc();Zo();w4=class{static{o(this,"DefaultReferences")}constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator,this.documents=e.shared.workspace.LangiumDocuments,this.hasMultiReference=Ps(e.Grammar).some(r=>_c(r)&&r.isMulti)}findDeclarations(e){if(e){let r=EF(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(oa(i)||Xo(i))return AC(i);if(Array.isArray(i)){for(let a of i)if((oa(a)||Xo(a))&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return AC(a)}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||sF(e,i)))return this.getSelfNodes(n)}}return[]}getSelfNodes(e){if(this.hasMultiReference){let r=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e)),n=this.getNodeFromReferenceDescription(r.head());if(n){for(let i of Id(n))if(Xo(i.reference)&&i.reference.items.some(a=>a.ref===e))return i.reference.items.map(a=>a.ref)}return[e]}else return[e]}getNodeFromReferenceDescription(e){if(!e)return;let r=this.documents.getDocument(e.sourceUri);if(r)return this.nodeLocator.getAstNode(r.parseResult.value,e.sourcePath)}findDeclarationNodes(e){let r=this.findDeclarations(e),n=[];for(let i of r){let a=this.nameProvider.getNameNode(i)??i.$cstNode;a&&n.push(a)}return n}findReferences(e,r){let n=[];r.includeDeclaration&&n.push(...this.getSelfReferences(e));let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>Fi.equals(a.sourceUri,r.documentUri))),n.push(...i),Hr(n)}getSelfReferences(e){let r=this.getSelfNodes(e),n=[];for(let i of r){let a=this.nameProvider.getNameNode(i);if(a){let s=cs(i),l=this.nodeLocator.getAstNodePath(i);n.push({sourceUri:s.uri,sourcePath:l,targetUri:s.uri,targetPath:l,segment:om(a),local:!0})}}return n}}});var fs,_m,Kd=O(()=>{"use strict";Os();fs=class{static{o(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return cy.sum(Hr(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){return this.map.get(e)??[]}getStream(e){let r=this.map.get(e);return r?Hr(r):Md}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return Hr(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return Hr(this.map.keys())}values(){return Hr(this.map.values()).flat()}entriesGroupedByKey(){return Hr(this.map.entries())}},_m=class{static{o(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var k4,Fz=O(()=>{"use strict";us();Bl();Kd();$l();k4=class{static{o(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async collectExportedSymbols(e,r=Nr.CancellationToken.None){return this.collectExportedSymbolsForNode(e.parseResult.value,e,void 0,r)}async collectExportedSymbolsForNode(e,r,n=dT,i=Nr.CancellationToken.None){let a=[];this.addExportedSymbol(e,a,r);for(let s of n(e))await Ci(i),this.addExportedSymbol(s,a,r);return a}addExportedSymbol(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async collectLocalSymbols(e,r=Nr.CancellationToken.None){let n=e.parseResult.value,i=new fs;for(let a of Ec(n))await Ci(r),this.addLocalSymbol(a,e,i);return i}addLocalSymbol(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var lv,$z,E4,ait,zz=O(()=>{"use strict";Kd();Os();lv=class{static{o(this,"StreamScope")}constructor(e,r,n){this.elements=e,this.outerScope=r,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.caseInsensitive?this.elements.find(i=>i.name.toLowerCase()===r):this.elements.find(i=>i.name===e);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.caseInsensitive?this.elements.filter(i=>i.name.toLowerCase()===r):this.elements.filter(i=>i.name===e);return(this.concatOuterScope||n.isEmpty())&&this.outerScope?n.concat(this.outerScope.getElements(e)):n}},$z=class{static{o(this,"MapScope")}constructor(e,r,n){this.elements=new Map,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0;for(let i of e){let a=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.set(a,i)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r),i=n?[n]:[];return(this.concatOuterScope||i.length>0)&&this.outerScope?Hr(i).concat(this.outerScope.getElements(e)):Hr(i)}getAllElements(){let e=Hr(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},E4=class{static{o(this,"MultiMapScope")}constructor(e,r,n){this.elements=new fs,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0;for(let i of e){let a=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.add(a,i)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r)[0];if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);return(this.concatOuterScope||n.length===0)&&this.outerScope?Hr(n).concat(this.outerScope.getElements(e)):Hr(n)}getAllElements(){let e=Hr(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},ait={getElement(){},getElements(){return Md},getAllElements(){return Md}}});var cv,S4,Dm,uA,uv,hA=O(()=>{"use strict";cv=class{static{o(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},S4=class extends cv{static{o(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},Dm=class extends cv{static{o(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},uA=class extends Dm{static{o(this,"DocumentCache")}constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let a of i)this.clear(a)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let a=n.concat(i);for(let s of a)this.clear(s)}))}},uv=class extends S4{static{o(this,"WorkspaceCache")}constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var C4,Gz=O(()=>{"use strict";zz();us();Os();hA();C4=class{static{o(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new uv(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=cs(e.container).localSymbols;if(i){let s=e.container;do i.has(s)&&r.push(i.getStream(s).filter(l=>this.reflection.isSubtype(l.type,n))),s=s.$container;while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new lv(Hr(e),r,n)}createScopeForNodes(e,r,n){let i=Hr(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new lv(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new E4(this.indexManager.allElements(e)))}}});function Vz(t){return typeof t.$comment=="string"}function Ove(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var A4,fA=O(()=>{"use strict";Iz();kc();us();Rc();o(Vz,"isAstNodeWithComment");o(Ove,"isIntermediateReference");A4=class{static{o(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,a=o((l,u)=>this.replacer(l,u,n),"defaultReplacer"),s=i?(l,u)=>i(l,u,a):a;try{return this.currentDocument=cs(e),JSON.stringify(e,s,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:l}){if(!this.ignoreProperties.has(e))if(oa(r)){let u=r.ref,h=n?r.$refText:void 0;if(u){let f=cs(u),d="";this.currentDocument&&this.currentDocument!==f&&(l?d=l(f.uri,u):d=f.uri.toString());let p=this.astNodeLocator.getAstNodePath(u);return{$ref:`${d}#${p}`,$refText:h}}else return{$error:r.error?.message??"Could not resolve reference",$refText:h}}else if(Xo(r)){let u=n?r.$refText:void 0,h=[];for(let f of r.items){let d=f.ref,p=cs(f.ref),m="";this.currentDocument&&this.currentDocument!==p&&(l?m=l(p.uri,d):m=p.uri.toString());let g=this.astNodeLocator.getAstNodePath(d);h.push(`${m}#${g}`)}return{$refs:h,$refText:u}}else if(Si(r)){let u;if(a&&(u=this.addAstNodeRegionWithAssignmentsTo({...r}),(!e||r.$document)&&u?.$textRegion&&(u.$textRegion.documentURI=this.currentDocument?.uri.toString())),i&&!e&&(u??(u={...r}),u.$sourceText=r.$cstNode?.text),s){u??(u={...r});let h=this.commentProvider.getComment(r);h&&(u.$comment=h.replace(/\r/g,""))}return u??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=o(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=bF(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[u,h]of Object.entries(e))if(Array.isArray(h))for(let f=0;f{"use strict";Nc();_4=class{static{o(this,"DefaultServiceRegistry")}get map(){return this.fileExtensionMap}constructor(e){this.languageIdMap=new Map,this.fileExtensionMap=new Map,this.fileNameMap=new Map,this.textDocuments=e?.workspace.TextDocuments}register(e){let r=e.LanguageMetaData;for(let n of r.fileExtensions)this.fileExtensionMap.has(n)&&console.warn(`The file extension ${n} is used by multiple languages. It is now assigned to '${r.languageId}'.`),this.fileExtensionMap.set(n,e);if(r.fileNames)for(let n of r.fileNames)this.fileNameMap.has(n)&&console.warn(`The file name ${n} is used by multiple languages. It is now assigned to '${r.languageId}'.`),this.fileNameMap.set(n,e);this.languageIdMap.set(r.languageId,e)}getServices(e){if(this.languageIdMap.size===0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let r=this.textDocuments?.get(e)?.languageId;if(r!==void 0){let s=this.languageIdMap.get(r);if(s)return s}let n=Fi.extname(e),i=Fi.basename(e),a=this.fileNameMap.get(i)??this.fileExtensionMap.get(n);if(!a)throw r?new Error(`The service registry contains no services for the extension '${n}' for language '${r}'.`):new Error(`The service registry contains no services for the extension '${n}'.`);return a}hasServices(e){try{return this.getServices(e),!0}catch{return!1}}get all(){return Array.from(this.languageIdMap.values())}}});function Rm(t){return{code:t}}var dA,D4,pA=O(()=>{"use strict";tl();Kd();$l();Os();o(Rm,"diagnosticData");(function(t){t.defaults=["fast","slow","built-in"],t.all=t.defaults})(dA||(dA={}));D4=class{static{o(this,"ValidationRegistry")}constructor(e){this.entries=new fs,this.knownCategories=new Set(dA.defaults),this.entriesBefore=[],this.entriesAfter=[],this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");this.knownCategories.add(n);for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let l of s){let u={check:this.wrapValidationException(l,r),category:n};this.addEntry(i,u)}else if(typeof s=="function"){let l={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,l)}else Ou(s)}}wrapValidationException(e,r){return async(n,i,a)=>{await this.handleException(()=>e.call(r,n,i,a),"An error occurred during validation",i,n)}}async handleException(e,r,n,i){try{await e()}catch(a){if(Gu(a))throw a;console.error(`${r}:`,a),a instanceof Error&&a.stack&&console.error(a.stack);let s=a instanceof Error?a.message:String(a);n("error",`${r}: ${s}`,{node:i})}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=Hr(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return async(i,a,s,l)=>{await this.handleException(()=>e.call(n,i,a,s,l),r,a,i)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}getAllValidationCategories(e){return this.knownCategories}}});function Bve(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=LT(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=wF(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function mA(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function Fve(t){switch(t){case"error":return Rm(zl.LexingError);case"warning":return Rm(zl.LexingWarning);case"info":return Rm(zl.LexingInfo);case"hint":return Rm(zl.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var Pve,R4,zl,Uz=O(()=>{"use strict";Bl();Rc();us();Sc();$l();pA();Pve=Object.freeze({validateNode:!0,validateChildren:!0}),R4=class{static{o(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData,this.profiler=e.shared.profilers.LangiumProfiler,this.languageId=e.LanguageMetaData.languageId}async validateDocument(e,r={},n=Nr.CancellationToken.None){let i=e.parseResult,a=[];if(await Ci(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>s.data?.code===zl.LexingError)||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>s.data?.code===zl.ParsingError))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>s.data?.code===zl.LinkingError))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(Gu(s))throw s;console.error("An error occurred during validation:",s)}return await Ci(n),a}processLexingErrors(e,r,n){let i=[...e.lexerErrors,...e.lexerReport?.diagnostics??[]];for(let a of i){let s=a.severity??"error",l={severity:mA(s),range:{start:{line:a.line-1,character:a.column-1},end:{line:a.line-1,character:a.column+a.length-1}},message:a.message,data:Fve(s),source:this.getSource()};r.push(l)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let l={line:0,character:0};a={start:l,end:l}}else{let l={line:s.endLine-1,character:s.endColumn};a={start:l,end:l}}}}else a=by(i.token);if(a){let s={severity:mA("error"),range:a,message:i.message,data:Rm(zl.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.info.container,range:i.$refNode?.range,property:a.info.property,index:a.info.index,data:{code:zl.LinkingError,containerType:a.info.container.$type,property:a.info.property,refText:a.info.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=Nr.CancellationToken.None){let i=[],a=o((s,l,u)=>{i.push(this.toDiagnostic(s,l,u))},"acceptor");return await this.validateAstBefore(e,r,a,n),await this.validateAstNodes(e,r,a,n),await this.validateAstAfter(e,r,a,n),i}async validateAstBefore(e,r,n,i=Nr.CancellationToken.None){let a=this.validationRegistry.checksBefore;for(let s of a)await Ci(i),await s(e,n,r.categories??[],i)}async validateAstNodes(e,r,n,i=Nr.CancellationToken.None){if(this.profiler?.isActive("validating")){let a=this.profiler.createTask("validating",this.languageId);a.start();try{let s=Ps(e).iterator();for(let l of s){a.startSubTask(l.$type);let u=this.validateSingleNodeOptions(l,r);if(u.validateNode)try{let h=this.validationRegistry.getChecks(l.$type,r.categories);for(let f of h)await f(l,n,i)}finally{a.stopSubTask(l.$type)}u.validateChildren||s.prune()}}finally{a.stop()}}else{let a=Ps(e).iterator();for(let s of a){await Ci(i);let l=this.validateSingleNodeOptions(s,r);if(l.validateNode){let u=this.validationRegistry.getChecks(s.$type,r.categories);for(let h of u)await h(s,n,i)}l.validateChildren||a.prune()}}}validateSingleNodeOptions(e,r){return Pve}async validateAstAfter(e,r,n,i=Nr.CancellationToken.None){let a=this.validationRegistry.checksAfter;for(let s of a)await Ci(i),await s(e,n,r.categories??[],i)}toDiagnostic(e,r,n){return{message:r,range:Bve(n),severity:mA(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};o(Bve,"getDiagnosticRange");o(mA,"toDiagnosticSeverity");o(Fve,"toDiagnosticData");(function(t){t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(zl||(zl={}))});var L4,N4,Wz=O(()=>{"use strict";Bl();kc();us();Sc();$l();Nc();L4=class{static{o(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??cs(e);r??(r=this.nameProvider.getName(e));let a=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${a} has no name.`);let s,l=o(()=>s??(s=om(this.nameProvider.getNameNode(e)??e.$cstNode)),"nameSegmentGetter");return{node:e,name:r,get nameSegment(){return l()},selectionSegment:om(e.$cstNode),type:e.$type,documentUri:i.uri,path:a}}},N4=class{static{o(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=Nr.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of Ps(i))await Ci(r),Id(a).forEach(s=>{s.reference.error||n.push(...this.createInfoDescriptions(s))});return n}createInfoDescriptions(e){let r=e.reference;if(r.error||!r.$refNode)return[];let n=[];oa(r)&&r.$nodeDescription?n=[r.$nodeDescription]:Xo(r)&&(n=r.items.map(u=>u.$nodeDescription).filter(u=>u!==void 0));let i=cs(e.container).uri,a=this.nodeLocator.getAstNodePath(e.container),s=[],l=om(r.$refNode);for(let u of n)s.push({sourceUri:i,sourcePath:a,targetUri:u.documentUri,targetPath:u.path,segment:l,local:Fi.equals(u.documentUri,i)});return s}}});var M4,Hz=O(()=>{"use strict";M4=class{static{o(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let l=a.substring(0,s),u=parseInt(a.substring(s+1));return i[l]?.[u]}return i[a]},e)}}});var pi={};var gA=O(()=>{"use strict";jr(pi,Ra(Cm(),1))});var I4,Yz=O(()=>{"use strict";gA();$l();I4=class{static{o(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new Vs,this.onConfigurationSectionUpdateEmitter=new pi.Emitter,this.settings={},this.workspaceConfig=!1,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){this.workspaceConfig=e.capabilities.workspace?.configuration??!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){typeof e.settings!="object"||e.settings===null||Object.entries(e.settings).forEach(([r,n])=>{this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}});var vG=nr(lr=>{"use strict";Object.defineProperty(lr,"__esModule",{value:!0});lr.Message=lr.NotificationType9=lr.NotificationType8=lr.NotificationType7=lr.NotificationType6=lr.NotificationType5=lr.NotificationType4=lr.NotificationType3=lr.NotificationType2=lr.NotificationType1=lr.NotificationType0=lr.NotificationType=lr.RequestType9=lr.RequestType8=lr.RequestType7=lr.RequestType6=lr.RequestType5=lr.RequestType4=lr.RequestType3=lr.RequestType2=lr.RequestType1=lr.RequestType=lr.RequestType0=lr.AbstractMessageSignature=lr.ParameterStructures=lr.ResponseError=lr.ErrorCodes=void 0;var Lm=tv(),jz;(function(t){t.ParseError=-32700,t.InvalidRequest=-32600,t.MethodNotFound=-32601,t.InvalidParams=-32602,t.InternalError=-32603,t.jsonrpcReservedErrorRangeStart=-32099,t.serverErrorStart=-32099,t.MessageWriteError=-32099,t.MessageReadError=-32098,t.PendingResponseRejected=-32097,t.ConnectionInactive=-32096,t.ServerNotInitialized=-32002,t.UnknownErrorCode=-32001,t.jsonrpcReservedErrorRangeEnd=-32e3,t.serverErrorEnd=-32e3})(jz||(lr.ErrorCodes=jz={}));var Xz=class t extends Error{static{o(this,"ResponseError")}constructor(e,r,n){super(r),this.code=Lm.number(e)?e:jz.UnknownErrorCode,this.data=n,Object.setPrototypeOf(this,t.prototype)}toJson(){let e={code:this.code,message:this.message};return this.data!==void 0&&(e.data=this.data),e}};lr.ResponseError=Xz;var So=class t{static{o(this,"ParameterStructures")}constructor(e){this.kind=e}static is(e){return e===t.auto||e===t.byName||e===t.byPosition}toString(){return this.kind}};lr.ParameterStructures=So;So.auto=new So("auto");So.byPosition=new So("byPosition");So.byName=new So("byName");var ni=class{static{o(this,"AbstractMessageSignature")}constructor(e,r){this.method=e,this.numberOfParams=r}get parameterStructures(){return So.auto}};lr.AbstractMessageSignature=ni;var Kz=class extends ni{static{o(this,"RequestType0")}constructor(e){super(e,0)}};lr.RequestType0=Kz;var Qz=class extends ni{static{o(this,"RequestType")}constructor(e,r=So.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};lr.RequestType=Qz;var Zz=class extends ni{static{o(this,"RequestType1")}constructor(e,r=So.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};lr.RequestType1=Zz;var Jz=class extends ni{static{o(this,"RequestType2")}constructor(e){super(e,2)}};lr.RequestType2=Jz;var eG=class extends ni{static{o(this,"RequestType3")}constructor(e){super(e,3)}};lr.RequestType3=eG;var tG=class extends ni{static{o(this,"RequestType4")}constructor(e){super(e,4)}};lr.RequestType4=tG;var rG=class extends ni{static{o(this,"RequestType5")}constructor(e){super(e,5)}};lr.RequestType5=rG;var nG=class extends ni{static{o(this,"RequestType6")}constructor(e){super(e,6)}};lr.RequestType6=nG;var iG=class extends ni{static{o(this,"RequestType7")}constructor(e){super(e,7)}};lr.RequestType7=iG;var aG=class extends ni{static{o(this,"RequestType8")}constructor(e){super(e,8)}};lr.RequestType8=aG;var sG=class extends ni{static{o(this,"RequestType9")}constructor(e){super(e,9)}};lr.RequestType9=sG;var oG=class extends ni{static{o(this,"NotificationType")}constructor(e,r=So.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};lr.NotificationType=oG;var lG=class extends ni{static{o(this,"NotificationType0")}constructor(e){super(e,0)}};lr.NotificationType0=lG;var cG=class extends ni{static{o(this,"NotificationType1")}constructor(e,r=So.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};lr.NotificationType1=cG;var uG=class extends ni{static{o(this,"NotificationType2")}constructor(e){super(e,2)}};lr.NotificationType2=uG;var hG=class extends ni{static{o(this,"NotificationType3")}constructor(e){super(e,3)}};lr.NotificationType3=hG;var fG=class extends ni{static{o(this,"NotificationType4")}constructor(e){super(e,4)}};lr.NotificationType4=fG;var dG=class extends ni{static{o(this,"NotificationType5")}constructor(e){super(e,5)}};lr.NotificationType5=dG;var pG=class extends ni{static{o(this,"NotificationType6")}constructor(e){super(e,6)}};lr.NotificationType6=pG;var mG=class extends ni{static{o(this,"NotificationType7")}constructor(e){super(e,7)}};lr.NotificationType7=mG;var gG=class extends ni{static{o(this,"NotificationType8")}constructor(e){super(e,8)}};lr.NotificationType8=gG;var yG=class extends ni{static{o(this,"NotificationType9")}constructor(e){super(e,9)}};lr.NotificationType9=yG;var $ve;(function(t){function e(i){let a=i;return a&&Lm.string(a.method)&&(Lm.string(a.id)||Lm.number(a.id))}o(e,"isRequest"),t.isRequest=e;function r(i){let a=i;return a&&Lm.string(a.method)&&i.id===void 0}o(r,"isNotification"),t.isNotification=r;function n(i){let a=i;return a&&(a.result!==void 0||!!a.error)&&(Lm.string(a.id)||Lm.number(a.id)||a.id===null)}o(n,"isResponse"),t.isResponse=n})($ve||(lr.Message=$ve={}))});var bG=nr(Qd=>{"use strict";var zve;Object.defineProperty(Qd,"__esModule",{value:!0});Qd.LRUCache=Qd.LinkedMap=Qd.Touch=void 0;var ds;(function(t){t.None=0,t.First=1,t.AsOld=t.First,t.Last=2,t.AsNew=t.Last})(ds||(Qd.Touch=ds={}));var yA=class{static{o(this,"LinkedMap")}constructor(){this[zve]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){return this._head?.value}get last(){return this._tail?.value}has(e){return this._map.has(e)}get(e,r=ds.None){let n=this._map.get(e);if(n)return r!==ds.None&&this.touch(n,r),n.value}set(e,r,n=ds.None){let i=this._map.get(e);if(i)i.value=r,n!==ds.None&&this.touch(i,n);else{switch(i={key:e,value:r,next:void 0,previous:void 0},n){case ds.None:this.addItemLast(i);break;case ds.First:this.addItemFirst(i);break;case ds.Last:this.addItemLast(i);break;default:this.addItemLast(i);break}this._map.set(e,i),this._size++}return this}delete(e){return!!this.remove(e)}remove(e){let r=this._map.get(e);if(r)return this._map.delete(e),this.removeItem(r),this._size--,r.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");let e=this._head;return this._map.delete(e.key),this.removeItem(e),this._size--,e.value}forEach(e,r){let n=this._state,i=this._head;for(;i;){if(r?e.bind(r)(i.value,i.key,this):e(i.value,i.key,this),this._state!==n)throw new Error("LinkedMap got modified during iteration.");i=i.next}}keys(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:o(()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:r.key,done:!1};return r=r.next,i}else return{value:void 0,done:!0}},"next")};return n}values(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:o(()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:r.value,done:!1};return r=r.next,i}else return{value:void 0,done:!0}},"next")};return n}entries(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:o(()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:[r.key,r.value],done:!1};return r=r.next,i}else return{value:void 0,done:!0}},"next")};return n}[(zve=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(e){if(e>=this.size)return;if(e===0){this.clear();return}let r=this._head,n=this.size;for(;r&&n>e;)this._map.delete(r.key),r=r.next,n--;this._head=r,this._size=n,r&&(r.previous=void 0),this._state++}addItemFirst(e){if(!this._head&&!this._tail)this._tail=e;else if(this._head)e.next=this._head,this._head.previous=e;else throw new Error("Invalid list");this._head=e,this._state++}addItemLast(e){if(!this._head&&!this._tail)this._head=e;else if(this._tail)e.previous=this._tail,this._tail.next=e;else throw new Error("Invalid list");this._tail=e,this._state++}removeItem(e){if(e===this._head&&e===this._tail)this._head=void 0,this._tail=void 0;else if(e===this._head){if(!e.next)throw new Error("Invalid list");e.next.previous=void 0,this._head=e.next}else if(e===this._tail){if(!e.previous)throw new Error("Invalid list");e.previous.next=void 0,this._tail=e.previous}else{let r=e.next,n=e.previous;if(!r||!n)throw new Error("Invalid list");r.previous=n,n.next=r}e.next=void 0,e.previous=void 0,this._state++}touch(e,r){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(r!==ds.First&&r!==ds.Last)){if(r===ds.First){if(e===this._head)return;let n=e.next,i=e.previous;e===this._tail?(i.next=void 0,this._tail=i):(n.previous=i,i.next=n),e.previous=void 0,e.next=this._head,this._head.previous=e,this._head=e,this._state++}else if(r===ds.Last){if(e===this._tail)return;let n=e.next,i=e.previous;e===this._head?(n.previous=void 0,this._head=n):(n.previous=i,i.next=n),e.next=void 0,e.previous=this._tail,this._tail.next=e,this._tail=e,this._state++}}}toJSON(){let e=[];return this.forEach((r,n)=>{e.push([n,r])}),e}fromJSON(e){this.clear();for(let[r,n]of e)this.set(r,n)}};Qd.LinkedMap=yA;var xG=class extends yA{static{o(this,"LRUCache")}constructor(e,r=1){super(),this._limit=e,this._ratio=Math.min(Math.max(0,r),1)}get limit(){return this._limit}set limit(e){this._limit=e,this.checkTrim()}get ratio(){return this._ratio}set ratio(e){this._ratio=Math.min(Math.max(0,e),1),this.checkTrim()}get(e,r=ds.AsNew){return super.get(e,r)}peek(e){return super.get(e,ds.None)}set(e,r){return super.set(e,r,ds.Last),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}};Qd.LRUCache=xG});var Vve=nr(vA=>{"use strict";Object.defineProperty(vA,"__esModule",{value:!0});vA.Disposable=void 0;var Gve;(function(t){function e(r){return{dispose:r}}o(e,"create"),t.create=e})(Gve||(vA.Disposable=Gve={}))});var qve=nr(hv=>{"use strict";Object.defineProperty(hv,"__esModule",{value:!0});hv.SharedArrayReceiverStrategy=hv.SharedArraySenderStrategy=void 0;var sit=y4(),O4;(function(t){t.Continue=0,t.Cancelled=1})(O4||(O4={}));var TG=class{static{o(this,"SharedArraySenderStrategy")}constructor(){this.buffers=new Map}enableCancellation(e){if(e.id===null)return;let r=new SharedArrayBuffer(4),n=new Int32Array(r,0,1);n[0]=O4.Continue,this.buffers.set(e.id,r),e.$cancellationData=r}async sendCancellation(e,r){let n=this.buffers.get(r);if(n===void 0)return;let i=new Int32Array(n,0,1);Atomics.store(i,0,O4.Cancelled)}cleanup(e){this.buffers.delete(e)}dispose(){this.buffers.clear()}};hv.SharedArraySenderStrategy=TG;var wG=class{static{o(this,"SharedArrayBufferCancellationToken")}constructor(e){this.data=new Int32Array(e,0,1)}get isCancellationRequested(){return Atomics.load(this.data,0)===O4.Cancelled}get onCancellationRequested(){throw new Error("Cancellation over SharedArrayBuffer doesn't support cancellation events")}},kG=class{static{o(this,"SharedArrayBufferCancellationTokenSource")}constructor(e){this.token=new wG(e)}cancel(){}dispose(){}},EG=class{static{o(this,"SharedArrayReceiverStrategy")}constructor(){this.kind="request"}createCancellationTokenSource(e){let r=e.$cancellationData;return r===void 0?new sit.CancellationTokenSource:new kG(r)}};hv.SharedArrayReceiverStrategy=EG});var CG=nr(xA=>{"use strict";Object.defineProperty(xA,"__esModule",{value:!0});xA.Semaphore=void 0;var oit=Xd(),SG=class{static{o(this,"Semaphore")}constructor(e=1){if(e<=0)throw new Error("Capacity must be greater than 0");this._capacity=e,this._active=0,this._waiting=[]}lock(e){return new Promise((r,n)=>{this._waiting.push({thunk:e,resolve:r,reject:n}),this.runNext()})}get active(){return this._active}runNext(){this._waiting.length===0||this._active===this._capacity||(0,oit.default)().timer.setImmediate(()=>this.doRunNext())}doRunNext(){if(this._waiting.length===0||this._active===this._capacity)return;let e=this._waiting.shift();if(this._active++,this._active>this._capacity)throw new Error("To many thunks active");try{let r=e.thunk();r instanceof Promise?r.then(n=>{this._active--,e.resolve(n),this.runNext()},n=>{this._active--,e.reject(n),this.runNext()}):(this._active--,e.resolve(r),this.runNext())}catch(r){this._active--,e.reject(r),this.runNext()}}};xA.Semaphore=SG});var Wve=nr(Zd=>{"use strict";Object.defineProperty(Zd,"__esModule",{value:!0});Zd.ReadableStreamMessageReader=Zd.AbstractMessageReader=Zd.MessageReader=void 0;var _G=Xd(),fv=tv(),AG=Cm(),lit=CG(),Uve;(function(t){function e(r){let n=r;return n&&fv.func(n.listen)&&fv.func(n.dispose)&&fv.func(n.onError)&&fv.func(n.onClose)&&fv.func(n.onPartialMessage)}o(e,"is"),t.is=e})(Uve||(Zd.MessageReader=Uve={}));var bA=class{static{o(this,"AbstractMessageReader")}constructor(){this.errorEmitter=new AG.Emitter,this.closeEmitter=new AG.Emitter,this.partialMessageEmitter=new AG.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e){this.errorEmitter.fire(this.asError(e))}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}get onPartialMessage(){return this.partialMessageEmitter.event}firePartialMessage(e){this.partialMessageEmitter.fire(e)}asError(e){return e instanceof Error?e:new Error(`Reader received error. Reason: ${fv.string(e.message)?e.message:"unknown"}`)}};Zd.AbstractMessageReader=bA;var DG;(function(t){function e(r){let n,i,a,s=new Map,l,u=new Map;if(r===void 0||typeof r=="string")n=r??"utf-8";else{if(n=r.charset??"utf-8",r.contentDecoder!==void 0&&(a=r.contentDecoder,s.set(a.name,a)),r.contentDecoders!==void 0)for(let h of r.contentDecoders)s.set(h.name,h);if(r.contentTypeDecoder!==void 0&&(l=r.contentTypeDecoder,u.set(l.name,l)),r.contentTypeDecoders!==void 0)for(let h of r.contentTypeDecoders)u.set(h.name,h)}return l===void 0&&(l=(0,_G.default)().applicationJson.decoder,u.set(l.name,l)),{charset:n,contentDecoder:a,contentDecoders:s,contentTypeDecoder:l,contentTypeDecoders:u}}o(e,"fromOptions"),t.fromOptions=e})(DG||(DG={}));var RG=class extends bA{static{o(this,"ReadableStreamMessageReader")}constructor(e,r){super(),this.readable=e,this.options=DG.fromOptions(r),this.buffer=(0,_G.default)().messageBuffer.create(this.options.charset),this._partialMessageTimeout=1e4,this.nextMessageLength=-1,this.messageToken=0,this.readSemaphore=new lit.Semaphore(1)}set partialMessageTimeout(e){this._partialMessageTimeout=e}get partialMessageTimeout(){return this._partialMessageTimeout}listen(e){this.nextMessageLength=-1,this.messageToken=0,this.partialMessageTimer=void 0,this.callback=e;let r=this.readable.onData(n=>{this.onData(n)});return this.readable.onError(n=>this.fireError(n)),this.readable.onClose(()=>this.fireClose()),r}onData(e){try{for(this.buffer.append(e);;){if(this.nextMessageLength===-1){let n=this.buffer.tryReadHeaders(!0);if(!n)return;let i=n.get("content-length");if(!i){this.fireError(new Error(`Header must provide a Content-Length property. -${JSON.stringify(Object.fromEntries(n))}`));return}let a=parseInt(i);if(isNaN(a)){this.fireError(new Error(`Content-Length value must be a number. Got ${i}`));return}this.nextMessageLength=a}let r=this.buffer.tryReadBody(this.nextMessageLength);if(r===void 0){this.setPartialMessageTimer();return}this.clearPartialMessageTimer(),this.nextMessageLength=-1,this.readSemaphore.lock(async()=>{let n=this.options.contentDecoder!==void 0?await this.options.contentDecoder.decode(r):r,i=await this.options.contentTypeDecoder.decode(n,this.options);this.callback(i)}).catch(n=>{this.fireError(n)})}}catch(r){this.fireError(r)}}clearPartialMessageTimer(){this.partialMessageTimer&&(this.partialMessageTimer.dispose(),this.partialMessageTimer=void 0)}setPartialMessageTimer(){this.clearPartialMessageTimer(),!(this._partialMessageTimeout<=0)&&(this.partialMessageTimer=(0,_G.default)().timer.setTimeout((e,r)=>{this.partialMessageTimer=void 0,e===this.messageToken&&(this.firePartialMessage({messageToken:e,waitingTime:r}),this.setPartialMessageTimer())},this._partialMessageTimeout,this.messageToken,this._partialMessageTimeout))}};Zd.ReadableStreamMessageReader=RG});var Kve=nr(Jd=>{"use strict";Object.defineProperty(Jd,"__esModule",{value:!0});Jd.WriteableStreamMessageWriter=Jd.AbstractMessageWriter=Jd.MessageWriter=void 0;var Hve=Xd(),P4=tv(),cit=CG(),Yve=Cm(),uit="Content-Length: ",jve=`\r -`,Xve;(function(t){function e(r){let n=r;return n&&P4.func(n.dispose)&&P4.func(n.onClose)&&P4.func(n.onError)&&P4.func(n.write)}o(e,"is"),t.is=e})(Xve||(Jd.MessageWriter=Xve={}));var TA=class{static{o(this,"AbstractMessageWriter")}constructor(){this.errorEmitter=new Yve.Emitter,this.closeEmitter=new Yve.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e,r,n){this.errorEmitter.fire([this.asError(e),r,n])}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}asError(e){return e instanceof Error?e:new Error(`Writer received error. Reason: ${P4.string(e.message)?e.message:"unknown"}`)}};Jd.AbstractMessageWriter=TA;var LG;(function(t){function e(r){return r===void 0||typeof r=="string"?{charset:r??"utf-8",contentTypeEncoder:(0,Hve.default)().applicationJson.encoder}:{charset:r.charset??"utf-8",contentEncoder:r.contentEncoder,contentTypeEncoder:r.contentTypeEncoder??(0,Hve.default)().applicationJson.encoder}}o(e,"fromOptions"),t.fromOptions=e})(LG||(LG={}));var NG=class extends TA{static{o(this,"WriteableStreamMessageWriter")}constructor(e,r){super(),this.writable=e,this.options=LG.fromOptions(r),this.errorCount=0,this.writeSemaphore=new cit.Semaphore(1),this.writable.onError(n=>this.fireError(n)),this.writable.onClose(()=>this.fireClose())}async write(e){return this.writeSemaphore.lock(async()=>this.options.contentTypeEncoder.encode(e,this.options).then(n=>this.options.contentEncoder!==void 0?this.options.contentEncoder.encode(n):n).then(n=>{let i=[];return i.push(uit,n.byteLength.toString(),jve),i.push(jve),this.doWrite(e,i,n)},n=>{throw this.fireError(n),n}))}async doWrite(e,r,n){try{return await this.writable.write(r.join(""),"ascii"),this.writable.write(n)}catch(i){return this.handleError(i,e),Promise.reject(i)}}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){this.writable.end()}};Jd.WriteableStreamMessageWriter=NG});var Qve=nr(wA=>{"use strict";Object.defineProperty(wA,"__esModule",{value:!0});wA.AbstractMessageBuffer=void 0;var hit=13,fit=10,dit=`\r -`,MG=class{static{o(this,"AbstractMessageBuffer")}constructor(e="utf-8"){this._encoding=e,this._chunks=[],this._totalLength=0}get encoding(){return this._encoding}append(e){let r=typeof e=="string"?this.fromString(e,this._encoding):e;this._chunks.push(r),this._totalLength+=r.byteLength}tryReadHeaders(e=!1){if(this._chunks.length===0)return;let r=0,n=0,i=0,a=0;e:for(;nthis._totalLength)throw new Error("Cannot read so many bytes!");if(this._chunks[0].byteLength===e){let a=this._chunks[0];return this._chunks.shift(),this._totalLength-=e,this.asNative(a)}if(this._chunks[0].byteLength>e){let a=this._chunks[0],s=this.asNative(a,e);return this._chunks[0]=a.slice(e),this._totalLength-=e,s}let r=this.allocNative(e),n=0,i=0;for(;e>0;){let a=this._chunks[i];if(a.byteLength>e){let s=a.slice(0,e);r.set(s,n),n+=e,this._chunks[i]=a.slice(e),this._totalLength-=e,e-=e}else r.set(a,n),n+=a.byteLength,this._chunks.shift(),this._totalLength-=a.byteLength,e-=a.byteLength}return r}};wA.AbstractMessageBuffer=MG});var r2e=nr(Rr=>{"use strict";Object.defineProperty(Rr,"__esModule",{value:!0});Rr.createMessageConnection=Rr.ConnectionOptions=Rr.MessageStrategy=Rr.CancellationStrategy=Rr.CancellationSenderStrategy=Rr.CancellationReceiverStrategy=Rr.RequestCancellationReceiverStrategy=Rr.IdCancellationReceiverStrategy=Rr.ConnectionStrategy=Rr.ConnectionError=Rr.ConnectionErrors=Rr.LogTraceNotification=Rr.SetTraceNotification=Rr.TraceFormat=Rr.TraceValues=Rr.Trace=Rr.NullLogger=Rr.ProgressType=Rr.ProgressToken=void 0;var Zve=Xd(),Ai=tv(),br=vG(),Jve=bG(),B4=Cm(),IG=y4(),z4;(function(t){t.type=new br.NotificationType("$/cancelRequest")})(z4||(z4={}));var OG;(function(t){function e(r){return typeof r=="string"||typeof r=="number"}o(e,"is"),t.is=e})(OG||(Rr.ProgressToken=OG={}));var F4;(function(t){t.type=new br.NotificationType("$/progress")})(F4||(F4={}));var PG=class{static{o(this,"ProgressType")}constructor(){}};Rr.ProgressType=PG;var BG;(function(t){function e(r){return Ai.func(r)}o(e,"is"),t.is=e})(BG||(BG={}));Rr.NullLogger=Object.freeze({error:o(()=>{},"error"),warn:o(()=>{},"warn"),info:o(()=>{},"info"),log:o(()=>{},"log")});var vn;(function(t){t[t.Off=0]="Off",t[t.Messages=1]="Messages",t[t.Compact=2]="Compact",t[t.Verbose=3]="Verbose"})(vn||(Rr.Trace=vn={}));var e2e;(function(t){t.Off="off",t.Messages="messages",t.Compact="compact",t.Verbose="verbose"})(e2e||(Rr.TraceValues=e2e={}));(function(t){function e(n){if(!Ai.string(n))return t.Off;switch(n=n.toLowerCase(),n){case"off":return t.Off;case"messages":return t.Messages;case"compact":return t.Compact;case"verbose":return t.Verbose;default:return t.Off}}o(e,"fromString"),t.fromString=e;function r(n){switch(n){case t.Off:return"off";case t.Messages:return"messages";case t.Compact:return"compact";case t.Verbose:return"verbose";default:return"off"}}o(r,"toString"),t.toString=r})(vn||(Rr.Trace=vn={}));var rl;(function(t){t.Text="text",t.JSON="json"})(rl||(Rr.TraceFormat=rl={}));(function(t){function e(r){return Ai.string(r)?(r=r.toLowerCase(),r==="json"?t.JSON:t.Text):t.Text}o(e,"fromString"),t.fromString=e})(rl||(Rr.TraceFormat=rl={}));var FG;(function(t){t.type=new br.NotificationType("$/setTrace")})(FG||(Rr.SetTraceNotification=FG={}));var kA;(function(t){t.type=new br.NotificationType("$/logTrace")})(kA||(Rr.LogTraceNotification=kA={}));var $4;(function(t){t[t.Closed=1]="Closed",t[t.Disposed=2]="Disposed",t[t.AlreadyListening=3]="AlreadyListening"})($4||(Rr.ConnectionErrors=$4={}));var dv=class t extends Error{static{o(this,"ConnectionError")}constructor(e,r){super(r),this.code=e,Object.setPrototypeOf(this,t.prototype)}};Rr.ConnectionError=dv;var $G;(function(t){function e(r){let n=r;return n&&Ai.func(n.cancelUndispatched)}o(e,"is"),t.is=e})($G||(Rr.ConnectionStrategy=$G={}));var EA;(function(t){function e(r){let n=r;return n&&(n.kind===void 0||n.kind==="id")&&Ai.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Ai.func(n.dispose))}o(e,"is"),t.is=e})(EA||(Rr.IdCancellationReceiverStrategy=EA={}));var zG;(function(t){function e(r){let n=r;return n&&n.kind==="request"&&Ai.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Ai.func(n.dispose))}o(e,"is"),t.is=e})(zG||(Rr.RequestCancellationReceiverStrategy=zG={}));var SA;(function(t){t.Message=Object.freeze({createCancellationTokenSource(r){return new IG.CancellationTokenSource}});function e(r){return EA.is(r)||zG.is(r)}o(e,"is"),t.is=e})(SA||(Rr.CancellationReceiverStrategy=SA={}));var CA;(function(t){t.Message=Object.freeze({sendCancellation(r,n){return r.sendNotification(z4.type,{id:n})},cleanup(r){}});function e(r){let n=r;return n&&Ai.func(n.sendCancellation)&&Ai.func(n.cleanup)}o(e,"is"),t.is=e})(CA||(Rr.CancellationSenderStrategy=CA={}));var AA;(function(t){t.Message=Object.freeze({receiver:SA.Message,sender:CA.Message});function e(r){let n=r;return n&&SA.is(n.receiver)&&CA.is(n.sender)}o(e,"is"),t.is=e})(AA||(Rr.CancellationStrategy=AA={}));var _A;(function(t){function e(r){let n=r;return n&&Ai.func(n.handleMessage)}o(e,"is"),t.is=e})(_A||(Rr.MessageStrategy=_A={}));var t2e;(function(t){function e(r){let n=r;return n&&(AA.is(n.cancellationStrategy)||$G.is(n.connectionStrategy)||_A.is(n.messageStrategy))}o(e,"is"),t.is=e})(t2e||(Rr.ConnectionOptions=t2e={}));var Mc;(function(t){t[t.New=1]="New",t[t.Listening=2]="Listening",t[t.Closed=3]="Closed",t[t.Disposed=4]="Disposed"})(Mc||(Mc={}));function pit(t,e,r,n){let i=r!==void 0?r:Rr.NullLogger,a=0,s=0,l=0,u="2.0",h,f=new Map,d,p=new Map,m=new Map,g,y=new Jve.LinkedMap,v=new Map,x=new Set,b=new Map,T=vn.Off,E=rl.Text,w,k=Mc.New,S=new B4.Emitter,A=new B4.Emitter,L=new B4.Emitter,I=new B4.Emitter,N=new B4.Emitter,C=n&&n.cancellationStrategy?n.cancellationStrategy:AA.Message;function _(j){if(j===null)throw new Error("Can't send requests with id null since the response can't be correlated.");return"req-"+j.toString()}o(_,"createRequestQueueKey");function D(j){return j===null?"res-unknown-"+(++l).toString():"res-"+j.toString()}o(D,"createResponseQueueKey");function M(){return"not-"+(++s).toString()}o(M,"createNotificationQueueKey");function R(j,ae){br.Message.isRequest(ae)?j.set(_(ae.id),ae):br.Message.isResponse(ae)?j.set(D(ae.id),ae):j.set(M(),ae)}o(R,"addMessageToQueue");function P(j){}o(P,"cancelUndispatched");function B(){return k===Mc.Listening}o(B,"isListening");function F(){return k===Mc.Closed}o(F,"isClosed");function G(){return k===Mc.Disposed}o(G,"isDisposed");function $(){(k===Mc.New||k===Mc.Listening)&&(k=Mc.Closed,A.fire(void 0))}o($,"closeHandler");function V(j){S.fire([j,void 0,void 0])}o(V,"readErrorHandler");function X(j){S.fire(j)}o(X,"writeErrorHandler"),t.onClose($),t.onError(V),e.onClose($),e.onError(X);function Q(){g||y.size===0||(g=(0,Zve.default)().timer.setImmediate(()=>{g=void 0,ie()}))}o(Q,"triggerMessageQueue");function H(j){br.Message.isRequest(j)?le(j):br.Message.isNotification(j)?J(j):br.Message.isResponse(j)?ee(j):te(j)}o(H,"handleMessage");function ie(){if(y.size===0)return;let j=y.shift();try{let ae=n?.messageStrategy;_A.is(ae)?ae.handleMessage(j,H):H(j)}finally{Q()}}o(ie,"processMessageQueue");let Y=o(j=>{try{if(br.Message.isNotification(j)&&j.method===z4.type.method){let ae=j.params.id,U=_(ae),ce=y.get(U);if(br.Message.isRequest(ce)){let ne=n?.connectionStrategy,se=ne&&ne.cancelUndispatched?ne.cancelUndispatched(ce,P):void 0;if(se&&(se.error!==void 0||se.result!==void 0)){y.delete(U),b.delete(ae),se.id=ce.id,Se(se,j.method,Date.now()),e.write(se).catch(()=>i.error("Sending response for canceled message failed."));return}}let z=b.get(ae);if(z!==void 0){z.cancel(),ke(j);return}else x.add(ae)}R(y,j)}finally{Q()}},"callback");function le(j){if(G())return;function ae(pe,me,Re){let ge={jsonrpc:u,id:j.id};pe instanceof br.ResponseError?ge.error=pe.toJson():ge.result=pe===void 0?null:pe,Se(ge,me,Re),e.write(ge).catch(()=>i.error("Sending response failed."))}o(ae,"reply");function U(pe,me,Re){let ge={jsonrpc:u,id:j.id,error:pe.toJson()};Se(ge,me,Re),e.write(ge).catch(()=>i.error("Sending response failed."))}o(U,"replyError");function ce(pe,me,Re){pe===void 0&&(pe=null);let ge={jsonrpc:u,id:j.id,result:pe};Se(ge,me,Re),e.write(ge).catch(()=>i.error("Sending response failed."))}o(ce,"replySuccess"),Me(j);let z=f.get(j.method),ne,se;z&&(ne=z.type,se=z.handler);let be=Date.now();if(se||h){let pe=j.id??String(Date.now()),me=EA.is(C.receiver)?C.receiver.createCancellationTokenSource(pe):C.receiver.createCancellationTokenSource(j);j.id!==null&&x.has(j.id)&&me.cancel(),j.id!==null&&b.set(pe,me);try{let Re;if(se)if(j.params===void 0){if(ne!==void 0&&ne.numberOfParams!==0){U(new br.ResponseError(br.ErrorCodes.InvalidParams,`Request ${j.method} defines ${ne.numberOfParams} params but received none.`),j.method,be);return}Re=se(me.token)}else if(Array.isArray(j.params)){if(ne!==void 0&&ne.parameterStructures===br.ParameterStructures.byName){U(new br.ResponseError(br.ErrorCodes.InvalidParams,`Request ${j.method} defines parameters by name but received parameters by position`),j.method,be);return}Re=se(...j.params,me.token)}else{if(ne!==void 0&&ne.parameterStructures===br.ParameterStructures.byPosition){U(new br.ResponseError(br.ErrorCodes.InvalidParams,`Request ${j.method} defines parameters by position but received parameters by name`),j.method,be);return}Re=se(j.params,me.token)}else h&&(Re=h(j.method,j.params,me.token));let ge=Re;Re?ge.then?ge.then(Ie=>{b.delete(pe),ae(Ie,j.method,be)},Ie=>{b.delete(pe),Ie instanceof br.ResponseError?U(Ie,j.method,be):Ie&&Ai.string(Ie.message)?U(new br.ResponseError(br.ErrorCodes.InternalError,`Request ${j.method} failed with message: ${Ie.message}`),j.method,be):U(new br.ResponseError(br.ErrorCodes.InternalError,`Request ${j.method} failed unexpectedly without providing any details.`),j.method,be)}):(b.delete(pe),ae(Re,j.method,be)):(b.delete(pe),ce(Re,j.method,be))}catch(Re){b.delete(pe),Re instanceof br.ResponseError?ae(Re,j.method,be):Re&&Ai.string(Re.message)?U(new br.ResponseError(br.ErrorCodes.InternalError,`Request ${j.method} failed with message: ${Re.message}`),j.method,be):U(new br.ResponseError(br.ErrorCodes.InternalError,`Request ${j.method} failed unexpectedly without providing any details.`),j.method,be)}}else U(new br.ResponseError(br.ErrorCodes.MethodNotFound,`Unhandled method ${j.method}`),j.method,be)}o(le,"handleRequest");function ee(j){if(!G())if(j.id===null)j.error?i.error(`Received response message without id: Error is: -${JSON.stringify(j.error,void 0,4)}`):i.error("Received response message without id. No further error information provided.");else{let ae=j.id,U=v.get(ae);if(we(j,U),U!==void 0){v.delete(ae);try{if(j.error){let ce=j.error;U.reject(new br.ResponseError(ce.code,ce.message,ce.data))}else if(j.result!==void 0)U.resolve(j.result);else throw new Error("Should never happen.")}catch(ce){ce.message?i.error(`Response handler '${U.method}' failed with message: ${ce.message}`):i.error(`Response handler '${U.method}' failed unexpectedly.`)}}}}o(ee,"handleResponse");function J(j){if(G())return;let ae,U;if(j.method===z4.type.method){let ce=j.params.id;x.delete(ce),ke(j);return}else{let ce=p.get(j.method);ce&&(U=ce.handler,ae=ce.type)}if(U||d)try{if(ke(j),U)if(j.params===void 0)ae!==void 0&&ae.numberOfParams!==0&&ae.parameterStructures!==br.ParameterStructures.byName&&i.error(`Notification ${j.method} defines ${ae.numberOfParams} params but received none.`),U();else if(Array.isArray(j.params)){let ce=j.params;j.method===F4.type.method&&ce.length===2&&OG.is(ce[0])?U({token:ce[0],value:ce[1]}):(ae!==void 0&&(ae.parameterStructures===br.ParameterStructures.byName&&i.error(`Notification ${j.method} defines parameters by name but received parameters by position`),ae.numberOfParams!==j.params.length&&i.error(`Notification ${j.method} defines ${ae.numberOfParams} params but received ${ce.length} arguments`)),U(...ce))}else ae!==void 0&&ae.parameterStructures===br.ParameterStructures.byPosition&&i.error(`Notification ${j.method} defines parameters by position but received parameters by name`),U(j.params);else d&&d(j.method,j.params)}catch(ce){ce.message?i.error(`Notification handler '${j.method}' failed with message: ${ce.message}`):i.error(`Notification handler '${j.method}' failed unexpectedly.`)}else L.fire(j)}o(J,"handleNotification");function te(j){if(!j){i.error("Received empty message.");return}i.error(`Received message which is neither a response nor a notification message: -${JSON.stringify(j,null,4)}`);let ae=j;if(Ai.string(ae.id)||Ai.number(ae.id)){let U=ae.id,ce=v.get(U);ce&&ce.reject(new Error("The received response has neither a result nor an error property."))}}o(te,"handleInvalidMessage");function Z(j){if(j!=null)switch(T){case vn.Verbose:return JSON.stringify(j,null,4);case vn.Compact:return JSON.stringify(j);default:return}}o(Z,"stringifyTrace");function xe(j){if(!(T===vn.Off||!w))if(E===rl.Text){let ae;(T===vn.Verbose||T===vn.Compact)&&j.params&&(ae=`Params: ${Z(j.params)} - -`),w.log(`Sending request '${j.method} - (${j.id})'.`,ae)}else _e("send-request",j)}o(xe,"traceSendingRequest");function de(j){if(!(T===vn.Off||!w))if(E===rl.Text){let ae;(T===vn.Verbose||T===vn.Compact)&&(j.params?ae=`Params: ${Z(j.params)} - -`:ae=`No parameters provided. - -`),w.log(`Sending notification '${j.method}'.`,ae)}else _e("send-notification",j)}o(de,"traceSendingNotification");function Se(j,ae,U){if(!(T===vn.Off||!w))if(E===rl.Text){let ce;(T===vn.Verbose||T===vn.Compact)&&(j.error&&j.error.data?ce=`Error data: ${Z(j.error.data)} - -`:j.result?ce=`Result: ${Z(j.result)} - -`:j.error===void 0&&(ce=`No result returned. - -`)),w.log(`Sending response '${ae} - (${j.id})'. Processing request took ${Date.now()-U}ms`,ce)}else _e("send-response",j)}o(Se,"traceSendingResponse");function Me(j){if(!(T===vn.Off||!w))if(E===rl.Text){let ae;(T===vn.Verbose||T===vn.Compact)&&j.params&&(ae=`Params: ${Z(j.params)} - -`),w.log(`Received request '${j.method} - (${j.id})'.`,ae)}else _e("receive-request",j)}o(Me,"traceReceivedRequest");function ke(j){if(!(T===vn.Off||!w||j.method===kA.type.method))if(E===rl.Text){let ae;(T===vn.Verbose||T===vn.Compact)&&(j.params?ae=`Params: ${Z(j.params)} - -`:ae=`No parameters provided. - -`),w.log(`Received notification '${j.method}'.`,ae)}else _e("receive-notification",j)}o(ke,"traceReceivedNotification");function we(j,ae){if(!(T===vn.Off||!w))if(E===rl.Text){let U;if((T===vn.Verbose||T===vn.Compact)&&(j.error&&j.error.data?U=`Error data: ${Z(j.error.data)} - -`:j.result?U=`Result: ${Z(j.result)} - -`:j.error===void 0&&(U=`No result returned. - -`)),ae){let ce=j.error?` Request failed: ${j.error.message} (${j.error.code}).`:"";w.log(`Received response '${ae.method} - (${j.id})' in ${Date.now()-ae.timerStart}ms.${ce}`,U)}else w.log(`Received response ${j.id} without active response promise.`,U)}else _e("receive-response",j)}o(we,"traceReceivedResponse");function _e(j,ae){if(!w||T===vn.Off)return;let U={isLSPMessage:!0,type:j,message:ae,timestamp:Date.now()};w.log(U)}o(_e,"logLSPMessage");function $e(){if(F())throw new dv($4.Closed,"Connection is closed.");if(G())throw new dv($4.Disposed,"Connection is disposed.")}o($e,"throwIfClosedOrDisposed");function fe(){if(B())throw new dv($4.AlreadyListening,"Connection is already listening")}o(fe,"throwIfListening");function Ke(){if(!B())throw new Error("Call listen() first.")}o(Ke,"throwIfNotListening");function Te(j){return j===void 0?null:j}o(Te,"undefinedToNull");function Be(j){if(j!==null)return j}o(Be,"nullToUndefined");function Ue(j){return j!=null&&!Array.isArray(j)&&typeof j=="object"}o(Ue,"isNamedParam");function Ge(j,ae){switch(j){case br.ParameterStructures.auto:return Ue(ae)?Be(ae):[Te(ae)];case br.ParameterStructures.byName:if(!Ue(ae))throw new Error("Received parameters by name but param is not an object literal.");return Be(ae);case br.ParameterStructures.byPosition:return[Te(ae)];default:throw new Error(`Unknown parameter structure ${j.toString()}`)}}o(Ge,"computeSingleParam");function Ne(j,ae){let U,ce=j.numberOfParams;switch(ce){case 0:U=void 0;break;case 1:U=Ge(j.parameterStructures,ae[0]);break;default:U=[];for(let z=0;z{$e();let U,ce;if(Ai.string(j)){U=j;let ne=ae[0],se=0,be=br.ParameterStructures.auto;br.ParameterStructures.is(ne)&&(se=1,be=ne);let pe=ae.length,me=pe-se;switch(me){case 0:ce=void 0;break;case 1:ce=Ge(be,ae[se]);break;default:if(be===br.ParameterStructures.byName)throw new Error(`Received ${me} parameters for 'by Name' notification parameter structure.`);ce=ae.slice(se,pe).map(Re=>Te(Re));break}}else{let ne=ae;U=j.method,ce=Ne(j,ne)}let z={jsonrpc:u,method:U,params:ce};return de(z),e.write(z).catch(ne=>{throw i.error("Sending notification failed."),ne})},"sendNotification"),onNotification:o((j,ae)=>{$e();let U;return Ai.func(j)?d=j:ae&&(Ai.string(j)?(U=j,p.set(j,{type:void 0,handler:ae})):(U=j.method,p.set(j.method,{type:j,handler:ae}))),{dispose:o(()=>{U!==void 0?p.delete(U):d=void 0},"dispose")}},"onNotification"),onProgress:o((j,ae,U)=>{if(m.has(ae))throw new Error(`Progress handler for token ${ae} already registered`);return m.set(ae,U),{dispose:o(()=>{m.delete(ae)},"dispose")}},"onProgress"),sendProgress:o((j,ae,U)=>We.sendNotification(F4.type,{token:ae,value:U}),"sendProgress"),onUnhandledProgress:I.event,sendRequest:o((j,...ae)=>{$e(),Ke();let U,ce,z;if(Ai.string(j)){U=j;let pe=ae[0],me=ae[ae.length-1],Re=0,ge=br.ParameterStructures.auto;br.ParameterStructures.is(pe)&&(Re=1,ge=pe);let Ie=ae.length;IG.CancellationToken.is(me)&&(Ie=Ie-1,z=me);let qe=Ie-Re;switch(qe){case 0:ce=void 0;break;case 1:ce=Ge(ge,ae[Re]);break;default:if(ge===br.ParameterStructures.byName)throw new Error(`Received ${qe} parameters for 'by Name' request parameter structure.`);ce=ae.slice(Re,Ie).map(Pe=>Te(Pe));break}}else{let pe=ae;U=j.method,ce=Ne(j,pe);let me=j.numberOfParams;z=IG.CancellationToken.is(pe[me])?pe[me]:void 0}let ne=a++,se;z&&(se=z.onCancellationRequested(()=>{let pe=C.sender.sendCancellation(We,ne);return pe===void 0?(i.log(`Received no promise from cancellation strategy when cancelling id ${ne}`),Promise.resolve()):pe.catch(()=>{i.log(`Sending cancellation messages for id ${ne} failed`)})}));let be={jsonrpc:u,id:ne,method:U,params:ce};return xe(be),typeof C.sender.enableCancellation=="function"&&C.sender.enableCancellation(be),new Promise(async(pe,me)=>{let Re=o(qe=>{pe(qe),C.sender.cleanup(ne),se?.dispose()},"resolveWithCleanup"),ge=o(qe=>{me(qe),C.sender.cleanup(ne),se?.dispose()},"rejectWithCleanup"),Ie={method:U,timerStart:Date.now(),resolve:Re,reject:ge};try{await e.write(be),v.set(ne,Ie)}catch(qe){throw i.error("Sending request failed."),Ie.reject(new br.ResponseError(br.ErrorCodes.MessageWriteError,qe.message?qe.message:"Unknown reason")),qe}})},"sendRequest"),onRequest:o((j,ae)=>{$e();let U=null;return BG.is(j)?(U=void 0,h=j):Ai.string(j)?(U=null,ae!==void 0&&(U=j,f.set(j,{handler:ae,type:void 0}))):ae!==void 0&&(U=j.method,f.set(j.method,{type:j,handler:ae})),{dispose:o(()=>{U!==null&&(U!==void 0?f.delete(U):h=void 0)},"dispose")}},"onRequest"),hasPendingResponse:o(()=>v.size>0,"hasPendingResponse"),trace:o(async(j,ae,U)=>{let ce=!1,z=rl.Text;U!==void 0&&(Ai.boolean(U)?ce=U:(ce=U.sendNotification||!1,z=U.traceFormat||rl.Text)),T=j,E=z,T===vn.Off?w=void 0:w=ae,ce&&!F()&&!G()&&await We.sendNotification(FG.type,{value:vn.toString(j)})},"trace"),onError:S.event,onClose:A.event,onUnhandledNotification:L.event,onDispose:N.event,end:o(()=>{e.end()},"end"),dispose:o(()=>{if(G())return;k=Mc.Disposed,N.fire(void 0);let j=new br.ResponseError(br.ErrorCodes.PendingResponseRejected,"Pending response rejected since connection got disposed");for(let ae of v.values())ae.reject(j);v=new Map,b=new Map,x=new Set,y=new Jve.LinkedMap,Ai.func(e.dispose)&&e.dispose(),Ai.func(t.dispose)&&t.dispose()},"dispose"),listen:o(()=>{$e(),fe(),k=Mc.Listening,t.listen(Y)},"listen"),inspect:o(()=>{(0,Zve.default)().console.log("inspect")},"inspect")};return We.onNotification(kA.type,j=>{if(T===vn.Off||!w)return;let ae=T===vn.Verbose||T===vn.Compact;w.log(j.message,ae?j.verbose:void 0)}),We.onNotification(F4.type,j=>{let ae=m.get(j.token);ae?ae(j.value):I.fire(j)}),We}o(pit,"createMessageConnection");Rr.createMessageConnection=pit});var DA=nr(tt=>{"use strict";Object.defineProperty(tt,"__esModule",{value:!0});tt.ProgressType=tt.ProgressToken=tt.createMessageConnection=tt.NullLogger=tt.ConnectionOptions=tt.ConnectionStrategy=tt.AbstractMessageBuffer=tt.WriteableStreamMessageWriter=tt.AbstractMessageWriter=tt.MessageWriter=tt.ReadableStreamMessageReader=tt.AbstractMessageReader=tt.MessageReader=tt.SharedArrayReceiverStrategy=tt.SharedArraySenderStrategy=tt.CancellationToken=tt.CancellationTokenSource=tt.Emitter=tt.Event=tt.Disposable=tt.LRUCache=tt.Touch=tt.LinkedMap=tt.ParameterStructures=tt.NotificationType9=tt.NotificationType8=tt.NotificationType7=tt.NotificationType6=tt.NotificationType5=tt.NotificationType4=tt.NotificationType3=tt.NotificationType2=tt.NotificationType1=tt.NotificationType0=tt.NotificationType=tt.ErrorCodes=tt.ResponseError=tt.RequestType9=tt.RequestType8=tt.RequestType7=tt.RequestType6=tt.RequestType5=tt.RequestType4=tt.RequestType3=tt.RequestType2=tt.RequestType1=tt.RequestType0=tt.RequestType=tt.Message=tt.RAL=void 0;tt.MessageStrategy=tt.CancellationStrategy=tt.CancellationSenderStrategy=tt.CancellationReceiverStrategy=tt.ConnectionError=tt.ConnectionErrors=tt.LogTraceNotification=tt.SetTraceNotification=tt.TraceFormat=tt.TraceValues=tt.Trace=void 0;var Kn=vG();Object.defineProperty(tt,"Message",{enumerable:!0,get:o(function(){return Kn.Message},"get")});Object.defineProperty(tt,"RequestType",{enumerable:!0,get:o(function(){return Kn.RequestType},"get")});Object.defineProperty(tt,"RequestType0",{enumerable:!0,get:o(function(){return Kn.RequestType0},"get")});Object.defineProperty(tt,"RequestType1",{enumerable:!0,get:o(function(){return Kn.RequestType1},"get")});Object.defineProperty(tt,"RequestType2",{enumerable:!0,get:o(function(){return Kn.RequestType2},"get")});Object.defineProperty(tt,"RequestType3",{enumerable:!0,get:o(function(){return Kn.RequestType3},"get")});Object.defineProperty(tt,"RequestType4",{enumerable:!0,get:o(function(){return Kn.RequestType4},"get")});Object.defineProperty(tt,"RequestType5",{enumerable:!0,get:o(function(){return Kn.RequestType5},"get")});Object.defineProperty(tt,"RequestType6",{enumerable:!0,get:o(function(){return Kn.RequestType6},"get")});Object.defineProperty(tt,"RequestType7",{enumerable:!0,get:o(function(){return Kn.RequestType7},"get")});Object.defineProperty(tt,"RequestType8",{enumerable:!0,get:o(function(){return Kn.RequestType8},"get")});Object.defineProperty(tt,"RequestType9",{enumerable:!0,get:o(function(){return Kn.RequestType9},"get")});Object.defineProperty(tt,"ResponseError",{enumerable:!0,get:o(function(){return Kn.ResponseError},"get")});Object.defineProperty(tt,"ErrorCodes",{enumerable:!0,get:o(function(){return Kn.ErrorCodes},"get")});Object.defineProperty(tt,"NotificationType",{enumerable:!0,get:o(function(){return Kn.NotificationType},"get")});Object.defineProperty(tt,"NotificationType0",{enumerable:!0,get:o(function(){return Kn.NotificationType0},"get")});Object.defineProperty(tt,"NotificationType1",{enumerable:!0,get:o(function(){return Kn.NotificationType1},"get")});Object.defineProperty(tt,"NotificationType2",{enumerable:!0,get:o(function(){return Kn.NotificationType2},"get")});Object.defineProperty(tt,"NotificationType3",{enumerable:!0,get:o(function(){return Kn.NotificationType3},"get")});Object.defineProperty(tt,"NotificationType4",{enumerable:!0,get:o(function(){return Kn.NotificationType4},"get")});Object.defineProperty(tt,"NotificationType5",{enumerable:!0,get:o(function(){return Kn.NotificationType5},"get")});Object.defineProperty(tt,"NotificationType6",{enumerable:!0,get:o(function(){return Kn.NotificationType6},"get")});Object.defineProperty(tt,"NotificationType7",{enumerable:!0,get:o(function(){return Kn.NotificationType7},"get")});Object.defineProperty(tt,"NotificationType8",{enumerable:!0,get:o(function(){return Kn.NotificationType8},"get")});Object.defineProperty(tt,"NotificationType9",{enumerable:!0,get:o(function(){return Kn.NotificationType9},"get")});Object.defineProperty(tt,"ParameterStructures",{enumerable:!0,get:o(function(){return Kn.ParameterStructures},"get")});var GG=bG();Object.defineProperty(tt,"LinkedMap",{enumerable:!0,get:o(function(){return GG.LinkedMap},"get")});Object.defineProperty(tt,"LRUCache",{enumerable:!0,get:o(function(){return GG.LRUCache},"get")});Object.defineProperty(tt,"Touch",{enumerable:!0,get:o(function(){return GG.Touch},"get")});var mit=Vve();Object.defineProperty(tt,"Disposable",{enumerable:!0,get:o(function(){return mit.Disposable},"get")});var n2e=Cm();Object.defineProperty(tt,"Event",{enumerable:!0,get:o(function(){return n2e.Event},"get")});Object.defineProperty(tt,"Emitter",{enumerable:!0,get:o(function(){return n2e.Emitter},"get")});var i2e=y4();Object.defineProperty(tt,"CancellationTokenSource",{enumerable:!0,get:o(function(){return i2e.CancellationTokenSource},"get")});Object.defineProperty(tt,"CancellationToken",{enumerable:!0,get:o(function(){return i2e.CancellationToken},"get")});var a2e=qve();Object.defineProperty(tt,"SharedArraySenderStrategy",{enumerable:!0,get:o(function(){return a2e.SharedArraySenderStrategy},"get")});Object.defineProperty(tt,"SharedArrayReceiverStrategy",{enumerable:!0,get:o(function(){return a2e.SharedArrayReceiverStrategy},"get")});var VG=Wve();Object.defineProperty(tt,"MessageReader",{enumerable:!0,get:o(function(){return VG.MessageReader},"get")});Object.defineProperty(tt,"AbstractMessageReader",{enumerable:!0,get:o(function(){return VG.AbstractMessageReader},"get")});Object.defineProperty(tt,"ReadableStreamMessageReader",{enumerable:!0,get:o(function(){return VG.ReadableStreamMessageReader},"get")});var qG=Kve();Object.defineProperty(tt,"MessageWriter",{enumerable:!0,get:o(function(){return qG.MessageWriter},"get")});Object.defineProperty(tt,"AbstractMessageWriter",{enumerable:!0,get:o(function(){return qG.AbstractMessageWriter},"get")});Object.defineProperty(tt,"WriteableStreamMessageWriter",{enumerable:!0,get:o(function(){return qG.WriteableStreamMessageWriter},"get")});var git=Qve();Object.defineProperty(tt,"AbstractMessageBuffer",{enumerable:!0,get:o(function(){return git.AbstractMessageBuffer},"get")});var Ha=r2e();Object.defineProperty(tt,"ConnectionStrategy",{enumerable:!0,get:o(function(){return Ha.ConnectionStrategy},"get")});Object.defineProperty(tt,"ConnectionOptions",{enumerable:!0,get:o(function(){return Ha.ConnectionOptions},"get")});Object.defineProperty(tt,"NullLogger",{enumerable:!0,get:o(function(){return Ha.NullLogger},"get")});Object.defineProperty(tt,"createMessageConnection",{enumerable:!0,get:o(function(){return Ha.createMessageConnection},"get")});Object.defineProperty(tt,"ProgressToken",{enumerable:!0,get:o(function(){return Ha.ProgressToken},"get")});Object.defineProperty(tt,"ProgressType",{enumerable:!0,get:o(function(){return Ha.ProgressType},"get")});Object.defineProperty(tt,"Trace",{enumerable:!0,get:o(function(){return Ha.Trace},"get")});Object.defineProperty(tt,"TraceValues",{enumerable:!0,get:o(function(){return Ha.TraceValues},"get")});Object.defineProperty(tt,"TraceFormat",{enumerable:!0,get:o(function(){return Ha.TraceFormat},"get")});Object.defineProperty(tt,"SetTraceNotification",{enumerable:!0,get:o(function(){return Ha.SetTraceNotification},"get")});Object.defineProperty(tt,"LogTraceNotification",{enumerable:!0,get:o(function(){return Ha.LogTraceNotification},"get")});Object.defineProperty(tt,"ConnectionErrors",{enumerable:!0,get:o(function(){return Ha.ConnectionErrors},"get")});Object.defineProperty(tt,"ConnectionError",{enumerable:!0,get:o(function(){return Ha.ConnectionError},"get")});Object.defineProperty(tt,"CancellationReceiverStrategy",{enumerable:!0,get:o(function(){return Ha.CancellationReceiverStrategy},"get")});Object.defineProperty(tt,"CancellationSenderStrategy",{enumerable:!0,get:o(function(){return Ha.CancellationSenderStrategy},"get")});Object.defineProperty(tt,"CancellationStrategy",{enumerable:!0,get:o(function(){return Ha.CancellationStrategy},"get")});Object.defineProperty(tt,"MessageStrategy",{enumerable:!0,get:o(function(){return Ha.MessageStrategy},"get")});var yit=Xd();tt.RAL=yit.default});var o2e=nr(YG=>{"use strict";Object.defineProperty(YG,"__esModule",{value:!0});var Vu=DA(),RA=class t extends Vu.AbstractMessageBuffer{static{o(this,"MessageBuffer")}constructor(e="utf-8"){super(e),this.asciiDecoder=new TextDecoder("ascii")}emptyBuffer(){return t.emptyBuffer}fromString(e,r){return new TextEncoder().encode(e)}toString(e,r){return r==="ascii"?this.asciiDecoder.decode(e):new TextDecoder(r).decode(e)}asNative(e,r){return r===void 0?e:e.slice(0,r)}allocNative(e){return new Uint8Array(e)}};RA.emptyBuffer=new Uint8Array(0);var UG=class{static{o(this,"ReadableStreamWrapper")}constructor(e){this.socket=e,this._onData=new Vu.Emitter,this._messageListener=r=>{r.data.arrayBuffer().then(i=>{this._onData.fire(new Uint8Array(i))},()=>{(0,Vu.RAL)().console.error("Converting blob to array buffer failed.")})},this.socket.addEventListener("message",this._messageListener)}onClose(e){return this.socket.addEventListener("close",e),Vu.Disposable.create(()=>this.socket.removeEventListener("close",e))}onError(e){return this.socket.addEventListener("error",e),Vu.Disposable.create(()=>this.socket.removeEventListener("error",e))}onEnd(e){return this.socket.addEventListener("end",e),Vu.Disposable.create(()=>this.socket.removeEventListener("end",e))}onData(e){return this._onData.event(e)}},WG=class{static{o(this,"WritableStreamWrapper")}constructor(e){this.socket=e}onClose(e){return this.socket.addEventListener("close",e),Vu.Disposable.create(()=>this.socket.removeEventListener("close",e))}onError(e){return this.socket.addEventListener("error",e),Vu.Disposable.create(()=>this.socket.removeEventListener("error",e))}onEnd(e){return this.socket.addEventListener("end",e),Vu.Disposable.create(()=>this.socket.removeEventListener("end",e))}write(e,r){if(typeof e=="string"){if(r!==void 0&&r!=="utf-8")throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${r}`);this.socket.send(e)}else this.socket.send(e);return Promise.resolve()}end(){this.socket.close()}},vit=new TextEncoder,s2e=Object.freeze({messageBuffer:Object.freeze({create:o(t=>new RA(t),"create")}),applicationJson:Object.freeze({encoder:Object.freeze({name:"application/json",encode:o((t,e)=>{if(e.charset!=="utf-8")throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${e.charset}`);return Promise.resolve(vit.encode(JSON.stringify(t,void 0,0)))},"encode")}),decoder:Object.freeze({name:"application/json",decode:o((t,e)=>{if(!(t instanceof Uint8Array))throw new Error("In a Browser environments only Uint8Arrays are supported.");return Promise.resolve(JSON.parse(new TextDecoder(e.charset).decode(t)))},"decode")})}),stream:Object.freeze({asReadableStream:o(t=>new UG(t),"asReadableStream"),asWritableStream:o(t=>new WG(t),"asWritableStream")}),console,timer:Object.freeze({setTimeout(t,e,...r){let n=setTimeout(t,e,...r);return{dispose:o(()=>clearTimeout(n),"dispose")}},setImmediate(t,...e){let r=setTimeout(t,0,...e);return{dispose:o(()=>clearTimeout(r),"dispose")}},setInterval(t,e,...r){let n=setInterval(t,e,...r);return{dispose:o(()=>clearInterval(n),"dispose")}}})});function HG(){return s2e}o(HG,"RIL");(function(t){function e(){Vu.RAL.install(s2e)}o(e,"install"),t.install=e})(HG||(HG={}));YG.default=HG});var Nm=nr(nl=>{"use strict";var xit=nl&&nl.__createBinding||(Object.create?(function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:o(function(){return e[r]},"get")}),Object.defineProperty(t,n,i)}):(function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]})),bit=nl&&nl.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&xit(e,t,r)};Object.defineProperty(nl,"__esModule",{value:!0});nl.createMessageConnection=nl.BrowserMessageWriter=nl.BrowserMessageReader=void 0;var Tit=o2e();Tit.default.install();var pv=DA();bit(DA(),nl);var jG=class extends pv.AbstractMessageReader{static{o(this,"BrowserMessageReader")}constructor(e){super(),this._onData=new pv.Emitter,this._messageListener=r=>{this._onData.fire(r.data)},e.addEventListener("error",r=>this.fireError(r)),e.onmessage=this._messageListener}listen(e){return this._onData.event(e)}};nl.BrowserMessageReader=jG;var XG=class extends pv.AbstractMessageWriter{static{o(this,"BrowserMessageWriter")}constructor(e){super(),this.port=e,this.errorCount=0,e.addEventListener("error",r=>this.fireError(r))}write(e){try{return this.port.postMessage(e),Promise.resolve()}catch(r){return this.handleError(r,e),Promise.reject(r)}}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){}};nl.BrowserMessageWriter=XG;function wit(t,e,r,n){return r===void 0&&(r=pv.NullLogger),pv.ConnectionStrategy.is(n)&&(n={connectionStrategy:n}),(0,pv.createMessageConnection)(t,e,r,n)}o(wit,"createMessageConnection");nl.createMessageConnection=wit});var KG=nr((tyr,l2e)=>{"use strict";l2e.exports=Nm()});var mi=nr(Co=>{"use strict";Object.defineProperty(Co,"__esModule",{value:!0});Co.ProtocolNotificationType=Co.ProtocolNotificationType0=Co.ProtocolRequestType=Co.ProtocolRequestType0=Co.RegistrationType=Co.MessageDirection=void 0;var mv=Nm(),c2e;(function(t){t.clientToServer="clientToServer",t.serverToClient="serverToClient",t.both="both"})(c2e||(Co.MessageDirection=c2e={}));var QG=class{static{o(this,"RegistrationType")}constructor(e){this.method=e}};Co.RegistrationType=QG;var ZG=class extends mv.RequestType0{static{o(this,"ProtocolRequestType0")}constructor(e){super(e)}};Co.ProtocolRequestType0=ZG;var JG=class extends mv.RequestType{static{o(this,"ProtocolRequestType")}constructor(e){super(e,mv.ParameterStructures.byName)}};Co.ProtocolRequestType=JG;var eV=class extends mv.NotificationType0{static{o(this,"ProtocolNotificationType0")}constructor(e){super(e)}};Co.ProtocolNotificationType0=eV;var tV=class extends mv.NotificationType{static{o(this,"ProtocolNotificationType")}constructor(e){super(e,mv.ParameterStructures.byName)}};Co.ProtocolNotificationType=tV});var LA=nr(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.objectLiteral=Yi.typedArray=Yi.stringArray=Yi.array=Yi.func=Yi.error=Yi.number=Yi.string=Yi.boolean=void 0;function kit(t){return t===!0||t===!1}o(kit,"boolean");Yi.boolean=kit;function u2e(t){return typeof t=="string"||t instanceof String}o(u2e,"string");Yi.string=u2e;function Eit(t){return typeof t=="number"||t instanceof Number}o(Eit,"number");Yi.number=Eit;function Sit(t){return t instanceof Error}o(Sit,"error");Yi.error=Sit;function Cit(t){return typeof t=="function"}o(Cit,"func");Yi.func=Cit;function h2e(t){return Array.isArray(t)}o(h2e,"array");Yi.array=h2e;function Ait(t){return h2e(t)&&t.every(e=>u2e(e))}o(Ait,"stringArray");Yi.stringArray=Ait;function _it(t,e){return Array.isArray(t)&&t.every(e)}o(_it,"typedArray");Yi.typedArray=_it;function Dit(t){return t!==null&&typeof t=="object"}o(Dit,"objectLiteral");Yi.objectLiteral=Dit});var p2e=nr(NA=>{"use strict";Object.defineProperty(NA,"__esModule",{value:!0});NA.ImplementationRequest=void 0;var f2e=mi(),d2e;(function(t){t.method="textDocument/implementation",t.messageDirection=f2e.MessageDirection.clientToServer,t.type=new f2e.ProtocolRequestType(t.method)})(d2e||(NA.ImplementationRequest=d2e={}))});var y2e=nr(MA=>{"use strict";Object.defineProperty(MA,"__esModule",{value:!0});MA.TypeDefinitionRequest=void 0;var m2e=mi(),g2e;(function(t){t.method="textDocument/typeDefinition",t.messageDirection=m2e.MessageDirection.clientToServer,t.type=new m2e.ProtocolRequestType(t.method)})(g2e||(MA.TypeDefinitionRequest=g2e={}))});var b2e=nr(gv=>{"use strict";Object.defineProperty(gv,"__esModule",{value:!0});gv.DidChangeWorkspaceFoldersNotification=gv.WorkspaceFoldersRequest=void 0;var IA=mi(),v2e;(function(t){t.method="workspace/workspaceFolders",t.messageDirection=IA.MessageDirection.serverToClient,t.type=new IA.ProtocolRequestType0(t.method)})(v2e||(gv.WorkspaceFoldersRequest=v2e={}));var x2e;(function(t){t.method="workspace/didChangeWorkspaceFolders",t.messageDirection=IA.MessageDirection.clientToServer,t.type=new IA.ProtocolNotificationType(t.method)})(x2e||(gv.DidChangeWorkspaceFoldersNotification=x2e={}))});var k2e=nr(OA=>{"use strict";Object.defineProperty(OA,"__esModule",{value:!0});OA.ConfigurationRequest=void 0;var T2e=mi(),w2e;(function(t){t.method="workspace/configuration",t.messageDirection=T2e.MessageDirection.serverToClient,t.type=new T2e.ProtocolRequestType(t.method)})(w2e||(OA.ConfigurationRequest=w2e={}))});var C2e=nr(yv=>{"use strict";Object.defineProperty(yv,"__esModule",{value:!0});yv.ColorPresentationRequest=yv.DocumentColorRequest=void 0;var PA=mi(),E2e;(function(t){t.method="textDocument/documentColor",t.messageDirection=PA.MessageDirection.clientToServer,t.type=new PA.ProtocolRequestType(t.method)})(E2e||(yv.DocumentColorRequest=E2e={}));var S2e;(function(t){t.method="textDocument/colorPresentation",t.messageDirection=PA.MessageDirection.clientToServer,t.type=new PA.ProtocolRequestType(t.method)})(S2e||(yv.ColorPresentationRequest=S2e={}))});var D2e=nr(vv=>{"use strict";Object.defineProperty(vv,"__esModule",{value:!0});vv.FoldingRangeRefreshRequest=vv.FoldingRangeRequest=void 0;var BA=mi(),A2e;(function(t){t.method="textDocument/foldingRange",t.messageDirection=BA.MessageDirection.clientToServer,t.type=new BA.ProtocolRequestType(t.method)})(A2e||(vv.FoldingRangeRequest=A2e={}));var _2e;(function(t){t.method="workspace/foldingRange/refresh",t.messageDirection=BA.MessageDirection.serverToClient,t.type=new BA.ProtocolRequestType0(t.method)})(_2e||(vv.FoldingRangeRefreshRequest=_2e={}))});var N2e=nr(FA=>{"use strict";Object.defineProperty(FA,"__esModule",{value:!0});FA.DeclarationRequest=void 0;var R2e=mi(),L2e;(function(t){t.method="textDocument/declaration",t.messageDirection=R2e.MessageDirection.clientToServer,t.type=new R2e.ProtocolRequestType(t.method)})(L2e||(FA.DeclarationRequest=L2e={}))});var O2e=nr($A=>{"use strict";Object.defineProperty($A,"__esModule",{value:!0});$A.SelectionRangeRequest=void 0;var M2e=mi(),I2e;(function(t){t.method="textDocument/selectionRange",t.messageDirection=M2e.MessageDirection.clientToServer,t.type=new M2e.ProtocolRequestType(t.method)})(I2e||($A.SelectionRangeRequest=I2e={}))});var $2e=nr(ep=>{"use strict";Object.defineProperty(ep,"__esModule",{value:!0});ep.WorkDoneProgressCancelNotification=ep.WorkDoneProgressCreateRequest=ep.WorkDoneProgress=void 0;var Rit=Nm(),zA=mi(),P2e;(function(t){t.type=new Rit.ProgressType;function e(r){return r===t.type}o(e,"is"),t.is=e})(P2e||(ep.WorkDoneProgress=P2e={}));var B2e;(function(t){t.method="window/workDoneProgress/create",t.messageDirection=zA.MessageDirection.serverToClient,t.type=new zA.ProtocolRequestType(t.method)})(B2e||(ep.WorkDoneProgressCreateRequest=B2e={}));var F2e;(function(t){t.method="window/workDoneProgress/cancel",t.messageDirection=zA.MessageDirection.clientToServer,t.type=new zA.ProtocolNotificationType(t.method)})(F2e||(ep.WorkDoneProgressCancelNotification=F2e={}))});var q2e=nr(tp=>{"use strict";Object.defineProperty(tp,"__esModule",{value:!0});tp.CallHierarchyOutgoingCallsRequest=tp.CallHierarchyIncomingCallsRequest=tp.CallHierarchyPrepareRequest=void 0;var xv=mi(),z2e;(function(t){t.method="textDocument/prepareCallHierarchy",t.messageDirection=xv.MessageDirection.clientToServer,t.type=new xv.ProtocolRequestType(t.method)})(z2e||(tp.CallHierarchyPrepareRequest=z2e={}));var G2e;(function(t){t.method="callHierarchy/incomingCalls",t.messageDirection=xv.MessageDirection.clientToServer,t.type=new xv.ProtocolRequestType(t.method)})(G2e||(tp.CallHierarchyIncomingCallsRequest=G2e={}));var V2e;(function(t){t.method="callHierarchy/outgoingCalls",t.messageDirection=xv.MessageDirection.clientToServer,t.type=new xv.ProtocolRequestType(t.method)})(V2e||(tp.CallHierarchyOutgoingCallsRequest=V2e={}))});var X2e=nr(Ao=>{"use strict";Object.defineProperty(Ao,"__esModule",{value:!0});Ao.SemanticTokensRefreshRequest=Ao.SemanticTokensRangeRequest=Ao.SemanticTokensDeltaRequest=Ao.SemanticTokensRequest=Ao.SemanticTokensRegistrationType=Ao.TokenFormat=void 0;var tf=mi(),U2e;(function(t){t.Relative="relative"})(U2e||(Ao.TokenFormat=U2e={}));var G4;(function(t){t.method="textDocument/semanticTokens",t.type=new tf.RegistrationType(t.method)})(G4||(Ao.SemanticTokensRegistrationType=G4={}));var W2e;(function(t){t.method="textDocument/semanticTokens/full",t.messageDirection=tf.MessageDirection.clientToServer,t.type=new tf.ProtocolRequestType(t.method),t.registrationMethod=G4.method})(W2e||(Ao.SemanticTokensRequest=W2e={}));var H2e;(function(t){t.method="textDocument/semanticTokens/full/delta",t.messageDirection=tf.MessageDirection.clientToServer,t.type=new tf.ProtocolRequestType(t.method),t.registrationMethod=G4.method})(H2e||(Ao.SemanticTokensDeltaRequest=H2e={}));var Y2e;(function(t){t.method="textDocument/semanticTokens/range",t.messageDirection=tf.MessageDirection.clientToServer,t.type=new tf.ProtocolRequestType(t.method),t.registrationMethod=G4.method})(Y2e||(Ao.SemanticTokensRangeRequest=Y2e={}));var j2e;(function(t){t.method="workspace/semanticTokens/refresh",t.messageDirection=tf.MessageDirection.serverToClient,t.type=new tf.ProtocolRequestType0(t.method)})(j2e||(Ao.SemanticTokensRefreshRequest=j2e={}))});var Z2e=nr(GA=>{"use strict";Object.defineProperty(GA,"__esModule",{value:!0});GA.ShowDocumentRequest=void 0;var K2e=mi(),Q2e;(function(t){t.method="window/showDocument",t.messageDirection=K2e.MessageDirection.serverToClient,t.type=new K2e.ProtocolRequestType(t.method)})(Q2e||(GA.ShowDocumentRequest=Q2e={}))});var txe=nr(VA=>{"use strict";Object.defineProperty(VA,"__esModule",{value:!0});VA.LinkedEditingRangeRequest=void 0;var J2e=mi(),exe;(function(t){t.method="textDocument/linkedEditingRange",t.messageDirection=J2e.MessageDirection.clientToServer,t.type=new J2e.ProtocolRequestType(t.method)})(exe||(VA.LinkedEditingRangeRequest=exe={}))});var cxe=nr(ps=>{"use strict";Object.defineProperty(ps,"__esModule",{value:!0});ps.WillDeleteFilesRequest=ps.DidDeleteFilesNotification=ps.DidRenameFilesNotification=ps.WillRenameFilesRequest=ps.DidCreateFilesNotification=ps.WillCreateFilesRequest=ps.FileOperationPatternKind=void 0;var Gl=mi(),rxe;(function(t){t.file="file",t.folder="folder"})(rxe||(ps.FileOperationPatternKind=rxe={}));var nxe;(function(t){t.method="workspace/willCreateFiles",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolRequestType(t.method)})(nxe||(ps.WillCreateFilesRequest=nxe={}));var ixe;(function(t){t.method="workspace/didCreateFiles",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolNotificationType(t.method)})(ixe||(ps.DidCreateFilesNotification=ixe={}));var axe;(function(t){t.method="workspace/willRenameFiles",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolRequestType(t.method)})(axe||(ps.WillRenameFilesRequest=axe={}));var sxe;(function(t){t.method="workspace/didRenameFiles",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolNotificationType(t.method)})(sxe||(ps.DidRenameFilesNotification=sxe={}));var oxe;(function(t){t.method="workspace/didDeleteFiles",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolNotificationType(t.method)})(oxe||(ps.DidDeleteFilesNotification=oxe={}));var lxe;(function(t){t.method="workspace/willDeleteFiles",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolRequestType(t.method)})(lxe||(ps.WillDeleteFilesRequest=lxe={}))});var pxe=nr(rp=>{"use strict";Object.defineProperty(rp,"__esModule",{value:!0});rp.MonikerRequest=rp.MonikerKind=rp.UniquenessLevel=void 0;var uxe=mi(),hxe;(function(t){t.document="document",t.project="project",t.group="group",t.scheme="scheme",t.global="global"})(hxe||(rp.UniquenessLevel=hxe={}));var fxe;(function(t){t.$import="import",t.$export="export",t.local="local"})(fxe||(rp.MonikerKind=fxe={}));var dxe;(function(t){t.method="textDocument/moniker",t.messageDirection=uxe.MessageDirection.clientToServer,t.type=new uxe.ProtocolRequestType(t.method)})(dxe||(rp.MonikerRequest=dxe={}))});var vxe=nr(np=>{"use strict";Object.defineProperty(np,"__esModule",{value:!0});np.TypeHierarchySubtypesRequest=np.TypeHierarchySupertypesRequest=np.TypeHierarchyPrepareRequest=void 0;var bv=mi(),mxe;(function(t){t.method="textDocument/prepareTypeHierarchy",t.messageDirection=bv.MessageDirection.clientToServer,t.type=new bv.ProtocolRequestType(t.method)})(mxe||(np.TypeHierarchyPrepareRequest=mxe={}));var gxe;(function(t){t.method="typeHierarchy/supertypes",t.messageDirection=bv.MessageDirection.clientToServer,t.type=new bv.ProtocolRequestType(t.method)})(gxe||(np.TypeHierarchySupertypesRequest=gxe={}));var yxe;(function(t){t.method="typeHierarchy/subtypes",t.messageDirection=bv.MessageDirection.clientToServer,t.type=new bv.ProtocolRequestType(t.method)})(yxe||(np.TypeHierarchySubtypesRequest=yxe={}))});var Txe=nr(Tv=>{"use strict";Object.defineProperty(Tv,"__esModule",{value:!0});Tv.InlineValueRefreshRequest=Tv.InlineValueRequest=void 0;var qA=mi(),xxe;(function(t){t.method="textDocument/inlineValue",t.messageDirection=qA.MessageDirection.clientToServer,t.type=new qA.ProtocolRequestType(t.method)})(xxe||(Tv.InlineValueRequest=xxe={}));var bxe;(function(t){t.method="workspace/inlineValue/refresh",t.messageDirection=qA.MessageDirection.serverToClient,t.type=new qA.ProtocolRequestType0(t.method)})(bxe||(Tv.InlineValueRefreshRequest=bxe={}))});var Sxe=nr(ip=>{"use strict";Object.defineProperty(ip,"__esModule",{value:!0});ip.InlayHintRefreshRequest=ip.InlayHintResolveRequest=ip.InlayHintRequest=void 0;var wv=mi(),wxe;(function(t){t.method="textDocument/inlayHint",t.messageDirection=wv.MessageDirection.clientToServer,t.type=new wv.ProtocolRequestType(t.method)})(wxe||(ip.InlayHintRequest=wxe={}));var kxe;(function(t){t.method="inlayHint/resolve",t.messageDirection=wv.MessageDirection.clientToServer,t.type=new wv.ProtocolRequestType(t.method)})(kxe||(ip.InlayHintResolveRequest=kxe={}));var Exe;(function(t){t.method="workspace/inlayHint/refresh",t.messageDirection=wv.MessageDirection.serverToClient,t.type=new wv.ProtocolRequestType0(t.method)})(Exe||(ip.InlayHintRefreshRequest=Exe={}))});var Nxe=nr(Vl=>{"use strict";Object.defineProperty(Vl,"__esModule",{value:!0});Vl.DiagnosticRefreshRequest=Vl.WorkspaceDiagnosticRequest=Vl.DocumentDiagnosticRequest=Vl.DocumentDiagnosticReportKind=Vl.DiagnosticServerCancellationData=void 0;var Lxe=Nm(),Lit=LA(),kv=mi(),Cxe;(function(t){function e(r){let n=r;return n&&Lit.boolean(n.retriggerRequest)}o(e,"is"),t.is=e})(Cxe||(Vl.DiagnosticServerCancellationData=Cxe={}));var Axe;(function(t){t.Full="full",t.Unchanged="unchanged"})(Axe||(Vl.DocumentDiagnosticReportKind=Axe={}));var _xe;(function(t){t.method="textDocument/diagnostic",t.messageDirection=kv.MessageDirection.clientToServer,t.type=new kv.ProtocolRequestType(t.method),t.partialResult=new Lxe.ProgressType})(_xe||(Vl.DocumentDiagnosticRequest=_xe={}));var Dxe;(function(t){t.method="workspace/diagnostic",t.messageDirection=kv.MessageDirection.clientToServer,t.type=new kv.ProtocolRequestType(t.method),t.partialResult=new Lxe.ProgressType})(Dxe||(Vl.WorkspaceDiagnosticRequest=Dxe={}));var Rxe;(function(t){t.method="workspace/diagnostic/refresh",t.messageDirection=kv.MessageDirection.serverToClient,t.type=new kv.ProtocolRequestType0(t.method)})(Rxe||(Vl.DiagnosticRefreshRequest=Rxe={}))});var $xe=nr(Mi=>{"use strict";Object.defineProperty(Mi,"__esModule",{value:!0});Mi.DidCloseNotebookDocumentNotification=Mi.DidSaveNotebookDocumentNotification=Mi.DidChangeNotebookDocumentNotification=Mi.NotebookCellArrayChange=Mi.DidOpenNotebookDocumentNotification=Mi.NotebookDocumentSyncRegistrationType=Mi.NotebookDocument=Mi.NotebookCell=Mi.ExecutionSummary=Mi.NotebookCellKind=void 0;var V4=(Zy(),G3(K6)),Ic=LA(),qu=mi(),rV;(function(t){t.Markup=1,t.Code=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(rV||(Mi.NotebookCellKind=rV={}));var nV;(function(t){function e(i,a){let s={executionOrder:i};return(a===!0||a===!1)&&(s.success=a),s}o(e,"create"),t.create=e;function r(i){let a=i;return Ic.objectLiteral(a)&&V4.uinteger.is(a.executionOrder)&&(a.success===void 0||Ic.boolean(a.success))}o(r,"is"),t.is=r;function n(i,a){return i===a?!0:i==null||a===null||a===void 0?!1:i.executionOrder===a.executionOrder&&i.success===a.success}o(n,"equals"),t.equals=n})(nV||(Mi.ExecutionSummary=nV={}));var UA;(function(t){function e(a,s){return{kind:a,document:s}}o(e,"create"),t.create=e;function r(a){let s=a;return Ic.objectLiteral(s)&&rV.is(s.kind)&&V4.DocumentUri.is(s.document)&&(s.metadata===void 0||Ic.objectLiteral(s.metadata))}o(r,"is"),t.is=r;function n(a,s){let l=new Set;return a.document!==s.document&&l.add("document"),a.kind!==s.kind&&l.add("kind"),a.executionSummary!==s.executionSummary&&l.add("executionSummary"),(a.metadata!==void 0||s.metadata!==void 0)&&!i(a.metadata,s.metadata)&&l.add("metadata"),(a.executionSummary!==void 0||s.executionSummary!==void 0)&&!nV.equals(a.executionSummary,s.executionSummary)&&l.add("executionSummary"),l}o(n,"diff"),t.diff=n;function i(a,s){if(a===s)return!0;if(a==null||s===null||s===void 0||typeof a!=typeof s||typeof a!="object")return!1;let l=Array.isArray(a),u=Array.isArray(s);if(l!==u)return!1;if(l&&u){if(a.length!==s.length)return!1;for(let h=0;h{"use strict";Object.defineProperty(WA,"__esModule",{value:!0});WA.InlineCompletionRequest=void 0;var zxe=mi(),Gxe;(function(t){t.method="textDocument/inlineCompletion",t.messageDirection=zxe.MessageDirection.clientToServer,t.type=new zxe.ProtocolRequestType(t.method)})(Gxe||(WA.InlineCompletionRequest=Gxe={}))});var tTe=nr(Ce=>{"use strict";Object.defineProperty(Ce,"__esModule",{value:!0});Ce.WorkspaceSymbolRequest=Ce.CodeActionResolveRequest=Ce.CodeActionRequest=Ce.DocumentSymbolRequest=Ce.DocumentHighlightRequest=Ce.ReferencesRequest=Ce.DefinitionRequest=Ce.SignatureHelpRequest=Ce.SignatureHelpTriggerKind=Ce.HoverRequest=Ce.CompletionResolveRequest=Ce.CompletionRequest=Ce.CompletionTriggerKind=Ce.PublishDiagnosticsNotification=Ce.WatchKind=Ce.RelativePattern=Ce.FileChangeType=Ce.DidChangeWatchedFilesNotification=Ce.WillSaveTextDocumentWaitUntilRequest=Ce.WillSaveTextDocumentNotification=Ce.TextDocumentSaveReason=Ce.DidSaveTextDocumentNotification=Ce.DidCloseTextDocumentNotification=Ce.DidChangeTextDocumentNotification=Ce.TextDocumentContentChangeEvent=Ce.DidOpenTextDocumentNotification=Ce.TextDocumentSyncKind=Ce.TelemetryEventNotification=Ce.LogMessageNotification=Ce.ShowMessageRequest=Ce.ShowMessageNotification=Ce.MessageType=Ce.DidChangeConfigurationNotification=Ce.ExitNotification=Ce.ShutdownRequest=Ce.InitializedNotification=Ce.InitializeErrorCodes=Ce.InitializeRequest=Ce.WorkDoneProgressOptions=Ce.TextDocumentRegistrationOptions=Ce.StaticRegistrationOptions=Ce.PositionEncodingKind=Ce.FailureHandlingKind=Ce.ResourceOperationKind=Ce.UnregistrationRequest=Ce.RegistrationRequest=Ce.DocumentSelector=Ce.NotebookCellTextDocumentFilter=Ce.NotebookDocumentFilter=Ce.TextDocumentFilter=void 0;Ce.MonikerRequest=Ce.MonikerKind=Ce.UniquenessLevel=Ce.WillDeleteFilesRequest=Ce.DidDeleteFilesNotification=Ce.WillRenameFilesRequest=Ce.DidRenameFilesNotification=Ce.WillCreateFilesRequest=Ce.DidCreateFilesNotification=Ce.FileOperationPatternKind=Ce.LinkedEditingRangeRequest=Ce.ShowDocumentRequest=Ce.SemanticTokensRegistrationType=Ce.SemanticTokensRefreshRequest=Ce.SemanticTokensRangeRequest=Ce.SemanticTokensDeltaRequest=Ce.SemanticTokensRequest=Ce.TokenFormat=Ce.CallHierarchyPrepareRequest=Ce.CallHierarchyOutgoingCallsRequest=Ce.CallHierarchyIncomingCallsRequest=Ce.WorkDoneProgressCancelNotification=Ce.WorkDoneProgressCreateRequest=Ce.WorkDoneProgress=Ce.SelectionRangeRequest=Ce.DeclarationRequest=Ce.FoldingRangeRefreshRequest=Ce.FoldingRangeRequest=Ce.ColorPresentationRequest=Ce.DocumentColorRequest=Ce.ConfigurationRequest=Ce.DidChangeWorkspaceFoldersNotification=Ce.WorkspaceFoldersRequest=Ce.TypeDefinitionRequest=Ce.ImplementationRequest=Ce.ApplyWorkspaceEditRequest=Ce.ExecuteCommandRequest=Ce.PrepareRenameRequest=Ce.RenameRequest=Ce.PrepareSupportDefaultBehavior=Ce.DocumentOnTypeFormattingRequest=Ce.DocumentRangesFormattingRequest=Ce.DocumentRangeFormattingRequest=Ce.DocumentFormattingRequest=Ce.DocumentLinkResolveRequest=Ce.DocumentLinkRequest=Ce.CodeLensRefreshRequest=Ce.CodeLensResolveRequest=Ce.CodeLensRequest=Ce.WorkspaceSymbolResolveRequest=void 0;Ce.InlineCompletionRequest=Ce.DidCloseNotebookDocumentNotification=Ce.DidSaveNotebookDocumentNotification=Ce.DidChangeNotebookDocumentNotification=Ce.NotebookCellArrayChange=Ce.DidOpenNotebookDocumentNotification=Ce.NotebookDocumentSyncRegistrationType=Ce.NotebookDocument=Ce.NotebookCell=Ce.ExecutionSummary=Ce.NotebookCellKind=Ce.DiagnosticRefreshRequest=Ce.WorkspaceDiagnosticRequest=Ce.DocumentDiagnosticRequest=Ce.DocumentDiagnosticReportKind=Ce.DiagnosticServerCancellationData=Ce.InlayHintRefreshRequest=Ce.InlayHintResolveRequest=Ce.InlayHintRequest=Ce.InlineValueRefreshRequest=Ce.InlineValueRequest=Ce.TypeHierarchySupertypesRequest=Ce.TypeHierarchySubtypesRequest=Ce.TypeHierarchyPrepareRequest=void 0;var Et=mi(),qxe=(Zy(),G3(K6)),Aa=LA(),Nit=p2e();Object.defineProperty(Ce,"ImplementationRequest",{enumerable:!0,get:o(function(){return Nit.ImplementationRequest},"get")});var Mit=y2e();Object.defineProperty(Ce,"TypeDefinitionRequest",{enumerable:!0,get:o(function(){return Mit.TypeDefinitionRequest},"get")});var Qbe=b2e();Object.defineProperty(Ce,"WorkspaceFoldersRequest",{enumerable:!0,get:o(function(){return Qbe.WorkspaceFoldersRequest},"get")});Object.defineProperty(Ce,"DidChangeWorkspaceFoldersNotification",{enumerable:!0,get:o(function(){return Qbe.DidChangeWorkspaceFoldersNotification},"get")});var Iit=k2e();Object.defineProperty(Ce,"ConfigurationRequest",{enumerable:!0,get:o(function(){return Iit.ConfigurationRequest},"get")});var Zbe=C2e();Object.defineProperty(Ce,"DocumentColorRequest",{enumerable:!0,get:o(function(){return Zbe.DocumentColorRequest},"get")});Object.defineProperty(Ce,"ColorPresentationRequest",{enumerable:!0,get:o(function(){return Zbe.ColorPresentationRequest},"get")});var Jbe=D2e();Object.defineProperty(Ce,"FoldingRangeRequest",{enumerable:!0,get:o(function(){return Jbe.FoldingRangeRequest},"get")});Object.defineProperty(Ce,"FoldingRangeRefreshRequest",{enumerable:!0,get:o(function(){return Jbe.FoldingRangeRefreshRequest},"get")});var Oit=N2e();Object.defineProperty(Ce,"DeclarationRequest",{enumerable:!0,get:o(function(){return Oit.DeclarationRequest},"get")});var Pit=O2e();Object.defineProperty(Ce,"SelectionRangeRequest",{enumerable:!0,get:o(function(){return Pit.SelectionRangeRequest},"get")});var lV=$2e();Object.defineProperty(Ce,"WorkDoneProgress",{enumerable:!0,get:o(function(){return lV.WorkDoneProgress},"get")});Object.defineProperty(Ce,"WorkDoneProgressCreateRequest",{enumerable:!0,get:o(function(){return lV.WorkDoneProgressCreateRequest},"get")});Object.defineProperty(Ce,"WorkDoneProgressCancelNotification",{enumerable:!0,get:o(function(){return lV.WorkDoneProgressCancelNotification},"get")});var cV=q2e();Object.defineProperty(Ce,"CallHierarchyIncomingCallsRequest",{enumerable:!0,get:o(function(){return cV.CallHierarchyIncomingCallsRequest},"get")});Object.defineProperty(Ce,"CallHierarchyOutgoingCallsRequest",{enumerable:!0,get:o(function(){return cV.CallHierarchyOutgoingCallsRequest},"get")});Object.defineProperty(Ce,"CallHierarchyPrepareRequest",{enumerable:!0,get:o(function(){return cV.CallHierarchyPrepareRequest},"get")});var Sv=X2e();Object.defineProperty(Ce,"TokenFormat",{enumerable:!0,get:o(function(){return Sv.TokenFormat},"get")});Object.defineProperty(Ce,"SemanticTokensRequest",{enumerable:!0,get:o(function(){return Sv.SemanticTokensRequest},"get")});Object.defineProperty(Ce,"SemanticTokensDeltaRequest",{enumerable:!0,get:o(function(){return Sv.SemanticTokensDeltaRequest},"get")});Object.defineProperty(Ce,"SemanticTokensRangeRequest",{enumerable:!0,get:o(function(){return Sv.SemanticTokensRangeRequest},"get")});Object.defineProperty(Ce,"SemanticTokensRefreshRequest",{enumerable:!0,get:o(function(){return Sv.SemanticTokensRefreshRequest},"get")});Object.defineProperty(Ce,"SemanticTokensRegistrationType",{enumerable:!0,get:o(function(){return Sv.SemanticTokensRegistrationType},"get")});var Bit=Z2e();Object.defineProperty(Ce,"ShowDocumentRequest",{enumerable:!0,get:o(function(){return Bit.ShowDocumentRequest},"get")});var Fit=txe();Object.defineProperty(Ce,"LinkedEditingRangeRequest",{enumerable:!0,get:o(function(){return Fit.LinkedEditingRangeRequest},"get")});var Mm=cxe();Object.defineProperty(Ce,"FileOperationPatternKind",{enumerable:!0,get:o(function(){return Mm.FileOperationPatternKind},"get")});Object.defineProperty(Ce,"DidCreateFilesNotification",{enumerable:!0,get:o(function(){return Mm.DidCreateFilesNotification},"get")});Object.defineProperty(Ce,"WillCreateFilesRequest",{enumerable:!0,get:o(function(){return Mm.WillCreateFilesRequest},"get")});Object.defineProperty(Ce,"DidRenameFilesNotification",{enumerable:!0,get:o(function(){return Mm.DidRenameFilesNotification},"get")});Object.defineProperty(Ce,"WillRenameFilesRequest",{enumerable:!0,get:o(function(){return Mm.WillRenameFilesRequest},"get")});Object.defineProperty(Ce,"DidDeleteFilesNotification",{enumerable:!0,get:o(function(){return Mm.DidDeleteFilesNotification},"get")});Object.defineProperty(Ce,"WillDeleteFilesRequest",{enumerable:!0,get:o(function(){return Mm.WillDeleteFilesRequest},"get")});var uV=pxe();Object.defineProperty(Ce,"UniquenessLevel",{enumerable:!0,get:o(function(){return uV.UniquenessLevel},"get")});Object.defineProperty(Ce,"MonikerKind",{enumerable:!0,get:o(function(){return uV.MonikerKind},"get")});Object.defineProperty(Ce,"MonikerRequest",{enumerable:!0,get:o(function(){return uV.MonikerRequest},"get")});var hV=vxe();Object.defineProperty(Ce,"TypeHierarchyPrepareRequest",{enumerable:!0,get:o(function(){return hV.TypeHierarchyPrepareRequest},"get")});Object.defineProperty(Ce,"TypeHierarchySubtypesRequest",{enumerable:!0,get:o(function(){return hV.TypeHierarchySubtypesRequest},"get")});Object.defineProperty(Ce,"TypeHierarchySupertypesRequest",{enumerable:!0,get:o(function(){return hV.TypeHierarchySupertypesRequest},"get")});var eTe=Txe();Object.defineProperty(Ce,"InlineValueRequest",{enumerable:!0,get:o(function(){return eTe.InlineValueRequest},"get")});Object.defineProperty(Ce,"InlineValueRefreshRequest",{enumerable:!0,get:o(function(){return eTe.InlineValueRefreshRequest},"get")});var fV=Sxe();Object.defineProperty(Ce,"InlayHintRequest",{enumerable:!0,get:o(function(){return fV.InlayHintRequest},"get")});Object.defineProperty(Ce,"InlayHintResolveRequest",{enumerable:!0,get:o(function(){return fV.InlayHintResolveRequest},"get")});Object.defineProperty(Ce,"InlayHintRefreshRequest",{enumerable:!0,get:o(function(){return fV.InlayHintRefreshRequest},"get")});var q4=Nxe();Object.defineProperty(Ce,"DiagnosticServerCancellationData",{enumerable:!0,get:o(function(){return q4.DiagnosticServerCancellationData},"get")});Object.defineProperty(Ce,"DocumentDiagnosticReportKind",{enumerable:!0,get:o(function(){return q4.DocumentDiagnosticReportKind},"get")});Object.defineProperty(Ce,"DocumentDiagnosticRequest",{enumerable:!0,get:o(function(){return q4.DocumentDiagnosticRequest},"get")});Object.defineProperty(Ce,"WorkspaceDiagnosticRequest",{enumerable:!0,get:o(function(){return q4.WorkspaceDiagnosticRequest},"get")});Object.defineProperty(Ce,"DiagnosticRefreshRequest",{enumerable:!0,get:o(function(){return q4.DiagnosticRefreshRequest},"get")});var Uu=$xe();Object.defineProperty(Ce,"NotebookCellKind",{enumerable:!0,get:o(function(){return Uu.NotebookCellKind},"get")});Object.defineProperty(Ce,"ExecutionSummary",{enumerable:!0,get:o(function(){return Uu.ExecutionSummary},"get")});Object.defineProperty(Ce,"NotebookCell",{enumerable:!0,get:o(function(){return Uu.NotebookCell},"get")});Object.defineProperty(Ce,"NotebookDocument",{enumerable:!0,get:o(function(){return Uu.NotebookDocument},"get")});Object.defineProperty(Ce,"NotebookDocumentSyncRegistrationType",{enumerable:!0,get:o(function(){return Uu.NotebookDocumentSyncRegistrationType},"get")});Object.defineProperty(Ce,"DidOpenNotebookDocumentNotification",{enumerable:!0,get:o(function(){return Uu.DidOpenNotebookDocumentNotification},"get")});Object.defineProperty(Ce,"NotebookCellArrayChange",{enumerable:!0,get:o(function(){return Uu.NotebookCellArrayChange},"get")});Object.defineProperty(Ce,"DidChangeNotebookDocumentNotification",{enumerable:!0,get:o(function(){return Uu.DidChangeNotebookDocumentNotification},"get")});Object.defineProperty(Ce,"DidSaveNotebookDocumentNotification",{enumerable:!0,get:o(function(){return Uu.DidSaveNotebookDocumentNotification},"get")});Object.defineProperty(Ce,"DidCloseNotebookDocumentNotification",{enumerable:!0,get:o(function(){return Uu.DidCloseNotebookDocumentNotification},"get")});var $it=Vxe();Object.defineProperty(Ce,"InlineCompletionRequest",{enumerable:!0,get:o(function(){return $it.InlineCompletionRequest},"get")});var iV;(function(t){function e(r){let n=r;return Aa.string(n)||Aa.string(n.language)||Aa.string(n.scheme)||Aa.string(n.pattern)}o(e,"is"),t.is=e})(iV||(Ce.TextDocumentFilter=iV={}));var aV;(function(t){function e(r){let n=r;return Aa.objectLiteral(n)&&(Aa.string(n.notebookType)||Aa.string(n.scheme)||Aa.string(n.pattern))}o(e,"is"),t.is=e})(aV||(Ce.NotebookDocumentFilter=aV={}));var sV;(function(t){function e(r){let n=r;return Aa.objectLiteral(n)&&(Aa.string(n.notebook)||aV.is(n.notebook))&&(n.language===void 0||Aa.string(n.language))}o(e,"is"),t.is=e})(sV||(Ce.NotebookCellTextDocumentFilter=sV={}));var oV;(function(t){function e(r){if(!Array.isArray(r))return!1;for(let n of r)if(!Aa.string(n)&&!iV.is(n)&&!sV.is(n))return!1;return!0}o(e,"is"),t.is=e})(oV||(Ce.DocumentSelector=oV={}));var Uxe;(function(t){t.method="client/registerCapability",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolRequestType(t.method)})(Uxe||(Ce.RegistrationRequest=Uxe={}));var Wxe;(function(t){t.method="client/unregisterCapability",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolRequestType(t.method)})(Wxe||(Ce.UnregistrationRequest=Wxe={}));var Hxe;(function(t){t.Create="create",t.Rename="rename",t.Delete="delete"})(Hxe||(Ce.ResourceOperationKind=Hxe={}));var Yxe;(function(t){t.Abort="abort",t.Transactional="transactional",t.TextOnlyTransactional="textOnlyTransactional",t.Undo="undo"})(Yxe||(Ce.FailureHandlingKind=Yxe={}));var jxe;(function(t){t.UTF8="utf-8",t.UTF16="utf-16",t.UTF32="utf-32"})(jxe||(Ce.PositionEncodingKind=jxe={}));var Xxe;(function(t){function e(r){let n=r;return n&&Aa.string(n.id)&&n.id.length>0}o(e,"hasId"),t.hasId=e})(Xxe||(Ce.StaticRegistrationOptions=Xxe={}));var Kxe;(function(t){function e(r){let n=r;return n&&(n.documentSelector===null||oV.is(n.documentSelector))}o(e,"is"),t.is=e})(Kxe||(Ce.TextDocumentRegistrationOptions=Kxe={}));var Qxe;(function(t){function e(n){let i=n;return Aa.objectLiteral(i)&&(i.workDoneProgress===void 0||Aa.boolean(i.workDoneProgress))}o(e,"is"),t.is=e;function r(n){let i=n;return i&&Aa.boolean(i.workDoneProgress)}o(r,"hasWorkDoneProgress"),t.hasWorkDoneProgress=r})(Qxe||(Ce.WorkDoneProgressOptions=Qxe={}));var Zxe;(function(t){t.method="initialize",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Zxe||(Ce.InitializeRequest=Zxe={}));var Jxe;(function(t){t.unknownProtocolVersion=1})(Jxe||(Ce.InitializeErrorCodes=Jxe={}));var ebe;(function(t){t.method="initialized",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(ebe||(Ce.InitializedNotification=ebe={}));var tbe;(function(t){t.method="shutdown",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType0(t.method)})(tbe||(Ce.ShutdownRequest=tbe={}));var rbe;(function(t){t.method="exit",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType0(t.method)})(rbe||(Ce.ExitNotification=rbe={}));var nbe;(function(t){t.method="workspace/didChangeConfiguration",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(nbe||(Ce.DidChangeConfigurationNotification=nbe={}));var ibe;(function(t){t.Error=1,t.Warning=2,t.Info=3,t.Log=4,t.Debug=5})(ibe||(Ce.MessageType=ibe={}));var abe;(function(t){t.method="window/showMessage",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolNotificationType(t.method)})(abe||(Ce.ShowMessageNotification=abe={}));var sbe;(function(t){t.method="window/showMessageRequest",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolRequestType(t.method)})(sbe||(Ce.ShowMessageRequest=sbe={}));var obe;(function(t){t.method="window/logMessage",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolNotificationType(t.method)})(obe||(Ce.LogMessageNotification=obe={}));var lbe;(function(t){t.method="telemetry/event",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolNotificationType(t.method)})(lbe||(Ce.TelemetryEventNotification=lbe={}));var cbe;(function(t){t.None=0,t.Full=1,t.Incremental=2})(cbe||(Ce.TextDocumentSyncKind=cbe={}));var ube;(function(t){t.method="textDocument/didOpen",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(ube||(Ce.DidOpenTextDocumentNotification=ube={}));var hbe;(function(t){function e(n){let i=n;return i!=null&&typeof i.text=="string"&&i.range!==void 0&&(i.rangeLength===void 0||typeof i.rangeLength=="number")}o(e,"isIncremental"),t.isIncremental=e;function r(n){let i=n;return i!=null&&typeof i.text=="string"&&i.range===void 0&&i.rangeLength===void 0}o(r,"isFull"),t.isFull=r})(hbe||(Ce.TextDocumentContentChangeEvent=hbe={}));var fbe;(function(t){t.method="textDocument/didChange",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(fbe||(Ce.DidChangeTextDocumentNotification=fbe={}));var dbe;(function(t){t.method="textDocument/didClose",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(dbe||(Ce.DidCloseTextDocumentNotification=dbe={}));var pbe;(function(t){t.method="textDocument/didSave",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(pbe||(Ce.DidSaveTextDocumentNotification=pbe={}));var mbe;(function(t){t.Manual=1,t.AfterDelay=2,t.FocusOut=3})(mbe||(Ce.TextDocumentSaveReason=mbe={}));var gbe;(function(t){t.method="textDocument/willSave",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(gbe||(Ce.WillSaveTextDocumentNotification=gbe={}));var ybe;(function(t){t.method="textDocument/willSaveWaitUntil",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(ybe||(Ce.WillSaveTextDocumentWaitUntilRequest=ybe={}));var vbe;(function(t){t.method="workspace/didChangeWatchedFiles",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolNotificationType(t.method)})(vbe||(Ce.DidChangeWatchedFilesNotification=vbe={}));var xbe;(function(t){t.Created=1,t.Changed=2,t.Deleted=3})(xbe||(Ce.FileChangeType=xbe={}));var bbe;(function(t){function e(r){let n=r;return Aa.objectLiteral(n)&&(qxe.URI.is(n.baseUri)||qxe.WorkspaceFolder.is(n.baseUri))&&Aa.string(n.pattern)}o(e,"is"),t.is=e})(bbe||(Ce.RelativePattern=bbe={}));var Tbe;(function(t){t.Create=1,t.Change=2,t.Delete=4})(Tbe||(Ce.WatchKind=Tbe={}));var wbe;(function(t){t.method="textDocument/publishDiagnostics",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolNotificationType(t.method)})(wbe||(Ce.PublishDiagnosticsNotification=wbe={}));var kbe;(function(t){t.Invoked=1,t.TriggerCharacter=2,t.TriggerForIncompleteCompletions=3})(kbe||(Ce.CompletionTriggerKind=kbe={}));var Ebe;(function(t){t.method="textDocument/completion",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Ebe||(Ce.CompletionRequest=Ebe={}));var Sbe;(function(t){t.method="completionItem/resolve",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Sbe||(Ce.CompletionResolveRequest=Sbe={}));var Cbe;(function(t){t.method="textDocument/hover",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Cbe||(Ce.HoverRequest=Cbe={}));var Abe;(function(t){t.Invoked=1,t.TriggerCharacter=2,t.ContentChange=3})(Abe||(Ce.SignatureHelpTriggerKind=Abe={}));var _be;(function(t){t.method="textDocument/signatureHelp",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(_be||(Ce.SignatureHelpRequest=_be={}));var Dbe;(function(t){t.method="textDocument/definition",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Dbe||(Ce.DefinitionRequest=Dbe={}));var Rbe;(function(t){t.method="textDocument/references",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Rbe||(Ce.ReferencesRequest=Rbe={}));var Lbe;(function(t){t.method="textDocument/documentHighlight",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Lbe||(Ce.DocumentHighlightRequest=Lbe={}));var Nbe;(function(t){t.method="textDocument/documentSymbol",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Nbe||(Ce.DocumentSymbolRequest=Nbe={}));var Mbe;(function(t){t.method="textDocument/codeAction",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Mbe||(Ce.CodeActionRequest=Mbe={}));var Ibe;(function(t){t.method="codeAction/resolve",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Ibe||(Ce.CodeActionResolveRequest=Ibe={}));var Obe;(function(t){t.method="workspace/symbol",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Obe||(Ce.WorkspaceSymbolRequest=Obe={}));var Pbe;(function(t){t.method="workspaceSymbol/resolve",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Pbe||(Ce.WorkspaceSymbolResolveRequest=Pbe={}));var Bbe;(function(t){t.method="textDocument/codeLens",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Bbe||(Ce.CodeLensRequest=Bbe={}));var Fbe;(function(t){t.method="codeLens/resolve",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Fbe||(Ce.CodeLensResolveRequest=Fbe={}));var $be;(function(t){t.method="workspace/codeLens/refresh",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolRequestType0(t.method)})($be||(Ce.CodeLensRefreshRequest=$be={}));var zbe;(function(t){t.method="textDocument/documentLink",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(zbe||(Ce.DocumentLinkRequest=zbe={}));var Gbe;(function(t){t.method="documentLink/resolve",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Gbe||(Ce.DocumentLinkResolveRequest=Gbe={}));var Vbe;(function(t){t.method="textDocument/formatting",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Vbe||(Ce.DocumentFormattingRequest=Vbe={}));var qbe;(function(t){t.method="textDocument/rangeFormatting",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(qbe||(Ce.DocumentRangeFormattingRequest=qbe={}));var Ube;(function(t){t.method="textDocument/rangesFormatting",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Ube||(Ce.DocumentRangesFormattingRequest=Ube={}));var Wbe;(function(t){t.method="textDocument/onTypeFormatting",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Wbe||(Ce.DocumentOnTypeFormattingRequest=Wbe={}));var Hbe;(function(t){t.Identifier=1})(Hbe||(Ce.PrepareSupportDefaultBehavior=Hbe={}));var Ybe;(function(t){t.method="textDocument/rename",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Ybe||(Ce.RenameRequest=Ybe={}));var jbe;(function(t){t.method="textDocument/prepareRename",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(jbe||(Ce.PrepareRenameRequest=jbe={}));var Xbe;(function(t){t.method="workspace/executeCommand",t.messageDirection=Et.MessageDirection.clientToServer,t.type=new Et.ProtocolRequestType(t.method)})(Xbe||(Ce.ExecuteCommandRequest=Xbe={}));var Kbe;(function(t){t.method="workspace/applyEdit",t.messageDirection=Et.MessageDirection.serverToClient,t.type=new Et.ProtocolRequestType("workspace/applyEdit")})(Kbe||(Ce.ApplyWorkspaceEditRequest=Kbe={}))});var nTe=nr(HA=>{"use strict";Object.defineProperty(HA,"__esModule",{value:!0});HA.createProtocolConnection=void 0;var rTe=Nm();function zit(t,e,r,n){return rTe.ConnectionStrategy.is(n)&&(n={connectionStrategy:n}),(0,rTe.createMessageConnection)(t,e,r,n)}o(zit,"createProtocolConnection");HA.createProtocolConnection=zit});var aTe=nr(_o=>{"use strict";var Git=_o&&_o.__createBinding||(Object.create?(function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:o(function(){return e[r]},"get")}),Object.defineProperty(t,n,i)}):(function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]})),YA=_o&&_o.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Git(e,t,r)};Object.defineProperty(_o,"__esModule",{value:!0});_o.LSPErrorCodes=_o.createProtocolConnection=void 0;YA(Nm(),_o);YA((Zy(),G3(K6)),_o);YA(mi(),_o);YA(tTe(),_o);var Vit=nTe();Object.defineProperty(_o,"createProtocolConnection",{enumerable:!0,get:o(function(){return Vit.createProtocolConnection},"get")});var iTe;(function(t){t.lspReservedErrorRangeStart=-32899,t.RequestFailed=-32803,t.ServerCancelled=-32802,t.ContentModified=-32801,t.RequestCancelled=-32800,t.lspReservedErrorRangeEnd=-32800})(iTe||(_o.LSPErrorCodes=iTe={}))});var oTe=nr(Wu=>{"use strict";var qit=Wu&&Wu.__createBinding||(Object.create?(function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:o(function(){return e[r]},"get")}),Object.defineProperty(t,n,i)}):(function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]})),sTe=Wu&&Wu.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&qit(e,t,r)};Object.defineProperty(Wu,"__esModule",{value:!0});Wu.createProtocolConnection=void 0;var Uit=KG();sTe(KG(),Wu);sTe(aTe(),Wu);function Wit(t,e,r,n){return(0,Uit.createMessageConnection)(t,e,r,n)}o(Wit,"createProtocolConnection");Wu.createProtocolConnection=Wit});var ap,dV=O(()=>{"use strict";(function(t){function e(r){return{dispose:o(async()=>await r(),"dispose")}}o(e,"create"),t.create=e})(ap||(ap={}))});var Cv,U4,pV=O(()=>{"use strict";Cv=Ra(oTe(),1);Bl();dV();Kd();$l();Os();Nc();ov();U4=class{static{o(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new fs,this.documentPhaseListeners=new fs,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=qr.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.fileSystemProvider=e.workspace.FileSystemProvider,this.workspaceManager=()=>e.workspace.WorkspaceManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=Nr.CancellationToken.None){for(let i of e){let a=i.uri.toString();if(i.state===qr.Validated){if(typeof r.validation=="boolean"&&r.validation)this.resetToState(i,qr.IndexedReferences);else if(typeof r.validation=="object"){let s=this.findMissingValidationCategories(i,r);s.length>0&&(this.buildState.set(a,{completed:!1,options:{validation:{categories:s}},result:this.buildState.get(a)?.result}),i.state=qr.IndexedReferences)}}else this.buildState.delete(a)}this.currentState=qr.Changed,await this.emitUpdate(e.map(i=>i.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=Nr.CancellationToken.None){this.currentState=qr.Changed;let i=[];for(let u of r){let h=this.langiumDocuments.deleteDocuments(u);for(let f of h)i.push(f.uri),this.cleanUpDeleted(f)}let a=(await Promise.all(e.map(u=>this.findChangedUris(u)))).flat();for(let u of a){let h=this.langiumDocuments.getDocument(u);h===void 0&&(h=this.langiumDocumentFactory.fromModel({$type:"INVALID"},u),h.state=qr.Changed,this.langiumDocuments.addDocument(h)),this.resetToState(h,qr.Changed)}let s=Hr(a).concat(i).map(u=>u.toString()).toSet();this.langiumDocuments.all.filter(u=>!s.has(u.uri.toString())&&this.shouldRelink(u,s)).forEach(u=>this.resetToState(u,qr.ComputedScopes)),await this.emitUpdate(a,i),await Ci(n);let l=this.sortDocuments(this.langiumDocuments.all.filter(u=>u.state=1}findMissingValidationCategories(e,r){let n=this.buildState.get(e.uri.toString()),i=this.serviceRegistry.getServices(e.uri).validation.ValidationRegistry.getAllValidationCategories(e),a=n?.result?.validationChecks?new Set(n?.result?.validationChecks):n?.completed?i:new Set,s=r===void 0||r.validation===!0?i:typeof r.validation=="object"?r.validation.categories??i:[];return Hr(s).filter(l=>!a.has(l)).toArray()}async findChangedUris(e){if(this.langiumDocuments.getDocument(e)??this.textDocuments?.get(e))return[e];try{let n=await this.fileSystemProvider.stat(e);if(n.isDirectory)return await this.workspaceManager().searchFolder(e);if(this.workspaceManager().shouldIncludeEntry(n))return[e]}catch{}return[]}async emitUpdate(e,r){await Promise.all(this.updateListeners.map(n=>n(e,r)))}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),ap.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}resetToState(e,r){switch(r){case qr.Changed:case qr.Parsed:this.indexManager.removeContent(e.uri);case qr.IndexedContent:e.localSymbols=void 0;case qr.ComputedScopes:this.serviceRegistry.getServices(e.uri).references.Linker.unlink(e);case qr.Linked:this.indexManager.removeReferences(e.uri);case qr.IndexedReferences:e.diagnostics=void 0,this.buildState.delete(e.uri.toString());case qr.Validated:}e.state>r&&(e.state=r)}cleanUpDeleted(e){this.buildState.delete(e.uri.toString()),this.indexManager.remove(e.uri),e.state=qr.Changed}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,qr.Parsed,n,s=>this.langiumDocumentFactory.update(s,n)),await this.runCancelable(e,qr.IndexedContent,n,s=>this.indexManager.updateContent(s,n)),await this.runCancelable(e,qr.ComputedScopes,n,async s=>{let l=this.serviceRegistry.getServices(s.uri).references.ScopeComputation;s.localSymbols=await l.collectLocalSymbols(s,n)});let i=e.filter(s=>this.shouldLink(s));await this.runCancelable(i,qr.Linked,n,s=>this.serviceRegistry.getServices(s.uri).references.Linker.link(s,n)),await this.runCancelable(i,qr.IndexedReferences,n,s=>this.indexManager.updateReferences(s,n));let a=e.filter(s=>this.shouldValidate(s)?!0:(this.markAsCompleted(s),!1));await this.runCancelable(a,qr.Validated,n,async s=>{await this.validate(s,n),this.markAsCompleted(s)})}markAsCompleted(e){let r=this.buildState.get(e.uri.toString());r&&(r.completed=!0)}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){for(let s of e)s.states.state===r);await this.notifyBuildPhase(a,r,n),this.currentState=r}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),ap.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),ap.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;return r&&"path"in r?i=r:n=r,n??(n=Nr.CancellationToken.None),i?this.awaitDocumentState(e,i,n):this.awaitBuilderState(e,n)}awaitDocumentState(e,r,n){let i=this.langiumDocuments.getDocument(r);if(i){if(i.state>=e)return Promise.resolve(r);if(n.isCancellationRequested)return Promise.reject(Fl);if(this.currentState>=e&&e>i.state)return Promise.reject(new Cv.ResponseError(Cv.LSPErrorCodes.RequestFailed,`Document state of ${r.toString()} is ${qr[i.state]}, requiring ${qr[e]}, but workspace state is already ${qr[this.currentState]}. Returning undefined.`))}else return Promise.reject(new Cv.ResponseError(Cv.LSPErrorCodes.ServerCancelled,`No document found for URI: ${r.toString()}`));return new Promise((a,s)=>{let l=this.onDocumentPhase(e,h=>{Fi.equals(h.uri,r)&&(l.dispose(),u.dispose(),a(h.uri))}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),s(Fl)})})}awaitBuilderState(e,r){return this.currentState>=e?Promise.resolve():r.isCancellationRequested?Promise.reject(Fl):new Promise((n,i)=>{let a=this.onBuildPhase(e,()=>{a.dispose(),s.dispose(),n()}),s=r.onCancellationRequested(()=>{a.dispose(),s.dispose(),i(Fl)})})}async notifyDocumentPhase(e,r,n){let a=this.documentPhaseListeners.get(r).slice();for(let s of a)try{await Ci(n),await s(e,n)}catch(l){if(!Gu(l))throw l}}async notifyBuildPhase(e,r,n){if(e.length===0)return;let a=this.buildPhaseListeners.get(r).slice();for(let s of a)await Ci(n),await s(e,n)}shouldLink(e){return this.getBuildOptions(e).eagerLinking??!0}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){let n=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,i=this.getBuildOptions(e),a=typeof i.validation=="object"?{...i.validation}:{};a.categories=this.findMissingValidationCategories(e,i);let s=await n.validateDocument(e,a,r);e.diagnostics?e.diagnostics.push(...s):e.diagnostics=s;let l=this.buildState.get(e.uri.toString());l&&(l.result??(l.result={}),l.result.validationChecks?l.result.validationChecks=Hr(l.result.validationChecks).concat(a.categories).distinct().toArray():l.result.validationChecks=[...a.categories])}getBuildOptions(e){return this.buildState.get(e.uri.toString())?.options??{}}}});var W4,mV=O(()=>{"use strict";us();hA();Bl();Os();Nc();W4=class{static{o(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new Dm,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=cs(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{Fi.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),Hr(i)}allElements(e,r){let n=Hr(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){return r?this.symbolByTypeIndex.get(e,r,()=>(this.symbolIndex.get(e)??[]).filter(a=>this.astReflection.isSubtype(a.type,r))):this.symbolIndex.get(e)??[]}remove(e){this.removeContent(e),this.removeReferences(e)}removeContent(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r)}removeReferences(e){let r=e.toString();this.referenceIndex.delete(r)}async updateContent(e,r=Nr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.collectExportedSymbols(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=Nr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var H4,gV=O(()=>{"use strict";Bl();$l();Nc();Os();H4=class{static{o(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new Vs,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){this.folders=e.workspaceFolders??void 0}initialized(e){return this.mutex.write(r=>this.initializeWorkspace(this.folders??[],r))}async initializeWorkspace(e,r=Nr.CancellationToken.None){let n=await this.performStartup(e);await Ci(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=[],n=o(s=>{r.push(s),this.langiumDocuments.hasDocument(s.uri)||this.langiumDocuments.addDocument(s)},"collector");await this.loadAdditionalDocuments(e,n);let i=[];await Promise.all(e.map(s=>this.getRootFolder(s)).map(async s=>this.traverseFolder(s,i)));let a=Hr(i).distinct(s=>s.toString()).filter(s=>!this.langiumDocuments.hasDocument(s));return await this.loadWorkspaceDocuments(a,n),this._ready.resolve(),r}async loadWorkspaceDocuments(e,r){await Promise.all(e.map(async n=>{let i=await this.langiumDocuments.getOrCreateDocument(n);r(i)}))}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return ca.parse(e.uri)}async traverseFolder(e,r){try{let n=await this.fileSystemProvider.readDirectory(e);await Promise.all(n.map(async i=>{this.shouldIncludeEntry(i)&&(i.isDirectory?await this.traverseFolder(i.uri,r):i.isFile&&r.push(i.uri))}))}catch(n){console.error("Failure to read directory content of "+e.toString(!0),n)}}async searchFolder(e){let r=[];return await this.traverseFolder(e,r),r}shouldIncludeEntry(e){let r=Fi.basename(e.uri);return r.startsWith(".")?!1:e.isDirectory?r!=="node_modules"&&r!=="out":e.isFile?this.serviceRegistry.hasServices(e.uri):!1}}});function XA(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function vV(t){return t&&"modes"in t&&"defaultMode"in t}function yV(t){return!XA(t)&&!vV(t)}var Y4,jA,Im,KA=O(()=>{"use strict";Hd();Y4=class{static{o(this,"DefaultLexerErrorMessageProvider")}buildUnexpectedCharactersMessage(e,r,n,i,a){return Ny.buildUnexpectedCharactersMessage(e,r,n,i,a)}buildUnableToPopLexerModeMessage(e){return Ny.buildUnableToPopLexerModeMessage(e)}},jA={mode:"full"},Im=class{static{o(this,"DefaultLexer")}constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=yV(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new fi(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=jA){let n=this.chevrotainLexer.tokenize(e);return{tokens:n.tokens,errors:n.errors,hidden:n.groups.hidden??[],report:this.tokenBuilder.flushLexingReport?.(e)}}toTokenTypeDictionary(e){if(yV(e))return e;let r=vV(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};o(XA,"isTokenTypeArray");o(vV,"isIMultiModeLexerDefinition");o(yV,"isTokenTypeDictionary")});function TV(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=on.create(0,0));let a=uTe(t),s=kV(n),l=Yit({lines:a,position:i,options:s});return Zit({index:0,tokens:l,position:i})}function wV(t,e){let r=kV(e),n=uTe(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,l=r.end;return!!s?.exec(i)&&!!l?.exec(a)}function uTe(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(dF)}function Yit(t){let e=[],r=t.position.line,n=t.position.character;for(let i=0;i=l.length){if(e.length>0){let f=on.create(r,n);e.push({type:"break",content:"",range:Kr.create(f,f)})}}else{lTe.lastIndex=u;let f=lTe.exec(l);if(f){let d=f[0],p=f[1],m=on.create(r,n+u),g=on.create(r,n+u+d.length);e.push({type:"tag",content:p,range:Kr.create(m,g)}),u+=d.length,u=bV(l,u)}if(u0&&e[e.length-1].type==="break"?e.slice(0,-1):e}function jit(t,e,r,n){let i=[];if(t.length===0){let a=on.create(r,n),s=on.create(r,n+e.length);i.push({type:"text",content:e,range:Kr.create(a,s)})}else{let a=0;for(let l of t){let u=l.index,h=e.substring(a,u);h.length>0&&i.push({type:"text",content:e.substring(a,u),range:Kr.create(on.create(r,a+n),on.create(r,u+n))});let f=h.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:Kr.create(on.create(r,a+f+n),on.create(r,a+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let p=l[3];i.push({type:"text",content:p,range:Kr.create(on.create(r,a+f+n),on.create(r,a+f+p.length+n))})}else i.push({type:"text",content:"",range:Kr.create(on.create(r,a+f+n),on.create(r,a+f+n))});a=u+l[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:Kr.create(on.create(r,a+n),on.create(r,a+n+s.length))})}return i}function bV(t,e){let r=t.substring(e).match(Xit);return r?e+r.index:t.length}function Qit(t){let e=t.match(Kit);if(e&&typeof e.index=="number")return e.index}function Zit(t){let e=on.create(t.position.line,t.position.character);if(t.tokens.length===0)return new QA([],Kr.create(e,e));let r=[];for(;t.index0){let s=bV(e,n);i=e.substring(s),e=e.substring(0,n)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(i=`\`${i}\``),r.renderLink?.(e,i)??nat(e,i)}}function nat(t,e){try{return ca.parse(t,!0),`[${e}](${t})`}catch{return t}}function cTe(t){return t.endsWith(` -`)?` -`:` - -`}var lTe,Hit,Xit,Kit,QA,j4,X4,ZA,EV=O(()=>{"use strict";Zy();wy();Nc();o(TV,"parseJSDoc");o(wV,"isJSDoc");o(uTe,"getLines");lTe=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,Hit=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;o(Yit,"tokenize");o(jit,"buildInlineTokens");Xit=/\S/,Kit=/\s*$/;o(bV,"skipWhitespace");o(Qit,"lastCharacter");o(Zit,"parseJSDocComment");o(Jit,"parseJSDocElement");o(eat,"appendEmptyLine");o(hTe,"parseJSDocText");o(tat,"parseJSDocInline");o(fTe,"parseJSDocTag");o(dTe,"parseJSDocLine");o(kV,"normalizeOptions");o(xV,"normalizeOption");QA=class{static{o(this,"JSDocCommentImpl")}constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=cTe(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=cTe(r)+i}return r.trim()}},j4=class{static{o(this,"JSDocTagImpl")}constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} -${r}`),this.inline?`{${e}}`:e}toMarkdown(e){return e?.renderTag?.(this)??this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=rat(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} -${r}`),this.inline?`{${i}}`:i}};o(rat,"renderInlineTag");o(nat,"renderLinkDefault");X4=class{static{o(this,"JSDocTextImpl")}constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` -`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` -`)}return r}},ZA=class{static{o(this,"JSDocLineImpl")}constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};o(cTe,"fillNewlines")});var K4,SV=O(()=>{"use strict";us();EV();K4=class{static{o(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&wV(r))return TV(r).toMarkdown({renderLink:o((i,a)=>this.documentationLinkRenderer(e,i,a),"renderLink"),renderTag:o(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,r,n){let i=this.findNameInLocalSymbols(e,r)??this.findNameInGlobalScope(e,r);if(i&&i.nameSegment){let a=i.nameSegment.range.start.line+1,s=i.nameSegment.range.start.character+1,l=i.documentUri.with({fragment:`L${a},${s}`});return`[${n}](${l.toString()})`}else return}documentationTagRenderer(e,r){}findNameInLocalSymbols(e,r){let i=cs(e).localSymbols;if(!i)return;let a=e;do{let l=i.getStream(a).find(u=>u.name===r);if(l)return l;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var Q4,CV=O(()=>{"use strict";fA();Sc();Q4=class{static{o(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){return Vz(e)?e.$comment:oF(e.$cstNode,this.grammarConfig().multilineCommentRules)?.text}}});var Z4,AV,_V,DV=O(()=>{"use strict";$l();gA();Z4=class{static{o(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},AV=class{static{o(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new Vs,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new Vs;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Fl)}),this.queue.push(r),r.promise}},_V=class{static{o(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new pi.Emitter,this.deferred=new Vs,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(Fl),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new Vs,this.sendMessage(e),this.deferred.promise}}});var J4,RV=O(()=>{"use strict";Bl();$l();J4=class{static{o(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new Nr.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=lA();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=Nr.CancellationToken.None){let i=new Vs,a={action:r,deferred:i,cancellationToken:n};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Gu(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var e3,LV=O(()=>{"use strict";Q6();Zo();kc();us();Kd();Sc();e3=class{static{o(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new _m,this.tokenTypeIdMap=new _m,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>({...r,message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of Ps(e))r.set(i,{});if(e.$cstNode)for(let i of sm(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)Si(l)?s.push(this.dehydrateAstNode(l,r)):oa(l)?s.push(this.dehydrateReference(l,r)):s.push(l)}else Si(a)?n[i]=this.dehydrateAstNode(a,r):oa(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return fT(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),wc(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):Nd(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of Ps(e))r.set(a,{});let i;if(e.$cstNode)for(let a of sm(e.$cstNode)){let s;"fullText"in a?(s=new Jy(a.fullText),i=s):"content"in a?s=new km:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)Si(l)?s.push(this.setParent(this.hydrateAstNode(l,r),n)):oa(l)?s.push(this.hydrateReference(l,n,i,r)):s.push(l)}else Si(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):oa(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),wc(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,l=e.endLine,u=e.endColumn,h=e.hidden;return new wm(n,i,{start:{line:a,character:s},end:{line:l,character:u}},r,h)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of Ps(this.grammar))wT(r)&&this.grammarElementIdMap.set(r,e++)}}});function Ya(t){return{documentation:{CommentProvider:o(e=>new Q4(e),"CommentProvider"),DocumentationProvider:o(e=>new K4(e),"DocumentationProvider")},parser:{AsyncParser:o(e=>new Z4(e),"AsyncParser"),GrammarConfig:o(e=>AF(e),"GrammarConfig"),LangiumParser:o(e=>kz(e),"LangiumParser"),CompletionParser:o(e=>Tz(e),"CompletionParser"),ValueConverter:o(()=>new Sm,"ValueConverter"),TokenBuilder:o(()=>new ef,"TokenBuilder"),Lexer:o(e=>new Im(e),"Lexer"),ParserErrorMessageProvider:o(()=>new ev,"ParserErrorMessageProvider"),LexerErrorMessageProvider:o(()=>new Y4,"LexerErrorMessageProvider")},workspace:{AstNodeLocator:o(()=>new M4,"AstNodeLocator"),AstNodeDescriptionProvider:o(e=>new L4(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:o(e=>new N4(e),"ReferenceDescriptionProvider")},references:{Linker:o(e=>new b4(e),"Linker"),NameProvider:o(()=>new T4,"NameProvider"),ScopeProvider:o(e=>new C4(e),"ScopeProvider"),ScopeComputation:o(e=>new k4(e),"ScopeComputation"),References:o(e=>new w4(e),"References")},serializer:{Hydrator:o(e=>new e3(e),"Hydrator"),JsonSerializer:o(e=>new A4(e),"JsonSerializer")},validation:{DocumentValidator:o(e=>new R4(e),"DocumentValidator"),ValidationRegistry:o(e=>new D4(e),"ValidationRegistry")},shared:o(()=>t.shared,"shared")}}function ja(t){return{ServiceRegistry:o(e=>new _4(e),"ServiceRegistry"),workspace:{LangiumDocuments:o(e=>new x4(e),"LangiumDocuments"),LangiumDocumentFactory:o(e=>new v4(e),"LangiumDocumentFactory"),DocumentBuilder:o(e=>new U4(e),"DocumentBuilder"),IndexManager:o(e=>new W4(e),"IndexManager"),WorkspaceManager:o(e=>new H4(e),"WorkspaceManager"),FileSystemProvider:o(e=>t.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:o(()=>new J4,"WorkspaceLock"),ConfigurationProvider:o(e=>new I4(e),"ConfigurationProvider")},profilers:{}}}var NV=O(()=>{"use strict";_F();wz();Ez();nA();Sz();Oz();Pz();Bz();Fz();Gz();fA();qz();Uz();pA();Wz();Hz();Yz();pV();ov();mV();gV();KA();SV();CV();m4();DV();RV();LV();o(Ya,"createDefaultCoreModule");o(ja,"createDefaultSharedCoreModule")});function ii(t,e,r,n,i,a,s,l,u){let h=[t,e,r,n,i,a,s,l,u].reduce(t3,{});return vTe(h)}function yTe(t){if(t&&t[gTe])for(let e of Object.values(t))yTe(e);return t}function vTe(t,e){let r=new Proxy({},{deleteProperty:o(()=>!1,"deleteProperty"),set:o(()=>{throw new Error("Cannot set property on injected service container")},"set"),get:o((n,i)=>i===gTe?!0:mTe(n,i,t,e||r),"get"),getOwnPropertyDescriptor:o((n,i)=>(mTe(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:o((n,i)=>i in t,"has"),ownKeys:o(()=>[...Object.getOwnPropertyNames(t)],"ownKeys")});return r}function mTe(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable. Cause: "+t[e]);if(t[e]===pTe)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=pTe;try{t[e]=typeof i=="function"?i(n):vTe(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function t3(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!=null)if(typeof n=="object"){let i=t[r];typeof i=="object"&&i!==null?t[r]=t3(i,n):t[r]=t3({},n)}else t[r]=n}return t}var MV,gTe,pTe,IV=O(()=>{"use strict";(function(t){t.merge=(e,r)=>t3(t3({},e),r)})(MV||(MV={}));o(ii,"inject");gTe=Symbol("isProxy");o(yTe,"eagerLoad");o(vTe,"_inject");pTe=Symbol();o(mTe,"_resolve");o(t3,"_merge")});var xTe=O(()=>{"use strict"});var bTe=O(()=>{"use strict";CV();SV();EV()});var TTe=O(()=>{"use strict"});var wTe=O(()=>{"use strict";_F();TTe()});var OV,Om,JA,PV,kTe=O(()=>{"use strict";Hd();nA();KA();OV={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]};(function(t){t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation"})(Om||(Om={}));JA=class extends ef{static{o(this,"IndentationAwareTokenBuilder")}constructor(e=OV){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options={...OV,...e},this.indentTokenType=Ud({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=Ud({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!XA(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:a,whitespaceTokenName:s,ignoreIndentationDelimiters:l}=this.options,u,h,f,d=[];for(let p of n){for(let[m,g]of l)p.name===m?p.PUSH_MODE=Om.IGNORE_INDENTATION:p.name===g&&(p.POP_MODE=!0);p.name===a?u=p:p.name===i?h=p:p.name===s?f=p:d.push(p)}if(!u||!h||!f)throw new Error("Some indentation/whitespace tokens not found!");return l.length>0?{modes:{[Om.REGULAR]:[u,h,...d,f],[Om.IGNORE_INDENTATION]:[...d,f]},defaultMode:Om.REGULAR}:[u,h,f,...d]}flushLexingReport(e){return{...super.flushLexingReport(e),remainingDedents:this.flushRemainingDedents(e)}}isStartOfLine(e,r){return r===0||`\r -`.includes(e[r-1])}matchWhitespace(e,r,n,i){this.whitespaceRegExp.lastIndex=r;let a=this.whitespaceRegExp.exec(e);return{currIndentLevel:a?.[0].length??0,prevIndentLevel:this.indentationStack.at(-1),match:a}}createIndentationTokenInstance(e,r,n,i){let a=this.getLineNumber(r,i);return Kh(e,n,i,i+n.length,a,a,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:a,prevIndentLevel:s,match:l}=this.matchWhitespace(e,r,n,i);return a<=s?null:(this.indentationStack.push(a),l)}dedentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:a,prevIndentLevel:s,match:l}=this.matchWhitespace(e,r,n,i);if(a>=s)return null;let u=this.indentationStack.lastIndexOf(a);if(u===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${a} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:l?.[0]?.length??0,line:this.getLineNumber(e,r),column:1}),null;let h=this.indentationStack.length-u-1,f=e.substring(0,r).match(/[\r\n]+$/)?.[0].length??1;for(let d=0;d1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},PV=class extends Im{static{o(this,"IndentationAwareLexer")}constructor(e){if(super(e),e.parser.TokenBuilder instanceof JA)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=jA){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:a,dedentTokenType:s}=this.indentationTokenBuilder,l=a.tokenTypeIdx,u=s.tokenTypeIdx,h=[],f=n.tokens.length-1;for(let d=0;d=0&&h.push(n.tokens[f]),n.tokens=h,n}}});var ETe=O(()=>{"use strict"});var STe=O(()=>{"use strict";DV();wz();Q6();kTe();Ez();m4();KA();rA();ETe();nA();Sz()});var CTe=O(()=>{"use strict";Oz();Pz();Bz();zz();Fz();Gz()});var ATe=O(()=>{"use strict";LV();fA()});var e7,Xa,BV=O(()=>{"use strict";e7=class{static{o(this,"EmptyFileSystemProvider")}stat(e){throw new Error("No file system is available.")}statSync(e){throw new Error("No file system is available.")}async exists(){return!1}existsSync(){return!1}readBinary(){throw new Error("No file system is available.")}readBinarySync(){throw new Error("No file system is available.")}readFile(){throw new Error("No file system is available.")}readFileSync(){throw new Error("No file system is available.")}async readDirectory(){return[]}readDirectorySync(){return[]}},Xa={fileSystemProvider:o(()=>new e7,"fileSystemProvider")}});function sat(){let t=ii(ja(Xa),aat),e=ii(Ya({shared:t}),iat);return t.ServiceRegistry.register(e),e}function Hu(t){let e=sat(),r=e.serializer.JsonSerializer.deserialize(t);return e.shared.workspace.LangiumDocumentFactory.fromModel(r,ca.parse(`memory:/${r.name??"grammar"}.langium`)),r}var iat,aat,_Te=O(()=>{"use strict";NV();IV();Zo();BV();Nc();iat={Grammar:o(()=>{},"Grammar"),LanguageMetaData:o(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},aat={AstReflection:o(()=>new xy,"AstReflection")};o(sat,"createMinimalGrammarServices");o(Hu,"loadGrammarFromJson")});var ln={};vr(ln,{AstUtils:()=>_C,BiMap:()=>_m,Cancellation:()=>Nr,ContextCache:()=>Dm,CstUtils:()=>jC,DONE_RESULT:()=>ls,Deferred:()=>Vs,Disposable:()=>ap,DisposableCache:()=>cv,DocumentCache:()=>uA,EMPTY_STREAM:()=>Md,ErrorWithLocation:()=>lm,GrammarUtils:()=>t6,MultiMap:()=>fs,OperationCancelled:()=>Fl,Reduction:()=>cy,RegExpUtils:()=>ZC,SimpleCache:()=>S4,StreamImpl:()=>Ko,TreeStreamImpl:()=>Nu,URI:()=>ca,UriTrie:()=>sv,UriUtils:()=>Fi,WorkspaceCache:()=>uv,assertCondition:()=>o1e,assertUnreachable:()=>Ou,delayNextTick:()=>Nz,interruptAndCheck:()=>Ci,isOperationCancelled:()=>Gu,loadGrammarFromJson:()=>Hu,setInterruptionPeriod:()=>_ve,startCancelableOperation:()=>lA,stream:()=>Hr});var DTe=O(()=>{"use strict";hA();gA();jr(ln,pi);Kd();dV();XC();_Te();$l();Os();Nc();us();Bl();Sc();Rc();wy()});var RTe=O(()=>{"use strict";Uz();pA()});var FV,t7,LTe=O(()=>{"use strict";Kd();FV=class{static{o(this,"DefaultLangiumProfiler")}constructor(e){this.activeCategories=new Set,this.allCategories=new Set(["validating","parsing","linking"]),this.activeCategories=e??new Set(this.allCategories),this.records=new fs}isActive(e){return this.activeCategories.has(e)}start(...e){e?e.forEach(r=>this.activeCategories.add(r)):this.activeCategories=new Set(this.allCategories)}stop(...e){e?e.forEach(r=>this.activeCategories.delete(r)):this.activeCategories.clear()}createTask(e,r){if(!this.isActive(e))throw new Error(`Category "${e}" is not active.`);return console.log(`Creating profiling task for '${e}.${r}'.`),new t7(n=>this.records.add(e,this.dumpRecord(e,n)),r)}dumpRecord(e,r){console.info(`Task ${e}.${r.identifier} executed in ${r.duration.toFixed(2)}ms and ended at ${r.date.toISOString()}`);let n=[];for(let s of r.entries.keys()){let l=r.entries.get(s),u=l.reduce((h,f)=>h+f);n.push({name:`${r.identifier}.${s}`,count:l.length,duration:u})}let i=r.duration-n.map(s=>s.duration).reduce((s,l)=>s+l,0);n.push({name:r.identifier,count:1,duration:i}),n.sort((s,l)=>l.duration-s.duration);function a(s){return Math.round(100*s)/100}return o(a,"Round"),console.table(n.map(s=>({Element:s.name,Count:s.count,"Self %":a(100*s.duration/r.duration),"Time (ms)":a(s.duration)}))),r}getRecords(...e){return e.length===0?this.records.values():this.records.entries().filter(r=>e.some(n=>n===r[0])).flatMap(r=>r[1])}},t7=class{static{o(this,"ProfilingTask")}constructor(e,r){this.stack=[],this.entries=new fs,this.addRecord=e,this.identifier=r}start(){if(this.startTime!==void 0)throw new Error(`Task "${this.identifier}" is already started.`);this.startTime=performance.now()}stop(){if(this.startTime===void 0)throw new Error(`Task "${this.identifier}" was not started.`);if(this.stack.length!==0)throw new Error(`Task "${this.identifier}" cannot be stopped before sub-task(s): ${this.stack.map(r=>r.id).join(", ")}.`);let e={identifier:this.identifier,date:new Date,duration:performance.now()-this.startTime,entries:this.entries};this.addRecord(e),this.startTime=void 0,this.entries.clear()}startSubTask(e){this.stack.push({id:e,start:performance.now(),content:0})}stopSubTask(e){let r=this.stack.pop();if(!r)throw new Error(`Task "${this.identifier}.${e}" was not started.`);if(r.id!==e)throw new Error(`Sub-Task "${r.id}" is not already stopped.`);let n=performance.now()-r.start;this.stack.at(-1)!==void 0&&(this.stack[this.stack.length-1].content+=n);let i=n-r.content;this.entries.add(e,i)}}});var NTe=O(()=>{"use strict";Wz();Hz();Yz();pV();ov();BV();mV();RV();gV();LTe()});var _a={};vr(_a,{AbstractAstReflection:()=>Y0,AbstractCstNode:()=>h4,AbstractLangiumParser:()=>f4,AbstractParserErrorMessageProvider:()=>J6,AbstractThreadedAsyncParser:()=>AV,AstUtils:()=>_C,BiMap:()=>_m,Cancellation:()=>Nr,CompositeCstNodeImpl:()=>km,ContextCache:()=>Dm,CstNodeBuilder:()=>u4,CstUtils:()=>jC,DEFAULT_TOKENIZE_OPTIONS:()=>jA,DONE_RESULT:()=>ls,DatatypeSymbol:()=>Z6,DefaultAstNodeDescriptionProvider:()=>L4,DefaultAstNodeLocator:()=>M4,DefaultAsyncParser:()=>Z4,DefaultCommentProvider:()=>Q4,DefaultConfigurationProvider:()=>I4,DefaultDocumentBuilder:()=>U4,DefaultDocumentValidator:()=>R4,DefaultHydrator:()=>e3,DefaultIndexManager:()=>W4,DefaultJsonSerializer:()=>A4,DefaultLangiumDocumentFactory:()=>v4,DefaultLangiumDocuments:()=>x4,DefaultLangiumProfiler:()=>FV,DefaultLexer:()=>Im,DefaultLexerErrorMessageProvider:()=>Y4,DefaultLinker:()=>b4,DefaultNameProvider:()=>T4,DefaultReferenceDescriptionProvider:()=>N4,DefaultReferences:()=>w4,DefaultScopeComputation:()=>k4,DefaultScopeProvider:()=>C4,DefaultServiceRegistry:()=>_4,DefaultTokenBuilder:()=>ef,DefaultValueConverter:()=>Sm,DefaultWorkspaceLock:()=>J4,DefaultWorkspaceManager:()=>H4,Deferred:()=>Vs,Disposable:()=>ap,DisposableCache:()=>cv,DocumentCache:()=>uA,DocumentState:()=>qr,DocumentValidator:()=>zl,EMPTY_SCOPE:()=>ait,EMPTY_STREAM:()=>Md,EmptyFileSystem:()=>Xa,EmptyFileSystemProvider:()=>e7,ErrorWithLocation:()=>lm,GrammarAST:()=>ET,GrammarUtils:()=>t6,IndentationAwareLexer:()=>PV,IndentationAwareTokenBuilder:()=>JA,JSDocDocumentationProvider:()=>K4,LangiumCompletionParser:()=>p4,LangiumParser:()=>d4,LangiumParserErrorMessageProvider:()=>ev,LeafCstNodeImpl:()=>wm,LexingMode:()=>Om,MapScope:()=>$z,Module:()=>MV,MultiMap:()=>fs,MultiMapScope:()=>E4,OperationCancelled:()=>Fl,ParserWorker:()=>_V,ProfilingTask:()=>t7,Reduction:()=>cy,RefResolving:()=>Am,RegExpUtils:()=>ZC,RootCstNodeImpl:()=>Jy,SimpleCache:()=>S4,StreamImpl:()=>Ko,StreamScope:()=>lv,TextDocument:()=>iv,TreeStreamImpl:()=>Nu,URI:()=>ca,UriTrie:()=>sv,UriUtils:()=>Fi,VALIDATE_EACH_NODE:()=>Pve,ValidationCategory:()=>dA,ValidationRegistry:()=>D4,ValueConverter:()=>zu,WorkspaceCache:()=>uv,assertCondition:()=>o1e,assertUnreachable:()=>Ou,createCompletionParser:()=>Tz,createDefaultCoreModule:()=>Ya,createDefaultSharedCoreModule:()=>ja,createGrammarConfig:()=>AF,createLangiumParser:()=>kz,createParser:()=>g4,delayNextTick:()=>Nz,diagnosticData:()=>Rm,eagerLoad:()=>yTe,getDiagnosticRange:()=>Bve,indentationBuilderDefaultOptions:()=>OV,inject:()=>ii,interruptAndCheck:()=>Ci,isAstNode:()=>Si,isAstNodeDescription:()=>PB,isAstNodeWithComment:()=>Vz,isCompositeCstNode:()=>wc,isIMultiModeLexerDefinition:()=>vV,isJSDoc:()=>wV,isLeafCstNode:()=>Nd,isLinkingError:()=>j0,isMultiReference:()=>Xo,isNamed:()=>Ive,isOperationCancelled:()=>Gu,isReference:()=>oa,isRootCstNode:()=>fT,isTokenTypeArray:()=>XA,isTokenTypeDictionary:()=>yV,loadGrammarFromJson:()=>Hu,parseJSDoc:()=>TV,prepareLangiumParser:()=>kve,setInterruptionPeriod:()=>_ve,startCancelableOperation:()=>lA,stream:()=>Hr,toDiagnosticData:()=>Fve,toDiagnosticSeverity:()=>mA});var tl=O(()=>{"use strict";NV();IV();qz();xTe();kc();bTe();wTe();STe();CTe();ATe();DTe();jr(_a,ln);RTe();NTe();Zo()});function GTe(t){return Oc.isInstance(t,ju.$type)}function VTe(t){return Oc.isInstance(t,i3.$type)}function qTe(t){return Oc.isInstance(t,Bm.$type)}function UTe(t){return Oc.isInstance(t,op.$type)}function WTe(t){return Oc.isInstance(t,Dv.$type)}function HTe(t){return Oc.isInstance(t,Fm.$type)}function YTe(t){return Oc.isInstance(t,$m.$type)}function jTe(t){return Oc.isInstance(t,zm.$type)}function XTe(t){return Oc.isInstance(t,lp.$type)}function KTe(t){return Oc.isInstance(t,a3.$type)}function QTe(t){return Oc.isInstance(t,Gm.$type)}var oat,kt,WV,HV,YV,jV,XV,KV,QV,Wxr,ju,r7,i3,MTe,n7,$V,Bm,i7,Av,Yu,zV,op,r3,Dv,n3,GV,a7,Fm,VV,$m,zm,lp,a3,sp,qV,_v,Pm,Gm,UV,ZTe,Oc,ITe,lat,OTe,cat,PTe,uat,BTe,hat,FTe,fat,$Te,dat,zTe,pat,mat,gat,yat,vat,xat,bat,Tat,qs,ZV,JV,eq,tq,rq,nq,iq,wat,kat,Eat,Sat,cp,rf,ms,Cat,gs=O(()=>{"use strict";tl();tl();tl();tl();oat=Object.defineProperty,kt=o((t,e)=>oat(t,"name",{value:e,configurable:!0}),"__name");(t=>{t.Terminals={ARROW_DIRECTION:/L|R|T|B/,ARROW_GROUP:/\{group\}/,ARROW_INTO:/<|>/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,ID:/[\w]([-\w]*\w)?/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/,ARCH_ICON:/\([\w-:]+\)/,ARCH_TITLE:/\[(?:"([^"\\]|\\.)*"|'([^'\\]|\\.)*'|[\w ]+)\]/}})(WV||(WV={}));(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,INT:/0|[1-9][0-9]*(?!\.)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/,REFERENCE:/\w([-\./\w]*[-\w])?/}})(HV||(HV={}));(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(YV||(YV={}));(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,INT:/0|[1-9][0-9]*(?!\.)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(jV||(jV={}));(t=>{t.Terminals={NUMBER_PIE:/(?:-?[0-9]+\.[0-9]+(?!\.))|(?:-?(0|[1-9][0-9]*)(?!\.))/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(XV||(XV={}));(t=>{t.Terminals={GRATICULE:/circle|polygon/,BOOLEAN:/true|false/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,NUMBER:/(?:[0-9]+\.[0-9]+(?!\.))|(?:0|[1-9][0-9]*(?!\.))/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,ID:/[\w]([-\w]*\w)?/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(KV||(KV={}));(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,TREEMAP_KEYWORD:/treemap-beta|treemap/,CLASS_DEF:/classDef\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\s+([^;\r\n]*))?(?:;)?/,STYLE_SEPARATOR:/:::/,SEPARATOR:/:/,COMMA:/,/,INDENTATION:/[ \t]{1,}/,WS:/[ \t]+/,ML_COMMENT:/\%\%[^\n]*/,NL:/\r?\n/,ID2:/[a-zA-Z_][a-zA-Z0-9_]*/,NUMBER2:/[0-9_\.\,]+/,STRING2:/"[^"]*"|'[^']*'/}})(QV||(QV={}));Wxr={...WV.Terminals,...HV.Terminals,...YV.Terminals,...jV.Terminals,...XV.Terminals,...KV.Terminals,...QV.Terminals},ju={$type:"Architecture",accDescr:"accDescr",accTitle:"accTitle",edges:"edges",groups:"groups",junctions:"junctions",services:"services",title:"title"};o(GTe,"isArchitecture");kt(GTe,"isArchitecture");r7={$type:"Axis",label:"label",name:"name"},i3={$type:"Branch",name:"name",order:"order"};o(VTe,"isBranch");kt(VTe,"isBranch");MTe={$type:"Checkout",branch:"branch"},n7={$type:"CherryPicking",id:"id",parent:"parent",tags:"tags"},$V={$type:"ClassDefStatement",className:"className",styleText:"styleText"},Bm={$type:"Commit",id:"id",message:"message",tags:"tags",type:"type"};o(qTe,"isCommit");kt(qTe,"isCommit");i7={$type:"Curve",entries:"entries",label:"label",name:"name"},Av={$type:"Direction",accDescr:"accDescr",accTitle:"accTitle",dir:"dir",statements:"statements",title:"title"},Yu={$type:"Edge",lhsDir:"lhsDir",lhsGroup:"lhsGroup",lhsId:"lhsId",lhsInto:"lhsInto",rhsDir:"rhsDir",rhsGroup:"rhsGroup",rhsId:"rhsId",rhsInto:"rhsInto",title:"title"},zV={$type:"Entry",axis:"axis",value:"value"},op={$type:"GitGraph",accDescr:"accDescr",accTitle:"accTitle",statements:"statements",title:"title"};o(UTe,"isGitGraph");kt(UTe,"isGitGraph");r3={$type:"Group",icon:"icon",id:"id",in:"in",title:"title"},Dv={$type:"Info",accDescr:"accDescr",accTitle:"accTitle",title:"title"};o(WTe,"isInfo");kt(WTe,"isInfo");n3={$type:"Item",classSelector:"classSelector",name:"name"},GV={$type:"Junction",id:"id",in:"in"},a7={$type:"Leaf",classSelector:"classSelector",name:"name",value:"value"},Fm={$type:"Merge",branch:"branch",id:"id",tags:"tags",type:"type"};o(HTe,"isMerge");kt(HTe,"isMerge");VV={$type:"Option",name:"name",value:"value"},$m={$type:"Packet",accDescr:"accDescr",accTitle:"accTitle",blocks:"blocks",title:"title"};o(YTe,"isPacket");kt(YTe,"isPacket");zm={$type:"PacketBlock",bits:"bits",end:"end",label:"label",start:"start"};o(jTe,"isPacketBlock");kt(jTe,"isPacketBlock");lp={$type:"Pie",accDescr:"accDescr",accTitle:"accTitle",sections:"sections",showData:"showData",title:"title"};o(XTe,"isPie");kt(XTe,"isPie");a3={$type:"PieSection",label:"label",value:"value"};o(KTe,"isPieSection");kt(KTe,"isPieSection");sp={$type:"Radar",accDescr:"accDescr",accTitle:"accTitle",axes:"axes",curves:"curves",options:"options",title:"title"},qV={$type:"Section",classSelector:"classSelector",name:"name"},_v={$type:"Service",icon:"icon",iconText:"iconText",id:"id",in:"in",title:"title"},Pm={$type:"Statement"},Gm={$type:"Treemap",accDescr:"accDescr",accTitle:"accTitle",title:"title",TreemapRows:"TreemapRows"};o(QTe,"isTreemap");kt(QTe,"isTreemap");UV={$type:"TreemapRow",indent:"indent",item:"item"},ZTe=class extends Y0{static{o(this,"MermaidAstReflection")}constructor(){super(...arguments),this.types={Architecture:{name:ju.$type,properties:{accDescr:{name:ju.accDescr},accTitle:{name:ju.accTitle},edges:{name:ju.edges,defaultValue:[]},groups:{name:ju.groups,defaultValue:[]},junctions:{name:ju.junctions,defaultValue:[]},services:{name:ju.services,defaultValue:[]},title:{name:ju.title}},superTypes:[]},Axis:{name:r7.$type,properties:{label:{name:r7.label},name:{name:r7.name}},superTypes:[]},Branch:{name:i3.$type,properties:{name:{name:i3.name},order:{name:i3.order}},superTypes:[Pm.$type]},Checkout:{name:MTe.$type,properties:{branch:{name:MTe.branch}},superTypes:[Pm.$type]},CherryPicking:{name:n7.$type,properties:{id:{name:n7.id},parent:{name:n7.parent},tags:{name:n7.tags,defaultValue:[]}},superTypes:[Pm.$type]},ClassDefStatement:{name:$V.$type,properties:{className:{name:$V.className},styleText:{name:$V.styleText}},superTypes:[]},Commit:{name:Bm.$type,properties:{id:{name:Bm.id},message:{name:Bm.message},tags:{name:Bm.tags,defaultValue:[]},type:{name:Bm.type}},superTypes:[Pm.$type]},Curve:{name:i7.$type,properties:{entries:{name:i7.entries,defaultValue:[]},label:{name:i7.label},name:{name:i7.name}},superTypes:[]},Direction:{name:Av.$type,properties:{accDescr:{name:Av.accDescr},accTitle:{name:Av.accTitle},dir:{name:Av.dir},statements:{name:Av.statements,defaultValue:[]},title:{name:Av.title}},superTypes:[op.$type]},Edge:{name:Yu.$type,properties:{lhsDir:{name:Yu.lhsDir},lhsGroup:{name:Yu.lhsGroup,defaultValue:!1},lhsId:{name:Yu.lhsId},lhsInto:{name:Yu.lhsInto,defaultValue:!1},rhsDir:{name:Yu.rhsDir},rhsGroup:{name:Yu.rhsGroup,defaultValue:!1},rhsId:{name:Yu.rhsId},rhsInto:{name:Yu.rhsInto,defaultValue:!1},title:{name:Yu.title}},superTypes:[]},Entry:{name:zV.$type,properties:{axis:{name:zV.axis,referenceType:r7.$type},value:{name:zV.value}},superTypes:[]},GitGraph:{name:op.$type,properties:{accDescr:{name:op.accDescr},accTitle:{name:op.accTitle},statements:{name:op.statements,defaultValue:[]},title:{name:op.title}},superTypes:[]},Group:{name:r3.$type,properties:{icon:{name:r3.icon},id:{name:r3.id},in:{name:r3.in},title:{name:r3.title}},superTypes:[]},Info:{name:Dv.$type,properties:{accDescr:{name:Dv.accDescr},accTitle:{name:Dv.accTitle},title:{name:Dv.title}},superTypes:[]},Item:{name:n3.$type,properties:{classSelector:{name:n3.classSelector},name:{name:n3.name}},superTypes:[]},Junction:{name:GV.$type,properties:{id:{name:GV.id},in:{name:GV.in}},superTypes:[]},Leaf:{name:a7.$type,properties:{classSelector:{name:a7.classSelector},name:{name:a7.name},value:{name:a7.value}},superTypes:[n3.$type]},Merge:{name:Fm.$type,properties:{branch:{name:Fm.branch},id:{name:Fm.id},tags:{name:Fm.tags,defaultValue:[]},type:{name:Fm.type}},superTypes:[Pm.$type]},Option:{name:VV.$type,properties:{name:{name:VV.name},value:{name:VV.value,defaultValue:!1}},superTypes:[]},Packet:{name:$m.$type,properties:{accDescr:{name:$m.accDescr},accTitle:{name:$m.accTitle},blocks:{name:$m.blocks,defaultValue:[]},title:{name:$m.title}},superTypes:[]},PacketBlock:{name:zm.$type,properties:{bits:{name:zm.bits},end:{name:zm.end},label:{name:zm.label},start:{name:zm.start}},superTypes:[]},Pie:{name:lp.$type,properties:{accDescr:{name:lp.accDescr},accTitle:{name:lp.accTitle},sections:{name:lp.sections,defaultValue:[]},showData:{name:lp.showData,defaultValue:!1},title:{name:lp.title}},superTypes:[]},PieSection:{name:a3.$type,properties:{label:{name:a3.label},value:{name:a3.value}},superTypes:[]},Radar:{name:sp.$type,properties:{accDescr:{name:sp.accDescr},accTitle:{name:sp.accTitle},axes:{name:sp.axes,defaultValue:[]},curves:{name:sp.curves,defaultValue:[]},options:{name:sp.options,defaultValue:[]},title:{name:sp.title}},superTypes:[]},Section:{name:qV.$type,properties:{classSelector:{name:qV.classSelector},name:{name:qV.name}},superTypes:[n3.$type]},Service:{name:_v.$type,properties:{icon:{name:_v.icon},iconText:{name:_v.iconText},id:{name:_v.id},in:{name:_v.in},title:{name:_v.title}},superTypes:[]},Statement:{name:Pm.$type,properties:{},superTypes:[]},Treemap:{name:Gm.$type,properties:{accDescr:{name:Gm.accDescr},accTitle:{name:Gm.accTitle},title:{name:Gm.title},TreemapRows:{name:Gm.TreemapRows,defaultValue:[]}},superTypes:[]},TreemapRow:{name:UV.$type,properties:{indent:{name:UV.indent},item:{name:UV.item}},superTypes:[]}}}static{kt(this,"MermaidAstReflection")}},Oc=new ZTe,lat=kt(()=>ITe??(ITe=Hu(`{"$type":"Grammar","isDeclared":true,"name":"ArchitectureGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"},"parenthesized":false}],"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"},"parenthesized":false}],"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[(?:\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'|[\\\\w ]+)\\\\]/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[],"types":[]}`)),"ArchitectureGrammarGrammar"),cat=kt(()=>OTe??(OTe=Hu(`{"$type":"Grammar","isDeclared":true,"name":"GitGraphGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[],"types":[]}`)),"GitGraphGrammarGrammar"),uat=kt(()=>PTe??(PTe=Hu(`{"$type":"Grammar","isDeclared":true,"name":"InfoGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"InfoGrammarGrammar"),hat=kt(()=>BTe??(BTe=Hu(`{"$type":"Grammar","isDeclared":true,"name":"PacketGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"PacketGrammarGrammar"),fat=kt(()=>FTe??(FTe=Hu(`{"$type":"Grammar","isDeclared":true,"name":"PieGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"FLOAT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?(0|[1-9][0-9]*)(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@2"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@3"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@11"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@12"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"PieGrammarGrammar"),dat=kt(()=>$Te??($Te=Hu(`{"$type":"Grammar","isDeclared":true,"name":"RadarGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}},"isMulti":false}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"types":[]}`)),"RadarGrammarGrammar"),pat=kt(()=>zTe??(zTe=Hu(`{"$type":"Grammar","isDeclared":true,"name":"TreemapGrammar","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"imports":[],"types":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammarGrammar"),mat={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},gat={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},yat={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},vat={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},xat={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},bat={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Tat={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},qs={AstReflection:kt(()=>new ZTe,"AstReflection")},ZV={Grammar:kt(()=>lat(),"Grammar"),LanguageMetaData:kt(()=>mat,"LanguageMetaData"),parser:{}},JV={Grammar:kt(()=>cat(),"Grammar"),LanguageMetaData:kt(()=>gat,"LanguageMetaData"),parser:{}},eq={Grammar:kt(()=>uat(),"Grammar"),LanguageMetaData:kt(()=>yat,"LanguageMetaData"),parser:{}},tq={Grammar:kt(()=>hat(),"Grammar"),LanguageMetaData:kt(()=>vat,"LanguageMetaData"),parser:{}},rq={Grammar:kt(()=>fat(),"Grammar"),LanguageMetaData:kt(()=>xat,"LanguageMetaData"),parser:{}},nq={Grammar:kt(()=>dat(),"Grammar"),LanguageMetaData:kt(()=>bat,"LanguageMetaData"),parser:{}},iq={Grammar:kt(()=>pat(),"Grammar"),LanguageMetaData:kt(()=>Tat,"LanguageMetaData"),parser:{}},wat=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,kat=/accTitle[\t ]*:([^\n\r]*)/,Eat=/title([\t ][^\n\r]*|)/,Sat={ACC_DESCR:wat,ACC_TITLE:kat,TITLE:Eat},cp=class extends Sm{static{o(this,"AbstractMermaidValueConverter")}static{kt(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=Sat[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` -`)}}},rf=class extends cp{static{o(this,"CommonValueConverter")}static{kt(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},ms=class extends ef{static{o(this,"AbstractMermaidTokenBuilder")}static{kt(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},Cat=class extends ms{static{o(this,"CommonTokenBuilder")}static{kt(this,"CommonTokenBuilder")}}});function o7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),JV,s7);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var Aat,s7,aq=O(()=>{"use strict";gs();tl();Aat=class extends ms{static{o(this,"GitGraphTokenBuilder")}static{kt(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},s7={parser:{TokenBuilder:kt(()=>new Aat,"TokenBuilder"),ValueConverter:kt(()=>new rf,"ValueConverter")}};o(o7,"createGitGraphServices");kt(o7,"createGitGraphServices")});function c7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),eq,l7);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var _at,l7,sq=O(()=>{"use strict";gs();tl();_at=class extends ms{static{o(this,"InfoTokenBuilder")}static{kt(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},l7={parser:{TokenBuilder:kt(()=>new _at,"TokenBuilder"),ValueConverter:kt(()=>new rf,"ValueConverter")}};o(c7,"createInfoServices");kt(c7,"createInfoServices")});function h7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),tq,u7);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var Dat,u7,oq=O(()=>{"use strict";gs();tl();Dat=class extends ms{static{o(this,"PacketTokenBuilder")}static{kt(this,"PacketTokenBuilder")}constructor(){super(["packet"])}},u7={parser:{TokenBuilder:kt(()=>new Dat,"TokenBuilder"),ValueConverter:kt(()=>new rf,"ValueConverter")}};o(h7,"createPacketServices");kt(h7,"createPacketServices")});function d7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),rq,f7);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var Rat,Lat,f7,lq=O(()=>{"use strict";gs();tl();Rat=class extends ms{static{o(this,"PieTokenBuilder")}static{kt(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},Lat=class extends cp{static{o(this,"PieValueConverter")}static{kt(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},f7={parser:{TokenBuilder:kt(()=>new Rat,"TokenBuilder"),ValueConverter:kt(()=>new Lat,"ValueConverter")}};o(d7,"createPieServices");kt(d7,"createPieServices")});function m7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),ZV,p7);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var Nat,Mat,p7,cq=O(()=>{"use strict";gs();tl();Nat=class extends ms{static{o(this,"ArchitectureTokenBuilder")}static{kt(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},Mat=class extends cp{static{o(this,"ArchitectureValueConverter")}static{kt(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE"){let n=e.replace(/^\[|]$/g,"").trim();return(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1),n=n.replace(/\\"/g,'"').replace(/\\'/g,"'")),n.trim()}}},p7={parser:{TokenBuilder:kt(()=>new Nat,"TokenBuilder"),ValueConverter:kt(()=>new Mat,"ValueConverter")}};o(m7,"createArchitectureServices");kt(m7,"createArchitectureServices")});function y7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),nq,g7);return e.ServiceRegistry.register(r),{shared:e,Radar:r}}var Iat,g7,uq=O(()=>{"use strict";gs();tl();Iat=class extends ms{static{o(this,"RadarTokenBuilder")}static{kt(this,"RadarTokenBuilder")}constructor(){super(["radar-beta"])}},g7={parser:{TokenBuilder:kt(()=>new Iat,"TokenBuilder"),ValueConverter:kt(()=>new rf,"ValueConverter")}};o(y7,"createRadarServices");kt(y7,"createRadarServices")});function JTe(t){let e=t.validation.TreemapValidator,r=t.validation.ValidationRegistry;if(r){let n={Treemap:e.checkSingleRoot.bind(e)};r.register(n,e)}}function x7(t=Xa){let e=ii(ja(t),qs),r=ii(Ya({shared:e}),iq,v7);return e.ServiceRegistry.register(r),JTe(r),{shared:e,Treemap:r}}var Oat,Pat,Bat,Fat,v7,hq=O(()=>{"use strict";gs();tl();Oat=class extends ms{static{o(this,"TreemapTokenBuilder")}static{kt(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},Pat=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,Bat=class extends cp{static{o(this,"TreemapValueConverter")}static{kt(this,"TreemapValueConverter")}runCustomConverter(t,e,r){if(t.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(t.name==="SEPARATOR")return e.substring(1,e.length-1);if(t.name==="STRING2")return e.substring(1,e.length-1);if(t.name==="INDENTATION")return e.length;if(t.name==="ClassDef"){if(typeof e!="string")return e;let n=Pat.exec(e);if(n)return{$type:"ClassDefStatement",className:n[1],styleText:n[2]||void 0}}}};o(JTe,"registerValidationChecks");kt(JTe,"registerValidationChecks");Fat=class{static{o(this,"TreemapValidator")}static{kt(this,"TreemapValidator")}checkSingleRoot(t,e){let r;for(let n of t.TreemapRows)n.item&&(r===void 0&&n.indent===void 0?r=0:n.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}):r!==void 0&&r>=parseInt(n.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}))}},v7={parser:{TokenBuilder:kt(()=>new Oat,"TokenBuilder"),ValueConverter:kt(()=>new Bat,"ValueConverter")},validation:{TreemapValidator:kt(()=>new Fat,"TreemapValidator")}};o(x7,"createTreemapServices");kt(x7,"createTreemapServices")});var e4e={};vr(e4e,{InfoModule:()=>l7,createInfoServices:()=>c7});var t4e=O(()=>{"use strict";sq();gs()});var r4e={};vr(r4e,{PacketModule:()=>u7,createPacketServices:()=>h7});var n4e=O(()=>{"use strict";oq();gs()});var i4e={};vr(i4e,{PieModule:()=>f7,createPieServices:()=>d7});var a4e=O(()=>{"use strict";lq();gs()});var s4e={};vr(s4e,{ArchitectureModule:()=>p7,createArchitectureServices:()=>m7});var o4e=O(()=>{"use strict";cq();gs()});var l4e={};vr(l4e,{GitGraphModule:()=>s7,createGitGraphServices:()=>o7});var c4e=O(()=>{"use strict";aq();gs()});var u4e={};vr(u4e,{RadarModule:()=>g7,createRadarServices:()=>y7});var h4e=O(()=>{"use strict";uq();gs()});var f4e={};vr(f4e,{TreemapModule:()=>v7,createTreemapServices:()=>x7});var d4e=O(()=>{"use strict";hq();gs()});async function Us(t,e){let r=$at[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);nf[t]||await r();let i=nf[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new zat(i);return i.value}var nf,$at,zat,up=O(()=>{"use strict";aq();sq();oq();lq();cq();uq();hq();gs();nf={},$at={info:kt(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(t4e(),e4e)),e=t().Info.parser.LangiumParser;nf.info=e},"info"),packet:kt(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(n4e(),r4e)),e=t().Packet.parser.LangiumParser;nf.packet=e},"packet"),pie:kt(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(a4e(),i4e)),e=t().Pie.parser.LangiumParser;nf.pie=e},"pie"),architecture:kt(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(o4e(),s4e)),e=t().Architecture.parser.LangiumParser;nf.architecture=e},"architecture"),gitGraph:kt(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(c4e(),l4e)),e=t().GitGraph.parser.LangiumParser;nf.gitGraph=e},"gitGraph"),radar:kt(async()=>{let{createRadarServices:t}=await Promise.resolve().then(()=>(h4e(),u4e)),e=t().Radar.parser.LangiumParser;nf.radar=e},"radar"),treemap:kt(async()=>{let{createTreemapServices:t}=await Promise.resolve().then(()=>(d4e(),f4e)),e=t().Treemap.parser.LangiumParser;nf.treemap=e},"treemap")};o(Us,"parse");kt(Us,"parse");zat=class extends Error{static{o(this,"MermaidParseError")}constructor(t){let e=t.lexerErrors.map(n=>{let i=n.line!==void 0&&!isNaN(n.line)?n.line:"?",a=n.column!==void 0&&!isNaN(n.column)?n.column:"?";return`Lexer error on line ${i}, column ${a}: ${n.message}`}).join(` -`),r=t.parserErrors.map(n=>{let i=n.token.startLine!==void 0&&!isNaN(n.token.startLine)?n.token.startLine:"?",a=n.token.startColumn!==void 0&&!isNaN(n.token.startColumn)?n.token.startColumn:"?";return`Parse error on line ${i}, column ${a}: ${n.message}`}).join(` -`);super(`Parsing failed: ${e} ${r}`),this.result=t}static{kt(this,"MermaidParseError")}}});function ql(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var Vm=O(()=>{"use strict";o(ql,"populateCommonDb")});var gn,b7=O(()=>{"use strict";gn={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4}});var Rv,fq=O(()=>{"use strict";Rv=class{constructor(e){this.init=e;this.records=this.init()}static{o(this,"ImperativeState")}reset(){this.records=this.init()}}});function dq(){return NN({length:7})}function Vat(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function p4e(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function g4e(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in Mt.records.branches)Mt.records.branches.get(i)===e.id&&n.push(i);if(K.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=Mt.records.commits.get(e.parents[0]);p4e(t,e,i),e.parents[1]&&t.push(Mt.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=Mt.records.commits.get(e.parents[0]);p4e(t,e,i)}}t=Vat(t,i=>i.id),g4e(t)}var Gat,qm,Mt,qat,Uat,Wat,Hat,Yat,jat,Xat,m4e,Kat,Qat,Zat,Jat,est,y4e,tst,rst,nst,T7,pq=O(()=>{"use strict";xt();ar();$r();Ur();si();b7();fq();La();Gat=gr.gitGraph,qm=o(()=>Pn({...Gat,...Zt().gitGraph}),"getConfig"),Mt=new Rv(()=>{let t=qm(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});o(dq,"getID");o(Vat,"uniqBy");qat=o(function(t){Mt.records.direction=t},"setDirection"),Uat=o(function(t){K.debug("options str",t),t=t?.trim(),t=t||"{}";try{Mt.records.options=JSON.parse(t)}catch(e){K.error("error while parsing gitGraph options",e.message)}},"setOptions"),Wat=o(function(){return Mt.records.options},"getOptions"),Hat=o(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;K.info("commit",e,r,n,i),K.debug("Entering commit:",e,r,n,i);let a=qm();r=st.sanitizeText(r,a),e=st.sanitizeText(e,a),i=i?.map(l=>st.sanitizeText(l,a));let s={id:r||Mt.records.seq+"-"+dq(),message:e,seq:Mt.records.seq++,type:n??gn.NORMAL,tags:i??[],parents:Mt.records.head==null?[]:[Mt.records.head.id],branch:Mt.records.currBranch};Mt.records.head=s,K.info("main branch",a.mainBranchName),Mt.records.commits.has(s.id)&&K.warn(`Commit ID ${s.id} already exists`),Mt.records.commits.set(s.id,s),Mt.records.branches.set(Mt.records.currBranch,s.id),K.debug("in pushCommit "+s.id)},"commit"),Yat=o(function(t){let e=t.name,r=t.order;if(e=st.sanitizeText(e,qm()),Mt.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);Mt.records.branches.set(e,Mt.records.head!=null?Mt.records.head.id:null),Mt.records.branchConfig.set(e,{name:e,order:r}),m4e(e),K.debug("in createBranch")},"branch"),jat=o(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=qm();e=st.sanitizeText(e,a),r&&(r=st.sanitizeText(r,a));let s=Mt.records.branches.get(Mt.records.currBranch),l=Mt.records.branches.get(e),u=s?Mt.records.commits.get(s):void 0,h=l?Mt.records.commits.get(l):void 0;if(u&&h&&u.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(Mt.records.currBranch===e){let p=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(u===void 0||!u){let p=new Error(`Incorrect usage of "merge". Current branch (${Mt.records.currBranch})has no commits`);throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},p}if(!Mt.records.branches.has(e)){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},p}if(h===void 0||!h){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},p}if(u===h){let p=new Error('Incorrect usage of "merge". Both branches have same head');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(r&&Mt.records.commits.has(r)){let p=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom id");throw p.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},p}let f=l||"",d={id:r||`${Mt.records.seq}-${dq()}`,message:`merged branch ${e} into ${Mt.records.currBranch}`,seq:Mt.records.seq++,parents:Mt.records.head==null?[]:[Mt.records.head.id,f],branch:Mt.records.currBranch,type:gn.MERGE,customType:n,customId:!!r,tags:i??[]};Mt.records.head=d,Mt.records.commits.set(d.id,d),Mt.records.branches.set(Mt.records.currBranch,d.id),K.debug(Mt.records.branches),K.debug("in mergeBranch")},"merge"),Xat=o(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;K.debug("Entering cherryPick:",e,r,n);let a=qm();if(e=st.sanitizeText(e,a),r=st.sanitizeText(r,a),n=n?.map(u=>st.sanitizeText(u,a)),i=st.sanitizeText(i,a),!e||!Mt.records.commits.has(e)){let u=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw u.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},u}let s=Mt.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let l=s.branch;if(s.type===gn.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!Mt.records.commits.has(r)){if(l===Mt.records.currBranch){let d=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let u=Mt.records.branches.get(Mt.records.currBranch);if(u===void 0||!u){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Mt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let h=Mt.records.commits.get(u);if(h===void 0||!h){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Mt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let f={id:Mt.records.seq+"-"+dq(),message:`cherry-picked ${s?.message} into ${Mt.records.currBranch}`,seq:Mt.records.seq++,parents:Mt.records.head==null?[]:[Mt.records.head.id,s.id],branch:Mt.records.currBranch,type:gn.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===gn.MERGE?`|parent:${i}`:""}`]};Mt.records.head=f,Mt.records.commits.set(f.id,f),Mt.records.branches.set(Mt.records.currBranch,f.id),K.debug(Mt.records.branches),K.debug("in cherryPick")}},"cherryPick"),m4e=o(function(t){if(t=st.sanitizeText(t,qm()),Mt.records.branches.has(t)){Mt.records.currBranch=t;let e=Mt.records.branches.get(Mt.records.currBranch);e===void 0||!e?Mt.records.head=null:Mt.records.head=Mt.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");o(p4e,"upsert");o(g4e,"prettyPrintCommitHistory");Kat=o(function(){K.debug(Mt.records.commits);let t=y4e()[0];g4e([t])},"prettyPrint"),Qat=o(function(){Mt.reset(),_r()},"clear"),Zat=o(function(){return[...Mt.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),Jat=o(function(){return Mt.records.branches},"getBranches"),est=o(function(){return Mt.records.commits},"getCommits"),y4e=o(function(){let t=[...Mt.records.commits.values()];return t.forEach(function(e){K.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),tst=o(function(){return Mt.records.currBranch},"getCurrentBranch"),rst=o(function(){return Mt.records.direction},"getDirection"),nst=o(function(){return Mt.records.head},"getHead"),T7={commitType:gn,getConfig:qm,setDirection:qat,setOptions:Uat,getOptions:Wat,commit:Hat,branch:Yat,merge:jat,cherryPick:Xat,checkout:m4e,prettyPrint:Kat,clear:Qat,getBranchesAsObjArray:Zat,getBranches:Jat,getCommits:est,getCommitsArray:y4e,getCurrentBranch:tst,getDirection:rst,getHead:nst,setAccTitle:Lr,getAccTitle:Or,getAccDescription:Br,setAccDescription:Pr,setDiagramTitle:zr,getDiagramTitle:Fr}});var ist,ast,sst,ost,lst,cst,ust,v4e,x4e=O(()=>{"use strict";up();xt();Vm();pq();b7();ist=o((t,e)=>{ql(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)ast(r,e)},"populate"),ast=o((t,e)=>{let n={Commit:o(i=>e.commit(sst(i)),"Commit"),Branch:o(i=>e.branch(ost(i)),"Branch"),Merge:o(i=>e.merge(lst(i)),"Merge"),Checkout:o(i=>e.checkout(cst(i)),"Checkout"),CherryPicking:o(i=>e.cherryPick(ust(i)),"CherryPicking")}[t.$type];n?n(t):K.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),sst=o(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?gn[t.type]:gn.NORMAL,tags:t.tags??void 0}),"parseCommit"),ost=o(t=>({name:t.name,order:t.order??0}),"parseBranch"),lst=o(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?gn[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),cst=o(t=>t.branch,"parseCheckout"),ust=o(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),v4e={parse:o(async t=>{let e=await Us("gitGraph",t);K.debug(e),ist(e,T7)},"parse")}});var fp,dp,Xu,af,Um,Do,Ro,w7,s3,k7,hp,en,hst,T4e,w4e,fst,dst,pst,mst,gst,yst,vst,xst,bst,Tst,wst,kst,b4e,Est,o3,Sst,Cst,Ast,_st,Dst,k4e,E4e=O(()=>{"use strict";Ar();jt();xt();ar();b7();fp=10,dp=40,Xu=4,af=2,Um=8,Do=new Map,Ro=new Map,w7=30,s3=new Map,k7=[],hp=0,en="LR",hst=o(()=>{Do.clear(),Ro.clear(),s3.clear(),hp=0,k7=[],en="LR"},"clear"),T4e=o(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),w4e=o(t=>{let e,r,n;return en==="BT"?(r=o((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=o((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=en==="TB"||en=="BT"?Ro.get(i)?.y:Ro.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),fst=o(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Ro.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),dst=o((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let l=e.get(s);if(!l)throw new Error(`Commit not found for key ${s}`);l.parents.length?(n=mst(l),i=Math.max(n,i)):a.push(l),gst(l,n)}),n=i,a.forEach(s=>{yst(s,n,r)}),t.forEach(s=>{let l=e.get(s);if(l?.parents.length){let u=fst(l.parents);n=Ro.get(u).y-dp,n<=i&&(i=n);let h=Do.get(l.branch).pos,f=n-fp;Ro.set(l.id,{x:h,y:f})}})},"setParallelBTPos"),pst=o(t=>{let e=w4e(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Ro.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),mst=o(t=>pst(t)+dp,"calculateCommitPosition"),gst=o((t,e)=>{let r=Do.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+fp;return Ro.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),yst=o((t,e,r)=>{let n=Do.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Ro.set(t.id,{x:a,y:i})},"setRootPosition"),vst=o((t,e,r,n,i,a)=>{if(a===gn.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%Um} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%Um} ${n}-inner`);else if(a===gn.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===gn.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%Um}`),a===gn.MERGE){let l=t.append("circle");l.attr("cx",r.x),l.attr("cy",r.y),l.attr("r",6),l.attr("class",`commit ${n} ${e.id} commit${i%Um}`)}a===gn.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%Um}`)}},"drawCommitBullet"),xst=o((t,e,r,n,i)=>{if(e.type!==gn.CHERRY_PICK&&(e.customId&&e.type===gn.MERGE||e.type!==gn.MERGE)&&i.showCommitLabel){let a=t.append("g"),s=a.insert("rect").attr("class","commit-label-bkg"),l=a.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),u=l.node()?.getBBox();if(u&&(s.attr("x",r.posWithOffset-u.width/2-af).attr("y",r.y+13.5).attr("width",u.width+2*af).attr("height",u.height+2*af),en==="TB"||en==="BT"?(s.attr("x",r.x-(u.width+4*Xu+5)).attr("y",r.y-12),l.attr("x",r.x-(u.width+4*Xu)).attr("y",r.y+u.height-12)):l.attr("x",r.posWithOffset-u.width/2),i.rotateCommitLabel))if(en==="TB"||en==="BT")l.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),s.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let h=-7.5-(u.width+10)/25*9.5,f=10+u.width/25*8.5;a.attr("transform","translate("+h+", "+f+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),bst=o((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,l=[];for(let u of e.tags.reverse()){let h=t.insert("polygon"),f=t.append("circle"),d=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(u),p=d.node()?.getBBox();if(!p)throw new Error("Tag bbox not found");a=Math.max(a,p.width),s=Math.max(s,p.height),d.attr("x",r.posWithOffset-p.width/2),l.push({tag:d,hole:f,rect:h,yOffset:i}),i+=20}for(let{tag:u,hole:h,rect:f,yOffset:d}of l){let p=s/2,m=r.y-19.2-d;if(f.attr("class","tag-label-bkg").attr("points",` - ${n-a/2-Xu/2},${m+af} - ${n-a/2-Xu/2},${m-af} - ${r.posWithOffset-a/2-Xu},${m-p-af} - ${r.posWithOffset+a/2+Xu},${m-p-af} - ${r.posWithOffset+a/2+Xu},${m+p+af} - ${r.posWithOffset-a/2-Xu},${m+p+af}`),h.attr("cy",m).attr("cx",n-a/2+Xu/2).attr("r",1.5).attr("class","tag-hole"),en==="TB"||en==="BT"){let g=n+d;f.attr("class","tag-label-bkg").attr("points",` - ${r.x},${g+2} - ${r.x},${g-2} - ${r.x+fp},${g-p-2} - ${r.x+fp+a+4},${g-p-2} - ${r.x+fp+a+4},${g+p+2} - ${r.x+fp},${g+p+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),h.attr("cx",r.x+Xu/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),Tst=o(t=>{switch(t.customType??t.type){case gn.NORMAL:return"commit-normal";case gn.REVERSE:return"commit-reverse";case gn.HIGHLIGHT:return"commit-highlight";case gn.MERGE:return"commit-merge";case gn.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),wst=o((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=w4e(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+dp:e==="BT"?(n.get(t.id)??i).y-dp:s.x+dp}}else return e==="TB"?w7:e==="BT"?(n.get(t.id)??i).y-dp:0;return 0},"calculatePosition"),kst=o((t,e,r)=>{let n=en==="BT"&&r?e:e+fp,i=en==="TB"||en==="BT"?n:Do.get(t.branch)?.pos,a=en==="TB"||en==="BT"?Do.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),b4e=o((t,e,r,n)=>{let i=t.append("g").attr("class","commit-bullets"),a=t.append("g").attr("class","commit-labels"),s=en==="TB"||en==="BT"?w7:0,l=[...e.keys()],u=n.parallelCommits??!1,h=o((d,p)=>{let m=e.get(d)?.seq,g=e.get(p)?.seq;return m!==void 0&&g!==void 0?m-g:0},"sortKeys"),f=l.sort(h);en==="BT"&&(u&&dst(f,e,s),f=f.reverse()),f.forEach(d=>{let p=e.get(d);if(!p)throw new Error(`Commit not found for key ${d}`);u&&(s=wst(p,en,s,Ro));let m=kst(p,s,u);if(r){let g=Tst(p),y=p.customType??p.type,v=Do.get(p.branch)?.index??0;vst(i,p,m,g,v,y),xst(a,p,m,s,n),bst(a,p,m,s)}en==="TB"||en==="BT"?Ro.set(p.id,{x:m.x,y:m.posWithOffset}):Ro.set(p.id,{x:m.posWithOffset,y:m.y}),s=en==="BT"&&u?s+dp:s+dp+fp,s>hp&&(hp=s)})},"drawCommits"),Est=o((t,e,r,n,i)=>{let s=(en==="TB"||en==="BT"?r.xh.branch===s,"isOnBranchToGetCurve"),u=o(h=>h.seq>t.seq&&h.sequ(h)&&l(h))},"shouldRerouteArrow"),o3=o((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(k7.every(s=>Math.abs(s-n)>=10))return k7.push(n),n;let a=Math.abs(t-e);return o3(t,e-a/5,r+1)},"findLane"),Sst=o((t,e,r,n)=>{let i=Ro.get(e.id),a=Ro.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=Est(e,r,i,a,n),l="",u="",h=0,f=0,d=Do.get(r.branch)?.index;r.type===gn.MERGE&&e.id!==r.parents[0]&&(d=Do.get(e.branch)?.index);let p;if(s){l="A 10 10, 0, 0, 0,",u="A 10 10, 0, 0, 1,",h=10,f=10;let m=i.ya.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===gn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y-h} ${u} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${l} ${a.x} ${i.y+f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):en==="BT"?(i.xa.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===gn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${l} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${u} ${a.x} ${i.y-f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===gn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${u} ${i.x+f} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(p===void 0)throw new Error("Line definition not found");t.append("path").attr("d",p).attr("class","arrow arrow"+d%Um)},"drawArrow"),Cst=o((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{Sst(r,e.get(a),i,e)})})},"drawArrows"),Ast=o((t,e,r)=>{let n=t.append("g");e.forEach((i,a)=>{let s=a%Um,l=Do.get(i.name)?.pos;if(l===void 0)throw new Error(`Position not found for branch ${i.name}`);let u=n.append("line");u.attr("x1",0),u.attr("y1",l),u.attr("x2",hp),u.attr("y2",l),u.attr("class","branch branch"+s),en==="TB"?(u.attr("y1",w7),u.attr("x1",l),u.attr("y2",hp),u.attr("x2",l)):en==="BT"&&(u.attr("y1",hp),u.attr("x1",l),u.attr("y2",w7),u.attr("x2",l)),k7.push(l);let h=i.name,f=T4e(h),d=n.insert("rect"),m=n.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+s);m.node().appendChild(f);let g=f.getBBox();d.attr("class","branchLabelBkg label"+s).attr("rx",4).attr("ry",4).attr("x",-g.width-4-(r.rotateCommitLabel===!0?30:0)).attr("y",-g.height/2+8).attr("width",g.width+18).attr("height",g.height+4),m.attr("transform","translate("+(-g.width-14-(r.rotateCommitLabel===!0?30:0))+", "+(l-g.height/2-1)+")"),en==="TB"?(d.attr("x",l-g.width/2-10).attr("y",0),m.attr("transform","translate("+(l-g.width/2-5)+", 0)")):en==="BT"?(d.attr("x",l-g.width/2-10).attr("y",hp),m.attr("transform","translate("+(l-g.width/2-5)+", "+hp+")")):d.attr("transform","translate(-19, "+(l-g.height/2)+")")})},"drawBranches"),_st=o(function(t,e,r,n,i){return Do.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(en==="TB"||en==="BT"?n.width/2:0),e},"setBranchPosition"),Dst=o(function(t,e,r,n){hst(),K.debug("in gitgraph renderer",t+` -`,"id:",e,r);let i=n.db;if(!i.getConfig){K.error("getConfig method is not available on db");return}let a=i.getConfig(),s=a.rotateCommitLabel??!1;s3=i.getCommits();let l=i.getBranchesAsObjArray();en=i.getDirection();let u=je(`[id="${e}"]`),h=0;l.forEach((f,d)=>{let p=T4e(f.name),m=u.append("g"),g=m.insert("g").attr("class","branchLabel"),y=g.insert("g").attr("class","label branch-label");y.node()?.appendChild(p);let v=p.getBBox();h=_st(f.name,h,d,v,s),y.remove(),g.remove(),m.remove()}),b4e(u,s3,!1,a),a.showBranches&&Ast(u,l,a),Cst(u,s3),b4e(u,s3,!0,a),Xt.insertTitle(u,"gitTitleText",a.titleTopMargin??0,i.getDiagramTitle()),_D(void 0,u,a.diagramPadding,a.useMaxWidth)},"draw"),k4e={draw:Dst}});var Rst,S4e,C4e=O(()=>{"use strict";Rst=o(t=>` - .commit-id, - .commit-msg, - .branch-label { - fill: lightgrey; - color: lightgrey; - font-family: 'trebuchet ms', verdana, arial, sans-serif; - font-family: var(--mermaid-font-family); - } - ${[0,1,2,3,4,5,6,7].map(e=>` - .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } - .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } - .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } - .label${e} { fill: ${t["git"+e]}; } - .arrow${e} { stroke: ${t["git"+e]}; } - `).join(` -`)} - - .branch { - stroke-width: 1; - stroke: ${t.lineColor}; - stroke-dasharray: 2; - } - .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} - .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } - .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} - .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } - .tag-hole { fill: ${t.textColor}; } - - .commit-merge { - stroke: ${t.primaryColor}; - fill: ${t.primaryColor}; - } - .commit-reverse { - stroke: ${t.primaryColor}; - fill: ${t.primaryColor}; - stroke-width: 3; - } - .commit-highlight-outer { - } - .commit-highlight-inner { - stroke: ${t.primaryColor}; - fill: ${t.primaryColor}; - } - - .arrow { stroke-width: 8; stroke-linecap: round; fill: none} - .gitTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; - } -`,"getStyles"),S4e=Rst});var A4e={};vr(A4e,{diagram:()=>Lst});var Lst,_4e=O(()=>{"use strict";x4e();pq();E4e();C4e();Lst={parser:v4e,db:T7,renderer:k4e,styles:S4e}});var mq,L4e,N4e=O(()=>{"use strict";mq=(function(){var t=o(function(_,D,M,R){for(M=M||{},R=_.length;R--;M[_[R]]=D);return M},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],l=[1,31],u=[1,32],h=[1,33],f=[1,34],d=[1,9],p=[1,10],m=[1,11],g=[1,12],y=[1,13],v=[1,14],x=[1,15],b=[1,16],T=[1,19],E=[1,20],w=[1,21],k=[1,22],S=[1,23],A=[1,25],L=[1,35],I={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:o(function(D,M,R,P,B,F,G){var $=F.length-1;switch(B){case 1:return F[$-1];case 2:this.$=[];break;case 3:F[$-1].push(F[$]),this.$=F[$-1];break;case 4:case 5:this.$=F[$];break;case 6:case 7:this.$=[];break;case 8:P.setWeekday("monday");break;case 9:P.setWeekday("tuesday");break;case 10:P.setWeekday("wednesday");break;case 11:P.setWeekday("thursday");break;case 12:P.setWeekday("friday");break;case 13:P.setWeekday("saturday");break;case 14:P.setWeekday("sunday");break;case 15:P.setWeekend("friday");break;case 16:P.setWeekend("saturday");break;case 17:P.setDateFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 18:P.enableInclusiveEndDates(),this.$=F[$].substr(18);break;case 19:P.TopAxis(),this.$=F[$].substr(8);break;case 20:P.setAxisFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 21:P.setTickInterval(F[$].substr(13)),this.$=F[$].substr(13);break;case 22:P.setExcludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 23:P.setIncludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 24:P.setTodayMarker(F[$].substr(12)),this.$=F[$].substr(12);break;case 27:P.setDiagramTitle(F[$].substr(6)),this.$=F[$].substr(6);break;case 28:this.$=F[$].trim(),P.setAccTitle(this.$);break;case 29:case 30:this.$=F[$].trim(),P.setAccDescription(this.$);break;case 31:P.addSection(F[$].substr(8)),this.$=F[$].substr(8);break;case 33:P.addTask(F[$-1],F[$]),this.$="task";break;case 34:this.$=F[$-1],P.setClickEvent(F[$-1],F[$],null);break;case 35:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],F[$]);break;case 36:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],null),P.setLink(F[$-2],F[$]);break;case 37:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-2],F[$-1]),P.setLink(F[$-3],F[$]);break;case 38:this.$=F[$-2],P.setClickEvent(F[$-2],F[$],null),P.setLink(F[$-2],F[$-1]);break;case 39:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-1],F[$]),P.setLink(F[$-3],F[$-2]);break;case 40:this.$=F[$-1],P.setLink(F[$-1],F[$]);break;case 41:case 47:this.$=F[$-1]+" "+F[$];break;case 42:case 43:case 45:this.$=F[$-2]+" "+F[$-1]+" "+F[$];break;case 44:case 46:this.$=F[$-3]+" "+F[$-2]+" "+F[$-1]+" "+F[$];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:E,33:w,35:k,36:S,37:24,38:A,40:L},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:E,33:w,35:k,36:S,37:24,38:A,40:L},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:o(function(D,M){if(M.recoverable)this.trace(D);else{var R=new Error(D);throw R.hash=M,R}},"parseError"),parse:o(function(D){var M=this,R=[0],P=[],B=[null],F=[],G=this.table,$="",V=0,X=0,Q=0,H=2,ie=1,Y=F.slice.call(arguments,1),le=Object.create(this.lexer),ee={yy:{}};for(var J in this.yy)Object.prototype.hasOwnProperty.call(this.yy,J)&&(ee.yy[J]=this.yy[J]);le.setInput(D,ee.yy),ee.yy.lexer=le,ee.yy.parser=this,typeof le.yylloc>"u"&&(le.yylloc={});var te=le.yylloc;F.push(te);var Z=le.options&&le.options.ranges;typeof ee.yy.parseError=="function"?this.parseError=ee.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xe(Ne){R.length=R.length-2*Ne,B.length=B.length-Ne,F.length=F.length-Ne}o(xe,"popStack");function de(){var Ne;return Ne=P.pop()||le.lex()||ie,typeof Ne!="number"&&(Ne instanceof Array&&(P=Ne,Ne=P.pop()),Ne=M.symbols_[Ne]||Ne),Ne}o(de,"lex");for(var Se,Me,ke,we,_e,$e,fe={},Ke,Te,Be,Ue;;){if(ke=R[R.length-1],this.defaultActions[ke]?we=this.defaultActions[ke]:((Se===null||typeof Se>"u")&&(Se=de()),we=G[ke]&&G[ke][Se]),typeof we>"u"||!we.length||!we[0]){var Ge="";Ue=[];for(Ke in G[ke])this.terminals_[Ke]&&Ke>H&&Ue.push("'"+this.terminals_[Ke]+"'");le.showPosition?Ge="Parse error on line "+(V+1)+`: -`+le.showPosition()+` -Expecting `+Ue.join(", ")+", got '"+(this.terminals_[Se]||Se)+"'":Ge="Parse error on line "+(V+1)+": Unexpected "+(Se==ie?"end of input":"'"+(this.terminals_[Se]||Se)+"'"),this.parseError(Ge,{text:le.match,token:this.terminals_[Se]||Se,line:le.yylineno,loc:te,expected:Ue})}if(we[0]instanceof Array&&we.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ke+", token: "+Se);switch(we[0]){case 1:R.push(Se),B.push(le.yytext),F.push(le.yylloc),R.push(we[1]),Se=null,Me?(Se=Me,Me=null):(X=le.yyleng,$=le.yytext,V=le.yylineno,te=le.yylloc,Q>0&&Q--);break;case 2:if(Te=this.productions_[we[1]][1],fe.$=B[B.length-Te],fe._$={first_line:F[F.length-(Te||1)].first_line,last_line:F[F.length-1].last_line,first_column:F[F.length-(Te||1)].first_column,last_column:F[F.length-1].last_column},Z&&(fe._$.range=[F[F.length-(Te||1)].range[0],F[F.length-1].range[1]]),$e=this.performAction.apply(fe,[$,X,V,ee.yy,we[1],B,F].concat(Y)),typeof $e<"u")return $e;Te&&(R=R.slice(0,-1*Te*2),B=B.slice(0,-1*Te),F=F.slice(0,-1*Te)),R.push(this.productions_[we[1]][0]),B.push(fe.$),F.push(fe._$),Be=G[R[R.length-2]][R[R.length-1]],R.push(Be);break;case 3:return!0}}return!0},"parse")},N=(function(){var _={EOF:1,parseError:o(function(M,R){if(this.yy.parser)this.yy.parser.parseError(M,R);else throw new Error(M)},"parseError"),setInput:o(function(D,M){return this.yy=M||this.yy||{},this._input=D,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var D=this._input[0];this.yytext+=D,this.yyleng++,this.offset++,this.match+=D,this.matched+=D;var M=D.match(/(?:\r\n?|\n).*/g);return M?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),D},"input"),unput:o(function(D){var M=D.length,R=D.split(/(?:\r\n?|\n)/g);this._input=D+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-M),this.offset-=M;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),R.length-1&&(this.yylineno-=R.length-1);var B=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:R?(R.length===P.length?this.yylloc.first_column:0)+P[P.length-R.length].length-R[0].length:this.yylloc.first_column-M},this.options.ranges&&(this.yylloc.range=[B[0],B[0]+this.yyleng-M]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(D){this.unput(this.match.slice(D))},"less"),pastInput:o(function(){var D=this.matched.substr(0,this.matched.length-this.match.length);return(D.length>20?"...":"")+D.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var D=this.match;return D.length<20&&(D+=this._input.substr(0,20-D.length)),(D.substr(0,20)+(D.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var D=this.pastInput(),M=new Array(D.length+1).join("-");return D+this.upcomingInput()+` -`+M+"^"},"showPosition"),test_match:o(function(D,M){var R,P,B;if(this.options.backtrack_lexer&&(B={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(B.yylloc.range=this.yylloc.range.slice(0))),P=D[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+D[0].length},this.yytext+=D[0],this.match+=D[0],this.matches=D,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(D[0].length),this.matched+=D[0],R=this.performAction.call(this,this.yy,this,M,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),R)return R;if(this._backtrack){for(var F in B)this[F]=B[F];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var D,M,R,P;this._more||(this.yytext="",this.match="");for(var B=this._currentRules(),F=0;FM[0].length)){if(M=R,P=F,this.options.backtrack_lexer){if(D=this.test_match(R,B[F]),D!==!1)return D;if(this._backtrack){M=!1;continue}else return!1}else if(!this.options.flex)break}return M?(D=this.test_match(M,B[P]),D!==!1?D:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var M=this.next();return M||this.lex()},"lex"),begin:o(function(M){this.conditionStack.push(M)},"begin"),popState:o(function(){var M=this.conditionStack.length-1;return M>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(M){return M=this.conditionStack.length-1-Math.abs(M||0),M>=0?this.conditionStack[M]:"INITIAL"},"topState"),pushState:o(function(M){this.begin(M)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(M,R,P,B){var F=B;switch(P){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return _})();I.lexer=N;function C(){this.yy={}}return o(C,"Parser"),C.prototype=I,I.Parser=C,new C})();mq.parser=mq;L4e=mq});var M4e=nr((gq,yq)=>{"use strict";(function(t,e){typeof gq=="object"&&typeof yq<"u"?yq.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(gq,(function(){"use strict";var t="day";return function(e,r,n){var i=o(function(l){return l.add(4-l.isoWeekday(),t)},"a"),a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(l){if(!this.$utils().u(l))return this.add(7*(l-this.isoWeek()),t);var u,h,f,d,p=i(this),m=(u=this.isoWeekYear(),h=this.$u,f=(h?n.utc:n)().year(u).startOf("year"),d=4-f.isoWeekday(),f.isoWeekday()>4&&(d+=7),f.add(d,t));return p.diff(m,"week")+1},a.isoWeekday=function(l){return this.$utils().u(l)?this.day()||7:this.day(this.day()%7?l:l-7)};var s=a.startOf;a.startOf=function(l,u){var h=this.$utils(),f=!!h.u(u)||u;return h.p(l)==="isoweek"?f?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(l,u)}}}))});var I4e=nr((vq,xq)=>{"use strict";(function(t,e){typeof vq=="object"&&typeof xq<"u"?xq.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(vq,(function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},l=o(function(g){return(g=+g)+(g>68?1900:2e3)},"a"),u=o(function(g){return function(y){this[g]=+y}},"f"),h=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=(function(y){if(!y||y==="Z")return 0;var v=y.match(/([+-]|\d\d)/g),x=60*v[1]+(+v[2]||0);return x===0?0:v[0]==="+"?-x:x})(g)}],f=o(function(g){var y=s[g];return y&&(y.indexOf?y:y.s.concat(y.f))},"u"),d=o(function(g,y){var v,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,y))>-1){v=b>12;break}}else v=g===(y?"pm":"PM");return v},"d"),p={A:[a,function(g){this.afternoon=d(g,!1)}],a:[a,function(g){this.afternoon=d(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,u("seconds")],ss:[i,u("seconds")],m:[i,u("minutes")],mm:[i,u("minutes")],H:[i,u("hours")],h:[i,u("hours")],HH:[i,u("hours")],hh:[i,u("hours")],D:[i,u("day")],DD:[n,u("day")],Do:[a,function(g){var y=s.ordinal,v=g.match(/\d+/);if(this.day=v[0],y)for(var x=1;x<=31;x+=1)y(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,u("week")],ww:[n,u("week")],M:[i,u("month")],MM:[n,u("month")],MMM:[a,function(g){var y=f("months"),v=(f("monthsShort")||y.map((function(x){return x.slice(0,3)}))).indexOf(g)+1;if(v<1)throw new Error;this.month=v%12||v}],MMMM:[a,function(g){var y=f("months").indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,u("year")],YY:[n,function(g){this.year=l(g)}],YYYY:[/\d{4}/,u("year")],Z:h,ZZ:h};function m(g){var y,v;y=g,v=s&&s.formats;for(var x=(g=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(A,L,I){var N=I&&I.toUpperCase();return L||v[I]||t[I]||v[N].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(C,_,D){return _||D.slice(1)}))}))).match(e),b=x.length,T=0;T-1)return new Date((R==="X"?1e3:1)*M);var F=m(R)(M),G=F.year,$=F.month,V=F.day,X=F.hours,Q=F.minutes,H=F.seconds,ie=F.milliseconds,Y=F.zone,le=F.week,ee=new Date,J=V||(G||$?1:ee.getDate()),te=G||ee.getFullYear(),Z=0;G&&!$||(Z=$>0?$-1:ee.getMonth());var xe,de=X||0,Se=Q||0,Me=H||0,ke=ie||0;return Y?new Date(Date.UTC(te,Z,J,de,Se,Me,ke+60*Y.offset*1e3)):P?new Date(Date.UTC(te,Z,J,de,Se,Me,ke)):(xe=new Date(te,Z,J,de,Se,Me,ke),le&&(xe=B(xe).week(le).toDate()),xe)}catch{return new Date("")}})(E,S,w,v),this.init(),N&&N!==!0&&(this.$L=this.locale(N).$L),I&&E!=this.format(S)&&(this.$d=new Date("")),s={}}else if(S instanceof Array)for(var C=S.length,_=1;_<=C;_+=1){k[1]=S[_-1];var D=v.apply(this,k);if(D.isValid()){this.$d=D.$d,this.$L=D.$L,this.init();break}_===C&&(this.$d=new Date(""))}else b.call(this,T)}}}))});var O4e=nr((bq,Tq)=>{"use strict";(function(t,e){typeof bq=="object"&&typeof Tq<"u"?Tq.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})(bq,(function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var l=this.$utils(),u=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(h){switch(h){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return l.s(a.week(),h==="w"?1:2,"0");case"W":case"WW":return l.s(a.isoWeek(),h==="W"?1:2,"0");case"k":case"kk":return l.s(String(a.$H===0?24:a.$H),h==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return h}}));return n.bind(this)(u)}}}))});function Q4e(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var F4e,il,$4e,z4e,G4e,P4e,Ku,Sq,Cq,Aq,l3,c3,_q,Dq,C7,Nv,Rq,V4e,Lq,u3,Nq,Mq,A7,wq,Ost,Pst,Bst,Fst,$st,zst,Gst,Vst,qst,Ust,Wst,Hst,Yst,jst,Xst,Kst,Qst,Zst,Jst,eot,tot,rot,not,q4e,iot,aot,sot,U4e,oot,kq,W4e,H4e,E7,Lv,lot,cot,Eq,S7,ua,Y4e,uot,Wm,hot,B4e,fot,j4e,dot,X4e,pot,mot,K4e,Z4e=O(()=>{"use strict";F4e=Ra(Wg(),1),il=Ra(U3(),1),$4e=Ra(M4e(),1),z4e=Ra(I4e(),1),G4e=Ra(O4e(),1);xt();jt();ar();si();il.default.extend($4e.default);il.default.extend(z4e.default);il.default.extend(G4e.default);P4e={friday:5,saturday:6},Ku="",Sq="",Aq="",l3=[],c3=[],_q=new Map,Dq=[],C7=[],Nv="",Rq="",V4e=["active","done","crit","milestone","vert"],Lq=[],u3=!1,Nq=!1,Mq="sunday",A7="saturday",wq=0,Ost=o(function(){Dq=[],C7=[],Nv="",Lq=[],E7=0,Eq=void 0,S7=void 0,ua=[],Ku="",Sq="",Rq="",Cq=void 0,Aq="",l3=[],c3=[],u3=!1,Nq=!1,wq=0,_q=new Map,_r(),Mq="sunday",A7="saturday"},"clear"),Pst=o(function(t){Sq=t},"setAxisFormat"),Bst=o(function(){return Sq},"getAxisFormat"),Fst=o(function(t){Cq=t},"setTickInterval"),$st=o(function(){return Cq},"getTickInterval"),zst=o(function(t){Aq=t},"setTodayMarker"),Gst=o(function(){return Aq},"getTodayMarker"),Vst=o(function(t){Ku=t},"setDateFormat"),qst=o(function(){u3=!0},"enableInclusiveEndDates"),Ust=o(function(){return u3},"endDatesAreInclusive"),Wst=o(function(){Nq=!0},"enableTopAxis"),Hst=o(function(){return Nq},"topAxisEnabled"),Yst=o(function(t){Rq=t},"setDisplayMode"),jst=o(function(){return Rq},"getDisplayMode"),Xst=o(function(){return Ku},"getDateFormat"),Kst=o(function(t){l3=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),Qst=o(function(){return l3},"getIncludes"),Zst=o(function(t){c3=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),Jst=o(function(){return c3},"getExcludes"),eot=o(function(){return _q},"getLinks"),tot=o(function(t){Nv=t,Dq.push(t)},"addSection"),rot=o(function(){return Dq},"getSections"),not=o(function(){let t=B4e(),e=10,r=0;for(;!t&&r{let u=l.trim();return u==="x"||u==="X"},"isTimestampFormat")(e)&&/^\d+$/.test(r))return new Date(Number(r));let a=/^after\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let l=null;for(let h of a.groups.ids.split(" ")){let f=Wm(h);f!==void 0&&(!l||f.endTime>l.endTime)&&(l=f)}if(l)return l.endTime;let u=new Date;return u.setHours(0,0,0,0),u}let s=(0,il.default)(r,e.trim(),!0);if(s.isValid())return s.toDate();{K.debug("Invalid date:"+r),K.debug("With date format:"+e.trim());let l=new Date(r);if(l===void 0||isNaN(l.getTime())||l.getFullYear()<-1e4||l.getFullYear()>1e4)throw new Error("Invalid date:"+r);return l}},"getStartDate"),W4e=o(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),H4e=o(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let f=null;for(let p of a.groups.ids.split(" ")){let m=Wm(p);m!==void 0&&(!f||m.startTime{window.open(r,"_self")}),_q.set(n,r))}),j4e(t,"clickable")},"setLink"),j4e=o(function(t,e){t.split(",").forEach(function(r){let n=Wm(r);n!==void 0&&n.classes.push(e)})},"setClass"),dot=o(function(t,e,r){if(ve().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{Xt.runFunc(e,...n)})},"setClickFun"),X4e=o(function(t,e){Lq.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),pot=o(function(t,e,r){t.split(",").forEach(function(n){dot(n,e,r)}),j4e(t,"clickable")},"setClickEvent"),mot=o(function(t){Lq.forEach(function(e){e(t)})},"bindFunctions"),K4e={getConfig:o(()=>ve().gantt,"getConfig"),clear:Ost,setDateFormat:Vst,getDateFormat:Xst,enableInclusiveEndDates:qst,endDatesAreInclusive:Ust,enableTopAxis:Wst,topAxisEnabled:Hst,setAxisFormat:Pst,getAxisFormat:Bst,setTickInterval:Fst,getTickInterval:$st,setTodayMarker:zst,getTodayMarker:Gst,setAccTitle:Lr,getAccTitle:Or,setDiagramTitle:zr,getDiagramTitle:Fr,setDisplayMode:Yst,getDisplayMode:jst,setAccDescription:Pr,getAccDescription:Br,addSection:tot,getSections:rot,getTasks:not,addTask:uot,findTaskById:Wm,addTaskOrg:hot,setIncludes:Kst,getIncludes:Qst,setExcludes:Zst,getExcludes:Jst,setClickEvent:pot,setLink:fot,getLinks:eot,bindFunctions:mot,parseDuration:W4e,isInvalidDate:q4e,setWeekday:iot,getWeekday:aot,setWeekend:sot};o(Q4e,"getTaskTags")});var J4e=nr((Iq,Oq)=>{"use strict";(function(t,e){typeof Iq=="object"&&typeof Oq<"u"?Oq.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_duration=e()})(Iq,(function(){"use strict";var t,e,r=1e3,n=6e4,i=36e5,a=864e5,s=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,l=31536e6,u=2628e6,h=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,f={years:l,months:u,days:a,hours:i,minutes:n,seconds:r,milliseconds:1,weeks:6048e5},d=o(function(E){return E instanceof b},"c"),p=o(function(E,w,k){return new b(E,k,w.$l)},"f"),m=o(function(E){return e.p(E)+"s"},"m"),g=o(function(E){return E<0},"l"),y=o(function(E){return g(E)?Math.ceil(E):Math.floor(E)},"$"),v=o(function(E){return Math.abs(E)},"y"),x=o(function(E,w){return E?g(E)?{negative:!0,format:""+v(E)+w}:{negative:!1,format:""+E+w}:{negative:!1,format:""}},"v"),b=(function(){function E(k,S,A){var L=this;if(this.$d={},this.$l=A,k===void 0&&(this.$ms=0,this.parseFromMilliseconds()),S)return p(k*f[m(S)],this);if(typeof k=="number")return this.$ms=k,this.parseFromMilliseconds(),this;if(typeof k=="object")return Object.keys(k).forEach((function(C){L.$d[m(C)]=k[C]})),this.calMilliseconds(),this;if(typeof k=="string"){var I=k.match(h);if(I){var N=I.slice(2).map((function(C){return C!=null?Number(C):0}));return this.$d.years=N[0],this.$d.months=N[1],this.$d.weeks=N[2],this.$d.days=N[3],this.$d.hours=N[4],this.$d.minutes=N[5],this.$d.seconds=N[6],this.calMilliseconds(),this}}return this}o(E,"l");var w=E.prototype;return w.calMilliseconds=function(){var k=this;this.$ms=Object.keys(this.$d).reduce((function(S,A){return S+(k.$d[A]||0)*f[A]}),0)},w.parseFromMilliseconds=function(){var k=this.$ms;this.$d.years=y(k/l),k%=l,this.$d.months=y(k/u),k%=u,this.$d.days=y(k/a),k%=a,this.$d.hours=y(k/i),k%=i,this.$d.minutes=y(k/n),k%=n,this.$d.seconds=y(k/r),k%=r,this.$d.milliseconds=k},w.toISOString=function(){var k=x(this.$d.years,"Y"),S=x(this.$d.months,"M"),A=+this.$d.days||0;this.$d.weeks&&(A+=7*this.$d.weeks);var L=x(A,"D"),I=x(this.$d.hours,"H"),N=x(this.$d.minutes,"M"),C=this.$d.seconds||0;this.$d.milliseconds&&(C+=this.$d.milliseconds/1e3,C=Math.round(1e3*C)/1e3);var _=x(C,"S"),D=k.negative||S.negative||L.negative||I.negative||N.negative||_.negative,M=I.format||N.format||_.format?"T":"",R=(D?"-":"")+"P"+k.format+S.format+L.format+M+I.format+N.format+_.format;return R==="P"||R==="-P"?"P0D":R},w.toJSON=function(){return this.toISOString()},w.format=function(k){var S=k||"YYYY-MM-DDTHH:mm:ss",A={Y:this.$d.years,YY:e.s(this.$d.years,2,"0"),YYYY:e.s(this.$d.years,4,"0"),M:this.$d.months,MM:e.s(this.$d.months,2,"0"),D:this.$d.days,DD:e.s(this.$d.days,2,"0"),H:this.$d.hours,HH:e.s(this.$d.hours,2,"0"),m:this.$d.minutes,mm:e.s(this.$d.minutes,2,"0"),s:this.$d.seconds,ss:e.s(this.$d.seconds,2,"0"),SSS:e.s(this.$d.milliseconds,3,"0")};return S.replace(s,(function(L,I){return I||String(A[L])}))},w.as=function(k){return this.$ms/f[m(k)]},w.get=function(k){var S=this.$ms,A=m(k);return A==="milliseconds"?S%=1e3:S=A==="weeks"?y(S/f[A]):this.$d[A],S||0},w.add=function(k,S,A){var L;return L=S?k*f[m(S)]:d(k)?k.$ms:p(k,this).$ms,p(this.$ms+L*(A?-1:1),this)},w.subtract=function(k,S){return this.add(k,S,!0)},w.locale=function(k){var S=this.clone();return S.$l=k,S},w.clone=function(){return p(this.$ms,this)},w.humanize=function(k){return t().add(this.$ms,"ms").locale(this.$l).fromNow(!k)},w.valueOf=function(){return this.asMilliseconds()},w.milliseconds=function(){return this.get("milliseconds")},w.asMilliseconds=function(){return this.as("milliseconds")},w.seconds=function(){return this.get("seconds")},w.asSeconds=function(){return this.as("seconds")},w.minutes=function(){return this.get("minutes")},w.asMinutes=function(){return this.as("minutes")},w.hours=function(){return this.get("hours")},w.asHours=function(){return this.as("hours")},w.days=function(){return this.get("days")},w.asDays=function(){return this.as("days")},w.weeks=function(){return this.get("weeks")},w.asWeeks=function(){return this.as("weeks")},w.months=function(){return this.get("months")},w.asMonths=function(){return this.as("months")},w.years=function(){return this.get("years")},w.asYears=function(){return this.as("years")},E})(),T=o(function(E,w,k){return E.add(w.years()*k,"y").add(w.months()*k,"M").add(w.days()*k,"d").add(w.hours()*k,"h").add(w.minutes()*k,"m").add(w.seconds()*k,"s").add(w.milliseconds()*k,"ms")},"p");return function(E,w,k){t=k,e=k().$utils(),k.duration=function(L,I){var N=k.locale();return p(L,{$l:N},I)},k.isDuration=d;var S=w.prototype.add,A=w.prototype.subtract;w.prototype.add=function(L,I){return d(L)?T(this,L,1):S.bind(this)(L,I)},w.prototype.subtract=function(L,I){return d(L)?T(this,L,-1):A.bind(this)(L,I)}}}))});var Mv,t3e,got,e3e,yot,sf,Pq,vot,r3e,n3e=O(()=>{"use strict";Mv=Ra(U3(),1),t3e=Ra(J4e(),1);xt();Ar();Ur();jt();Ti();Mv.default.extend(t3e.default);got=o(function(){K.debug("Something is calling, setConf, remove the call")},"setConf"),e3e={monday:If,tuesday:M5,wednesday:I5,thursday:iu,friday:O5,saturday:P5,sunday:oc},yot=o((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),Pq=1e4,vot=o(function(t,e,r,n){let i=ve().gantt,a=ve().securityLevel,s;a==="sandbox"&&(s=je("#i"+e));let l=a==="sandbox"?je(s.nodes()[0].contentDocument.body):je("body"),u=a==="sandbox"?s.nodes()[0].contentDocument:document,h=u.getElementById(e);sf=h.parentElement.offsetWidth,sf===void 0&&(sf=1200),i.useWidth!==void 0&&(sf=i.useWidth);let f=n.db.getTasks(),d=[];for(let L of f)d.push(L.type);d=A(d);let p={},m=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let L={};for(let N of f)L[N.section]===void 0?L[N.section]=[N]:L[N.section].push(N);let I=0;for(let N of Object.keys(L)){let C=yot(L[N],I)+1;I+=C,m+=C*(i.barHeight+i.barGap),p[N]=C}}else{m+=f.length*(i.barHeight+i.barGap);for(let L of d)p[L]=f.filter(I=>I.type===L).length}h.setAttribute("viewBox","0 0 "+sf+" "+m);let g=l.select(`[id="${e}"]`),y=$5().domain([Uw(f,function(L){return L.startTime}),qw(f,function(L){return L.endTime})]).rangeRound([0,sf-i.leftPadding-i.rightPadding]);function v(L,I){let N=L.startTime,C=I.startTime,_=0;return N>C?_=1:N$.vert===V.vert?0:$.vert?1:-1);let P=[...new Set(L.map($=>$.order))].map($=>L.find(V=>V.order===$));g.append("g").selectAll("rect").data(P).enter().append("rect").attr("x",0).attr("y",function($,V){return V=$.order,V*I+N-2}).attr("width",function(){return M-i.rightPadding/2}).attr("height",I).attr("class",function($){for(let[V,X]of d.entries())if($.type===X)return"section section"+V%i.numberSectionStyles;return"section section0"}).enter();let B=g.append("g").selectAll("rect").data(L).enter(),F=n.db.getLinks();if(B.append("rect").attr("id",function($){return $.id}).attr("rx",3).attr("ry",3).attr("x",function($){return $.milestone?y($.startTime)+C+.5*(y($.endTime)-y($.startTime))-.5*_:y($.startTime)+C}).attr("y",function($,V){return V=$.order,$.vert?i.gridLineStartPadding:V*I+N}).attr("width",function($){return $.milestone?_:$.vert?.08*_:y($.renderEndTime||$.endTime)-y($.startTime)}).attr("height",function($){return $.vert?f.length*(i.barHeight+i.barGap)+i.barHeight*2:_}).attr("transform-origin",function($,V){return V=$.order,(y($.startTime)+C+.5*(y($.endTime)-y($.startTime))).toString()+"px "+(V*I+N+.5*_).toString()+"px"}).attr("class",function($){let V="task",X="";$.classes.length>0&&(X=$.classes.join(" "));let Q=0;for(let[ie,Y]of d.entries())$.type===Y&&(Q=ie%i.numberSectionStyles);let H="";return $.active?$.crit?H+=" activeCrit":H=" active":$.done?$.crit?H=" doneCrit":H=" done":$.crit&&(H+=" crit"),H.length===0&&(H=" task"),$.milestone&&(H=" milestone "+H),$.vert&&(H=" vert "+H),H+=Q,H+=" "+X,V+H}),B.append("text").attr("id",function($){return $.id+"-text"}).text(function($){return $.task}).attr("font-size",i.fontSize).attr("x",function($){let V=y($.startTime),X=y($.renderEndTime||$.endTime);if($.milestone&&(V+=.5*(y($.endTime)-y($.startTime))-.5*_,X=V+_),$.vert)return y($.startTime)+C;let Q=this.getBBox().width;return Q>X-V?X+Q+1.5*i.leftPadding>M?V+C-5:X+C+5:(X-V)/2+V+C}).attr("y",function($,V){return $.vert?i.gridLineStartPadding+f.length*(i.barHeight+i.barGap)+60:(V=$.order,V*I+i.barHeight/2+(i.fontSize/2-2)+N)}).attr("text-height",_).attr("class",function($){let V=y($.startTime),X=y($.endTime);$.milestone&&(X=V+_);let Q=this.getBBox().width,H="";$.classes.length>0&&(H=$.classes.join(" "));let ie=0;for(let[le,ee]of d.entries())$.type===ee&&(ie=le%i.numberSectionStyles);let Y="";return $.active&&($.crit?Y="activeCritText"+ie:Y="activeText"+ie),$.done?$.crit?Y=Y+" doneCritText"+ie:Y=Y+" doneText"+ie:$.crit&&(Y=Y+" critText"+ie),$.milestone&&(Y+=" milestoneText"),$.vert&&(Y+=" vertText"),Q>X-V?X+Q+1.5*i.leftPadding>M?H+" taskTextOutsideLeft taskTextOutside"+ie+" "+Y:H+" taskTextOutsideRight taskTextOutside"+ie+" "+Y+" width-"+Q:H+" taskText taskText"+ie+" "+Y+" width-"+Q}),ve().securityLevel==="sandbox"){let $;$=je("#i"+e);let V=$.nodes()[0].contentDocument;B.filter(function(X){return F.has(X.id)}).each(function(X){var Q=V.querySelector("#"+X.id),H=V.querySelector("#"+X.id+"-text");let ie=Q.parentNode;var Y=V.createElement("a");Y.setAttribute("xlink:href",F.get(X.id)),Y.setAttribute("target","_top"),ie.appendChild(Y),Y.appendChild(Q),Y.appendChild(H)})}}o(b,"drawRects");function T(L,I,N,C,_,D,M,R){if(M.length===0&&R.length===0)return;let P,B;for(let{startTime:Q,endTime:H}of D)(P===void 0||QB)&&(B=H);if(!P||!B)return;if((0,Mv.default)(B).diff((0,Mv.default)(P),"year")>5){K.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let F=n.db.getDateFormat(),G=[],$=null,V=(0,Mv.default)(P);for(;V.valueOf()<=B;)n.db.isInvalidDate(V,F,M,R)?$?$.end=V:$={start:V,end:V}:$&&(G.push($),$=null),V=V.add(1,"d");g.append("g").selectAll("rect").data(G).enter().append("rect").attr("id",Q=>"exclude-"+Q.start.format("YYYY-MM-DD")).attr("x",Q=>y(Q.start.startOf("day"))+N).attr("y",i.gridLineStartPadding).attr("width",Q=>y(Q.end.endOf("day"))-y(Q.start.startOf("day"))).attr("height",_-I-i.gridLineStartPadding).attr("transform-origin",function(Q,H){return(y(Q.start)+N+.5*(y(Q.end)-y(Q.start))).toString()+"px "+(H*L+.5*_).toString()+"px"}).attr("class","exclude-range")}o(T,"drawExcludeDays");function E(L,I,N,C){if(N<=0||L>I)return 1/0;let _=I-L,D=Mv.default.duration({[C??"day"]:N}).asMilliseconds();return D<=0?1/0:Math.ceil(_/D)}o(E,"getEstimatedTickCount");function w(L,I,N,C){let _=n.db.getDateFormat(),D=n.db.getAxisFormat(),M;D?M=D:_==="D"?M="%d":M=i.axisFormat??"%Y-%m-%d";let R=GD(y).tickSize(-C+I+i.gridLineStartPadding).tickFormat(r0(M)),B=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(B!==null){let F=parseInt(B[1],10);if(isNaN(F)||F<=0)K.warn(`Invalid tick interval value: "${B[1]}". Skipping custom tick interval.`);else{let G=B[2],$=n.db.getWeekday()||i.weekday,V=y.domain(),X=V[0],Q=V[1],H=E(X,Q,F,G);if(H>Pq)K.warn(`The tick interval "${F}${G}" would generate ${H} ticks, which exceeds the maximum allowed (${Pq}). This may indicate an invalid date or time range. Skipping custom tick interval.`);else switch(G){case"millisecond":R.ticks(ru.every(F));break;case"second":R.ticks($o.every(F));break;case"minute":R.ticks(yh.every(F));break;case"hour":R.ticks(vh.every(F));break;case"day":R.ticks(gl.every(F));break;case"week":R.ticks(e3e[$].every(F));break;case"month":R.ticks(xh.every(F));break}}}if(g.append("g").attr("class","grid").attr("transform","translate("+L+", "+(C-50)+")").call(R).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let F=zD(y).tickSize(-C+I+i.gridLineStartPadding).tickFormat(r0(M));if(B!==null){let G=parseInt(B[1],10);if(isNaN(G)||G<=0)K.warn(`Invalid tick interval value: "${B[1]}". Skipping custom tick interval.`);else{let $=B[2],V=n.db.getWeekday()||i.weekday,X=y.domain(),Q=X[0],H=X[1];if(E(Q,H,G,$)<=Pq)switch($){case"millisecond":F.ticks(ru.every(G));break;case"second":F.ticks($o.every(G));break;case"minute":F.ticks(yh.every(G));break;case"hour":F.ticks(vh.every(G));break;case"day":F.ticks(gl.every(G));break;case"week":F.ticks(e3e[V].every(G));break;case"month":F.ticks(xh.every(G));break}}}g.append("g").attr("class","grid").attr("transform","translate("+L+", "+I+")").call(F).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}o(w,"makeGrid");function k(L,I){let N=0,C=Object.keys(p).map(_=>[_,p[_]]);g.append("g").selectAll("text").data(C).enter().append(function(_){let D=_[0].split(st.lineBreakRegex),M=-(D.length-1)/2,R=u.createElementNS("http://www.w3.org/2000/svg","text");R.setAttribute("dy",M+"em");for(let[P,B]of D.entries()){let F=u.createElementNS("http://www.w3.org/2000/svg","tspan");F.setAttribute("alignment-baseline","central"),F.setAttribute("x","10"),P>0&&F.setAttribute("dy","1em"),F.textContent=B,R.appendChild(F)}return R}).attr("x",10).attr("y",function(_,D){if(D>0)for(let M=0;M{"use strict";xot=o(t=>` - .mermaid-main-font { - font-family: ${t.fontFamily}; - } - - .exclude-range { - fill: ${t.excludeBkgColor}; - } - - .section { - stroke: none; - opacity: 0.2; - } - - .section0 { - fill: ${t.sectionBkgColor}; - } - - .section2 { - fill: ${t.sectionBkgColor2}; - } - - .section1, - .section3 { - fill: ${t.altSectionBkgColor}; - opacity: 0.2; - } - - .sectionTitle0 { - fill: ${t.titleColor}; - } - - .sectionTitle1 { - fill: ${t.titleColor}; - } - - .sectionTitle2 { - fill: ${t.titleColor}; - } - - .sectionTitle3 { - fill: ${t.titleColor}; - } - - .sectionTitle { - text-anchor: start; - font-family: ${t.fontFamily}; - } - - - /* Grid and axis */ - - .grid .tick { - stroke: ${t.gridColor}; - opacity: 0.8; - shape-rendering: crispEdges; - } - - .grid .tick text { - font-family: ${t.fontFamily}; - fill: ${t.textColor}; - } - - .grid path { - stroke-width: 0; - } - - - /* Today line */ - - .today { - fill: none; - stroke: ${t.todayLineColor}; - stroke-width: 2px; - } - - - /* Task styling */ - - /* Default task */ - - .task { - stroke-width: 2; - } - - .taskText { - text-anchor: middle; - font-family: ${t.fontFamily}; - } - - .taskTextOutsideRight { - fill: ${t.taskTextDarkColor}; - text-anchor: start; - font-family: ${t.fontFamily}; - } - - .taskTextOutsideLeft { - fill: ${t.taskTextDarkColor}; - text-anchor: end; - } - - - /* Special case clickable */ - - .task.clickable { - cursor: pointer; - } - - .taskText.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - .taskTextOutsideLeft.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - .taskTextOutsideRight.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - - /* Specific task settings for the sections*/ - - .taskText0, - .taskText1, - .taskText2, - .taskText3 { - fill: ${t.taskTextColor}; - } - - .task0, - .task1, - .task2, - .task3 { - fill: ${t.taskBkgColor}; - stroke: ${t.taskBorderColor}; - } - - .taskTextOutside0, - .taskTextOutside2 - { - fill: ${t.taskTextOutsideColor}; - } - - .taskTextOutside1, - .taskTextOutside3 { - fill: ${t.taskTextOutsideColor}; - } - - - /* Active task */ - - .active0, - .active1, - .active2, - .active3 { - fill: ${t.activeTaskBkgColor}; - stroke: ${t.activeTaskBorderColor}; - } - - .activeText0, - .activeText1, - .activeText2, - .activeText3 { - fill: ${t.taskTextDarkColor} !important; - } - - - /* Completed task */ - - .done0, - .done1, - .done2, - .done3 { - stroke: ${t.doneTaskBorderColor}; - fill: ${t.doneTaskBkgColor}; - stroke-width: 2; - } - - .doneText0, - .doneText1, - .doneText2, - .doneText3 { - fill: ${t.taskTextDarkColor} !important; - } - - /* Done task text displayed outside the bar sits against the diagram background, - not against the done-task bar, so it must use the outside/contrast color. */ - .doneText0.taskTextOutsideLeft, - .doneText0.taskTextOutsideRight, - .doneText1.taskTextOutsideLeft, - .doneText1.taskTextOutsideRight, - .doneText2.taskTextOutsideLeft, - .doneText2.taskTextOutsideRight, - .doneText3.taskTextOutsideLeft, - .doneText3.taskTextOutsideRight { - fill: ${t.taskTextOutsideColor} !important; - } - - - /* Tasks on the critical line */ - - .crit0, - .crit1, - .crit2, - .crit3 { - stroke: ${t.critBorderColor}; - fill: ${t.critBkgColor}; - stroke-width: 2; - } - - .activeCrit0, - .activeCrit1, - .activeCrit2, - .activeCrit3 { - stroke: ${t.critBorderColor}; - fill: ${t.activeTaskBkgColor}; - stroke-width: 2; - } - - .doneCrit0, - .doneCrit1, - .doneCrit2, - .doneCrit3 { - stroke: ${t.critBorderColor}; - fill: ${t.doneTaskBkgColor}; - stroke-width: 2; - cursor: pointer; - shape-rendering: crispEdges; - } - - .milestone { - transform: rotate(45deg) scale(0.8,0.8); - } - - .milestoneText { - font-style: italic; - } - .doneCritText0, - .doneCritText1, - .doneCritText2, - .doneCritText3 { - fill: ${t.taskTextDarkColor} !important; - } - - /* Done-crit task text outside the bar \u2014 same reasoning as doneText above. */ - .doneCritText0.taskTextOutsideLeft, - .doneCritText0.taskTextOutsideRight, - .doneCritText1.taskTextOutsideLeft, - .doneCritText1.taskTextOutsideRight, - .doneCritText2.taskTextOutsideLeft, - .doneCritText2.taskTextOutsideRight, - .doneCritText3.taskTextOutsideLeft, - .doneCritText3.taskTextOutsideRight { - fill: ${t.taskTextOutsideColor} !important; - } - - .vert { - stroke: ${t.vertLineColor}; - } - - .vertText { - font-size: 15px; - text-anchor: middle; - fill: ${t.vertLineColor} !important; - } - - .activeCritText0, - .activeCritText1, - .activeCritText2, - .activeCritText3 { - fill: ${t.taskTextDarkColor} !important; - } - - .titleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.titleColor||t.textColor}; - font-family: ${t.fontFamily}; - } -`,"getStyles"),i3e=xot});var s3e={};vr(s3e,{diagram:()=>bot});var bot,o3e=O(()=>{"use strict";N4e();Z4e();n3e();a3e();bot={parser:L4e,db:K4e,renderer:r3e,styles:i3e}});var u3e,h3e=O(()=>{"use strict";up();xt();u3e={parse:o(async t=>{let e=await Us("info",t);K.debug(e)},"parse")}});var Eot,Sot,f3e,d3e=O(()=>{"use strict";Eot={version:"11.13.0"},Sot=o(()=>Eot.version,"getVersion"),f3e={getVersion:Sot}});var Ii,Ul=O(()=>{"use strict";Ar();jt();Ii=o(t=>{let{securityLevel:e}=ve(),r=je("body");if(e==="sandbox"){let a=je(`#i${t}`).node()?.contentDocument??document;r=je(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var Cot,p3e,m3e=O(()=>{"use strict";xt();Ul();Ti();Cot=o((t,e,r)=>{K.debug(`rendering info diagram -`+t);let n=Ii(e);Zr(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),p3e={draw:Cot}});var g3e={};vr(g3e,{diagram:()=>Aot});var Aot,y3e=O(()=>{"use strict";h3e();d3e();m3e();Aot={parser:u3e,db:f3e,renderer:p3e}});var b3e,Bq,_7,Fq,Rot,Lot,Not,Mot,Iot,Oot,Pot,D7,$q=O(()=>{"use strict";xt();si();La();b3e=gr.pie,Bq={sections:new Map,showData:!1,config:b3e},_7=Bq.sections,Fq=Bq.showData,Rot=structuredClone(b3e),Lot=o(()=>structuredClone(Rot),"getConfig"),Not=o(()=>{_7=new Map,Fq=Bq.showData,_r()},"clear"),Mot=o(({label:t,value:e})=>{if(e<0)throw new Error(`"${t}" has invalid value: ${e}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);_7.has(t)||(_7.set(t,e),K.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),Iot=o(()=>_7,"getSections"),Oot=o(t=>{Fq=t},"setShowData"),Pot=o(()=>Fq,"getShowData"),D7={getConfig:Lot,clear:Not,setDiagramTitle:zr,getDiagramTitle:Fr,setAccTitle:Lr,getAccTitle:Or,setAccDescription:Pr,getAccDescription:Br,addSection:Mot,getSections:Iot,setShowData:Oot,getShowData:Pot}});var Bot,T3e,w3e=O(()=>{"use strict";up();xt();Vm();$q();Bot=o((t,e)=>{ql(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),T3e={parse:o(async t=>{let e=await Us("pie",t);K.debug(e),Bot(e,D7)},"parse")}});var Fot,k3e,E3e=O(()=>{"use strict";Fot=o(t=>` - .pieCircle{ - stroke: ${t.pieStrokeColor}; - stroke-width : ${t.pieStrokeWidth}; - opacity : ${t.pieOpacity}; - } - .pieOuterCircle{ - stroke: ${t.pieOuterStrokeColor}; - stroke-width: ${t.pieOuterStrokeWidth}; - fill: none; - } - .pieTitleText { - text-anchor: middle; - font-size: ${t.pieTitleTextSize}; - fill: ${t.pieTitleTextColor}; - font-family: ${t.fontFamily}; - } - .slice { - font-family: ${t.fontFamily}; - fill: ${t.pieSectionTextColor}; - font-size:${t.pieSectionTextSize}; - // fill: white; - } - .legend text { - fill: ${t.pieLegendTextColor}; - font-family: ${t.fontFamily}; - font-size: ${t.pieLegendTextSize}; - } -`,"getStyles"),k3e=Fot});var $ot,zot,S3e,C3e=O(()=>{"use strict";Ar();jt();xt();Ul();Ti();ar();$ot=o(t=>{let e=[...t.values()].reduce((i,a)=>i+a,0),r=[...t.entries()].map(([i,a])=>({label:i,value:a})).filter(i=>i.value/e*100>=1).sort((i,a)=>a.value-i.value);return W5().value(i=>i.value)(r)},"createPieArcs"),zot=o((t,e,r,n)=>{K.debug(`rendering pie chart -`+t);let i=n.db,a=ve(),s=Pn(i.getConfig(),a.pie),l=40,u=18,h=4,f=450,d=f,p=Ii(e),m=p.append("g");m.attr("transform","translate("+d/2+","+f/2+")");let{themeVariables:g}=a,[y]=Uo(g.pieOuterStrokeWidth);y??=2;let v=s.textPosition,x=Math.min(d,f)/2-l,b=uc().innerRadius(0).outerRadius(x),T=uc().innerRadius(x*v).outerRadius(x*v);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+y/2).attr("class","pieOuterCircle");let E=i.getSections(),w=$ot(E),k=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],S=0;E.forEach(D=>{S+=D});let A=w.filter(D=>(D.data.value/S*100).toFixed(0)!=="0"),L=Fo(k);m.selectAll("mySlices").data(A).enter().append("path").attr("d",b).attr("fill",D=>L(D.data.label)).attr("class","pieCircle"),m.selectAll("mySlices").data(A).enter().append("text").text(D=>(D.data.value/S*100).toFixed(0)+"%").attr("transform",D=>"translate("+T.centroid(D)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(f-50)/2).attr("class","pieTitleText");let I=[...E.entries()].map(([D,M])=>({label:D,value:M})),N=m.selectAll(".legend").data(I).enter().append("g").attr("class","legend").attr("transform",(D,M)=>{let R=u+h,P=R*I.length/2,B=12*u,F=M*R-P;return"translate("+B+","+F+")"});N.append("rect").attr("width",u).attr("height",u).style("fill",D=>L(D.label)).style("stroke",D=>L(D.label)),N.append("text").attr("x",u+h).attr("y",u-h).text(D=>i.getShowData()?`${D.label} [${D.value}]`:D.label);let C=Math.max(...N.selectAll("text").nodes().map(D=>D?.getBoundingClientRect().width??0)),_=d+l+u+h+C;p.attr("viewBox",`0 0 ${_} ${f}`),Zr(p,f,_,s.useMaxWidth)},"draw"),S3e={draw:zot}});var A3e={};vr(A3e,{diagram:()=>Got});var Got,_3e=O(()=>{"use strict";w3e();$q();E3e();C3e();Got={parser:T3e,db:D7,renderer:S3e,styles:k3e}});var zq,R3e,L3e=O(()=>{"use strict";zq=(function(){var t=o(function(ce,z,ne,se){for(ne=ne||{},se=ce.length;se--;ne[ce[se]]=z);return ne},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],u=[55,56,57],h=[2,36],f=[1,37],d=[1,36],p=[1,38],m=[1,35],g=[1,43],y=[1,41],v=[1,14],x=[1,23],b=[1,18],T=[1,19],E=[1,20],w=[1,21],k=[1,22],S=[1,24],A=[1,25],L=[1,26],I=[1,27],N=[1,28],C=[1,29],_=[1,32],D=[1,33],M=[1,34],R=[1,39],P=[1,40],B=[1,42],F=[1,44],G=[1,62],$=[1,61],V=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],X=[1,65],Q=[1,66],H=[1,67],ie=[1,68],Y=[1,69],le=[1,70],ee=[1,71],J=[1,72],te=[1,73],Z=[1,74],xe=[1,75],de=[1,76],Se=[4,5,6,7,8,9,10,11,12,13,14,15,18],Me=[1,90],ke=[1,91],we=[1,92],_e=[1,99],$e=[1,93],fe=[1,96],Ke=[1,94],Te=[1,95],Be=[1,97],Ue=[1,98],Ge=[1,102],Ne=[10,55,56,57],We=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],j={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(z,ne,se,be,pe,me,Re){var ge=me.length-1;switch(pe){case 23:this.$=me[ge];break;case 24:this.$=me[ge-1]+""+me[ge];break;case 26:this.$=me[ge-1]+me[ge];break;case 27:this.$=[me[ge].trim()];break;case 28:me[ge-2].push(me[ge].trim()),this.$=me[ge-2];break;case 29:this.$=me[ge-4],be.addClass(me[ge-2],me[ge]);break;case 37:this.$=[];break;case 42:this.$=me[ge].trim(),be.setDiagramTitle(this.$);break;case 43:this.$=me[ge].trim(),be.setAccTitle(this.$);break;case 44:case 45:this.$=me[ge].trim(),be.setAccDescription(this.$);break;case 46:be.addSection(me[ge].substr(8)),this.$=me[ge].substr(8);break;case 47:be.addPoint(me[ge-3],"",me[ge-1],me[ge],[]);break;case 48:be.addPoint(me[ge-4],me[ge-3],me[ge-1],me[ge],[]);break;case 49:be.addPoint(me[ge-4],"",me[ge-2],me[ge-1],me[ge]);break;case 50:be.addPoint(me[ge-5],me[ge-4],me[ge-2],me[ge-1],me[ge]);break;case 51:be.setXAxisLeftText(me[ge-2]),be.setXAxisRightText(me[ge]);break;case 52:me[ge-1].text+=" \u27F6 ",be.setXAxisLeftText(me[ge-1]);break;case 53:be.setXAxisLeftText(me[ge]);break;case 54:be.setYAxisBottomText(me[ge-2]),be.setYAxisTopText(me[ge]);break;case 55:me[ge-1].text+=" \u27F6 ",be.setYAxisBottomText(me[ge-1]);break;case 56:be.setYAxisBottomText(me[ge]);break;case 57:be.setQuadrant1Text(me[ge]);break;case 58:be.setQuadrant2Text(me[ge]);break;case 59:be.setQuadrant3Text(me[ge]);break;case 60:be.setQuadrant4Text(me[ge]);break;case 64:this.$={text:me[ge],type:"text"};break;case 65:this.$={text:me[ge-1].text+""+me[ge],type:me[ge-1].type};break;case 66:this.$={text:me[ge],type:"text"};break;case 67:this.$={text:me[ge],type:"markdown"};break;case 68:this.$=me[ge];break;case 69:this.$=me[ge-1]+""+me[ge];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(u,h,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:E,41:w,42:k,48:S,50:A,51:L,52:I,53:N,54:C,60:_,61:D,63:M,64:R,65:P,66:B,67:F}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(u,[2,37]),t(u,h,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:E,41:w,42:k,48:S,50:A,51:L,52:I,53:N,54:C,60:_,61:D,63:M,64:R,65:P,66:B,67:F}),t(u,[2,39]),t(u,[2,40]),t(u,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(u,[2,45]),t(u,[2,46]),{18:[1,50]},{4:f,5:d,10:p,12:m,13:g,14:y,43:51,58:31,60:_,61:D,63:M,64:R,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:52,58:31,60:_,61:D,63:M,64:R,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:53,58:31,60:_,61:D,63:M,64:R,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:54,58:31,60:_,61:D,63:M,64:R,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:55,58:31,60:_,61:D,63:M,64:R,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:56,58:31,60:_,61:D,63:M,64:R,65:P,66:B,67:F},{4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,44:[1,57],47:[1,58],58:60,59:59,63:M,64:R,65:P,66:B,67:F},t(V,[2,64]),t(V,[2,66]),t(V,[2,67]),t(V,[2,70]),t(V,[2,71]),t(V,[2,72]),t(V,[2,73]),t(V,[2,74]),t(V,[2,75]),t(V,[2,76]),t(V,[2,77]),t(V,[2,78]),t(V,[2,79]),t(V,[2,80]),t(s,[2,35]),t(u,[2,38]),t(u,[2,42]),t(u,[2,43]),t(u,[2,44]),{3:64,4:X,5:Q,6:H,7:ie,8:Y,9:le,10:ee,11:J,12:te,13:Z,14:xe,15:de,21:63},t(u,[2,53],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,49:[1,77],63:M,64:R,65:P,66:B,67:F}),t(u,[2,56],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,49:[1,78],63:M,64:R,65:P,66:B,67:F}),t(u,[2,57],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:M,64:R,65:P,66:B,67:F}),t(u,[2,58],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:M,64:R,65:P,66:B,67:F}),t(u,[2,59],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:M,64:R,65:P,66:B,67:F}),t(u,[2,60],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:M,64:R,65:P,66:B,67:F}),{45:[1,79]},{44:[1,80]},t(V,[2,65]),t(V,[2,81]),t(V,[2,82]),t(V,[2,83]),{3:82,4:X,5:Q,6:H,7:ie,8:Y,9:le,10:ee,11:J,12:te,13:Z,14:xe,15:de,18:[1,81]},t(Se,[2,23]),t(Se,[2,1]),t(Se,[2,2]),t(Se,[2,3]),t(Se,[2,4]),t(Se,[2,5]),t(Se,[2,6]),t(Se,[2,7]),t(Se,[2,8]),t(Se,[2,9]),t(Se,[2,10]),t(Se,[2,11]),t(Se,[2,12]),t(u,[2,52],{58:31,43:83,4:f,5:d,10:p,12:m,13:g,14:y,60:_,61:D,63:M,64:R,65:P,66:B,67:F}),t(u,[2,55],{58:31,43:84,4:f,5:d,10:p,12:m,13:g,14:y,60:_,61:D,63:M,64:R,65:P,66:B,67:F}),{46:[1,85]},{45:[1,86]},{4:Me,5:ke,6:we,8:_e,11:$e,13:fe,16:89,17:Ke,18:Te,19:Be,20:Ue,22:88,23:87},t(Se,[2,24]),t(u,[2,51],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:M,64:R,65:P,66:B,67:F}),t(u,[2,54],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:M,64:R,65:P,66:B,67:F}),t(u,[2,47],{22:88,16:89,23:100,4:Me,5:ke,6:we,8:_e,11:$e,13:fe,17:Ke,18:Te,19:Be,20:Ue}),{46:[1,101]},t(u,[2,29],{10:Ge}),t(Ne,[2,27],{16:103,4:Me,5:ke,6:we,8:_e,11:$e,13:fe,17:Ke,18:Te,19:Be,20:Ue}),t(We,[2,25]),t(We,[2,13]),t(We,[2,14]),t(We,[2,15]),t(We,[2,16]),t(We,[2,17]),t(We,[2,18]),t(We,[2,19]),t(We,[2,20]),t(We,[2,21]),t(We,[2,22]),t(u,[2,49],{10:Ge}),t(u,[2,48],{22:88,16:89,23:104,4:Me,5:ke,6:we,8:_e,11:$e,13:fe,17:Ke,18:Te,19:Be,20:Ue}),{4:Me,5:ke,6:we,8:_e,11:$e,13:fe,16:89,17:Ke,18:Te,19:Be,20:Ue,22:105},t(We,[2,26]),t(u,[2,50],{10:Ge}),t(Ne,[2,28],{16:103,4:Me,5:ke,6:we,8:_e,11:$e,13:fe,17:Ke,18:Te,19:Be,20:Ue})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(z,ne){if(ne.recoverable)this.trace(z);else{var se=new Error(z);throw se.hash=ne,se}},"parseError"),parse:o(function(z){var ne=this,se=[0],be=[],pe=[null],me=[],Re=this.table,ge="",Ie=0,qe=0,Pe=0,Xe=2,oe=1,et=me.slice.call(arguments,1),he=Object.create(this.lexer),ot={yy:{}};for(var Dt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Dt)&&(ot.yy[Dt]=this.yy[Dt]);he.setInput(z,ot.yy),ot.yy.lexer=he,ot.yy.parser=this,typeof he.yylloc>"u"&&(he.yylloc={});var It=he.yylloc;me.push(It);var wt=he.options&&he.options.ranges;typeof ot.yy.parseError=="function"?this.parseError=ot.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Rt(mt){se.length=se.length-2*mt,pe.length=pe.length-mt,me.length=me.length-mt}o(Rt,"popStack");function it(){var mt;return mt=be.pop()||he.lex()||oe,typeof mt!="number"&&(mt instanceof Array&&(be=mt,mt=be.pop()),mt=ne.symbols_[mt]||mt),mt}o(it,"lex");for(var at,Ct,yt,dt,Ht,cr,Kt={},kr,ur,tr,hr;;){if(yt=se[se.length-1],this.defaultActions[yt]?dt=this.defaultActions[yt]:((at===null||typeof at>"u")&&(at=it()),dt=Re[yt]&&Re[yt][at]),typeof dt>"u"||!dt.length||!dt[0]){var _n="";hr=[];for(kr in Re[yt])this.terminals_[kr]&&kr>Xe&&hr.push("'"+this.terminals_[kr]+"'");he.showPosition?_n="Parse error on line "+(Ie+1)+`: -`+he.showPosition()+` -Expecting `+hr.join(", ")+", got '"+(this.terminals_[at]||at)+"'":_n="Parse error on line "+(Ie+1)+": Unexpected "+(at==oe?"end of input":"'"+(this.terminals_[at]||at)+"'"),this.parseError(_n,{text:he.match,token:this.terminals_[at]||at,line:he.yylineno,loc:It,expected:hr})}if(dt[0]instanceof Array&&dt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+yt+", token: "+at);switch(dt[0]){case 1:se.push(at),pe.push(he.yytext),me.push(he.yylloc),se.push(dt[1]),at=null,Ct?(at=Ct,Ct=null):(qe=he.yyleng,ge=he.yytext,Ie=he.yylineno,It=he.yylloc,Pe>0&&Pe--);break;case 2:if(ur=this.productions_[dt[1]][1],Kt.$=pe[pe.length-ur],Kt._$={first_line:me[me.length-(ur||1)].first_line,last_line:me[me.length-1].last_line,first_column:me[me.length-(ur||1)].first_column,last_column:me[me.length-1].last_column},wt&&(Kt._$.range=[me[me.length-(ur||1)].range[0],me[me.length-1].range[1]]),cr=this.performAction.apply(Kt,[ge,qe,Ie,ot.yy,dt[1],pe,me].concat(et)),typeof cr<"u")return cr;ur&&(se=se.slice(0,-1*ur*2),pe=pe.slice(0,-1*ur),me=me.slice(0,-1*ur)),se.push(this.productions_[dt[1]][0]),pe.push(Kt.$),me.push(Kt._$),tr=Re[se[se.length-2]][se[se.length-1]],se.push(tr);break;case 3:return!0}}return!0},"parse")},ae=(function(){var ce={EOF:1,parseError:o(function(ne,se){if(this.yy.parser)this.yy.parser.parseError(ne,se);else throw new Error(ne)},"parseError"),setInput:o(function(z,ne){return this.yy=ne||this.yy||{},this._input=z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var z=this._input[0];this.yytext+=z,this.yyleng++,this.offset++,this.match+=z,this.matched+=z;var ne=z.match(/(?:\r\n?|\n).*/g);return ne?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),z},"input"),unput:o(function(z){var ne=z.length,se=z.split(/(?:\r\n?|\n)/g);this._input=z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ne),this.offset-=ne;var be=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),se.length-1&&(this.yylineno-=se.length-1);var pe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:se?(se.length===be.length?this.yylloc.first_column:0)+be[be.length-se.length].length-se[0].length:this.yylloc.first_column-ne},this.options.ranges&&(this.yylloc.range=[pe[0],pe[0]+this.yyleng-ne]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(z){this.unput(this.match.slice(z))},"less"),pastInput:o(function(){var z=this.matched.substr(0,this.matched.length-this.match.length);return(z.length>20?"...":"")+z.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var z=this.match;return z.length<20&&(z+=this._input.substr(0,20-z.length)),(z.substr(0,20)+(z.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var z=this.pastInput(),ne=new Array(z.length+1).join("-");return z+this.upcomingInput()+` -`+ne+"^"},"showPosition"),test_match:o(function(z,ne){var se,be,pe;if(this.options.backtrack_lexer&&(pe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(pe.yylloc.range=this.yylloc.range.slice(0))),be=z[0].match(/(?:\r\n?|\n).*/g),be&&(this.yylineno+=be.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:be?be[be.length-1].length-be[be.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+z[0].length},this.yytext+=z[0],this.match+=z[0],this.matches=z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(z[0].length),this.matched+=z[0],se=this.performAction.call(this,this.yy,this,ne,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),se)return se;if(this._backtrack){for(var me in pe)this[me]=pe[me];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var z,ne,se,be;this._more||(this.yytext="",this.match="");for(var pe=this._currentRules(),me=0;mene[0].length)){if(ne=se,be=me,this.options.backtrack_lexer){if(z=this.test_match(se,pe[me]),z!==!1)return z;if(this._backtrack){ne=!1;continue}else return!1}else if(!this.options.flex)break}return ne?(z=this.test_match(ne,pe[be]),z!==!1?z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var ne=this.next();return ne||this.lex()},"lex"),begin:o(function(ne){this.conditionStack.push(ne)},"begin"),popState:o(function(){var ne=this.conditionStack.length-1;return ne>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(ne){return ne=this.conditionStack.length-1-Math.abs(ne||0),ne>=0?this.conditionStack[ne]:"INITIAL"},"topState"),pushState:o(function(ne){this.begin(ne)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(ne,se,be,pe){var me=pe;switch(be){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return ce})();j.lexer=ae;function U(){this.yy={}}return o(U,"Parser"),U.prototype=j,j.Parser=U,new U})();zq.parser=zq;R3e=zq});var Ws,R7,N3e=O(()=>{"use strict";Ar();La();xt();y2();Ws=yf(),R7=class{constructor(){this.classes=new Map;this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{o(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:gr.quadrantChart?.chartWidth||500,chartWidth:gr.quadrantChart?.chartHeight||500,titlePadding:gr.quadrantChart?.titlePadding||10,titleFontSize:gr.quadrantChart?.titleFontSize||20,quadrantPadding:gr.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:gr.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:gr.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:gr.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:gr.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:gr.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:gr.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:gr.quadrantChart?.pointTextPadding||5,pointLabelFontSize:gr.quadrantChart?.pointLabelFontSize||12,pointRadius:gr.quadrantChart?.pointRadius||5,xAxisPosition:gr.quadrantChart?.xAxisPosition||"top",yAxisPosition:gr.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:gr.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:gr.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:Ws.quadrant1Fill,quadrant2Fill:Ws.quadrant2Fill,quadrant3Fill:Ws.quadrant3Fill,quadrant4Fill:Ws.quadrant4Fill,quadrant1TextFill:Ws.quadrant1TextFill,quadrant2TextFill:Ws.quadrant2TextFill,quadrant3TextFill:Ws.quadrant3TextFill,quadrant4TextFill:Ws.quadrant4TextFill,quadrantPointFill:Ws.quadrantPointFill,quadrantPointTextFill:Ws.quadrantPointTextFill,quadrantXAxisTextFill:Ws.quadrantXAxisTextFill,quadrantYAxisTextFill:Ws.quadrantYAxisTextFill,quadrantTitleFill:Ws.quadrantTitleFill,quadrantInternalBorderStrokeFill:Ws.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:Ws.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,K.info("clear called")}setData(e){this.data={...this.data,...e}}addPoints(e){this.data.points=[...e,...this.data.points]}addClass(e,r){this.classes.set(e,r)}setConfig(e){K.trace("setConfig called with: ",e),this.config={...this.config,...e}}setThemeConfig(e){K.trace("setThemeConfig called with: ",e),this.themeConfig={...this.themeConfig,...e}}calculateSpace(e,r,n,i){let a=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,s={top:e==="top"&&r?a:0,bottom:e==="bottom"&&r?a:0},l=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,u={left:this.config.yAxisPosition==="left"&&n?l:0,right:this.config.yAxisPosition==="right"&&n?l:0},h=this.config.titleFontSize+this.config.titlePadding*2,f={top:i?h:0},d=this.config.quadrantPadding+u.left,p=this.config.quadrantPadding+s.top+f.top,m=this.config.chartWidth-this.config.quadrantPadding*2-u.left-u.right,g=this.config.chartHeight-this.config.quadrantPadding*2-s.top-s.bottom-f.top,y=m/2,v=g/2;return{xAxisSpace:s,yAxisSpace:u,titleSpace:f,quadrantSpace:{quadrantLeft:d,quadrantTop:p,quadrantWidth:m,quadrantHalfWidth:y,quadrantHeight:g,quadrantHalfHeight:v}}}getAxisLabels(e,r,n,i){let{quadrantSpace:a,titleSpace:s}=i,{quadrantHalfHeight:l,quadrantHeight:u,quadrantLeft:h,quadrantHalfWidth:f,quadrantTop:d,quadrantWidth:p}=a,m=!!this.data.xAxisRightText,g=!!this.data.yAxisTopText,y=[];return this.data.xAxisLeftText&&r&&y.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&r&&y.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+f+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&n&&y.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+u-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&n&&y.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+l-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),y}getQuadrants(e){let{quadrantSpace:r}=e,{quadrantHalfHeight:n,quadrantLeft:i,quadrantHalfWidth:a,quadrantTop:s}=r,l=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s,width:a,height:n,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s,width:a,height:n,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant4Fill}];for(let u of l)u.text.x=u.x+u.width/2,this.data.points.length===0?(u.text.y=u.y+u.height/2,u.text.horizontalPos="middle"):(u.text.y=u.y+this.config.quadrantTextTopPadding,u.text.horizontalPos="top");return l}getQuadrantPoints(e){let{quadrantSpace:r}=e,{quadrantHeight:n,quadrantLeft:i,quadrantTop:a,quadrantWidth:s}=r,l=sc().domain([0,1]).range([i,s+i]),u=sc().domain([0,1]).range([n+a,a]);return this.data.points.map(f=>{let d=this.classes.get(f.className);return d&&(f={...d,...f}),{x:l(f.x),y:u(f.y),fill:f.color??this.themeConfig.quadrantPointFill,radius:f.radius??this.config.pointRadius,text:{text:f.text,fill:this.themeConfig.quadrantPointTextFill,x:l(f.x),y:u(f.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:f.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:f.strokeWidth??"0px"}})}getBorders(e){let r=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:n}=e,{quadrantHalfHeight:i,quadrantHeight:a,quadrantLeft:s,quadrantHalfWidth:l,quadrantTop:u,quadrantWidth:h}=n;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u,x2:s+h+r,y2:u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+h,y1:u+r,x2:s+h,y2:u+a-r},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u+a,x2:s+h+r,y2:u+a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:u+r,x2:s,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+l,y1:u+r,x2:s+l,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:u+i,x2:s+h-r,y2:u+i}]}getTitle(e){if(e)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let e=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),r=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),n=this.config.showTitle&&!!this.data.titleText,i=this.data.points.length>0?"bottom":this.config.xAxisPosition,a=this.calculateSpace(i,e,r,n);return{points:this.getQuadrantPoints(a),quadrants:this.getQuadrants(a),axisLabels:this.getAxisLabels(i,e,r,a),borderLines:this.getBorders(a),title:this.getTitle(n)}}}});function Gq(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function M3e(t){return!/^\d+$/.test(t)}function I3e(t){return!/^\d+px$/.test(t)}var Hm,O3e=O(()=>{"use strict";Hm=class extends Error{static{o(this,"InvalidStyleError")}constructor(e,r,n){super(`value for ${e} ${r} is invalid, please use a valid ${n}`),this.name="InvalidStyleError"}};o(Gq,"validateHexCode");o(M3e,"validateNumber");o(I3e,"validateSizeInPixels")});function of(t){return wr(t.trim(),Uot)}function Wot(t){Ka.setData({quadrant1Text:of(t.text)})}function Hot(t){Ka.setData({quadrant2Text:of(t.text)})}function Yot(t){Ka.setData({quadrant3Text:of(t.text)})}function jot(t){Ka.setData({quadrant4Text:of(t.text)})}function Xot(t){Ka.setData({xAxisLeftText:of(t.text)})}function Kot(t){Ka.setData({xAxisRightText:of(t.text)})}function Qot(t){Ka.setData({yAxisTopText:of(t.text)})}function Zot(t){Ka.setData({yAxisBottomText:of(t.text)})}function Vq(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(M3e(i))throw new Hm(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if(Gq(i))throw new Hm(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if(Gq(i))throw new Hm(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if(I3e(i))throw new Hm(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function Jot(t,e,r,n,i){let a=Vq(i);Ka.addPoints([{x:r,y:n,text:of(t.text),className:e,...a}])}function elt(t,e){Ka.addClass(t,Vq(e))}function tlt(t){Ka.setConfig({chartWidth:t})}function rlt(t){Ka.setConfig({chartHeight:t})}function nlt(){let t=ve(),{themeVariables:e,quadrantChart:r}=t;return r&&Ka.setConfig(r),Ka.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),Ka.setData({titleText:Fr()}),Ka.build()}var Uot,Ka,ilt,P3e,B3e=O(()=>{"use strict";jt();Ur();si();N3e();O3e();Uot=ve();o(of,"textSanitizer");Ka=new R7;o(Wot,"setQuadrant1Text");o(Hot,"setQuadrant2Text");o(Yot,"setQuadrant3Text");o(jot,"setQuadrant4Text");o(Xot,"setXAxisLeftText");o(Kot,"setXAxisRightText");o(Qot,"setYAxisTopText");o(Zot,"setYAxisBottomText");o(Vq,"parseStyles");o(Jot,"addPoint");o(elt,"addClass");o(tlt,"setWidth");o(rlt,"setHeight");o(nlt,"getQuadrantData");ilt=o(function(){Ka.clear(),_r()},"clear"),P3e={setWidth:tlt,setHeight:rlt,setQuadrant1Text:Wot,setQuadrant2Text:Hot,setQuadrant3Text:Yot,setQuadrant4Text:jot,setXAxisLeftText:Xot,setXAxisRightText:Kot,setYAxisTopText:Qot,setYAxisBottomText:Zot,parseStyles:Vq,addPoint:Jot,addClass:elt,getQuadrantData:nlt,clear:ilt,setAccTitle:Lr,getAccTitle:Or,setDiagramTitle:zr,getDiagramTitle:Fr,getAccDescription:Br,setAccDescription:Pr}});var alt,F3e,$3e=O(()=>{"use strict";Ar();jt();xt();Ti();alt=o((t,e,r,n)=>{function i(A){return A==="top"?"hanging":"middle"}o(i,"getDominantBaseLine");function a(A){return A==="left"?"start":"middle"}o(a,"getTextAnchor");function s(A){return`translate(${A.x}, ${A.y}) rotate(${A.rotation||0})`}o(s,"getTransformation");let l=ve();K.debug(`Rendering quadrant chart -`+t);let u=l.securityLevel,h;u==="sandbox"&&(h=je("#i"+e));let d=(u==="sandbox"?je(h.nodes()[0].contentDocument.body):je("body")).select(`[id="${e}"]`),p=d.append("g").attr("class","main"),m=l.quadrantChart?.chartWidth??500,g=l.quadrantChart?.chartHeight??500;Zr(d,g,m,l.quadrantChart?.useMaxWidth??!0),d.attr("viewBox","0 0 "+m+" "+g),n.db.setHeight(g),n.db.setWidth(m);let y=n.db.getQuadrantData(),v=p.append("g").attr("class","quadrants"),x=p.append("g").attr("class","border"),b=p.append("g").attr("class","data-points"),T=p.append("g").attr("class","labels"),E=p.append("g").attr("class","title");y.title&&E.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",i(y.title.horizontalPos)).attr("text-anchor",a(y.title.verticalPos)).attr("transform",s(y.title)).text(y.title.text),y.borderLines&&x.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",A=>A.x1).attr("y1",A=>A.y1).attr("x2",A=>A.x2).attr("y2",A=>A.y2).style("stroke",A=>A.strokeFill).style("stroke-width",A=>A.strokeWidth);let w=v.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");w.append("rect").attr("x",A=>A.x).attr("y",A=>A.y).attr("width",A=>A.width).attr("height",A=>A.height).attr("fill",A=>A.fill),w.append("text").attr("x",0).attr("y",0).attr("fill",A=>A.text.fill).attr("font-size",A=>A.text.fontSize).attr("dominant-baseline",A=>i(A.text.horizontalPos)).attr("text-anchor",A=>a(A.text.verticalPos)).attr("transform",A=>s(A.text)).text(A=>A.text.text),T.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(A=>A.text).attr("fill",A=>A.fill).attr("font-size",A=>A.fontSize).attr("dominant-baseline",A=>i(A.horizontalPos)).attr("text-anchor",A=>a(A.verticalPos)).attr("transform",A=>s(A));let S=b.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");S.append("circle").attr("cx",A=>A.x).attr("cy",A=>A.y).attr("r",A=>A.radius).attr("fill",A=>A.fill).attr("stroke",A=>A.strokeColor).attr("stroke-width",A=>A.strokeWidth),S.append("text").attr("x",0).attr("y",0).text(A=>A.text.text).attr("fill",A=>A.text.fill).attr("font-size",A=>A.text.fontSize).attr("dominant-baseline",A=>i(A.text.horizontalPos)).attr("text-anchor",A=>a(A.text.verticalPos)).attr("transform",A=>s(A.text))},"draw"),F3e={draw:alt}});var z3e={};vr(z3e,{diagram:()=>slt});var slt,G3e=O(()=>{"use strict";L3e();B3e();$3e();slt={parser:R3e,db:P3e,renderer:F3e,styles:o(()=>"","styles")}});var qq,U3e,W3e=O(()=>{"use strict";qq=(function(){var t=o(function(M,R,P,B){for(P=P||{},B=M.length;B--;P[M[B]]=R);return P},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],l=[1,5,10,12,14,16,18,19,21,23,34,35,36],u=[1,25],h=[1,26],f=[1,28],d=[1,29],p=[1,30],m=[1,31],g=[1,32],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],E=[1,43],w=[1,42],k=[1,47],S=[1,50],A=[1,10,12,14,16,18,19,21,23,34,35,36],L=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],I=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],N=[1,64],C={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:o(function(R,P,B,F,G,$,V){var X=$.length-1;switch(G){case 5:F.setOrientation($[X]);break;case 9:F.setDiagramTitle($[X].text.trim());break;case 12:F.setLineData({text:"",type:"text"},$[X]);break;case 13:F.setLineData($[X-1],$[X]);break;case 14:F.setBarData({text:"",type:"text"},$[X]);break;case 15:F.setBarData($[X-1],$[X]);break;case 16:this.$=$[X].trim(),F.setAccTitle(this.$);break;case 17:case 18:this.$=$[X].trim(),F.setAccDescription(this.$);break;case 19:this.$=$[X-1];break;case 20:this.$=[Number($[X-2]),...$[X]];break;case 21:this.$=[Number($[X])];break;case 22:F.setXAxisTitle($[X]);break;case 23:F.setXAxisTitle($[X-1]);break;case 24:F.setXAxisTitle({type:"text",text:""});break;case 25:F.setXAxisBand($[X]);break;case 26:F.setXAxisRangeData(Number($[X-2]),Number($[X]));break;case 27:this.$=$[X-1];break;case 28:this.$=[$[X-2],...$[X]];break;case 29:this.$=[$[X]];break;case 30:F.setYAxisTitle($[X]);break;case 31:F.setYAxisTitle($[X-1]);break;case 32:F.setYAxisTitle({type:"text",text:""});break;case 33:F.setYAxisRangeData(Number($[X-2]),Number($[X]));break;case 37:this.$={text:$[X],type:"text"};break;case 38:this.$={text:$[X],type:"text"};break;case 39:this.$={text:$[X],type:"markdown"};break;case 40:this.$=$[X];break;case 41:this.$=$[X-1]+""+$[X];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(l,[2,34]),t(l,[2,35]),t(l,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(l,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:39,13:38,24:E,27:w,29:40,30:41,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:45,15:44,27:k,33:46,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:49,17:48,24:S,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:52,17:51,24:S,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{20:[1,53]},{22:[1,54]},t(A,[2,18]),{1:[2,2]},t(A,[2,8]),t(A,[2,9]),t(L,[2,37],{40:55,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T}),t(L,[2,38]),t(L,[2,39]),t(I,[2,40]),t(I,[2,42]),t(I,[2,43]),t(I,[2,44]),t(I,[2,45]),t(I,[2,46]),t(I,[2,47]),t(I,[2,48]),t(I,[2,49]),t(I,[2,50]),t(I,[2,51]),t(A,[2,10]),t(A,[2,22],{30:41,29:56,24:E,27:w}),t(A,[2,24]),t(A,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(A,[2,11]),t(A,[2,30],{33:60,27:k}),t(A,[2,32]),{31:[1,61]},t(A,[2,12]),{17:62,24:S},{25:63,27:N},t(A,[2,14]),{17:65,24:S},t(A,[2,16]),t(A,[2,17]),t(I,[2,41]),t(A,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(A,[2,31]),{27:[1,69]},t(A,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(A,[2,15]),t(A,[2,26]),t(A,[2,27]),{11:59,32:72,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(A,[2,33]),t(A,[2,19]),{25:73,27:N},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:o(function(R,P){if(P.recoverable)this.trace(R);else{var B=new Error(R);throw B.hash=P,B}},"parseError"),parse:o(function(R){var P=this,B=[0],F=[],G=[null],$=[],V=this.table,X="",Q=0,H=0,ie=0,Y=2,le=1,ee=$.slice.call(arguments,1),J=Object.create(this.lexer),te={yy:{}};for(var Z in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Z)&&(te.yy[Z]=this.yy[Z]);J.setInput(R,te.yy),te.yy.lexer=J,te.yy.parser=this,typeof J.yylloc>"u"&&(J.yylloc={});var xe=J.yylloc;$.push(xe);var de=J.options&&J.options.ranges;typeof te.yy.parseError=="function"?this.parseError=te.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Se(j){B.length=B.length-2*j,G.length=G.length-j,$.length=$.length-j}o(Se,"popStack");function Me(){var j;return j=F.pop()||J.lex()||le,typeof j!="number"&&(j instanceof Array&&(F=j,j=F.pop()),j=P.symbols_[j]||j),j}o(Me,"lex");for(var ke,we,_e,$e,fe,Ke,Te={},Be,Ue,Ge,Ne;;){if(_e=B[B.length-1],this.defaultActions[_e]?$e=this.defaultActions[_e]:((ke===null||typeof ke>"u")&&(ke=Me()),$e=V[_e]&&V[_e][ke]),typeof $e>"u"||!$e.length||!$e[0]){var We="";Ne=[];for(Be in V[_e])this.terminals_[Be]&&Be>Y&&Ne.push("'"+this.terminals_[Be]+"'");J.showPosition?We="Parse error on line "+(Q+1)+`: -`+J.showPosition()+` -Expecting `+Ne.join(", ")+", got '"+(this.terminals_[ke]||ke)+"'":We="Parse error on line "+(Q+1)+": Unexpected "+(ke==le?"end of input":"'"+(this.terminals_[ke]||ke)+"'"),this.parseError(We,{text:J.match,token:this.terminals_[ke]||ke,line:J.yylineno,loc:xe,expected:Ne})}if($e[0]instanceof Array&&$e.length>1)throw new Error("Parse Error: multiple actions possible at state: "+_e+", token: "+ke);switch($e[0]){case 1:B.push(ke),G.push(J.yytext),$.push(J.yylloc),B.push($e[1]),ke=null,we?(ke=we,we=null):(H=J.yyleng,X=J.yytext,Q=J.yylineno,xe=J.yylloc,ie>0&&ie--);break;case 2:if(Ue=this.productions_[$e[1]][1],Te.$=G[G.length-Ue],Te._$={first_line:$[$.length-(Ue||1)].first_line,last_line:$[$.length-1].last_line,first_column:$[$.length-(Ue||1)].first_column,last_column:$[$.length-1].last_column},de&&(Te._$.range=[$[$.length-(Ue||1)].range[0],$[$.length-1].range[1]]),Ke=this.performAction.apply(Te,[X,H,Q,te.yy,$e[1],G,$].concat(ee)),typeof Ke<"u")return Ke;Ue&&(B=B.slice(0,-1*Ue*2),G=G.slice(0,-1*Ue),$=$.slice(0,-1*Ue)),B.push(this.productions_[$e[1]][0]),G.push(Te.$),$.push(Te._$),Ge=V[B[B.length-2]][B[B.length-1]],B.push(Ge);break;case 3:return!0}}return!0},"parse")},_=(function(){var M={EOF:1,parseError:o(function(P,B){if(this.yy.parser)this.yy.parser.parseError(P,B);else throw new Error(P)},"parseError"),setInput:o(function(R,P){return this.yy=P||this.yy||{},this._input=R,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var R=this._input[0];this.yytext+=R,this.yyleng++,this.offset++,this.match+=R,this.matched+=R;var P=R.match(/(?:\r\n?|\n).*/g);return P?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),R},"input"),unput:o(function(R){var P=R.length,B=R.split(/(?:\r\n?|\n)/g);this._input=R+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-P),this.offset-=P;var F=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),B.length-1&&(this.yylineno-=B.length-1);var G=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:B?(B.length===F.length?this.yylloc.first_column:0)+F[F.length-B.length].length-B[0].length:this.yylloc.first_column-P},this.options.ranges&&(this.yylloc.range=[G[0],G[0]+this.yyleng-P]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(R){this.unput(this.match.slice(R))},"less"),pastInput:o(function(){var R=this.matched.substr(0,this.matched.length-this.match.length);return(R.length>20?"...":"")+R.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var R=this.match;return R.length<20&&(R+=this._input.substr(0,20-R.length)),(R.substr(0,20)+(R.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var R=this.pastInput(),P=new Array(R.length+1).join("-");return R+this.upcomingInput()+` -`+P+"^"},"showPosition"),test_match:o(function(R,P){var B,F,G;if(this.options.backtrack_lexer&&(G={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(G.yylloc.range=this.yylloc.range.slice(0))),F=R[0].match(/(?:\r\n?|\n).*/g),F&&(this.yylineno+=F.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:F?F[F.length-1].length-F[F.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+R[0].length},this.yytext+=R[0],this.match+=R[0],this.matches=R,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(R[0].length),this.matched+=R[0],B=this.performAction.call(this,this.yy,this,P,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),B)return B;if(this._backtrack){for(var $ in G)this[$]=G[$];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var R,P,B,F;this._more||(this.yytext="",this.match="");for(var G=this._currentRules(),$=0;$P[0].length)){if(P=B,F=$,this.options.backtrack_lexer){if(R=this.test_match(B,G[$]),R!==!1)return R;if(this._backtrack){P=!1;continue}else return!1}else if(!this.options.flex)break}return P?(R=this.test_match(P,G[F]),R!==!1?R:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var P=this.next();return P||this.lex()},"lex"),begin:o(function(P){this.conditionStack.push(P)},"begin"),popState:o(function(){var P=this.conditionStack.length-1;return P>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(P){return P=this.conditionStack.length-1-Math.abs(P||0),P>=0?this.conditionStack[P]:"INITIAL"},"topState"),pushState:o(function(P){this.begin(P)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(P,B,F,G){var $=G;switch(F){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 5;case 16:return 8;case 17:return this.pushState("axis_data"),"X_AXIS";break;case 18:return this.pushState("axis_data"),"Y_AXIS";break;case 19:return this.pushState("axis_band_data"),24;break;case 20:return 31;case 21:return this.pushState("data"),16;break;case 22:return this.pushState("data"),18;break;case 23:return this.pushState("data_inner"),24;break;case 24:return 27;case 25:return this.popState(),26;break;case 26:this.popState();break;case 27:this.pushState("string");break;case 28:this.popState();break;case 29:return"STR";case 30:return 24;case 31:return 26;case 32:return 43;case 33:return"COLON";case 34:return 44;case 35:return 28;case 36:return 45;case 37:return 46;case 38:return 48;case 39:return 50;case 40:return 47;case 41:return 41;case 42:return 49;case 43:return 42;case 44:break;case 45:return 35;case 46:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\})/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:xychart\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0}}};return M})();C.lexer=_;function D(){this.yy={}}return o(D,"Parser"),D.prototype=C,C.Parser=D,new D})();qq.parser=qq;U3e=qq});function Uq(t){return t.type==="bar"}function L7(t){return t.type==="band"}function Iv(t){return t.type==="linear"}var N7=O(()=>{"use strict";o(Uq,"isBarPlot");o(L7,"isBandAxisData");o(Iv,"isLinearAxisData")});var Ov,Wq=O(()=>{"use strict";co();Ov=class{constructor(e){this.parentGroup=e}static{o(this,"TextDimensionCalculatorWithFont")}getMaxDimension(e,r){if(!this.parentGroup)return{width:e.reduce((a,s)=>Math.max(s.length,a),0)*r,height:r};let n={width:0,height:0},i=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",r);for(let a of e){let s=gie(i,1,a),l=s?s.width:a.length*r,u=s?s.height:r;n.width=Math.max(n.width,l),n.height=Math.max(n.height,u)}return i.remove(),n}}});var Pv,Hq=O(()=>{"use strict";Pv=class{constructor(e,r,n,i){this.axisConfig=e;this.title=r;this.textDimensionCalculator=n;this.axisThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0};this.axisPosition="left";this.showTitle=!1;this.showLabel=!1;this.showTick=!1;this.showAxisLine=!1;this.outerPadding=0;this.titleTextHeight=0;this.labelTextHeight=0;this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{o(this,"BaseAxis")}setRange(e){this.range=e,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let r=e.height;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.width;this.outerPadding=Math.min(n.width/2,i);let a=n.height+this.axisConfig.labelPadding*2;this.labelTextHeight=n.height,a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-r}calculateSpaceIfDrawnVertical(e){let r=e.width;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.height;this.outerPadding=Math.min(n.height/2,i);let a=n.width+this.axisConfig.labelPadding*2;a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width-r,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${r},${this.boundingRect.y} L ${r},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(r),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let r=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${r},${this.getScaleValue(n)} L ${r-this.axisConfig.tickLength},${this.getScaleValue(n)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r} L ${this.getScaleValue(n)},${r+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y;e.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(n)},${r+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}});var M7,H3e=O(()=>{"use strict";Ar();xt();Hq();M7=class extends Pv{static{o(this,"BandAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.categories=n,this.scale=Og().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=Og().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),K.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}}});var I7,Y3e=O(()=>{"use strict";Ar();Hq();I7=class extends Pv{static{o(this,"LinearAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.domain=n,this.scale=sc().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition==="left"&&e.reverse(),this.scale=sc().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}}});function Yq(t,e,r,n){let i=new Ov(n);return L7(t)?new M7(e,r,t.categories,t.title,i):new I7(e,r,[t.min,t.max],t.title,i)}var j3e=O(()=>{"use strict";N7();Wq();H3e();Y3e();o(Yq,"getAxis")});function X3e(t,e,r,n){let i=new Ov(n);return new jq(i,t,e,r)}var jq,K3e=O(()=>{"use strict";Wq();jq=class{constructor(e,r,n,i){this.textDimensionCalculator=e;this.chartConfig=r;this.chartData=n;this.chartThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{o(this,"ChartTitle")}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let r=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(r.width,e.width),i=r.height+2*this.chartConfig.titlePadding;return r.width<=n&&r.height<=i&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=i,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};o(X3e,"getChartTitleComponent")});var O7,Q3e=O(()=>{"use strict";Ar();O7=class{constructor(e,r,n,i,a){this.plotData=e;this.xAxis=r;this.yAxis=n;this.orientation=i;this.plotIndex=a}static{o(this,"LinePlot")}getDrawableElement(){let e=this.plotData.data.map(n=>[this.xAxis.getScaleValue(n[0]),this.yAxis.getScaleValue(n[1])]),r;return this.orientation==="horizontal"?r=hc().y(n=>n[0]).x(n=>n[1])(e):r=hc().x(n=>n[0]).y(n=>n[1])(e),r?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:r,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}});var P7,Z3e=O(()=>{"use strict";P7=class{constructor(e,r,n,i,a,s){this.barData=e;this.boundingRect=r;this.xAxis=n;this.yAxis=i;this.orientation=a;this.plotIndex=s}static{o(this,"BarPlot")}getDrawableElement(){let e=this.barData.data.map(a=>[this.xAxis.getScaleValue(a[0]),this.yAxis.getScaleValue(a[1])]),n=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),i=n/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:this.boundingRect.x,y:a[0]-i,height:n,width:a[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:a[0]-i,y:a[1],width:n,height:this.boundingRect.y+this.boundingRect.height-a[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}});function J3e(t,e,r){return new Xq(t,e,r)}var Xq,ewe=O(()=>{"use strict";Q3e();Z3e();Xq=class{constructor(e,r,n){this.chartConfig=e;this.chartData=r;this.chartThemeConfig=n;this.boundingRect={x:0,y:0,width:0,height:0}}static{o(this,"BasePlot")}setAxes(e,r){this.xAxis=e,this.yAxis=r}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let e=[];for(let[r,n]of this.chartData.plots.entries())switch(n.type){case"line":{let i=new O7(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break;case"bar":{let i=new P7(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break}return e}};o(J3e,"getPlotComponent")});var B7,twe=O(()=>{"use strict";j3e();K3e();ewe();N7();B7=class{constructor(e,r,n,i){this.chartConfig=e;this.chartData=r;this.componentStore={title:X3e(e,r,n,i),plot:J3e(e,r,n),xAxis:Yq(r.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},i),yAxis:Yq(r.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},i)}}static{o(this,"Orchestrator")}calculateVerticalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),l=this.componentStore.plot.calculateSpace({width:a,height:s});e-=l.width,r-=l.height,l=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),i=l.height,r-=l.height,this.componentStore.xAxis.setAxisPosition("bottom"),l=this.componentStore.xAxis.calculateSpace({width:e,height:r}),r-=l.height,this.componentStore.yAxis.setAxisPosition("left"),l=this.componentStore.yAxis.calculateSpace({width:e,height:r}),n=l.width,e-=l.width,e>0&&(a+=e,e=0),r>0&&(s+=r,r=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:i+s}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(u=>Uq(u))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=0,s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),l=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),u=this.componentStore.plot.calculateSpace({width:s,height:l});e-=u.width,r-=u.height,u=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),n=u.height,r-=u.height,this.componentStore.xAxis.setAxisPosition("left"),u=this.componentStore.xAxis.calculateSpace({width:e,height:r}),e-=u.width,i=u.width,this.componentStore.yAxis.setAxisPosition("top"),u=this.componentStore.yAxis.calculateSpace({width:e,height:r}),r-=u.height,a=n+u.height,e>0&&(s+=e,e=0),r>0&&(l+=r,r=0),this.componentStore.plot.calculateSpace({width:s,height:l}),this.componentStore.plot.setBoundingBoxXY({x:i,y:a}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:i,y:n}),this.componentStore.xAxis.setRange([a,a+l]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(h=>Uq(h))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let r of Object.values(this.componentStore))e.push(...r.getDrawableElements());return e}}});var F7,rwe=O(()=>{"use strict";twe();F7=class{static{o(this,"XYChartBuilder")}static build(e,r,n,i){return new B7(e,r,n,i).getDrawableElement()}}});function iwe(){let t=yf(),e=Zt();return Pn(t.xyChart,e.themeVariables.xyChart)}function awe(){let t=Zt();return Pn(gr.xyChart,t.xyChart)}function swe(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function Zq(t){let e=Zt();return wr(t.trim(),e)}function ult(t){nwe=t}function hlt(t){t==="horizontal"?f3.chartOrientation="horizontal":f3.chartOrientation="vertical"}function flt(t){An.xAxis.title=Zq(t.text)}function owe(t,e){An.xAxis={type:"linear",title:An.xAxis.title,min:t,max:e},$7=!0}function dlt(t){An.xAxis={type:"band",title:An.xAxis.title,categories:t.map(e=>Zq(e.text))},$7=!0}function plt(t){An.yAxis.title=Zq(t.text)}function mlt(t,e){An.yAxis={type:"linear",title:An.yAxis.title,min:t,max:e},Qq=!0}function glt(t){let e=Math.min(...t),r=Math.max(...t),n=Iv(An.yAxis)?An.yAxis.min:1/0,i=Iv(An.yAxis)?An.yAxis.max:-1/0;An.yAxis={type:"linear",title:An.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function lwe(t){let e=[];if(t.length===0)return e;if(!$7){let r=Iv(An.xAxis)?An.xAxis.min:1/0,n=Iv(An.xAxis)?An.xAxis.max:-1/0;owe(Math.min(r,1),Math.max(n,t.length))}if(Qq||glt(t),L7(An.xAxis)&&(e=An.xAxis.categories.map((r,n)=>[r,t[n]])),Iv(An.xAxis)){let r=An.xAxis.min,n=An.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,l)=>[s,t[l]])}return e}function cwe(t){return Kq[t===0?0:t%Kq.length]}function ylt(t,e){let r=lwe(e);An.plots.push({type:"line",strokeFill:cwe(h3),strokeWidth:2,data:r}),h3++}function vlt(t,e){let r=lwe(e);An.plots.push({type:"bar",fill:cwe(h3),data:r}),h3++}function xlt(){if(An.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return An.title=Fr(),F7.build(f3,An,d3,nwe)}function blt(){return d3}function Tlt(){return f3}function wlt(){return An}var h3,nwe,f3,d3,An,Kq,$7,Qq,klt,uwe,hwe=O(()=>{"use strict";$r();La();y2();ar();Ur();si();rwe();N7();h3=0,f3=awe(),d3=iwe(),An=swe(),Kq=d3.plotColorPalette.split(",").map(t=>t.trim()),$7=!1,Qq=!1;o(iwe,"getChartDefaultThemeConfig");o(awe,"getChartDefaultConfig");o(swe,"getChartDefaultData");o(Zq,"textSanitizer");o(ult,"setTmpSVGG");o(hlt,"setOrientation");o(flt,"setXAxisTitle");o(owe,"setXAxisRangeData");o(dlt,"setXAxisBand");o(plt,"setYAxisTitle");o(mlt,"setYAxisRangeData");o(glt,"setYAxisRangeFromPlotData");o(lwe,"transformDataWithoutCategory");o(cwe,"getPlotColorFromPalette");o(ylt,"setLineData");o(vlt,"setBarData");o(xlt,"getDrawableElem");o(blt,"getChartThemeConfig");o(Tlt,"getChartConfig");o(wlt,"getXYChartData");klt=o(function(){_r(),h3=0,f3=awe(),An=swe(),d3=iwe(),Kq=d3.plotColorPalette.split(",").map(t=>t.trim()),$7=!1,Qq=!1},"clear"),uwe={getDrawableElem:xlt,clear:klt,setAccTitle:Lr,getAccTitle:Or,setDiagramTitle:zr,getDiagramTitle:Fr,getAccDescription:Br,setAccDescription:Pr,setOrientation:hlt,setXAxisTitle:flt,setXAxisRangeData:owe,setXAxisBand:dlt,setYAxisTitle:plt,setYAxisRangeData:mlt,setLineData:ylt,setBarData:vlt,setTmpSVGG:ult,getChartThemeConfig:blt,getChartConfig:Tlt,getXYChartData:wlt}});var Elt,fwe,dwe=O(()=>{"use strict";xt();Ul();Ti();Elt=o((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig(),l=i.getXYChartData().plots[0].data.map(T=>T[1]);function u(T){return T==="top"?"text-before-edge":"middle"}o(u,"getDominantBaseLine");function h(T){return T==="left"?"start":T==="right"?"end":"middle"}o(h,"getTextAnchor");function f(T){return`translate(${T.x}, ${T.y}) rotate(${T.rotation||0})`}o(f,"getTextTransformation"),K.debug(`Rendering xychart chart -`+t);let d=Ii(e),p=d.append("g").attr("class","main"),m=p.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");Zr(d,s.height,s.width,!0),d.attr("viewBox",`0 0 ${s.width} ${s.height}`),m.attr("fill",a.backgroundColor),i.setTmpSVGG(d.append("g").attr("class","mermaid-tmp-group"));let g=i.getDrawableElem(),y={};function v(T){let E=p,w="";for(let[k]of T.entries()){let S=p;k>0&&y[w]&&(S=y[w]),w+=T[k],E=y[w],E||(E=y[w]=S.append("g").attr("class",T[k]))}return E}o(v,"getGroup");for(let T of g){if(T.data.length===0)continue;let E=v(T.groupTexts);switch(T.type){case"rect":if(E.selectAll("rect").data(T.data).enter().append("rect").attr("x",w=>w.x).attr("y",w=>w.y).attr("width",w=>w.width).attr("height",w=>w.height).attr("fill",w=>w.fill).attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth),s.showDataLabel)if(s.chartOrientation==="horizontal"){let S=function(I,N){let{data:C,label:_}=I;return N*_.length*.7<=C.width-10};var x=S;o(S,"fitsHorizontally");let w=.7,k=T.data.map((I,N)=>({data:I,label:l[N].toString()})).filter(I=>I.data.width>0&&I.data.height>0),A=k.map(I=>{let{data:N}=I,C=N.height*.7;for(;!S(I,C)&&C>0;)C-=1;return C}),L=Math.floor(Math.min(...A));E.selectAll("text").data(k).enter().append("text").attr("x",I=>I.data.x+I.data.width-10).attr("y",I=>I.data.y+I.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${L}px`).text(I=>I.label)}else{let S=function(I,N,C){let{data:_,label:D}=I,R=N*D.length*.7,P=_.x+_.width/2,B=P-R/2,F=P+R/2,G=B>=_.x&&F<=_.x+_.width,$=_.y+C+N<=_.y+_.height;return G&&$};var b=S;o(S,"fitsInBar");let w=10,k=T.data.map((I,N)=>({data:I,label:l[N].toString()})).filter(I=>I.data.width>0&&I.data.height>0),A=k.map(I=>{let{data:N,label:C}=I,_=N.width/(C.length*.7);for(;!S(I,_,10)&&_>0;)_-=1;return _}),L=Math.floor(Math.min(...A));E.selectAll("text").data(k).enter().append("text").attr("x",I=>I.data.x+I.data.width/2).attr("y",I=>I.data.y+10).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${L}px`).text(I=>I.label)}break;case"text":E.selectAll("text").data(T.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",w=>w.fill).attr("font-size",w=>w.fontSize).attr("dominant-baseline",w=>u(w.verticalPos)).attr("text-anchor",w=>h(w.horizontalPos)).attr("transform",w=>f(w)).text(w=>w.text);break;case"path":E.selectAll("path").data(T.data).enter().append("path").attr("d",w=>w.path).attr("fill",w=>w.fill?w.fill:"none").attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth);break}}},"draw"),fwe={draw:Elt}});var pwe={};vr(pwe,{diagram:()=>Slt});var Slt,mwe=O(()=>{"use strict";W3e();hwe();dwe();Slt={parser:U3e,db:uwe,renderer:fwe}});var Jq,vwe,xwe=O(()=>{"use strict";Jq=(function(){var t=o(function(j,ae,U,ce){for(U=U||{},ce=j.length;ce--;U[j[ce]]=ae);return U},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],s=[1,22],l=[2,7],u=[1,26],h=[1,27],f=[1,28],d=[1,29],p=[1,33],m=[1,34],g=[1,35],y=[1,36],v=[1,37],x=[1,38],b=[1,24],T=[1,31],E=[1,32],w=[1,30],k=[1,39],S=[1,40],A=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],L=[1,61],I=[89,90],N=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],C=[27,29],_=[1,70],D=[1,71],M=[1,72],R=[1,73],P=[1,74],B=[1,75],F=[1,76],G=[1,83],$=[1,80],V=[1,84],X=[1,85],Q=[1,86],H=[1,87],ie=[1,88],Y=[1,89],le=[1,90],ee=[1,91],J=[1,92],te=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Z=[63,64],xe=[1,101],de=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],Se=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Me=[1,110],ke=[1,106],we=[1,107],_e=[1,108],$e=[1,109],fe=[1,111],Ke=[1,116],Te=[1,117],Be=[1,114],Ue=[1,115],Ge={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(ae,U,ce,z,ne,se,be){var pe=se.length-1;switch(ne){case 4:this.$=se[pe].trim(),z.setAccTitle(this.$);break;case 5:case 6:this.$=se[pe].trim(),z.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:z.setDirection("TB");break;case 18:z.setDirection("BT");break;case 19:z.setDirection("RL");break;case 20:z.setDirection("LR");break;case 21:z.addRequirement(se[pe-3],se[pe-4]);break;case 22:z.addRequirement(se[pe-5],se[pe-6]),z.setClass([se[pe-5]],se[pe-3]);break;case 23:z.setNewReqId(se[pe-2]);break;case 24:z.setNewReqText(se[pe-2]);break;case 25:z.setNewReqRisk(se[pe-2]);break;case 26:z.setNewReqVerifyMethod(se[pe-2]);break;case 29:this.$=z.RequirementType.REQUIREMENT;break;case 30:this.$=z.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=z.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=z.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=z.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=z.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=z.RiskLevel.LOW_RISK;break;case 36:this.$=z.RiskLevel.MED_RISK;break;case 37:this.$=z.RiskLevel.HIGH_RISK;break;case 38:this.$=z.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=z.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=z.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=z.VerifyType.VERIFY_TEST;break;case 42:z.addElement(se[pe-3]);break;case 43:z.addElement(se[pe-5]),z.setClass([se[pe-5]],se[pe-3]);break;case 44:z.setNewElementType(se[pe-2]);break;case 45:z.setNewElementDocRef(se[pe-2]);break;case 48:z.addRelationship(se[pe-2],se[pe],se[pe-4]);break;case 49:z.addRelationship(se[pe-2],se[pe-4],se[pe]);break;case 50:this.$=z.Relationships.CONTAINS;break;case 51:this.$=z.Relationships.COPIES;break;case 52:this.$=z.Relationships.DERIVES;break;case 53:this.$=z.Relationships.SATISFIES;break;case 54:this.$=z.Relationships.VERIFIES;break;case 55:this.$=z.Relationships.REFINES;break;case 56:this.$=z.Relationships.TRACES;break;case 57:this.$=se[pe-2],z.defineClass(se[pe-1],se[pe]);break;case 58:z.setClass(se[pe-1],se[pe]);break;case 59:z.setClass([se[pe-2]],se[pe]);break;case 60:case 62:this.$=[se[pe]];break;case 61:case 63:this.$=se[pe-2].concat([se[pe]]);break;case 64:this.$=se[pe-2],z.setCssStyle(se[pe-1],se[pe]);break;case 65:this.$=[se[pe]];break;case 66:se[pe-2].push(se[pe]),this.$=se[pe-2];break;case 68:this.$=se[pe-1]+se[pe];break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:s,7:42,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:43,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:44,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:45,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:46,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:47,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:48,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:49,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{4:17,5:s,7:50,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:E,77:w,89:k,90:S},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},t(A,[2,17]),t(A,[2,18]),t(A,[2,19]),t(A,[2,20]),{30:60,33:62,75:L,89:k,90:S},{30:63,33:62,75:L,89:k,90:S},{30:64,33:62,75:L,89:k,90:S},t(I,[2,29]),t(I,[2,30]),t(I,[2,31]),t(I,[2,32]),t(I,[2,33]),t(I,[2,34]),t(N,[2,81]),t(N,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},t(C,[2,79]),t(C,[2,80]),{27:[1,67],29:[1,68]},t(C,[2,85]),t(C,[2,86]),{62:69,65:_,66:D,67:M,68:R,69:P,70:B,71:F},{62:77,65:_,66:D,67:M,68:R,69:P,70:B,71:F},{30:78,33:62,75:L,89:k,90:S},{73:79,75:G,76:$,78:81,79:82,80:V,81:X,82:Q,83:H,84:ie,85:Y,86:le,87:ee,88:J},t(te,[2,60]),t(te,[2,62]),{73:93,75:G,76:$,78:81,79:82,80:V,81:X,82:Q,83:H,84:ie,85:Y,86:le,87:ee,88:J},{30:94,33:62,75:L,76:$,89:k,90:S},{5:[1,95]},{30:96,33:62,75:L,89:k,90:S},{5:[1,97]},{30:98,33:62,75:L,89:k,90:S},{63:[1,99]},t(Z,[2,50]),t(Z,[2,51]),t(Z,[2,52]),t(Z,[2,53]),t(Z,[2,54]),t(Z,[2,55]),t(Z,[2,56]),{64:[1,100]},t(A,[2,59],{76:$}),t(A,[2,64],{76:xe}),{33:103,75:[1,102],89:k,90:S},t(de,[2,65],{79:104,75:G,80:V,81:X,82:Q,83:H,84:ie,85:Y,86:le,87:ee,88:J}),t(Se,[2,67]),t(Se,[2,69]),t(Se,[2,70]),t(Se,[2,71]),t(Se,[2,72]),t(Se,[2,73]),t(Se,[2,74]),t(Se,[2,75]),t(Se,[2,76]),t(Se,[2,77]),t(Se,[2,78]),t(A,[2,57],{76:xe}),t(A,[2,58],{76:$}),{5:Me,28:105,31:ke,34:we,36:_e,38:$e,40:fe},{27:[1,112],76:$},{5:Ke,40:Te,56:113,57:Be,59:Ue},{27:[1,118],76:$},{33:119,89:k,90:S},{33:120,89:k,90:S},{75:G,78:121,79:82,80:V,81:X,82:Q,83:H,84:ie,85:Y,86:le,87:ee,88:J},t(te,[2,61]),t(te,[2,63]),t(Se,[2,68]),t(A,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:Me,28:126,31:ke,34:we,36:_e,38:$e,40:fe},t(A,[2,28]),{5:[1,127]},t(A,[2,42]),{32:[1,128]},{32:[1,129]},{5:Ke,40:Te,56:130,57:Be,59:Ue},t(A,[2,47]),{5:[1,131]},t(A,[2,48]),t(A,[2,49]),t(de,[2,66],{79:104,75:G,80:V,81:X,82:Q,83:H,84:ie,85:Y,86:le,87:ee,88:J}),{33:132,89:k,90:S},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},t(A,[2,27]),{5:Me,28:145,31:ke,34:we,36:_e,38:$e,40:fe},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},t(A,[2,46]),{5:Ke,40:Te,56:152,57:Be,59:Ue},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},t(A,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},t(A,[2,43]),{5:Me,28:159,31:ke,34:we,36:_e,38:$e,40:fe},{5:Me,28:160,31:ke,34:we,36:_e,38:$e,40:fe},{5:Me,28:161,31:ke,34:we,36:_e,38:$e,40:fe},{5:Me,28:162,31:ke,34:we,36:_e,38:$e,40:fe},{5:Ke,40:Te,56:163,57:Be,59:Ue},{5:Ke,40:Te,56:164,57:Be,59:Ue},t(A,[2,23]),t(A,[2,24]),t(A,[2,25]),t(A,[2,26]),t(A,[2,44]),t(A,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(ae,U){if(U.recoverable)this.trace(ae);else{var ce=new Error(ae);throw ce.hash=U,ce}},"parseError"),parse:o(function(ae){var U=this,ce=[0],z=[],ne=[null],se=[],be=this.table,pe="",me=0,Re=0,ge=0,Ie=2,qe=1,Pe=se.slice.call(arguments,1),Xe=Object.create(this.lexer),oe={yy:{}};for(var et in this.yy)Object.prototype.hasOwnProperty.call(this.yy,et)&&(oe.yy[et]=this.yy[et]);Xe.setInput(ae,oe.yy),oe.yy.lexer=Xe,oe.yy.parser=this,typeof Xe.yylloc>"u"&&(Xe.yylloc={});var he=Xe.yylloc;se.push(he);var ot=Xe.options&&Xe.options.ranges;typeof oe.yy.parseError=="function"?this.parseError=oe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Dt(tr){ce.length=ce.length-2*tr,ne.length=ne.length-tr,se.length=se.length-tr}o(Dt,"popStack");function It(){var tr;return tr=z.pop()||Xe.lex()||qe,typeof tr!="number"&&(tr instanceof Array&&(z=tr,tr=z.pop()),tr=U.symbols_[tr]||tr),tr}o(It,"lex");for(var wt,Rt,it,at,Ct,yt,dt={},Ht,cr,Kt,kr;;){if(it=ce[ce.length-1],this.defaultActions[it]?at=this.defaultActions[it]:((wt===null||typeof wt>"u")&&(wt=It()),at=be[it]&&be[it][wt]),typeof at>"u"||!at.length||!at[0]){var ur="";kr=[];for(Ht in be[it])this.terminals_[Ht]&&Ht>Ie&&kr.push("'"+this.terminals_[Ht]+"'");Xe.showPosition?ur="Parse error on line "+(me+1)+`: -`+Xe.showPosition()+` -Expecting `+kr.join(", ")+", got '"+(this.terminals_[wt]||wt)+"'":ur="Parse error on line "+(me+1)+": Unexpected "+(wt==qe?"end of input":"'"+(this.terminals_[wt]||wt)+"'"),this.parseError(ur,{text:Xe.match,token:this.terminals_[wt]||wt,line:Xe.yylineno,loc:he,expected:kr})}if(at[0]instanceof Array&&at.length>1)throw new Error("Parse Error: multiple actions possible at state: "+it+", token: "+wt);switch(at[0]){case 1:ce.push(wt),ne.push(Xe.yytext),se.push(Xe.yylloc),ce.push(at[1]),wt=null,Rt?(wt=Rt,Rt=null):(Re=Xe.yyleng,pe=Xe.yytext,me=Xe.yylineno,he=Xe.yylloc,ge>0&&ge--);break;case 2:if(cr=this.productions_[at[1]][1],dt.$=ne[ne.length-cr],dt._$={first_line:se[se.length-(cr||1)].first_line,last_line:se[se.length-1].last_line,first_column:se[se.length-(cr||1)].first_column,last_column:se[se.length-1].last_column},ot&&(dt._$.range=[se[se.length-(cr||1)].range[0],se[se.length-1].range[1]]),yt=this.performAction.apply(dt,[pe,Re,me,oe.yy,at[1],ne,se].concat(Pe)),typeof yt<"u")return yt;cr&&(ce=ce.slice(0,-1*cr*2),ne=ne.slice(0,-1*cr),se=se.slice(0,-1*cr)),ce.push(this.productions_[at[1]][0]),ne.push(dt.$),se.push(dt._$),Kt=be[ce[ce.length-2]][ce[ce.length-1]],ce.push(Kt);break;case 3:return!0}}return!0},"parse")},Ne=(function(){var j={EOF:1,parseError:o(function(U,ce){if(this.yy.parser)this.yy.parser.parseError(U,ce);else throw new Error(U)},"parseError"),setInput:o(function(ae,U){return this.yy=U||this.yy||{},this._input=ae,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var ae=this._input[0];this.yytext+=ae,this.yyleng++,this.offset++,this.match+=ae,this.matched+=ae;var U=ae.match(/(?:\r\n?|\n).*/g);return U?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ae},"input"),unput:o(function(ae){var U=ae.length,ce=ae.split(/(?:\r\n?|\n)/g);this._input=ae+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-U),this.offset-=U;var z=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ce.length-1&&(this.yylineno-=ce.length-1);var ne=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ce?(ce.length===z.length?this.yylloc.first_column:0)+z[z.length-ce.length].length-ce[0].length:this.yylloc.first_column-U},this.options.ranges&&(this.yylloc.range=[ne[0],ne[0]+this.yyleng-U]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(ae){this.unput(this.match.slice(ae))},"less"),pastInput:o(function(){var ae=this.matched.substr(0,this.matched.length-this.match.length);return(ae.length>20?"...":"")+ae.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var ae=this.match;return ae.length<20&&(ae+=this._input.substr(0,20-ae.length)),(ae.substr(0,20)+(ae.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var ae=this.pastInput(),U=new Array(ae.length+1).join("-");return ae+this.upcomingInput()+` -`+U+"^"},"showPosition"),test_match:o(function(ae,U){var ce,z,ne;if(this.options.backtrack_lexer&&(ne={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ne.yylloc.range=this.yylloc.range.slice(0))),z=ae[0].match(/(?:\r\n?|\n).*/g),z&&(this.yylineno+=z.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:z?z[z.length-1].length-z[z.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ae[0].length},this.yytext+=ae[0],this.match+=ae[0],this.matches=ae,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ae[0].length),this.matched+=ae[0],ce=this.performAction.call(this,this.yy,this,U,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ce)return ce;if(this._backtrack){for(var se in ne)this[se]=ne[se];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ae,U,ce,z;this._more||(this.yytext="",this.match="");for(var ne=this._currentRules(),se=0;seU[0].length)){if(U=ce,z=se,this.options.backtrack_lexer){if(ae=this.test_match(ce,ne[se]),ae!==!1)return ae;if(this._backtrack){U=!1;continue}else return!1}else if(!this.options.flex)break}return U?(ae=this.test_match(U,ne[z]),ae!==!1?ae:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var U=this.next();return U||this.lex()},"lex"),begin:o(function(U){this.conditionStack.push(U)},"begin"),popState:o(function(){var U=this.conditionStack.length-1;return U>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(U){return U=this.conditionStack.length-1-Math.abs(U||0),U>=0?this.conditionStack[U]:"INITIAL"},"topState"),pushState:o(function(U){this.begin(U)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(U,ce,z,ne){var se=ne;switch(z){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return ce.yytext=ce.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return j})();Ge.lexer=Ne;function We(){this.yy={}}return o(We,"Parser"),We.prototype=Ge,Ge.Parser=We,new We})();Jq.parser=Jq;vwe=Jq});var z7,bwe=O(()=>{"use strict";jt();xt();si();z7=class{constructor(){this.relations=[];this.latestRequirement=this.getInitialRequirement();this.requirements=new Map;this.latestElement=this.getInitialElement();this.elements=new Map;this.classes=new Map;this.direction="TB";this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"};this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"};this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"};this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"};this.setAccTitle=Lr;this.getAccTitle=Or;this.setAccDescription=Pr;this.getAccDescription=Br;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.getConfig=o(()=>ve().requirement,"getConfig");this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,r){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:r,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),K.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,r,n){this.relations.push({type:e,src:r,dst:n})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,_r()}setCssStyle(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(!r||!i)return;for(let a of r)a.includes(",")?i.cssStyles.push(...a.split(",")):i.cssStyles.push(a)}}setClass(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(i)for(let a of r){i.classes.push(a);let s=this.classes.get(a)?.styles;s&&i.cssStyles.push(...s)}}}defineClass(e,r){for(let n of e){let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.requirements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))}),this.elements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))})}}getClasses(){return this.classes}getData(){let e=ve(),r=[],n=[];for(let i of this.requirements.values()){let a=i;a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),a.shape="requirementBox",a.look=e.look,r.push(a)}for(let i of this.elements.values()){let a=i;a.shape="requirementBox",a.look=e.look,a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),r.push(a)}for(let i of this.relations){let a=0,s=i.type===this.Relationships.CONTAINS,l={id:`${i.src}-${i.dst}-${a}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`\xAB${i.type}\xBB`,classes:"relationshipLine",style:["fill:none",s?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:s?"normal":"dashed",arrowTypeStart:s?"requirement_contains":"",arrowTypeEnd:s?"":"requirement_arrow",look:e.look,labelType:"markdown"};n.push(l),a++}return{nodes:r,edges:n,other:{},config:e,direction:this.getDirection()}}}});var Dlt,Twe,wwe=O(()=>{"use strict";Dlt=o(t=>` - - marker { - fill: ${t.relationColor}; - stroke: ${t.relationColor}; - } - - marker.cross { - stroke: ${t.lineColor}; - } - - svg { - font-family: ${t.fontFamily}; - font-size: ${t.fontSize}; - } - - .reqBox { - fill: ${t.requirementBackground}; - fill-opacity: 1.0; - stroke: ${t.requirementBorderColor}; - stroke-width: ${t.requirementBorderSize}; - } - - .reqTitle, .reqLabel{ - fill: ${t.requirementTextColor}; - } - .reqLabelBox { - fill: ${t.relationLabelBackground}; - fill-opacity: 1.0; - } - - .req-title-line { - stroke: ${t.requirementBorderColor}; - stroke-width: ${t.requirementBorderSize}; - } - .relationshipLine { - stroke: ${t.relationColor}; - stroke-width: 1; - } - .relationshipLabel { - fill: ${t.relationLabelColor}; - } - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - } - .edgeLabel .label rect { - fill: ${t.edgeLabelBackground}; - } - .edgeLabel .label text { - fill: ${t.relationLabelColor}; - } - .divider { - stroke: ${t.nodeBorder}; - stroke-width: 1; - } - .label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - .label text,span { - fill: ${t.nodeTextColor||t.textColor}; - color: ${t.nodeTextColor||t.textColor}; - } - .labelBkg { - background-color: ${t.edgeLabelBackground}; - } - -`,"getStyles"),Twe=Dlt});var eU={};vr(eU,{draw:()=>Rlt});var Rlt,kwe=O(()=>{"use strict";jt();xt();b0();Rd();Ld();ar();Rlt=o(async function(t,e,r,n){K.info("REF0:"),K.info("Drawing requirement diagram (unified)",e);let{securityLevel:i,state:a,layout:s}=ve(),l=n.db.getData(),u=Sl(e,i);l.type=n.type,l.layoutAlgorithm=Ru(s),l.nodeSpacing=a?.nodeSpacing??50,l.rankSpacing=a?.rankSpacing??50,l.markers=["requirement_contains","requirement_arrow"],l.diagramId=e,await Ol(l,u);let h=8;Xt.insertTitle(u,"requirementDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),bo(u,h,"requirementDiagram",a?.useMaxWidth??!0)},"draw")});var Ewe={};vr(Ewe,{diagram:()=>Llt});var Llt,Swe=O(()=>{"use strict";xwe();bwe();wwe();kwe();Llt={parser:vwe,get db(){return new z7},renderer:eU,styles:Twe}});var tU,_we,Dwe=O(()=>{"use strict";tU=(function(){var t=o(function(Re,ge,Ie,qe){for(Ie=Ie||{},qe=Re.length;qe--;Ie[Re[qe]]=ge);return Ie},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,12],u=[1,14],h=[1,15],f=[1,17],d=[1,18],p=[1,19],m=[1,25],g=[1,26],y=[1,27],v=[1,28],x=[1,29],b=[1,30],T=[1,31],E=[1,32],w=[1,33],k=[1,34],S=[1,35],A=[1,36],L=[1,37],I=[1,38],N=[1,39],C=[1,40],_=[1,42],D=[1,43],M=[1,44],R=[1,45],P=[1,46],B=[1,47],F=[1,4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,48,49,50,51,53,54,56,61,62,63,64,73],G=[1,74],$=[1,80],V=[1,81],X=[1,82],Q=[1,83],H=[1,84],ie=[1,85],Y=[1,86],le=[1,87],ee=[1,88],J=[1,89],te=[1,90],Z=[1,91],xe=[1,92],de=[1,93],Se=[1,94],Me=[1,95],ke=[1,96],we=[1,97],_e=[1,98],$e=[1,99],fe=[1,100],Ke=[1,101],Te=[1,102],Be=[1,103],Ue=[1,104],Ge=[1,105],Ne=[2,78],We=[4,5,17,51,53,54],j=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,51,53,54,56,61,62,63,64,73],ae=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,50,51,53,54,56,61,62,63,64,73],U=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,49,51,53,54,56,61,62,63,64,73],ce=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,48,51,53,54,56,61,62,63,64,73],z=[5,52],ne=[70,71,72,73],se=[1,151],be={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,INVALID:10,box_section:11,box_line:12,participant_statement:13,create:14,box:15,restOfLine:16,end:17,signal:18,autonumber:19,NUM:20,off:21,activate:22,actor:23,deactivate:24,note_statement:25,links_statement:26,link_statement:27,properties_statement:28,details_statement:29,title:30,legacy_title:31,acc_title:32,acc_title_value:33,acc_descr:34,acc_descr_value:35,acc_descr_multiline_value:36,loop:37,rect:38,opt:39,alt:40,else_sections:41,par:42,par_sections:43,par_over:44,critical:45,option_sections:46,break:47,option:48,and:49,else:50,participant:51,AS:52,participant_actor:53,destroy:54,actor_with_config:55,note:56,placement:57,text2:58,over:59,actor_pair:60,links:61,link:62,properties:63,details:64,spaceList:65,",":66,left_of:67,right_of:68,signaltype:69,"+":70,"-":71,"()":72,ACTOR:73,config_object:74,CONFIG_START:75,CONFIG_CONTENT:76,CONFIG_END:77,SOLID_OPEN_ARROW:78,DOTTED_OPEN_ARROW:79,SOLID_ARROW:80,SOLID_ARROW_TOP:81,SOLID_ARROW_BOTTOM:82,STICK_ARROW_TOP:83,STICK_ARROW_BOTTOM:84,SOLID_ARROW_TOP_DOTTED:85,SOLID_ARROW_BOTTOM_DOTTED:86,STICK_ARROW_TOP_DOTTED:87,STICK_ARROW_BOTTOM_DOTTED:88,SOLID_ARROW_TOP_REVERSE:89,SOLID_ARROW_BOTTOM_REVERSE:90,STICK_ARROW_TOP_REVERSE:91,STICK_ARROW_BOTTOM_REVERSE:92,SOLID_ARROW_TOP_REVERSE_DOTTED:93,SOLID_ARROW_BOTTOM_REVERSE_DOTTED:94,STICK_ARROW_TOP_REVERSE_DOTTED:95,STICK_ARROW_BOTTOM_REVERSE_DOTTED:96,BIDIRECTIONAL_SOLID_ARROW:97,DOTTED_ARROW:98,BIDIRECTIONAL_DOTTED_ARROW:99,SOLID_CROSS:100,DOTTED_CROSS:101,SOLID_POINT:102,DOTTED_POINT:103,TXT:104,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",10:"INVALID",14:"create",15:"box",16:"restOfLine",17:"end",19:"autonumber",20:"NUM",21:"off",22:"activate",24:"deactivate",30:"title",31:"legacy_title",32:"acc_title",33:"acc_title_value",34:"acc_descr",35:"acc_descr_value",36:"acc_descr_multiline_value",37:"loop",38:"rect",39:"opt",40:"alt",42:"par",44:"par_over",45:"critical",47:"break",48:"option",49:"and",50:"else",51:"participant",52:"AS",53:"participant_actor",54:"destroy",56:"note",59:"over",61:"links",62:"link",63:"properties",64:"details",66:",",67:"left_of",68:"right_of",70:"+",71:"-",72:"()",73:"ACTOR",75:"CONFIG_START",76:"CONFIG_CONTENT",77:"CONFIG_END",78:"SOLID_OPEN_ARROW",79:"DOTTED_OPEN_ARROW",80:"SOLID_ARROW",81:"SOLID_ARROW_TOP",82:"SOLID_ARROW_BOTTOM",83:"STICK_ARROW_TOP",84:"STICK_ARROW_BOTTOM",85:"SOLID_ARROW_TOP_DOTTED",86:"SOLID_ARROW_BOTTOM_DOTTED",87:"STICK_ARROW_TOP_DOTTED",88:"STICK_ARROW_BOTTOM_DOTTED",89:"SOLID_ARROW_TOP_REVERSE",90:"SOLID_ARROW_BOTTOM_REVERSE",91:"STICK_ARROW_TOP_REVERSE",92:"STICK_ARROW_BOTTOM_REVERSE",93:"SOLID_ARROW_TOP_REVERSE_DOTTED",94:"SOLID_ARROW_BOTTOM_REVERSE_DOTTED",95:"STICK_ARROW_TOP_REVERSE_DOTTED",96:"STICK_ARROW_BOTTOM_REVERSE_DOTTED",97:"BIDIRECTIONAL_SOLID_ARROW",98:"DOTTED_ARROW",99:"BIDIRECTIONAL_DOTTED_ARROW",100:"SOLID_CROSS",101:"DOTTED_CROSS",102:"SOLID_POINT",103:"DOTTED_POINT",104:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[8,1],[11,0],[11,2],[12,2],[12,1],[12,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[46,1],[46,4],[43,1],[43,4],[41,1],[41,4],[13,5],[13,3],[13,5],[13,3],[13,3],[13,5],[13,3],[13,5],[13,3],[25,4],[25,4],[26,3],[27,3],[28,3],[29,3],[65,2],[65,1],[60,3],[60,1],[57,1],[57,1],[18,5],[18,5],[18,5],[18,5],[18,6],[18,4],[55,2],[74,3],[23,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[58,1]],performAction:o(function(ge,Ie,qe,Pe,Xe,oe,et){var he=oe.length-1;switch(Xe){case 3:return Pe.apply(oe[he]),oe[he];break;case 4:case 10:this.$=[];break;case 5:case 11:oe[he-1].push(oe[he]),this.$=oe[he-1];break;case 6:case 7:case 12:case 13:this.$=oe[he];break;case 8:case 9:case 14:this.$=[];break;case 16:oe[he].type="createParticipant",this.$=oe[he];break;case 17:oe[he-1].unshift({type:"boxStart",boxData:Pe.parseBoxData(oe[he-2])}),oe[he-1].push({type:"boxEnd",boxText:oe[he-2]}),this.$=oe[he-1];break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(oe[he-2]),sequenceIndexStep:Number(oe[he-1]),sequenceVisible:!0,signalType:Pe.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceIndex:Number(oe[he-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:Pe.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:Pe.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:Pe.LINETYPE.AUTONUMBER};break;case 23:this.$={type:"activeStart",signalType:Pe.LINETYPE.ACTIVE_START,actor:oe[he-1].actor};break;case 24:this.$={type:"activeEnd",signalType:Pe.LINETYPE.ACTIVE_END,actor:oe[he-1].actor};break;case 30:Pe.setDiagramTitle(oe[he].substring(6)),this.$=oe[he].substring(6);break;case 31:Pe.setDiagramTitle(oe[he].substring(7)),this.$=oe[he].substring(7);break;case 32:this.$=oe[he].trim(),Pe.setAccTitle(this.$);break;case 33:case 34:this.$=oe[he].trim(),Pe.setAccDescription(this.$);break;case 35:oe[he-1].unshift({type:"loopStart",loopText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.LOOP_START}),oe[he-1].push({type:"loopEnd",loopText:oe[he-2],signalType:Pe.LINETYPE.LOOP_END}),this.$=oe[he-1];break;case 36:oe[he-1].unshift({type:"rectStart",color:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.RECT_START}),oe[he-1].push({type:"rectEnd",color:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.RECT_END}),this.$=oe[he-1];break;case 37:oe[he-1].unshift({type:"optStart",optText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.OPT_START}),oe[he-1].push({type:"optEnd",optText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.OPT_END}),this.$=oe[he-1];break;case 38:oe[he-1].unshift({type:"altStart",altText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.ALT_START}),oe[he-1].push({type:"altEnd",signalType:Pe.LINETYPE.ALT_END}),this.$=oe[he-1];break;case 39:oe[he-1].unshift({type:"parStart",parText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.PAR_START}),oe[he-1].push({type:"parEnd",signalType:Pe.LINETYPE.PAR_END}),this.$=oe[he-1];break;case 40:oe[he-1].unshift({type:"parStart",parText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.PAR_OVER_START}),oe[he-1].push({type:"parEnd",signalType:Pe.LINETYPE.PAR_END}),this.$=oe[he-1];break;case 41:oe[he-1].unshift({type:"criticalStart",criticalText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.CRITICAL_START}),oe[he-1].push({type:"criticalEnd",signalType:Pe.LINETYPE.CRITICAL_END}),this.$=oe[he-1];break;case 42:oe[he-1].unshift({type:"breakStart",breakText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.BREAK_START}),oe[he-1].push({type:"breakEnd",optText:Pe.parseMessage(oe[he-2]),signalType:Pe.LINETYPE.BREAK_END}),this.$=oe[he-1];break;case 44:this.$=oe[he-3].concat([{type:"option",optionText:Pe.parseMessage(oe[he-1]),signalType:Pe.LINETYPE.CRITICAL_OPTION},oe[he]]);break;case 46:this.$=oe[he-3].concat([{type:"and",parText:Pe.parseMessage(oe[he-1]),signalType:Pe.LINETYPE.PAR_AND},oe[he]]);break;case 48:this.$=oe[he-3].concat([{type:"else",altText:Pe.parseMessage(oe[he-1]),signalType:Pe.LINETYPE.ALT_ELSE},oe[he]]);break;case 49:oe[he-3].draw="participant",oe[he-3].type="addParticipant",oe[he-3].description=Pe.parseMessage(oe[he-1]),this.$=oe[he-3];break;case 50:oe[he-1].draw="participant",oe[he-1].type="addParticipant",this.$=oe[he-1];break;case 51:oe[he-3].draw="actor",oe[he-3].type="addParticipant",oe[he-3].description=Pe.parseMessage(oe[he-1]),this.$=oe[he-3];break;case 52:case 57:oe[he-1].draw="actor",oe[he-1].type="addParticipant",this.$=oe[he-1];break;case 53:oe[he-1].type="destroyParticipant",this.$=oe[he-1];break;case 54:oe[he-3].draw="participant",oe[he-3].type="addParticipant",oe[he-3].description=Pe.parseMessage(oe[he-1]),this.$=oe[he-3];break;case 55:oe[he-1].draw="participant",oe[he-1].type="addParticipant",this.$=oe[he-1];break;case 56:oe[he-3].draw="actor",oe[he-3].type="addParticipant",oe[he-3].description=Pe.parseMessage(oe[he-1]),this.$=oe[he-3];break;case 58:this.$=[oe[he-1],{type:"addNote",placement:oe[he-2],actor:oe[he-1].actor,text:oe[he]}];break;case 59:oe[he-2]=[].concat(oe[he-1],oe[he-1]).slice(0,2),oe[he-2][0]=oe[he-2][0].actor,oe[he-2][1]=oe[he-2][1].actor,this.$=[oe[he-1],{type:"addNote",placement:Pe.PLACEMENT.OVER,actor:oe[he-2].slice(0,2),text:oe[he]}];break;case 60:this.$=[oe[he-1],{type:"addLinks",actor:oe[he-1].actor,text:oe[he]}];break;case 61:this.$=[oe[he-1],{type:"addALink",actor:oe[he-1].actor,text:oe[he]}];break;case 62:this.$=[oe[he-1],{type:"addProperties",actor:oe[he-1].actor,text:oe[he]}];break;case 63:this.$=[oe[he-1],{type:"addDetails",actor:oe[he-1].actor,text:oe[he]}];break;case 66:this.$=[oe[he-2],oe[he]];break;case 67:this.$=oe[he];break;case 68:this.$=Pe.PLACEMENT.LEFTOF;break;case 69:this.$=Pe.PLACEMENT.RIGHTOF;break;case 70:this.$=[oe[he-4],oe[he-1],{type:"addMessage",from:oe[he-4].actor,to:oe[he-1].actor,signalType:oe[he-3],msg:oe[he],activate:!0},{type:"activeStart",signalType:Pe.LINETYPE.ACTIVE_START,actor:oe[he-1].actor}];break;case 71:this.$=[oe[he-4],oe[he-1],{type:"addMessage",from:oe[he-4].actor,to:oe[he-1].actor,signalType:oe[he-3],msg:oe[he]},{type:"activeEnd",signalType:Pe.LINETYPE.ACTIVE_END,actor:oe[he-4].actor}];break;case 72:this.$=[oe[he-4],oe[he-1],{type:"addMessage",from:oe[he-4].actor,to:oe[he-1].actor,signalType:oe[he-3],msg:oe[he],activate:!0,centralConnection:Pe.LINETYPE.CENTRAL_CONNECTION},{type:"centralConnection",signalType:Pe.LINETYPE.CENTRAL_CONNECTION,actor:oe[he-1].actor}];break;case 73:this.$=[oe[he-4],oe[he-1],{type:"addMessage",from:oe[he-4].actor,to:oe[he-1].actor,signalType:oe[he-2],msg:oe[he],activate:!1,centralConnection:Pe.LINETYPE.CENTRAL_CONNECTION_REVERSE},{type:"centralConnectionReverse",signalType:Pe.LINETYPE.CENTRAL_CONNECTION_REVERSE,actor:oe[he-4].actor}];break;case 74:this.$=[oe[he-5],oe[he-1],{type:"addMessage",from:oe[he-5].actor,to:oe[he-1].actor,signalType:oe[he-3],msg:oe[he],activate:!0,centralConnection:Pe.LINETYPE.CENTRAL_CONNECTION_DUAL},{type:"centralConnection",signalType:Pe.LINETYPE.CENTRAL_CONNECTION,actor:oe[he-1].actor},{type:"centralConnectionReverse",signalType:Pe.LINETYPE.CENTRAL_CONNECTION_REVERSE,actor:oe[he-5].actor}];break;case 75:this.$=[oe[he-3],oe[he-1],{type:"addMessage",from:oe[he-3].actor,to:oe[he-1].actor,signalType:oe[he-2],msg:oe[he]}];break;case 76:this.$={type:"addParticipant",actor:oe[he-1],config:oe[he]};break;case 77:this.$=oe[he-1].trim();break;case 78:this.$={type:"addParticipant",actor:oe[he]};break;case 79:this.$=Pe.LINETYPE.SOLID_OPEN;break;case 80:this.$=Pe.LINETYPE.DOTTED_OPEN;break;case 81:this.$=Pe.LINETYPE.SOLID;break;case 82:this.$=Pe.LINETYPE.SOLID_TOP;break;case 83:this.$=Pe.LINETYPE.SOLID_BOTTOM;break;case 84:this.$=Pe.LINETYPE.STICK_TOP;break;case 85:this.$=Pe.LINETYPE.STICK_BOTTOM;break;case 86:this.$=Pe.LINETYPE.SOLID_TOP_DOTTED;break;case 87:this.$=Pe.LINETYPE.SOLID_BOTTOM_DOTTED;break;case 88:this.$=Pe.LINETYPE.STICK_TOP_DOTTED;break;case 89:this.$=Pe.LINETYPE.STICK_BOTTOM_DOTTED;break;case 90:this.$=Pe.LINETYPE.SOLID_ARROW_TOP_REVERSE;break;case 91:this.$=Pe.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE;break;case 92:this.$=Pe.LINETYPE.STICK_ARROW_TOP_REVERSE;break;case 93:this.$=Pe.LINETYPE.STICK_ARROW_BOTTOM_REVERSE;break;case 94:this.$=Pe.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED;break;case 95:this.$=Pe.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED;break;case 96:this.$=Pe.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED;break;case 97:this.$=Pe.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED;break;case 98:this.$=Pe.LINETYPE.BIDIRECTIONAL_SOLID;break;case 99:this.$=Pe.LINETYPE.DOTTED;break;case 100:this.$=Pe.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 101:this.$=Pe.LINETYPE.SOLID_CROSS;break;case 102:this.$=Pe.LINETYPE.DOTTED_CROSS;break;case 103:this.$=Pe.LINETYPE.SOLID_POINT;break;case 104:this.$=Pe.LINETYPE.DOTTED_POINT;break;case 105:this.$=Pe.parseMessage(oe[he].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,10,14,15,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,51,53,54,56,61,62,63,64,73],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},t(F,[2,5]),{9:48,13:13,14:u,15:h,18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},t(F,[2,7]),t(F,[2,8]),t(F,[2,9]),t(F,[2,15]),{13:49,51:I,53:N,54:C},{16:[1,50]},{5:[1,51]},{5:[1,54],20:[1,52],21:[1,53]},{23:55,73:B},{23:56,73:B},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},{5:[1,61]},t(F,[2,30]),t(F,[2,31]),{33:[1,62]},{35:[1,63]},t(F,[2,34]),{16:[1,64]},{16:[1,65]},{16:[1,66]},{16:[1,67]},{16:[1,68]},{16:[1,69]},{16:[1,70]},{16:[1,71]},{23:72,55:73,73:G},{23:75,55:76,73:G},{23:77,73:B},{69:78,72:[1,79],78:$,79:V,80:X,81:Q,82:H,83:ie,84:Y,85:le,86:ee,87:J,88:te,89:Z,90:xe,91:de,92:Se,93:Me,94:ke,95:we,96:_e,97:$e,98:fe,99:Ke,100:Te,101:Be,102:Ue,103:Ge},{57:106,59:[1,107],67:[1,108],68:[1,109]},{23:110,73:B},{23:111,73:B},{23:112,73:B},{23:113,73:B},t([5,66,72,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],Ne),t(F,[2,6]),t(F,[2,16]),t(We,[2,10],{11:114}),t(F,[2,18]),{5:[1,116],20:[1,115]},{5:[1,117]},t(F,[2,22]),{5:[1,118]},{5:[1,119]},t(F,[2,25]),t(F,[2,26]),t(F,[2,27]),t(F,[2,28]),t(F,[2,29]),t(F,[2,32]),t(F,[2,33]),t(j,i,{7:120}),t(j,i,{7:121}),t(j,i,{7:122}),t(ae,i,{41:123,7:124}),t(U,i,{43:125,7:126}),t(U,i,{7:126,43:127}),t(ce,i,{46:128,7:129}),t(j,i,{7:130}),{5:[1,132],52:[1,131]},{5:[1,134],52:[1,133]},t(z,Ne,{74:135,75:[1,136]}),{5:[1,138],52:[1,137]},{5:[1,140],52:[1,139]},{5:[1,141]},{23:145,70:[1,142],71:[1,143],72:[1,144],73:B},{69:146,78:$,79:V,80:X,81:Q,82:H,83:ie,84:Y,85:le,86:ee,87:J,88:te,89:Z,90:xe,91:de,92:Se,93:Me,94:ke,95:we,96:_e,97:$e,98:fe,99:Ke,100:Te,101:Be,102:Ue,103:Ge},t(ne,[2,79]),t(ne,[2,80]),t(ne,[2,81]),t(ne,[2,82]),t(ne,[2,83]),t(ne,[2,84]),t(ne,[2,85]),t(ne,[2,86]),t(ne,[2,87]),t(ne,[2,88]),t(ne,[2,89]),t(ne,[2,90]),t(ne,[2,91]),t(ne,[2,92]),t(ne,[2,93]),t(ne,[2,94]),t(ne,[2,95]),t(ne,[2,96]),t(ne,[2,97]),t(ne,[2,98]),t(ne,[2,99]),t(ne,[2,100]),t(ne,[2,101]),t(ne,[2,102]),t(ne,[2,103]),t(ne,[2,104]),{23:147,73:B},{23:149,60:148,73:B},{73:[2,68]},{73:[2,69]},{58:150,104:se},{58:152,104:se},{58:153,104:se},{58:154,104:se},{4:[1,157],5:[1,159],12:156,13:158,17:[1,155],51:I,53:N,54:C},{5:[1,160]},t(F,[2,20]),t(F,[2,21]),t(F,[2,23]),t(F,[2,24]),{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[1,161],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[1,162],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[1,163],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{17:[1,164]},{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[2,47],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,50:[1,165],51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{17:[1,166]},{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[2,45],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,49:[1,167],51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{17:[1,168]},{17:[1,169]},{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[2,43],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,48:[1,170],51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{4:a,5:s,8:8,9:10,10:l,13:13,14:u,15:h,17:[1,171],18:16,19:f,22:d,23:41,24:p,25:20,26:21,27:22,28:23,29:24,30:m,31:g,32:y,34:v,36:x,37:b,38:T,39:E,40:w,42:k,44:S,45:A,47:L,51:I,53:N,54:C,56:_,61:D,62:M,63:R,64:P,73:B},{16:[1,172]},t(F,[2,50]),{16:[1,173]},t(F,[2,55]),t(z,[2,76]),{76:[1,174]},{16:[1,175]},t(F,[2,52]),{16:[1,176]},t(F,[2,57]),t(F,[2,53]),{23:177,73:B},{23:178,73:B},{23:179,73:B},{58:180,104:se},{23:181,72:[1,182],73:B},{58:183,104:se},{58:184,104:se},{66:[1,185],104:[2,67]},{5:[2,60]},{5:[2,105]},{5:[2,61]},{5:[2,62]},{5:[2,63]},t(F,[2,17]),t(We,[2,11]),{13:186,51:I,53:N,54:C},t(We,[2,13]),t(We,[2,14]),t(F,[2,19]),t(F,[2,35]),t(F,[2,36]),t(F,[2,37]),t(F,[2,38]),{16:[1,187]},t(F,[2,39]),{16:[1,188]},t(F,[2,40]),t(F,[2,41]),{16:[1,189]},t(F,[2,42]),{5:[1,190]},{5:[1,191]},{77:[1,192]},{5:[1,193]},{5:[1,194]},{58:195,104:se},{58:196,104:se},{58:197,104:se},{5:[2,75]},{58:198,104:se},{23:199,73:B},{5:[2,58]},{5:[2,59]},{23:200,73:B},t(We,[2,12]),t(ae,i,{7:124,41:201}),t(U,i,{7:126,43:202}),t(ce,i,{7:129,46:203}),t(F,[2,49]),t(F,[2,54]),t(z,[2,77]),t(F,[2,51]),t(F,[2,56]),{5:[2,70]},{5:[2,71]},{5:[2,72]},{5:[2,73]},{58:204,104:se},{104:[2,66]},{17:[2,48]},{17:[2,46]},{17:[2,44]},{5:[2,74]}],defaultActions:{5:[2,1],6:[2,2],108:[2,68],109:[2,69],150:[2,60],151:[2,105],152:[2,61],153:[2,62],154:[2,63],180:[2,75],183:[2,58],184:[2,59],195:[2,70],196:[2,71],197:[2,72],198:[2,73],200:[2,66],201:[2,48],202:[2,46],203:[2,44],204:[2,74]},parseError:o(function(ge,Ie){if(Ie.recoverable)this.trace(ge);else{var qe=new Error(ge);throw qe.hash=Ie,qe}},"parseError"),parse:o(function(ge){var Ie=this,qe=[0],Pe=[],Xe=[null],oe=[],et=this.table,he="",ot=0,Dt=0,It=0,wt=2,Rt=1,it=oe.slice.call(arguments,1),at=Object.create(this.lexer),Ct={yy:{}};for(var yt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,yt)&&(Ct.yy[yt]=this.yy[yt]);at.setInput(ge,Ct.yy),Ct.yy.lexer=at,Ct.yy.parser=this,typeof at.yylloc>"u"&&(at.yylloc={});var dt=at.yylloc;oe.push(dt);var Ht=at.options&&at.options.ranges;typeof Ct.yy.parseError=="function"?this.parseError=Ct.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function cr(Cr){qe.length=qe.length-2*Cr,Xe.length=Xe.length-Cr,oe.length=oe.length-Cr}o(cr,"popStack");function Kt(){var Cr;return Cr=Pe.pop()||at.lex()||Rt,typeof Cr!="number"&&(Cr instanceof Array&&(Pe=Cr,Cr=Pe.pop()),Cr=Ie.symbols_[Cr]||Cr),Cr}o(Kt,"lex");for(var kr,ur,tr,hr,_n,mt,Le={},ct,St,Mr,tn;;){if(tr=qe[qe.length-1],this.defaultActions[tr]?hr=this.defaultActions[tr]:((kr===null||typeof kr>"u")&&(kr=Kt()),hr=et[tr]&&et[tr][kr]),typeof hr>"u"||!hr.length||!hr[0]){var cn="";tn=[];for(ct in et[tr])this.terminals_[ct]&&ct>wt&&tn.push("'"+this.terminals_[ct]+"'");at.showPosition?cn="Parse error on line "+(ot+1)+`: -`+at.showPosition()+` -Expecting `+tn.join(", ")+", got '"+(this.terminals_[kr]||kr)+"'":cn="Parse error on line "+(ot+1)+": Unexpected "+(kr==Rt?"end of input":"'"+(this.terminals_[kr]||kr)+"'"),this.parseError(cn,{text:at.match,token:this.terminals_[kr]||kr,line:at.yylineno,loc:dt,expected:tn})}if(hr[0]instanceof Array&&hr.length>1)throw new Error("Parse Error: multiple actions possible at state: "+tr+", token: "+kr);switch(hr[0]){case 1:qe.push(kr),Xe.push(at.yytext),oe.push(at.yylloc),qe.push(hr[1]),kr=null,ur?(kr=ur,ur=null):(Dt=at.yyleng,he=at.yytext,ot=at.yylineno,dt=at.yylloc,It>0&&It--);break;case 2:if(St=this.productions_[hr[1]][1],Le.$=Xe[Xe.length-St],Le._$={first_line:oe[oe.length-(St||1)].first_line,last_line:oe[oe.length-1].last_line,first_column:oe[oe.length-(St||1)].first_column,last_column:oe[oe.length-1].last_column},Ht&&(Le._$.range=[oe[oe.length-(St||1)].range[0],oe[oe.length-1].range[1]]),mt=this.performAction.apply(Le,[he,Dt,ot,Ct.yy,hr[1],Xe,oe].concat(it)),typeof mt<"u")return mt;St&&(qe=qe.slice(0,-1*St*2),Xe=Xe.slice(0,-1*St),oe=oe.slice(0,-1*St)),qe.push(this.productions_[hr[1]][0]),Xe.push(Le.$),oe.push(Le._$),Mr=et[qe[qe.length-2]][qe[qe.length-1]],qe.push(Mr);break;case 3:return!0}}return!0},"parse")},pe=(function(){var Re={EOF:1,parseError:o(function(Ie,qe){if(this.yy.parser)this.yy.parser.parseError(Ie,qe);else throw new Error(Ie)},"parseError"),setInput:o(function(ge,Ie){return this.yy=Ie||this.yy||{},this._input=ge,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var ge=this._input[0];this.yytext+=ge,this.yyleng++,this.offset++,this.match+=ge,this.matched+=ge;var Ie=ge.match(/(?:\r\n?|\n).*/g);return Ie?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ge},"input"),unput:o(function(ge){var Ie=ge.length,qe=ge.split(/(?:\r\n?|\n)/g);this._input=ge+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ie),this.offset-=Ie;var Pe=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),qe.length-1&&(this.yylineno-=qe.length-1);var Xe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:qe?(qe.length===Pe.length?this.yylloc.first_column:0)+Pe[Pe.length-qe.length].length-qe[0].length:this.yylloc.first_column-Ie},this.options.ranges&&(this.yylloc.range=[Xe[0],Xe[0]+this.yyleng-Ie]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(ge){this.unput(this.match.slice(ge))},"less"),pastInput:o(function(){var ge=this.matched.substr(0,this.matched.length-this.match.length);return(ge.length>20?"...":"")+ge.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var ge=this.match;return ge.length<20&&(ge+=this._input.substr(0,20-ge.length)),(ge.substr(0,20)+(ge.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var ge=this.pastInput(),Ie=new Array(ge.length+1).join("-");return ge+this.upcomingInput()+` -`+Ie+"^"},"showPosition"),test_match:o(function(ge,Ie){var qe,Pe,Xe;if(this.options.backtrack_lexer&&(Xe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Xe.yylloc.range=this.yylloc.range.slice(0))),Pe=ge[0].match(/(?:\r\n?|\n).*/g),Pe&&(this.yylineno+=Pe.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Pe?Pe[Pe.length-1].length-Pe[Pe.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ge[0].length},this.yytext+=ge[0],this.match+=ge[0],this.matches=ge,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ge[0].length),this.matched+=ge[0],qe=this.performAction.call(this,this.yy,this,Ie,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),qe)return qe;if(this._backtrack){for(var oe in Xe)this[oe]=Xe[oe];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ge,Ie,qe,Pe;this._more||(this.yytext="",this.match="");for(var Xe=this._currentRules(),oe=0;oeIe[0].length)){if(Ie=qe,Pe=oe,this.options.backtrack_lexer){if(ge=this.test_match(qe,Xe[oe]),ge!==!1)return ge;if(this._backtrack){Ie=!1;continue}else return!1}else if(!this.options.flex)break}return Ie?(ge=this.test_match(Ie,Xe[Pe]),ge!==!1?ge:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ie=this.next();return Ie||this.lex()},"lex"),begin:o(function(Ie){this.conditionStack.push(Ie)},"begin"),popState:o(function(){var Ie=this.conditionStack.length-1;return Ie>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ie){return Ie=this.conditionStack.length-1-Math.abs(Ie||0),Ie>=0?this.conditionStack[Ie]:"INITIAL"},"topState"),pushState:o(function(Ie){this.begin(Ie)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(Ie,qe,Pe,Xe){var oe=Xe;switch(Pe){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 20;case 7:return this.begin("CONFIG"),75;break;case 8:return 76;case 9:return this.popState(),this.begin("ALIAS"),77;break;case 10:return this.popState(),this.popState(),77;break;case 11:return qe.yytext=qe.yytext.trim(),73;break;case 12:return qe.yytext=qe.yytext.trim(),this.begin("ALIAS"),73;break;case 13:return qe.yytext=qe.yytext.trim(),this.popState(),73;break;case 14:return this.popState(),10;break;case 15:return this.begin("LINE"),15;break;case 16:return this.begin("ID"),51;break;case 17:return this.begin("ID"),53;break;case 18:return 14;case 19:return this.begin("ID"),54;break;case 20:return this.popState(),this.popState(),this.begin("LINE"),52;break;case 21:return this.popState(),this.popState(),5;break;case 22:return this.begin("LINE"),37;break;case 23:return this.begin("LINE"),38;break;case 24:return this.begin("LINE"),39;break;case 25:return this.begin("LINE"),40;break;case 26:return this.begin("LINE"),50;break;case 27:return this.begin("LINE"),42;break;case 28:return this.begin("LINE"),44;break;case 29:return this.begin("LINE"),49;break;case 30:return this.begin("LINE"),45;break;case 31:return this.begin("LINE"),48;break;case 32:return this.begin("LINE"),47;break;case 33:return this.popState(),16;break;case 34:return 17;case 35:return 67;case 36:return 68;case 37:return 61;case 38:return 62;case 39:return 63;case 40:return 64;case 41:return 59;case 42:return 56;case 43:return this.begin("ID"),22;break;case 44:return this.begin("ID"),24;break;case 45:return 30;case 46:return 31;case 47:return this.begin("acc_title"),32;break;case 48:return this.popState(),"acc_title_value";break;case 49:return this.begin("acc_descr"),34;break;case 50:return this.popState(),"acc_descr_value";break;case 51:this.begin("acc_descr_multiline");break;case 52:this.popState();break;case 53:return"acc_descr_multiline_value";case 54:return 6;case 55:return 19;case 56:return 21;case 57:return 66;case 58:return 5;case 59:return qe.yytext=qe.yytext.trim(),73;break;case 60:return 80;case 61:return 97;case 62:return 98;case 63:return 99;case 64:return 78;case 65:return 79;case 66:return 100;case 67:return 101;case 68:return 102;case 69:return 103;case 70:return 85;case 71:return 86;case 72:return 87;case 73:return 88;case 74:return 93;case 75:return 94;case 76:return 95;case 77:return 96;case 78:return 81;case 79:return 82;case 80:return 83;case 81:return 84;case 82:return 89;case 83:return 90;case 84:return 91;case 85:return 92;case 86:return 104;case 87:return 104;case 88:return 70;case 89:return 71;case 90:return 72;case 91:return 5;case 92:return 10}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:@\{)/i,/^(?:[^\}]+)/i,/^(?:\}(?=\s+as\s))/i,/^(?:\})/i,/^(?:[^\<->\->:\n,;@\s]+(?=@\{))/i,/^(?:[^<>:\n,;@\s]+(?=\s+as\s))/i,/^(?:[^<>:\n,;@]+(?=\s*[\n;#]|$))/i,/^(?:[^<>:\n,;@]*<[^\n]*)/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\/\\\+\()\+<\->\->:\n,;]+((?!(-x|--x|-\)|--\)|-\|\\|-\\|-\/|-\/\/|-\|\/|\/\|-|\\\|-|\/\/-|\\\\-|\/\|-|--\|\\|--|\(\)))[\-]*[^\+<\->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?:--\|\\)/i,/^(?:--\|\/)/i,/^(?:--\\\\)/i,/^(?:--\/\/)/i,/^(?:\/\|--)/i,/^(?:\\\|--)/i,/^(?:\/\/--)/i,/^(?:\\\\--)/i,/^(?:-\|\\)/i,/^(?:-\|\/)/i,/^(?:-\\\\)/i,/^(?:-\/\/)/i,/^(?:\/\|-)/i,/^(?:\\\|-)/i,/^(?:\/\/-)/i,/^(?:\\\\-)/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:\(\))/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[52,53],inclusive:!1},acc_descr:{rules:[50],inclusive:!1},acc_title:{rules:[48],inclusive:!1},ID:{rules:[2,3,7,11,12,13,14],inclusive:!1},ALIAS:{rules:[2,3,20,21],inclusive:!1},LINE:{rules:[2,3,33],inclusive:!1},CONFIG:{rules:[8,9,10],inclusive:!1},CONFIG_DATA:{rules:[],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,15,16,17,18,19,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,49,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92],inclusive:!0}}};return Re})();be.lexer=pe;function me(){this.yy={}}return o(me,"Parser"),me.prototype=be,be.Parser=me,new me})();tU.parser=tU;_we=tU});var Olt,Plt,Blt,p3,G7,rU=O(()=>{"use strict";jt();ib();xt();fq();Ur();si();Olt={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34,SOLID_TOP:41,SOLID_BOTTOM:42,STICK_TOP:43,STICK_BOTTOM:44,SOLID_ARROW_TOP_REVERSE:45,SOLID_ARROW_BOTTOM_REVERSE:46,STICK_ARROW_TOP_REVERSE:47,STICK_ARROW_BOTTOM_REVERSE:48,SOLID_TOP_DOTTED:51,SOLID_BOTTOM_DOTTED:52,STICK_TOP_DOTTED:53,STICK_BOTTOM_DOTTED:54,SOLID_ARROW_TOP_REVERSE_DOTTED:55,SOLID_ARROW_BOTTOM_REVERSE_DOTTED:56,STICK_ARROW_TOP_REVERSE_DOTTED:57,STICK_ARROW_BOTTOM_REVERSE_DOTTED:58,CENTRAL_CONNECTION:59,CENTRAL_CONNECTION_REVERSE:60,CENTRAL_CONNECTION_DUAL:61},Plt={FILLED:0,OPEN:1},Blt={LEFTOF:0,RIGHTOF:1,OVER:2},p3={ACTOR:"actor",BOUNDARY:"boundary",COLLECTIONS:"collections",CONTROL:"control",DATABASE:"database",ENTITY:"entity",PARTICIPANT:"participant",QUEUE:"queue"},G7=class{constructor(){this.state=new Rv(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0}));this.setAccTitle=Lr;this.setAccDescription=Pr;this.setDiagramTitle=zr;this.getAccTitle=Or;this.getAccDescription=Br;this.getDiagramTitle=Fr;this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(ve().wrap),this.LINETYPE=Olt,this.ARROWTYPE=Plt,this.PLACEMENT=Blt}static{o(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,r,n,i,a){let s=this.state.records.currentBox,l;if(a!==void 0){let h;a.includes(` -`)?h=a+` -`:h=`{ -`+a+` -}`,l=Kf(h,{schema:Xf})}i=l?.type??i,l?.alias&&(!n||n.text===r)&&(n={text:l.alias,wrap:n?.wrap,type:i});let u=this.state.records.actors.get(e);if(u){if(this.state.records.currentBox&&u.box&&this.state.records.currentBox!==u.box)throw new Error(`A same participant should only be defined in one Box: ${u.name} can't be in '${u.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(s=u.box?u.box:this.state.records.currentBox,u.box=s,u&&r===u.name&&n==null)return}if(n?.text==null&&(n={text:r,type:i}),(i==null||n.text==null)&&(n={text:r,type:i}),this.state.records.actors.set(e,{box:s,name:r,description:n.text,wrap:n.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:i??"participant"}),this.state.records.prevActor){let h=this.state.records.actors.get(this.state.records.prevActor);h&&(h.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let r,n=0;if(!e)return 0;for(r=0;r>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},u}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:r,message:n?.text??"",wrap:n?.wrap??this.autoWrap(),type:i,activate:a,centralConnection:s??0}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let r=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(r===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:r}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:ve().sequence?.wrap??!1}clear(){this.state.reset(),_r()}parseMessage(e){let r=e.trim(),{wrap:n,cleanedText:i}=this.extractWrap(r),a={text:i,wrap:n};return K.debug(`parseMessage: ${JSON.stringify(a)}`),a}parseBoxData(e){let r=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),n=r?.[1]?r[1].trim():"transparent",i=r?.[2]?r[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",n)||(n="transparent",i=e.trim());else{let l=new Option().style;l.color=n,l.color!==n&&(n="transparent",i=e.trim())}let{wrap:a,cleanedText:s}=this.extractWrap(i);return{text:s?wr(s,ve()):void 0,color:n,wrap:a}}addNote(e,r,n){let i={actor:e,placement:r,message:n.text,wrap:n.wrap??this.autoWrap()},a=[].concat(e,e);this.state.records.notes.push(i),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:a[0],to:a[1],message:n.text,wrap:n.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:r})}addLinks(e,r){let n=this.getActor(e);try{let i=wr(r.text,ve());i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let a=JSON.parse(i);this.insertLinks(n,a)}catch(i){K.error("error while parsing actor link text",i)}}addALink(e,r){let n=this.getActor(e);try{let i={},a=wr(r.text,ve()),s=a.indexOf("@");a=a.replace(/=/g,"="),a=a.replace(/&/g,"&");let l=a.slice(0,s-1).trim(),u=a.slice(s+1).trim();i[l]=u,this.insertLinks(n,i)}catch(i){K.error("error while parsing actor link text",i)}}insertLinks(e,r){if(e.links==null)e.links=r;else for(let n in r)e.links[n]=r[n]}addProperties(e,r){let n=this.getActor(e);try{let i=wr(r.text,ve()),a=JSON.parse(i);this.insertProperties(n,a)}catch(i){K.error("error while parsing actor properties text",i)}}insertProperties(e,r){if(e.properties==null)e.properties=r;else for(let n in r)e.properties[n]=r[n]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,r){let n=this.getActor(e),i=document.getElementById(r.text);try{let a=i.innerHTML,s=JSON.parse(a);s.properties&&this.insertProperties(n,s.properties),s.links&&this.insertLinks(n,s.links)}catch(a){K.error("error while parsing actor details text",a)}}getActorProperty(e,r){if(e?.properties!==void 0)return e.properties[r]}apply(e){if(Array.isArray(e))e.forEach(r=>{this.apply(r)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw,e.config);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw,e.config),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"centralConnection":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"centralConnectionReverse":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate,e.centralConnection);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":Lr(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return ve().sequence}}});var Flt,Rwe,Lwe=O(()=>{"use strict";Flt=o(t=>`.actor { - stroke: ${t.actorBorder}; - fill: ${t.actorBkg}; - } - - text.actor > tspan { - fill: ${t.actorTextColor}; - stroke: none; - } - - .actor-line { - stroke: ${t.actorLineColor}; - } - - .innerArc { - stroke-width: 1.5; - stroke-dasharray: none; - } - - .messageLine0 { - stroke-width: 1.5; - stroke-dasharray: none; - stroke: ${t.signalColor}; - } - - .messageLine1 { - stroke-width: 1.5; - stroke-dasharray: 2, 2; - stroke: ${t.signalColor}; - } - - #arrowhead path { - fill: ${t.signalColor}; - stroke: ${t.signalColor}; - } - - .sequenceNumber { - fill: ${t.sequenceNumberColor}; - } - - #sequencenumber { - fill: ${t.signalColor}; - } - - #crosshead path { - fill: ${t.signalColor}; - stroke: ${t.signalColor}; - } - - .messageText { - fill: ${t.signalTextColor}; - stroke: none; - } - - .labelBox { - stroke: ${t.labelBoxBorderColor}; - fill: ${t.labelBoxBkgColor}; - } - - .labelText, .labelText > tspan { - fill: ${t.labelTextColor}; - stroke: none; - } - - .loopText, .loopText > tspan { - fill: ${t.loopTextColor}; - stroke: none; - } - - .loopLine { - stroke-width: 2px; - stroke-dasharray: 2, 2; - stroke: ${t.labelBoxBorderColor}; - fill: ${t.labelBoxBorderColor}; - } - - .note { - //stroke: #decc93; - stroke: ${t.noteBorderColor}; - fill: ${t.noteBkgColor}; - } - - .noteText, .noteText > tspan { - fill: ${t.noteTextColor}; - stroke: none; - } - - .activation0 { - fill: ${t.activationBkgColor}; - stroke: ${t.activationBorderColor}; - } - - .activation1 { - fill: ${t.activationBkgColor}; - stroke: ${t.activationBorderColor}; - } - - .activation2 { - fill: ${t.activationBkgColor}; - stroke: ${t.activationBorderColor}; - } - - .actorPopupMenu { - position: absolute; - } - - .actorPopupMenuPanel { - position: absolute; - fill: ${t.actorBkg}; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); -} - .actor-man line { - stroke: ${t.actorBorder}; - fill: ${t.actorBkg}; - } - .actor-man circle, line { - stroke: ${t.actorBorder}; - fill: ${t.actorBkg}; - stroke-width: 2px; - } - -`,"getStyles"),Rwe=Flt});var nU,pp,mp,gp,V7,Ym,m3,$lt,q7,g3,jm,Nwe,Qr,iU,zlt,Glt,Vlt,qlt,Ult,Wlt,Hlt,Ylt,jlt,Xlt,Klt,Qlt,Zlt,Mwe,Jlt,ect,tct,rct,nct,ict,act,Iwe,sct,lf,oct,lct,cct,uct,hct,Qn,Owe=O(()=>{"use strict";nU=Ra(Wg(),1);$r();ar();Ur();a0();pp=36,mp="actor-top",gp="actor-bottom",V7="actor-box",Ym="actor-man",m3=o(function(t,e){return i0(t,e)},"drawRect"),$lt=o(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,l=e.rectData;var u="none";i&&(u="block !important");let h=t.append("g");h.attr("id","actor"+s+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",u);var f="";l.class!==void 0&&(f=" "+l.class);let d=l.width>r?l.width:r,p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+f),p.attr("x",l.x),p.attr("y",l.height),p.attr("fill",l.fill),p.attr("stroke",l.stroke),p.attr("width",d),p.attr("height",l.height),p.attr("rx",l.rx),p.attr("ry",l.ry),a!=null){var m=20;for(let v in a){var g=h.append("a"),y=(0,nU.sanitizeUrl)(a[v]);g.attr("xlink:href",y),g.attr("target","_blank"),oct(n)(v,g,l.x+10,l.height+m,d,20,{class:"actor"},n),m+=30}}return p.attr("height",m),{height:l.height+m,width:d}},"drawPopup"),q7=o(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),g3=o(async function(t,e,r=null){let n=t.append("foreignObject"),i=await gg(e.text,Zt()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let l=t.node().firstChild;l.setAttribute("height",s.height+2*e.textMargin);let u=l.getBBox();n.attr("x",Math.round(u.x+u.width/2-s.width/2)).attr("y",Math.round(u.y+u.height/2-s.height/2))}else if(r){let{startx:l,stopx:u,starty:h}=r;if(l>u){let f=l;l=u,u=f}n.attr("x",Math.round(l+Math.abs(l-u)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(h)):n.attr("y",Math.round(h-s.height))}return[n]},"drawKatex"),jm=o(function(t,e){let r=0,n=0,i=e.text.split(st.lineBreakRegex),[a,s]=Uo(e.fontSize),l=[],u=0,h=o(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":h=o(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":h=o(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":h=o(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[f,d]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(u=f*a);let p=t.append("text");p.attr("x",e.x),p.attr("y",h()),e.anchor!==void 0&&p.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&p.style("font-family",e.fontFamily),s!==void 0&&p.style("font-size",s),e.fontWeight!==void 0&&p.style("font-weight",e.fontWeight),e.fill!==void 0&&p.attr("fill",e.fill),e.class!==void 0&&p.attr("class",e.class),e.dy!==void 0?p.attr("dy",e.dy):u!==0&&p.attr("dy",u);let m=d||AN;if(e.tspan){let g=p.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(m)}else p.text(m);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(p._groups||p)[0][0].getBBox().height,r=n),l.push(p)}return l},"drawText"),Nwe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,jm(t,e),n},"drawLabel"),Qr=-1,iU=o((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),zlt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Qr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",q7(`actor${Qr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Qr,e.links!=null&&u.attr("id","root-"+Qr));let h=Oa();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${gp}`:f+=` ${mp}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.rx=3,h.ry=3,h.name=e.name;let d=m3(u,h);if(e.rectData=h,e.properties?.icon){let m=e.properties.icon.trim();m.charAt(0)==="@"?ak(u,h.x+h.width-20,h.y+10,m.substr(1)):ik(u,h.x+h.width-20,h.y+10,m)}lf(r,Jn(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${V7}`},r);let p=e.height;if(d.node){let m=d.node().getBBox();e.height=m.height,p=m.height}return p},"drawActorTypeParticipant"),Glt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Qr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",q7(`actor${Qr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Qr,e.links!=null&&u.attr("id","root-"+Qr));let h=Oa();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${gp}`:f+=` ${mp}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name;let d=6,p={...h,x:h.x+-d,y:h.y+ +d,class:"actor"},m=m3(u,h);if(m3(u,p),e.rectData=h,e.properties?.icon){let y=e.properties.icon.trim();y.charAt(0)==="@"?ak(u,h.x+h.width-20,h.y+10,y.substr(1)):ik(u,h.x+h.width-20,h.y+10,y)}lf(r,Jn(e.description))(e.description,u,h.x-d,h.y+d,h.width,h.height,{class:`actor ${V7}`},r);let g=e.height;if(m.node){let y=m.node().getBBox();e.height=y.height,g=y.height}return g},"drawActorTypeCollections"),Vlt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower(),u=l;n||(Qr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",q7(`actor${Qr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Qr,e.links!=null&&u.attr("id","root-"+Qr));let h=Oa(),f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${gp}`:f+=` ${mp}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name;let d=h.height/2,p=d/(2.5+h.height/50),m=u.append("g"),g=u.append("g");if(m.append("path").attr("d",`M ${h.x},${h.y+d} - a ${p},${d} 0 0 0 0,${h.height} - h ${h.width-2*p} - a ${p},${d} 0 0 0 0,-${h.height} - Z - `).attr("class",f),g.append("path").attr("d",`M ${h.x},${h.y+d} - a ${p},${d} 0 0 0 0,${h.height}`).attr("stroke","#666").attr("stroke-width","1px").attr("class",f),m.attr("transform",`translate(${p}, ${-(h.height/2)})`),g.attr("transform",`translate(${h.width-p}, ${-h.height/2})`),e.rectData=h,e.properties?.icon){let x=e.properties.icon.trim(),b=h.x+h.width-20,T=h.y+10;x.charAt(0)==="@"?ak(u,b,T,x.substr(1)):ik(u,b,T,x)}lf(r,Jn(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${V7}`},r);let y=e.height,v=m.select("path:last-child");if(v.node()){let x=v.node().getBBox();e.height=x.height,y=x.height}return y},"drawActorTypeQueue"),qlt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+75,l=t.append("g").lower();n||(Qr++,l.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Qr);let u=t.append("g"),h=Ym;n?h+=` ${gp}`:h+=` ${mp}`,u.attr("class",h),u.attr("name",e.name);let f=Oa();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor";let d=e.x+e.width/2,p=i+32,m=22;u.append("defs").append("marker").attr("id","filled-head-control").attr("refX",11).attr("refY",5.8).attr("markerWidth",20).attr("markerHeight",28).attr("orient","172.5").append("path").attr("d","M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z"),u.append("circle").attr("cx",d).attr("cy",p).attr("r",m).attr("fill","#eaeaf7").attr("stroke","#666").attr("stroke-width",1.2),u.append("line").attr("marker-end","url(#filled-head-control)").attr("transform",`translate(${d}, ${p-m})`);let g=u.node().getBBox();return e.height=g.height+2*(r?.sequence?.labelBoxHeight??0),lf(r,Jn(e.description))(e.description,u,f.x,f.y+m+(n?5:12),f.width,f.height,{class:`actor ${Ym}`},r),e.height},"drawActorTypeControl"),Ult=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+75,l=t.append("g").lower(),u=t.append("g"),h="actor";n?h+=` ${gp}`:h+=` ${mp}`,u.attr("class",h),u.attr("name",e.name);let f=Oa();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor";let d=e.x+e.width/2,p=i+(n?10:25),m=22;u.append("circle").attr("cx",d).attr("cy",p).attr("r",m).attr("width",e.width).attr("height",e.height),u.append("line").attr("x1",d-m).attr("x2",d+m).attr("y1",p+m).attr("y2",p+m).attr("stroke-width",2);let g=u.node().getBBox();return e.height=g.height+(r?.sequence?.labelBoxHeight??0),n||(Qr++,l.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Qr),lf(r,Jn(e.description))(e.description,u,f.x,f.y+(n?15:30),f.width,f.height,{class:`actor ${Ym}`},r),n?u.attr("transform",`translate(0, ${m})`):u.attr("transform",`translate(0, ${m/2-5})`),e.height},"drawActorTypeEntity"),Wlt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height+2*r.boxTextMargin,l=t.append("g").lower(),u=l;n||(Qr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",q7(`actor${Qr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Qr,e.links!=null&&u.attr("id","root-"+Qr));let h=Oa(),f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${gp}`:f+=` ${mp}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name,h.x=e.x,h.y=i;let d=h.width/3,p=h.width/3,m=d/2,g=m/(2.5+d/50),y=u.append("g"),v=` - M ${h.x},${h.y+g} - a ${m},${g} 0 0 0 ${d},0 - a ${m},${g} 0 0 0 -${d},0 - l 0,${p-2*g} - a ${m},${g} 0 0 0 ${d},0 - l 0,-${p-2*g} -`;y.append("path").attr("d",v).attr("fill","#eaeaea").attr("stroke","#000").attr("stroke-width",1).attr("class",f),y.attr("transform",`translate(${d}, ${g})`),e.rectData=h,lf(r,Jn(e.description))(e.description,u,h.x,h.y+35,h.width,h.height,{class:`actor ${V7}`},r);let x=y.select("path:last-child");if(x.node()){let b=x.node().getBBox();e.height=b.height+(r.sequence.labelBoxHeight??0)}return e.height},"drawActorTypeDatabase"),Hlt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=22,u=t.append("g").lower();n||(Qr++,u.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Qr);let h=t.append("g"),f=Ym;n?f+=` ${gp}`:f+=` ${mp}`,h.attr("class",f),h.attr("name",e.name);let d=Oa();d.x=e.x,d.y=i,d.fill="#eaeaea",d.width=e.width,d.height=e.height,d.class="actor",h.append("line").attr("id","actor-man-torso"+Qr).attr("x1",e.x+e.width/2-l*2.5).attr("y1",i+12).attr("x2",e.x+e.width/2-15).attr("y2",i+12),h.append("line").attr("id","actor-man-arms"+Qr).attr("x1",e.x+e.width/2-l*2.5).attr("y1",i+2).attr("x2",e.x+e.width/2-l*2.5).attr("y2",i+22),h.append("circle").attr("cx",e.x+e.width/2).attr("cy",i+12).attr("r",l);let p=h.node().getBBox();return e.height=p.height+(r.sequence.labelBoxHeight??0),lf(r,Jn(e.description))(e.description,h,d.x,d.y+15,d.width,d.height,{class:`actor ${Ym}`},r),n?h.attr("transform",`translate(0,${l/2+10})`):h.attr("transform",`translate(0,${l/2+10})`),e.height},"drawActorTypeBoundary"),Ylt=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=t.append("g").lower();n||(Qr++,l.append("line").attr("id","actor"+Qr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Qr);let u=t.append("g"),h=Ym;n?h+=` ${gp}`:h+=` ${mp}`,u.attr("class",h),u.attr("name",e.name);let f=Oa();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor",f.rx=3,f.ry=3,u.append("line").attr("id","actor-man-torso"+Qr).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),u.append("line").attr("id","actor-man-arms"+Qr).attr("x1",a-pp/2).attr("y1",i+33).attr("x2",a+pp/2).attr("y2",i+33),u.append("line").attr("x1",a-pp/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),u.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+pp/2-2).attr("y2",i+60);let d=u.append("circle");d.attr("cx",e.x+e.width/2),d.attr("cy",i+10),d.attr("r",15),d.attr("width",e.width),d.attr("height",e.height);let p=u.node().getBBox();return e.height=p.height,lf(r,Jn(e.description))(e.description,u,f.x,f.y+35,f.width,f.height,{class:`actor ${Ym}`},r),e.height},"drawActorTypeActor"),jlt=o(async function(t,e,r,n){switch(e.type){case"actor":return await Ylt(t,e,r,n);case"participant":return await zlt(t,e,r,n);case"boundary":return await Hlt(t,e,r,n);case"control":return await qlt(t,e,r,n);case"entity":return await Ult(t,e,r,n);case"database":return await Wlt(t,e,r,n);case"collections":return await Glt(t,e,r,n);case"queue":return await Vlt(t,e,r,n)}},"drawActor"),Xlt=o(function(t,e,r){let i=t.append("g");Mwe(i,e),e.name&&lf(r)(e.name,i,e.x,e.y+r.boxTextMargin+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),Klt=o(function(t){return t.append("g")},"anchorElement"),Qlt=o(function(t,e,r,n,i){let a=Oa(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,m3(s,a)},"drawActivation"),Zlt=o(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:l,messageFontFamily:u,messageFontSize:h,messageFontWeight:f}=n,d=t.append("g"),p=o(function(y,v,x,b){return d.append("line").attr("x1",y).attr("y1",v).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");p(e.startx,e.starty,e.stopx,e.starty),p(e.stopx,e.starty,e.stopx,e.stopy),p(e.startx,e.stopy,e.stopx,e.stopy),p(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(y){p(e.startx,y.y,e.stopx,y.y).style("stroke-dasharray","3, 3")});let m=Fx();m.text=r,m.x=e.startx,m.y=e.starty,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.anchor="middle",m.valign="middle",m.tspan=!1,m.width=l||50,m.height=s||20,m.textMargin=a,m.class="labelText",Nwe(d,m),m=Iwe(),m.text=e.title,m.x=e.startx+l/2+(e.stopx-e.startx)/2,m.y=e.starty+i+a,m.anchor="middle",m.valign="middle",m.textMargin=a,m.class="loopText",m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=!0;let g=Jn(m.text)?await g3(d,m,e):jm(d,m);if(e.sectionTitles!==void 0){for(let[y,v]of Object.entries(e.sectionTitles))if(v.message){m.text=v.message,m.x=e.startx+(e.stopx-e.startx)/2,m.y=e.sections[y].y+i+a,m.class="loopText",m.anchor="middle",m.valign="middle",m.tspan=!1,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=e.wrap,Jn(m.text)?(e.starty=e.sections[y].y,await g3(d,m,e)):jm(d,m);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,T)=>b+T));e.sections[y].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),d},"drawLoop"),Mwe=o(function(t,e){nk(t,e)},"drawBackgroundRect"),Jlt=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),ect=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),tct=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),rct=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),nct=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),ict=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),act=o(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),Iwe=o(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),sct=o(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),lf=(function(){function t(a,s,l,u,h,f,d){let p=s.append("text").attr("x",l+h/2).attr("y",u+f/2+5).style("text-anchor","middle").text(a);i(p,d)}o(t,"byText");function e(a,s,l,u,h,f,d,p){let{actorFontSize:m,actorFontFamily:g,actorFontWeight:y}=p,[v,x]=Uo(m),b=a.split(st.lineBreakRegex);for(let T=0;T{let s=Xm(Ve),l=a.actorKeys.reduce((d,p)=>d+=t.get(p).width+(t.get(p).margin||0),0),u=Ve.boxMargin*8;l+=u,l-=2*Ve.boxTextMargin,a.wrap&&(a.name=Xt.wrapLabel(a.name,l-2*Ve.wrapPadding,s));let h=Xt.calculateTextDimensions(a.name,s);i=st.getMax(h.height,i);let f=st.getMax(l,h.width+2*Ve.wrapPadding);if(a.margin=Ve.boxTextMargin,la.textMaxHeight=i),st.getMax(n,Ve.height)}var Ve,ut,fct,dct,Xm,Bv,aU,mct,gct,sU,Fwe,$we,U7,Pwe,vct,bct,wct,kct,Ect,Bwe,Sct,zwe,Cct,Act,_ct,Gwe,Vwe=O(()=>{"use strict";Ar();Owe();xt();Ur();Ur();a0();jt();sg();ar();Ti();rU();Ve={},ut={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:o(function(){return Math.max.apply(null,this.actors.length===0?[0]:this.actors.map(t=>t.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:o(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:o(function(t){this.boxes.push(t)},"addBox"),addActor:o(function(t){this.actors.push(t)},"addActor"),addLoop:o(function(t){this.loops.push(t)},"addLoop"),addMessage:o(function(t){this.messages.push(t)},"addMessage"),addNote:o(function(t){this.notes.push(t)},"addNote"),lastActor:o(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:o(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:o(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:o(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:o(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,$we(ve())},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=this,a=0;function s(l){return o(function(h){a++;let f=i.sequenceItems.length-a+1;i.updateVal(h,"starty",e-f*Ve.boxMargin,Math.min),i.updateVal(h,"stopy",n+f*Ve.boxMargin,Math.max),i.updateVal(ut.data,"startx",t-f*Ve.boxMargin,Math.min),i.updateVal(ut.data,"stopx",r+f*Ve.boxMargin,Math.max),l!=="activation"&&(i.updateVal(h,"startx",t-f*Ve.boxMargin,Math.min),i.updateVal(h,"stopx",r+f*Ve.boxMargin,Math.max),i.updateVal(ut.data,"starty",e-f*Ve.boxMargin,Math.min),i.updateVal(ut.data,"stopy",n+f*Ve.boxMargin,Math.max))},"updateItemBounds")}o(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:o(function(t,e,r,n){let i=st.getMin(t,r),a=st.getMax(t,r),s=st.getMin(e,n),l=st.getMax(e,n);this.updateVal(ut.data,"startx",i,Math.min),this.updateVal(ut.data,"starty",s,Math.min),this.updateVal(ut.data,"stopx",a,Math.max),this.updateVal(ut.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),newActivation:o(function(t,e,r){let n=r.get(t.from),i=U7(t.from).length||0,a=n.x+n.width/2+(i-1)*Ve.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Ve.activationWidth,stopy:void 0,actor:t.from,anchored:Qn.anchorElement(e)})},"newActivation"),endActivation:o(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:o(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:o(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:o(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:ut.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:o(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:o(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=st.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return{bounds:this.data,models:this.models}},"getBounds")},fct=o(async function(t,e){ut.bumpVerticalPos(Ve.boxMargin),e.height=Ve.boxMargin,e.starty=ut.getVerticalPos();let r=Oa();r.x=e.startx,r.y=e.starty,r.width=e.width||Ve.width,r.class="note";let n=t.append("g"),i=Qn.drawRect(n,r),a=Fx();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Ve.noteFontFamily,a.fontSize=Ve.noteFontSize,a.fontWeight=Ve.noteFontWeight,a.anchor=Ve.noteAlign,a.textMargin=Ve.noteMargin,a.valign="center";let s=Jn(a.text)?await g3(n,a):jm(n,a),l=Math.round(s.map(u=>(u._groups||u)[0][0].getBBox().height).reduce((u,h)=>u+h));i.attr("height",l+2*Ve.noteMargin),e.height+=l+2*Ve.noteMargin,ut.bumpVerticalPos(l+2*Ve.noteMargin),e.stopy=e.starty+l+2*Ve.noteMargin,e.stopx=e.startx+r.width,ut.insert(e.startx,e.starty,e.stopx,e.stopy),ut.models.addNote(e)},"drawNote"),dct=o(function(t,e,r,n,i,a,s){let l=n.db.getActors(),u=l.get(e.from),h=l.get(e.to),f=r.sequenceVisible,d=u.x+u.width/2,p=h.x+h.width/2,m=d<=p,g=zwe(e,n),y=t.append("g"),v=16.5,x=o((k,S)=>{let A=k?v:-v;return S?-A:A},"getCircleOffset"),b=o(k=>{y.append("circle").attr("cx",k).attr("cy",s).attr("r",5).attr("width",10).attr("height",10)},"drawCircle"),{CENTRAL_CONNECTION:T,CENTRAL_CONNECTION_REVERSE:E,CENTRAL_CONNECTION_DUAL:w}=n.db.LINETYPE;if(f)switch(e.centralConnection){case T:g&&(p+=x(m,!0));break;case E:g||(d+=x(m,!1));break;case w:g?p+=x(m,!0):d+=x(m,!1);break}switch(e.centralConnection){case T:b(p);break;case E:b(d);break;case w:b(d),b(p);break}},"drawCentralConnection"),Xm=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),Bv=o(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),aU=o(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");o(pct,"boundMessage");mct=o(async function(t,e,r,n,i){let{startx:a,stopx:s,starty:l,message:u,type:h,sequenceIndex:f,sequenceVisible:d}=e,p=Xt.calculateTextDimensions(u,Xm(Ve)),m=Fx();m.x=a,m.y=l+10,m.width=s-a,m.class="messageText",m.dy="1em",m.text=u,m.fontFamily=Ve.messageFontFamily,m.fontSize=Ve.messageFontSize,m.fontWeight=Ve.messageFontWeight,m.anchor=Ve.messageAlign,m.valign="center",m.textMargin=Ve.wrapPadding,m.tspan=!1,Jn(m.text)?await g3(t,m,{startx:a,stopx:s,starty:r}):jm(t,m);let g=p.width,y;if(a===s){let x=d||Ve.showSequenceNumbers,b=zwe(i,n),T=Cct(i,n),E=a+(x&&(b||T)?10:0);Ve.rightAngles?y=t.append("path").attr("d",`M ${E},${r} H ${a+st.getMax(Ve.width/2,g/2)} V ${r+25} H ${a}`):y=t.append("path").attr("d","M "+E+","+r+" C "+(E+60)+","+(r-10)+" "+(a+60)+","+(r+30)+" "+a+","+(r+20))}else y=t.append("line"),y.attr("x1",a),y.attr("y1",r),y.attr("x2",s),y.attr("y2",r),Bwe(i,n)&&dct(t,i,e,n,a,s,r);h===n.db.LINETYPE.DOTTED||h===n.db.LINETYPE.DOTTED_CROSS||h===n.db.LINETYPE.DOTTED_POINT||h===n.db.LINETYPE.DOTTED_OPEN||h===n.db.LINETYPE.BIDIRECTIONAL_DOTTED||h===n.db.LINETYPE.SOLID_TOP_DOTTED||h===n.db.LINETYPE.SOLID_BOTTOM_DOTTED||h===n.db.LINETYPE.STICK_TOP_DOTTED||h===n.db.LINETYPE.STICK_BOTTOM_DOTTED||h===n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED||h===n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED||h===n.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED||h===n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED?(y.style("stroke-dasharray","3, 3"),y.attr("class","messageLine1")):y.attr("class","messageLine0");let v="";if(Ve.arrowMarkerAbsolute&&(v=Op(!0)),y.attr("stroke-width",2),y.attr("stroke","none"),y.style("fill","none"),(h===n.db.LINETYPE.SOLID_TOP||h===n.db.LINETYPE.SOLID_TOP_DOTTED)&&y.attr("marker-end","url("+v+"#solidTopArrowHead)"),(h===n.db.LINETYPE.SOLID_BOTTOM||h===n.db.LINETYPE.SOLID_BOTTOM_DOTTED)&&y.attr("marker-end","url("+v+"#solidBottomArrowHead)"),(h===n.db.LINETYPE.STICK_TOP||h===n.db.LINETYPE.STICK_TOP_DOTTED)&&y.attr("marker-end","url("+v+"#stickTopArrowHead)"),(h===n.db.LINETYPE.STICK_BOTTOM||h===n.db.LINETYPE.STICK_BOTTOM_DOTTED)&&y.attr("marker-end","url("+v+"#stickBottomArrowHead)"),(h===n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE||h===n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED)&&y.attr("marker-start","url("+v+"#solidBottomArrowHead)"),(h===n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE||h===n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED)&&y.attr("marker-start","url("+v+"#solidTopArrowHead)"),(h===n.db.LINETYPE.STICK_ARROW_TOP_REVERSE||h===n.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED)&&y.attr("marker-start","url("+v+"#stickBottomArrowHead)"),(h===n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE||h===n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED)&&y.attr("marker-start","url("+v+"#stickTopArrowHead)"),(h===n.db.LINETYPE.SOLID||h===n.db.LINETYPE.DOTTED)&&y.attr("marker-end","url("+v+"#arrowhead)"),(h===n.db.LINETYPE.BIDIRECTIONAL_SOLID||h===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(y.attr("marker-start","url("+v+"#arrowhead)"),y.attr("marker-end","url("+v+"#arrowhead)")),(h===n.db.LINETYPE.SOLID_POINT||h===n.db.LINETYPE.DOTTED_POINT)&&y.attr("marker-end","url("+v+"#filled-head)"),(h===n.db.LINETYPE.SOLID_CROSS||h===n.db.LINETYPE.DOTTED_CROSS)&&y.attr("marker-end","url("+v+"#crosshead)"),d||Ve.showSequenceNumbers){let x=h===n.db.LINETYPE.BIDIRECTIONAL_SOLID||h===n.db.LINETYPE.BIDIRECTIONAL_DOTTED,b=h===n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE||h===n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED||h===n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE||h===n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED||h===n.db.LINETYPE.STICK_ARROW_TOP_REVERSE||h===n.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED||h===n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE||h===n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,T=6,E=Bwe(i,n),w=a,k=s;x?(aa?k=s-2*T:(k=s-T,w+=i?.centralConnection===n.db.LINETYPE.CENTRAL_CONNECTION_DUAL||i?.centralConnection===n.db.LINETYPE.CENTRAL_CONNECTION_REVERSE?-7.5:0),k+=E?15:0,y.attr("x2",k),y.attr("x1",w)):y.attr("x1",a+T);let S=0,A=a===s,L=a<=s;A?S=e.fromBounds+1:b?S=L?e.toBounds-1:e.fromBounds+1:S=L?e.fromBounds+1:e.toBounds-1,t.append("line").attr("x1",S).attr("y1",r).attr("x2",S).attr("y2",r).attr("stroke-width",0).attr("marker-start","url("+v+"#sequencenumber)"),t.append("text").attr("x",S).attr("y",r+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(f)}},"drawMessage"),gct=o(function(t,e,r,n,i,a,s){let l=0,u=0,h,f=0;for(let d of n){let p=e.get(d),m=p.box;h&&h!=m&&(s||ut.models.addBox(h),u+=Ve.boxMargin+h.margin),m&&m!=h&&(s||(m.x=l+u,m.y=i),u+=m.margin),p.width=p.width||Ve.width,p.height=st.getMax(p.height||Ve.height,Ve.height),p.margin=p.margin||Ve.actorMargin,f=st.getMax(f,p.height),r.get(p.name)&&(u+=p.width/2),p.x=l+u,p.starty=ut.getVerticalPos(),ut.insert(p.x,i,p.x+p.width,p.height),l+=p.width+u,p.box&&(p.box.width=l+m.margin-p.box.x),u=p.margin,h=p.box,ut.models.addActor(p)}h&&!s&&ut.models.addBox(h),ut.bumpVerticalPos(f)},"addActorRenderingData"),sU=o(async function(t,e,r,n){if(n){let i=0;ut.bumpVerticalPos(Ve.boxMargin*2);for(let a of r){let s=e.get(a);s.stopy||(s.stopy=ut.getVerticalPos());let l=await Qn.drawActor(t,s,Ve,!0);i=st.getMax(i,l)}ut.bumpVerticalPos(i+Ve.boxMargin)}else for(let i of r){let a=e.get(i);await Qn.drawActor(t,a,Ve,!1)}},"drawActors"),Fwe=o(function(t,e,r,n){let i=0,a=0;for(let s of r){let l=e.get(s),u=bct(l),h=Qn.drawPopup(t,l,u,Ve,Ve.forceMenus,n);h.height>i&&(i=h.height),h.width+l.x>a&&(a=h.width+l.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),$we=o(function(t){Vn(Ve,t),t.fontFamily&&(Ve.actorFontFamily=Ve.noteFontFamily=Ve.messageFontFamily=t.fontFamily),t.fontSize&&(Ve.actorFontSize=Ve.noteFontSize=Ve.messageFontSize=t.fontSize),t.fontWeight&&(Ve.actorFontWeight=Ve.noteFontWeight=Ve.messageFontWeight=t.fontWeight)},"setConf"),U7=o(function(t){return ut.activations.filter(function(e){return e.actor===t})},"actorActivations"),Pwe=o(function(t,e){let r=e.get(t),n=U7(t),i=n.reduce(function(s,l){return st.getMin(s,l.startx)},r.x+r.width/2-1),a=n.reduce(function(s,l){return st.getMax(s,l.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");o(Qu,"adjustLoopHeightForWrap");o(yct,"adjustCreatedDestroyedData");vct=o(async function(t,e,r,n){let{securityLevel:i,sequence:a}=ve();Ve=a;let s;i==="sandbox"&&(s=je("#i"+e));let l=i==="sandbox"?je(s.nodes()[0].contentDocument.body):je("body"),u=i==="sandbox"?s.nodes()[0].contentDocument:document;ut.init(),K.debug(n.db);let h=i==="sandbox"?l.select(`[id="${e}"]`):je(`[id="${e}"]`),f=n.db.getActors(),d=n.db.getCreatedActors(),p=n.db.getDestroyedActors(),m=n.db.getBoxes(),g=n.db.getActorKeys(),y=n.db.getMessages(),v=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),T=await xct(f,y,n);if(Ve.height=await Tct(f,T,m),Qn.insertComputerIcon(h),Qn.insertDatabaseIcon(h),Qn.insertClockIcon(h),x&&(ut.bumpVerticalPos(Ve.boxMargin),b&&ut.bumpVerticalPos(m[0].textMaxHeight)),Ve.hideUnusedParticipants===!0){let B=new Set;y.forEach(F=>{B.add(F.from),B.add(F.to)}),g=g.filter(F=>B.has(F))}gct(h,f,d,g,0,y,!1);let E=await _ct(y,f,T,n);Qn.insertArrowHead(h),Qn.insertArrowCrossHead(h),Qn.insertArrowFilledHead(h),Qn.insertSequenceNumber(h),Qn.insertSolidTopArrowHead(h),Qn.insertSolidBottomArrowHead(h),Qn.insertStickTopArrowHead(h),Qn.insertStickBottomArrowHead(h);function w(B,F){let G=ut.endActivation(B);G.starty+18>F&&(G.starty=F-6,F+=12),Qn.drawActivation(h,G,F,Ve,U7(B.from).length),ut.insert(G.startx,F-10,G.stopx,F)}o(w,"activeEnd");let k=1,S=1,A=[],L=[],I=0;for(let B of y){let F,G,$;switch(B.type){case n.db.LINETYPE.NOTE:ut.resetVerticalPos(),G=B.noteModel,await fct(h,G);break;case n.db.LINETYPE.ACTIVE_START:ut.newActivation(B,h,f);break;case n.db.LINETYPE.CENTRAL_CONNECTION:ut.newActivation(B,h,f);break;case n.db.LINETYPE.CENTRAL_CONNECTION_REVERSE:ut.newActivation(B,h,f);break;case n.db.LINETYPE.ACTIVE_END:w(B,ut.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin+Ve.boxTextMargin,V=>ut.newLoop(V));break;case n.db.LINETYPE.LOOP_END:F=ut.endLoop(),await Qn.drawLoop(h,F,"loop",Ve),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos()),ut.models.addLoop(F);break;case n.db.LINETYPE.RECT_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin,V=>ut.newLoop(void 0,V.message));break;case n.db.LINETYPE.RECT_END:F=ut.endLoop(),L.push(F),ut.models.addLoop(F),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos());break;case n.db.LINETYPE.OPT_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin+Ve.boxTextMargin,V=>ut.newLoop(V));break;case n.db.LINETYPE.OPT_END:F=ut.endLoop(),await Qn.drawLoop(h,F,"opt",Ve),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos()),ut.models.addLoop(F);break;case n.db.LINETYPE.ALT_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin+Ve.boxTextMargin,V=>ut.newLoop(V));break;case n.db.LINETYPE.ALT_ELSE:Qu(E,B,Ve.boxMargin+Ve.boxTextMargin,Ve.boxMargin,V=>ut.addSectionToLoop(V));break;case n.db.LINETYPE.ALT_END:F=ut.endLoop(),await Qn.drawLoop(h,F,"alt",Ve),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos()),ut.models.addLoop(F);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin+Ve.boxTextMargin,V=>ut.newLoop(V)),ut.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:Qu(E,B,Ve.boxMargin+Ve.boxTextMargin,Ve.boxMargin,V=>ut.addSectionToLoop(V));break;case n.db.LINETYPE.PAR_END:F=ut.endLoop(),await Qn.drawLoop(h,F,"par",Ve),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos()),ut.models.addLoop(F);break;case n.db.LINETYPE.AUTONUMBER:k=B.message.start||k,S=B.message.step||S,B.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin+Ve.boxTextMargin,V=>ut.newLoop(V));break;case n.db.LINETYPE.CRITICAL_OPTION:Qu(E,B,Ve.boxMargin+Ve.boxTextMargin,Ve.boxMargin,V=>ut.addSectionToLoop(V));break;case n.db.LINETYPE.CRITICAL_END:F=ut.endLoop(),await Qn.drawLoop(h,F,"critical",Ve),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos()),ut.models.addLoop(F);break;case n.db.LINETYPE.BREAK_START:Qu(E,B,Ve.boxMargin,Ve.boxMargin+Ve.boxTextMargin,V=>ut.newLoop(V));break;case n.db.LINETYPE.BREAK_END:F=ut.endLoop(),await Qn.drawLoop(h,F,"break",Ve),ut.bumpVerticalPos(F.stopy-ut.getVerticalPos()),ut.models.addLoop(F);break;default:try{$=B.msgModel,$.starty=ut.getVerticalPos(),$.sequenceIndex=k,$.sequenceVisible=n.db.showSequenceNumbers();let V=await pct(h,$);yct(B,$,V,I,f,d,p),A.push({messageModel:$,lineStartY:V,msg:B}),ut.models.addMessage($)}catch(V){K.error("error while drawing message",V)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.SOLID_TOP,n.db.LINETYPE.SOLID_BOTTOM,n.db.LINETYPE.STICK_TOP,n.db.LINETYPE.STICK_BOTTOM,n.db.LINETYPE.SOLID_TOP_DOTTED,n.db.LINETYPE.SOLID_BOTTOM_DOTTED,n.db.LINETYPE.STICK_TOP_DOTTED,n.db.LINETYPE.STICK_BOTTOM_DOTTED,n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,n.db.LINETYPE.STICK_ARROW_TOP_REVERSE,n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,n.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,n.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,n.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,n.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(B.type)&&(k=k+S),I++}K.debug("createdActors",d),K.debug("destroyedActors",p),await sU(h,f,g,!1);for(let B of A)await mct(h,B.messageModel,B.lineStartY,n,B.msg);Ve.mirrorActors&&await sU(h,f,g,!0),L.forEach(B=>Qn.drawBackgroundRect(h,B)),iU(h,f,g,Ve);for(let B of ut.models.boxes){B.height=ut.getVerticalPos()-B.y,ut.insert(B.x,B.y,B.x+B.width,B.height);let F=Ve.boxMargin*2;B.startx=B.x-F,B.starty=B.y-F*.25,B.stopx=B.startx+B.width+2*F,B.stopy=B.starty+B.height+F*.75,B.stroke="rgb(0,0,0, 0.5)",Qn.drawBox(h,B,Ve)}x&&ut.bumpVerticalPos(Ve.boxMargin);let N=Fwe(h,f,g,u),{bounds:C}=ut.getBounds();C.startx===void 0&&(C.startx=0),C.starty===void 0&&(C.starty=0),C.stopx===void 0&&(C.stopx=0),C.stopy===void 0&&(C.stopy=0);let _=C.stopy-C.starty;_2,d=o(y=>l?-y:y,"adjustValue");t.from===t.to?h=u:(t.activate&&!f&&(h+=d(Ve.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN,r.db.LINETYPE.STICK_TOP,r.db.LINETYPE.STICK_BOTTOM,r.db.LINETYPE.STICK_TOP_DOTTED,r.db.LINETYPE.STICK_BOTTOM_DOTTED,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.STICK_ARROW_TOP_REVERSE,r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE].includes(t.type)||(h+=d(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE].includes(t.type)&&(u-=d(3)));let p=[n,i,a,s],m=Math.abs(u-h);t.wrap&&t.message&&(t.message=Xt.wrapLabel(t.message,st.getMax(m+2*Ve.wrapPadding,Ve.width),Xm(Ve)));let g=Xt.calculateTextDimensions(t.message,Xm(Ve));return{width:st.getMax(t.wrap?0:g.width+2*Ve.wrapPadding,m+2*Ve.wrapPadding,Ve.width),height:0,startx:u,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,p),toBounds:Math.max.apply(null,p)}},"buildMessageModel"),_ct=o(async function(t,e,r,n){let i={},a=[],s,l,u;for(let h of t){switch(h.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:h.message&&(s=a.pop(),i[s.id]=s,i[h.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let d=e.get(h.from?h.from:h.to.actor),p=U7(h.from?h.from:h.to.actor).length,m=d.x+d.width/2+(p-1)*Ve.activationWidth/2,g={startx:m,stopx:m+Ve.activationWidth,actor:h.from,enabled:!0};ut.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let d=ut.activations.map(p=>p.actor).lastIndexOf(h.from);ut.activations.splice(d,1).splice(0,1)}break}h.placement!==void 0?(l=await wct(h,e,n),h.noteModel=l,a.forEach(d=>{s=d,s.from=st.getMin(s.from,l.startx),s.to=st.getMax(s.to,l.startx+l.width),s.width=st.getMax(s.width,Math.abs(s.from-s.to))-Ve.labelBoxWidth})):(u=Act(h,e,n),h.msgModel=u,u.startx&&u.stopx&&a.length>0&&a.forEach(d=>{if(s=d,u.startx===u.stopx){let p=e.get(h.from),m=e.get(h.to);s.from=st.getMin(p.x-u.width/2,p.x-p.width/2,s.from),s.to=st.getMax(m.x+u.width/2,m.x+p.width/2,s.to),s.width=st.getMax(s.width,Math.abs(s.to-s.from))-Ve.labelBoxWidth}else s.from=st.getMin(u.startx,s.from),s.to=st.getMax(u.stopx,s.to),s.width=st.getMax(s.width,u.width)-Ve.labelBoxWidth}))}return ut.activations=[],K.debug("Loop type widths:",i),i},"calculateLoopBounds"),Gwe={bounds:ut,drawActors:sU,drawActorsPopup:Fwe,setConf:$we,draw:vct}});var qwe={};vr(qwe,{diagram:()=>Dct});var Dct,Uwe=O(()=>{"use strict";Dwe();rU();Lwe();jt();Vwe();Dct={parser:_we,get db(){return new G7},renderer:Gwe,styles:Rwe,init:o(t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,z2({sequence:{wrap:t.wrap}}))},"init")}});var oU,W7,lU=O(()=>{"use strict";oU=(function(){var t=o(function(Ue,Ge,Ne,We){for(Ne=Ne||{},We=Ue.length;We--;Ne[Ue[We]]=Ge);return Ne},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],l=[1,24],u=[1,25],h=[1,32],f=[1,33],d=[1,34],p=[1,45],m=[1,35],g=[1,36],y=[1,37],v=[1,38],x=[1,27],b=[1,28],T=[1,29],E=[1,30],w=[1,31],k=[1,44],S=[1,46],A=[1,43],L=[1,47],I=[1,9],N=[1,8,9],C=[1,58],_=[1,59],D=[1,60],M=[1,61],R=[1,62],P=[1,63],B=[1,64],F=[1,8,9,41],G=[1,76],$=[1,8,9,12,13,22,39,41,44,68,69,70,71,72,73,74,79,81],V=[1,8,9,12,13,18,20,22,39,41,44,50,60,68,69,70,71,72,73,74,79,81,86,100,102,103],X=[13,60,86,100,102,103],Q=[13,60,73,74,86,100,102,103],H=[13,60,68,69,70,71,72,86,100,102,103],ie=[1,101],Y=[1,118],le=[1,114],ee=[1,110],J=[1,116],te=[1,111],Z=[1,112],xe=[1,113],de=[1,115],Se=[1,117],Me=[22,48,60,61,82,86,87,88,89,90],ke=[1,8,9,39,41,44],we=[1,8,9,22],_e=[1,147],$e=[1,8,9,61],fe=[1,8,9,22,48,60,61,82,86,87,88,89,90],Ke={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,classLiteralName:17,DOT:18,className:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,emptyBody:47,SPACE:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,NOTE_FOR:54,noteText:55,NOTE:56,CLASSDEF:57,classList:58,stylesOpt:59,ALPHA:60,COMMA:61,direction_tb:62,direction_bt:63,direction_rl:64,direction_lr:65,relationType:66,lineType:67,AGGREGATION:68,EXTENSION:69,COMPOSITION:70,DEPENDENCY:71,LOLLIPOP:72,LINE:73,DOTTED_LINE:74,CALLBACK:75,LINK:76,LINK_TARGET:77,CLICK:78,CALLBACK_NAME:79,CALLBACK_ARGS:80,HREF:81,STYLE:82,CSSCLASS:83,style:84,styleComponent:85,NUM:86,COLON:87,UNIT:88,BRKT:89,PCT:90,commentToken:91,textToken:92,graphCodeTokens:93,textNoTagsToken:94,TAGSTART:95,TAGEND:96,"==":97,"--":98,DEFAULT:99,MINUS:100,keywords:101,UNICODE_TEXT:102,BQUOTE_STR:103,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",18:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",48:"SPACE",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"NOTE_FOR",56:"NOTE",57:"CLASSDEF",60:"ALPHA",61:"COMMA",62:"direction_tb",63:"direction_bt",64:"direction_rl",65:"direction_lr",68:"AGGREGATION",69:"EXTENSION",70:"COMPOSITION",71:"DEPENDENCY",72:"LOLLIPOP",73:"LINE",74:"DOTTED_LINE",75:"CALLBACK",76:"LINK",77:"LINK_TARGET",78:"CLICK",79:"CALLBACK_NAME",80:"CALLBACK_ARGS",81:"HREF",82:"STYLE",83:"CSSCLASS",86:"NUM",87:"COLON",88:"UNIT",89:"BRKT",90:"PCT",93:"graphCodeTokens",95:"TAGSTART",96:"TAGEND",97:"==",98:"--",99:"DEFAULT",100:"MINUS",101:"keywords",102:"UNICODE_TEXT",103:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,1],[15,3],[15,2],[19,1],[19,3],[19,1],[19,2],[19,2],[19,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,3],[24,6],[43,2],[43,3],[47,0],[47,2],[47,2],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[58,1],[58,3],[32,1],[32,1],[32,1],[32,1],[53,3],[53,2],[53,2],[53,1],[66,1],[66,1],[66,1],[66,1],[66,1],[67,1],[67,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[59,1],[59,3],[84,1],[84,2],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[91,1],[91,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[94,1],[94,1],[94,1],[94,1],[16,1],[16,1],[16,1],[16,1],[17,1],[55,1]],performAction:o(function(Ge,Ne,We,j,ae,U,ce){var z=U.length-1;switch(ae){case 8:this.$=U[z-1];break;case 9:case 10:case 13:case 15:this.$=U[z];break;case 11:case 14:this.$=U[z-2]+"."+U[z];break;case 12:case 16:this.$=U[z-1]+U[z];break;case 17:case 18:this.$=U[z-1]+"~"+U[z]+"~";break;case 19:j.addRelation(U[z]);break;case 20:U[z-1].title=j.cleanupLabel(U[z]),j.addRelation(U[z-1]);break;case 31:this.$=U[z].trim(),j.setAccTitle(this.$);break;case 32:case 33:this.$=U[z].trim(),j.setAccDescription(this.$);break;case 34:j.addClassesToNamespace(U[z-3],U[z-1][0],U[z-1][1]);break;case 35:j.addClassesToNamespace(U[z-4],U[z-1][0],U[z-1][1]);break;case 36:this.$=U[z],j.addNamespace(U[z]);break;case 37:this.$=[[U[z]],[]];break;case 38:this.$=[[U[z-1]],[]];break;case 39:U[z][0].unshift(U[z-2]),this.$=U[z];break;case 40:this.$=[[],[U[z]]];break;case 41:this.$=[[],[U[z-1]]];break;case 42:U[z][1].unshift(U[z-2]),this.$=U[z];break;case 44:j.setCssClass(U[z-2],U[z]);break;case 45:j.addMembers(U[z-3],U[z-1]);break;case 47:j.setCssClass(U[z-5],U[z-3]),j.addMembers(U[z-5],U[z-1]);break;case 48:this.$=U[z],j.addClass(U[z]);break;case 49:this.$=U[z-1],j.addClass(U[z-1]),j.setClassLabel(U[z-1],U[z]);break;case 53:j.addAnnotation(U[z],U[z-2]);break;case 54:case 67:this.$=[U[z]];break;case 55:U[z].push(U[z-1]),this.$=U[z];break;case 56:break;case 57:j.addMember(U[z-1],j.cleanupLabel(U[z]));break;case 58:break;case 59:break;case 60:this.$={id1:U[z-2],id2:U[z],relation:U[z-1],relationTitle1:"none",relationTitle2:"none"};break;case 61:this.$={id1:U[z-3],id2:U[z],relation:U[z-1],relationTitle1:U[z-2],relationTitle2:"none"};break;case 62:this.$={id1:U[z-3],id2:U[z],relation:U[z-2],relationTitle1:"none",relationTitle2:U[z-1]};break;case 63:this.$={id1:U[z-4],id2:U[z],relation:U[z-2],relationTitle1:U[z-3],relationTitle2:U[z-1]};break;case 64:this.$=j.addNote(U[z],U[z-1]);break;case 65:this.$=j.addNote(U[z]);break;case 66:this.$=U[z-2],j.defineClass(U[z-1],U[z]);break;case 68:this.$=U[z-2].concat([U[z]]);break;case 69:j.setDirection("TB");break;case 70:j.setDirection("BT");break;case 71:j.setDirection("RL");break;case 72:j.setDirection("LR");break;case 73:this.$={type1:U[z-2],type2:U[z],lineType:U[z-1]};break;case 74:this.$={type1:"none",type2:U[z],lineType:U[z-1]};break;case 75:this.$={type1:U[z-1],type2:"none",lineType:U[z]};break;case 76:this.$={type1:"none",type2:"none",lineType:U[z]};break;case 77:this.$=j.relationType.AGGREGATION;break;case 78:this.$=j.relationType.EXTENSION;break;case 79:this.$=j.relationType.COMPOSITION;break;case 80:this.$=j.relationType.DEPENDENCY;break;case 81:this.$=j.relationType.LOLLIPOP;break;case 82:this.$=j.lineType.LINE;break;case 83:this.$=j.lineType.DOTTED_LINE;break;case 84:case 90:this.$=U[z-2],j.setClickEvent(U[z-1],U[z]);break;case 85:case 91:this.$=U[z-3],j.setClickEvent(U[z-2],U[z-1]),j.setTooltip(U[z-2],U[z]);break;case 86:this.$=U[z-2],j.setLink(U[z-1],U[z]);break;case 87:this.$=U[z-3],j.setLink(U[z-2],U[z-1],U[z]);break;case 88:this.$=U[z-3],j.setLink(U[z-2],U[z-1]),j.setTooltip(U[z-2],U[z]);break;case 89:this.$=U[z-4],j.setLink(U[z-3],U[z-2],U[z]),j.setTooltip(U[z-3],U[z-1]);break;case 92:this.$=U[z-3],j.setClickEvent(U[z-2],U[z-1],U[z]);break;case 93:this.$=U[z-4],j.setClickEvent(U[z-3],U[z-2],U[z-1]),j.setTooltip(U[z-3],U[z]);break;case 94:this.$=U[z-3],j.setLink(U[z-2],U[z]);break;case 95:this.$=U[z-4],j.setLink(U[z-3],U[z-1],U[z]);break;case 96:this.$=U[z-4],j.setLink(U[z-3],U[z-1]),j.setTooltip(U[z-3],U[z]);break;case 97:this.$=U[z-5],j.setLink(U[z-4],U[z-2],U[z]),j.setTooltip(U[z-4],U[z-1]);break;case 98:this.$=U[z-2],j.setCssStyle(U[z-1],U[z]);break;case 99:j.setCssClass(U[z-1],U[z]);break;case 100:this.$=[U[z]];break;case 101:U[z-2].push(U[z]),this.$=U[z-2];break;case 103:this.$=U[z-1]+U[z];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:E,83:w,86:k,100:S,102:A,103:L},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(I,[2,5],{8:[1,48]}),{8:[1,49]},t(N,[2,19],{22:[1,50]}),t(N,[2,21]),t(N,[2,22]),t(N,[2,23]),t(N,[2,24]),t(N,[2,25]),t(N,[2,26]),t(N,[2,27]),t(N,[2,28]),t(N,[2,29]),t(N,[2,30]),{34:[1,51]},{36:[1,52]},t(N,[2,33]),t(N,[2,56],{53:53,66:56,67:57,13:[1,54],22:[1,55],68:C,69:_,70:D,71:M,72:R,73:P,74:B}),{39:[1,65]},t(F,[2,43],{39:[1,67],44:[1,66]}),t(N,[2,58]),t(N,[2,59]),{16:68,60:p,86:k,100:S,102:A},{16:39,17:40,19:69,60:p,86:k,100:S,102:A,103:L},{16:39,17:40,19:70,60:p,86:k,100:S,102:A,103:L},{16:39,17:40,19:71,60:p,86:k,100:S,102:A,103:L},{60:[1,72]},{13:[1,73]},{16:39,17:40,19:74,60:p,86:k,100:S,102:A,103:L},{13:G,55:75},{58:77,60:[1,78]},t(N,[2,69]),t(N,[2,70]),t(N,[2,71]),t(N,[2,72]),t($,[2,13],{16:39,17:40,19:80,18:[1,79],20:[1,81],60:p,86:k,100:S,102:A,103:L}),t($,[2,15],{20:[1,82]}),{15:83,16:84,17:85,60:p,86:k,100:S,102:A,103:L},{16:39,17:40,19:86,60:p,86:k,100:S,102:A,103:L},t(V,[2,126]),t(V,[2,127]),t(V,[2,128]),t(V,[2,129]),t([1,8,9,12,13,20,22,39,41,44,68,69,70,71,72,73,74,79,81],[2,130]),t(I,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,19:21,38:22,43:23,16:39,17:40,5:87,33:e,35:r,37:n,42:i,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:E,83:w,86:k,100:S,102:A,103:L}),{5:88,10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:E,83:w,86:k,100:S,102:A,103:L},t(N,[2,20]),t(N,[2,31]),t(N,[2,32]),{13:[1,90],16:39,17:40,19:89,60:p,86:k,100:S,102:A,103:L},{53:91,66:56,67:57,68:C,69:_,70:D,71:M,72:R,73:P,74:B},t(N,[2,57]),{67:92,73:P,74:B},t(X,[2,76],{66:93,68:C,69:_,70:D,71:M,72:R}),t(Q,[2,77]),t(Q,[2,78]),t(Q,[2,79]),t(Q,[2,80]),t(Q,[2,81]),t(H,[2,82]),t(H,[2,83]),{8:[1,95],24:96,30:97,40:94,43:23,46:a,54:h,56:f},{16:98,60:p,86:k,100:S,102:A},{41:[1,100],45:99,51:ie},{50:[1,102]},{13:[1,103]},{13:[1,104]},{79:[1,105],81:[1,106]},{22:Y,48:le,59:107,60:ee,82:J,84:108,85:109,86:te,87:Z,88:xe,89:de,90:Se},{60:[1,119]},{13:G,55:120},t(F,[2,65]),t(F,[2,131]),{22:Y,48:le,59:121,60:ee,61:[1,122],82:J,84:108,85:109,86:te,87:Z,88:xe,89:de,90:Se},t(Me,[2,67]),{16:39,17:40,19:123,60:p,86:k,100:S,102:A,103:L},t($,[2,16]),t($,[2,17]),t($,[2,18]),{39:[2,36]},{15:125,16:84,17:85,18:[1,124],39:[2,9],60:p,86:k,100:S,102:A,103:L},{39:[2,10]},t(ke,[2,48],{11:126,12:[1,127]}),t(I,[2,7]),{9:[1,128]},t(we,[2,60]),{16:39,17:40,19:129,60:p,86:k,100:S,102:A,103:L},{13:[1,131],16:39,17:40,19:130,60:p,86:k,100:S,102:A,103:L},t(X,[2,75],{66:132,68:C,69:_,70:D,71:M,72:R}),t(X,[2,74]),{41:[1,133]},{24:96,30:97,40:134,43:23,46:a,54:h,56:f},{8:[1,135],41:[2,37]},{8:[1,136],41:[2,40]},t(F,[2,44],{39:[1,137]}),{41:[1,138]},t(F,[2,46]),{41:[2,54],45:139,51:ie},{16:39,17:40,19:140,60:p,86:k,100:S,102:A,103:L},t(N,[2,84],{13:[1,141]}),t(N,[2,86],{13:[1,143],77:[1,142]}),t(N,[2,90],{13:[1,144],80:[1,145]}),{13:[1,146]},t(N,[2,98],{61:_e}),t($e,[2,100],{85:148,22:Y,48:le,60:ee,82:J,86:te,87:Z,88:xe,89:de,90:Se}),t(fe,[2,102]),t(fe,[2,104]),t(fe,[2,105]),t(fe,[2,106]),t(fe,[2,107]),t(fe,[2,108]),t(fe,[2,109]),t(fe,[2,110]),t(fe,[2,111]),t(fe,[2,112]),t(N,[2,99]),t(F,[2,64]),t(N,[2,66],{61:_e}),{60:[1,149]},t($,[2,14]),{15:150,16:84,17:85,60:p,86:k,100:S,102:A,103:L},{39:[2,12]},t(ke,[2,49]),{13:[1,151]},{1:[2,4]},t(we,[2,62]),t(we,[2,61]),{16:39,17:40,19:152,60:p,86:k,100:S,102:A,103:L},t(X,[2,73]),t(N,[2,34]),{41:[1,153]},{24:96,30:97,40:154,41:[2,38],43:23,46:a,54:h,56:f},{24:96,30:97,40:155,41:[2,41],43:23,46:a,54:h,56:f},{45:156,51:ie},t(F,[2,45]),{41:[2,55]},t(N,[2,53]),t(N,[2,85]),t(N,[2,87]),t(N,[2,88],{77:[1,157]}),t(N,[2,91]),t(N,[2,92],{13:[1,158]}),t(N,[2,94],{13:[1,160],77:[1,159]}),{22:Y,48:le,60:ee,82:J,84:161,85:109,86:te,87:Z,88:xe,89:de,90:Se},t(fe,[2,103]),t(Me,[2,68]),{39:[2,11]},{14:[1,162]},t(we,[2,63]),t(N,[2,35]),{41:[2,39]},{41:[2,42]},{41:[1,163]},t(N,[2,89]),t(N,[2,93]),t(N,[2,95]),t(N,[2,96],{77:[1,164]}),t($e,[2,101],{85:148,22:Y,48:le,60:ee,82:J,86:te,87:Z,88:xe,89:de,90:Se}),t(ke,[2,8]),t(F,[2,47]),t(N,[2,97])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,36],85:[2,10],125:[2,12],128:[2,4],139:[2,55],150:[2,11],154:[2,39],155:[2,42]},parseError:o(function(Ge,Ne){if(Ne.recoverable)this.trace(Ge);else{var We=new Error(Ge);throw We.hash=Ne,We}},"parseError"),parse:o(function(Ge){var Ne=this,We=[0],j=[],ae=[null],U=[],ce=this.table,z="",ne=0,se=0,be=0,pe=2,me=1,Re=U.slice.call(arguments,1),ge=Object.create(this.lexer),Ie={yy:{}};for(var qe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,qe)&&(Ie.yy[qe]=this.yy[qe]);ge.setInput(Ge,Ie.yy),Ie.yy.lexer=ge,Ie.yy.parser=this,typeof ge.yylloc>"u"&&(ge.yylloc={});var Pe=ge.yylloc;U.push(Pe);var Xe=ge.options&&ge.options.ranges;typeof Ie.yy.parseError=="function"?this.parseError=Ie.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function oe(cr){We.length=We.length-2*cr,ae.length=ae.length-cr,U.length=U.length-cr}o(oe,"popStack");function et(){var cr;return cr=j.pop()||ge.lex()||me,typeof cr!="number"&&(cr instanceof Array&&(j=cr,cr=j.pop()),cr=Ne.symbols_[cr]||cr),cr}o(et,"lex");for(var he,ot,Dt,It,wt,Rt,it={},at,Ct,yt,dt;;){if(Dt=We[We.length-1],this.defaultActions[Dt]?It=this.defaultActions[Dt]:((he===null||typeof he>"u")&&(he=et()),It=ce[Dt]&&ce[Dt][he]),typeof It>"u"||!It.length||!It[0]){var Ht="";dt=[];for(at in ce[Dt])this.terminals_[at]&&at>pe&&dt.push("'"+this.terminals_[at]+"'");ge.showPosition?Ht="Parse error on line "+(ne+1)+`: -`+ge.showPosition()+` -Expecting `+dt.join(", ")+", got '"+(this.terminals_[he]||he)+"'":Ht="Parse error on line "+(ne+1)+": Unexpected "+(he==me?"end of input":"'"+(this.terminals_[he]||he)+"'"),this.parseError(Ht,{text:ge.match,token:this.terminals_[he]||he,line:ge.yylineno,loc:Pe,expected:dt})}if(It[0]instanceof Array&&It.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Dt+", token: "+he);switch(It[0]){case 1:We.push(he),ae.push(ge.yytext),U.push(ge.yylloc),We.push(It[1]),he=null,ot?(he=ot,ot=null):(se=ge.yyleng,z=ge.yytext,ne=ge.yylineno,Pe=ge.yylloc,be>0&&be--);break;case 2:if(Ct=this.productions_[It[1]][1],it.$=ae[ae.length-Ct],it._$={first_line:U[U.length-(Ct||1)].first_line,last_line:U[U.length-1].last_line,first_column:U[U.length-(Ct||1)].first_column,last_column:U[U.length-1].last_column},Xe&&(it._$.range=[U[U.length-(Ct||1)].range[0],U[U.length-1].range[1]]),Rt=this.performAction.apply(it,[z,se,ne,Ie.yy,It[1],ae,U].concat(Re)),typeof Rt<"u")return Rt;Ct&&(We=We.slice(0,-1*Ct*2),ae=ae.slice(0,-1*Ct),U=U.slice(0,-1*Ct)),We.push(this.productions_[It[1]][0]),ae.push(it.$),U.push(it._$),yt=ce[We[We.length-2]][We[We.length-1]],We.push(yt);break;case 3:return!0}}return!0},"parse")},Te=(function(){var Ue={EOF:1,parseError:o(function(Ne,We){if(this.yy.parser)this.yy.parser.parseError(Ne,We);else throw new Error(Ne)},"parseError"),setInput:o(function(Ge,Ne){return this.yy=Ne||this.yy||{},this._input=Ge,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Ge=this._input[0];this.yytext+=Ge,this.yyleng++,this.offset++,this.match+=Ge,this.matched+=Ge;var Ne=Ge.match(/(?:\r\n?|\n).*/g);return Ne?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Ge},"input"),unput:o(function(Ge){var Ne=Ge.length,We=Ge.split(/(?:\r\n?|\n)/g);this._input=Ge+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ne),this.offset-=Ne;var j=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),We.length-1&&(this.yylineno-=We.length-1);var ae=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:We?(We.length===j.length?this.yylloc.first_column:0)+j[j.length-We.length].length-We[0].length:this.yylloc.first_column-Ne},this.options.ranges&&(this.yylloc.range=[ae[0],ae[0]+this.yyleng-Ne]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Ge){this.unput(this.match.slice(Ge))},"less"),pastInput:o(function(){var Ge=this.matched.substr(0,this.matched.length-this.match.length);return(Ge.length>20?"...":"")+Ge.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Ge=this.match;return Ge.length<20&&(Ge+=this._input.substr(0,20-Ge.length)),(Ge.substr(0,20)+(Ge.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Ge=this.pastInput(),Ne=new Array(Ge.length+1).join("-");return Ge+this.upcomingInput()+` -`+Ne+"^"},"showPosition"),test_match:o(function(Ge,Ne){var We,j,ae;if(this.options.backtrack_lexer&&(ae={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ae.yylloc.range=this.yylloc.range.slice(0))),j=Ge[0].match(/(?:\r\n?|\n).*/g),j&&(this.yylineno+=j.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:j?j[j.length-1].length-j[j.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Ge[0].length},this.yytext+=Ge[0],this.match+=Ge[0],this.matches=Ge,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Ge[0].length),this.matched+=Ge[0],We=this.performAction.call(this,this.yy,this,Ne,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),We)return We;if(this._backtrack){for(var U in ae)this[U]=ae[U];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Ge,Ne,We,j;this._more||(this.yytext="",this.match="");for(var ae=this._currentRules(),U=0;UNe[0].length)){if(Ne=We,j=U,this.options.backtrack_lexer){if(Ge=this.test_match(We,ae[U]),Ge!==!1)return Ge;if(this._backtrack){Ne=!1;continue}else return!1}else if(!this.options.flex)break}return Ne?(Ge=this.test_match(Ne,ae[j]),Ge!==!1?Ge:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ne=this.next();return Ne||this.lex()},"lex"),begin:o(function(Ne){this.conditionStack.push(Ne)},"begin"),popState:o(function(){var Ne=this.conditionStack.length-1;return Ne>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ne){return Ne=this.conditionStack.length-1-Math.abs(Ne||0),Ne>=0?this.conditionStack[Ne]:"INITIAL"},"topState"),pushState:o(function(Ne){this.begin(Ne)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ne,We,j,ae){var U=ae;switch(j){case 0:return 62;case 1:return 63;case 2:return 64;case 3:return 65;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 79;case 22:this.popState();break;case 23:return 80;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 82;case 28:return 57;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 83;case 50:return 75;case 51:return 76;case 52:return 78;case 53:return 54;case 54:return 56;case 55:return 49;case 56:return 50;case 57:return 81;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 77;case 65:return 77;case 66:return 77;case 67:return 77;case 68:return 69;case 69:return 69;case 70:return 71;case 71:return 71;case 72:return 70;case 73:return 68;case 74:return 72;case 75:return 73;case 76:return 74;case 77:return 22;case 78:return 44;case 79:return 100;case 80:return 18;case 81:return"PLUS";case 82:return 87;case 83:return 61;case 84:return 89;case 85:return 89;case 86:return 90;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 60;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 86;case 94:return 102;case 95:return 48;case 96:return 48;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return Ue})();Ke.lexer=Te;function Be(){this.yy={}}return o(Be,"Parser"),Be.prototype=Ke,Ke.Parser=Be,new Be})();oU.parser=oU;W7=oU});var Ywe,y3,jwe=O(()=>{"use strict";jt();Ur();Ywe=["#","+","~","-",""],y3=class{static{o(this,"ClassMember")}constructor(e,r){this.memberType=r,this.visibility="",this.classifier="",this.text="";let n=wr(e,ve());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+jc(this.id);this.memberType==="method"&&(e+=`(${jc(this.parameters.trim())})`,this.returnType&&(e+=" : "+jc(this.returnType))),e=e.trim();let r=this.parseClassifier();return{displayText:e,cssStyle:r}}parseMember(e){let r="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let s=a[1]?a[1].trim():"";if(Ywe.includes(s)&&(this.visibility=s),this.id=a[2],this.parameters=a[3]?a[3].trim():"",r=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",r===""){let l=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(l)&&(r=l,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let i=e.length,a=e.substring(0,1),s=e.substring(i-1);Ywe.includes(a)&&(this.visibility=a),/[$*]/.exec(s)&&(r=s),this.id=e.substring(this.visibility===""?0:1,r===""?i:i-1)}this.classifier=r,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${jc(this.id)}${this.memberType==="method"?`(${jc(this.parameters)})${this.returnType?" : "+jc(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}});var H7,Xwe,Km,Fv,cU=O(()=>{"use strict";Ar();xt();jt();Ur();ar();si();a0();jwe();S2();H7="classId-",Xwe=0,Km=o(t=>st.sanitizeText(t,ve()),"sanitizeText"),Fv=class{constructor(){this.relations=[];this.classes=new Map;this.styleClasses=new Map;this.notes=new Map;this.interfaces=[];this.namespaces=new Map;this.namespaceCounter=0;this.functions=[];this.lineType={LINE:0,DOTTED_LINE:1};this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4};this.setupToolTips=o(e=>{let r=sk();je(e).select("svg").selectAll("g").filter(function(){return je(this).attr("title")!==null}).on("mouseover",a=>{let s=je(a.currentTarget),l=s.attr("title");if(!l)return;let u=a.currentTarget.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.html(fl.sanitize(l)).style("left",`${window.scrollX+u.left+u.width/2}px`).style("top",`${window.scrollY+u.bottom+4}px`),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),je(a.currentTarget).classed("hover",!1)})},"setupToolTips");this.direction="TB";this.setAccTitle=Lr;this.getAccTitle=Or;this.setAccDescription=Pr;this.getAccDescription=Br;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.getConfig=o(()=>ve().class,"getConfig");this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{o(this,"ClassDB")}splitClassNameAndType(e){let r=st.sanitizeText(e,ve()),n="",i=r;if(r.indexOf("~")>0){let a=r.split("~");i=Km(a[0]),n=Km(a[1])}return{className:i,type:n}}setClassLabel(e,r){let n=st.sanitizeText(e,ve());r&&(r=Km(r));let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).label=r,this.classes.get(i).text=`${r}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(e){let r=st.sanitizeText(e,ve()),{className:n,type:i}=this.splitClassNameAndType(r);if(this.classes.has(n))return;let a=st.sanitizeText(n,ve());this.classes.set(a,{id:a,type:i,label:a,text:`${a}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:H7+a+"-"+Xwe}),Xwe++}addInterface(e,r){let n={id:`interface${this.interfaces.length}`,label:e,classId:r};this.interfaces.push(n)}lookUpDomId(e){let r=st.sanitizeText(e,ve());if(this.classes.has(r))return this.classes.get(r).domId;throw new Error("Class not found: "+r)}clear(){this.relations=[],this.classes=new Map,this.notes=new Map,this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",_r()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNote(e){let r=typeof e=="number"?`note${e}`:e;return this.notes.get(r)}getNotes(){return this.notes}addRelation(e){K.debug("Adding relation: "+JSON.stringify(e));let r=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!r.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!r.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=st.sanitizeText(e.relationTitle1.trim(),ve()),e.relationTitle2=st.sanitizeText(e.relationTitle2.trim(),ve()),this.relations.push(e)}addAnnotation(e,r){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(r)}addMember(e,r){this.addClass(e);let n=this.splitClassNameAndType(e).className,i=this.classes.get(n);if(typeof r=="string"){let a=r.trim();a.startsWith("<<")&&a.endsWith(">>")?i.annotations.push(Km(a.substring(2,a.length-2))):a.indexOf(")")>0?i.methods.push(new y3(a,"method")):a&&i.members.push(new y3(a,"attribute"))}}addMembers(e,r){Array.isArray(r)&&(r.reverse(),r.forEach(n=>this.addMember(e,n)))}addNote(e,r){let n=this.notes.size,i={id:`note${n}`,class:r,text:e,index:n};return this.notes.set(i.id,i),i.id}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),Km(e.trim())}setCssClass(e,r){e.split(",").forEach(n=>{let i=n;/\d/.exec(n[0])&&(i=H7+i);let a=this.classes.get(i);a&&(a.cssClasses+=" "+r)})}defineClass(e,r){for(let n of e){let i=this.styleClasses.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,i)),r&&r.forEach(a=>{if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...r.flatMap(s=>s.split(",")))})}}setTooltip(e,r){e.split(",").forEach(n=>{r!==void 0&&(this.classes.get(n).tooltip=Km(r))})}getTooltip(e,r){return r&&this.namespaces.has(r)?this.namespaces.get(r).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,r,n){let i=ve();e.split(",").forEach(a=>{let s=a;/\d/.exec(a[0])&&(s=H7+s);let l=this.classes.get(s);l&&(l.link=Xt.formatUrl(r,i),i.securityLevel==="sandbox"?l.linkTarget="_top":typeof n=="string"?l.linkTarget=Km(n):l.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFunc(i,r,n),this.classes.get(i).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,r,n){let i=st.sanitizeText(e,ve());if(ve().securityLevel!=="loose"||r===void 0)return;let s=i;if(this.classes.has(s)){let l=this.lookUpDomId(s),u=[];if(typeof n=="string"){u=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let h=0;h{let h=document.querySelector(`[id="${l}"]`);h!==null&&h.addEventListener("click",()=>{Xt.runFunc(r,...u)},!1)})}}bindFunctions(e){this.functions.forEach(r=>{r(e)})}escapeHtml(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,notes:new Map,children:new Map,domId:H7+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,r,n){if(this.namespaces.has(e)){for(let i of r){let{className:a}=this.splitClassNameAndType(i),s=this.getClass(a);s.parent=e,this.namespaces.get(e).classes.set(a,s)}for(let i of n){let a=this.getNote(i);a.parent=e,this.namespaces.get(e).notes.set(i,a)}}}setCssStyle(e,r){let n=this.classes.get(e);if(!(!r||!n))for(let i of r)i.includes(",")?n.styles.push(...i.split(",")):n.styles.push(i)}getArrowMarker(e){let r;switch(e){case 0:r="aggregation";break;case 1:r="extension";break;case 2:r="composition";break;case 3:r="dependency";break;case 4:r="lollipop";break;default:r="none"}return r}getData(){let e=[],r=[],n=ve();for(let a of this.namespaces.values()){let s={id:a.id,label:a.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:[],look:n.look};e.push(s)}for(let a of this.classes.values()){let s={...a,type:void 0,isGroup:!1,parentId:a.parent,look:n.look};e.push(s)}for(let a of this.notes.values()){let s={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look,parentId:a.parent,labelType:"markdown"};e.push(s);let l=this.classes.get(a.class)?.id;if(l){let u={id:`edgeNote${a.index}`,start:a.id,end:l,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};r.push(u)}}for(let a of this.interfaces){let s={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(s)}let i=0;for(let a of this.relations){i++;let s={id:hu(a.id1,a.id2,{prefix:"id",counter:i}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look,labelType:"markdown"};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:this.getDirection()}}}});var Mct,Y7,uU=O(()=>{"use strict";ly();Mct=o(t=>`g.classGroup text { - fill: ${t.nodeBorder||t.classText}; - stroke: none; - font-family: ${t.fontFamily}; - font-size: 10px; - - .title { - font-weight: bolder; - } - -} - - .cluster-label text { - fill: ${t.titleColor}; - } - .cluster-label span { - color: ${t.titleColor}; - } - .cluster-label span p { - background-color: transparent; - } - - .cluster rect { - fill: ${t.clusterBkg}; - stroke: ${t.clusterBorder}; - stroke-width: 1px; - } - - .cluster text { - fill: ${t.titleColor}; - } - - .cluster span { - color: ${t.titleColor}; - } - -.nodeLabel, .edgeLabel { - color: ${t.classText}; -} -.edgeLabel .label rect { - fill: ${t.mainBkg}; -} -.label text { - fill: ${t.classText}; -} - -.labelBkg { - background: ${t.mainBkg}; -} -.edgeLabel .label span { - background: ${t.mainBkg}; -} - -.classTitle { - font-weight: bolder; -} -.node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - -.divider { - stroke: ${t.nodeBorder}; - stroke-width: 1; -} - -g.clickable { - cursor: pointer; -} - -g.classGroup rect { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; -} - -g.classGroup line { - stroke: ${t.nodeBorder}; - stroke-width: 1; -} - -.classLabel .box { - stroke: none; - stroke-width: 0; - fill: ${t.mainBkg}; - opacity: 0.5; -} - -.classLabel .label { - fill: ${t.nodeBorder}; - font-size: 10px; -} - -.relation { - stroke: ${t.lineColor}; - stroke-width: 1; - fill: none; -} - -.dashed-line{ - stroke-dasharray: 3; -} - -.dotted-line{ - stroke-dasharray: 1 2; -} - -#compositionStart, .composition { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#compositionEnd, .composition { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#dependencyStart, .dependency { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#dependencyStart, .dependency { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#extensionStart, .extension { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#extensionEnd, .extension { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#aggregationStart, .aggregation { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#aggregationEnd, .aggregation { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#lollipopStart, .lollipop { - fill: ${t.mainBkg} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#lollipopEnd, .lollipop { - fill: ${t.mainBkg} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -.edgeTerminals { - font-size: 11px; - line-height: initial; -} - -.classTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; -} - ${Lu()} -`,"getStyles"),Y7=Mct});var Ict,Oct,Pct,j7,hU=O(()=>{"use strict";jt();xt();b0();Rd();Ld();ar();Ict=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),Oct=o(function(t,e){return e.db.getClasses()},"getClasses"),Pct=o(async function(t,e,r,n){K.info("REF0:"),K.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=ve(),l=n.db.getData(),u=Sl(e,i);l.type=n.type,l.layoutAlgorithm=Ru(s),l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["aggregation","extension","composition","dependency","lollipop"],l.diagramId=e,await Ol(l,u);let h=8;Xt.insertTitle(u,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),bo(u,h,"classDiagram",a?.useMaxWidth??!0)},"draw"),j7={getClasses:Oct,draw:Pct,getDir:Ict}});var Kwe={};vr(Kwe,{diagram:()=>Bct});var Bct,Qwe=O(()=>{"use strict";lU();cU();uU();hU();Bct={parser:W7,get db(){return new Fv},renderer:j7,styles:Y7,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var e5e={};vr(e5e,{diagram:()=>Gct});var Gct,t5e=O(()=>{"use strict";lU();cU();uU();hU();Gct={parser:W7,get db(){return new Fv},renderer:j7,styles:Y7,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var fU,X7,dU=O(()=>{"use strict";fU=(function(){var t=o(function(F,G,$,V){for($=$||{},V=F.length;V--;$[F[V]]=G);return $},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,16],u=[1,17],h=[1,18],f=[1,19],d=[1,33],p=[1,20],m=[1,21],g=[1,22],y=[1,23],v=[1,24],x=[1,26],b=[1,27],T=[1,28],E=[1,29],w=[1,30],k=[1,31],S=[1,32],A=[1,35],L=[1,36],I=[1,37],N=[1,38],C=[1,34],_=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],D=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],M=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],R={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:o(function(G,$,V,X,Q,H,ie){var Y=H.length-1;switch(Q){case 3:return X.setRootDoc(H[Y]),H[Y];break;case 4:this.$=[];break;case 5:H[Y]!="nl"&&(H[Y-1].push(H[Y]),this.$=H[Y-1]);break;case 6:case 7:this.$=H[Y];break;case 8:this.$="nl";break;case 12:this.$=H[Y];break;case 13:let te=H[Y-1];te.description=X.trimColon(H[Y]),this.$=te;break;case 14:this.$={stmt:"relation",state1:H[Y-2],state2:H[Y]};break;case 15:let Z=X.trimColon(H[Y]);this.$={stmt:"relation",state1:H[Y-3],state2:H[Y-1],description:Z};break;case 19:this.$={stmt:"state",id:H[Y-3],type:"default",description:"",doc:H[Y-1]};break;case 20:var le=H[Y],ee=H[Y-2].trim();if(H[Y].match(":")){var J=H[Y].split(":");le=J[0],ee=[ee,J[1]]}this.$={stmt:"state",id:le,type:"default",description:ee};break;case 21:this.$={stmt:"state",id:H[Y-3],type:"default",description:H[Y-5],doc:H[Y-1]};break;case 22:this.$={stmt:"state",id:H[Y],type:"fork"};break;case 23:this.$={stmt:"state",id:H[Y],type:"join"};break;case 24:this.$={stmt:"state",id:H[Y],type:"choice"};break;case 25:this.$={stmt:"state",id:X.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:H[Y-1].trim(),note:{position:H[Y-2].trim(),text:H[Y].trim()}};break;case 29:this.$=H[Y].trim(),X.setAccTitle(this.$);break;case 30:case 31:this.$=H[Y].trim(),X.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:H[Y-3],url:H[Y-2],tooltip:H[Y-1]};break;case 33:this.$={stmt:"click",id:H[Y-3],url:H[Y-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:H[Y-1].trim(),classes:H[Y].trim()};break;case 36:this.$={stmt:"style",id:H[Y-1].trim(),styleClass:H[Y].trim()};break;case 37:this.$={stmt:"applyClass",id:H[Y-1].trim(),styleClass:H[Y].trim()};break;case 38:X.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:X.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:X.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:X.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:H[Y].trim(),type:"default",description:""};break;case 46:this.$={stmt:"state",id:H[Y-2].trim(),classes:[H[Y].trim()],type:"default",description:""};break;case 47:this.$={stmt:"state",id:H[Y-2].trim(),classes:[H[Y].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:E,41:w,45:k,48:S,51:A,52:L,53:I,54:N,57:C},t(_,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:E,41:w,45:k,48:S,51:A,52:L,53:I,54:N,57:C},t(_,[2,7]),t(_,[2,8]),t(_,[2,9]),t(_,[2,10]),t(_,[2,11]),t(_,[2,12],{14:[1,40],15:[1,41]}),t(_,[2,16]),{18:[1,42]},t(_,[2,18],{20:[1,43]}),{23:[1,44]},t(_,[2,22]),t(_,[2,23]),t(_,[2,24]),t(_,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(_,[2,28]),{34:[1,49]},{36:[1,50]},t(_,[2,31]),{13:51,24:d,57:C},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(D,[2,44],{58:[1,56]}),t(D,[2,45],{58:[1,57]}),t(_,[2,38]),t(_,[2,39]),t(_,[2,40]),t(_,[2,41]),t(_,[2,6]),t(_,[2,13]),{13:58,24:d,57:C},t(_,[2,17]),t(M,i,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(_,[2,29]),t(_,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(_,[2,14],{14:[1,71]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,72],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:E,41:w,45:k,48:S,51:A,52:L,53:I,54:N,57:C},t(_,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(_,[2,34]),t(_,[2,35]),t(_,[2,36]),t(_,[2,37]),t(D,[2,46]),t(D,[2,47]),t(_,[2,15]),t(_,[2,19]),t(M,i,{7:78}),t(_,[2,26]),t(_,[2,27]),{5:[1,79]},{5:[1,80]},{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,81],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:E,41:w,45:k,48:S,51:A,52:L,53:I,54:N,57:C},t(_,[2,32]),t(_,[2,33]),t(_,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:o(function(G,$){if($.recoverable)this.trace(G);else{var V=new Error(G);throw V.hash=$,V}},"parseError"),parse:o(function(G){var $=this,V=[0],X=[],Q=[null],H=[],ie=this.table,Y="",le=0,ee=0,J=0,te=2,Z=1,xe=H.slice.call(arguments,1),de=Object.create(this.lexer),Se={yy:{}};for(var Me in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Me)&&(Se.yy[Me]=this.yy[Me]);de.setInput(G,Se.yy),Se.yy.lexer=de,Se.yy.parser=this,typeof de.yylloc>"u"&&(de.yylloc={});var ke=de.yylloc;H.push(ke);var we=de.options&&de.options.ranges;typeof Se.yy.parseError=="function"?this.parseError=Se.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function _e(z){V.length=V.length-2*z,Q.length=Q.length-z,H.length=H.length-z}o(_e,"popStack");function $e(){var z;return z=X.pop()||de.lex()||Z,typeof z!="number"&&(z instanceof Array&&(X=z,z=X.pop()),z=$.symbols_[z]||z),z}o($e,"lex");for(var fe,Ke,Te,Be,Ue,Ge,Ne={},We,j,ae,U;;){if(Te=V[V.length-1],this.defaultActions[Te]?Be=this.defaultActions[Te]:((fe===null||typeof fe>"u")&&(fe=$e()),Be=ie[Te]&&ie[Te][fe]),typeof Be>"u"||!Be.length||!Be[0]){var ce="";U=[];for(We in ie[Te])this.terminals_[We]&&We>te&&U.push("'"+this.terminals_[We]+"'");de.showPosition?ce="Parse error on line "+(le+1)+`: -`+de.showPosition()+` -Expecting `+U.join(", ")+", got '"+(this.terminals_[fe]||fe)+"'":ce="Parse error on line "+(le+1)+": Unexpected "+(fe==Z?"end of input":"'"+(this.terminals_[fe]||fe)+"'"),this.parseError(ce,{text:de.match,token:this.terminals_[fe]||fe,line:de.yylineno,loc:ke,expected:U})}if(Be[0]instanceof Array&&Be.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Te+", token: "+fe);switch(Be[0]){case 1:V.push(fe),Q.push(de.yytext),H.push(de.yylloc),V.push(Be[1]),fe=null,Ke?(fe=Ke,Ke=null):(ee=de.yyleng,Y=de.yytext,le=de.yylineno,ke=de.yylloc,J>0&&J--);break;case 2:if(j=this.productions_[Be[1]][1],Ne.$=Q[Q.length-j],Ne._$={first_line:H[H.length-(j||1)].first_line,last_line:H[H.length-1].last_line,first_column:H[H.length-(j||1)].first_column,last_column:H[H.length-1].last_column},we&&(Ne._$.range=[H[H.length-(j||1)].range[0],H[H.length-1].range[1]]),Ge=this.performAction.apply(Ne,[Y,ee,le,Se.yy,Be[1],Q,H].concat(xe)),typeof Ge<"u")return Ge;j&&(V=V.slice(0,-1*j*2),Q=Q.slice(0,-1*j),H=H.slice(0,-1*j)),V.push(this.productions_[Be[1]][0]),Q.push(Ne.$),H.push(Ne._$),ae=ie[V[V.length-2]][V[V.length-1]],V.push(ae);break;case 3:return!0}}return!0},"parse")},P=(function(){var F={EOF:1,parseError:o(function($,V){if(this.yy.parser)this.yy.parser.parseError($,V);else throw new Error($)},"parseError"),setInput:o(function(G,$){return this.yy=$||this.yy||{},this._input=G,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var G=this._input[0];this.yytext+=G,this.yyleng++,this.offset++,this.match+=G,this.matched+=G;var $=G.match(/(?:\r\n?|\n).*/g);return $?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),G},"input"),unput:o(function(G){var $=G.length,V=G.split(/(?:\r\n?|\n)/g);this._input=G+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-$),this.offset-=$;var X=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),V.length-1&&(this.yylineno-=V.length-1);var Q=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:V?(V.length===X.length?this.yylloc.first_column:0)+X[X.length-V.length].length-V[0].length:this.yylloc.first_column-$},this.options.ranges&&(this.yylloc.range=[Q[0],Q[0]+this.yyleng-$]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(G){this.unput(this.match.slice(G))},"less"),pastInput:o(function(){var G=this.matched.substr(0,this.matched.length-this.match.length);return(G.length>20?"...":"")+G.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var G=this.match;return G.length<20&&(G+=this._input.substr(0,20-G.length)),(G.substr(0,20)+(G.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var G=this.pastInput(),$=new Array(G.length+1).join("-");return G+this.upcomingInput()+` -`+$+"^"},"showPosition"),test_match:o(function(G,$){var V,X,Q;if(this.options.backtrack_lexer&&(Q={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Q.yylloc.range=this.yylloc.range.slice(0))),X=G[0].match(/(?:\r\n?|\n).*/g),X&&(this.yylineno+=X.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:X?X[X.length-1].length-X[X.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+G[0].length},this.yytext+=G[0],this.match+=G[0],this.matches=G,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(G[0].length),this.matched+=G[0],V=this.performAction.call(this,this.yy,this,$,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),V)return V;if(this._backtrack){for(var H in Q)this[H]=Q[H];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var G,$,V,X;this._more||(this.yytext="",this.match="");for(var Q=this._currentRules(),H=0;H$[0].length)){if($=V,X=H,this.options.backtrack_lexer){if(G=this.test_match(V,Q[H]),G!==!1)return G;if(this._backtrack){$=!1;continue}else return!1}else if(!this.options.flex)break}return $?(G=this.test_match($,Q[X]),G!==!1?G:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var $=this.next();return $||this.lex()},"lex"),begin:o(function($){this.conditionStack.push($)},"begin"),popState:o(function(){var $=this.conditionStack.length-1;return $>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function($){return $=this.conditionStack.length-1-Math.abs($||0),$>=0?this.conditionStack[$]:"INITIAL"},"topState"),pushState:o(function($){this.begin($)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function($,V,X,Q){var H=Q;switch(X){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:return 51;case 5:return 52;case 6:return 53;case 7:return 54;case 8:break;case 9:break;case 10:return 5;case 11:break;case 12:break;case 13:break;case 14:break;case 15:return this.pushState("SCALE"),17;break;case 16:return 18;case 17:this.popState();break;case 18:return this.begin("acc_title"),33;break;case 19:return this.popState(),"acc_title_value";break;case 20:return this.begin("acc_descr"),35;break;case 21:return this.popState(),"acc_descr_value";break;case 22:this.begin("acc_descr_multiline");break;case 23:this.popState();break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;break;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 27:return this.popState(),this.pushState("CLASSDEFID"),42;break;case 28:return this.popState(),43;break;case 29:return this.pushState("CLASS"),48;break;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;break;case 31:return this.popState(),50;break;case 32:return this.pushState("STYLE"),45;break;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;break;case 34:return this.popState(),47;break;case 35:return this.pushState("SCALE"),17;break;case 36:return 18;case 37:this.popState();break;case 38:this.pushState("STATE");break;case 39:return this.popState(),V.yytext=V.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),V.yytext=V.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),V.yytext=V.yytext.slice(0,-10).trim(),27;break;case 42:return this.popState(),V.yytext=V.yytext.slice(0,-8).trim(),25;break;case 43:return this.popState(),V.yytext=V.yytext.slice(0,-8).trim(),26;break;case 44:return this.popState(),V.yytext=V.yytext.slice(0,-10).trim(),27;break;case 45:return 51;case 46:return 52;case 47:return 53;case 48:return 54;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";break;case 51:return this.popState(),"ID";break;case 52:this.popState();break;case 53:return"STATE_DESCR";case 54:return 19;case 55:this.popState();break;case 56:return this.popState(),this.pushState("struct"),20;break;case 57:break;case 58:return this.popState(),21;break;case 59:break;case 60:return this.begin("NOTE"),29;break;case 61:return this.popState(),this.pushState("NOTE_ID"),59;break;case 62:return this.popState(),this.pushState("NOTE_ID"),60;break;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 65:break;case 66:return"NOTE_TEXT";case 67:return this.popState(),"ID";break;case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 69:return this.popState(),V.yytext=V.yytext.substr(2).trim(),31;break;case 70:return this.popState(),V.yytext=V.yytext.slice(0,-8).trim(),31;break;case 71:return 6;case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return V.yytext=V.yytext.trim(),14;break;case 77:return 15;case 78:return 28;case 79:return 58;case 80:return 5;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:(?:[^:\n;]|:[^:\n;])+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}};return F})();R.lexer=P;function B(){this.yy={}}return o(B,"Parser"),B.prototype=R,R.Parser=B,new B})();fU.parser=fU;X7=fU});var yp,Qm,v3,i5e,a5e,s5e,Zm,K7,pU,mU,gU,yU,Q7,Z7,o5e,l5e,vU,xU,c5e,u5e,$v,Wct,h5e,bU,Hct,Yct,f5e,d5e,jct,p5e,Xct,m5e,TU,wU,g5e,J7,y5e,kU,e_=O(()=>{"use strict";yp="state",Qm="root",v3="relation",i5e="classDef",a5e="style",s5e="applyClass",Zm="default",K7="divider",pU="fill:none",mU="fill: #333",gU="markdown",yU="normal",Q7="rect",Z7="rectWithTitle",o5e="stateStart",l5e="stateEnd",vU="divider",xU="roundedWithTitle",c5e="note",u5e="noteGroup",$v="statediagram",Wct="state",h5e=`${$v}-${Wct}`,bU="transition",Hct="note",Yct="note-edge",f5e=`${bU} ${Yct}`,d5e=`${$v}-${Hct}`,jct="cluster",p5e=`${$v}-${jct}`,Xct="cluster-alt",m5e=`${$v}-${Xct}`,TU="parent",wU="note",g5e="state",J7="----",y5e=`${J7}${wU}`,kU=`${J7}${TU}`});function EU(t="",e=0,r="",n=J7){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${g5e}-${t}${i}-${e}`}function t_(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{let a=r.get(i);a&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...a.styles])}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function Qct(t){return t?.classes?.join(" ")??""}function Zct(t){return t?.styles??[]}var r_,vp,Kct,v5e,zv,b5e,T5e=O(()=>{"use strict";jt();xt();Ur();e_();r_=new Map,vp=0;o(EU,"stateDomId");Kct=o((t,e,r,n,i,a,s,l)=>{K.trace("items",e),e.forEach(u=>{switch(u.stmt){case yp:zv(t,u,r,n,i,a,s,l);break;case Zm:zv(t,u,r,n,i,a,s,l);break;case v3:{zv(t,u.state1,r,n,i,a,s,l),zv(t,u.state2,r,n,i,a,s,l);let h={id:"edge"+vp,start:u.state1.id,end:u.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:pU,labelStyle:"",label:st.sanitizeText(u.description??"",ve()),arrowheadStyle:mU,labelpos:"c",labelType:gU,thickness:yU,classes:bU,look:s};i.push(h),vp++}break}})},"setupDoc"),v5e=o((t,e="TB")=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");o(t_,"insertOrUpdateNode");o(Qct,"getClassesFromDbInfo");o(Zct,"getStylesFromDbInfo");zv=o((t,e,r,n,i,a,s,l)=>{let u=e.id,h=r.get(u),f=Qct(h),d=Zct(h),p=ve();if(K.info("dataFetcher parsedItem",e,h,d),u!=="root"){let m=Q7;e.start===!0?m=o5e:e.start===!1&&(m=l5e),e.type!==Zm&&(m=e.type),r_.get(u)||r_.set(u,{id:u,shape:m,description:st.sanitizeText(u,p),cssClasses:`${f} ${h5e}`,cssStyles:d});let g=r_.get(u);e.description&&(Array.isArray(g.description)?(g.shape=Z7,g.description.push(e.description)):g.description?.length&&g.description.length>0?(g.shape=Z7,g.description===u?g.description=[e.description]:g.description=[g.description,e.description]):(g.shape=Q7,g.description=e.description),g.description=st.sanitizeTextOrArray(g.description,p)),g.description?.length===1&&g.shape===Z7&&(g.type==="group"?g.shape=xU:g.shape=Q7),!g.type&&e.doc&&(K.info("Setting cluster for XCX",u,v5e(e)),g.type="group",g.isGroup=!0,g.dir=v5e(e),g.shape=e.type===K7?vU:xU,g.cssClasses=`${g.cssClasses} ${p5e} ${a?m5e:""}`);let y={labelStyle:"",shape:g.shape,label:g.description,cssClasses:g.cssClasses,cssCompiledStyles:[],cssStyles:g.cssStyles,id:u,dir:g.dir,domId:EU(u,vp),type:g.type,isGroup:g.type==="group",padding:8,rx:10,ry:10,look:s,labelType:"markdown"};if(y.shape===vU&&(y.label=""),t&&t.id!=="root"&&(K.trace("Setting node ",u," to be child of its parent ",t.id),y.parentId=t.id),y.centerLabel=!0,e.note){let v={labelStyle:"",shape:c5e,label:e.note.text,labelType:"markdown",cssClasses:d5e,cssStyles:[],cssCompiledStyles:[],id:u+y5e+"-"+vp,domId:EU(u,vp,wU),type:g.type,isGroup:g.type==="group",padding:p.flowchart?.padding,look:s,position:e.note.position},x=u+kU,b={labelStyle:"",shape:u5e,label:e.note.text,cssClasses:g.cssClasses,cssStyles:[],id:u+kU,domId:EU(u,vp,TU),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};vp++,b.id=x,v.parentId=x,t_(n,b,l),t_(n,v,l),t_(n,y,l);let T=u,E=v.id;e.note.position==="left of"&&(T=v.id,E=u),i.push({id:T+"-"+E,start:T,end:E,arrowhead:"none",arrowTypeEnd:"",style:pU,labelStyle:"",classes:f5e,arrowheadStyle:mU,labelpos:"c",labelType:gU,thickness:yU,look:s})}else t_(n,y,l)}e.doc&&(K.trace("Adding nodes children "),Kct(e,e.doc,r,n,i,!a,s,l))},"dataFetcher"),b5e=o(()=>{r_.clear(),vp=0},"reset")});var CU,Jct,eut,w5e,AU=O(()=>{"use strict";jt();xt();b0();Rd();Ld();ar();e_();CU=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),Jct=o(function(t,e){return e.db.getClasses()},"getClasses"),eut=o(async function(t,e,r,n){K.info("REF0:"),K.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=ve();n.db.extract(n.db.getRootDocV2());let l=n.db.getData(),u=Sl(e,i);l.type=n.type,l.layoutAlgorithm=s,l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["barb"],l.diagramId=e,await Ol(l,u);let h=8;try{(typeof n.db.getLinks=="function"?n.db.getLinks():new Map).forEach((d,p)=>{let m=typeof p=="string"?p:typeof p?.id=="string"?p.id:"";if(!m){K.warn("\u26A0\uFE0F Invalid or missing stateId from key:",JSON.stringify(p));return}let g=u.node()?.querySelectorAll("g"),y;if(g?.forEach(T=>{T.textContent?.trim()===m&&(y=T)}),!y){K.warn("\u26A0\uFE0F Could not find node matching text:",m);return}let v=y.parentNode;if(!v){K.warn("\u26A0\uFE0F Node has no parent, cannot wrap:",m);return}let x=document.createElementNS("http://www.w3.org/2000/svg","a"),b=d.url.replace(/^"+|"+$/g,"");if(x.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",b),x.setAttribute("target","_blank"),d.tooltip){let T=d.tooltip.replace(/^"+|"+$/g,"");x.setAttribute("title",T)}v.replaceChild(x,y),x.appendChild(y),K.info("\u{1F517} Wrapped node in
    tag for:",m,d.url)})}catch(f){K.error("\u274C Error injecting clickable links:",f)}Xt.insertTitle(u,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),bo(u,h,$v,a?.useMaxWidth??!0)},"draw"),w5e={getClasses:Jct,draw:eut,getDir:CU}});var Hs,E5e,S5e,n_,Wl,i_=O(()=>{"use strict";jt();xt();ar();Ur();si();T5e();AU();e_();Hs={START_NODE:"[*]",START_TYPE:"start",END_NODE:"[*]",END_TYPE:"end",COLOR_KEYWORD:"color",FILL_KEYWORD:"fill",BG_FILL:"bgFill",STYLECLASS_SEP:","},E5e=o(()=>new Map,"newClassesList"),S5e=o(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),n_=o(t=>JSON.parse(JSON.stringify(t)),"clone"),Wl=class{constructor(e){this.version=e;this.nodes=[];this.edges=[];this.rootDoc=[];this.classes=E5e();this.documents={root:S5e()};this.currentDocument=this.documents.root;this.startEndCount=0;this.dividerCnt=0;this.links=new Map;this.getAccTitle=Or;this.setAccTitle=Lr;this.getAccDescription=Br;this.setAccDescription=Pr;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{o(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(e){this.clear(!0);for(let i of Array.isArray(e)?e:e.doc)switch(i.stmt){case yp:this.addState(i.id.trim(),i.type,i.doc,i.description,i.note);break;case v3:this.addRelation(i.state1,i.state2,i.description);break;case i5e:this.addStyleClass(i.id.trim(),i.classes);break;case a5e:this.handleStyleDef(i);break;case s5e:this.setCssClass(i.id.trim(),i.styleClass);break;case"click":this.addLink(i.id,i.url,i.tooltip);break}let r=this.getStates(),n=ve();b5e(),zv(void 0,this.getRootDocV2(),r,this.nodes,this.edges,!0,n.look,this.classes);for(let i of this.nodes)if(Array.isArray(i.label)){if(i.description=i.label.slice(1),i.isGroup&&i.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${i.id}]`);i.label=i.label[0]}}handleStyleDef(e){let r=e.id.trim().split(","),n=e.styleClass.split(",");for(let i of r){let a=this.getState(i);if(!a){let s=i.trim();this.addState(s),a=this.getState(s)}a&&(a.styles=n.map(s=>s.replace(/;/g,"")?.trim()))}}setRootDoc(e){K.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}docTranslator(e,r,n){if(r.stmt===v3){this.docTranslator(e,r.state1,!0),this.docTranslator(e,r.state2,!1);return}if(r.stmt===yp&&(r.id===Hs.START_NODE?(r.id=e.id+(n?"_start":"_end"),r.start=n):r.id=r.id.trim()),r.stmt!==Qm&&r.stmt!==yp||!r.doc)return;let i=[],a=[];for(let s of r.doc)if(s.type===K7){let l=n_(s);l.doc=n_(a),i.push(l),a=[]}else a.push(s);if(i.length>0&&a.length>0){let s={stmt:yp,id:LN(),type:"divider",doc:n_(a)};i.push(n_(s)),r.doc=i}r.doc.forEach(s=>this.docTranslator(r,s,!0))}getRootDocV2(){return this.docTranslator({id:Qm,stmt:Qm},{id:Qm,stmt:Qm,doc:this.rootDoc},!0),{id:Qm,doc:this.rootDoc}}addState(e,r=Zm,n=void 0,i=void 0,a=void 0,s=void 0,l=void 0,u=void 0){let h=e?.trim();if(!this.currentDocument.states.has(h))K.info("Adding state ",h,i),this.currentDocument.states.set(h,{stmt:yp,id:h,descriptions:[],type:r,doc:n,note:a,classes:[],styles:[],textStyles:[]});else{let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.doc||(f.doc=n),f.type||(f.type=r)}if(i&&(K.info("Setting state description",h,i),(Array.isArray(i)?i:[i]).forEach(d=>this.addDescription(h,d.trim()))),a){let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.note=a,f.note.text=st.sanitizeText(f.note.text,ve())}s&&(K.info("Setting state classes",h,s),(Array.isArray(s)?s:[s]).forEach(d=>this.setCssClass(h,d.trim()))),l&&(K.info("Setting state styles",h,l),(Array.isArray(l)?l:[l]).forEach(d=>this.setStyle(h,d.trim()))),u&&(K.info("Setting state styles",h,l),(Array.isArray(u)?u:[u]).forEach(d=>this.setTextStyle(h,d.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:S5e()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=E5e(),e||(this.links=new Map,_r())}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){K.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(e,r,n){this.links.set(e,{url:r,tooltip:n}),K.warn("Adding link",e,r,n)}getLinks(){return this.links}startIdIfNeeded(e=""){return e===Hs.START_NODE?(this.startEndCount++,`${Hs.START_TYPE}${this.startEndCount}`):e}startTypeIfNeeded(e="",r=Zm){return e===Hs.START_NODE?Hs.START_TYPE:r}endIdIfNeeded(e=""){return e===Hs.END_NODE?(this.startEndCount++,`${Hs.END_TYPE}${this.startEndCount}`):e}endTypeIfNeeded(e="",r=Zm){return e===Hs.END_NODE?Hs.END_TYPE:r}addRelationObjs(e,r,n=""){let i=this.startIdIfNeeded(e.id.trim()),a=this.startTypeIfNeeded(e.id.trim(),e.type),s=this.startIdIfNeeded(r.id.trim()),l=this.startTypeIfNeeded(r.id.trim(),r.type);this.addState(i,a,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(s,l,r.doc,r.description,r.note,r.classes,r.styles,r.textStyles),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:st.sanitizeText(n,ve())})}addRelation(e,r,n){if(typeof e=="object"&&typeof r=="object")this.addRelationObjs(e,r,n);else if(typeof e=="string"&&typeof r=="string"){let i=this.startIdIfNeeded(e.trim()),a=this.startTypeIfNeeded(e),s=this.endIdIfNeeded(r.trim()),l=this.endTypeIfNeeded(r);this.addState(i,a),this.addState(s,l),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:n?st.sanitizeText(n,ve()):void 0})}}addDescription(e,r){let n=this.currentDocument.states.get(e),i=r.startsWith(":")?r.replace(":","").trim():r;n?.descriptions?.push(st.sanitizeText(i,ve()))}cleanupLabel(e){return e.startsWith(":")?e.slice(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(e,r=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let n=this.classes.get(e);r&&n&&r.split(Hs.STYLECLASS_SEP).forEach(i=>{let a=i.replace(/([^;]*);/,"$1").trim();if(RegExp(Hs.COLOR_KEYWORD).exec(i)){let l=a.replace(Hs.FILL_KEYWORD,Hs.BG_FILL).replace(Hs.COLOR_KEYWORD,Hs.FILL_KEYWORD);n.textStyles.push(l)}n.styles.push(a)})}getClasses(){return this.classes}setCssClass(e,r){e.split(",").forEach(n=>{let i=this.getState(n);if(!i){let a=n.trim();this.addState(a),i=this.getState(a)}i?.classes?.push(r)})}setStyle(e,r){this.getState(e)?.styles?.push(r)}setTextStyle(e,r){this.getState(e)?.textStyles?.push(r)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt==="dir")}getDirection(){return this.getDirectionStatement()?.value??"TB"}setDirection(e){let r=this.getDirectionStatement();r?r.value=e:this.rootDoc.unshift({stmt:"dir",value:e})}trimColon(e){return e.startsWith(":")?e.slice(1).trim():e.trim()}getData(){let e=ve();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:CU(this.getRootDocV2())}}getConfig(){return ve().state}}});var rut,a_,_U=O(()=>{"use strict";rut=o(t=>` -defs #statediagram-barbEnd { - fill: ${t.transitionColor}; - stroke: ${t.transitionColor}; - } -g.stateGroup text { - fill: ${t.nodeBorder}; - stroke: none; - font-size: 10px; -} -g.stateGroup text { - fill: ${t.textColor}; - stroke: none; - font-size: 10px; - -} -g.stateGroup .state-title { - font-weight: bolder; - fill: ${t.stateLabelColor}; -} - -g.stateGroup rect { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; -} - -g.stateGroup line { - stroke: ${t.lineColor}; - stroke-width: 1; -} - -.transition { - stroke: ${t.transitionColor}; - stroke-width: 1; - fill: none; -} - -.stateGroup .composit { - fill: ${t.background}; - border-bottom: 1px -} - -.stateGroup .alt-composit { - fill: #e0e0e0; - border-bottom: 1px -} - -.state-note { - stroke: ${t.noteBorderColor}; - fill: ${t.noteBkgColor}; - - text { - fill: ${t.noteTextColor}; - stroke: none; - font-size: 10px; - } -} - -.stateLabel .box { - stroke: none; - stroke-width: 0; - fill: ${t.mainBkg}; - opacity: 0.5; -} - -.edgeLabel .label rect { - fill: ${t.labelBackgroundColor}; - opacity: 0.5; -} -.edgeLabel { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; -} -.edgeLabel .label text { - fill: ${t.transitionLabelColor||t.tertiaryTextColor}; -} -.label div .edgeLabel { - color: ${t.transitionLabelColor||t.tertiaryTextColor}; -} - -.stateLabel text { - fill: ${t.stateLabelColor}; - font-size: 10px; - font-weight: bold; -} - -.node circle.state-start { - fill: ${t.specialStateColor}; - stroke: ${t.specialStateColor}; -} - -.node .fork-join { - fill: ${t.specialStateColor}; - stroke: ${t.specialStateColor}; -} - -.node circle.state-end { - fill: ${t.innerEndBackground}; - stroke: ${t.background}; - stroke-width: 1.5 -} -.end-state-inner { - fill: ${t.compositeBackground||t.background}; - // stroke: ${t.background}; - stroke-width: 1.5 -} - -.node rect { - fill: ${t.stateBkg||t.mainBkg}; - stroke: ${t.stateBorder||t.nodeBorder}; - stroke-width: 1px; -} -.node polygon { - fill: ${t.mainBkg}; - stroke: ${t.stateBorder||t.nodeBorder};; - stroke-width: 1px; -} -#statediagram-barbEnd { - fill: ${t.lineColor}; -} - -.statediagram-cluster rect { - fill: ${t.compositeTitleBackground}; - stroke: ${t.stateBorder||t.nodeBorder}; - stroke-width: 1px; -} - -.cluster-label, .nodeLabel { - color: ${t.stateLabelColor}; - // line-height: 1; -} - -.statediagram-cluster rect.outer { - rx: 5px; - ry: 5px; -} -.statediagram-state .divider { - stroke: ${t.stateBorder||t.nodeBorder}; -} - -.statediagram-state .title-state { - rx: 5px; - ry: 5px; -} -.statediagram-cluster.statediagram-cluster .inner { - fill: ${t.compositeBackground||t.background}; -} -.statediagram-cluster.statediagram-cluster-alt .inner { - fill: ${t.altBackground?t.altBackground:"#efefef"}; -} - -.statediagram-cluster .inner { - rx:0; - ry:0; -} - -.statediagram-state rect.basic { - rx: 5px; - ry: 5px; -} -.statediagram-state rect.divider { - stroke-dasharray: 10,10; - fill: ${t.altBackground?t.altBackground:"#efefef"}; -} - -.note-edge { - stroke-dasharray: 5; -} - -.statediagram-note rect { - fill: ${t.noteBkgColor}; - stroke: ${t.noteBorderColor}; - stroke-width: 1px; - rx: 0; - ry: 0; -} -.statediagram-note rect { - fill: ${t.noteBkgColor}; - stroke: ${t.noteBorderColor}; - stroke-width: 1px; - rx: 0; - ry: 0; -} - -.statediagram-note text { - fill: ${t.noteTextColor}; -} - -.statediagram-note .nodeLabel { - color: ${t.noteTextColor}; -} -.statediagram .edgeLabel { - color: red; // ${t.noteTextColor}; -} - -#dependencyStart, #dependencyEnd { - fill: ${t.lineColor}; - stroke: ${t.lineColor}; - stroke-width: 1; -} - -.statediagramTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; -} -`,"getStyles"),a_=rut});var nut,iut,aut,sut,A5e,out,lut,cut,uut,DU,C5e,_5e,D5e=O(()=>{"use strict";Ar();i_();ar();Ur();jt();xt();nut=o(t=>t.append("circle").attr("class","start-state").attr("r",ve().state.sizeUnit).attr("cx",ve().state.padding+ve().state.sizeUnit).attr("cy",ve().state.padding+ve().state.sizeUnit),"drawStartState"),iut=o(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",ve().state.textHeight).attr("class","divider").attr("x2",ve().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),aut=o((t,e)=>{let r=t.append("text").attr("x",2*ve().state.padding).attr("y",ve().state.textHeight+2*ve().state.padding).attr("font-size",ve().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",ve().state.padding).attr("y",ve().state.padding).attr("width",n.width+2*ve().state.padding).attr("height",n.height+2*ve().state.padding).attr("rx",ve().state.radius),r},"drawSimpleState"),sut=o((t,e)=>{let r=o(function(p,m,g){let y=p.append("tspan").attr("x",2*ve().state.padding).text(m);g||y.attr("dy",ve().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*ve().state.padding).attr("y",ve().state.textHeight+1.3*ve().state.padding).attr("font-size",ve().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",ve().state.padding).attr("y",a+ve().state.padding*.4+ve().state.dividerMargin+ve().state.textHeight).attr("class","state-description"),l=!0,u=!0;e.descriptions.forEach(function(p){l||(r(s,p,u),u=!1),l=!1});let h=t.append("line").attr("x1",ve().state.padding).attr("y1",ve().state.padding+a+ve().state.dividerMargin/2).attr("y2",ve().state.padding+a+ve().state.dividerMargin/2).attr("class","descr-divider"),f=s.node().getBBox(),d=Math.max(f.width,i.width);return h.attr("x2",d+3*ve().state.padding),t.insert("rect",":first-child").attr("x",ve().state.padding).attr("y",ve().state.padding).attr("width",d+2*ve().state.padding).attr("height",f.height+a+2*ve().state.padding).attr("rx",ve().state.radius),t},"drawDescrState"),A5e=o((t,e,r)=>{let n=ve().state.padding,i=2*ve().state.padding,a=t.node().getBBox(),s=a.width,l=a.x,u=t.append("text").attr("x",0).attr("y",ve().state.titleShift).attr("font-size",ve().state.fontSize).attr("class","state-title").text(e.id),f=u.node().getBBox().width+i,d=Math.max(f,s);d===s&&(d=d+i);let p,m=t.node().getBBox();e.doc,p=l-n,f>s&&(p=(s-d)/2+n),Math.abs(l-m.x)s&&(p=l-(f-s)/2);let g=1-ve().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",d).attr("height",m.height+ve().state.textHeight+ve().state.titleShift+1).attr("rx","0"),u.attr("x",p+n),f<=s&&u.attr("x",l+(d-i)/2-f/2+n),t.insert("rect",":first-child").attr("x",p).attr("y",ve().state.titleShift-ve().state.textHeight-ve().state.padding).attr("width",d).attr("height",ve().state.textHeight*3).attr("rx",ve().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",ve().state.titleShift-ve().state.textHeight-ve().state.padding).attr("width",d).attr("height",m.height+3+2*ve().state.textHeight).attr("rx",ve().state.radius),t},"addTitleAndBox"),out=o(t=>(t.append("circle").attr("class","end-state-outer").attr("r",ve().state.sizeUnit+ve().state.miniPadding).attr("cx",ve().state.padding+ve().state.sizeUnit+ve().state.miniPadding).attr("cy",ve().state.padding+ve().state.sizeUnit+ve().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",ve().state.sizeUnit).attr("cx",ve().state.padding+ve().state.sizeUnit+2).attr("cy",ve().state.padding+ve().state.sizeUnit+2)),"drawEndState"),lut=o((t,e)=>{let r=ve().state.forkWidth,n=ve().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",ve().state.padding).attr("y",ve().state.padding)},"drawForkJoinState"),cut=o((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
    ");s=s.replace(/\n/g,"
    ");let l=s.split(st.lineBreakRegex),u=1.25*ve().state.noteMargin;for(let h of l){let f=h.trim();if(f.length>0){let d=a.append("tspan");if(d.text(f),u===0){let p=d.node().getBBox();u+=p.height}i+=u,d.attr("x",e+ve().state.noteMargin),d.attr("y",r+i+1.25*ve().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),uut=o((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",ve().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=cut(t,0,0,n);return r.attr("height",a+2*ve().state.noteMargin),r.attr("width",i+ve().state.noteMargin*2),r},"drawNote"),DU=o(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&nut(i),e.type==="end"&&out(i),(e.type==="fork"||e.type==="join")&&lut(i,e),e.type==="note"&&uut(e.note.text,i),e.type==="divider"&&iut(i),e.type==="default"&&e.descriptions.length===0&&aut(i,e),e.type==="default"&&e.descriptions.length>0&&sut(i,e);let a=i.node().getBBox();return n.width=a.width+2*ve().state.padding,n.height=a.height+2*ve().state.padding,n},"drawState"),C5e=0,_5e=o(function(t,e,r){let n=o(function(u){switch(u){case Wl.relationType.AGGREGATION:return"aggregation";case Wl.relationType.EXTENSION:return"extension";case Wl.relationType.COMPOSITION:return"composition";case Wl.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(u=>!Number.isNaN(u.y));let i=e.points,a=hc().x(function(u){return u.x}).y(function(u){return u.y}).curve(fc),s=t.append("path").attr("d",a(i)).attr("id","edge"+C5e).attr("class","transition"),l="";if(ve().state.arrowMarkerAbsolute&&(l=Op(!0)),s.attr("marker-end","url("+l+"#"+n(Wl.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let u=t.append("g").attr("class","stateLabel"),{x:h,y:f}=Xt.calcLabelPosition(e.points),d=st.getRows(r.title),p=0,m=[],g=0,y=0;for(let b=0;b<=d.length;b++){let T=u.append("text").attr("text-anchor","middle").text(d[b]).attr("x",h).attr("y",f+p),E=T.node().getBBox();g=Math.max(g,E.width),y=Math.min(y,E.x),K.info(E.x,h,f+p),p===0&&(p=T.node().getBBox().height,K.info("Title height",p,f)),m.push(T)}let v=p*d.length;if(d.length>1){let b=(d.length-1)*p*.5;m.forEach((T,E)=>T.attr("y",f+E*p-b)),v=p*d.length}let x=u.node().getBBox();u.insert("rect",":first-child").attr("class","box").attr("x",h-g/2-ve().state.padding/2).attr("y",f-v/2-ve().state.padding/2-3.5).attr("width",g+ve().state.padding).attr("height",v+ve().state.padding),K.info(x)}C5e++},"drawEdge")});var al,RU,hut,fut,dut,put,R5e,L5e,N5e=O(()=>{"use strict";Ar();rO();Dl();xt();Ur();D5e();jt();Ti();RU={},hut=o(function(){},"setConf"),fut=o(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),dut=o(function(t,e,r,n){al=ve().state;let i=ve().securityLevel,a;i==="sandbox"&&(a=je("#i"+e));let s=i==="sandbox"?je(a.nodes()[0].contentDocument.body):je("body"),l=i==="sandbox"?a.nodes()[0].contentDocument:document;K.debug("Rendering diagram "+t);let u=s.select(`[id='${e}']`);fut(u);let h=n.db.getRootDoc();R5e(h,u,void 0,!1,s,l,n);let f=al.padding,d=u.node().getBBox(),p=d.width+f*2,m=d.height+f*2,g=p*1.75;Zr(u,m,g,al.useMaxWidth),u.attr("viewBox",`${d.x-al.padding} ${d.y-al.padding} `+p+" "+m)},"draw"),put=o(t=>t?t.length*al.fontSizeFactor:1,"getLabelWidth"),R5e=o((t,e,r,n,i,a,s)=>{let l=new wn({compound:!0,multigraph:!0}),u,h=!0;for(u=0;u{let w=E.parentElement,k=0,S=0;w&&(w.parentElement&&(k=w.parentElement.getBBox().width),S=parseInt(w.getAttribute("data-x-shift"),10),Number.isNaN(S)&&(S=0)),E.setAttribute("x1",0-S+8),E.setAttribute("x2",k-S-8)})):K.debug("No Node "+b+": "+JSON.stringify(l.node(b)))});let v=y.getBBox();l.edges().forEach(function(b){b!==void 0&&l.edge(b)!==void 0&&(K.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(l.edge(b))),_5e(e,l.edge(b),l.edge(b).relation))}),v=y.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=v.width+2*al.padding,x.height=v.height+2*al.padding,K.debug("Doc rendered",x,l),x},"renderDoc"),L5e={setConf:hut,draw:dut}});var M5e={};vr(M5e,{diagram:()=>mut});var mut,I5e=O(()=>{"use strict";dU();i_();_U();N5e();mut={parser:X7,get db(){return new Wl(1)},renderer:L5e,styles:a_,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var B5e={};vr(B5e,{diagram:()=>xut});var xut,F5e=O(()=>{"use strict";dU();i_();_U();AU();xut={parser:X7,get db(){return new Wl(2)},renderer:w5e,styles:a_,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var LU,G5e,V5e=O(()=>{"use strict";LU=(function(){var t=o(function(d,p,m,g){for(m=m||{},g=d.length;g--;m[d[g]]=p);return m},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,14],u={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:o(function(p,m,g,y,v,x,b){var T=x.length-1;switch(v){case 1:return x[T-1];case 2:this.$=[];break;case 3:x[T-1].push(x[T]),this.$=x[T-1];break;case 4:case 5:this.$=x[T];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(x[T].substr(6)),this.$=x[T].substr(6);break;case 9:this.$=x[T].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=x[T].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(x[T].substr(8)),this.$=x[T].substr(8);break;case 13:y.addTask(x[T-1],x[T]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:o(function(p,m){if(m.recoverable)this.trace(p);else{var g=new Error(p);throw g.hash=m,g}},"parseError"),parse:o(function(p){var m=this,g=[0],y=[],v=[null],x=[],b=this.table,T="",E=0,w=0,k=0,S=2,A=1,L=x.slice.call(arguments,1),I=Object.create(this.lexer),N={yy:{}};for(var C in this.yy)Object.prototype.hasOwnProperty.call(this.yy,C)&&(N.yy[C]=this.yy[C]);I.setInput(p,N.yy),N.yy.lexer=I,N.yy.parser=this,typeof I.yylloc>"u"&&(I.yylloc={});var _=I.yylloc;x.push(_);var D=I.options&&I.options.ranges;typeof N.yy.parseError=="function"?this.parseError=N.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function M(ee){g.length=g.length-2*ee,v.length=v.length-ee,x.length=x.length-ee}o(M,"popStack");function R(){var ee;return ee=y.pop()||I.lex()||A,typeof ee!="number"&&(ee instanceof Array&&(y=ee,ee=y.pop()),ee=m.symbols_[ee]||ee),ee}o(R,"lex");for(var P,B,F,G,$,V,X={},Q,H,ie,Y;;){if(F=g[g.length-1],this.defaultActions[F]?G=this.defaultActions[F]:((P===null||typeof P>"u")&&(P=R()),G=b[F]&&b[F][P]),typeof G>"u"||!G.length||!G[0]){var le="";Y=[];for(Q in b[F])this.terminals_[Q]&&Q>S&&Y.push("'"+this.terminals_[Q]+"'");I.showPosition?le="Parse error on line "+(E+1)+`: -`+I.showPosition()+` -Expecting `+Y.join(", ")+", got '"+(this.terminals_[P]||P)+"'":le="Parse error on line "+(E+1)+": Unexpected "+(P==A?"end of input":"'"+(this.terminals_[P]||P)+"'"),this.parseError(le,{text:I.match,token:this.terminals_[P]||P,line:I.yylineno,loc:_,expected:Y})}if(G[0]instanceof Array&&G.length>1)throw new Error("Parse Error: multiple actions possible at state: "+F+", token: "+P);switch(G[0]){case 1:g.push(P),v.push(I.yytext),x.push(I.yylloc),g.push(G[1]),P=null,B?(P=B,B=null):(w=I.yyleng,T=I.yytext,E=I.yylineno,_=I.yylloc,k>0&&k--);break;case 2:if(H=this.productions_[G[1]][1],X.$=v[v.length-H],X._$={first_line:x[x.length-(H||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(H||1)].first_column,last_column:x[x.length-1].last_column},D&&(X._$.range=[x[x.length-(H||1)].range[0],x[x.length-1].range[1]]),V=this.performAction.apply(X,[T,w,E,N.yy,G[1],v,x].concat(L)),typeof V<"u")return V;H&&(g=g.slice(0,-1*H*2),v=v.slice(0,-1*H),x=x.slice(0,-1*H)),g.push(this.productions_[G[1]][0]),v.push(X.$),x.push(X._$),ie=b[g[g.length-2]][g[g.length-1]],g.push(ie);break;case 3:return!0}}return!0},"parse")},h=(function(){var d={EOF:1,parseError:o(function(m,g){if(this.yy.parser)this.yy.parser.parseError(m,g);else throw new Error(m)},"parseError"),setInput:o(function(p,m){return this.yy=m||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var m=p.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:o(function(p){var m=p.length,g=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var v=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===y.length?this.yylloc.first_column:0)+y[y.length-g.length].length-g[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[v[0],v[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(p){this.unput(this.match.slice(p))},"less"),pastInput:o(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var p=this.pastInput(),m=new Array(p.length+1).join("-");return p+this.upcomingInput()+` -`+m+"^"},"showPosition"),test_match:o(function(p,m){var g,y,v;if(this.options.backtrack_lexer&&(v={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(v.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],g=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in v)this[x]=v[x];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,m,g,y;this._more||(this.yytext="",this.match="");for(var v=this._currentRules(),x=0;xm[0].length)){if(m=g,y=x,this.options.backtrack_lexer){if(p=this.test_match(g,v[x]),p!==!1)return p;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(p=this.test_match(m,v[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var m=this.next();return m||this.lex()},"lex"),begin:o(function(m){this.conditionStack.push(m)},"begin"),popState:o(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:o(function(m){this.begin(m)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(m,g,y,v){var x=v;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return d})();u.lexer=h;function f(){this.yy={}}return o(f,"Parser"),f.prototype=u,u.Parser=f,new f})();LU.parser=LU;G5e=LU});var Gv,NU,x3,b3,kut,Eut,Sut,Cut,Aut,_ut,Dut,q5e,Rut,MU,U5e=O(()=>{"use strict";jt();si();Gv="",NU=[],x3=[],b3=[],kut=o(function(){NU.length=0,x3.length=0,Gv="",b3.length=0,_r()},"clear"),Eut=o(function(t){Gv=t,NU.push(t)},"addSection"),Sut=o(function(){return NU},"getSections"),Cut=o(function(){let t=q5e(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),_ut=o(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(l=>l.trim()),s={section:Gv,type:Gv,people:a,task:t,score:n};b3.push(s)},"addTask"),Dut=o(function(t){let e={section:Gv,type:Gv,description:t,task:t,classes:[]};x3.push(e)},"addTaskOrg"),q5e=o(function(){let t=o(function(r){return b3[r].processed},"compileTask"),e=!0;for(let[r,n]of b3.entries())t(r),e=e&&n.processed;return e},"compileTasks"),Rut=o(function(){return Aut()},"getActors"),MU={getConfig:o(()=>ve().journey,"getConfig"),clear:kut,setDiagramTitle:zr,getDiagramTitle:Fr,setAccTitle:Lr,getAccTitle:Or,setAccDescription:Pr,getAccDescription:Br,addSection:Eut,getSections:Sut,getTasks:Cut,addTask:_ut,addTaskOrg:Dut,getActors:Rut}});var Lut,W5e,H5e=O(()=>{"use strict";ly();Lut=o(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.textColor}; - } - .mouth { - stroke: #666; - } - - line { - stroke: ${t.textColor} - } - - .legend { - fill: ${t.textColor}; - font-family: ${t.fontFamily}; - } - - .label text { - fill: #333; - } - .label { - color: ${t.textColor} - } - - .face { - ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; - stroke: #999; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - .node .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 1.5px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - rect { - opacity: 0.5; - } - text-align: center; - } - - .cluster rect { - } - - .cluster text { - fill: ${t.titleColor}; - } - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .task-type-0, .section-type-0 { - ${t.fillType0?`fill: ${t.fillType0}`:""}; - } - .task-type-1, .section-type-1 { - ${t.fillType0?`fill: ${t.fillType1}`:""}; - } - .task-type-2, .section-type-2 { - ${t.fillType0?`fill: ${t.fillType2}`:""}; - } - .task-type-3, .section-type-3 { - ${t.fillType0?`fill: ${t.fillType3}`:""}; - } - .task-type-4, .section-type-4 { - ${t.fillType0?`fill: ${t.fillType4}`:""}; - } - .task-type-5, .section-type-5 { - ${t.fillType0?`fill: ${t.fillType5}`:""}; - } - .task-type-6, .section-type-6 { - ${t.fillType0?`fill: ${t.fillType6}`:""}; - } - .task-type-7, .section-type-7 { - ${t.fillType0?`fill: ${t.fillType7}`:""}; - } - - .actor-0 { - ${t.actor0?`fill: ${t.actor0}`:""}; - } - .actor-1 { - ${t.actor1?`fill: ${t.actor1}`:""}; - } - .actor-2 { - ${t.actor2?`fill: ${t.actor2}`:""}; - } - .actor-3 { - ${t.actor3?`fill: ${t.actor3}`:""}; - } - .actor-4 { - ${t.actor4?`fill: ${t.actor4}`:""}; - } - .actor-5 { - ${t.actor5?`fill: ${t.actor5}`:""}; - } - ${Lu()} -`,"getStyles"),W5e=Lut});var IU,Nut,j5e,X5e,Mut,Iut,Y5e,Out,Put,K5e,But,Vv,Q5e=O(()=>{"use strict";Ar();a0();IU=o(function(t,e){return i0(t,e)},"drawRect"),Nut=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=uc().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=uc().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),j5e=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),X5e=o(function(t,e){return Gee(t,e)},"drawText"),Mut=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,X5e(t,e)},"drawLabel"),Iut=o(function(t,e,r){let n=t.append("g"),i=Oa();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,IU(n,i),K5e(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Y5e=-1,Out=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Y5e++,i.append("line").attr("id","task"+Y5e).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),Nut(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=Oa();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,IU(i,s);let l=e.x+14;e.people.forEach(u=>{let h=e.actors[u].color,f={cx:l,cy:e.y,r:7,fill:h,stroke:"#000",title:u,pos:e.actors[u].position};j5e(i,f),l+=10}),K5e(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),Put=o(function(t,e){nk(t,e)},"drawBackgroundRect"),K5e=(function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{let a=cf[i].color,s={cx:20,cy:n,r:7,fill:a,stroke:"#000",pos:cf[i].position};Vv.drawCircle(t,s);let l=t.append("text").attr("visibility","hidden").text(i),u=l.node().getBoundingClientRect().width;l.remove();let h=[];if(u<=r)h=[i];else{let f=i.split(" "),d="";l=t.append("text").attr("visibility","hidden"),f.forEach(p=>{let m=d?`${d} ${p}`:p;if(l.text(m),l.node().getBoundingClientRect().width>r){if(d&&h.push(d),d=p,l.text(p),l.node().getBoundingClientRect().width>r){let y="";for(let v of p)y+=v,l.text(y+"-"),l.node().getBoundingClientRect().width>r&&(h.push(y.slice(0,-1)+"-"),y=v);d=y}}else d=m}),d&&h.push(d),l.remove()}h.forEach((f,d)=>{let p={x:40,y:n+7+d*20,fill:"#666",text:f,textMargin:e.boxTextMargin??5},g=Vv.drawText(t,p).node().getBoundingClientRect().width;g>s_&&g>e.leftMargin-g&&(s_=g)}),n+=Math.max(20,h.length*20)})}var Fut,cf,s_,Pc,xp,zut,Hl,OU,Z5e,Gut,PU,J5e=O(()=>{"use strict";Ar();Q5e();jt();Ti();Fut=o(function(t){Object.keys(t).forEach(function(r){Pc[r]=t[r]})},"setConf"),cf={},s_=0;o($ut,"drawActorLegend");Pc=ve().journey,xp=0,zut=o(function(t,e,r,n){let i=ve(),a=i.journey.titleColor,s=i.journey.titleFontSize,l=i.journey.titleFontFamily,u=i.securityLevel,h;u==="sandbox"&&(h=je("#i"+e));let f=u==="sandbox"?je(h.nodes()[0].contentDocument.body):je("body");Hl.init();let d=f.select("#"+e);Vv.initGraphics(d);let p=n.db.getTasks(),m=n.db.getDiagramTitle(),g=n.db.getActors();for(let E in cf)delete cf[E];let y=0;g.forEach(E=>{cf[E]={color:Pc.actorColours[y%Pc.actorColours.length],position:y},y++}),$ut(d),xp=Pc.leftMargin+s_,Hl.insert(0,0,xp,Object.keys(cf).length*50),Gut(d,p,0);let v=Hl.getBounds();m&&d.append("text").text(m).attr("x",xp).attr("font-size",s).attr("font-weight","bold").attr("y",25).attr("fill",a).attr("font-family",l);let x=v.stopy-v.starty+2*Pc.diagramMarginY,b=xp+v.stopx+2*Pc.diagramMarginX;Zr(d,x,b,Pc.useMaxWidth),d.append("line").attr("x1",xp).attr("y1",Pc.height*4).attr("x2",b-xp-4).attr("y2",Pc.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let T=m?70:0;d.attr("viewBox",`${v.startx} -25 ${b} ${x+T}`),d.attr("preserveAspectRatio","xMinYMin meet"),d.attr("height",x+T+25)},"draw"),Hl={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:o(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=ve().journey,a=this,s=0;function l(u){return o(function(f){s++;let d=a.sequenceItems.length-s+1;a.updateVal(f,"starty",e-d*i.boxMargin,Math.min),a.updateVal(f,"stopy",n+d*i.boxMargin,Math.max),a.updateVal(Hl.data,"startx",t-d*i.boxMargin,Math.min),a.updateVal(Hl.data,"stopx",r+d*i.boxMargin,Math.max),u!=="activation"&&(a.updateVal(f,"startx",t-d*i.boxMargin,Math.min),a.updateVal(f,"stopx",r+d*i.boxMargin,Math.max),a.updateVal(Hl.data,"starty",e-d*i.boxMargin,Math.min),a.updateVal(Hl.data,"stopy",n+d*i.boxMargin,Math.max))},"updateItemBounds")}o(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:o(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),l=Math.max(e,n);this.updateVal(Hl.data,"startx",i,Math.min),this.updateVal(Hl.data,"starty",s,Math.min),this.updateVal(Hl.data,"stopx",a,Math.max),this.updateVal(Hl.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return this.data},"getBounds")},OU=Pc.sectionFills,Z5e=Pc.sectionColours,Gut=o(function(t,e,r){let n=ve().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,l=0,u="#CCC",h="black",f=0;for(let[d,p]of e.entries()){if(i!==p.section){u=OU[l%OU.length],f=l%OU.length,h=Z5e[l%Z5e.length];let g=0,y=p.section;for(let x=d;x(cf[y]&&(g[y]=cf[y]),g),{});p.x=d*n.taskMargin+d*n.width+xp,p.y=s,p.width=n.diagramMarginX,p.height=n.diagramMarginY,p.colour=h,p.fill=u,p.num=f,p.actors=m,Vv.drawTask(t,p,n),Hl.insert(p.x,p.y,p.x+p.width+n.taskMargin,450)}},"drawTasks"),PU={setConf:Fut,draw:zut}});var eke={};vr(eke,{diagram:()=>Vut});var Vut,tke=O(()=>{"use strict";V5e();U5e();H5e();J5e();Vut={parser:G5e,db:MU,renderer:PU,styles:W5e,init:o(t=>{PU.setConf(t.journey),MU.clear()},"init")}});var FU,lke,cke=O(()=>{"use strict";FU=(function(){var t=o(function(p,m,g,y){for(g=g||{},y=p.length;y--;g[p[y]]=m);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,16],u=[1,17],h={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:o(function(m,g,y,v,x,b,T){var E=b.length-1;switch(x){case 1:return b[E-1];case 2:this.$=[];break;case 3:b[E-1].push(b[E]),this.$=b[E-1];break;case 4:case 5:this.$=b[E];break;case 6:case 7:this.$=[];break;case 8:v.getCommonDb().setDiagramTitle(b[E].substr(6)),this.$=b[E].substr(6);break;case 9:this.$=b[E].trim(),v.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[E].trim(),v.getCommonDb().setAccDescription(this.$);break;case 12:v.addSection(b[E].substr(8)),this.$=b[E].substr(8);break;case 15:v.addTask(b[E],0,""),this.$=b[E];break;case 16:v.addEvent(b[E].substr(2)),this.$=b[E];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:o(function(m,g){if(g.recoverable)this.trace(m);else{var y=new Error(m);throw y.hash=g,y}},"parseError"),parse:o(function(m){var g=this,y=[0],v=[],x=[null],b=[],T=this.table,E="",w=0,k=0,S=0,A=2,L=1,I=b.slice.call(arguments,1),N=Object.create(this.lexer),C={yy:{}};for(var _ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_)&&(C.yy[_]=this.yy[_]);N.setInput(m,C.yy),C.yy.lexer=N,C.yy.parser=this,typeof N.yylloc>"u"&&(N.yylloc={});var D=N.yylloc;b.push(D);var M=N.options&&N.options.ranges;typeof C.yy.parseError=="function"?this.parseError=C.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function R(J){y.length=y.length-2*J,x.length=x.length-J,b.length=b.length-J}o(R,"popStack");function P(){var J;return J=v.pop()||N.lex()||L,typeof J!="number"&&(J instanceof Array&&(v=J,J=v.pop()),J=g.symbols_[J]||J),J}o(P,"lex");for(var B,F,G,$,V,X,Q={},H,ie,Y,le;;){if(G=y[y.length-1],this.defaultActions[G]?$=this.defaultActions[G]:((B===null||typeof B>"u")&&(B=P()),$=T[G]&&T[G][B]),typeof $>"u"||!$.length||!$[0]){var ee="";le=[];for(H in T[G])this.terminals_[H]&&H>A&&le.push("'"+this.terminals_[H]+"'");N.showPosition?ee="Parse error on line "+(w+1)+`: -`+N.showPosition()+` -Expecting `+le.join(", ")+", got '"+(this.terminals_[B]||B)+"'":ee="Parse error on line "+(w+1)+": Unexpected "+(B==L?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(ee,{text:N.match,token:this.terminals_[B]||B,line:N.yylineno,loc:D,expected:le})}if($[0]instanceof Array&&$.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+B);switch($[0]){case 1:y.push(B),x.push(N.yytext),b.push(N.yylloc),y.push($[1]),B=null,F?(B=F,F=null):(k=N.yyleng,E=N.yytext,w=N.yylineno,D=N.yylloc,S>0&&S--);break;case 2:if(ie=this.productions_[$[1]][1],Q.$=x[x.length-ie],Q._$={first_line:b[b.length-(ie||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(ie||1)].first_column,last_column:b[b.length-1].last_column},M&&(Q._$.range=[b[b.length-(ie||1)].range[0],b[b.length-1].range[1]]),X=this.performAction.apply(Q,[E,k,w,C.yy,$[1],x,b].concat(I)),typeof X<"u")return X;ie&&(y=y.slice(0,-1*ie*2),x=x.slice(0,-1*ie),b=b.slice(0,-1*ie)),y.push(this.productions_[$[1]][0]),x.push(Q.$),b.push(Q._$),Y=T[y[y.length-2]][y[y.length-1]],y.push(Y);break;case 3:return!0}}return!0},"parse")},f=(function(){var p={EOF:1,parseError:o(function(g,y){if(this.yy.parser)this.yy.parser.parseError(g,y);else throw new Error(g)},"parseError"),setInput:o(function(m,g){return this.yy=g||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var g=m.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:o(function(m){var g=m.length,y=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var v=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),y.length-1&&(this.yylineno-=y.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:y?(y.length===v.length?this.yylloc.first_column:0)+v[v.length-y.length].length-y[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(m){this.unput(this.match.slice(m))},"less"),pastInput:o(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var m=this.pastInput(),g=new Array(m.length+1).join("-");return m+this.upcomingInput()+` -`+g+"^"},"showPosition"),test_match:o(function(m,g){var y,v,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),v=m[0].match(/(?:\r\n?|\n).*/g),v&&(this.yylineno+=v.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:v?v[v.length-1].length-v[v.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],y=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),y)return y;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,g,y,v;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=y,v=b,this.options.backtrack_lexer){if(m=this.test_match(y,x[b]),m!==!1)return m;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(m=this.test_match(g,x[v]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var g=this.next();return g||this.lex()},"lex"),begin:o(function(g){this.conditionStack.push(g)},"begin"),popState:o(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:o(function(g){this.begin(g)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(g,y,v,x){var b=x;switch(v){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return p})();h.lexer=f;function d(){this.yy={}}return o(d,"Parser"),d.prototype=h,h.Parser=d,new d})();FU.parser=FU;lke=FU});var zU={};vr(zU,{addEvent:()=>vke,addSection:()=>pke,addTask:()=>yke,addTaskOrg:()=>xke,clear:()=>dke,default:()=>Qut,getCommonDb:()=>fke,getSections:()=>mke,getTasks:()=>gke});var qv,hke,$U,o_,Uv,fke,dke,pke,mke,gke,yke,vke,xke,uke,Qut,bke=O(()=>{"use strict";si();qv="",hke=0,$U=[],o_=[],Uv=[],fke=o(()=>$2,"getCommonDb"),dke=o(function(){$U.length=0,o_.length=0,qv="",Uv.length=0,_r()},"clear"),pke=o(function(t){qv=t,$U.push(t)},"addSection"),mke=o(function(){return $U},"getSections"),gke=o(function(){let t=uke(),e=100,r=0;for(;!t&&rr.id===hke-1).events.push(t)},"addEvent"),xke=o(function(t){let e={section:qv,type:qv,description:t,task:t,classes:[]};o_.push(e)},"addTaskOrg"),uke=o(function(){let t=o(function(r){return Uv[r].processed},"compileTask"),e=!0;for(let[r,n]of Uv.entries())t(r),e=e&&n.processed;return e},"compileTasks"),Qut={clear:dke,getCommonDb:fke,addSection:pke,getSections:mke,getTasks:gke,addTask:yke,addTaskOrg:xke,addEvent:vke}});function Eke(t,e){t.each(function(){var r=je(this),n=r.text().split(/(\s+|
    )/).reverse(),i,a=[],s=1.1,l=r.attr("y"),u=parseFloat(r.attr("dy")),h=r.text(null).append("tspan").attr("x",0).attr("y",l).attr("dy",u+"em");for(let f=0;fe||i==="
    ")&&(a.pop(),h.text(a.join(" ").trim()),i==="
    "?a=[""]:a=[i],h=r.append("tspan").attr("x",0).attr("y",l).attr("dy",s+"em").text(i))})}var Zut,l_,Jut,eht,wke,tht,rht,Tke,nht,iht,aht,GU,kke,sht,oht,lht,cht,bp,Ske=O(()=>{"use strict";Ar();Zut=12,l_=o(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),Jut=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=uc().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=uc().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),eht=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),wke=o(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),tht=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,wke(t,e)},"drawLabel"),rht=o(function(t,e,r){let n=t.append("g"),i=GU();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,l_(n,i),kke(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Tke=-1,nht=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Tke++,i.append("line").attr("id","task"+Tke).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),Jut(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=GU();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,l_(i,s),kke(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),iht=o(function(t,e){l_(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),aht=o(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),GU=o(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),kke=(function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{"use strict";Ar();Ske();xt();jt();Ti();uht=o(function(t,e,r,n){let i=ve(),a=i.timeline?.leftMargin??50;K.debug("timeline",n.db);let s=i.securityLevel,l;s==="sandbox"&&(l=je("#i"+e));let h=(s==="sandbox"?je(l.nodes()[0].contentDocument.body):je("body")).select("#"+e);h.append("g");let f=n.db.getTasks(),d=n.db.getCommonDb().getDiagramTitle();K.debug("task",f),bp.initGraphics(h);let p=n.db.getSections();K.debug("sections",p);let m=0,g=0,y=0,v=0,x=50+a,b=50;v=50;let T=0,E=!0;p.forEach(function(L){let I={number:T,descr:L,section:T,width:150,padding:20,maxHeight:m},N=bp.getVirtualNodeHeight(h,I,i);K.debug("sectionHeight before draw",N),m=Math.max(m,N+20)});let w=0,k=0;K.debug("tasks.length",f.length);for(let[L,I]of f.entries()){let N={number:L,descr:I,section:I.section,width:150,padding:20,maxHeight:g},C=bp.getVirtualNodeHeight(h,N,i);K.debug("taskHeight before draw",C),g=Math.max(g,C+20),w=Math.max(w,I.events.length);let _=0;for(let D of I.events){let M={descr:D,section:I.section,number:I.section,width:150,padding:20,maxHeight:50};_+=bp.getVirtualNodeHeight(h,M,i)}I.events.length>0&&(_+=(I.events.length-1)*10),k=Math.max(k,_)}K.debug("maxSectionHeight before draw",m),K.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(L=>{let I=f.filter(D=>D.section===L),N={number:T,descr:L,section:T,width:200*Math.max(I.length,1)-50,padding:20,maxHeight:m};K.debug("sectionNode",N);let C=h.append("g"),_=bp.drawNode(C,N,T,i);K.debug("sectionNode output",_),C.attr("transform",`translate(${x}, ${v})`),b+=m+50,I.length>0&&Cke(h,I,T,x,b,g,i,w,k,m,!1),x+=200*Math.max(I.length,1),b=v,T++}):(E=!1,Cke(h,f,T,x,b,g,i,w,k,m,!0));let S=h.node().getBBox();K.debug("bounds",S),d&&h.append("text").text(d).attr("x",S.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),y=E?m+g+150:g+100,h.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",y).attr("x2",S.width+3*a).attr("y2",y).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),Kc(void 0,h,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),Cke=o(function(t,e,r,n,i,a,s,l,u,h,f){for(let d of e){let p={descr:d.task,section:r,number:r,width:150,padding:20,maxHeight:a};K.debug("taskNode",p);let m=t.append("g").attr("class","taskWrapper"),y=bp.drawNode(m,p,r,s).height;if(K.debug("taskHeight after draw",y),m.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,y),d.events){let v=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+hht(t,d.events,r,n,i,s),i-=100,v.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+100+u+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,f&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),hht=o(function(t,e,r,n,i,a){let s=0,l=i;i=i+100;for(let u of e){let h={descr:u,section:r,number:r,width:150,padding:20,maxHeight:50};K.debug("eventNode",h);let f=t.append("g").attr("class","eventWrapper"),p=bp.drawNode(f,h,r,a).height;s=s+p,f.attr("transform",`translate(${n}, ${i})`),i=i+10+p}return i=l,s},"drawEvents"),Ake={setConf:o(()=>{},"setConf"),draw:uht}});var fht,dht,Dke,Rke=O(()=>{"use strict";Ys();fht=o(t=>{let e="";for(let r=0;r` - .edge { - stroke-width: 3; - } - ${fht(t)} - .section-root rect, .section-root path, .section-root circle { - fill: ${t.git0}; - } - .section-root text { - fill: ${t.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .eventWrapper { - filter: brightness(120%); - } -`,"getStyles"),Dke=dht});var Lke={};vr(Lke,{diagram:()=>pht});var pht,Nke=O(()=>{"use strict";cke();bke();_ke();Rke();pht={db:zU,renderer:Ake,parser:lke,styles:Dke}});var VU,Oke,Pke=O(()=>{"use strict";VU=(function(){var t=o(function(E,w,k,S){for(k=k||{},S=E.length;S--;k[E[S]]=w);return k},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,6,13,15,16,19,22],g=[1,33],y=[1,34],v=[1,6,7,11,13,15,16,19,22],x={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:o(function(w,k,S,A,L,I,N){var C=I.length-1;switch(L){case 6:case 7:return A;case 8:A.getLogger().trace("Stop NL ");break;case 9:A.getLogger().trace("Stop EOF ");break;case 11:A.getLogger().trace("Stop NL2 ");break;case 12:A.getLogger().trace("Stop EOF2 ");break;case 15:A.getLogger().info("Node: ",I[C].id),A.addNode(I[C-1].length,I[C].id,I[C].descr,I[C].type);break;case 16:A.getLogger().trace("Icon: ",I[C]),A.decorateNode({icon:I[C]});break;case 17:case 21:A.decorateNode({class:I[C]});break;case 18:A.getLogger().trace("SPACELIST");break;case 19:A.getLogger().trace("Node: ",I[C].id),A.addNode(0,I[C].id,I[C].descr,I[C].type);break;case 20:A.decorateNode({icon:I[C]});break;case 25:A.getLogger().trace("node found ..",I[C-2]),this.$={id:I[C-1],descr:I[C-1],type:A.getType(I[C-2],I[C])};break;case 26:this.$={id:I[C],descr:I[C],type:A.nodeType.DEFAULT};break;case 27:A.getLogger().trace("node found ..",I[C-3]),this.$={id:I[C-3],descr:I[C-1],type:A.getType(I[C-2],I[C])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:h,7:f,10:23,11:d},t(p,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:l}),t(p,[2,18]),t(p,[2,19]),t(p,[2,20]),t(p,[2,21]),t(p,[2,23]),t(p,[2,24]),t(p,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:f,10:32,11:d},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(m,[2,14],{7:g,11:y}),t(v,[2,8]),t(v,[2,9]),t(v,[2,10]),t(p,[2,15]),t(p,[2,16]),t(p,[2,17]),{20:[1,35]},{21:[1,36]},t(m,[2,13],{7:g,11:y}),t(v,[2,11]),t(v,[2,12]),{21:[1,37]},t(p,[2,25]),t(p,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(w,k){if(k.recoverable)this.trace(w);else{var S=new Error(w);throw S.hash=k,S}},"parseError"),parse:o(function(w){var k=this,S=[0],A=[],L=[null],I=[],N=this.table,C="",_=0,D=0,M=0,R=2,P=1,B=I.slice.call(arguments,1),F=Object.create(this.lexer),G={yy:{}};for(var $ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$)&&(G.yy[$]=this.yy[$]);F.setInput(w,G.yy),G.yy.lexer=F,G.yy.parser=this,typeof F.yylloc>"u"&&(F.yylloc={});var V=F.yylloc;I.push(V);var X=F.options&&F.options.ranges;typeof G.yy.parseError=="function"?this.parseError=G.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Q(we){S.length=S.length-2*we,L.length=L.length-we,I.length=I.length-we}o(Q,"popStack");function H(){var we;return we=A.pop()||F.lex()||P,typeof we!="number"&&(we instanceof Array&&(A=we,we=A.pop()),we=k.symbols_[we]||we),we}o(H,"lex");for(var ie,Y,le,ee,J,te,Z={},xe,de,Se,Me;;){if(le=S[S.length-1],this.defaultActions[le]?ee=this.defaultActions[le]:((ie===null||typeof ie>"u")&&(ie=H()),ee=N[le]&&N[le][ie]),typeof ee>"u"||!ee.length||!ee[0]){var ke="";Me=[];for(xe in N[le])this.terminals_[xe]&&xe>R&&Me.push("'"+this.terminals_[xe]+"'");F.showPosition?ke="Parse error on line "+(_+1)+`: -`+F.showPosition()+` -Expecting `+Me.join(", ")+", got '"+(this.terminals_[ie]||ie)+"'":ke="Parse error on line "+(_+1)+": Unexpected "+(ie==P?"end of input":"'"+(this.terminals_[ie]||ie)+"'"),this.parseError(ke,{text:F.match,token:this.terminals_[ie]||ie,line:F.yylineno,loc:V,expected:Me})}if(ee[0]instanceof Array&&ee.length>1)throw new Error("Parse Error: multiple actions possible at state: "+le+", token: "+ie);switch(ee[0]){case 1:S.push(ie),L.push(F.yytext),I.push(F.yylloc),S.push(ee[1]),ie=null,Y?(ie=Y,Y=null):(D=F.yyleng,C=F.yytext,_=F.yylineno,V=F.yylloc,M>0&&M--);break;case 2:if(de=this.productions_[ee[1]][1],Z.$=L[L.length-de],Z._$={first_line:I[I.length-(de||1)].first_line,last_line:I[I.length-1].last_line,first_column:I[I.length-(de||1)].first_column,last_column:I[I.length-1].last_column},X&&(Z._$.range=[I[I.length-(de||1)].range[0],I[I.length-1].range[1]]),te=this.performAction.apply(Z,[C,D,_,G.yy,ee[1],L,I].concat(B)),typeof te<"u")return te;de&&(S=S.slice(0,-1*de*2),L=L.slice(0,-1*de),I=I.slice(0,-1*de)),S.push(this.productions_[ee[1]][0]),L.push(Z.$),I.push(Z._$),Se=N[S[S.length-2]][S[S.length-1]],S.push(Se);break;case 3:return!0}}return!0},"parse")},b=(function(){var E={EOF:1,parseError:o(function(k,S){if(this.yy.parser)this.yy.parser.parseError(k,S);else throw new Error(k)},"parseError"),setInput:o(function(w,k){return this.yy=k||this.yy||{},this._input=w,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var w=this._input[0];this.yytext+=w,this.yyleng++,this.offset++,this.match+=w,this.matched+=w;var k=w.match(/(?:\r\n?|\n).*/g);return k?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),w},"input"),unput:o(function(w){var k=w.length,S=w.split(/(?:\r\n?|\n)/g);this._input=w+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-k),this.offset-=k;var A=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),S.length-1&&(this.yylineno-=S.length-1);var L=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:S?(S.length===A.length?this.yylloc.first_column:0)+A[A.length-S.length].length-S[0].length:this.yylloc.first_column-k},this.options.ranges&&(this.yylloc.range=[L[0],L[0]+this.yyleng-k]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(w){this.unput(this.match.slice(w))},"less"),pastInput:o(function(){var w=this.matched.substr(0,this.matched.length-this.match.length);return(w.length>20?"...":"")+w.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var w=this.match;return w.length<20&&(w+=this._input.substr(0,20-w.length)),(w.substr(0,20)+(w.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var w=this.pastInput(),k=new Array(w.length+1).join("-");return w+this.upcomingInput()+` -`+k+"^"},"showPosition"),test_match:o(function(w,k){var S,A,L;if(this.options.backtrack_lexer&&(L={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(L.yylloc.range=this.yylloc.range.slice(0))),A=w[0].match(/(?:\r\n?|\n).*/g),A&&(this.yylineno+=A.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:A?A[A.length-1].length-A[A.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+w[0].length},this.yytext+=w[0],this.match+=w[0],this.matches=w,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(w[0].length),this.matched+=w[0],S=this.performAction.call(this,this.yy,this,k,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),S)return S;if(this._backtrack){for(var I in L)this[I]=L[I];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var w,k,S,A;this._more||(this.yytext="",this.match="");for(var L=this._currentRules(),I=0;Ik[0].length)){if(k=S,A=I,this.options.backtrack_lexer){if(w=this.test_match(S,L[I]),w!==!1)return w;if(this._backtrack){k=!1;continue}else return!1}else if(!this.options.flex)break}return k?(w=this.test_match(k,L[A]),w!==!1?w:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var k=this.next();return k||this.lex()},"lex"),begin:o(function(k){this.conditionStack.push(k)},"begin"),popState:o(function(){var k=this.conditionStack.length-1;return k>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(k){return k=this.conditionStack.length-1-Math.abs(k||0),k>=0?this.conditionStack[k]:"INITIAL"},"topState"),pushState:o(function(k){this.begin(k)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(k,S,A,L){var I=L;switch(A){case 0:return k.getLogger().trace("Found comment",S.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:k.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return k.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:k.getLogger().trace("end icon"),this.popState();break;case 10:return k.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return k.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return k.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return k.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:k.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return k.getLogger().trace("description:",S.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),k.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),k.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),k.getLogger().trace("node end ...",S.yytext),"NODE_DEND";break;case 30:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),k.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),k.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return k.getLogger().trace("Long description:",S.yytext),20;break;case 36:return k.getLogger().trace("Long description:",S.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return E})();x.lexer=b;function T(){this.yy={}}return o(T,"Parser"),T.prototype=x,x.Parser=T,new T})();VU.parser=VU;Oke=VU});function Bke(t,e=0){return(Qa[t[e+0]]+Qa[t[e+1]]+Qa[t[e+2]]+Qa[t[e+3]]+"-"+Qa[t[e+4]]+Qa[t[e+5]]+"-"+Qa[t[e+6]]+Qa[t[e+7]]+"-"+Qa[t[e+8]]+Qa[t[e+9]]+"-"+Qa[t[e+10]]+Qa[t[e+11]]+Qa[t[e+12]]+Qa[t[e+13]]+Qa[t[e+14]]+Qa[t[e+15]]).toLowerCase()}var Qa,Fke=O(()=>{"use strict";Qa=[];for(let t=0;t<256;++t)Qa.push((t+256).toString(16).slice(1));o(Bke,"unsafeStringify")});function UU(){if(!qU){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");qU=crypto.getRandomValues.bind(crypto)}return qU(vht)}var qU,vht,$ke=O(()=>{"use strict";vht=new Uint8Array(16);o(UU,"rng")});var xht,WU,zke=O(()=>{"use strict";xht=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),WU={randomUUID:xht}});function bht(t,e,r){if(WU.randomUUID&&!e&&!t)return WU.randomUUID();t=t||{};let n=t.random??t.rng?.()??UU();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,e){if(r=r||0,r<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let i=0;i<16;++i)e[r+i]=n[i];return e}return Bke(n)}var HU,Gke=O(()=>{"use strict";zke();$ke();Fke();o(bht,"v4");HU=bht});var Vke=O(()=>{"use strict";Gke()});var qke,Uke=O(()=>{"use strict";co();ar();qke=12});var uf,c_,Wke=O(()=>{"use strict";jt();Vke();Ur();xt();La();$r();Uke();uf={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},c_=class{constructor(){this.nodes=[];this.count=0;this.elements={};this.getLogger=this.getLogger.bind(this),this.nodeType=uf,this.clear(),this.getType=this.getType.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{o(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={},this.baseLevel=void 0}getParent(e){for(let r=this.nodes.length-1;r>=0;r--)if(this.nodes[r].level0?this.nodes[0]:null}addNode(e,r,n,i){K.info("addNode",e,r,n,i);let a=!1;this.nodes.length===0?(this.baseLevel=e,e=0,a=!0):this.baseLevel!==void 0&&(e=e-this.baseLevel,a=!1);let s=ve(),l=s.mindmap?.padding??gr.mindmap.padding;switch(i){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:l*=2;break}let u={id:this.count++,nodeId:wr(r,s),level:e,descr:wr(n,s),type:i,children:[],width:s.mindmap?.maxNodeWidth??gr.mindmap.maxNodeWidth,padding:l,isRoot:a},h=this.getParent(e);if(h)h.children.push(u),this.nodes.push(u);else if(a)this.nodes.push(u);else throw new Error(`There can be only one root. No parent could be found for ("${u.descr}")`)}getType(e,r){switch(K.debug("In get type",e,r),e){case"[":return this.nodeType.RECT;case"(":return r===")"?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;let r=ve(),n=this.nodes[this.nodes.length-1];e.icon&&(n.icon=wr(e.icon,r)),e.class&&(n.class=wr(e.class,r))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}assignSections(e,r){if(e.level===0?e.section=void 0:e.section=r,e.children)for(let[n,i]of e.children.entries()){let a=e.level===0?n%(qke-1):r;this.assignSections(i,a)}}flattenNodes(e,r){let n=["mindmap-node"];e.isRoot===!0?n.push("section-root","section--1"):e.section!==void 0&&n.push(`section-${e.section}`),e.class&&n.push(e.class);let i=n.join(" "),a=o(l=>{switch(l){case uf.CIRCLE:return"mindmapCircle";case uf.RECT:return"rect";case uf.ROUNDED_RECT:return"rounded";case uf.CLOUD:return"cloud";case uf.BANG:return"bang";case uf.HEXAGON:return"hexagon";case uf.DEFAULT:return"defaultMindmapNode";case uf.NO_BORDER:default:return"rect"}},"getShapeFromType"),s={id:e.id.toString(),domId:"node_"+e.id.toString(),label:e.descr,labelType:"markdown",isGroup:!1,shape:a(e.type),width:e.width,height:e.height??0,padding:e.padding,cssClasses:i,cssStyles:[],look:"default",icon:e.icon,x:e.x,y:e.y,level:e.level,nodeId:e.nodeId,type:e.type,section:e.section};if(r.push(s),e.children)for(let l of e.children)this.flattenNodes(l,r)}generateEdges(e,r){if(e.children)for(let n of e.children){let i="edge";n.section!==void 0&&(i+=` section-edge-${n.section}`);let a=e.level+1;i+=` edge-depth-${a}`;let s={id:`edge_${e.id}_${n.id}`,start:e.id.toString(),end:n.id.toString(),type:"normal",curve:"basis",thickness:"normal",look:"default",classes:i,depth:e.level,section:n.section};r.push(s),this.generateEdges(n,r)}}getData(){let e=this.getMindmap(),r=ve(),i=kY().layout!==void 0,a=r;if(i||(a.layout="cose-bilkent"),!e)return{nodes:[],edges:[],config:a};K.debug("getData: mindmapRoot",e,r),this.assignSections(e);let s=[],l=[];this.flattenNodes(e,s),this.generateEdges(e,l),K.debug(`getData: processed ${s.length} nodes and ${l.length} edges`);let u=new Map;for(let h of s)u.set(h.id,{shape:h.shape,width:h.width,height:h.height,padding:h.padding});return{nodes:s,edges:l,config:a,rootNode:e,markers:["point"],direction:"TB",nodeSpacing:50,rankSpacing:50,shapes:Object.fromEntries(u),type:"mindmap",diagramId:"mindmap-"+HU()}}getLogger(){return K}}});var Tht,Hke,Yke=O(()=>{"use strict";xt();b0();Rd();Ld();La();Tht=o(async(t,e,r,n)=>{K.debug(`Rendering mindmap diagram -`+t);let i=n.db,a=i.getData(),s=Sl(e,a.config.securityLevel);a.type=n.type,a.layoutAlgorithm=Ru(a.config.layout,{fallback:"cose-bilkent"}),a.diagramId=e,i.getMindmap()&&(a.nodes.forEach(u=>{u.shape==="rounded"?(u.radius=15,u.taper=15,u.stroke="none",u.width=0,u.padding=15):u.shape==="circle"?u.padding=10:u.shape==="rect"&&(u.width=0,u.padding=10)}),await Ol(a,s),bo(s,a.config.mindmap?.padding??gr.mindmap.padding,"mindmapDiagram",a.config.mindmap?.useMaxWidth??gr.mindmap.useMaxWidth))},"draw"),Hke={draw:Tht}});var wht,kht,jke,Xke=O(()=>{"use strict";Ys();wht=o(t=>{let e="";for(let r=0;r` - .edge { - stroke-width: 3; - } - ${wht(t)} - .section-root rect, .section-root path, .section-root circle, .section-root polygon { - fill: ${t.git0}; - } - .section-root text { - fill: ${t.gitBranchLabel0}; - } - .section-root span { - color: ${t.gitBranchLabel0}; - } - .section-2 span { - color: ${t.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .mindmap-node-label { - dy: 1em; - alignment-baseline: middle; - text-anchor: middle; - dominant-baseline: middle; - text-align: center; - } -`,"getStyles"),jke=kht});var Kke={};vr(Kke,{diagram:()=>Eht});var Eht,Qke=O(()=>{"use strict";Pke();Wke();Yke();Xke();Eht={get db(){return new c_},renderer:Hke,parser:Oke,styles:jke}});var YU,eEe,tEe=O(()=>{"use strict";YU=(function(){var t=o(function(S,A,L,I){for(L=L||{},I=S.length;I--;L[S[I]]=A);return L},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,31],g=[6,7,11,24],y=[1,6,13,16,17,20,23],v=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],T=[1,38],E={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(A,L,I,N,C,_,D){var M=_.length-1;switch(C){case 6:case 7:return N;case 8:N.getLogger().trace("Stop NL ");break;case 9:N.getLogger().trace("Stop EOF ");break;case 11:N.getLogger().trace("Stop NL2 ");break;case 12:N.getLogger().trace("Stop EOF2 ");break;case 15:N.getLogger().info("Node: ",_[M-1].id),N.addNode(_[M-2].length,_[M-1].id,_[M-1].descr,_[M-1].type,_[M]);break;case 16:N.getLogger().info("Node: ",_[M].id),N.addNode(_[M-1].length,_[M].id,_[M].descr,_[M].type);break;case 17:N.getLogger().trace("Icon: ",_[M]),N.decorateNode({icon:_[M]});break;case 18:case 23:N.decorateNode({class:_[M]});break;case 19:N.getLogger().trace("SPACELIST");break;case 20:N.getLogger().trace("Node: ",_[M-1].id),N.addNode(0,_[M-1].id,_[M-1].descr,_[M-1].type,_[M]);break;case 21:N.getLogger().trace("Node: ",_[M].id),N.addNode(0,_[M].id,_[M].descr,_[M].type);break;case 22:N.decorateNode({icon:_[M]});break;case 27:N.getLogger().trace("node found ..",_[M-2]),this.$={id:_[M-1],descr:_[M-1],type:N.getType(_[M-2],_[M])};break;case 28:this.$={id:_[M],descr:_[M],type:0};break;case 29:N.getLogger().trace("node found ..",_[M-3]),this.$={id:_[M-3],descr:_[M-1],type:N.getType(_[M-2],_[M])};break;case 30:this.$=_[M-1]+_[M];break;case 31:this.$=_[M];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:h,7:f,10:23,11:d},t(p,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:l}),t(p,[2,19]),t(p,[2,21],{15:30,24:m}),t(p,[2,22]),t(p,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:f,10:34,11:d},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(y,[2,14],{7:v,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(p,[2,16],{15:37,24:m}),t(p,[2,17]),t(p,[2,18]),t(p,[2,20],{24:T}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(y,[2,13],{7:v,11:x}),t(b,[2,11]),t(b,[2,12]),t(p,[2,15],{24:T}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(A,L){if(L.recoverable)this.trace(A);else{var I=new Error(A);throw I.hash=L,I}},"parseError"),parse:o(function(A){var L=this,I=[0],N=[],C=[null],_=[],D=this.table,M="",R=0,P=0,B=0,F=2,G=1,$=_.slice.call(arguments,1),V=Object.create(this.lexer),X={yy:{}};for(var Q in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Q)&&(X.yy[Q]=this.yy[Q]);V.setInput(A,X.yy),X.yy.lexer=V,X.yy.parser=this,typeof V.yylloc>"u"&&(V.yylloc={});var H=V.yylloc;_.push(H);var ie=V.options&&V.options.ranges;typeof X.yy.parseError=="function"?this.parseError=X.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Y(fe){I.length=I.length-2*fe,C.length=C.length-fe,_.length=_.length-fe}o(Y,"popStack");function le(){var fe;return fe=N.pop()||V.lex()||G,typeof fe!="number"&&(fe instanceof Array&&(N=fe,fe=N.pop()),fe=L.symbols_[fe]||fe),fe}o(le,"lex");for(var ee,J,te,Z,xe,de,Se={},Me,ke,we,_e;;){if(te=I[I.length-1],this.defaultActions[te]?Z=this.defaultActions[te]:((ee===null||typeof ee>"u")&&(ee=le()),Z=D[te]&&D[te][ee]),typeof Z>"u"||!Z.length||!Z[0]){var $e="";_e=[];for(Me in D[te])this.terminals_[Me]&&Me>F&&_e.push("'"+this.terminals_[Me]+"'");V.showPosition?$e="Parse error on line "+(R+1)+`: -`+V.showPosition()+` -Expecting `+_e.join(", ")+", got '"+(this.terminals_[ee]||ee)+"'":$e="Parse error on line "+(R+1)+": Unexpected "+(ee==G?"end of input":"'"+(this.terminals_[ee]||ee)+"'"),this.parseError($e,{text:V.match,token:this.terminals_[ee]||ee,line:V.yylineno,loc:H,expected:_e})}if(Z[0]instanceof Array&&Z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+te+", token: "+ee);switch(Z[0]){case 1:I.push(ee),C.push(V.yytext),_.push(V.yylloc),I.push(Z[1]),ee=null,J?(ee=J,J=null):(P=V.yyleng,M=V.yytext,R=V.yylineno,H=V.yylloc,B>0&&B--);break;case 2:if(ke=this.productions_[Z[1]][1],Se.$=C[C.length-ke],Se._$={first_line:_[_.length-(ke||1)].first_line,last_line:_[_.length-1].last_line,first_column:_[_.length-(ke||1)].first_column,last_column:_[_.length-1].last_column},ie&&(Se._$.range=[_[_.length-(ke||1)].range[0],_[_.length-1].range[1]]),de=this.performAction.apply(Se,[M,P,R,X.yy,Z[1],C,_].concat($)),typeof de<"u")return de;ke&&(I=I.slice(0,-1*ke*2),C=C.slice(0,-1*ke),_=_.slice(0,-1*ke)),I.push(this.productions_[Z[1]][0]),C.push(Se.$),_.push(Se._$),we=D[I[I.length-2]][I[I.length-1]],I.push(we);break;case 3:return!0}}return!0},"parse")},w=(function(){var S={EOF:1,parseError:o(function(L,I){if(this.yy.parser)this.yy.parser.parseError(L,I);else throw new Error(L)},"parseError"),setInput:o(function(A,L){return this.yy=L||this.yy||{},this._input=A,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var A=this._input[0];this.yytext+=A,this.yyleng++,this.offset++,this.match+=A,this.matched+=A;var L=A.match(/(?:\r\n?|\n).*/g);return L?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),A},"input"),unput:o(function(A){var L=A.length,I=A.split(/(?:\r\n?|\n)/g);this._input=A+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-L),this.offset-=L;var N=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),I.length-1&&(this.yylineno-=I.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:I?(I.length===N.length?this.yylloc.first_column:0)+N[N.length-I.length].length-I[0].length:this.yylloc.first_column-L},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-L]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(A){this.unput(this.match.slice(A))},"less"),pastInput:o(function(){var A=this.matched.substr(0,this.matched.length-this.match.length);return(A.length>20?"...":"")+A.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var A=this.match;return A.length<20&&(A+=this._input.substr(0,20-A.length)),(A.substr(0,20)+(A.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var A=this.pastInput(),L=new Array(A.length+1).join("-");return A+this.upcomingInput()+` -`+L+"^"},"showPosition"),test_match:o(function(A,L){var I,N,C;if(this.options.backtrack_lexer&&(C={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(C.yylloc.range=this.yylloc.range.slice(0))),N=A[0].match(/(?:\r\n?|\n).*/g),N&&(this.yylineno+=N.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:N?N[N.length-1].length-N[N.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+A[0].length},this.yytext+=A[0],this.match+=A[0],this.matches=A,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(A[0].length),this.matched+=A[0],I=this.performAction.call(this,this.yy,this,L,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),I)return I;if(this._backtrack){for(var _ in C)this[_]=C[_];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var A,L,I,N;this._more||(this.yytext="",this.match="");for(var C=this._currentRules(),_=0;_L[0].length)){if(L=I,N=_,this.options.backtrack_lexer){if(A=this.test_match(I,C[_]),A!==!1)return A;if(this._backtrack){L=!1;continue}else return!1}else if(!this.options.flex)break}return L?(A=this.test_match(L,C[N]),A!==!1?A:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var L=this.next();return L||this.lex()},"lex"),begin:o(function(L){this.conditionStack.push(L)},"begin"),popState:o(function(){var L=this.conditionStack.length-1;return L>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(L){return L=this.conditionStack.length-1-Math.abs(L||0),L>=0?this.conditionStack[L]:"INITIAL"},"topState"),pushState:o(function(L){this.begin(L)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(L,I,N,C){var _=C;switch(N){case 0:return this.pushState("shapeData"),I.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let D=/\n\s*/g;return I.yytext=I.yytext.replace(D,"
    "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return L.getLogger().trace("Found comment",I.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:L.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return L.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:L.getLogger().trace("end icon"),this.popState();break;case 16:return L.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return L.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return L.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return L.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:L.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return L.getLogger().trace("description:",I.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),L.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),L.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),L.getLogger().trace("node end ...",I.yytext),"NODE_DEND";break;case 36:return this.popState(),L.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),L.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),L.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),L.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),L.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return L.getLogger().trace("Long description:",I.yytext),21;break;case 42:return L.getLogger().trace("Long description:",I.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return S})();E.lexer=w;function k(){this.yy={}}return o(k,"Parser"),k.prototype=E,E.Parser=k,new k})();YU.parser=YU;eEe=YU});var Yl,XU,jU,KU,_ht,Dht,rEe,Rht,Lht,ha,Nht,Mht,Iht,Oht,Pht,Bht,Fht,nEe,iEe=O(()=>{"use strict";jt();Ur();xt();La();ib();Yl=[],XU=[],jU=0,KU={},_ht=o(()=>{Yl=[],XU=[],jU=0,KU={}},"clear"),Dht=o(t=>{if(Yl.length===0)return null;let e=Yl[0].level,r=null;for(let n=Yl.length-1;n>=0;n--)if(Yl[n].level===e&&!r&&(r=Yl[n]),Yl[n].levell.parentId===i.id);for(let l of s){let u={id:l.id,parentId:i.id,label:wr(l.label??"",n),labelType:"markdown",isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(u)}}return{nodes:e,edges:t,other:{},config:ve()}},"getData"),Lht=o((t,e,r,n,i)=>{let a=ve(),s=a.mindmap?.padding??gr.mindmap.padding;switch(n){case ha.ROUNDED_RECT:case ha.RECT:case ha.HEXAGON:s*=2}let l={id:wr(e,a)||"kbn"+jU++,level:t,label:wr(r,a),width:a.mindmap?.maxNodeWidth??gr.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let h;i.includes(` -`)?h=i+` -`:h=`{ -`+i+` -}`;let f=Kf(h,{schema:Xf});if(f.shape&&(f.shape!==f.shape.toLowerCase()||f.shape.includes("_")))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);f?.shape&&f.shape==="kanbanItem"&&(l.shape=f?.shape),f?.label&&(l.label=f?.label),f?.icon&&(l.icon=f?.icon.toString()),f?.assigned&&(l.assigned=f?.assigned.toString()),f?.ticket&&(l.ticket=f?.ticket.toString()),f?.priority&&(l.priority=f?.priority)}let u=Dht(t);u?l.parentId=u.id||"kbn"+jU++:XU.push(l),Yl.push(l)},"addNode"),ha={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Nht=o((t,e)=>{switch(K.debug("In get type",t,e),t){case"[":return ha.RECT;case"(":return e===")"?ha.ROUNDED_RECT:ha.CLOUD;case"((":return ha.CIRCLE;case")":return ha.CLOUD;case"))":return ha.BANG;case"{{":return ha.HEXAGON;default:return ha.DEFAULT}},"getType"),Mht=o((t,e)=>{KU[t]=e},"setElementForId"),Iht=o(t=>{if(!t)return;let e=ve(),r=Yl[Yl.length-1];t.icon&&(r.icon=wr(t.icon,e)),t.class&&(r.cssClasses=wr(t.class,e))},"decorateNode"),Oht=o(t=>{switch(t){case ha.DEFAULT:return"no-border";case ha.RECT:return"rect";case ha.ROUNDED_RECT:return"rounded-rect";case ha.CIRCLE:return"circle";case ha.CLOUD:return"cloud";case ha.BANG:return"bang";case ha.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Pht=o(()=>K,"getLogger"),Bht=o(t=>KU[t],"getElementById"),Fht={clear:_ht,addNode:Lht,getSections:rEe,getData:Rht,nodeType:ha,getType:Nht,setElementForId:Mht,decorateNode:Iht,type2Str:Oht,getLogger:Pht,getElementById:Bht},nEe=Fht});var $ht,aEe,sEe=O(()=>{"use strict";jt();xt();Ul();Ti();La();oE();yE();$ht=o(async(t,e,r,n)=>{K.debug(`Rendering kanban diagram -`+t);let a=n.db.getData(),s=ve();s.htmlLabels=!1;let l=Ii(e),u=l.append("g");u.attr("class","sections");let h=l.append("g");h.attr("class","items");let f=a.nodes.filter(v=>v.isGroup),d=0,p=10,m=[],g=25;for(let v of f){let x=s?.kanban?.sectionWidth||200;d=d+1,v.x=x*d+(d-1)*p/2,v.width=x,v.y=0,v.height=x*3,v.rx=5,v.ry=5,v.cssClasses=v.cssClasses+" section-"+d;let b=await g1(u,v);g=Math.max(g,b?.labelBBox?.height),m.push(b)}let y=0;for(let v of f){let x=m[y];y=y+1;let b=s?.kanban?.sectionWidth||200,T=-b*3/2+g,E=T,w=a.nodes.filter(A=>A.parentId===v.id);for(let A of w){if(A.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");A.x=v.x,A.width=b-1.5*p;let I=(await y1(h,A,{config:s})).node().getBBox();A.y=E+I.height/2,await vb(A),E=A.y+I.height/2+p/2}let k=x.cluster.select("rect"),S=Math.max(E-T+3*p,50)+(g-25);k.attr("height",S)}Kc(void 0,l,s.mindmap?.padding??gr.kanban.padding,s.mindmap?.useMaxWidth??gr.kanban.useMaxWidth)},"draw"),aEe={draw:$ht}});var zht,Ght,oEe,lEe=O(()=>{"use strict";Ys();ly();zht=o(t=>{let e="";for(let n=0;nt.darkMode?Bt(n,i):Lt(n,i),"adjuster");for(let n=0;n` - .edge { - stroke-width: 3; - } - ${zht(t)} - .section-root rect, .section-root path, .section-root circle, .section-root polygon { - fill: ${t.git0}; - } - .section-root text { - fill: ${t.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .cluster-label, .label { - color: ${t.textColor}; - fill: ${t.textColor}; - } - .kanban-label { - dy: 1em; - alignment-baseline: middle; - text-anchor: middle; - dominant-baseline: middle; - text-align: center; - } - ${Lu()} -`,"getStyles"),oEe=Ght});var cEe={};vr(cEe,{diagram:()=>Vht});var Vht,uEe=O(()=>{"use strict";tEe();iEe();sEe();lEe();Vht={db:nEe,renderer:aEe,parser:eEe,styles:oEe}});var QU,T3,dEe=O(()=>{"use strict";QU=(function(){var t=o(function(l,u,h,f){for(h=h||{},f=l.length;f--;h[l[f]]=u);return h},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:o(function(u,h,f,d,p,m,g){var y=m.length-1;switch(p){case 7:let v=d.findOrCreateNode(m[y-4].trim().replaceAll('""','"')),x=d.findOrCreateNode(m[y-2].trim().replaceAll('""','"')),b=parseFloat(m[y].trim());d.addLink(v,x,b);break;case 8:case 9:case 11:this.$=m[y];break;case 10:this.$=m[y-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:o(function(u,h){if(h.recoverable)this.trace(u);else{var f=new Error(u);throw f.hash=h,f}},"parseError"),parse:o(function(u){var h=this,f=[0],d=[],p=[null],m=[],g=this.table,y="",v=0,x=0,b=0,T=2,E=1,w=m.slice.call(arguments,1),k=Object.create(this.lexer),S={yy:{}};for(var A in this.yy)Object.prototype.hasOwnProperty.call(this.yy,A)&&(S.yy[A]=this.yy[A]);k.setInput(u,S.yy),S.yy.lexer=k,S.yy.parser=this,typeof k.yylloc>"u"&&(k.yylloc={});var L=k.yylloc;m.push(L);var I=k.options&&k.options.ranges;typeof S.yy.parseError=="function"?this.parseError=S.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function N(H){f.length=f.length-2*H,p.length=p.length-H,m.length=m.length-H}o(N,"popStack");function C(){var H;return H=d.pop()||k.lex()||E,typeof H!="number"&&(H instanceof Array&&(d=H,H=d.pop()),H=h.symbols_[H]||H),H}o(C,"lex");for(var _,D,M,R,P,B,F={},G,$,V,X;;){if(M=f[f.length-1],this.defaultActions[M]?R=this.defaultActions[M]:((_===null||typeof _>"u")&&(_=C()),R=g[M]&&g[M][_]),typeof R>"u"||!R.length||!R[0]){var Q="";X=[];for(G in g[M])this.terminals_[G]&&G>T&&X.push("'"+this.terminals_[G]+"'");k.showPosition?Q="Parse error on line "+(v+1)+`: -`+k.showPosition()+` -Expecting `+X.join(", ")+", got '"+(this.terminals_[_]||_)+"'":Q="Parse error on line "+(v+1)+": Unexpected "+(_==E?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(Q,{text:k.match,token:this.terminals_[_]||_,line:k.yylineno,loc:L,expected:X})}if(R[0]instanceof Array&&R.length>1)throw new Error("Parse Error: multiple actions possible at state: "+M+", token: "+_);switch(R[0]){case 1:f.push(_),p.push(k.yytext),m.push(k.yylloc),f.push(R[1]),_=null,D?(_=D,D=null):(x=k.yyleng,y=k.yytext,v=k.yylineno,L=k.yylloc,b>0&&b--);break;case 2:if($=this.productions_[R[1]][1],F.$=p[p.length-$],F._$={first_line:m[m.length-($||1)].first_line,last_line:m[m.length-1].last_line,first_column:m[m.length-($||1)].first_column,last_column:m[m.length-1].last_column},I&&(F._$.range=[m[m.length-($||1)].range[0],m[m.length-1].range[1]]),B=this.performAction.apply(F,[y,x,v,S.yy,R[1],p,m].concat(w)),typeof B<"u")return B;$&&(f=f.slice(0,-1*$*2),p=p.slice(0,-1*$),m=m.slice(0,-1*$)),f.push(this.productions_[R[1]][0]),p.push(F.$),m.push(F._$),V=g[f[f.length-2]][f[f.length-1]],f.push(V);break;case 3:return!0}}return!0},"parse")},a=(function(){var l={EOF:1,parseError:o(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:o(function(u,h){return this.yy=h||this.yy||{},this._input=u,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var u=this._input[0];this.yytext+=u,this.yyleng++,this.offset++,this.match+=u,this.matched+=u;var h=u.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),u},"input"),unput:o(function(u){var h=u.length,f=u.split(/(?:\r\n?|\n)/g);this._input=u+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===d.length?this.yylloc.first_column:0)+d[d.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(u){this.unput(this.match.slice(u))},"less"),pastInput:o(function(){var u=this.matched.substr(0,this.matched.length-this.match.length);return(u.length>20?"...":"")+u.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var u=this.match;return u.length<20&&(u+=this._input.substr(0,20-u.length)),(u.substr(0,20)+(u.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var u=this.pastInput(),h=new Array(u.length+1).join("-");return u+this.upcomingInput()+` -`+h+"^"},"showPosition"),test_match:o(function(u,h){var f,d,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),d=u[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+u[0].length},this.yytext+=u[0],this.match+=u[0],this.matches=u,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(u[0].length),this.matched+=u[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var m in p)this[m]=p[m];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var u,h,f,d;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),m=0;mh[0].length)){if(h=f,d=m,this.options.backtrack_lexer){if(u=this.test_match(f,p[m]),u!==!1)return u;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(u=this.test_match(h,p[d]),u!==!1?u:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var h=this.next();return h||this.lex()},"lex"),begin:o(function(h){this.conditionStack.push(h)},"begin"),popState:o(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:o(function(h){this.begin(h)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(h,f,d,p){var m=p;switch(d){case 0:return this.pushState("csv"),4;break;case 1:return this.pushState("csv"),4;break;case 2:return 10;case 3:return 5;case 4:return 12;case 5:return this.pushState("escaped_text"),18;break;case 6:return 20;case 7:return this.popState("escaped_text"),18;break;case 8:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:sankey\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[2,3,4,5,6,7,8],inclusive:!1},escaped_text:{rules:[7,8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8],inclusive:!0}}};return l})();i.lexer=a;function s(){this.yy={}}return o(s,"Parser"),s.prototype=i,i.Parser=s,new s})();QU.parser=QU;T3=QU});var h_,f_,u_,Hht,ZU,Yht,JU,jht,Xht,Kht,Qht,pEe,mEe=O(()=>{"use strict";jt();Ur();si();h_=[],f_=[],u_=new Map,Hht=o(()=>{h_=[],f_=[],u_=new Map,_r()},"clear"),ZU=class{constructor(e,r,n=0){this.source=e;this.target=r;this.value=n}static{o(this,"SankeyLink")}},Yht=o((t,e,r)=>{h_.push(new ZU(t,e,r))},"addLink"),JU=class{constructor(e){this.ID=e}static{o(this,"SankeyNode")}},jht=o(t=>{t=st.sanitizeText(t,ve());let e=u_.get(t);return e===void 0&&(e=new JU(t),u_.set(t,e),f_.push(e)),e},"findOrCreateNode"),Xht=o(()=>f_,"getNodes"),Kht=o(()=>h_,"getLinks"),Qht=o(()=>({nodes:f_.map(t=>({id:t.ID})),links:h_.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),pEe={nodesMap:u_,getConfig:o(()=>ve().sankey,"getConfig"),getNodes:Xht,getLinks:Kht,getGraph:Qht,addLink:Yht,findOrCreateNode:jht,getAccTitle:Or,setAccTitle:Lr,getAccDescription:Br,setAccDescription:Pr,getDiagramTitle:Fr,setDiagramTitle:zr,clear:Hht}});function w3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var gEe=O(()=>{"use strict";o(w3,"max")});function Wv(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var yEe=O(()=>{"use strict";o(Wv,"min")});function Hv(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var vEe=O(()=>{"use strict";o(Hv,"sum")});var eW=O(()=>{"use strict";gEe();yEe();vEe()});function Zht(t){return t.target.depth}function tW(t){return t.depth}function rW(t,e){return e-1-t.height}function k3(t,e){return t.sourceLinks.length?t.depth:e-1}function nW(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?Wv(t.sourceLinks,Zht)-1:0}var iW=O(()=>{"use strict";eW();o(Zht,"targetDepth");o(tW,"left");o(rW,"right");o(k3,"justify");o(nW,"center")});function Yv(t){return function(){return t}}var xEe=O(()=>{"use strict";o(Yv,"constant")});function bEe(t,e){return d_(t.source,e.source)||t.index-e.index}function TEe(t,e){return d_(t.target,e.target)||t.index-e.index}function d_(t,e){return t.y0-e.y0}function aW(t){return t.value}function Jht(t){return t.index}function eft(t){return t.nodes}function tft(t){return t.links}function wEe(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function kEe({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function p_(){let t=0,e=0,r=1,n=1,i=24,a=8,s,l=Jht,u=k3,h,f,d=eft,p=tft,m=6;function g(){let M={nodes:d.apply(null,arguments),links:p.apply(null,arguments)};return y(M),v(M),x(M),b(M),w(M),kEe(M),M}o(g,"sankey"),g.update=function(M){return kEe(M),M},g.nodeId=function(M){return arguments.length?(l=typeof M=="function"?M:Yv(M),g):l},g.nodeAlign=function(M){return arguments.length?(u=typeof M=="function"?M:Yv(M),g):u},g.nodeSort=function(M){return arguments.length?(h=M,g):h},g.nodeWidth=function(M){return arguments.length?(i=+M,g):i},g.nodePadding=function(M){return arguments.length?(a=s=+M,g):a},g.nodes=function(M){return arguments.length?(d=typeof M=="function"?M:Yv(M),g):d},g.links=function(M){return arguments.length?(p=typeof M=="function"?M:Yv(M),g):p},g.linkSort=function(M){return arguments.length?(f=M,g):f},g.size=function(M){return arguments.length?(t=e=0,r=+M[0],n=+M[1],g):[r-t,n-e]},g.extent=function(M){return arguments.length?(t=+M[0][0],r=+M[1][0],e=+M[0][1],n=+M[1][1],g):[[t,e],[r,n]]},g.iterations=function(M){return arguments.length?(m=+M,g):m};function y({nodes:M,links:R}){for(let[B,F]of M.entries())F.index=B,F.sourceLinks=[],F.targetLinks=[];let P=new Map(M.map((B,F)=>[l(B,F,M),B]));for(let[B,F]of R.entries()){F.index=B;let{source:G,target:$}=F;typeof G!="object"&&(G=F.source=wEe(P,G)),typeof $!="object"&&($=F.target=wEe(P,$)),G.sourceLinks.push(F),$.targetLinks.push(F)}if(f!=null)for(let{sourceLinks:B,targetLinks:F}of M)B.sort(f),F.sort(f)}o(y,"computeNodeLinks");function v({nodes:M}){for(let R of M)R.value=R.fixedValue===void 0?Math.max(Hv(R.sourceLinks,aW),Hv(R.targetLinks,aW)):R.fixedValue}o(v,"computeNodeValues");function x({nodes:M}){let R=M.length,P=new Set(M),B=new Set,F=0;for(;P.size;){for(let G of P){G.depth=F;for(let{target:$}of G.sourceLinks)B.add($)}if(++F>R)throw new Error("circular link");P=B,B=new Set}}o(x,"computeNodeDepths");function b({nodes:M}){let R=M.length,P=new Set(M),B=new Set,F=0;for(;P.size;){for(let G of P){G.height=F;for(let{source:$}of G.targetLinks)B.add($)}if(++F>R)throw new Error("circular link");P=B,B=new Set}}o(b,"computeNodeHeights");function T({nodes:M}){let R=w3(M,F=>F.depth)+1,P=(r-t-i)/(R-1),B=new Array(R);for(let F of M){let G=Math.max(0,Math.min(R-1,Math.floor(u.call(null,F,R))));F.layer=G,F.x0=t+G*P,F.x1=F.x0+i,B[G]?B[G].push(F):B[G]=[F]}if(h)for(let F of B)F.sort(h);return B}o(T,"computeNodeLayers");function E(M){let R=Wv(M,P=>(n-e-(P.length-1)*s)/Hv(P,aW));for(let P of M){let B=e;for(let F of P){F.y0=B,F.y1=B+F.value*R,B=F.y1+s;for(let G of F.sourceLinks)G.width=G.value*R}B=(n-B+s)/(P.length+1);for(let F=0;FP.length)-1)),E(R);for(let P=0;P0))continue;let Q=(V/X-$.y0)*R;$.y0+=Q,$.y1+=Q,N($)}h===void 0&&G.sort(d_),A(G,P)}}o(k,"relaxLeftToRight");function S(M,R,P){for(let B=M.length,F=B-2;F>=0;--F){let G=M[F];for(let $ of G){let V=0,X=0;for(let{target:H,value:ie}of $.sourceLinks){let Y=ie*(H.layer-$.layer);V+=D($,H)*Y,X+=Y}if(!(X>0))continue;let Q=(V/X-$.y0)*R;$.y0+=Q,$.y1+=Q,N($)}h===void 0&&G.sort(d_),A(G,P)}}o(S,"relaxRightToLeft");function A(M,R){let P=M.length>>1,B=M[P];I(M,B.y0-s,P-1,R),L(M,B.y1+s,P+1,R),I(M,n,M.length-1,R),L(M,e,0,R)}o(A,"resolveCollisions");function L(M,R,P,B){for(;P1e-6&&(F.y0+=G,F.y1+=G),R=F.y1+s}}o(L,"resolveCollisionsTopToBottom");function I(M,R,P,B){for(;P>=0;--P){let F=M[P],G=(F.y1-R)*B;G>1e-6&&(F.y0-=G,F.y1-=G),R=F.y0-s}}o(I,"resolveCollisionsBottomToTop");function N({sourceLinks:M,targetLinks:R}){if(f===void 0){for(let{source:{sourceLinks:P}}of R)P.sort(TEe);for(let{target:{targetLinks:P}}of M)P.sort(bEe)}}o(N,"reorderNodeLinks");function C(M){if(f===void 0)for(let{sourceLinks:R,targetLinks:P}of M)R.sort(TEe),P.sort(bEe)}o(C,"reorderLinks");function _(M,R){let P=M.y0-(M.sourceLinks.length-1)*s/2;for(let{target:B,width:F}of M.sourceLinks){if(B===R)break;P+=F+s}for(let{source:B,width:F}of R.targetLinks){if(B===M)break;P-=F}return P}o(_,"targetTop");function D(M,R){let P=R.y0-(R.targetLinks.length-1)*s/2;for(let{source:B,width:F}of R.targetLinks){if(B===M)break;P+=F+s}for(let{target:B,width:F}of M.sourceLinks){if(B===R)break;P-=F}return P}return o(D,"sourceTop"),g}var EEe=O(()=>{"use strict";eW();iW();xEe();o(bEe,"ascendingSourceBreadth");o(TEe,"ascendingTargetBreadth");o(d_,"ascendingBreadth");o(aW,"value");o(Jht,"defaultId");o(eft,"defaultNodes");o(tft,"defaultLinks");o(wEe,"find");o(kEe,"computeLinkBreadths");o(p_,"Sankey")});function lW(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function SEe(){return new lW}var sW,oW,Jm,rft,cW,CEe=O(()=>{"use strict";sW=Math.PI,oW=2*sW,Jm=1e-6,rft=oW-Jm;o(lW,"Path");o(SEe,"path");lW.prototype=SEe.prototype={constructor:lW,moveTo:o(function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},"moveTo"),closePath:o(function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},"closePath"),lineTo:o(function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},"lineTo"),quadraticCurveTo:o(function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},"quadraticCurveTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},"bezierCurveTo"),arcTo:o(function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,l=r-t,u=n-e,h=a-t,f=s-e,d=h*h+f*f;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(d>Jm)if(!(Math.abs(f*l-u*h)>Jm)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var p=r-a,m=n-s,g=l*l+u*u,y=p*p+m*m,v=Math.sqrt(g),x=Math.sqrt(d),b=i*Math.tan((sW-Math.acos((g+d-y)/(2*v*x)))/2),T=b/x,E=b/v;Math.abs(T-1)>Jm&&(this._+="L"+(t+T*h)+","+(e+T*f)),this._+="A"+i+","+i+",0,0,"+ +(f*p>h*m)+","+(this._x1=t+E*l)+","+(this._y1=e+E*u)}},"arcTo"),arc:o(function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),l=r*Math.sin(n),u=t+s,h=e+l,f=1^a,d=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+u+","+h:(Math.abs(this._x1-u)>Jm||Math.abs(this._y1-h)>Jm)&&(this._+="L"+u+","+h),r&&(d<0&&(d=d%oW+oW),d>rft?this._+="A"+r+","+r+",0,1,"+f+","+(t-s)+","+(e-l)+"A"+r+","+r+",0,1,"+f+","+(this._x1=u)+","+(this._y1=h):d>Jm&&(this._+="A"+r+","+r+",0,"+ +(d>=sW)+","+f+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},"arc"),rect:o(function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},"rect"),toString:o(function(){return this._},"toString")};cW=SEe});var AEe=O(()=>{"use strict";CEe()});function m_(t){return o(function(){return t},"constant")}var _Ee=O(()=>{"use strict";o(m_,"default")});function DEe(t){return t[0]}function REe(t){return t[1]}var LEe=O(()=>{"use strict";o(DEe,"x");o(REe,"y")});var NEe,MEe=O(()=>{"use strict";NEe=Array.prototype.slice});function nft(t){return t.source}function ift(t){return t.target}function aft(t){var e=nft,r=ift,n=DEe,i=REe,a=null;function s(){var l,u=NEe.call(arguments),h=e.apply(this,u),f=r.apply(this,u);if(a||(a=l=cW()),t(a,+n.apply(this,(u[0]=h,u)),+i.apply(this,u),+n.apply(this,(u[0]=f,u)),+i.apply(this,u)),l)return a=null,l+""||null}return o(s,"link"),s.source=function(l){return arguments.length?(e=l,s):e},s.target=function(l){return arguments.length?(r=l,s):r},s.x=function(l){return arguments.length?(n=typeof l=="function"?l:m_(+l),s):n},s.y=function(l){return arguments.length?(i=typeof l=="function"?l:m_(+l),s):i},s.context=function(l){return arguments.length?(a=l??null,s):a},s}function sft(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function uW(){return aft(sft)}var IEe=O(()=>{"use strict";AEe();MEe();_Ee();LEe();o(nft,"linkSource");o(ift,"linkTarget");o(aft,"link");o(sft,"curveHorizontal");o(uW,"linkHorizontal")});var OEe=O(()=>{"use strict";IEe()});function oft(t){return[t.source.x1,t.y0]}function lft(t){return[t.target.x0,t.y1]}function g_(){return uW().source(oft).target(lft)}var PEe=O(()=>{"use strict";OEe();o(oft,"horizontalSource");o(lft,"horizontalTarget");o(g_,"default")});var BEe=O(()=>{"use strict";EEe();iW();PEe()});var E3,FEe=O(()=>{"use strict";E3=class t{static{o(this,"Uid")}static{this.count=0}static next(e){return new t(e+ ++t.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("+this.href+")"}}});var cft,uft,$Ee,zEe=O(()=>{"use strict";jt();Ar();BEe();Ti();FEe();cft={left:tW,right:rW,center:nW,justify:k3},uft=o(function(t,e,r,n){let{securityLevel:i,sankey:a}=ve(),s=Fw.sankey,l;i==="sandbox"&&(l=je("#i"+e));let u=i==="sandbox"?je(l.nodes()[0].contentDocument.body):je("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):je(`[id="${e}"]`),f=a?.width??s.width,d=a?.height??s.width,p=a?.useMaxWidth??s.useMaxWidth,m=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,y=a?.suffix??s.suffix,v=a?.showValues??s.showValues,x=n.db.getGraph(),b=cft[m];p_().nodeId(I=>I.id).nodeWidth(10).nodePadding(10+(v?15:0)).nodeAlign(b).extent([[0,0],[f,d]])(x);let w=Fo(B9);h.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",I=>(I.uid=E3.next("node-")).id).attr("transform",function(I){return"translate("+I.x0+","+I.y0+")"}).attr("x",I=>I.x0).attr("y",I=>I.y0).append("rect").attr("height",I=>I.y1-I.y0).attr("width",I=>I.x1-I.x0).attr("fill",I=>w(I.id));let k=o(({id:I,value:N})=>v?`${I} -${g}${Math.round(N*100)/100}${y}`:I,"getText");h.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",I=>I.x0(I.y1+I.y0)/2).attr("dy",`${v?"0":"0.35"}em`).attr("text-anchor",I=>I.x0(N.uid=E3.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",N=>N.source.x1).attr("x2",N=>N.target.x0);I.append("stop").attr("offset","0%").attr("stop-color",N=>w(N.source.id)),I.append("stop").attr("offset","100%").attr("stop-color",N=>w(N.target.id))}let L;switch(A){case"gradient":L=o(I=>I.uid,"coloring");break;case"source":L=o(I=>w(I.source.id),"coloring");break;case"target":L=o(I=>w(I.target.id),"coloring");break;default:L=A}S.append("path").attr("d",g_()).attr("stroke",L).attr("stroke-width",I=>Math.max(1,I.width)),Kc(void 0,h,0,p)},"draw"),$Ee={draw:uft}});var GEe,VEe=O(()=>{"use strict";GEe=o(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` -`).trim(),"prepareTextForParsing")});var hft,qEe,UEe=O(()=>{"use strict";hft=o(t=>`.label { - font-family: ${t.fontFamily}; - }`,"getStyles"),qEe=hft});var WEe={};vr(WEe,{diagram:()=>dft});var fft,dft,HEe=O(()=>{"use strict";dEe();mEe();zEe();VEe();UEe();fft=T3.parse.bind(T3);T3.parse=t=>fft(GEe(t));dft={styles:qEe,parser:T3,db:pEe,renderer:$Ee}});var yft,jv,hW=O(()=>{"use strict";$r();La();ar();si();yft=gr.packet,jv=class{constructor(){this.packet=[];this.setAccTitle=Lr;this.getAccTitle=Or;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.getAccDescription=Br;this.setAccDescription=Pr}static{o(this,"PacketDB")}getConfig(){let e=Pn({...yft,...Zt().packet});return e.showBits&&(e.paddingY+=10),e}getPacket(){return this.packet}pushWord(e){e.length>0&&this.packet.push(e)}clear(){_r(),this.packet=[]}}});var vft,xft,bft,fW,XEe=O(()=>{"use strict";up();xt();Vm();hW();vft=1e4,xft=o((t,e)=>{ql(t,e);let r=-1,n=[],i=1,{bitsPerRow:a}=e.getConfig();for(let{start:s,end:l,bits:u,label:h}of t.blocks){if(s!==void 0&&l!==void 0&&l{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*r)return[t,void 0];let n=e*r-1,i=e*r;return[{start:t.start,end:n,label:t.label,bits:n-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),fW={parser:{yy:void 0},parse:o(async t=>{let e=await Us("packet",t),r=fW.parser?.yy;if(!(r instanceof jv))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");K.debug(e),xft(e,r)},"parse")}});var Tft,wft,KEe,QEe=O(()=>{"use strict";Ul();Ti();Tft=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:l,bitWidth:u,bitsPerRow:h}=a,f=i.getPacket(),d=i.getDiagramTitle(),p=s+l,m=p*(f.length+1)-(d?0:s),g=u*h+2,y=Ii(e);y.attr("viewBox",`0 0 ${g} ${m}`),Zr(y,m,g,a.useMaxWidth);for(let[v,x]of f.entries())wft(y,x,v,a);y.append("text").text(d).attr("x",g/2).attr("y",m-p/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),wft=o((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:l,showBits:u})=>{let h=t.append("g"),f=r*(n+a)+a;for(let d of e){let p=d.start%l*s+1,m=(d.end-d.start+1)*s-i;if(h.append("rect").attr("x",p).attr("y",f).attr("width",m).attr("height",n).attr("class","packetBlock"),h.append("text").attr("x",p+m/2).attr("y",f+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(d.label),!u)continue;let g=d.end===d.start,y=f-2;h.append("text").attr("x",p+(g?m/2:0)).attr("y",y).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(d.start),g||h.append("text").attr("x",p+m).attr("y",y).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(d.end)}},"drawWord"),KEe={draw:Tft}});var kft,ZEe,JEe=O(()=>{"use strict";ar();kft={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},ZEe=o(({packet:t}={})=>{let e=Pn(kft,t);return` - .packetByte { - font-size: ${e.byteFontSize}; - } - .packetByte.start { - fill: ${e.startByteColor}; - } - .packetByte.end { - fill: ${e.endByteColor}; - } - .packetLabel { - fill: ${e.labelColor}; - font-size: ${e.labelFontSize}; - } - .packetTitle { - fill: ${e.titleColor}; - font-size: ${e.titleFontSize}; - } - .packetBlock { - stroke: ${e.blockStrokeColor}; - stroke-width: ${e.blockStrokeWidth}; - fill: ${e.blockFillColor}; - } - `},"styles")});var eSe={};vr(eSe,{diagram:()=>Eft});var Eft,tSe=O(()=>{"use strict";hW();XEe();QEe();JEe();Eft={parser:fW,get db(){return new jv},renderer:KEe,styles:ZEe}});var Xv,iSe,eg,Aft,_ft,aSe,Dft,Rft,Lft,Nft,Mft,Ift,Oft,tg,dW=O(()=>{"use strict";$r();La();ar();si();Xv={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},iSe={axes:[],curves:[],options:Xv},eg=structuredClone(iSe),Aft=gr.radar,_ft=o(()=>Pn({...Aft,...Zt().radar}),"getConfig"),aSe=o(()=>eg.axes,"getAxes"),Dft=o(()=>eg.curves,"getCurves"),Rft=o(()=>eg.options,"getOptions"),Lft=o(t=>{eg.axes=t.map(e=>({name:e.name,label:e.label??e.name}))},"setAxes"),Nft=o(t=>{eg.curves=t.map(e=>({name:e.name,label:e.label??e.name,entries:Mft(e.entries)}))},"setCurves"),Mft=o(t=>{if(t[0].axis==null)return t.map(r=>r.value);let e=aSe();if(e.length===0)throw new Error("Axes must be populated before curves for reference entries");return e.map(r=>{let n=t.find(i=>i.axis?.$refText===r.name);if(n===void 0)throw new Error("Missing entry for axis "+r.label);return n.value})},"computeCurveEntries"),Ift=o(t=>{let e=t.reduce((r,n)=>(r[n.name]=n,r),{});eg.options={showLegend:e.showLegend?.value??Xv.showLegend,ticks:e.ticks?.value??Xv.ticks,max:e.max?.value??Xv.max,min:e.min?.value??Xv.min,graticule:e.graticule?.value??Xv.graticule}},"setOptions"),Oft=o(()=>{_r(),eg=structuredClone(iSe)},"clear"),tg={getAxes:aSe,getCurves:Dft,getOptions:Rft,setAxes:Lft,setCurves:Nft,setOptions:Ift,getConfig:_ft,clear:Oft,setAccTitle:Lr,getAccTitle:Or,setDiagramTitle:zr,getDiagramTitle:Fr,getAccDescription:Br,setAccDescription:Pr}});var Pft,sSe,oSe=O(()=>{"use strict";up();xt();Vm();dW();Pft=o(t=>{ql(t,tg);let{axes:e,curves:r,options:n}=t;tg.setAxes(e),tg.setCurves(r),tg.setOptions(n)},"populate"),sSe={parse:o(async t=>{let e=await Us("radar",t);K.debug(e),Pft(e)},"parse")}});function Gft(t,e,r,n,i,a,s){let l=e.length,u=Math.min(s.width,s.height)/2;r.forEach((h,f)=>{if(h.entries.length!==l)return;let d=h.entries.map((p,m)=>{let g=2*Math.PI*m/l-Math.PI/2,y=Vft(p,n,i,u),v=y*Math.cos(g),x=y*Math.sin(g);return{x:v,y:x}});a==="circle"?t.append("path").attr("d",qft(d,s.curveTension)).attr("class",`radarCurve-${f}`):a==="polygon"&&t.append("polygon").attr("points",d.map(p=>`${p.x},${p.y}`).join(" ")).attr("class",`radarCurve-${f}`)})}function Vft(t,e,r,n){let i=Math.min(Math.max(t,e),r);return n*(i-e)/(r-e)}function qft(t,e){let r=t.length,n=`M${t[0].x},${t[0].y}`;for(let i=0;i{let h=t.append("g").attr("transform",`translate(${i}, ${a+u*s})`);h.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${u}`),h.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(l.label)})}var Bft,Fft,$ft,zft,lSe,cSe=O(()=>{"use strict";Ul();Ti();Bft=o((t,e,r,n)=>{let i=n.db,a=i.getAxes(),s=i.getCurves(),l=i.getOptions(),u=i.getConfig(),h=i.getDiagramTitle(),f=Ii(e),d=Fft(f,u),p=l.max??Math.max(...s.map(y=>Math.max(...y.entries))),m=l.min,g=Math.min(u.width,u.height)/2;$ft(d,a,g,l.ticks,l.graticule),zft(d,a,g,u),Gft(d,a,s,m,p,l.graticule,u),Uft(d,s,l.showLegend,u),d.append("text").attr("class","radarTitle").text(h).attr("x",0).attr("y",-u.height/2-u.marginTop)},"draw"),Fft=o((t,e)=>{let r=e.width+e.marginLeft+e.marginRight,n=e.height+e.marginTop+e.marginBottom,i={x:e.marginLeft+e.width/2,y:e.marginTop+e.height/2};return Zr(t,n,r,e.useMaxWidth??!0),t.attr("viewBox",`0 0 ${r} ${n}`),t.append("g").attr("transform",`translate(${i.x}, ${i.y})`)},"drawFrame"),$ft=o((t,e,r,n,i)=>{if(i==="circle")for(let a=0;a{let d=2*f*Math.PI/a-Math.PI/2,p=l*Math.cos(d),m=l*Math.sin(d);return`${p},${m}`}).join(" ");t.append("polygon").attr("points",u).attr("class","radarGraticule")}}},"drawGraticule"),zft=o((t,e,r,n)=>{let i=e.length;for(let a=0;a{"use strict";ar();y2();$r();Wft=o((t,e)=>{let r="";for(let n=0;n{let e=yf(),r=Zt(),n=Pn(e,r.themeVariables),i=Pn(n.radar,t);return{themeVariables:n,radarOptions:i}},"buildRadarStyleOptions"),uSe=o(({radar:t}={})=>{let{themeVariables:e,radarOptions:r}=Hft(t);return` - .radarTitle { - font-size: ${e.fontSize}; - color: ${e.titleColor}; - dominant-baseline: hanging; - text-anchor: middle; - } - .radarAxisLine { - stroke: ${r.axisColor}; - stroke-width: ${r.axisStrokeWidth}; - } - .radarAxisLabel { - dominant-baseline: middle; - text-anchor: middle; - font-size: ${r.axisLabelFontSize}px; - color: ${r.axisColor}; - } - .radarGraticule { - fill: ${r.graticuleColor}; - fill-opacity: ${r.graticuleOpacity}; - stroke: ${r.graticuleColor}; - stroke-width: ${r.graticuleStrokeWidth}; - } - .radarLegendText { - text-anchor: start; - font-size: ${r.legendFontSize}px; - dominant-baseline: hanging; - } - ${Wft(e,r)} - `},"styles")});var fSe={};vr(fSe,{diagram:()=>Yft});var Yft,dSe=O(()=>{"use strict";dW();oSe();cSe();hSe();Yft={parser:sSe,db:tg,renderer:lSe,styles:uSe}});var pW,gSe,ySe=O(()=>{"use strict";pW=(function(){var t=o(function(T,E,w,k){for(w=w||{},k=T.length;k--;w[T[k]]=E);return w},"o"),e=[1,15],r=[1,7],n=[1,13],i=[1,14],a=[1,19],s=[1,16],l=[1,17],u=[1,18],h=[8,30],f=[8,10,21,28,29,30,31,39,43,46],d=[1,23],p=[1,24],m=[8,10,15,16,21,28,29,30,31,39,43,46],g=[8,10,15,16,21,27,28,29,30,31,39,43,46],y=[1,49],v={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:o(function(E,w,k,S,A,L,I){var N=L.length-1;switch(A){case 4:S.getLogger().debug("Rule: separator (NL) ");break;case 5:S.getLogger().debug("Rule: separator (Space) ");break;case 6:S.getLogger().debug("Rule: separator (EOF) ");break;case 7:S.getLogger().debug("Rule: hierarchy: ",L[N-1]),S.setHierarchy(L[N-1]);break;case 8:S.getLogger().debug("Stop NL ");break;case 9:S.getLogger().debug("Stop EOF ");break;case 10:S.getLogger().debug("Stop NL2 ");break;case 11:S.getLogger().debug("Stop EOF2 ");break;case 12:S.getLogger().debug("Rule: statement: ",L[N]),typeof L[N].length=="number"?this.$=L[N]:this.$=[L[N]];break;case 13:S.getLogger().debug("Rule: statement #2: ",L[N-1]),this.$=[L[N-1]].concat(L[N]);break;case 14:S.getLogger().debug("Rule: link: ",L[N],E),this.$={edgeTypeStr:L[N],label:""};break;case 15:S.getLogger().debug("Rule: LABEL link: ",L[N-3],L[N-1],L[N]),this.$={edgeTypeStr:L[N],label:L[N-1]};break;case 18:let C=parseInt(L[N]),_=S.generateId();this.$={id:_,type:"space",label:"",width:C,children:[]};break;case 23:S.getLogger().debug("Rule: (nodeStatement link node) ",L[N-2],L[N-1],L[N]," typestr: ",L[N-1].edgeTypeStr);let D=S.edgeStrToEdgeData(L[N-1].edgeTypeStr);this.$=[{id:L[N-2].id,label:L[N-2].label,type:L[N-2].type,directions:L[N-2].directions},{id:L[N-2].id+"-"+L[N].id,start:L[N-2].id,end:L[N].id,label:L[N-1].label,type:"edge",directions:L[N].directions,arrowTypeEnd:D,arrowTypeStart:"arrow_open"},{id:L[N].id,label:L[N].label,type:S.typeStr2Type(L[N].typeStr),directions:L[N].directions}];break;case 24:S.getLogger().debug("Rule: nodeStatement (abc88 node size) ",L[N-1],L[N]),this.$={id:L[N-1].id,label:L[N-1].label,type:S.typeStr2Type(L[N-1].typeStr),directions:L[N-1].directions,widthInColumns:parseInt(L[N],10)};break;case 25:S.getLogger().debug("Rule: nodeStatement (node) ",L[N]),this.$={id:L[N].id,label:L[N].label,type:S.typeStr2Type(L[N].typeStr),directions:L[N].directions,widthInColumns:1};break;case 26:S.getLogger().debug("APA123",this?this:"na"),S.getLogger().debug("COLUMNS: ",L[N]),this.$={type:"column-setting",columns:L[N]==="auto"?-1:parseInt(L[N])};break;case 27:S.getLogger().debug("Rule: id-block statement : ",L[N-2],L[N-1]);let M=S.generateId();this.$={...L[N-2],type:"composite",children:L[N-1]};break;case 28:S.getLogger().debug("Rule: blockStatement : ",L[N-2],L[N-1],L[N]);let R=S.generateId();this.$={id:R,type:"composite",label:"",children:L[N-1]};break;case 29:S.getLogger().debug("Rule: node (NODE_ID separator): ",L[N]),this.$={id:L[N]};break;case 30:S.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",L[N-1],L[N]),this.$={id:L[N-1],label:L[N].label,typeStr:L[N].typeStr,directions:L[N].directions};break;case 31:S.getLogger().debug("Rule: dirList: ",L[N]),this.$=[L[N]];break;case 32:S.getLogger().debug("Rule: dirList: ",L[N-1],L[N]),this.$=[L[N-1]].concat(L[N]);break;case 33:S.getLogger().debug("Rule: nodeShapeNLabel: ",L[N-2],L[N-1],L[N]),this.$={typeStr:L[N-2]+L[N],label:L[N-1]};break;case 34:S.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",L[N-3],L[N-2]," #3:",L[N-1],L[N]),this.$={typeStr:L[N-3]+L[N],label:L[N-2],directions:L[N-1]};break;case 35:case 36:this.$={type:"classDef",id:L[N-1].trim(),css:L[N].trim()};break;case 37:this.$={type:"applyClass",id:L[N-1].trim(),styleClass:L[N].trim()};break;case 38:this.$={type:"applyStyles",id:L[N-1].trim(),stylesStr:L[N].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:e,11:3,13:4,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{8:[1,20]},t(h,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:e,21:r,28:n,29:i,31:a,39:s,43:l,46:u}),t(f,[2,16],{14:22,15:d,16:p}),t(f,[2,17]),t(f,[2,18]),t(f,[2,19]),t(f,[2,20]),t(f,[2,21]),t(f,[2,22]),t(m,[2,25],{27:[1,25]}),t(f,[2,26]),{19:26,26:12,31:a},{10:e,11:27,13:4,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},t(g,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},t(h,[2,13]),{26:35,31:a},{31:[2,14]},{17:[1,36]},t(m,[2,24]),{10:e,11:37,13:4,14:22,15:d,16:p,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(m,[2,23]),{18:[1,45]},{30:[1,46]},t(f,[2,28]),t(f,[2,35]),t(f,[2,36]),t(f,[2,37]),t(f,[2,38]),{36:[1,47]},{33:48,34:y},{15:[1,50]},t(f,[2,27]),t(g,[2,33]),{38:[1,51]},{33:52,34:y,38:[2,31]},{31:[2,15]},t(g,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:o(function(E,w){if(w.recoverable)this.trace(E);else{var k=new Error(E);throw k.hash=w,k}},"parseError"),parse:o(function(E){var w=this,k=[0],S=[],A=[null],L=[],I=this.table,N="",C=0,_=0,D=0,M=2,R=1,P=L.slice.call(arguments,1),B=Object.create(this.lexer),F={yy:{}};for(var G in this.yy)Object.prototype.hasOwnProperty.call(this.yy,G)&&(F.yy[G]=this.yy[G]);B.setInput(E,F.yy),F.yy.lexer=B,F.yy.parser=this,typeof B.yylloc>"u"&&(B.yylloc={});var $=B.yylloc;L.push($);var V=B.options&&B.options.ranges;typeof F.yy.parseError=="function"?this.parseError=F.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function X(ke){k.length=k.length-2*ke,A.length=A.length-ke,L.length=L.length-ke}o(X,"popStack");function Q(){var ke;return ke=S.pop()||B.lex()||R,typeof ke!="number"&&(ke instanceof Array&&(S=ke,ke=S.pop()),ke=w.symbols_[ke]||ke),ke}o(Q,"lex");for(var H,ie,Y,le,ee,J,te={},Z,xe,de,Se;;){if(Y=k[k.length-1],this.defaultActions[Y]?le=this.defaultActions[Y]:((H===null||typeof H>"u")&&(H=Q()),le=I[Y]&&I[Y][H]),typeof le>"u"||!le.length||!le[0]){var Me="";Se=[];for(Z in I[Y])this.terminals_[Z]&&Z>M&&Se.push("'"+this.terminals_[Z]+"'");B.showPosition?Me="Parse error on line "+(C+1)+`: -`+B.showPosition()+` -Expecting `+Se.join(", ")+", got '"+(this.terminals_[H]||H)+"'":Me="Parse error on line "+(C+1)+": Unexpected "+(H==R?"end of input":"'"+(this.terminals_[H]||H)+"'"),this.parseError(Me,{text:B.match,token:this.terminals_[H]||H,line:B.yylineno,loc:$,expected:Se})}if(le[0]instanceof Array&&le.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Y+", token: "+H);switch(le[0]){case 1:k.push(H),A.push(B.yytext),L.push(B.yylloc),k.push(le[1]),H=null,ie?(H=ie,ie=null):(_=B.yyleng,N=B.yytext,C=B.yylineno,$=B.yylloc,D>0&&D--);break;case 2:if(xe=this.productions_[le[1]][1],te.$=A[A.length-xe],te._$={first_line:L[L.length-(xe||1)].first_line,last_line:L[L.length-1].last_line,first_column:L[L.length-(xe||1)].first_column,last_column:L[L.length-1].last_column},V&&(te._$.range=[L[L.length-(xe||1)].range[0],L[L.length-1].range[1]]),J=this.performAction.apply(te,[N,_,C,F.yy,le[1],A,L].concat(P)),typeof J<"u")return J;xe&&(k=k.slice(0,-1*xe*2),A=A.slice(0,-1*xe),L=L.slice(0,-1*xe)),k.push(this.productions_[le[1]][0]),A.push(te.$),L.push(te._$),de=I[k[k.length-2]][k[k.length-1]],k.push(de);break;case 3:return!0}}return!0},"parse")},x=(function(){var T={EOF:1,parseError:o(function(w,k){if(this.yy.parser)this.yy.parser.parseError(w,k);else throw new Error(w)},"parseError"),setInput:o(function(E,w){return this.yy=w||this.yy||{},this._input=E,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var E=this._input[0];this.yytext+=E,this.yyleng++,this.offset++,this.match+=E,this.matched+=E;var w=E.match(/(?:\r\n?|\n).*/g);return w?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),E},"input"),unput:o(function(E){var w=E.length,k=E.split(/(?:\r\n?|\n)/g);this._input=E+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-w),this.offset-=w;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),k.length-1&&(this.yylineno-=k.length-1);var A=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:k?(k.length===S.length?this.yylloc.first_column:0)+S[S.length-k.length].length-k[0].length:this.yylloc.first_column-w},this.options.ranges&&(this.yylloc.range=[A[0],A[0]+this.yyleng-w]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(E){this.unput(this.match.slice(E))},"less"),pastInput:o(function(){var E=this.matched.substr(0,this.matched.length-this.match.length);return(E.length>20?"...":"")+E.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var E=this.match;return E.length<20&&(E+=this._input.substr(0,20-E.length)),(E.substr(0,20)+(E.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var E=this.pastInput(),w=new Array(E.length+1).join("-");return E+this.upcomingInput()+` -`+w+"^"},"showPosition"),test_match:o(function(E,w){var k,S,A;if(this.options.backtrack_lexer&&(A={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(A.yylloc.range=this.yylloc.range.slice(0))),S=E[0].match(/(?:\r\n?|\n).*/g),S&&(this.yylineno+=S.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:S?S[S.length-1].length-S[S.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+E[0].length},this.yytext+=E[0],this.match+=E[0],this.matches=E,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(E[0].length),this.matched+=E[0],k=this.performAction.call(this,this.yy,this,w,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),k)return k;if(this._backtrack){for(var L in A)this[L]=A[L];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var E,w,k,S;this._more||(this.yytext="",this.match="");for(var A=this._currentRules(),L=0;Lw[0].length)){if(w=k,S=L,this.options.backtrack_lexer){if(E=this.test_match(k,A[L]),E!==!1)return E;if(this._backtrack){w=!1;continue}else return!1}else if(!this.options.flex)break}return w?(E=this.test_match(w,A[S]),E!==!1?E:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var w=this.next();return w||this.lex()},"lex"),begin:o(function(w){this.conditionStack.push(w)},"begin"),popState:o(function(){var w=this.conditionStack.length-1;return w>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(w){return w=this.conditionStack.length-1-Math.abs(w||0),w>=0?this.conditionStack[w]:"INITIAL"},"topState"),pushState:o(function(w){this.begin(w)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(w,k,S,A){var L=A;switch(S){case 0:return w.getLogger().debug("Found block-beta"),10;break;case 1:return w.getLogger().debug("Found id-block"),29;break;case 2:return w.getLogger().debug("Found block"),10;break;case 3:w.getLogger().debug(".",k.yytext);break;case 4:w.getLogger().debug("_",k.yytext);break;case 5:return 5;case 6:return k.yytext=-1,28;break;case 7:return k.yytext=k.yytext.replace(/columns\s+/,""),w.getLogger().debug("COLUMNS (LEX)",k.yytext),28;break;case 8:this.pushState("md_string");break;case 9:return"MD_STR";case 10:this.popState();break;case 11:this.pushState("string");break;case 12:w.getLogger().debug("LEX: POPPING STR:",k.yytext),this.popState();break;case 13:return w.getLogger().debug("LEX: STR end:",k.yytext),"STR";break;case 14:return k.yytext=k.yytext.replace(/space\:/,""),w.getLogger().debug("SPACE NUM (LEX)",k.yytext),21;break;case 15:return k.yytext="1",w.getLogger().debug("COLUMNS (LEX)",k.yytext),21;break;case 16:return 42;case 17:return"LINKSTYLE";case 18:return"INTERPOLATE";case 19:return this.pushState("CLASSDEF"),39;break;case 20:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 21:return this.popState(),this.pushState("CLASSDEFID"),40;break;case 22:return this.popState(),41;break;case 23:return this.pushState("CLASS"),43;break;case 24:return this.popState(),this.pushState("CLASS_STYLE"),44;break;case 25:return this.popState(),45;break;case 26:return this.pushState("STYLE_STMNT"),46;break;case 27:return this.popState(),this.pushState("STYLE_DEFINITION"),47;break;case 28:return this.popState(),48;break;case 29:return this.pushState("acc_title"),"acc_title";break;case 30:return this.popState(),"acc_title_value";break;case 31:return this.pushState("acc_descr"),"acc_descr";break;case 32:return this.popState(),"acc_descr_value";break;case 33:this.pushState("acc_descr_multiline");break;case 34:this.popState();break;case 35:return"acc_descr_multiline_value";case 36:return 30;case 37:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 38:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),w.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 40:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 41:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),w.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 43:return this.popState(),w.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 44:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 45:return this.popState(),w.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 46:return this.popState(),w.getLogger().debug("Lex: ("),"NODE_DEND";break;case 47:return this.popState(),w.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 48:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 49:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),w.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 51:return this.popState(),w.getLogger().debug("Lex: )"),"NODE_DEND";break;case 52:return this.popState(),w.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 53:return this.popState(),w.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 54:return w.getLogger().debug("Lexa: -)"),this.pushState("NODE"),35;break;case 55:return w.getLogger().debug("Lexa: (-"),this.pushState("NODE"),35;break;case 56:return w.getLogger().debug("Lexa: ))"),this.pushState("NODE"),35;break;case 57:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 58:return w.getLogger().debug("Lex: ((("),this.pushState("NODE"),35;break;case 59:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 60:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 61:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 62:return w.getLogger().debug("Lexc: >"),this.pushState("NODE"),35;break;case 63:return w.getLogger().debug("Lexa: (["),this.pushState("NODE"),35;break;case 64:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 65:return this.pushState("NODE"),35;break;case 66:return this.pushState("NODE"),35;break;case 67:return this.pushState("NODE"),35;break;case 68:return this.pushState("NODE"),35;break;case 69:return this.pushState("NODE"),35;break;case 70:return this.pushState("NODE"),35;break;case 71:return this.pushState("NODE"),35;break;case 72:return w.getLogger().debug("Lexa: ["),this.pushState("NODE"),35;break;case 73:return this.pushState("BLOCK_ARROW"),w.getLogger().debug("LEX ARR START"),37;break;case 74:return w.getLogger().debug("Lex: NODE_ID",k.yytext),31;break;case 75:return w.getLogger().debug("Lex: EOF",k.yytext),8;break;case 76:this.pushState("md_string");break;case 77:this.pushState("md_string");break;case 78:return"NODE_DESCR";case 79:this.popState();break;case 80:w.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 81:w.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 82:return w.getLogger().debug("LEX: NODE_DESCR:",k.yytext),"NODE_DESCR";break;case 83:w.getLogger().debug("LEX POPPING"),this.popState();break;case 84:w.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 85:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (right): dir:",k.yytext),"DIR";break;case 86:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (left):",k.yytext),"DIR";break;case 87:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (x):",k.yytext),"DIR";break;case 88:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (y):",k.yytext),"DIR";break;case 89:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (up):",k.yytext),"DIR";break;case 90:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (down):",k.yytext),"DIR";break;case 91:return k.yytext="]>",w.getLogger().debug("Lex (ARROW_DIR end):",k.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 92:return w.getLogger().debug("Lex: LINK","#"+k.yytext+"#"),15;break;case 93:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 94:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 95:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 96:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 97:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 98:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 99:this.pushState("md_string");break;case 100:return w.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 101:return this.popState(),w.getLogger().debug("Lex: LINK","#"+k.yytext+"#"),15;break;case 102:return this.popState(),w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 103:return this.popState(),w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 104:return w.getLogger().debug("Lex: COLON",k.yytext),k.yytext=k.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block:)/,/^(?:block\b)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[28],inclusive:!1},STYLE_STMNT:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[22],inclusive:!1},CLASSDEF:{rules:[20,21],inclusive:!1},CLASS_STYLE:{rules:[25],inclusive:!1},CLASS:{rules:[24],inclusive:!1},LLABEL:{rules:[99,100,101,102,103],inclusive:!1},ARROW_DIR:{rules:[85,86,87,88,89,90,91],inclusive:!1},BLOCK_ARROW:{rules:[76,81,84],inclusive:!1},NODE:{rules:[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],inclusive:!1},md_string:{rules:[9,10,78,79],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[12,13,82,83],inclusive:!1},acc_descr_multiline:{rules:[34,35],inclusive:!1},acc_descr:{rules:[32],inclusive:!1},acc_title:{rules:[30],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],inclusive:!0}}};return T})();v.lexer=x;function b(){this.yy={}}return o(b,"Parser"),b.prototype=v,v.Parser=b,new b})();pW.parser=pW;gSe=pW});function ndt(t){switch(K.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return K.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function idt(t){switch(K.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function adt(t){switch(t.replace(/^[\s-]+|[\s-]+$/g,"")){case"x":return"arrow_cross";case"o":return"arrow_circle";case">":return"arrow_point";default:return""}}var Bc,gW,mW,vSe,xSe,Kft,TSe,Qft,y_,Zft,Jft,edt,tdt,wSe,yW,S3,rdt,bSe,sdt,odt,ldt,cdt,udt,hdt,fdt,ddt,pdt,mdt,gdt,kSe,ESe=O(()=>{"use strict";rI();$r();jt();xt();Ur();si();Bc=new Map,gW=[],mW=new Map,vSe="color",xSe="fill",Kft="bgFill",TSe=",",Qft=ve(),y_=new Map,Zft=o(t=>st.sanitizeText(t,Qft),"sanitizeText"),Jft=o(function(t,e=""){let r=y_.get(t);r||(r={id:t,styles:[],textStyles:[]},y_.set(t,r)),e?.split(TSe).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(vSe).exec(n)){let s=i.replace(xSe,Kft).replace(vSe,xSe);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),edt=o(function(t,e=""){let r=Bc.get(t);e!=null&&(r.styles=e.split(TSe))},"addStyle2Node"),tdt=o(function(t,e){t.split(",").forEach(function(r){let n=Bc.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},Bc.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),wSe=o((t,e)=>{let r=t.flat(),n=[],a=r.find(s=>s?.type==="column-setting")?.columns??-1;for(let s of r){if(typeof a=="number"&&a>0&&s.type!=="column-setting"&&typeof s.widthInColumns=="number"&&s.widthInColumns>a&&K.warn(`Block ${s.id} width ${s.widthInColumns} exceeds configured column width ${a}`),s.label&&(s.label=Zft(s.label)),s.type==="classDef"){Jft(s.id,s.css);continue}if(s.type==="applyClass"){tdt(s.id,s?.styleClass??"");continue}if(s.type==="applyStyles"){s?.stylesStr&&edt(s.id,s?.stylesStr);continue}if(s.type==="column-setting")e.columns=s.columns??-1;else if(s.type==="edge"){let l=(mW.get(s.id)??0)+1;mW.set(s.id,l),s.id=l+"-"+s.id,gW.push(s)}else{s.label||(s.type==="composite"?s.label="":s.label=s.id);let l=Bc.get(s.id);if(l===void 0?Bc.set(s.id,s):(s.type!=="na"&&(l.type=s.type),s.label!==s.id&&(l.label=s.label)),s.children&&wSe(s.children,s),s.type==="space"){let u=s.width??1;for(let h=0;h{K.debug("Clear called"),_r(),S3={id:"root",type:"composite",children:[],columns:-1},Bc=new Map([["root",S3]]),yW=[],y_=new Map,gW=[],mW=new Map},"clear");o(ndt,"typeStr2Type");o(idt,"edgeTypeStr2Type");o(adt,"edgeStrToEdgeData");bSe=0,sdt=o(()=>(bSe++,"id-"+Math.random().toString(36).substr(2,12)+"-"+bSe),"generateId"),odt=o(t=>{S3.children=t,wSe(t,S3),yW=S3.children},"setHierarchy"),ldt=o(t=>{let e=Bc.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),cdt=o(()=>[...Bc.values()],"getBlocksFlat"),udt=o(()=>yW||[],"getBlocks"),hdt=o(()=>gW,"getEdges"),fdt=o(t=>Bc.get(t),"getBlock"),ddt=o(t=>{Bc.set(t.id,t)},"setBlock"),pdt=o(()=>K,"getLogger"),mdt=o(function(){return y_},"getClasses"),gdt={getConfig:o(()=>Zt().block,"getConfig"),typeStr2Type:ndt,edgeTypeStr2Type:idt,edgeStrToEdgeData:adt,getLogger:pdt,getBlocksFlat:cdt,getBlocks:udt,getEdges:hdt,setHierarchy:odt,getBlock:fdt,setBlock:ddt,getColumns:ldt,getClasses:mdt,clear:rdt,generateId:sdt},kSe=gdt});var vW,ydt,SSe,CSe=O(()=>{"use strict";Ys();ly();vW=o((t,e)=>{let r=_p,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return bs(n,i,a,e)},"fade"),ydt=o(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - .cluster-label text { - fill: ${t.titleColor}; - } - .cluster-label span,p { - color: ${t.titleColor}; - } - - - - .label text,span,p { - fill: ${t.nodeTextColor||t.textColor}; - color: ${t.nodeTextColor||t.textColor}; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - .flowchart-label text { - text-anchor: middle; - } - // .flowchart-label .text-outer-tspan { - // text-anchor: middle; - // } - // .flowchart-label .text-inner-tspan { - // text-anchor: start; - // } - - .node .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 2.0px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - /* - * This is for backward compatibility with existing code that didn't - * add a \`

    \` around edge labels. - * - * TODO: We should probably remove this in a future release. - */ - p { - margin: 0; - padding: 0; - display: inline; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; - } - - /* For html labels only */ - .labelBkg { - background-color: ${t.edgeLabelBackground}; - } - - .node .cluster { - // fill: ${vW(t.mainBkg,.5)}; - fill: ${vW(t.clusterBkg,.5)}; - stroke: ${vW(t.clusterBorder,.2)}; - box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; - stroke-width: 1px; - } - - .cluster text { - fill: ${t.titleColor}; - } - - .cluster span,p { - color: ${t.titleColor}; - } - /* .cluster div { - color: ${t.titleColor}; - } */ - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .flowchartTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; - } - ${Lu()} -`,"getStyles"),SSe=ydt});var vdt,xdt,bdt,Tdt,wdt,kdt,Edt,Sdt,Cdt,Adt,_dt,ASe,_Se=O(()=>{"use strict";xt();vdt=o((t,e,r,n)=>{e.forEach(i=>{_dt[i](t,r,n)})},"insertMarkers"),xdt=o((t,e,r)=>{K.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),bdt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),Tdt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),wdt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),kdt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),Edt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Sdt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),Cdt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Adt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),_dt={extension:xdt,composition:bdt,aggregation:Tdt,dependency:wdt,lollipop:kdt,point:Edt,circle:Sdt,cross:Cdt,barb:Adt},ASe=vdt});function DSe(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function xW(t,e,r=0,n=0){K.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"siblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let m of t.children)xW(m,e);let s=Ddt(t);i=s.width,a=s.height,K.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let m of t.children)m.size&&(K.debug(`abc95 Setting size of children of ${t.id} id=${m.id} ${i} ${a} ${JSON.stringify(m.size)}`),m.size.width=i*(m.widthInColumns??1)+$i*((m.widthInColumns??1)-1),m.size.height=a,m.size.x=0,m.size.y=0,K.debug(`abc95 updating size of ${t.id} children child:${m.id} maxWidth:${i} maxHeight:${a}`));for(let m of t.children)xW(m,e,i,a);let l=t.columns??-1,u=0;for(let m of t.children)u+=m.widthInColumns??1;let h=t.children.length;l>0&&l0?Math.min(t.children.length,l):t.children.length;if(m>0){let g=(d-m*$i-$i)/m;K.debug("abc95 (growing to fit) width",t.id,d,t.size?.width,g);for(let y of t.children)y.size&&(y.size.width=g)}}t.size={width:d,height:p,x:0,y:0}}K.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function RSe(t,e){K.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(K.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*$i;K.debug("widthOfChildren 88",i,"posX");let a=new Map;{let f=0;for(let d of t.children){if(!d.size)continue;let{py:p}=DSe(r,f),m=a.get(p)??0;d.size.height>m&&a.set(p,d.size.height);let g=d?.widthInColumns??1;r>0&&(g=Math.min(g,r-f%r)),f+=g}}let s=new Map;{let f=0,d=[...a.keys()].sort((p,m)=>p-m);for(let p of d)s.set(p,f),f+=(a.get(p)??0)+$i}let l=0;K.debug("abc91 block?.size?.x",t.id,t?.size?.x);let u=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-$i,h=0;for(let f of t.children){let d=t;if(!f.size)continue;let{width:p,height:m}=f.size,{px:g,py:y}=DSe(r,l);if(y!=h&&(h=y,u=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-$i,K.debug("New row in layout for block",t.id," and child ",f.id,h)),K.debug(`abc89 layout blocks (child) id: ${f.id} Pos: ${l} (px, py) ${g},${y} (${d?.size?.x},${d?.size?.y}) parent: ${d.id} width: ${p}${$i}`),d.size){let x=p/2;f.size.x=u+$i+x,K.debug(`abc91 layout blocks (calc) px, pyid:${f.id} startingPos=X${u} new startingPosX${f.size.x} ${x} padding=${$i} width=${p} halfWidth=${x} => x:${f.size.x} y:${f.size.y} ${f.widthInColumns} (width * (child?.w || 1)) / 2 ${p*(f?.widthInColumns??1)/2}`),u=f.size.x+x;let b=s.get(y)??0,T=a.get(y)??m;f.size.y=d.size.y-d.size.height/2+b+T/2+$i,K.debug(`abc88 layout blocks (calc) px, pyid:${f.id}startingPosX${u}${$i}${x}=>x:${f.size.x}y:${f.size.y}${f.widthInColumns}(width * (child?.w || 1)) / 2${p*(f?.widthInColumns??1)/2}`)}f.children&&RSe(f,e);let v=f?.widthInColumns??1;r>0&&(v=Math.min(v,r-l%r)),l+=v,K.debug("abc88 columnsPos",f,l)}}K.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function LSe(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:l,height:u}=t.size;a-l/2n&&(n=a+l/2),s+u/2>i&&(i=s+u/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=LSe(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function NSe(t){let e=t.getBlock("root");if(!e)return;xW(e,t,0,0),RSe(e,t),K.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=LSe(e),s=a-n,l=i-r;return{x:r,y:n,width:l,height:s}}var $i,Ddt,MSe=O(()=>{"use strict";xt();jt();$i=ve()?.block?.padding??8;o(DSe,"calculateBlockPosition");Ddt=o(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:l}=n.size??{width:0,height:0,x:0,y:0};K.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",l,n.type),n.type!=="space"&&(i>e&&(e=i/(n.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");o(xW,"setBlockSizes");o(RSe,"layoutBlocks");o(LSe,"findBounds");o(NSe,"layout")});var Rdt,Lo,v_=O(()=>{"use strict";$r();jt();co();Rdt=o(async(t,e,r,n=!1,i=!1)=>{let a=e||"";typeof a=="object"&&(a=a[0]);let s=ve(),l=Sr(s);return await Fn(t,a,{style:r,isTitle:n,useHtmlLabels:l,markdown:!1,isNode:i,width:Number.POSITIVE_INFINITY},s)},"createLabel"),Lo=Rdt});var OSe,Ldt,ISe,PSe=O(()=>{"use strict";xt();OSe=o((t,e,r,n,i)=>{e.arrowTypeStart&&ISe(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&ISe(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),Ldt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},ISe=o((t,e,r,n,i,a)=>{let s=Ldt[r];if(!s){K.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function x_(t,e){Sr(ve())&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}var bW,ys,FSe,$Se,Ndt,Mdt,BSe,zSe,GSe=O(()=>{"use strict";xt();v_();co();BM();Ar();jt();$r();ar();Ur();$M();gb();PSe();bW={},ys={},FSe=o(async(t,e)=>{let r=ve(),n=Sr(r),i=t.insert("g").attr("class","edgeLabel"),a=i.insert("g").attr("class","label"),s=e.labelType==="markdown",l=await Fn(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:s,isNode:!1,markdown:s,width:s?void 0:Number.POSITIVE_INFINITY},r);a.node().appendChild(l);let u=l.getBBox(),h=u;if(n){let d=l.children[0],p=je(l);u=d.getBoundingClientRect(),h=u,p.attr("width",u.width),p.attr("height",u.height)}else{let d=je(l).select("text").node();d&&typeof d.getBBox=="function"&&(h=d.getBBox())}a.attr("transform",Cl(h,n)),bW[e.id]=i,e.width=u.width,e.height=u.height;let f;if(e.startLabelLeft){let d=t.insert("g").attr("class","edgeTerminals"),p=d.insert("g").attr("class","inner"),m=await Lo(p,e.startLabelLeft,e.labelStyle);f=m;let g=m.getBBox();if(n){let y=m.children[0],v=je(m);g=y.getBoundingClientRect(),v.attr("width",g.width),v.attr("height",g.height)}p.attr("transform",Cl(g,n)),ys[e.id]||(ys[e.id]={}),ys[e.id].startLeft=d,x_(f,e.startLabelLeft)}if(e.startLabelRight){let d=t.insert("g").attr("class","edgeTerminals"),p=d.insert("g").attr("class","inner"),m=await Lo(d,e.startLabelRight,e.labelStyle);f=m,p.node().appendChild(m);let g=m.getBBox();if(n){let y=m.children[0],v=je(m);g=y.getBoundingClientRect(),v.attr("width",g.width),v.attr("height",g.height)}p.attr("transform",Cl(g,n)),ys[e.id]||(ys[e.id]={}),ys[e.id].startRight=d,x_(f,e.startLabelRight)}if(e.endLabelLeft){let d=t.insert("g").attr("class","edgeTerminals"),p=d.insert("g").attr("class","inner"),m=await Lo(p,e.endLabelLeft,e.labelStyle);f=m;let g=m.getBBox();if(n){let y=m.children[0],v=je(m);g=y.getBoundingClientRect(),v.attr("width",g.width),v.attr("height",g.height)}p.attr("transform",Cl(g,n)),d.node().appendChild(m),ys[e.id]||(ys[e.id]={}),ys[e.id].endLeft=d,x_(f,e.endLabelLeft)}if(e.endLabelRight){let d=t.insert("g").attr("class","edgeTerminals"),p=d.insert("g").attr("class","inner"),m=await Lo(p,e.endLabelRight,e.labelStyle);f=m;let g=m.getBBox();if(n){let y=m.children[0],v=je(m);g=y.getBoundingClientRect(),v.attr("width",g.width),v.attr("height",g.height)}p.attr("transform",Cl(g,n)),d.node().appendChild(m),ys[e.id]||(ys[e.id]={}),ys[e.id].endRight=d,x_(f,e.endLabelRight)}return l},"insertEdgeLabel");o(x_,"setTerminalWidth");$Se=o((t,e)=>{K.debug("Moving label abc88 ",t.id,t.label,bW[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=ve(),{subGraphTitleTotalMargin:i}=Lh(n);if(t.label){let a=bW[t.id],s=t.x,l=t.y;if(r){let u=Xt.calcLabelPosition(r);K.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=ys[t.id].startLeft,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=ys[t.id].startRight,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=ys[t.id].endLeft,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=ys[t.id].endRight,s=t.x,l=t.y;if(r){let u=Xt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),Ndt=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),Mdt=o((t,e,r)=>{K.debug(`intersection calc abc89: - outsidePoint: ${JSON.stringify(e)} - insidePoint : ${JSON.stringify(r)} - node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{K.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!Ndt(e,a)&&!i){let s=Mdt(e,n,a),l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),zSe=o(function(t,e,r,n,i,a,s){let l=r.points;K.debug("abc88 InsertEdge: edge=",r,"e=",e);let u=!1,h=a.node(e.v);var f=a.node(e.w);f?.intersect&&h?.intersect&&(l=l.slice(1,r.points.length-1),l.unshift(h.intersect(l[0])),l.push(f.intersect(l[l.length-1]))),r.toCluster&&(K.debug("to cluster abc88",n[r.toCluster]),l=BSe(r.points,n[r.toCluster].node),u=!0),r.fromCluster&&(K.debug("from cluster abc88",n[r.fromCluster]),l=BSe(l.reverse(),n[r.fromCluster].node).reverse(),u=!0);let d=l.filter(E=>!Number.isNaN(E.y)),p=fc;r.curve&&(i==="graph"||i==="flowchart")&&(p=r.curve);let{x:m,y:g}=cE(r),y=hc().x(m).y(g).curve(p),v;switch(r.thickness){case"normal":v="edge-thickness-normal";break;case"thick":v="edge-thickness-thick";break;case"invisible":v="edge-thickness-thick";break;default:v=""}switch(r.pattern){case"solid":v+=" edge-pattern-solid";break;case"dotted":v+=" edge-pattern-dotted";break;case"dashed":v+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",y(d)).attr("id",r.id).attr("class"," "+v+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(ve().flowchart.arrowMarkerAbsolute||ve().state.arrowMarkerAbsolute)&&(b=Op(!0)),OSe(x,r,b,s,i);let T={};return u&&(T.updatedPath=l),T.originalPath=r.points,T},"insertEdge")});var Idt,VSe,qSe=O(()=>{"use strict";Idt=o(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),VSe=o((t,e,r)=>{let n=Idt(t),i=2,a=e.height+2*r.padding,s=a/i,l=e.width+2*s+r.padding,u=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:l/2,y:2*u},{x:l-s,y:0},{x:l,y:0},{x:l,y:-a/3},{x:l+2*u,y:-a/2},{x:l,y:-2*a/3},{x:l,y:-a},{x:l-s,y:-a},{x:l/2,y:-a-2*u},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*u,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:l-s,y:-a},{x:l,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:l,y:-s},{x:l,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:l,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:l,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:l,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:l,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:l,y:0},{x:0,y:-s},{x:l,y:-a}]:n.has("left")&&n.has("down")?[{x:l,y:0},{x:0,y:0},{x:l,y:-a}]:n.has("right")?[{x:s,y:-u},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a+u}]:n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u}]:n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:[{x:0,y:0}]},"getArrowPoints")});function Odt(t,e){return t.intersect(e)}var USe,WSe=O(()=>{"use strict";o(Odt,"intersectNode");USe=Odt});function Pdt(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(Pdt,"intersectEllipse");b_=Pdt});function Bdt(t,e,r){return b_(t,e,e,r)}var HSe,YSe=O(()=>{"use strict";TW();o(Bdt,"intersectCircle");HSe=Bdt});function Fdt(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&jSe(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&jSe(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function jSe(t,e){return t*e>0}var XSe,KSe=O(()=>{"use strict";o(Fdt,"intersectLine");o(jSe,"sameSign");XSe=Fdt});function $dt(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),l=Math.min(l,g.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));for(var u=n-t.width/2-s,h=i-t.height/2-l,f=0;f1&&a.sort(function(g,y){var v=g.x-r.x,x=g.y-r.y,b=Math.sqrt(v*v+x*x),T=y.x-r.x,E=y.y-r.y,w=Math.sqrt(T*T+E*E);return b{"use strict";KSe();QSe=$dt;o($dt,"intersectPolygon")});var zdt,JSe,eCe=O(()=>{"use strict";zdt=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),JSe=zdt});var Zn,wW=O(()=>{"use strict";WSe();YSe();TW();ZSe();eCe();Zn={node:USe,circle:HSe,ellipse:b_,polygon:QSe,rect:JSe}});function Fc(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var ji,gi,kW=O(()=>{"use strict";v_();co();jt();$r();Ar();Ur();ar();dM();ji=o(async(t,e,r,n)=>{let i=ve(),a,s=e.useHtmlLabels||Sr(i);r?a=r:a="node default";let l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),u=l.insert("g").attr("class","label").attr("style",e.labelStyle),h;e.labelText===void 0?h="":h=typeof e.labelText=="string"?e.labelText:e.labelText[0];let f;e.labelType==="markdown"?f=Fn(u,wr(ao(h),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):f=await Lo(u,wr(ao(h),i),e.labelStyle,!1,n);let d=f.getBBox(),p=e.padding/2;if(Sr(i)){let m=f.children[0],g=je(f);await Wk(m,h),d=m.getBoundingClientRect(),g.attr("width",d.width),g.attr("height",d.height)}return s?u.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"):u.attr("transform","translate(0, "+-d.height/2+")"),e.centerLabel&&u.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),u.insert("rect",":first-child"),{shapeSvg:l,bbox:d,halfPadding:p,label:u}},"labelHelper"),gi=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");o(Fc,"insertPolygonShape")});var Gdt,tCe,rCe=O(()=>{"use strict";kW();xt();jt();$r();wW();Gdt=o(async(t,e)=>{e.useHtmlLabels||Sr(ve())||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await ji(t,e,"node "+e.classes,!0);K.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),gi(e,s),e.intersect=function(l){return Zn.rect(e,l)},n},"note"),tCe=Gdt});function EW(t,e,r,n){let i=[],a=o(l=>{i.push(l,0)},"addBorder"),s=o(l=>{i.push(0,l)},"skipBorder");e.includes("t")?(K.debug("add top border"),a(r)):s(r),e.includes("r")?(K.debug("add right border"),a(n)):s(n),e.includes("b")?(K.debug("add bottom border"),a(r)):s(r),e.includes("l")?(K.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}var nCe,sl,iCe,Vdt,qdt,Udt,Wdt,Hdt,Ydt,jdt,Xdt,Kdt,Qdt,Zdt,Jdt,ept,tpt,rpt,npt,ipt,apt,spt,aCe,opt,lpt,sCe,T_,SW,oCe,lCe=O(()=>{"use strict";Ar();jt();$r();xt();qSe();v_();wW();rCe();kW();nCe=o(t=>t?" "+t:"","formatClass"),sl=o((t,e)=>`${e||"node default"}${nCe(t.classes)} ${nCe(t.class)}`,"getClassesFromNode"),iCe=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,l=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];K.info("Question main (Circle)");let u=Fc(r,s,s,l);return u.attr("style",e.style),gi(e,u),e.intersect=function(h){return K.warn("Intersect called"),Zn.polygon(e,l,h)},r},"question"),Vdt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return Zn.circle(e,14,s)},r},"choice"),qdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,l=n.width+2*s+e.padding,u=[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],h=Fc(r,l,a,u);return h.attr("style",e.style),gi(e,h),e.intersect=function(f){return Zn.polygon(e,u,f)},r},"hexagon"),Udt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,l=n.width+2*s+e.padding,u=VSe(e.directions,n,e),h=Fc(r,l,a,u);return h.attr("style",e.style),gi(e,h),e.intersect=function(f){return Zn.polygon(e,u,f)},r},"block_arrow"),Wdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Fc(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(u){return Zn.polygon(e,s,u)},r},"rect_left_inv_arrow"),Hdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],l=Fc(r,i,a,s);return l.attr("style",e.style),gi(e,l),e.intersect=function(u){return Zn.polygon(e,s,u)},r},"lean_right"),Ydt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],l=Fc(r,i,a,s);return l.attr("style",e.style),gi(e,l),e.intersect=function(u){return Zn.polygon(e,s,u)},r},"lean_left"),jdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],l=Fc(r,i,a,s);return l.attr("style",e.style),gi(e,l),e.intersect=function(u){return Zn.polygon(e,s,u)},r},"trapezoid"),Xdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],l=Fc(r,i,a,s);return l.attr("style",e.style),gi(e,l),e.intersect=function(u){return Zn.polygon(e,s,u)},r},"inv_trapezoid"),Kdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],l=Fc(r,i,a,s);return l.attr("style",e.style),gi(e,l),e.intersect=function(u){return Zn.polygon(e,s,u)},r},"rect_right_inv_arrow"),Qdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),l=n.height+s+e.padding,u="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+l+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-l,h=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",u).attr("transform","translate("+-i/2+","+-(l/2+s)+")");return gi(e,h),e.intersect=function(f){let d=Zn.rect(e,f),p=d.x-e.x;if(a!=0&&(Math.abs(p)e.height/2-s)){let m=s*s*(1-p*p/(a*a));m!=0&&(m=Math.sqrt(m)),m=s-m,f.y-e.y>0&&(m=-m),d.y+=m}return d},r},"cylinder"),Zdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await ji(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(EW(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{K.warn(`Unknown node property ${d}`)})}return gi(e,a),e.intersect=function(f){return Zn.rect(e,f)},r},"rect"),Jdt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await ji(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(EW(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{K.warn(`Unknown node property ${d}`)})}return gi(e,a),e.intersect=function(f){return Zn.rect(e,f)},r},"composite"),ept=o(async(t,e)=>{let{shapeSvg:r}=await ji(t,e,"label",!0);K.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(EW(n,e.props.borders,i,a),s.delete("borders")),s.forEach(l=>{K.warn(`Unknown node property ${l}`)})}return gi(e,n),e.intersect=function(s){return Zn.rect(e,s)},r},"labelRect");o(EW,"applyNodePropertyBorders");tpt=o(async(t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),l=e.labelText.flat?e.labelText.flat():e.labelText,u="";typeof l=="object"?u=l[0]:u=l,K.info("Label text abc79",u,l,typeof l=="object");let h=await Lo(s,u,e.labelStyle,!0,!0),f={width:0,height:0};if(Sr(ve())){let y=h.children[0],v=je(h);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}K.info("Text 2",l);let d=l.slice(1,l.length),p=h.getBBox(),m=await Lo(s,d.join?d.join("
    "):d,e.labelStyle,!0,!0);if(Sr(ve())){let y=m.children[0],v=je(m);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}let g=e.padding/2;return je(m).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+g+5)+")"),je(h).attr("transform","translate( "+(f.width{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return gi(e,s),e.intersect=function(l){return Zn.rect(e,l)},r},"stadium"),npt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await ji(t,e,sl(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),K.info("Circle main"),gi(e,a),e.intersect=function(s){return K.info("Circle intersect",e,n.width/2+i,s),Zn.circle(e,n.width/2+i,s)},r},"circle"),ipt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await ji(t,e,sl(e,void 0),!0),a=5,s=r.insert("g",":first-child"),l=s.insert("circle"),u=s.insert("circle");return s.attr("class",e.class),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),u.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),K.info("DoubleCircle main"),gi(e,l),e.intersect=function(h){return K.info("DoubleCircle intersect",e,n.width/2+i+a,h),Zn.circle(e,n.width/2+i+a,h)},r},"doublecircle"),apt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await ji(t,e,sl(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],l=Fc(r,i,a,s);return l.attr("style",e.style),gi(e,l),e.intersect=function(u){return Zn.polygon(e,s,u)},r},"subroutine"),spt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),gi(e,n),e.intersect=function(i){return Zn.circle(e,7,i)},r},"start"),aCe=o((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return gi(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(l){return Zn.rect(e,l)},n},"forkJoin"),opt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),gi(e,i),e.intersect=function(a){return Zn.circle(e,7,a)},r},"end"),lpt=o(async(t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=s.insert("rect",":first-child"),u=s.insert("line"),h=s.insert("line"),f=0,d=n,p=s.insert("g").attr("class","label"),m=0,g=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",v=await Lo(p,y,e.labelStyle,!0,!0),x=v.getBBox();if(Sr(ve())){let A=v.children[0],L=je(v);x=A.getBoundingClientRect(),L.attr("width",x.width),L.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+n,f+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(Sr(ve())?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let T=await Lo(p,b,e.labelStyle,!0,!0);je(T).attr("class","classTitle");let E=T.getBBox();if(Sr(ve())){let A=T.children[0],L=je(T);E=A.getBoundingClientRect(),L.attr("width",E.width),L.attr("height",E.height)}d+=E.height+n,E.width>f&&(f=E.width);let w=[];e.classData.members.forEach(async A=>{let L=A.getDisplayDetails(),I=L.displayText;Sr(ve())&&(I=I.replace(//g,">"));let N=await Lo(p,I,L.cssStyle?L.cssStyle:e.labelStyle,!0,!0),C=N.getBBox();if(Sr(ve())){let _=N.children[0],D=je(N);C=_.getBoundingClientRect(),D.attr("width",C.width),D.attr("height",C.height)}C.width>f&&(f=C.width),d+=C.height+n,w.push(N)}),d+=i;let k=[];if(e.classData.methods.forEach(async A=>{let L=A.getDisplayDetails(),I=L.displayText;Sr(ve())&&(I=I.replace(//g,">"));let N=await Lo(p,I,L.cssStyle?L.cssStyle:e.labelStyle,!0,!0),C=N.getBBox();if(Sr(ve())){let _=N.children[0],D=je(N);C=_.getBoundingClientRect(),D.attr("width",C.width),D.attr("height",C.height)}C.width>f&&(f=C.width),d+=C.height+n,k.push(N)}),d+=i,g){let A=(f-x.width)/2;je(v).attr("transform","translate( "+(-1*f/2+A)+", "+-1*d/2+")"),m=x.height+n}let S=(f-E.width)/2;return je(T).attr("transform","translate( "+(-1*f/2+S)+", "+(-1*d/2+m)+")"),m+=E.height+n,u.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,w.forEach(A=>{je(A).attr("transform","translate( "+-f/2+", "+(-1*d/2+m+i/2)+")");let L=A?.getBBox();m+=(L?.height??0)+n}),m+=i,h.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,k.forEach(A=>{je(A).attr("transform","translate( "+-f/2+", "+(-1*d/2+m)+")");let L=A?.getBBox();m+=(L?.height??0)+n}),l.attr("style",e.style).attr("class","outer title-state").attr("x",-f/2-r).attr("y",-(d/2)-r).attr("width",f+e.padding).attr("height",d+e.padding),gi(e,l),e.intersect=function(A){return Zn.rect(e,A)},s},"class_box"),sCe={rhombus:iCe,composite:Jdt,question:iCe,rect:Zdt,labelRect:ept,rectWithTitle:tpt,choice:Vdt,circle:npt,doublecircle:ipt,stadium:rpt,hexagon:qdt,block_arrow:Udt,rect_left_inv_arrow:Wdt,lean_right:Hdt,lean_left:Ydt,trapezoid:jdt,inv_trapezoid:Xdt,rect_right_inv_arrow:Kdt,cylinder:Qdt,start:spt,end:opt,note:tCe,subroutine:apt,fork:aCe,join:aCe,class_box:lpt},T_={},SW=o(async(t,e,r)=>{let n,i;if(e.link){let a;ve().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await sCe[e.shape](n,e,r)}else i=await sCe[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),T_[e.id]=n,e.haveCallback&&T_[e.id].attr("class",T_[e.id].attr("class")+" clickable"),n},"insertNode"),oCe=o(t=>{let e=T_[t.id];K.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function cCe(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",l;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",l=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let u=RN(n?.styles??[]),h=n.label,f=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:u.labelStyle,shape:s,labelText:h,rx:a,ry:a,class:i,style:u.style,id:n.id,directions:n.directions,width:f.width,height:f.height,x:f.x,y:f.y,positioned:r,intersect:void 0,type:n.type,padding:l??Zt()?.block?.padding??0}}async function cpt(t,e,r){let n=cCe(e,r,!1);if(n.type==="group")return;let i=Zt(),a=await SW(t,n,{config:i}),s=a.node().getBBox(),l=r.getBlock(n.id);l.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(l),a.remove()}async function upt(t,e,r){let n=cCe(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=Zt();await SW(t,n,{config:a}),e.intersect=n?.intersect,oCe(n)}}async function CW(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await CW(t,i.children,r,n)}async function uCe(t,e,r){await CW(t,e,r,cpt)}async function hCe(t,e,r){await CW(t,e,r,upt)}async function fCe(t,e,r,n,i){let a=new wn({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let l=n.getBlock(s.start),u=n.getBlock(s.end);if(l?.size&&u?.size){let h=l.size,f=u.size,d=[{x:h.x,y:h.y},{x:h.x+(f.x-h.x)/2,y:h.y+(f.y-h.y)/2},{x:f.x,y:f.y}];zSe(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await FSe(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),$Se({...s,x:d[1].x,y:d[1].y},{originalPath:d}))}}}var dCe=O(()=>{"use strict";Dl();$r();GSe();lCe();ar();o(cCe,"getNodeFromBlock");o(cpt,"calculateBlockSize");o(upt,"insertBlockPositioned");o(CW,"performOperations");o(uCe,"calculateBlockSizes");o(hCe,"insertBlocks");o(fCe,"insertEdges")});var hpt,fpt,pCe,mCe=O(()=>{"use strict";Ar();$r();_Se();xt();Ti();MSe();dCe();hpt=o(function(t,e){return e.db.getClasses()},"getClasses"),fpt=o(async function(t,e,r,n){let{securityLevel:i,block:a}=Zt(),s=n.db,l;i==="sandbox"&&(l=je("#i"+e));let u=i==="sandbox"?je(l.nodes()[0].contentDocument.body):je("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):je(`[id="${e}"]`);ASe(h,["point","circle","cross"],n.type,e);let d=s.getBlocks(),p=s.getBlocksFlat(),m=s.getEdges(),g=h.insert("g").attr("class","block");await uCe(g,d,s);let y=NSe(s);if(await hCe(g,d,s),await fCe(g,m,p,s,e),y){let v=y,x=Math.max(1,Math.round(.125*(v.width/v.height))),b=v.height+x+10,T=v.width+10,{useMaxWidth:E}=a;Zr(h,b,T,!!E),K.debug("Here Bounds",y,v),h.attr("viewBox",`${v.x-5} ${v.y-5} ${v.width+10} ${v.height+10}`)}},"draw"),pCe={draw:fpt,getClasses:hpt}});var gCe={};vr(gCe,{diagram:()=>dpt});var dpt,yCe=O(()=>{"use strict";ySe();ESe();CSe();mCe();dpt={parser:gSe,db:kSe,renderer:pCe,styles:SSe}});var AW,_W,C3,bCe,DW,vs,Zu,A3,TCe,ypt,_3,wCe,kCe,ECe,SCe,CCe,w_,Tp,k_=O(()=>{"use strict";AW={L:"left",R:"right",T:"top",B:"bottom"},_W={L:o(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:o(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:o(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:o(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},C3={L:o((t,e)=>t-e+2,"L"),R:o((t,e)=>t-2,"R"),T:o((t,e)=>t-e+2,"T"),B:o((t,e)=>t-2,"B")},bCe=o(function(t){return vs(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),DW=o(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),vs=o(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),Zu=o(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),A3=o(function(t,e){let r=vs(t)&&Zu(e),n=Zu(t)&&vs(e);return r||n},"isArchitectureDirectionXY"),TCe=o(function(t){let e=t[0],r=t[1],n=vs(e)&&Zu(r),i=Zu(e)&&vs(r);return n||i},"isArchitecturePairXY"),ypt=o(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),_3=o(function(t,e){let r=`${t}${e}`;return ypt(r)?r:void 0},"getArchitectureDirectionPair"),wCe=o(function([t,e],r){let n=r[0],i=r[1];return vs(n)?Zu(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:vs(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),kCe=o(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),ECe=o(function(t,e){return A3(t,e)?"bend":vs(t)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),SCe=o(function(t){return t.type==="service"},"isArchitectureService"),CCe=o(function(t){return t.type==="junction"},"isArchitectureJunction"),w_=o(t=>t.data(),"edgeData"),Tp=o(t=>t.data(),"nodeData")});var vpt,Kv,RW=O(()=>{"use strict";$r();La();ar();si();k_();vpt=gr.architecture,Kv=class{constructor(){this.nodes={};this.groups={};this.edges=[];this.registeredIds={};this.elements={};this.setAccTitle=Lr;this.getAccTitle=Or;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.getAccDescription=Br;this.setAccDescription=Pr;this.clear()}static{o(this,"ArchitectureDB")}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},_r()}addService({id:e,icon:r,in:n,title:i,iconText:a}){if(this.registeredIds[e]!==void 0)throw new Error(`The service id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw new Error(`The service [${e}] cannot be placed within itself`);if(this.registeredIds[n]===void 0)throw new Error(`The service [${e}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[n]==="node")throw new Error(`The service [${e}]'s parent is not a group`)}this.registeredIds[e]="node",this.nodes[e]={id:e,type:"service",icon:r,iconText:a,title:i,edges:[],in:n}}getServices(){return Object.values(this.nodes).filter(SCe)}addJunction({id:e,in:r}){if(this.registeredIds[e]!==void 0)throw new Error(`The junction id [${e}] is already in use by another ${this.registeredIds[e]}`);if(r!==void 0){if(e===r)throw new Error(`The junction [${e}] cannot be placed within itself`);if(this.registeredIds[r]===void 0)throw new Error(`The junction [${e}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[r]==="node")throw new Error(`The junction [${e}]'s parent is not a group`)}this.registeredIds[e]="node",this.nodes[e]={id:e,type:"junction",edges:[],in:r}}getJunctions(){return Object.values(this.nodes).filter(CCe)}getNodes(){return Object.values(this.nodes)}getNode(e){return this.nodes[e]??null}addGroup({id:e,icon:r,in:n,title:i}){if(this.registeredIds?.[e]!==void 0)throw new Error(`The group id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw new Error(`The group [${e}] cannot be placed within itself`);if(this.registeredIds?.[n]===void 0)throw new Error(`The group [${e}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[n]==="node")throw new Error(`The group [${e}]'s parent is not a group`)}this.registeredIds[e]="group",this.groups[e]={id:e,icon:r,title:i,in:n}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:e,rhsId:r,lhsDir:n,rhsDir:i,lhsInto:a,rhsInto:s,lhsGroup:l,rhsGroup:u,title:h}){if(!DW(n))throw new Error(`Invalid direction given for left hand side of edge ${e}--${r}. Expected (L,R,T,B) got ${String(n)}`);if(!DW(i))throw new Error(`Invalid direction given for right hand side of edge ${e}--${r}. Expected (L,R,T,B) got ${String(i)}`);if(this.nodes[e]===void 0&&this.groups[e]===void 0)throw new Error(`The left-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[r]===void 0&&this.groups[r]===void 0)throw new Error(`The right-hand id [${r}] does not yet exist. Please create the service/group before declaring an edge to it.`);let f=this.nodes[e].in,d=this.nodes[r].in;if(l&&f&&d&&f==d)throw new Error(`The left-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(u&&f&&d&&f==d)throw new Error(`The right-hand id [${r}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let p={lhsId:e,lhsDir:n,lhsInto:a,lhsGroup:l,rhsId:r,rhsDir:i,rhsInto:s,rhsGroup:u,title:h};this.edges.push(p),this.nodes[e]&&this.nodes[r]&&(this.nodes[e].edges.push(this.edges[this.edges.length-1]),this.nodes[r].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let e={},r=Object.entries(this.nodes).reduce((u,[h,f])=>(u[h]=f.edges.reduce((d,p)=>{let m=this.getNode(p.lhsId)?.in,g=this.getNode(p.rhsId)?.in;if(m&&g&&m!==g){let y=ECe(p.lhsDir,p.rhsDir);y!=="bend"&&(e[m]??={},e[m][g]=y,e[g]??={},e[g][m]=y)}if(p.lhsId===h){let y=_3(p.lhsDir,p.rhsDir);y&&(d[y]=p.rhsId)}else{let y=_3(p.rhsDir,p.lhsDir);y&&(d[y]=p.lhsId)}return d},{}),u),{}),n=Object.keys(r)[0],i={[n]:1},a=Object.keys(r).reduce((u,h)=>h===n?u:{...u,[h]:1},{}),s=o(u=>{let h={[u]:[0,0]},f=[u];for(;f.length>0;){let d=f.shift();if(d){i[d]=1,delete a[d];let p=r[d],[m,g]=h[d];Object.entries(p).forEach(([y,v])=>{i[v]||(h[v]=wCe([m,g],y),f.push(v))})}}return h},"BFS"),l=[s(n)];for(;Object.keys(a).length>0;)l.push(s(Object.keys(a)[0]));this.dataStructures={adjList:r,spatialMaps:l,groupAlignments:e}}return this.dataStructures}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}getConfig(){return Pn({...vpt,...Zt().architecture})}getConfigField(e){return this.getConfig()[e]}}});var xpt,LW,ACe=O(()=>{"use strict";up();xt();Vm();RW();xpt=o((t,e)=>{ql(t,e),t.groups.map(r=>e.addGroup(r)),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(r=>e.addEdge(r))},"populateDb"),LW={parser:{yy:void 0},parse:o(async t=>{let e=await Us("architecture",t);K.debug(e);let r=LW.parser?.yy;if(!(r instanceof Kv))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");xpt(e,r)},"parse")}});var bpt,_Ce,DCe=O(()=>{"use strict";bpt=o(t=>` - .edge { - stroke-width: ${t.archEdgeWidth}; - stroke: ${t.archEdgeColor}; - fill: none; - } - - .arrow { - fill: ${t.archEdgeArrowColor}; - } - - .node-bkg { - fill: none; - stroke: ${t.archGroupBorderColor}; - stroke-width: ${t.archGroupBorderWidth}; - stroke-dasharray: 8; - } - .node-icon-text { - display: flex; - align-items: center; - } - - .node-icon-text > div { - color: #fff; - margin: 1px; - height: fit-content; - text-align: center; - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - } -`,"getStyles"),_Ce=bpt});var MW=nr((D3,NW)=>{"use strict";o((function(e,r){typeof D3=="object"&&typeof NW=="object"?NW.exports=r():typeof define=="function"&&define.amd?define([],r):typeof D3=="object"?D3.layoutBase=r():e.layoutBase=r()}),"webpackUniversalModuleDefinition")(D3,function(){return(function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)})([(function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s}),(function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(5);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp?(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(p+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(m+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>m?(this.rect.y-=(this.labelHeight-m)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(m+this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h}),(function(t,e,r){"use strict";var n=r(0);function i(){}o(i,"FDLayoutConstants");for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i}),(function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&k>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(k,1);var E=x.source.owner.getEdges().indexOf(x);if(E==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(E,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),E=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,E,w,k,S,A=this.nodes,L=A.length,I=0;IT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var L=0;v.forEach(function(I){I.owner==g&&L++}),L==this.nodes.length&&(this.isConnected=!0)}},t.exports=p}),(function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=A,!1;if(hf)return l[0]=p,l[1]=h,l[2]=k,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,C=!0):(l[0]=g,l[1]=m,C=!0):D===R&&(u>f?(l[0]=p,l[1]=m,C=!0):(l[0]=x,l[1]=v,C=!0)),-M===R?f>u?(l[2]=S,l[3]=A,_=!0):(l[2]=k,l[3]=w,_=!0):M===R&&(f>u?(l[2]=E,l[3]=w,_=!0):(l[2]=L,l[3]=A,_=!0)),C&&_)return!1;if(u>f?h>d?(P=this.getCardinalDirection(D,R,4),B=this.getCardinalDirection(M,R,2)):(P=this.getCardinalDirection(-D,R,3),B=this.getCardinalDirection(-M,R,1)):h>d?(P=this.getCardinalDirection(-D,R,1),B=this.getCardinalDirection(-M,R,3)):(P=this.getCardinalDirection(D,R,2),B=this.getCardinalDirection(M,R,4)),!C)switch(P){case 1:G=m,F=u+-T/R,l[0]=F,l[1]=G;break;case 2:F=x,G=h+b*R,l[0]=F,l[1]=G;break;case 3:G=v,F=u+T/R,l[0]=F,l[1]=G;break;case 4:F=y,G=h+-b*R,l[0]=F,l[1]=G;break}if(!_)switch(B){case 1:V=w,$=f+-N/R,l[2]=$,l[3]=V;break;case 2:$=L,V=d+I*R,l[2]=$,l[3]=V;break;case 3:V=A,$=f+N/R,l[2]=$,l[3]=V;break;case 4:$=S,V=d+-I*R,l[2]=$,l[3]=V;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,E=void 0,w=void 0,k=void 0,S=void 0,A=void 0,L=void 0;return T=p-f,w=h-d,S=d*f-h*p,E=v-g,k=m-y,A=y*g-m*v,L=T*k-E*w,L===0?null:(x=(w*A-k*S)/L,b=(E*S-T*A)/L,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l=0){var v=(-m+Math.sqrt(m*m-4*p*g))/(2*p),x=(-m-Math.sqrt(m*m-4*p*g))/(2*p),b=null;return v>=0&&v<=1?[v]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i}),(function(t,e,r){"use strict";function n(){}o(n,"IMath"),n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n}),(function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i}),(function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var k=T[0];T.splice(0,1),b.add(k);for(var S=k.getEdges(),x=0;x-1&&w.splice(N,1)}b=new Set,E=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(A,1);var L=E.getNeighborsList();L.forEach(function(C){if(y.indexOf(C)<0){var _=v.get(C),D=_-1;D==1&&k.push(C),v.set(C,D)}})}y=y.concat(k),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p}),(function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n}),(function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i}),(function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var E=0;Eh},"_defaultCompareFunction")}]),l})();t.exports=s}),(function(t,e,r){"use strict";function n(){}o(n,"SVD"),n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=(function(Rt){for(var it=[];Rt-- >0;)it.push(0);return it})(Math.min(this.m+1,this.n)),this.U=(function(Rt){var it=o(function at(Ct){if(Ct.length==0)return 0;for(var yt=[],dt=0;dt0;)it.push(0);return it})(this.n),l=(function(Rt){for(var it=[];Rt-- >0;)it.push(0);return it})(this.m),u=!0,h=!0,f=Math.min(this.m-1,this.n),d=Math.max(0,Math.min(this.n-2,this.m)),p=0;p=0;R--)if(this.s[R]!==0){for(var P=R+1;P=0;Q--){if((function(Rt,it){return Rt&&it})(Q0;){var de=void 0,Se=void 0;for(de=_-2;de>=-1&&de!==-1;de--)if(Math.abs(s[de])<=xe+Z*(Math.abs(this.s[de])+Math.abs(this.s[de+1]))){s[de]=0;break}if(de===_-2)Se=4;else{var Me=void 0;for(Me=_-1;Me>=de&&Me!==de;Me--){var ke=(Me!==_?Math.abs(s[Me]):0)+(Me!==de+1?Math.abs(s[Me-1]):0);if(Math.abs(this.s[Me])<=xe+Z*ke){this.s[Me]=0;break}}Me===de?Se=3:Me===_-1?Se=1:(Se=2,de=Me)}switch(de++,Se){case 1:{var we=s[_-2];s[_-2]=0;for(var _e=_-2;_e>=de;_e--){var $e=n.hypot(this.s[_e],we),fe=this.s[_e]/$e,Ke=we/$e;if(this.s[_e]=$e,_e!==de&&(we=-Ke*s[_e-1],s[_e-1]=fe*s[_e-1]),h)for(var Te=0;Te=this.s[de+1]);){var ot=this.s[de];if(this.s[de]=this.s[de+1],this.s[de+1]=ot,h&&deMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o((function(e,r){typeof R3=="object"&&typeof IW=="object"?IW.exports=r(MW()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof R3=="object"?R3.coseBase=r(MW()):e.coseBase=r(e.layoutBase)}),"webpackUniversalModuleDefinition")(R3,function(t){return(()=>{"use strict";var e={45:((a,s,l)=>{var u={};u.layoutBase=l(551),u.CoSEConstants=l(806),u.CoSEEdge=l(767),u.CoSEGraph=l(880),u.CoSEGraphManager=l(578),u.CoSELayout=l(765),u.CoSENode=l(991),u.ConstraintHandler=l(902),a.exports=u}),806:((a,s,l)=>{var u=l(551).FDLayoutConstants;function h(){}o(h,"CoSEConstants");for(var f in u)h[f]=u[f];h.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,h.DEFAULT_RADIAL_SEPARATION=u.DEFAULT_EDGE_LENGTH,h.DEFAULT_COMPONENT_SEPERATION=60,h.TILE=!0,h.TILING_PADDING_VERTICAL=10,h.TILING_PADDING_HORIZONTAL=10,h.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,h.ENFORCE_CONSTRAINTS=!0,h.APPLY_LAYOUT=!0,h.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,h.TREE_REDUCTION_ON_INCREMENTAL=!0,h.PURE_INCREMENTAL=h.DEFAULT_INCREMENTAL,a.exports=h}),767:((a,s,l)=>{var u=l(551).FDLayoutEdge;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEEdge"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),880:((a,s,l)=>{var u=l(551).LGraph;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEGraph"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),578:((a,s,l)=>{var u=l(551).LGraphManager;function h(d){u.call(this,d)}o(h,"CoSEGraphManager"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),765:((a,s,l)=>{var u=l(551).FDLayout,h=l(578),f=l(880),d=l(991),p=l(767),m=l(806),g=l(902),y=l(551).FDLayoutConstants,v=l(551).LayoutConstants,x=l(551).Point,b=l(551).PointD,T=l(551).DimensionD,E=l(551).Layout,w=l(551).Integer,k=l(551).IGeometry,S=l(551).LGraph,A=l(551).Transform,L=l(551).LinkedList;function I(){u.call(this),this.toBeTiled={},this.constraints={}}o(I,"CoSELayout"),I.prototype=Object.create(u.prototype);for(var N in u)I[N]=u[N];I.prototype.newGraphManager=function(){var C=new h(this);return this.graphManager=C,C},I.prototype.newGraph=function(C){return new f(null,this.graphManager,C)},I.prototype.newNode=function(C){return new d(this.graphManager,C)},I.prototype.newEdge=function(C){return new p(null,null,C)},I.prototype.initParameters=function(){u.prototype.initParameters.call(this,arguments),this.isSubLayout||(m.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=m.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=m.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=y.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=y.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=y.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},I.prototype.initSpringEmbedder=function(){u.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/y.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},I.prototype.layout=function(){var C=v.DEFAULT_CREATE_BENDS_AS_NEEDED;return C&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},I.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(m.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var _=new Set(this.getAllNodes()),D=this.nodesWithGravity.filter(function(P){return _.has(P)});this.graphManager.setAllNodesToApplyGravitation(D)}}else{var C=this.getFlatForest();if(C.length>0)this.positionNodesRadially(C);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var _=new Set(this.getAllNodes()),D=this.nodesWithGravity.filter(function(M){return _.has(M)});this.graphManager.setAllNodesToApplyGravitation(D),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),m.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},I.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%y.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var C=new Set(this.getAllNodes()),_=this.nodesWithGravity.filter(function(R){return C.has(R)});this.graphManager.setAllNodesToApplyGravitation(_),this.graphManager.updateBounds(),this.updateGrid(),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var D=!this.isTreeGrowing&&!this.isGrowthFinished,M=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(D,M),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},I.prototype.getPositionsData=function(){for(var C=this.graphManager.getAllNodes(),_={},D=0;D0&&this.updateDisplacements();for(var D=0;D0&&(M.fixedNodeWeight=P)}}if(this.constraints.relativePlacementConstraint){var B=new Map,F=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(Y){C.fixedNodesOnHorizontal.add(Y),C.fixedNodesOnVertical.add(Y)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var G=this.constraints.alignmentConstraint.vertical,D=0;D=2*Y.length/3;J--)le=Math.floor(Math.random()*(J+1)),ee=Y[J],Y[J]=Y[le],Y[le]=ee;return Y},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(Y){if(Y.left){var le=B.has(Y.left)?B.get(Y.left):Y.left,ee=B.has(Y.right)?B.get(Y.right):Y.right;C.nodesInRelativeHorizontal.includes(le)||(C.nodesInRelativeHorizontal.push(le),C.nodeToRelativeConstraintMapHorizontal.set(le,[]),C.dummyToNodeForVerticalAlignment.has(le)?C.nodeToTempPositionMapHorizontal.set(le,C.idToNodeMap.get(C.dummyToNodeForVerticalAlignment.get(le)[0]).getCenterX()):C.nodeToTempPositionMapHorizontal.set(le,C.idToNodeMap.get(le).getCenterX())),C.nodesInRelativeHorizontal.includes(ee)||(C.nodesInRelativeHorizontal.push(ee),C.nodeToRelativeConstraintMapHorizontal.set(ee,[]),C.dummyToNodeForVerticalAlignment.has(ee)?C.nodeToTempPositionMapHorizontal.set(ee,C.idToNodeMap.get(C.dummyToNodeForVerticalAlignment.get(ee)[0]).getCenterX()):C.nodeToTempPositionMapHorizontal.set(ee,C.idToNodeMap.get(ee).getCenterX())),C.nodeToRelativeConstraintMapHorizontal.get(le).push({right:ee,gap:Y.gap}),C.nodeToRelativeConstraintMapHorizontal.get(ee).push({left:le,gap:Y.gap})}else{var J=F.has(Y.top)?F.get(Y.top):Y.top,te=F.has(Y.bottom)?F.get(Y.bottom):Y.bottom;C.nodesInRelativeVertical.includes(J)||(C.nodesInRelativeVertical.push(J),C.nodeToRelativeConstraintMapVertical.set(J,[]),C.dummyToNodeForHorizontalAlignment.has(J)?C.nodeToTempPositionMapVertical.set(J,C.idToNodeMap.get(C.dummyToNodeForHorizontalAlignment.get(J)[0]).getCenterY()):C.nodeToTempPositionMapVertical.set(J,C.idToNodeMap.get(J).getCenterY())),C.nodesInRelativeVertical.includes(te)||(C.nodesInRelativeVertical.push(te),C.nodeToRelativeConstraintMapVertical.set(te,[]),C.dummyToNodeForHorizontalAlignment.has(te)?C.nodeToTempPositionMapVertical.set(te,C.idToNodeMap.get(C.dummyToNodeForHorizontalAlignment.get(te)[0]).getCenterY()):C.nodeToTempPositionMapVertical.set(te,C.idToNodeMap.get(te).getCenterY())),C.nodeToRelativeConstraintMapVertical.get(J).push({bottom:te,gap:Y.gap}),C.nodeToRelativeConstraintMapVertical.get(te).push({top:J,gap:Y.gap})}});else{var V=new Map,X=new Map;this.constraints.relativePlacementConstraint.forEach(function(Y){if(Y.left){var le=B.has(Y.left)?B.get(Y.left):Y.left,ee=B.has(Y.right)?B.get(Y.right):Y.right;V.has(le)?V.get(le).push(ee):V.set(le,[ee]),V.has(ee)?V.get(ee).push(le):V.set(ee,[le])}else{var J=F.has(Y.top)?F.get(Y.top):Y.top,te=F.has(Y.bottom)?F.get(Y.bottom):Y.bottom;X.has(J)?X.get(J).push(te):X.set(J,[te]),X.has(te)?X.get(te).push(J):X.set(te,[J])}});var Q=o(function(le,ee){var J=[],te=[],Z=new L,xe=new Set,de=0;return le.forEach(function(Se,Me){if(!xe.has(Me)){J[de]=[],te[de]=!1;var ke=Me;for(Z.push(ke),xe.add(ke),J[de].push(ke);Z.length!=0;){ke=Z.shift(),ee.has(ke)&&(te[de]=!0);var we=le.get(ke);we.forEach(function(_e){xe.has(_e)||(Z.push(_e),xe.add(_e),J[de].push(_e))})}de++}}),{components:J,isFixed:te}},"constructComponents"),H=Q(V,C.fixedNodesOnHorizontal);this.componentsOnHorizontal=H.components,this.fixedComponentsOnHorizontal=H.isFixed;var ie=Q(X,C.fixedNodesOnVertical);this.componentsOnVertical=ie.components,this.fixedComponentsOnVertical=ie.isFixed}}},I.prototype.updateDisplacements=function(){var C=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(ie){var Y=C.idToNodeMap.get(ie.nodeId);Y.displacementX=0,Y.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var _=this.constraints.alignmentConstraint.vertical,D=0;D<_.length;D++){for(var M=0,R=0;R<_[D].length;R++){if(this.fixedNodeSet.has(_[D][R])){M=0;break}M+=this.idToNodeMap.get(_[D][R]).displacementX}for(var P=M/_[D].length,R=0;R<_[D].length;R++)this.idToNodeMap.get(_[D][R]).displacementX=P}if(this.constraints.alignmentConstraint.horizontal)for(var B=this.constraints.alignmentConstraint.horizontal,D=0;D1){var F;for(F=0;FM&&(M=Math.floor(B.y)),P=Math.floor(B.x+m.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(v.WORLD_CENTER_X-B.x/2,v.WORLD_CENTER_Y-B.y/2))},I.radialLayout=function(C,_,D){var M=Math.max(this.maxDiagonalInTree(C),m.DEFAULT_RADIAL_SEPARATION);I.branchRadialLayout(_,null,0,359,0,M);var R=S.calculateBounds(C),P=new A;P.setDeviceOrgX(R.getMinX()),P.setDeviceOrgY(R.getMinY()),P.setWorldOrgX(D.x),P.setWorldOrgY(D.y);for(var B=0;B1;){var J=ee[0];ee.splice(0,1);var te=Q.indexOf(J);te>=0&&Q.splice(te,1),Y--,H--}_!=null?le=(Q.indexOf(ee[0])+1)%Y:le=0;for(var Z=Math.abs(M-D)/H,xe=le;ie!=H;xe=++xe%Y){var de=Q[xe].getOtherEnd(C);if(de!=_){var Se=(D+ie*Z)%360,Me=(Se+Z)%360;I.branchRadialLayout(de,C,Se,Me,R+P,P),ie++}}},I.maxDiagonalInTree=function(C){for(var _=w.MIN_VALUE,D=0;D_&&(_=R)}return _},I.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},I.prototype.groupZeroDegreeMembers=function(){var C=this,_={};this.memberGroups={},this.idToDummyNode={};for(var D=[],M=this.graphManager.getAllNodes(),R=0;R"u"&&(_[F]=[]),_[F]=_[F].concat(P)}Object.keys(_).forEach(function(G){if(_[G].length>1){var $="DummyCompound_"+G;C.memberGroups[$]=_[G];var V=_[G][0].getParent(),X=new d(C.graphManager);X.id=$,X.paddingLeft=V.paddingLeft||0,X.paddingRight=V.paddingRight||0,X.paddingBottom=V.paddingBottom||0,X.paddingTop=V.paddingTop||0,C.idToDummyNode[$]=X;var Q=C.getGraphManager().add(C.newGraph(),X),H=V.getChild();H.add(X);for(var ie=0;ie<_[G].length;ie++){var Y=_[G][ie];H.remove(Y),Q.add(Y)}}})},I.prototype.clearCompounds=function(){var C={},_={};this.performDFSOnCompounds();for(var D=0;DR?(M.rect.x-=(M.labelWidth-R)/2,M.setWidth(M.labelWidth),M.labelMarginLeft=(M.labelWidth-R)/2):M.labelPosHorizontal=="right"&&M.setWidth(R+M.labelWidth)),M.labelHeight&&(M.labelPosVertical=="top"?(M.rect.y-=M.labelHeight,M.setHeight(P+M.labelHeight),M.labelMarginTop=M.labelHeight):M.labelPosVertical=="center"&&M.labelHeight>P?(M.rect.y-=(M.labelHeight-P)/2,M.setHeight(M.labelHeight),M.labelMarginTop=(M.labelHeight-P)/2):M.labelPosVertical=="bottom"&&M.setHeight(P+M.labelHeight))}})},I.prototype.repopulateCompounds=function(){for(var C=this.compoundOrder.length-1;C>=0;C--){var _=this.compoundOrder[C],D=_.id,M=_.paddingLeft,R=_.paddingTop,P=_.labelMarginLeft,B=_.labelMarginTop;this.adjustLocations(this.tiledMemberPack[D],_.rect.x,_.rect.y,M,R,P,B)}},I.prototype.repopulateZeroDegreeMembers=function(){var C=this,_=this.tiledZeroDegreePack;Object.keys(_).forEach(function(D){var M=C.idToDummyNode[D],R=M.paddingLeft,P=M.paddingTop,B=M.labelMarginLeft,F=M.labelMarginTop;C.adjustLocations(_[D],M.rect.x,M.rect.y,R,P,B,F)})},I.prototype.getToBeTiled=function(C){var _=C.id;if(this.toBeTiled[_]!=null)return this.toBeTiled[_];var D=C.getChild();if(D==null)return this.toBeTiled[_]=!1,!1;for(var M=D.getNodes(),R=0;R0)return this.toBeTiled[_]=!1,!1;if(P.getChild()==null){this.toBeTiled[P.id]=!1;continue}if(!this.getToBeTiled(P))return this.toBeTiled[_]=!1,!1}return this.toBeTiled[_]=!0,!0},I.prototype.getNodeDegree=function(C){for(var _=C.id,D=C.getEdges(),M=0,R=0;RV&&(V=Q.rect.height)}D+=V+C.verticalPadding}},I.prototype.tileCompoundMembers=function(C,_){var D=this;this.tiledMemberPack=[],Object.keys(C).forEach(function(M){var R=_[M];if(D.tiledMemberPack[M]=D.tileNodes(C[M],R.paddingLeft+R.paddingRight),R.rect.width=D.tiledMemberPack[M].width,R.rect.height=D.tiledMemberPack[M].height,R.setCenter(D.tiledMemberPack[M].centerX,D.tiledMemberPack[M].centerY),R.labelMarginLeft=0,R.labelMarginTop=0,m.NODE_DIMENSIONS_INCLUDE_LABELS){var P=R.rect.width,B=R.rect.height;R.labelWidth&&(R.labelPosHorizontal=="left"?(R.rect.x-=R.labelWidth,R.setWidth(P+R.labelWidth),R.labelMarginLeft=R.labelWidth):R.labelPosHorizontal=="center"&&R.labelWidth>P?(R.rect.x-=(R.labelWidth-P)/2,R.setWidth(R.labelWidth),R.labelMarginLeft=(R.labelWidth-P)/2):R.labelPosHorizontal=="right"&&R.setWidth(P+R.labelWidth)),R.labelHeight&&(R.labelPosVertical=="top"?(R.rect.y-=R.labelHeight,R.setHeight(B+R.labelHeight),R.labelMarginTop=R.labelHeight):R.labelPosVertical=="center"&&R.labelHeight>B?(R.rect.y-=(R.labelHeight-B)/2,R.setHeight(R.labelHeight),R.labelMarginTop=(R.labelHeight-B)/2):R.labelPosVertical=="bottom"&&R.setHeight(B+R.labelHeight))}})},I.prototype.tileNodes=function(C,_){var D=this.tileNodesByFavoringDim(C,_,!0),M=this.tileNodesByFavoringDim(C,_,!1),R=this.getOrgRatio(D),P=this.getOrgRatio(M),B;return PF&&(F=ie.getWidth())});var G=P/R,$=B/R,V=Math.pow(D-M,2)+4*(G+M)*($+D)*R,X=(M-D+Math.sqrt(V))/(2*(G+M)),Q;_?(Q=Math.ceil(X),Q==X&&Q++):Q=Math.floor(X);var H=Q*(G+M)-M;return F>H&&(H=F),H+=M*2,H},I.prototype.tileNodesByFavoringDim=function(C,_,D){var M=m.TILING_PADDING_VERTICAL,R=m.TILING_PADDING_HORIZONTAL,P=m.TILING_COMPARE_BY,B={rows:[],rowWidth:[],rowHeight:[],width:0,height:_,verticalPadding:M,horizontalPadding:R,centerX:0,centerY:0};P&&(B.idealRowWidth=this.calcIdealRowWidth(C,D));var F=o(function(Y){return Y.rect.width*Y.rect.height},"getNodeArea"),G=o(function(Y,le){return F(le)-F(Y)},"areaCompareFcn");C.sort(function(ie,Y){var le=G;return B.idealRowWidth?(le=P,le(ie.id,Y.id)):le(ie,Y)});for(var $=0,V=0,X=0;X0&&(B+=C.horizontalPadding),C.rowWidth[D]=B,C.width0&&(F+=C.verticalPadding);var G=0;F>C.rowHeight[D]&&(G=C.rowHeight[D],C.rowHeight[D]=F,G=C.rowHeight[D]-G),C.height+=G,C.rows[D].push(_)},I.prototype.getShortestRowIndex=function(C){for(var _=-1,D=Number.MAX_VALUE,M=0;MD&&(_=M,D=C.rowWidth[M]);return _},I.prototype.canAddHorizontal=function(C,_,D){if(C.idealRowWidth){var M=C.rows.length-1,R=C.rowWidth[M];return R+_+C.horizontalPadding<=C.idealRowWidth}var P=this.getShortestRowIndex(C);if(P<0)return!0;var B=C.rowWidth[P];if(B+C.horizontalPadding+_<=C.width)return!0;var F=0;C.rowHeight[P]0&&(F=D+C.verticalPadding-C.rowHeight[P]);var G;C.width-B>=_+C.horizontalPadding?G=(C.height+F)/(B+_+C.horizontalPadding):G=(C.height+F)/C.width,F=D+C.verticalPadding;var $;return C.width<_?$=(C.height+F)/_:$=(C.height+F)/C.width,$<1&&($=1/$),G<1&&(G=1/G),G<$},I.prototype.shiftToLastRow=function(C){var _=this.getLongestRowIndex(C),D=C.rowWidth.length-1,M=C.rows[_],R=M[M.length-1],P=R.width+C.horizontalPadding;if(C.width-C.rowWidth[D]>P&&_!=D){M.splice(-1,1),C.rows[D].push(R),C.rowWidth[_]=C.rowWidth[_]-P,C.rowWidth[D]=C.rowWidth[D]+P,C.width=C.rowWidth[instance.getLongestRowIndex(C)];for(var B=Number.MIN_VALUE,F=0;FB&&(B=M[F].height);_>0&&(B+=C.verticalPadding);var G=C.rowHeight[_]+C.rowHeight[D];C.rowHeight[_]=B,C.rowHeight[D]0)for(var H=R;H<=P;H++)Q[0]+=this.grid[H][B-1].length+this.grid[H][B].length-1;if(P0)for(var H=B;H<=F;H++)Q[3]+=this.grid[R-1][H].length+this.grid[R][H].length-1;for(var ie=w.MAX_VALUE,Y,le,ee=0;ee{var u=l(551).FDLayoutNode,h=l(551).IMath;function f(p,m,g,y){u.call(this,p,m,g,y)}o(f,"CoSENode"),f.prototype=Object.create(u.prototype);for(var d in u)f[d]=u[d];f.prototype.calculateDisplacement=function(){var p=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementX=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementX)),Math.abs(this.displacementY)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementY=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},f.prototype.propogateDisplacementToChildren=function(p,m){for(var g=this.getChild().getNodes(),y,v=0;v{function u(g){if(Array.isArray(g)){for(var y=0,v=Array(g.length);y0){var et=0;oe.forEach(function(ot){ce=="horizontal"?(me.set(ot,x.has(ot)?b[x.get(ot)]:ne.get(ot)),et+=me.get(ot)):(me.set(ot,x.has(ot)?T[x.get(ot)]:ne.get(ot)),et+=me.get(ot))}),et=et/oe.length,Xe.forEach(function(ot){z.has(ot)||me.set(ot,et)})}else{var he=0;Xe.forEach(function(ot){ce=="horizontal"?he+=x.has(ot)?b[x.get(ot)]:ne.get(ot):he+=x.has(ot)?T[x.get(ot)]:ne.get(ot)}),he=he/Xe.length,Xe.forEach(function(ot){me.set(ot,he)})}});for(var Ie=o(function(){var oe=ge.shift(),et=U.get(oe);et.forEach(function(he){if(me.get(he.id)ot&&(ot=yt),dtDt&&(Dt=dt)}}catch(_n){wt=!0,Rt=_n}finally{try{!It&&it.return&&it.return()}finally{if(wt)throw Rt}}var Ht=(et+ot)/2-(he+Dt)/2,cr=!0,Kt=!1,kr=void 0;try{for(var ur=Xe[Symbol.iterator](),tr;!(cr=(tr=ur.next()).done);cr=!0){var hr=tr.value;me.set(hr,me.get(hr)+Ht)}}catch(_n){Kt=!0,kr=_n}finally{try{!cr&&ur.return&&ur.return()}finally{if(Kt)throw kr}}})}return me},"findAppropriatePositionForRelativePlacement"),N=o(function(U){var ce=0,z=0,ne=0,se=0;if(U.forEach(function(Re){Re.left?b[x.get(Re.left)]-b[x.get(Re.right)]>=0?ce++:z++:T[x.get(Re.top)]-T[x.get(Re.bottom)]>=0?ne++:se++}),ce>z&&ne>se)for(var be=0;bez)for(var pe=0;pese)for(var me=0;me1)y.fixedNodeConstraint.forEach(function(ae,U){M[U]=[ae.position.x,ae.position.y],R[U]=[b[x.get(ae.nodeId)],T[x.get(ae.nodeId)]]}),P=!0;else if(y.alignmentConstraint)(function(){var ae=0;if(y.alignmentConstraint.vertical){for(var U=y.alignmentConstraint.vertical,ce=o(function(me){var Re=new Set;U[me].forEach(function(qe){Re.add(qe)});var ge=new Set([].concat(u(Re)).filter(function(qe){return F.has(qe)})),Ie=void 0;ge.size>0?Ie=b[x.get(ge.values().next().value)]:Ie=L(Re).x,U[me].forEach(function(qe){M[ae]=[Ie,T[x.get(qe)]],R[ae]=[b[x.get(qe)],T[x.get(qe)]],ae++})},"_loop2"),z=0;z0?Ie=b[x.get(ge.values().next().value)]:Ie=L(Re).y,ne[me].forEach(function(qe){M[ae]=[b[x.get(qe)],Ie],R[ae]=[b[x.get(qe)],T[x.get(qe)]],ae++})},"_loop3"),be=0;beX&&(X=V[H].length,Q=H);if(X<$.size/2)N(y.relativePlacementConstraint),P=!1,B=!1;else{var ie=new Map,Y=new Map,le=[];V[Q].forEach(function(ae){G.get(ae).forEach(function(U){U.direction=="horizontal"?(ie.has(ae)?ie.get(ae).push(U):ie.set(ae,[U]),ie.has(U.id)||ie.set(U.id,[]),le.push({left:ae,right:U.id})):(Y.has(ae)?Y.get(ae).push(U):Y.set(ae,[U]),Y.has(U.id)||Y.set(U.id,[]),le.push({top:ae,bottom:U.id}))})}),N(le),B=!1;var ee=I(ie,"horizontal"),J=I(Y,"vertical");V[Q].forEach(function(ae,U){R[U]=[b[x.get(ae)],T[x.get(ae)]],M[U]=[],ee.has(ae)?M[U][0]=ee.get(ae):M[U][0]=b[x.get(ae)],J.has(ae)?M[U][1]=J.get(ae):M[U][1]=T[x.get(ae)]}),P=!0}}if(P){for(var te=void 0,Z=d.transpose(M),xe=d.transpose(R),de=0;de0){var fe={x:0,y:0};y.fixedNodeConstraint.forEach(function(ae,U){var ce={x:b[x.get(ae.nodeId)],y:T[x.get(ae.nodeId)]},z=ae.position,ne=A(z,ce);fe.x+=ne.x,fe.y+=ne.y}),fe.x/=y.fixedNodeConstraint.length,fe.y/=y.fixedNodeConstraint.length,b.forEach(function(ae,U){b[U]+=fe.x}),T.forEach(function(ae,U){T[U]+=fe.y}),y.fixedNodeConstraint.forEach(function(ae){b[x.get(ae.nodeId)]=ae.position.x,T[x.get(ae.nodeId)]=ae.position.y})}if(y.alignmentConstraint){if(y.alignmentConstraint.vertical)for(var Ke=y.alignmentConstraint.vertical,Te=o(function(U){var ce=new Set;Ke[U].forEach(function(se){ce.add(se)});var z=new Set([].concat(u(ce)).filter(function(se){return F.has(se)})),ne=void 0;z.size>0?ne=b[x.get(z.values().next().value)]:ne=L(ce).x,ce.forEach(function(se){F.has(se)||(b[x.get(se)]=ne)})},"_loop4"),Be=0;Be0?ne=T[x.get(z.values().next().value)]:ne=L(ce).y,ce.forEach(function(se){F.has(se)||(T[x.get(se)]=ne)})},"_loop5"),Ne=0;Ne{a.exports=t})},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(45);return i})()})});var RCe=nr((L3,PW)=>{"use strict";o((function(e,r){typeof L3=="object"&&typeof PW=="object"?PW.exports=r(OW()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof L3=="object"?L3.cytoscapeFcose=r(OW()):e.cytoscapeFcose=r(e.coseBase)}),"webpackUniversalModuleDefinition")(L3,function(t){return(()=>{"use strict";var e={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var l=arguments.length,u=Array(l>1?l-1:0),h=1;h{var u=(function(){function d(p,m){var g=[],y=!0,v=!1,x=void 0;try{for(var b=p[Symbol.iterator](),T;!(y=(T=b.next()).done)&&(g.push(T.value),!(m&&g.length===m));y=!0);}catch(E){v=!0,x=E}finally{try{!y&&b.return&&b.return()}finally{if(v)throw x}}return g}return o(d,"sliceIterator"),function(p,m){if(Array.isArray(p))return p;if(Symbol.iterator in Object(p))return d(p,m);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),h=l(140).layoutBase.LinkedList,f={};f.getTopMostNodes=function(d){for(var p={},m=0;m0&&P.merge($)});for(var B=0;B1){T=x[0],E=T.connectedEdges().length,x.forEach(function(R){R.connectedEdges().length0&&g.set("dummy"+(g.size+1),S),A},f.relocateComponent=function(d,p,m){if(!m.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(m.quality=="draft"){var b=!0,T=!1,E=void 0;try{for(var w=p.nodeIndexes[Symbol.iterator](),k;!(b=(k=w.next()).done);b=!0){var S=k.value,A=u(S,2),L=A[0],I=A[1],N=m.cy.getElementById(L);if(N){var C=N.boundingBox(),_=p.xCoords[I]-C.w/2,D=p.xCoords[I]+C.w/2,M=p.yCoords[I]-C.h/2,R=p.yCoords[I]+C.h/2;_y&&(y=D),Mx&&(x=R)}}}catch($){T=!0,E=$}finally{try{!b&&w.return&&w.return()}finally{if(T)throw E}}var P=d.x-(y+g)/2,B=d.y-(x+v)/2;p.xCoords=p.xCoords.map(function($){return $+P}),p.yCoords=p.yCoords.map(function($){return $+B})}else{Object.keys(p).forEach(function($){var V=p[$],X=V.getRect().x,Q=V.getRect().x+V.getRect().width,H=V.getRect().y,ie=V.getRect().y+V.getRect().height;Xy&&(y=Q),Hx&&(x=ie)});var F=d.x-(y+g)/2,G=d.y-(x+v)/2;Object.keys(p).forEach(function($){var V=p[$];V.setCenter(V.getCenterX()+F,V.getCenterY()+G)})}}},f.calcBoundingBox=function(d,p,m,g){for(var y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,T=void 0,E=void 0,w=void 0,k=void 0,S=d.descendants().not(":parent"),A=S.length,L=0;LT&&(y=T),vw&&(x=w),b{var u=l(548),h=l(140).CoSELayout,f=l(140).CoSENode,d=l(140).layoutBase.PointD,p=l(140).layoutBase.DimensionD,m=l(140).layoutBase.LayoutConstants,g=l(140).layoutBase.FDLayoutConstants,y=l(140).CoSEConstants,v=o(function(b,T){var E=b.cy,w=b.eles,k=w.nodes(),S=w.edges(),A=void 0,L=void 0,I=void 0,N={};b.randomize&&(A=T.nodeIndexes,L=T.xCoords,I=T.yCoords);var C=o(function($){return typeof $=="function"},"isFn"),_=o(function($,V){return C($)?$(V):$},"optFn"),D=u.calcParentsWithoutChildren(E,w),M=o(function G($,V,X,Q){for(var H=V.length,ie=0;ie0){var Z=void 0;Z=X.getGraphManager().add(X.newGraph(),ee),G(Z,le,X,Q)}}},"processChildrenList"),R=o(function($,V,X){for(var Q=0,H=0,ie=0;ie0?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=Q/H:C(b.idealEdgeLength)?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,y.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,y.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},"processEdges"),P=o(function($,V){V.fixedNodeConstraint&&($.constraints.fixedNodeConstraint=V.fixedNodeConstraint),V.alignmentConstraint&&($.constraints.alignmentConstraint=V.alignmentConstraint),V.relativePlacementConstraint&&($.constraints.relativePlacementConstraint=V.relativePlacementConstraint)},"processConstraints");b.nestingFactor!=null&&(y.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(y.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(y.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(y.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(y.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(y.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?m.QUALITY=2:m.QUALITY=0,y.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=m.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!b.randomize,y.ANIMATE=g.ANIMATE=m.ANIMATE=b.animate,y.TILE=b.tile,y.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,y.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!0,y.PURE_INCREMENTAL=!b.randomize,m.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!1),b.step=="enforced"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!1),b.step=="cose"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?y.TREE_REDUCTION_ON_INCREMENTAL=!1:y.TREE_REDUCTION_ON_INCREMENTAL=!0;var B=new h,F=B.newGraphManager();return M(F.addRoot(),u.getTopMostNodes(k),B,b),R(B,F,S),P(B,b),B.runLayout(),N},"coseLayout");a.exports={coseLayout:v}}),212:((a,s,l)=>{var u=(function(){function b(T,E){for(var w=0;w0)if(R){var F=d.getTopMostNodes(w.eles.nodes());if(C=d.connectComponents(k,w.eles,F),C.forEach(function(ke){var we=ke.boundingBox();_.push({x:we.x1+we.w/2,y:we.y1+we.h/2})}),w.randomize&&C.forEach(function(ke){w.eles=ke,A.push(m(w))}),w.quality=="default"||w.quality=="proof"){var G=k.collection();if(w.tile){var $=new Map,V=[],X=[],Q=0,H={nodeIndexes:$,xCoords:V,yCoords:X},ie=[];if(C.forEach(function(ke,we){ke.edges().length==0&&(ke.nodes().forEach(function(_e,$e){G.merge(ke.nodes()[$e]),_e.isParent()||(H.nodeIndexes.set(ke.nodes()[$e].id(),Q++),H.xCoords.push(ke.nodes()[0].position().x),H.yCoords.push(ke.nodes()[0].position().y))}),ie.push(we))}),G.length>1){var Y=G.boundingBox();_.push({x:Y.x1+Y.w/2,y:Y.y1+Y.h/2}),C.push(G),A.push(H);for(var le=ie.length-1;le>=0;le--)C.splice(ie[le],1),A.splice(ie[le],1),_.splice(ie[le],1)}}C.forEach(function(ke,we){w.eles=ke,N.push(y(w,A[we])),d.relocateComponent(_[we],N[we],w)})}else C.forEach(function(ke,we){d.relocateComponent(_[we],A[we],w)});var ee=new Set;if(C.length>1){var J=[],te=S.filter(function(ke){return ke.css("display")=="none"});C.forEach(function(ke,we){var _e=void 0;if(w.quality=="draft"&&(_e=A[we].nodeIndexes),ke.nodes().not(te).length>0){var $e={};$e.edges=[],$e.nodes=[];var fe=void 0;ke.nodes().not(te).forEach(function(Ke){if(w.quality=="draft")if(!Ke.isParent())fe=_e.get(Ke.id()),$e.nodes.push({x:A[we].xCoords[fe]-Ke.boundingbox().w/2,y:A[we].yCoords[fe]-Ke.boundingbox().h/2,width:Ke.boundingbox().w,height:Ke.boundingbox().h});else{var Te=d.calcBoundingBox(Ke,A[we].xCoords,A[we].yCoords,_e);$e.nodes.push({x:Te.topLeftX,y:Te.topLeftY,width:Te.width,height:Te.height})}else N[we][Ke.id()]&&$e.nodes.push({x:N[we][Ke.id()].getLeft(),y:N[we][Ke.id()].getTop(),width:N[we][Ke.id()].getWidth(),height:N[we][Ke.id()].getHeight()})}),ke.edges().forEach(function(Ke){var Te=Ke.source(),Be=Ke.target();if(Te.css("display")!="none"&&Be.css("display")!="none")if(w.quality=="draft"){var Ue=_e.get(Te.id()),Ge=_e.get(Be.id()),Ne=[],We=[];if(Te.isParent()){var j=d.calcBoundingBox(Te,A[we].xCoords,A[we].yCoords,_e);Ne.push(j.topLeftX+j.width/2),Ne.push(j.topLeftY+j.height/2)}else Ne.push(A[we].xCoords[Ue]),Ne.push(A[we].yCoords[Ue]);if(Be.isParent()){var ae=d.calcBoundingBox(Be,A[we].xCoords,A[we].yCoords,_e);We.push(ae.topLeftX+ae.width/2),We.push(ae.topLeftY+ae.height/2)}else We.push(A[we].xCoords[Ge]),We.push(A[we].yCoords[Ge]);$e.edges.push({startX:Ne[0],startY:Ne[1],endX:We[0],endY:We[1]})}else N[we][Te.id()]&&N[we][Be.id()]&&$e.edges.push({startX:N[we][Te.id()].getCenterX(),startY:N[we][Te.id()].getCenterY(),endX:N[we][Be.id()].getCenterX(),endY:N[we][Be.id()].getCenterY()})}),$e.nodes.length>0&&(J.push($e),ee.add(we))}});var Z=M.packComponents(J,w.randomize).shifts;if(w.quality=="draft")A.forEach(function(ke,we){var _e=ke.xCoords.map(function(fe){return fe+Z[we].dx}),$e=ke.yCoords.map(function(fe){return fe+Z[we].dy});ke.xCoords=_e,ke.yCoords=$e});else{var xe=0;ee.forEach(function(ke){Object.keys(N[ke]).forEach(function(we){var _e=N[ke][we];_e.setCenter(_e.getCenterX()+Z[xe].dx,_e.getCenterY()+Z[xe].dy)}),xe++})}}}else{var P=w.eles.boundingBox();if(_.push({x:P.x1+P.w/2,y:P.y1+P.h/2}),w.randomize){var B=m(w);A.push(B)}w.quality=="default"||w.quality=="proof"?(N.push(y(w,A[0])),d.relocateComponent(_[0],N[0],w)):d.relocateComponent(_[0],A[0],w)}var de=o(function(we,_e){if(w.quality=="default"||w.quality=="proof"){typeof we=="number"&&(we=_e);var $e=void 0,fe=void 0,Ke=we.data("id");return N.forEach(function(Be){Ke in Be&&($e={x:Be[Ke].getRect().getCenterX(),y:Be[Ke].getRect().getCenterY()},fe=Be[Ke])}),w.nodeDimensionsIncludeLabels&&(fe.labelWidth&&(fe.labelPosHorizontal=="left"?$e.x+=fe.labelWidth/2:fe.labelPosHorizontal=="right"&&($e.x-=fe.labelWidth/2)),fe.labelHeight&&(fe.labelPosVertical=="top"?$e.y+=fe.labelHeight/2:fe.labelPosVertical=="bottom"&&($e.y-=fe.labelHeight/2))),$e==null&&($e={x:we.position("x"),y:we.position("y")}),{x:$e.x,y:$e.y}}else{var Te=void 0;return A.forEach(function(Be){var Ue=Be.nodeIndexes.get(we.id());Ue!=null&&(Te={x:Be.xCoords[Ue],y:Be.yCoords[Ue]})}),Te==null&&(Te={x:we.position("x"),y:we.position("y")}),{x:Te.x,y:Te.y}}},"getPositions");if(w.quality=="default"||w.quality=="proof"||w.randomize){var Se=d.calcParentsWithoutChildren(k,S),Me=S.filter(function(ke){return ke.css("display")=="none"});w.eles=S.not(Me),S.nodes().not(":parent").not(Me).layoutPositions(E,w,de),Se.length>0&&Se.forEach(function(ke){ke.position(de(ke))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),b})();a.exports=x}),657:((a,s,l)=>{var u=l(548),h=l(140).layoutBase.Matrix,f=l(140).layoutBase.SVD,d=o(function(m){var g=m.cy,y=m.eles,v=y.nodes(),x=y.nodes(":parent"),b=new Map,T=new Map,E=new Map,w=[],k=[],S=[],A=[],L=[],I=[],N=[],C=[],_=void 0,D=void 0,M=1e8,R=1e-9,P=m.piTol,B=m.samplingType,F=m.nodeSeparation,G=void 0,$=o(function(){for(var ce=0,z=0,ne=!1;z=be;){me=se[be++];for(var Xe=w[me],oe=0;oeIe&&(Ie=L[he],qe=he)}return qe},"BFS"),X=o(function(ce){var z=void 0;if(ce){z=Math.floor(Math.random()*D),_=z;for(var se=0;se=1)break;Ie=ge}for(var Xe=0;Xe=1)break;Ie=ge}for(var et=0;et0&&(z.isParent()?w[ce].push(E.get(z.id())):w[ce].push(z.id()))})});var Se=o(function(ce){var z=T.get(ce),ne=void 0;b.get(ce).forEach(function(se){g.getElementById(se).isParent()?ne=E.get(se):ne=se,w[z].push(ne),w[T.get(ne)].push(ce)})},"_loop"),Me=!0,ke=!1,we=void 0;try{for(var _e=b.keys()[Symbol.iterator](),$e;!(Me=($e=_e.next()).done);Me=!0){var fe=$e.value;Se(fe)}}catch(U){ke=!0,we=U}finally{try{!Me&&_e.return&&_e.return()}finally{if(ke)throw we}}D=T.size;var Ke=void 0;if(D>2){G=D{var u=l(212),h=o(function(d){d&&d("layout","fcose",u)},"register");typeof cytoscape<"u"&&h(cytoscape),a.exports=h}),140:(a=>{a.exports=t})},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(579);return i})()})});var Qv,rg,BW=O(()=>{"use strict";Xc();Qv=o(t=>`${t}`,"wrapIcon"),rg={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:Qv('')},server:{body:Qv('')},disk:{body:Qv('')},internet:{body:Qv('')},cloud:{body:Qv('')},unknown:yD,blank:{body:Qv("")}}}});var LCe,NCe,MCe,ICe,OCe=O(()=>{"use strict";jt();co();Xc();Ur();BW();k_();ar();LCe=o(async function(t,e,r){let n=r.getConfigField("padding"),i=r.getConfigField("iconSize"),a=i/2,s=i/6,l=s/2;await Promise.all(e.edges().map(async u=>{let{source:h,sourceDir:f,sourceArrow:d,sourceGroup:p,target:m,targetDir:g,targetArrow:y,targetGroup:v,label:x}=w_(u),{x:b,y:T}=u[0].sourceEndpoint(),{x:E,y:w}=u[0].midpoint(),{x:k,y:S}=u[0].targetEndpoint(),A=n+4;if(p&&(vs(f)?b+=f==="L"?-A:A:T+=f==="T"?-A:A+18),v&&(vs(g)?k+=g==="L"?-A:A:S+=g==="T"?-A:A+18),!p&&r.getNode(h)?.type==="junction"&&(vs(f)?b+=f==="L"?a:-a:T+=f==="T"?a:-a),!v&&r.getNode(m)?.type==="junction"&&(vs(g)?k+=g==="L"?a:-a:S+=g==="T"?a:-a),u[0]._private.rscratch){let L=t.insert("g");if(L.insert("path").attr("d",`M ${b},${T} L ${E},${w} L${k},${S} `).attr("class","edge").attr("id",hu(h,m,{prefix:"L"})),d){let I=vs(f)?C3[f](b,s):b-l,N=Zu(f)?C3[f](T,s):T-l;L.insert("polygon").attr("points",_W[f](s)).attr("transform",`translate(${I},${N})`).attr("class","arrow")}if(y){let I=vs(g)?C3[g](k,s):k-l,N=Zu(g)?C3[g](S,s):S-l;L.insert("polygon").attr("points",_W[g](s)).attr("transform",`translate(${I},${N})`).attr("class","arrow")}if(x){let I=A3(f,g)?"XY":vs(f)?"X":"Y",N=0;I==="X"?N=Math.abs(b-k):I==="Y"?N=Math.abs(T-S)/1.5:N=Math.abs(b-k)/2;let C=L.append("g");if(await Fn(C,x,{useHtmlLabels:!1,width:N,classes:"architecture-service-label"},ve()),C.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),I==="X")C.attr("transform","translate("+E+", "+w+")");else if(I==="Y")C.attr("transform","translate("+E+", "+w+") rotate(-90)");else if(I==="XY"){let _=_3(f,g);if(_&&TCe(_)){let D=C.node().getBoundingClientRect(),[M,R]=kCe(_);C.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*M*R*45})`);let P=C.node().getBoundingClientRect();C.attr("transform",` - translate(${E}, ${w-D.height/2}) - translate(${M*P.width/2}, ${R*P.height/2}) - rotate(${-1*M*R*45}, 0, ${D.height/2}) - `)}}}}}))},"drawEdges"),NCe=o(async function(t,e,r){let i=r.getConfigField("padding")*.75,a=r.getConfigField("fontSize"),l=r.getConfigField("iconSize")/2;await Promise.all(e.nodes().map(async u=>{let h=Tp(u);if(h.type==="group"){let{h:f,w:d,x1:p,y1:m}=u.boundingBox(),g=t.append("rect");g.attr("id",`group-${h.id}`).attr("x",p+l).attr("y",m+l).attr("width",d).attr("height",f).attr("class","node-bkg");let y=t.append("g"),v=p,x=m;if(h.icon){let b=y.append("g");b.html(`${await eo(h.icon,{height:i,width:i,fallbackPrefix:rg.prefix})}`),b.attr("transform","translate("+(v+l+1)+", "+(x+l+1)+")"),v+=i,x+=a/2-1-2}if(h.label){let b=y.append("g");await Fn(b,h.label,{useHtmlLabels:!1,width:d,classes:"architecture-service-label"},ve()),b.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),b.attr("transform","translate("+(v+l+4)+", "+(x+l+2)+")")}r.setElementForId(h.id,g)}}))},"drawGroups"),MCe=o(async function(t,e,r){let n=ve();for(let i of r){let a=e.append("g"),s=t.getConfigField("iconSize");if(i.title){let f=a.append("g");await Fn(f,i.title,{useHtmlLabels:!1,width:s*1.5,classes:"architecture-service-label"},n),f.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),f.attr("transform","translate("+s/2+", "+s+")")}let l=a.append("g");if(i.icon)l.html(`${await eo(i.icon,{height:s,width:s,fallbackPrefix:rg.prefix})}`);else if(i.iconText){l.html(`${await eo("blank",{height:s,width:s,fallbackPrefix:rg.prefix})}`);let p=l.append("g").append("foreignObject").attr("width",s).attr("height",s).append("div").attr("class","node-icon-text").attr("style",`height: ${s}px;`).append("div").html(wr(i.iconText,n)),m=parseInt(window.getComputedStyle(p.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;p.attr("style",`-webkit-line-clamp: ${Math.floor((s-2)/m)};`)}else l.append("path").attr("class","node-bkg").attr("id","node-"+i.id).attr("d",`M0,${s} V5 Q0,0 5,0 H${s-5} Q${s},0 ${s},5 V${s} Z`);a.attr("id",`service-${i.id}`).attr("class","architecture-service");let{width:u,height:h}=a.node().getBBox();i.width=u,i.height=h,t.setElementForId(i.id,a)}return 0},"drawServices"),ICe=o(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=t.getConfigField("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:l,height:u}=i._groups[0][0].getBBox();i.width=l,i.height=u,t.setElementForId(n.id,i)})},"drawJunctions")});function Tpt(t,e,r){t.forEach(n=>{e.add({group:"nodes",data:{type:"service",id:n.id,icon:n.icon,label:n.title,parent:n.in,width:r.getConfigField("iconSize"),height:r.getConfigField("iconSize")},classes:"node-service"})})}function wpt(t,e,r){t.forEach(n=>{e.add({group:"nodes",data:{type:"junction",id:n.id,parent:n.in,width:r.getConfigField("iconSize"),height:r.getConfigField("iconSize")},classes:"node-junction"})})}function kpt(t,e){e.nodes().map(r=>{let n=Tp(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function Ept(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function Spt(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:l,lhsDir:u,rhsDir:h,rhsGroup:f,title:d}=r,p=A3(r.lhsDir,r.rhsDir)?"segments":"straight",m={id:`${n}-${i}`,label:d,source:n,sourceDir:u,sourceArrow:a,sourceGroup:s,sourceEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%",target:i,targetDir:h,targetArrow:l,targetGroup:f,targetEndpoint:h==="L"?"0 50%":h==="R"?"100% 50%":h==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:m,classes:p})})}function Cpt(t,e,r){let n=o((l,u)=>Object.entries(l).reduce((h,[f,d])=>{let p=0,m=Object.entries(d);if(m.length===1)return h[f]=m[0][1],h;for(let g=0;g{let u={},h={};return Object.entries(l).forEach(([f,[d,p]])=>{let m=t.getNode(f)?.in??"default";u[p]??={},u[p][m]??=[],u[p][m].push(f),h[d]??={},h[d][m]??=[],h[d][m].push(f)}),{horiz:Object.values(n(u,"horizontal")).filter(f=>f.length>1),vert:Object.values(n(h,"vertical")).filter(f=>f.length>1)}}),[a,s]=i.reduce(([l,u],{horiz:h,vert:f})=>[[...l,...h],[...u,...f]],[[],[]]);return{horizontal:a,vertical:s}}function Apt(t,e){let r=[],n=o(a=>`${a[0]},${a[1]}`,"posToStr"),i=o(a=>a.split(",").map(s=>parseInt(s)),"strToPos");return t.forEach(a=>{let s=Object.fromEntries(Object.entries(a).map(([f,d])=>[n(d),f])),l=[n([0,0])],u={},h={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;l.length>0;){let f=l.shift();if(f){u[f]=1;let d=s[f];if(d){let p=i(f);Object.entries(h).forEach(([m,g])=>{let y=n([p[0]+g[0],p[1]+g[1]]),v=s[y];v&&!u[y]&&(l.push(y),r.push({[AW[m]]:v,[AW[bCe(m)]]:d,gap:1.5*e.getConfigField("iconSize")}))})}}}}),r}function _pt(t,e,r,n,i,{spatialMaps:a,groupAlignments:s}){return new Promise(l=>{let u=je("body").append("div").attr("id","cy").attr("style","display:none"),h=Il({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${i.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${i.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});u.remove(),Ept(r,h),Tpt(t,h,i),wpt(e,h,i),Spt(n,h);let f=Cpt(i,a,s),d=Apt(a,i),p=h.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(m){let[g,y]=m.connectedNodes(),{parent:v}=Tp(g),{parent:x}=Tp(y);return v===x?1.5*i.getConfigField("iconSize"):.5*i.getConfigField("iconSize")},edgeElasticity(m){let[g,y]=m.connectedNodes(),{parent:v}=Tp(g),{parent:x}=Tp(y);return v===x?.45:.001},alignmentConstraint:f,relativePlacementConstraint:d});p.one("layoutstop",()=>{function m(g,y,v,x){let b,T,{x:E,y:w}=g,{x:k,y:S}=y;T=(x-w+(E-v)*(w-S)/(E-k))/Math.sqrt(1+Math.pow((w-S)/(E-k),2)),b=Math.sqrt(Math.pow(x-w,2)+Math.pow(v-E,2)-Math.pow(T,2));let A=Math.sqrt(Math.pow(k-E,2)+Math.pow(S-w,2));b=b/A;let L=(k-E)*(x-w)-(S-w)*(v-E);switch(!0){case L>=0:L=1;break;case L<0:L=-1;break}let I=(k-E)*(v-E)+(S-w)*(x-w);switch(!0){case I>=0:I=1;break;case I<0:I=-1;break}return T=Math.abs(T)*L,b=b*I,{distances:T,weights:b}}o(m,"getSegmentWeights"),h.startBatch();for(let g of Object.values(h.edges()))if(g.data?.()){let{x:y,y:v}=g.source().position(),{x,y:b}=g.target().position();if(y!==x&&v!==b){let T=g.sourceEndpoint(),E=g.targetEndpoint(),{sourceDir:w}=w_(g),[k,S]=Zu(w)?[T.x,E.y]:[E.x,T.y],{weights:A,distances:L}=m(T,E,k,S);g.style("segment-distances",L),g.style("segment-weights",A)}}h.endBatch(),p.run()}),p.run(),h.ready(m=>{K.info("Ready",m),l(h)})})}var PCe,Dpt,BCe,FCe=O(()=>{"use strict";SB();PCe=Ra(RCe(),1);Ar();xt();Xc();Ul();Ti();BW();k_();OCe();Nw([{name:rg.prefix,icons:rg}]);Il.use(PCe.default);o(Tpt,"addServices");o(wpt,"addJunctions");o(kpt,"positionNodes");o(Ept,"addGroups");o(Spt,"addEdges");o(Cpt,"getAlignments");o(Apt,"getRelativeConstraints");o(_pt,"layoutArchitecture");Dpt=o(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),l=i.getGroups(),u=i.getEdges(),h=i.getDataStructures(),f=Ii(e),d=f.append("g");d.attr("class","architecture-edges");let p=f.append("g");p.attr("class","architecture-services");let m=f.append("g");m.attr("class","architecture-groups"),await MCe(i,p,a),ICe(i,p,s);let g=await _pt(a,s,l,u,i,h);await LCe(d,g,i),await NCe(m,g,i),kpt(i,g),Kc(void 0,f,i.getConfigField("padding"),i.getConfigField("useMaxWidth"))},"draw"),BCe={draw:Dpt}});var $Ce={};vr($Ce,{diagram:()=>Rpt});var Rpt,zCe=O(()=>{"use strict";ACe();RW();DCe();FCe();Rpt={parser:LW,get db(){return new Kv},renderer:BCe,styles:_Ce}});var FW,qCe,UCe=O(()=>{"use strict";FW=(function(){var t=o(function(x,b,T,E){for(T=T||{},E=x.length;E--;T[x[E]]=b);return T},"o"),e=[1,4],r=[1,14],n=[1,12],i=[1,13],a=[6,7,8],s=[1,20],l=[1,18],u=[1,19],h=[6,7,11],f=[1,6,13,14],d=[1,23],p=[1,24],m=[1,6,7,11,13,14],g={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ishikawa:4,spaceLines:5,SPACELINE:6,NL:7,ISHIKAWA:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,TEXT:14,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"ISHIKAWA",11:"EOF",13:"SPACELIST",14:"TEXT"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,1],[12,1],[12,1]],performAction:o(function(b,T,E,w,k,S,A){var L=S.length-1;switch(k){case 6:case 7:return w;case 15:w.addNode(S[L-1].length,S[L].trim());break;case 16:w.addNode(0,S[L].trim());break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:i},t(a,[2,3]),{1:[2,2]},t(a,[2,4]),t(a,[2,5]),{1:[2,6],6:r,12:15,13:n,14:i},{6:r,9:16,12:11,13:n,14:i},{6:s,7:l,10:17,11:u},t(h,[2,18],{14:[1,21]}),t(h,[2,16]),t(h,[2,17]),{6:s,7:l,10:22,11:u},{1:[2,7],6:r,12:15,13:n,14:i},t(f,[2,14],{7:d,11:p}),t(m,[2,8]),t(m,[2,9]),t(m,[2,10]),t(h,[2,15]),t(f,[2,13],{7:d,11:p}),t(m,[2,11]),t(m,[2,12])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(b,T){if(T.recoverable)this.trace(b);else{var E=new Error(b);throw E.hash=T,E}},"parseError"),parse:o(function(b){var T=this,E=[0],w=[],k=[null],S=[],A=this.table,L="",I=0,N=0,C=0,_=2,D=1,M=S.slice.call(arguments,1),R=Object.create(this.lexer),P={yy:{}};for(var B in this.yy)Object.prototype.hasOwnProperty.call(this.yy,B)&&(P.yy[B]=this.yy[B]);R.setInput(b,P.yy),P.yy.lexer=R,P.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var F=R.yylloc;S.push(F);var G=R.options&&R.options.ranges;typeof P.yy.parseError=="function"?this.parseError=P.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function $(Se){E.length=E.length-2*Se,k.length=k.length-Se,S.length=S.length-Se}o($,"popStack");function V(){var Se;return Se=w.pop()||R.lex()||D,typeof Se!="number"&&(Se instanceof Array&&(w=Se,Se=w.pop()),Se=T.symbols_[Se]||Se),Se}o(V,"lex");for(var X,Q,H,ie,Y,le,ee={},J,te,Z,xe;;){if(H=E[E.length-1],this.defaultActions[H]?ie=this.defaultActions[H]:((X===null||typeof X>"u")&&(X=V()),ie=A[H]&&A[H][X]),typeof ie>"u"||!ie.length||!ie[0]){var de="";xe=[];for(J in A[H])this.terminals_[J]&&J>_&&xe.push("'"+this.terminals_[J]+"'");R.showPosition?de="Parse error on line "+(I+1)+`: -`+R.showPosition()+` -Expecting `+xe.join(", ")+", got '"+(this.terminals_[X]||X)+"'":de="Parse error on line "+(I+1)+": Unexpected "+(X==D?"end of input":"'"+(this.terminals_[X]||X)+"'"),this.parseError(de,{text:R.match,token:this.terminals_[X]||X,line:R.yylineno,loc:F,expected:xe})}if(ie[0]instanceof Array&&ie.length>1)throw new Error("Parse Error: multiple actions possible at state: "+H+", token: "+X);switch(ie[0]){case 1:E.push(X),k.push(R.yytext),S.push(R.yylloc),E.push(ie[1]),X=null,Q?(X=Q,Q=null):(N=R.yyleng,L=R.yytext,I=R.yylineno,F=R.yylloc,C>0&&C--);break;case 2:if(te=this.productions_[ie[1]][1],ee.$=k[k.length-te],ee._$={first_line:S[S.length-(te||1)].first_line,last_line:S[S.length-1].last_line,first_column:S[S.length-(te||1)].first_column,last_column:S[S.length-1].last_column},G&&(ee._$.range=[S[S.length-(te||1)].range[0],S[S.length-1].range[1]]),le=this.performAction.apply(ee,[L,N,I,P.yy,ie[1],k,S].concat(M)),typeof le<"u")return le;te&&(E=E.slice(0,-1*te*2),k=k.slice(0,-1*te),S=S.slice(0,-1*te)),E.push(this.productions_[ie[1]][0]),k.push(ee.$),S.push(ee._$),Z=A[E[E.length-2]][E[E.length-1]],E.push(Z);break;case 3:return!0}}return!0},"parse")},y=(function(){var x={EOF:1,parseError:o(function(T,E){if(this.yy.parser)this.yy.parser.parseError(T,E);else throw new Error(T)},"parseError"),setInput:o(function(b,T){return this.yy=T||this.yy||{},this._input=b,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var b=this._input[0];this.yytext+=b,this.yyleng++,this.offset++,this.match+=b,this.matched+=b;var T=b.match(/(?:\r\n?|\n).*/g);return T?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),b},"input"),unput:o(function(b){var T=b.length,E=b.split(/(?:\r\n?|\n)/g);this._input=b+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-T),this.offset-=T;var w=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),E.length-1&&(this.yylineno-=E.length-1);var k=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:E?(E.length===w.length?this.yylloc.first_column:0)+w[w.length-E.length].length-E[0].length:this.yylloc.first_column-T},this.options.ranges&&(this.yylloc.range=[k[0],k[0]+this.yyleng-T]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(b){this.unput(this.match.slice(b))},"less"),pastInput:o(function(){var b=this.matched.substr(0,this.matched.length-this.match.length);return(b.length>20?"...":"")+b.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var b=this.match;return b.length<20&&(b+=this._input.substr(0,20-b.length)),(b.substr(0,20)+(b.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var b=this.pastInput(),T=new Array(b.length+1).join("-");return b+this.upcomingInput()+` -`+T+"^"},"showPosition"),test_match:o(function(b,T){var E,w,k;if(this.options.backtrack_lexer&&(k={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(k.yylloc.range=this.yylloc.range.slice(0))),w=b[0].match(/(?:\r\n?|\n).*/g),w&&(this.yylineno+=w.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:w?w[w.length-1].length-w[w.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],E=this.performAction.call(this,this.yy,this,T,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),E)return E;if(this._backtrack){for(var S in k)this[S]=k[S];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var b,T,E,w;this._more||(this.yytext="",this.match="");for(var k=this._currentRules(),S=0;ST[0].length)){if(T=E,w=S,this.options.backtrack_lexer){if(b=this.test_match(E,k[S]),b!==!1)return b;if(this._backtrack){T=!1;continue}else return!1}else if(!this.options.flex)break}return T?(b=this.test_match(T,k[w]),b!==!1?b:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var T=this.next();return T||this.lex()},"lex"),begin:o(function(T){this.conditionStack.push(T)},"begin"),popState:o(function(){var T=this.conditionStack.length-1;return T>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(T){return T=this.conditionStack.length-1-Math.abs(T||0),T>=0?this.conditionStack[T]:"INITIAL"},"topState"),pushState:o(function(T){this.begin(T)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(T,E,w,k){var S=k;switch(w){case 0:return 6;case 1:return 8;case 2:return 8;case 3:return 6;case 4:return 7;case 5:return 13;case 6:return 14;case 7:return 11}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:ishikawa-beta\b)/i,/^(?:ishikawa\b)/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:[^\n]+)/i,/^(?:$)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return x})();g.lexer=y;function v(){this.yy={}}return o(v,"Parser"),v.prototype=g,g.Parser=v,new v})();FW.parser=FW;qCe=FW});var E_,WCe=O(()=>{"use strict";jt();Ur();si();E_=class{constructor(){this.stack=[];this.clear=this.clear.bind(this),this.addNode=this.addNode.bind(this),this.getRoot=this.getRoot.bind(this)}static{o(this,"IshikawaDB")}clear(){this.root=void 0,this.stack=[],this.baseLevel=void 0,_r()}getRoot(){return this.root}addNode(e,r){let n=st.sanitizeText(r,ve());if(!this.root){this.baseLevel=e,this.root={text:n,children:[]},this.stack=[{level:0,node:this.root}],zr(n);return}let i=e-(this.baseLevel??0);for(i<=0&&(i=1);this.stack.length>1&&this.stack[this.stack.length-1].level>=i;)this.stack.pop();let a=this.stack[this.stack.length-1].node,s={text:n,children:[]};a.children.push(s),this.stack.push({level:i,node:s})}getAccTitle(){return Or()}setAccTitle(e){Lr(e)}getAccDescription(){return Br()}setAccDescription(e){Pr(e)}getDiagramTitle(){return Fr()}setDiagramTitle(e){zr(e)}}});var Ipt,Zv,Opt,Ppt,Bpt,QCe,HCe,YCe,jCe,Fpt,XCe,$pt,zpt,Gpt,$W,Vpt,qpt,ZCe,S_,KCe,Jv,JCe,e6e=O(()=>{"use strict";jt();Ul();Ti();ar();Wt();Ipt=14,Zv=250,Opt=30,Ppt=60,Bpt=5,QCe=82*Math.PI/180,HCe=Math.cos(QCe),YCe=Math.sin(QCe),jCe=o((t,e,r)=>{let n=t.node().getBBox(),i=n.width+e*2,a=n.height+e*2;Zr(t,a,i,r),t.attr("viewBox",`${n.x-e} ${n.y-e} ${i} ${a}`)},"applyPaddedViewBox"),Fpt=o((t,e,r,n)=>{let a=n.db.getRoot();if(!a)return;let s=ve(),{look:l,handDrawnSeed:u,themeVariables:h}=s,f=Uo(s.fontSize)[0]??Ipt,d=l==="handDrawn",p=a.children??[],m=s.ishikawa?.diagramPadding??20,g=s.ishikawa?.useMaxWidth??!1,y=Ii(e),v=y.append("g").attr("class","ishikawa"),x=d?Je.svg(y.node()):void 0,b=x?{roughSvg:x,seed:u??0,lineColor:h?.lineColor??"#333",fillColor:h?.mainBkg??"#fff"}:void 0,T=`ishikawa-arrow-${e}`;d||v.append("defs").append("marker").attr("id",T).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerWidth",6).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 Z").attr("class","ishikawa-arrow");let E=0,w=Zv,k=d?void 0:Jv(v,E,w,E,w,"ishikawa-spine");if($pt(v,E,w,a.text,f,b),!p.length){d&&Jv(v,E,w,E,w,"ishikawa-spine",b),jCe(y,m,g);return}E-=20;let S=p.filter((R,P)=>P%2===0),A=p.filter((R,P)=>P%2===1),L=XCe(S),I=XCe(A),N=L.total+I.total,C=Zv,_=Zv;if(N>0){let R=Zv*2,P=Zv*.3;C=Math.max(P,R*(L.total/N)),_=Math.max(P,R*(I.total/N))}let D=f*2;C=Math.max(C,L.max*D),_=Math.max(_,I.max*D),w=Math.max(C,Zv),k&&k.attr("y1",w).attr("y2",w),v.select(".ishikawa-head-group").attr("transform",`translate(0,${w})`);let M=Math.ceil(p.length/2);for(let R=0;RMath.min(B,F.getBBox().x),1/0)}if(d)Jv(v,E,w,0,w,"ishikawa-spine",b);else{k.attr("x1",E);let R=`url(#${T})`;v.selectAll("line.ishikawa-branch, line.ishikawa-sub-branch").attr("marker-start",R)}jCe(y,m,g)},"draw"),XCe=o(t=>{let e=o(r=>r.children.reduce((n,i)=>n+1+e(i),0),"countDescendants");return t.reduce((r,n)=>{let i=e(n);return r.total+=i,r.max=Math.max(r.max,i),r},{total:0,max:0})},"sideStats"),$pt=o((t,e,r,n,i,a)=>{let s=Math.max(6,Math.floor(110/(i*.6))),l=t.append("g").attr("class","ishikawa-head-group").attr("transform",`translate(${e},${r})`),u=S_(l,ZCe(n,s),0,0,"ishikawa-head-label","start",i),h=u.node().getBBox(),f=Math.max(60,h.width+6),d=Math.max(40,h.height*2+40),p=`M 0 ${-d/2} L 0 ${d/2} Q ${f*2.4} 0 0 ${-d/2} Z`;if(a){let m=a.roughSvg.path(p,{roughness:1.5,seed:a.seed,fill:a.fillColor,fillStyle:"hachure",fillWeight:2.5,hachureGap:5,stroke:a.lineColor,strokeWidth:2});l.insert(()=>m,":first-child").attr("class","ishikawa-head")}else l.insert("path",":first-child").attr("class","ishikawa-head").attr("d",p);u.attr("transform",`translate(${(f-h.width)/2-h.x+3},${-h.y-h.height/2})`)},"drawHead"),zpt=o((t,e)=>{let r=[],n=[],i=o((a,s,l)=>{let u=e===-1?[...a].reverse():a;for(let h of u){let f=r.length,d=h.children??[];r.push({depth:l,text:ZCe(h.text,15),parentIndex:s,childCount:d.length}),l%2===0?(n.push(f),d.length&&i(d,f,l+1)):(d.length&&i(d,f,l+1),n.push(f))}},"walk");return i(t,-1,2),{entries:r,yOrder:n}},"flattenTree"),Gpt=o((t,e,r,n,i,a,s)=>{let l=t.append("g").attr("class","ishikawa-label-group"),h=S_(l,e,r,n+11*i,"ishikawa-label cause","middle",a).node().getBBox();if(s){let f=s.roughSvg.rectangle(h.x-20,h.y-2,h.width+40,h.height+4,{roughness:1.5,seed:s.seed,fill:s.fillColor,fillStyle:"hachure",fillWeight:2.5,hachureGap:5,stroke:s.lineColor,strokeWidth:2});l.insert(()=>f,":first-child").attr("class","ishikawa-label-box")}else l.insert("rect",":first-child").attr("class","ishikawa-label-box").attr("x",h.x-20).attr("y",h.y-2).attr("width",h.width+40).attr("height",h.height+4)},"drawCauseLabel"),$W=o((t,e,r,n,i,a)=>{let s=Math.sqrt(n*n+i*i);if(s===0)return;let l=n/s,u=i/s,h=6,f=-u*h,d=l*h,p=e,m=r,g=`M ${p} ${m} L ${p-l*h*2+f} ${m-u*h*2+d} L ${p-l*h*2-f} ${m-u*h*2-d} Z`,y=a.roughSvg.path(g,{roughness:1,seed:a.seed,fill:a.lineColor,fillStyle:"solid",stroke:a.lineColor,strokeWidth:1});t.append(()=>y)},"drawArrowMarker"),Vpt=o((t,e,r,n,i,a,s,l)=>{let u=e.children??[],h=a*(u.length?1:.2),f=-HCe*h,d=YCe*h*i,p=r+f,m=n+d;if(Jv(t,r,n,p,m,"ishikawa-branch",l),l&&$W(t,r,n,r-p,n-m,l),Gpt(t,e.text,p,m,i,s,l),!u.length)return;let{entries:g,yOrder:y}=zpt(u,i),v=g.length,x=new Array(v);for(let[k,S]of y.entries())x[S]=n+d*((k+1)/(v+1));let b=new Map;b.set(-1,{x0:r,y0:n,x1:p,y1:m,childCount:u.length,childrenDrawn:0});let T=-HCe,E=YCe*i,w=i<0?"ishikawa-label up":"ishikawa-label down";for(let[k,S]of g.entries()){let A=x[k],L=b.get(S.parentIndex),I=t.append("g").attr("class","ishikawa-sub-group"),N=0,C=0,_=0;if(S.depth%2===0){let D=L.y1-L.y0;N=KCe(L.x0,L.x1,D?(A-L.y0)/D:.5),C=A,_=N-(S.childCount>0?Ppt+S.childCount*Bpt:Opt),Jv(I,N,A,_,A,"ishikawa-sub-branch",l),l&&$W(I,N,A,1,0,l),S_(I,S.text,_,A,"ishikawa-label align","end",s)}else{let D=L.childrenDrawn++;N=KCe(L.x0,L.x1,(L.childCount-D)/(L.childCount+1)),C=L.y0,_=N+T*((A-C)/E),Jv(I,N,C,_,A,"ishikawa-sub-branch",l),l&&$W(I,N,C,N-_,C-A,l),S_(I,S.text,_,A,w,"end",s)}S.childCount>0&&b.set(k,{x0:N,y0:C,x1:_,y1:A,childCount:S.childCount,childrenDrawn:0})}},"drawBranch"),qpt=o(t=>t.split(/|\n/),"splitLines"),ZCe=o((t,e)=>{if(t.length<=e)return t;let r=[];for(let n of t.split(/\s+/)){let i=r.length-1;i>=0&&r[i].length+1+n.length<=e?r[i]+=" "+n:r.push(n)}return r.join(` -`)},"wrapText"),S_=o((t,e,r,n,i,a,s)=>{let l=qpt(e),u=s*1.05,h=t.append("text").attr("class",i).attr("text-anchor",a).attr("x",r).attr("y",n-(l.length-1)*u/2);for(let[f,d]of l.entries())h.append("tspan").attr("x",r).attr("dy",f===0?0:u).text(d);return h},"drawMultilineText"),KCe=o((t,e,r)=>t+(e-t)*r,"lerp"),Jv=o((t,e,r,n,i,a,s)=>{if(s){let l=s.roughSvg.line(e,r,n,i,{roughness:1.5,seed:s.seed,stroke:s.lineColor,strokeWidth:2});t.append(()=>l).attr("class",a);return}return t.append("line").attr("class",a).attr("x1",e).attr("y1",r).attr("x2",n).attr("y2",i)},"drawLine"),JCe={draw:Fpt}});var Upt,t6e,r6e=O(()=>{"use strict";Upt=o(t=>` -.ishikawa .ishikawa-spine, -.ishikawa .ishikawa-branch, -.ishikawa .ishikawa-sub-branch { - stroke: ${t.lineColor}; - stroke-width: 2; - fill: none; -} - -.ishikawa .ishikawa-sub-branch { - stroke-width: 1; -} - -.ishikawa .ishikawa-arrow { - fill: ${t.lineColor}; -} - -.ishikawa .ishikawa-head { - fill: ${t.mainBkg}; - stroke: ${t.lineColor}; - stroke-width: 2; -} - -.ishikawa .ishikawa-label-box { - fill: ${t.mainBkg}; - stroke: ${t.lineColor}; - stroke-width: 2; -} - -.ishikawa text { - font-family: ${t.fontFamily}; - font-size: ${t.fontSize}; - fill: ${t.textColor}; -} - -.ishikawa .ishikawa-head-label { - font-weight: 600; - text-anchor: middle; - dominant-baseline: middle; - font-size: 14px; -} - -.ishikawa .ishikawa-label { - text-anchor: end; -} - -.ishikawa .ishikawa-label.cause { - text-anchor: middle; - dominant-baseline: middle; -} - -.ishikawa .ishikawa-label.align { - text-anchor: end; - dominant-baseline: middle; -} - -.ishikawa .ishikawa-label.up { - dominant-baseline: baseline; -} - -.ishikawa .ishikawa-label.down { - dominant-baseline: hanging; -} -`,"getStyles"),t6e=Upt});var n6e={};vr(n6e,{diagram:()=>Wpt});var Wpt,i6e=O(()=>{"use strict";UCe();WCe();e6e();r6e();Wpt={parser:qCe,get db(){return new E_},renderer:JCe,styles:t6e}});var zW,o6e,l6e=O(()=>{"use strict";zW=(function(){var t=o(function(b,T,E,w){for(E=E||{},w=b.length;w--;E[b[w]]=T);return E},"o"),e=[5,8],r=[7,8,11,12,17,19,22,24],n=[1,17],i=[1,18],a=[7,8,11,12,14,15,16,17,19,20,21,22,24,27],s=[1,31],l=[1,39],u=[7,8,11,12,17,19,22,24,27],h=[1,57],f=[1,56],d=[1,58],p=[1,59],m=[1,60],g=[7,8,11,12,16,17,19,20,22,24,27,31,32,33],y={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,optNewlines:4,VENN:5,document:6,EOF:7,NEWLINE:8,line:9,statement:10,TITLE:11,SET:12,identifier:13,BRACKET_LABEL:14,COLON:15,NUMERIC:16,UNION:17,identifierList:18,TEXT:19,IDENTIFIER:20,STRING:21,INDENT_TEXT:22,indentedTextTail:23,STYLE:24,stylesOpt:25,styleField:26,COMMA:27,styleValue:28,valueTokens:29,valueToken:30,HEXCOLOR:31,RGBCOLOR:32,RGBACOLOR:33,$accept:0,$end:1},terminals_:{2:"error",5:"VENN",7:"EOF",8:"NEWLINE",11:"TITLE",12:"SET",14:"BRACKET_LABEL",15:"COLON",16:"NUMERIC",17:"UNION",19:"TEXT",20:"IDENTIFIER",21:"STRING",22:"INDENT_TEXT",24:"STYLE",27:"COMMA",31:"HEXCOLOR",32:"RGBCOLOR",33:"RGBACOLOR"},productions_:[0,[3,4],[4,0],[4,2],[6,0],[6,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,5],[10,2],[10,3],[10,4],[10,5],[10,3],[10,3],[10,3],[10,4],[10,4],[10,2],[10,3],[23,1],[23,1],[23,1],[23,2],[23,2],[25,1],[25,3],[26,3],[28,1],[28,1],[29,1],[29,2],[30,1],[30,1],[30,1],[30,1],[30,1],[18,1],[18,3],[13,1],[13,1]],performAction:o(function(T,E,w,k,S,A,L){var I=A.length-1;switch(S){case 1:return A[I-1];case 2:case 3:case 4:this.$=[];break;case 5:A[I-1].push(A[I]),this.$=A[I-1];break;case 6:this.$=[];break;case 7:case 22:case 32:case 36:case 37:case 38:case 39:case 40:this.$=A[I];break;case 8:k.setDiagramTitle(A[I].substr(6)),this.$=A[I].substr(6);break;case 9:k.addSubsetData([A[I]],void 0,void 0),k.setIndentMode&&k.setIndentMode(!0);break;case 10:k.addSubsetData([A[I-1]],A[I],void 0),k.setIndentMode&&k.setIndentMode(!0);break;case 11:k.addSubsetData([A[I-2]],void 0,parseFloat(A[I])),k.setIndentMode&&k.setIndentMode(!0);break;case 12:k.addSubsetData([A[I-3]],A[I-2],parseFloat(A[I])),k.setIndentMode&&k.setIndentMode(!0);break;case 13:if(A[I].length<2)throw new Error("union requires multiple identifiers");k.validateUnionIdentifiers&&k.validateUnionIdentifiers(A[I]),k.addSubsetData(A[I],void 0,void 0),k.setIndentMode&&k.setIndentMode(!0);break;case 14:if(A[I-1].length<2)throw new Error("union requires multiple identifiers");k.validateUnionIdentifiers&&k.validateUnionIdentifiers(A[I-1]),k.addSubsetData(A[I-1],A[I],void 0),k.setIndentMode&&k.setIndentMode(!0);break;case 15:if(A[I-2].length<2)throw new Error("union requires multiple identifiers");k.validateUnionIdentifiers&&k.validateUnionIdentifiers(A[I-2]),k.addSubsetData(A[I-2],void 0,parseFloat(A[I])),k.setIndentMode&&k.setIndentMode(!0);break;case 16:if(A[I-3].length<2)throw new Error("union requires multiple identifiers");k.validateUnionIdentifiers&&k.validateUnionIdentifiers(A[I-3]),k.addSubsetData(A[I-3],A[I-2],parseFloat(A[I])),k.setIndentMode&&k.setIndentMode(!0);break;case 17:case 18:case 19:k.addTextData(A[I-1],A[I],void 0);break;case 20:case 21:k.addTextData(A[I-2],A[I-1],A[I]);break;case 23:k.addStyleData(A[I-1],A[I]);break;case 24:case 25:case 26:var N=k.getCurrentSets();if(!N)throw new Error("text requires set");k.addTextData(N,A[I],void 0);break;case 27:case 28:var N=k.getCurrentSets();if(!N)throw new Error("text requires set");k.addTextData(N,A[I-1],A[I]);break;case 29:case 41:this.$=[A[I]];break;case 30:case 42:this.$=[...A[I-2],A[I]];break;case 31:this.$=[A[I-2],A[I]];break;case 33:this.$=A[I].join(" ");break;case 34:this.$=[A[I]];break;case 35:A[I-1].push(A[I]),this.$=A[I-1];break;case 43:case 44:this.$=A[I];break}},"anonymous"),table:[t(e,[2,2],{3:1,4:2}),{1:[3]},{5:[1,3],8:[1,4]},t(r,[2,4],{6:5}),t(e,[2,3]),{7:[1,6],8:[1,8],9:7,10:9,11:[1,10],12:[1,11],17:[1,12],19:[1,13],22:[1,14],24:[1,15]},{1:[2,1]},t(r,[2,5]),t(r,[2,6]),t(r,[2,7]),t(r,[2,8]),{13:16,20:n,21:i},{13:20,18:19,20:n,21:i},{13:20,18:21,20:n,21:i},{16:[1,25],20:[1,23],21:[1,24],23:22},{13:20,18:26,20:n,21:i},t(r,[2,9],{14:[1,27],15:[1,28]}),t(a,[2,43]),t(a,[2,44]),t(r,[2,13],{14:[1,29],15:[1,30],27:s}),t(a,[2,41]),{16:[1,34],20:[1,32],21:[1,33],27:s},t(r,[2,22]),t(r,[2,24],{14:[1,35]}),t(r,[2,25],{14:[1,36]}),t(r,[2,26]),{20:l,25:37,26:38,27:s},t(r,[2,10],{15:[1,40]}),{16:[1,41]},t(r,[2,14],{15:[1,42]}),{16:[1,43]},{13:44,20:n,21:i},t(r,[2,17],{14:[1,45]}),t(r,[2,18],{14:[1,46]}),t(r,[2,19]),t(r,[2,27]),t(r,[2,28]),t(r,[2,23],{27:[1,47]}),t(u,[2,29]),{15:[1,48]},{16:[1,49]},t(r,[2,11]),{16:[1,50]},t(r,[2,15]),t(a,[2,42]),t(r,[2,20]),t(r,[2,21]),{20:l,26:51},{16:h,20:f,21:[1,53],28:52,29:54,30:55,31:d,32:p,33:m},t(r,[2,12]),t(r,[2,16]),t(u,[2,30]),t(u,[2,31]),t(u,[2,32]),t(u,[2,33],{30:61,16:h,20:f,31:d,32:p,33:m}),t(g,[2,34]),t(g,[2,36]),t(g,[2,37]),t(g,[2,38]),t(g,[2,39]),t(g,[2,40]),t(g,[2,35])],defaultActions:{6:[2,1]},parseError:o(function(T,E){if(E.recoverable)this.trace(T);else{var w=new Error(T);throw w.hash=E,w}},"parseError"),parse:o(function(T){var E=this,w=[0],k=[],S=[null],A=[],L=this.table,I="",N=0,C=0,_=0,D=2,M=1,R=A.slice.call(arguments,1),P=Object.create(this.lexer),B={yy:{}};for(var F in this.yy)Object.prototype.hasOwnProperty.call(this.yy,F)&&(B.yy[F]=this.yy[F]);P.setInput(T,B.yy),B.yy.lexer=P,B.yy.parser=this,typeof P.yylloc>"u"&&(P.yylloc={});var G=P.yylloc;A.push(G);var $=P.options&&P.options.ranges;typeof B.yy.parseError=="function"?this.parseError=B.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function V(Me){w.length=w.length-2*Me,S.length=S.length-Me,A.length=A.length-Me}o(V,"popStack");function X(){var Me;return Me=k.pop()||P.lex()||M,typeof Me!="number"&&(Me instanceof Array&&(k=Me,Me=k.pop()),Me=E.symbols_[Me]||Me),Me}o(X,"lex");for(var Q,H,ie,Y,le,ee,J={},te,Z,xe,de;;){if(ie=w[w.length-1],this.defaultActions[ie]?Y=this.defaultActions[ie]:((Q===null||typeof Q>"u")&&(Q=X()),Y=L[ie]&&L[ie][Q]),typeof Y>"u"||!Y.length||!Y[0]){var Se="";de=[];for(te in L[ie])this.terminals_[te]&&te>D&&de.push("'"+this.terminals_[te]+"'");P.showPosition?Se="Parse error on line "+(N+1)+`: -`+P.showPosition()+` -Expecting `+de.join(", ")+", got '"+(this.terminals_[Q]||Q)+"'":Se="Parse error on line "+(N+1)+": Unexpected "+(Q==M?"end of input":"'"+(this.terminals_[Q]||Q)+"'"),this.parseError(Se,{text:P.match,token:this.terminals_[Q]||Q,line:P.yylineno,loc:G,expected:de})}if(Y[0]instanceof Array&&Y.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ie+", token: "+Q);switch(Y[0]){case 1:w.push(Q),S.push(P.yytext),A.push(P.yylloc),w.push(Y[1]),Q=null,H?(Q=H,H=null):(C=P.yyleng,I=P.yytext,N=P.yylineno,G=P.yylloc,_>0&&_--);break;case 2:if(Z=this.productions_[Y[1]][1],J.$=S[S.length-Z],J._$={first_line:A[A.length-(Z||1)].first_line,last_line:A[A.length-1].last_line,first_column:A[A.length-(Z||1)].first_column,last_column:A[A.length-1].last_column},$&&(J._$.range=[A[A.length-(Z||1)].range[0],A[A.length-1].range[1]]),ee=this.performAction.apply(J,[I,C,N,B.yy,Y[1],S,A].concat(R)),typeof ee<"u")return ee;Z&&(w=w.slice(0,-1*Z*2),S=S.slice(0,-1*Z),A=A.slice(0,-1*Z)),w.push(this.productions_[Y[1]][0]),S.push(J.$),A.push(J._$),xe=L[w[w.length-2]][w[w.length-1]],w.push(xe);break;case 3:return!0}}return!0},"parse")},v=(function(){var b={EOF:1,parseError:o(function(E,w){if(this.yy.parser)this.yy.parser.parseError(E,w);else throw new Error(E)},"parseError"),setInput:o(function(T,E){return this.yy=E||this.yy||{},this._input=T,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var T=this._input[0];this.yytext+=T,this.yyleng++,this.offset++,this.match+=T,this.matched+=T;var E=T.match(/(?:\r\n?|\n).*/g);return E?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),T},"input"),unput:o(function(T){var E=T.length,w=T.split(/(?:\r\n?|\n)/g);this._input=T+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-E),this.offset-=E;var k=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),w.length-1&&(this.yylineno-=w.length-1);var S=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:w?(w.length===k.length?this.yylloc.first_column:0)+k[k.length-w.length].length-w[0].length:this.yylloc.first_column-E},this.options.ranges&&(this.yylloc.range=[S[0],S[0]+this.yyleng-E]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(T){this.unput(this.match.slice(T))},"less"),pastInput:o(function(){var T=this.matched.substr(0,this.matched.length-this.match.length);return(T.length>20?"...":"")+T.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var T=this.match;return T.length<20&&(T+=this._input.substr(0,20-T.length)),(T.substr(0,20)+(T.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var T=this.pastInput(),E=new Array(T.length+1).join("-");return T+this.upcomingInput()+` -`+E+"^"},"showPosition"),test_match:o(function(T,E){var w,k,S;if(this.options.backtrack_lexer&&(S={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(S.yylloc.range=this.yylloc.range.slice(0))),k=T[0].match(/(?:\r\n?|\n).*/g),k&&(this.yylineno+=k.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:k?k[k.length-1].length-k[k.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+T[0].length},this.yytext+=T[0],this.match+=T[0],this.matches=T,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(T[0].length),this.matched+=T[0],w=this.performAction.call(this,this.yy,this,E,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),w)return w;if(this._backtrack){for(var A in S)this[A]=S[A];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var T,E,w,k;this._more||(this.yytext="",this.match="");for(var S=this._currentRules(),A=0;AE[0].length)){if(E=w,k=A,this.options.backtrack_lexer){if(T=this.test_match(w,S[A]),T!==!1)return T;if(this._backtrack){E=!1;continue}else return!1}else if(!this.options.flex)break}return E?(T=this.test_match(E,S[k]),T!==!1?T:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var E=this.next();return E||this.lex()},"lex"),begin:o(function(E){this.conditionStack.push(E)},"begin"),popState:o(function(){var E=this.conditionStack.length-1;return E>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(E){return E=this.conditionStack.length-1-Math.abs(E||0),E>=0?this.conditionStack[E]:"INITIAL"},"topState"),pushState:o(function(E){this.begin(E)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(E,w,k,S){var A=S;switch(k){case 0:break;case 1:break;case 2:break;case 3:if(E.getIndentMode&&E.getIndentMode())return E.consumeIndentText=!0,this.begin("INITIAL"),22;break;case 4:break;case 5:E.setIndentMode&&E.setIndentMode(!1),this.begin("INITIAL"),this.unput(w.yytext);break;case 6:return this.begin("bol"),8;break;case 7:break;case 8:break;case 9:return 7;case 10:return 11;case 11:return 5;case 12:return 12;case 13:return 17;case 14:if(E.consumeIndentText)E.consumeIndentText=!1;else return 19;break;case 15:return 24;case 16:return w.yytext=w.yytext.slice(2,-2),14;break;case 17:return w.yytext=w.yytext.slice(1,-1).trim(),14;break;case 18:return 16;case 19:return 31;case 20:return 33;case 21:return 32;case 22:return 20;case 23:return 21;case 24:return 27;case 25:return 15}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[ \t]+(?=[\n\r]))/i,/^(?:[ \t]+(?=text\b))/i,/^(?:[ \t]+)/i,/^(?:[^ \t\n\r])/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[ \t]+)/i,/^(?:$)/i,/^(?:title\s[^#\n;]+)/i,/^(?:venn-beta\b)/i,/^(?:set\b)/i,/^(?:union\b)/i,/^(?:text\b)/i,/^(?:style\b)/i,/^(?:\["[^\"]*"\])/i,/^(?:\[[^\]\"]+\])/i,/^(?:[+-]?(\d+(\.\d+)?|\.\d+))/i,/^(?:#[0-9a-fA-F]{3,8})/i,/^(?:rgba\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:rgb\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:"[^\"]*")/i,/^(?:,)/i,/^(?::)/i],conditions:{bol:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0},INITIAL:{rules:[0,1,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0}}};return b})();y.lexer=v;function x(){this.yy={}}return o(x,"Parser"),x.prototype=y,y.Parser=x,new x})();zW.parser=zW;o6e=zW});function s0t(){return Pn(a0t,Zt().venn)}var GW,VW,qW,UW,WW,HW,jpt,Xpt,N3,Kpt,Qpt,Zpt,Jpt,C_,e0t,t0t,r0t,n0t,i0t,a0t,o0t,c6e,u6e=O(()=>{"use strict";ar();$r();si();La();GW=[],VW=[],qW=[],UW=new Set,HW=!1,jpt=o((t,e,r)=>{let n=C_(t).sort(),i=r??10/Math.pow(t.length,2);WW=n,n.length===1&&UW.add(n[0]),GW.push({sets:n,size:i,label:e?N3(e):void 0})},"addSubsetData"),Xpt=o(()=>GW,"getSubsetData"),N3=o(t=>{let e=t.trim();return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e},"normalizeText"),Kpt=o(t=>t&&N3(t),"normalizeStyleValue"),Qpt=o((t,e,r)=>{let n=N3(e);VW.push({sets:C_(t).sort(),id:n,label:r?N3(r):void 0})},"addTextData"),Zpt=o((t,e)=>{let r=C_(t).sort(),n={};for(let[i,a]of e)n[i]=Kpt(a)??a;qW.push({targets:r,styles:n})},"addStyleData"),Jpt=o(()=>qW,"getStyleData"),C_=o(t=>t.map(e=>N3(e)),"normalizeIdentifierList"),e0t=o(t=>{let r=C_(t).filter(n=>!UW.has(n));if(r.length>0)throw new Error(`unknown set identifier: ${r.join(", ")}`)},"validateUnionIdentifiers"),t0t=o(()=>VW,"getTextData"),r0t=o(()=>WW,"getCurrentSets"),n0t=o(()=>HW,"getIndentMode"),i0t=o(t=>{HW=t},"setIndentMode"),a0t=gr.venn;o(s0t,"getConfig");o0t=o(()=>{_r(),GW.length=0,VW.length=0,qW.length=0,UW.clear(),WW=void 0,HW=!1},"customClear"),c6e={getConfig:s0t,clear:o0t,setAccTitle:Lr,getAccTitle:Or,setDiagramTitle:zr,getDiagramTitle:Fr,getAccDescription:Br,setAccDescription:Pr,addSubsetData:jpt,getSubsetData:Xpt,addTextData:Qpt,addStyleData:Zpt,validateUnionIdentifiers:e0t,getTextData:t0t,getStyleData:Jpt,getCurrentSets:r0t,getIndentMode:n0t,setIndentMode:i0t}});var l0t,h6e,f6e=O(()=>{"use strict";l0t=o(t=>` - .venn-title { - font-size: 32px; - fill: ${t.vennTitleTextColor}; - font-family: ${t.fontFamily}; - } - - .venn-circle text { - font-size: 48px; - font-family: ${t.fontFamily}; - } - - .venn-intersection text { - font-size: 48px; - fill: ${t.vennSetTextColor}; - font-family: ${t.fontFamily}; - } - - .venn-text-node { - font-family: ${t.fontFamily}; - color: ${t.vennSetTextColor}; - } -`,"getStyles"),h6e=l0t});function A_(t,e){let r=u0t(t),n=r.filter(l=>c0t(l,t)),i=0,a=0,s=[];if(n.length>1){let l=g6e(n);for(let h=0;hf.angle-h.angle);let u=n[n.length-1];for(let h=0;hg.radius*2&&(T=g.radius*2),(p==null||p.width>T)&&(p={circle:g,width:T,p1:f,p2:u,large:T>g.radius,sweep:!0})}p!=null&&(s.push(p),i+=XW(p.circle.radius,p.width),u=f)}}else{let l=t[0];for(let h=1;hMath.abs(l.radius-t[h].radius)){u=!0;break}u?i=a=0:(i=l.radius*l.radius*Math.PI,s.push({circle:l,p1:{x:l.x,y:l.y+l.radius},p2:{x:l.x-1e-10,y:l.y+l.radius},width:l.radius*2,large:!0,sweep:!0}))}return a/=2,e&&(e.area=i+a,e.arcArea=i,e.polygonArea=a,e.arcs=s,e.innerPoints=n,e.intersectionPoints=r),i+a}function c0t(t,e){return e.every(r=>No(t,r)=t+e)return 0;if(r<=Math.abs(t-e))return Math.PI*Math.min(t,e)*Math.min(t,e);let n=t-(r*r-e*e+t*t)/(2*r),i=e-(r*r-t*t+e*e)/(2*r);return XW(t,n)+XW(e,i)}function m6e(t,e){let r=No(t,e),n=t.radius,i=e.radius;if(r>=n+i||r<=Math.abs(n-i))return[];let a=(n*n-i*i+r*r)/(2*r),s=Math.sqrt(n*n-a*a),l=t.x+a*(e.x-t.x)/r,u=t.y+a*(e.y-t.y)/r,h=-(e.y-t.y)*(s/r),f=-(e.x-t.x)*(s/r);return[{x:l+h,y:u-f},{x:l-h,y:u+f}]}function g6e(t){let e={x:0,y:0};for(let r of t)e.x+=r.x,e.y+=r.y;return e.x/=t.length,e.y/=t.length,e}function h0t(t,e,r,n){n=n||{};let i=n.maxIterations||100,a=n.tolerance||1e-10,s=t(e),l=t(r),u=r-e;if(s*l>0)throw"Initial bisect points must have opposite signs";if(s===0)return e;if(l===0)return r;for(let h=0;h=0&&(e=f),Math.abs(u)KW(e))}function e2(t,e){let r=0;for(let n=0;nw.fx-k.fx,"sortOrder"),x=e.slice(),b=e.slice(),T=e.slice(),E=e.slice();for(let w=0;w{let L=A.slice();return L.fx=A.fx,L.id=A.id,L});S.sort((A,L)=>A.id-L.id),r.history.push({x:g[0].slice(),fx:g[0].fx,simplex:S})}p=0;for(let S=0;S=g[m-1].fx){let S=!1;if(b.fx>k.fx?(hf(T,1+f,x,-f,k),T.fx=t(T),T.fx=1)break;for(let A=1;Al+a*i*u||h>=v)y=i;else{if(Math.abs(d)<=-s*u)return i;d*(y-g)>=0&&(y=g),g=i,v=h}return 0}o(m,"zoom");for(let g=0;g<10;++g){if(hf(n.x,1,r.x,i,e),h=n.fx=t(n.x,n.fxprime),d=e2(n.fxprime,e),h>l+a*i*u||g&&h>=f)return m(p,i,f);if(Math.abs(d)<=-s*u)return i;if(d>=0)return m(i,p,h);f=h,p=i,i*=2}return i}function d0t(t,e,r){let n={x:e.slice(),fx:0,fxprime:e.slice()},i={x:e.slice(),fx:0,fxprime:e.slice()},a=e.slice(),s,l,u=1,h;r=r||{},h=r.maxIterations||e.length*20,n.fx=t(n.x,n.fxprime),s=n.fxprime.slice(),ZW(s,n.fxprime,-1);for(let f=0;f{let d={};for(let p=0;ptH(t,e,n)-r,0,t+e)}function p0t(t,e={}){let r=e.distinct,n=t.map(l=>Object.assign({},l));function i(l){return l.join(";")}if(o(i,"toKey"),r){let l=new Map;for(let u of n)for(let h=0;hl===u?0:la.sets.length===2).forEach(a=>{let s=r[a.sets[0]],l=r[a.sets[1]],u=Math.sqrt(e[s].size/Math.PI),h=Math.sqrt(e[l].size/Math.PI),f=JW(u,h,a.size);n[s][l]=n[l][s]=f;let d=0;a.size+1e-10>=Math.min(e[s].size,e[l].size)?d=1:a.size<=1e-10&&(d=-1),i[s][l]=i[l][s]=d}),{distances:n,constraints:i}}function g0t(t,e,r,n){for(let a=0;a0&&g<=d||p<0&&g>=d||(i+=2*y*y,e[2*a]+=4*y*(s-h),e[2*a+1]+=4*y*(l-f),e[2*u]+=4*y*(h-s),e[2*u+1]+=4*y*(f-l))}}return i}function y0t(t,e={}){let r=x0t(t,e),n=e.lossFunction||t2;if(t.length>=8){let i=v0t(t,e),a=n(i,t),s=n(r,t);a+1e-8p.map(m=>m/l));let u=o((p,m)=>g0t(p,m,a,s),"obj"),h=null;for(let p=0;pd.sets.length===2);for(let d of t){let p=d.weight!=null?d.weight:1,m=d.sets[0],g=d.sets[1];d.size+x6e>=Math.min(n[m].size,n[g].size)&&(p=0),i[m].push({set:g,size:d.size,weight:p}),i[g].push({set:m,size:d.size,weight:p})}let a=[];Object.keys(i).forEach(d=>{let p=0;for(let m=0;mt[s]));let a=n.weight!=null?n.weight:1;r+=a*(i-n.size)*(i-n.size)}return r}function b6e(t,e){let r=0;for(let n of e){if(n.sets.length===1)continue;let i;if(n.sets.length===2){let l=t[n.sets[0]],u=t[n.sets[1]];i=tH(l.radius,u.radius,No(l,u))}else i=A_(n.sets.map(l=>t[l]));let a=n.weight!=null?n.weight:1,s=Math.log((i+1)/(n.size+1));r+=a*s*s}return r}function b0t(t,e,r){if(r==null?t.sort((i,a)=>a.radius-i.radius):t.sort(r),t.length>0){let i=t[0].x,a=t[0].y;for(let s of t)s.x-=i,s.y-=a}if(t.length===2&&No(t[0],t[1])1){let i=Math.atan2(t[1].x,t[1].y)-e,a=Math.cos(i),s=Math.sin(i);for(let l of t){let u=l.x,h=l.y;l.x=a*u-s*h,l.y=s*u+a*h}}if(t.length>2){let i=Math.atan2(t[2].x,t[2].y)-e;for(;i<0;)i+=2*Math.PI;for(;i>2*Math.PI;)i-=2*Math.PI;if(i>Math.PI){let a=t[1].y/(1e-10+t[1].x);for(let s of t){var n=(s.x+a*s.y)/(1+a*a);s.x=2*n-s.x,s.y=2*n*a-s.y}}}}function T0t(t){t.forEach(i=>{i.parent=i});function e(i){return i.parent!==i&&(i.parent=e(i.parent)),i.parent}o(e,"find");function r(i,a){let s=e(i),l=e(a);s.parent=l}o(r,"union");for(let i=0;i{delete i.parent}),Array.from(n.values())}function eH(t){let e=o(r=>{let n=t.reduce((a,s)=>Math.max(a,s[r]+s.radius),Number.NEGATIVE_INFINITY),i=t.reduce((a,s)=>Math.min(a,s[r]-s.radius),Number.POSITIVE_INFINITY);return{max:n,min:i}},"minMax");return{xRange:e("x"),yRange:e("y")}}function T6e(t,e,r){e==null&&(e=Math.PI/2);let n=E6e(t).map(h=>Object.assign({},h)),i=T0t(n);for(let h of i){b0t(h,e,r);let f=eH(h);h.size=(f.xRange.max-f.xRange.min)*(f.yRange.max-f.yRange.min),h.bounds=f}i.sort((h,f)=>f.size-h.size),n=i[0];let a=n.bounds,s=(a.xRange.max-a.xRange.min)/50;function l(h,f,d){if(!h)return;let p=h.bounds,m,g;if(f)m=a.xRange.max-p.xRange.min+s;else{m=a.xRange.max-p.xRange.max;let y=(p.xRange.max-p.xRange.min)/2-(a.xRange.max-a.xRange.min)/2;y<0&&(m+=y)}if(d)g=a.yRange.max-p.yRange.min+s;else{g=a.yRange.max-p.yRange.max;let y=(p.yRange.max-p.yRange.min)/2-(a.yRange.max-a.yRange.min)/2;y<0&&(g+=y)}for(let y of h)y.x+=m,y.y+=g,n.push(y)}o(l,"addCluster");let u=1;for(;u({radius:f*m.radius,x:n+d+(m.x-s.min)*f,y:n+p+(m.y-l.min)*f,setid:m.setid})))}function k6e(t){let e={};for(let r of t)e[r.setid]=r;return e}function E6e(t){return Object.keys(t).map(r=>Object.assign(t[r],{setid:r}))}function S6e(t={}){let e=!1,r=600,n=350,i=15,a=1e3,s=Math.PI/2,l=!0,u=null,h=!0,f=!0,d=null,p=null,m=!1,g=null,y=t&&t.symmetricalTextCentre?t.symmetricalTextCentre:!1,v={},x=t&&t.colourScheme?t.colourScheme:t&&t.colorScheme?t.colorScheme:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],b=0,T=o(function(S){if(S in v)return v[S];var A=v[S]=x[b];return b+=1,b>=x.length&&(b=0),A},"colours"),E=v6e,w=t2;function k(S){let A=S.datum(),L=new Set;A.forEach(Y=>{Y.size==0&&Y.sets.length==1&&L.add(Y.sets[0])}),A=A.filter(Y=>!Y.sets.some(le=>L.has(le)));let I={},N={};if(A.length>0){let Y=E(A,{lossFunction:w,distinct:m});l&&(Y=T6e(Y,s,p)),I=w6e(Y,r,n,i,u),N=A6e(I,A,y)}let C={};A.forEach(Y=>{Y.label&&(C[Y.sets]=Y.label)});function _(Y){if(Y.sets in C)return C[Y.sets];if(Y.sets.length==1)return""+Y.sets[0]}o(_,"label"),S.selectAll("svg").data([I]).enter().append("svg");let D=S.select("svg");e?D.attr("viewBox",`0 0 ${r} ${n}`):D.attr("width",r).attr("height",n);let M={},R=!1;D.selectAll(".venn-area path").each(function(Y){let le=this.getAttribute("d");Y.sets.length==1&&le&&!m&&(R=!0,M[Y.sets[0]]=E0t(le))});function P(Y){return le=>{let ee=Y.sets.map(J=>{let te=M[J],Z=I[J];return te||(te={x:r/2,y:n/2,radius:1}),Z||(Z={x:r/2,y:n/2,radius:1}),{x:te.x*(1-le)+Z.x*le,y:te.y*(1-le)+Z.y*le,radius:te.radius*(1-le)+Z.radius*le}});return p6e(ee,g)}}o(P,"pathTween");let B=D.selectAll(".venn-area").data(A,Y=>Y.sets),F=B.enter().append("g").attr("class",Y=>`venn-area venn-${Y.sets.length==1?"circle":"intersection"}${Y.colour||Y.color?" venn-coloured":""}`).attr("data-venn-sets",Y=>Y.sets.join("_")),G=F.append("path"),$=F.append("text").attr("class","label").text(Y=>_(Y)).attr("text-anchor","middle").attr("dy",".35em").attr("x",r/2).attr("y",n/2);f&&(G.style("fill-opacity","0").filter(Y=>Y.sets.length==1).style("fill",Y=>Y.colour?Y.colour:Y.color?Y.color:T(Y.sets)).style("fill-opacity",".25"),$.style("fill",Y=>Y.colour||Y.color?"#FFF":t.textFill?t.textFill:Y.sets.length==1?T(Y.sets):"#444"));function V(Y){return typeof Y.transition=="function"?Y.transition("venn").duration(a):Y}o(V,"asTransition");let X=S;R&&typeof X.transition=="function"?(X=V(S),X.selectAll("path").attrTween("d",P)):X.selectAll("path").attr("d",Y=>p6e(Y.sets.map(le=>I[le])),g);let Q=X.selectAll("text").filter(Y=>Y.sets in N).text(Y=>_(Y)).attr("x",Y=>Math.floor(N[Y.sets].x)).attr("y",Y=>Math.floor(N[Y.sets].y));h&&(R?"on"in Q?Q.on("end",YW(I,_)):Q.each("end",YW(I,_)):Q.each(YW(I,_)));let H=V(B.exit()).remove();typeof B.transition=="function"&&H.selectAll("path").attrTween("d",P);let ie=H.selectAll("text").attr("x",r/2).attr("y",n/2);return d!==null&&($.style("font-size","0px"),Q.style("font-size",d),ie.style("font-size","0px")),{circles:I,textCentres:N,nodes:B,enter:F,update:X,exit:H}}return o(k,"chart"),k.wrap=function(S){return arguments.length?(h=S,k):h},k.useViewBox=function(){return e=!0,k},k.width=function(S){return arguments.length?(r=S,k):r},k.height=function(S){return arguments.length?(n=S,k):n},k.padding=function(S){return arguments.length?(i=S,k):i},k.distinct=function(S){return arguments.length?(m=S,k):m},k.colours=function(S){return arguments.length?(T=S,k):T},k.colors=function(S){return arguments.length?(T=S,k):T},k.fontSize=function(S){return arguments.length?(d=S,k):d},k.round=function(S){return arguments.length?(g=S,k):g},k.duration=function(S){return arguments.length?(a=S,k):a},k.layoutFunction=function(S){return arguments.length?(E=S,k):E},k.normalize=function(S){return arguments.length?(l=S,k):l},k.scaleToFit=function(S){return arguments.length?(u=S,k):u},k.styled=function(S){return arguments.length?(f=S,k):f},k.orientation=function(S){return arguments.length?(s=S,k):s},k.orientationOrder=function(S){return arguments.length?(p=S,k):p},k.lossFunction=function(S){return arguments.length?(w=S==="default"?t2:S==="logRatio"?b6e:S,k):w},k}function YW(t,e){return function(r){let n=this,i=t[r.sets[0]].radius||50,a=e(r)||"",s=a.split(/\s+/).reverse(),u=(a.length+s.length)/3,h=s.pop(),f=[h],d=0,p=1.1;n.textContent=null;let m=[];function g(T){let E=n.ownerDocument.createElementNS(n.namespaceURI,"tspan");return E.textContent=T,m.push(E),n.append(E),E}o(g,"append");let y=g(h);for(;h=s.pop(),!!h;){f.push(h);let T=f.join(" ");y.textContent=T,T.length>u&&y.getComputedTextLength()>i&&(f.pop(),y.textContent=f.join(" "),f=[h],y=g(h),d++)}let v=.35-d*p/2,x=n.getAttribute("x"),b=n.getAttribute("y");m.forEach((T,E)=>{T.setAttribute("x",x),T.setAttribute("y",b),T.setAttribute("dy",`${v+E*p}em`)})}}function jW(t,e,r){let n=e[0].radius-No(e[0],t);for(let i=1;i=a&&(i=n[f],a=d)}let s=y6e(f=>-1*jW({x:f[0],y:f[1]},t,e),[i.x,i.y],{maxIterations:500,minErrorDelta:1e-10}).x,l={x:r?0:s[0],y:s[1]},u=!0;for(let f of t)if(No(l,f)>f.radius){u=!1;break}for(let f of e)if(No(l,f)f.p1))}function w0t(t){let e={},r=Object.keys(t);for(let n of r)e[n]=[];for(let n=0;n0&&console.log("WARNING: area "+s+" not represented on screen")}return n}function k0t(t,e,r){let n=[];return n.push(` -M`,t,e),n.push(` -m`,-r,0),n.push(` -a`,r,r,0,1,0,r*2,0),n.push(` -a`,r,r,0,1,0,-r*2,0),n.join(" ")}function E0t(t){let e=t.split(" ");return{x:Number.parseFloat(e[1]),y:Number.parseFloat(e[2]),radius:-Number.parseFloat(e[4])}}function _6e(t){if(t.length===0)return[];let e={};return A_(t,e),e.arcs}function D6e(t,e){if(t.length===0)return"M 0 0";let r=Math.pow(10,e||0),n=e!=null?a=>Math.round(a*r)/r:a=>a;if(t.length==1){let a=t[0].circle;return k0t(n(a.x),n(a.y),n(a.radius))}let i=[` -M`,n(t[0].p2.x),n(t[0].p2.y)];for(let a of t){let s=n(a.circle.radius);i.push(` -A`,s,s,0,a.large?1:0,a.sweep?1:0,n(a.p1.x),n(a.p1.y))}return i.join(" ")}function p6e(t,e){return D6e(_6e(t),e)}function R6e(t,e={}){let{lossFunction:r,layoutFunction:n=v6e,normalize:i=!0,orientation:a=Math.PI/2,orientationOrder:s,width:l=600,height:u=350,padding:h=15,scaleToFit:f=!1,symmetricalTextCentre:d=!1,distinct:p,round:m=2}=e,g=n(t,{lossFunction:r==="default"||!r?t2:r==="logRatio"?b6e:r,distinct:p});i&&(g=T6e(g,a,s));let y=w6e(g,l,u,h,f),v=A6e(y,t,d),x=new Map(Object.keys(y).map(E=>[E,{set:E,x:y[E].x,y:y[E].y,radius:y[E].radius}])),b=t.map(E=>{let w=E.sets.map(A=>x.get(A)),k=_6e(w),S=D6e(k,m);return{circles:w,arcs:k,path:S,area:E,has:new Set(E.sets)}});function T(E){let w="";for(let k of b)k.has.size>E.length&&E.every(S=>k.has.has(S))&&(w+=" "+k.path);return w}return o(T,"genDistinctPath"),b.map(({circles:E,arcs:w,path:k,area:S})=>({data:S,text:v[S.sets],circles:E,arcs:w,path:k,distinctPath:k+T(S.sets)}))}var x6e,L6e=O(()=>{"use strict";o(A_,"intersectionArea");o(c0t,"containedInCircles");o(u0t,"getIntersectionPoints");o(XW,"circleArea");o(No,"distance");o(tH,"circleOverlap");o(m6e,"circleCircleIntersection");o(g6e,"getCenter");o(h0t,"bisect");o(KW,"zeros");o(d6e,"zerosM");o(e2,"dot");o(QW,"norm2");o(ZW,"scale");o(hf,"weightedSum");o(y6e,"nelderMead");o(f0t,"wolfeLineSearch");o(d0t,"conjugateGradient");o(v6e,"venn");x6e=1e-10;o(JW,"distanceFromIntersectArea");o(p0t,"addMissingAreas");o(m0t,"getDistanceMatrices");o(g0t,"constrainedMDSGradient");o(y0t,"bestInitialLayout");o(v0t,"constrainedMDSLayout");o(x0t,"greedyLayout");o(t2,"lossFunction");o(b6e,"logRatioLossFunction");o(b0t,"orientateCircles");o(T0t,"disjointCluster");o(eH,"getBoundingBox");o(T6e,"normalizeSolution");o(w6e,"scaleSolution");o(k6e,"toObjectNotation");o(E6e,"fromObjectNotation");o(S6e,"VennDiagram");o(YW,"wrapText");o(jW,"circleMargin");o(C6e,"computeTextCentre");o(w0t,"getOverlappingCircles");o(A6e,"computeTextCentres");o(k0t,"circlePath");o(E0t,"circleFromPath");o(_6e,"intersectionAreaArcs");o(D6e,"arcsToPath");o(p6e,"intersectionAreaPath");o(R6e,"layout")});function C0t(t){let e=new Map;for(let r of t){let n=r.targets.join("|"),i=e.get(n);i?Object.assign(i,r.styles):e.set(n,{...r.styles})}return e}function ng(t){return t.join("|")}function _0t(t,e,r,n,i,a){let s=t?.useDebugLayout??!1,u=r.select("svg").append("g").attr("class","venn-text-nodes"),h=new Map;for(let f of n){let d=ng(f.sets),p=h.get(d);p?p.push(f):h.set(d,[f])}for(let[f,d]of h.entries()){let p=e.get(f);if(!p?.text)continue;let m=p.text.x,g=p.text.y,y=Math.min(...p.circles.map(D=>D.radius)),v=Math.min(...p.circles.map(D=>D.radius-Math.hypot(m-D.x,g-D.y))),x=Number.isFinite(v)?Math.max(0,v):0;x===0&&Number.isFinite(y)&&(x=y*.6);let b=u.append("g").attr("class","venn-text-area").attr("font-size",`${40*i}px`);s&&b.append("circle").attr("class","venn-text-debug-circle").attr("cx",m).attr("cy",g).attr("r",x).attr("fill","none").attr("stroke","purple").attr("stroke-width",1.5*i).attr("stroke-dasharray",`${6*i} ${4*i}`);let T=Math.max(80*i,x*2*.95),E=Math.max(60*i,x*2*.95),S=(p.data.label&&p.data.label.length>0?Math.min(32*i,x*.25):0)+(d.length<=2?30*i:0),A=m-T/2,L=g-E/2+S,I=Math.max(1,Math.ceil(Math.sqrt(d.length))),N=Math.max(1,Math.ceil(d.length/I)),C=T/I,_=E/N;for(let[D,M]of d.entries()){let R=D%I,P=Math.floor(D/I),B=A+C*(R+.5),F=L+_*(P+.5);s&&b.append("rect").attr("class","venn-text-debug-cell").attr("x",A+C*R).attr("y",L+_*P).attr("width",C).attr("height",_).attr("fill","none").attr("stroke","teal").attr("stroke-width",1*i).attr("stroke-dasharray",`${4*i} ${3*i}`);let G=C*.9,$=_*.9,V=b.append("foreignObject").attr("class","venn-text-node-fo").attr("width",G).attr("height",$).attr("x",B-G/2).attr("y",F-$/2).attr("overflow","visible"),X=a.get(M.id)?.color,Q=V.append("xhtml:span").attr("class","venn-text-node").style("display","flex").style("width","100%").style("height","100%").style("white-space","normal").style("align-items","center").style("justify-content","center").style("text-align","center").style("overflow-wrap","normal").style("word-break","normal").text(M.label??M.id);X&&Q.style("color",X)}}}var A0t,N6e,M6e=O(()=>{"use strict";Ar();Ys();$r();Ul();L6e();Ti();Wt();o(C0t,"buildStyleByKey");A0t=o((t,e,r,n)=>{let i=n.db,a=i.getConfig?.(),{themeVariables:s,look:l,handDrawnSeed:u}=Zt(),h=l==="handDrawn",f=[s.venn1,s.venn2,s.venn3,s.venn4,s.venn5,s.venn6,s.venn7,s.venn8].filter(Boolean),d=i.getDiagramTitle?.(),p=i.getSubsetData(),m=i.getTextData(),g=C0t(i.getStyleData()),y=a?.width??800,v=a?.height??450,b=y/1600,T=d?48*b:0,E=s.primaryTextColor??s.textColor,w=Ii(e);w.attr("viewBox",`0 0 ${y} ${v}`),d&&w.append("text").text(d).attr("class","venn-title").attr("font-size",`${32*b}px`).attr("text-anchor","middle").attr("dominant-baseline","middle").attr("x","50%").attr("y",32*b).style("fill",s.vennTitleTextColor||s.titleColor);let k=je(document.createElement("div")),S=S6e().width(y).height(v-T);k.datum(p).call(S);let A=h?Je.svg(k.select("svg").node()):void 0,L=R6e(p,{width:y,height:v-T,padding:a?.padding??15}),I=new Map;for(let D of L){let M=ng([...D.data.sets].sort());I.set(M,D)}m.length>0&&_0t(a,I,k,m,b,g);let N=Ji(s.background||"#f4f4f4");k.selectAll(".venn-circle").each(function(D,M){let R=je(this),B=ng([...D.sets].sort()),F=g.get(B),G=F?.fill||f[M%f.length]||s.primaryColor;R.classed(`venn-set-${M%8}`,!0);let $=F?.["fill-opacity"]??.1,V=F?.stroke||G,X=F?.["stroke-width"]||`${5*b}`;if(h&&A){let H=I.get(B);if(H&&H.circles.length>0){let ie=H.circles[0],Y=A.circle(ie.x,ie.y,ie.radius*2,{roughness:.7,seed:u,fill:K3(G,.7),fillStyle:"hachure",fillWeight:2,hachureGap:8,hachureAngle:-41+M*60,stroke:V,strokeWidth:parseFloat(String(X))});R.select("path").remove(),R.node()?.insertBefore(Y,R.select("text").node())}}else R.select("path").style("fill",G).style("fill-opacity",$).style("stroke",V).style("stroke-width",X).style("stroke-opacity",.95);let Q=F?.color||(N?Lt(G,30):Bt(G,30));R.select("text").style("font-size",`${48*b}px`).style("fill",Q)}),h&&A?k.selectAll(".venn-intersection").each(function(D){let M=je(this),P=ng([...D.sets].sort()),B=g.get(P),F=B?.fill;if(F){let G=M.select("path"),$=G.attr("d");if($){let V=A.path($,{roughness:.7,seed:u,fill:K3(F,.3),fillStyle:"cross-hatch",fillWeight:2,hachureGap:6,hachureAngle:60,stroke:"none"}),X=G.node();X?.parentNode?.insertBefore(V,X),G.remove()}}else M.select("path").style("fill-opacity",0);M.select("text").style("font-size",`${48*b}px`).style("fill",B?.color??s.vennSetTextColor??E)}):(k.selectAll(".venn-intersection text").style("font-size",`${48*b}px`).style("fill",D=>{let R=ng([...D.sets].sort());return g.get(R)?.color??s.vennSetTextColor??E}),k.selectAll(".venn-intersection path").style("fill-opacity",D=>{let R=ng([...D.sets].sort());return g.get(R)?.fill?1:0}).style("fill",D=>{let R=ng([...D.sets].sort());return g.get(R)?.fill??"transparent"}));let C=w.append("g").attr("transform",`translate(0, ${T})`),_=k.select("svg").node();if(_&&"childNodes"in _)for(let D of[..._.childNodes])C.node()?.appendChild(D);Zr(w,v,y,a?.useMaxWidth??!0)},"draw");o(ng,"stableSetsKey");o(_0t,"renderTextNodes");N6e={draw:A0t}});var I6e={};vr(I6e,{diagram:()=>D0t});var D0t,O6e=O(()=>{"use strict";l6e();u6e();f6e();M6e();D0t={parser:o6e,db:c6e,renderer:N6e,styles:h6e}});var r2,rH=O(()=>{"use strict";La();$r();ar();Ut();si();r2=class{constructor(){this.nodes=[];this.levels=new Map;this.outerNodes=[];this.classes=new Map;this.setAccTitle=Lr;this.getAccTitle=Or;this.setDiagramTitle=zr;this.getDiagramTitle=Fr;this.getAccDescription=Br;this.setAccDescription=Pr}static{o(this,"TreeMapDB")}getNodes(){return this.nodes}getConfig(){let e=gr,r=Zt();return Pn({...e.treemap,...r.treemap??{}})}addNode(e,r){this.nodes.push(e),this.levels.set(e,r),r===0&&(this.outerNodes.push(e),this.root??=e)}getRoot(){return{name:"",children:this.outerNodes}}addClass(e,r){let n=this.classes.get(e)??{id:e,styles:[],textStyles:[]},i=r.replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");i&&i.forEach(a=>{ub(a)&&(n?.textStyles?n.textStyles.push(a):n.textStyles=[a]),n?.styles?n.styles.push(a):n.styles=[a]}),this.classes.set(e,n)}getClasses(){return this.classes}getStylesForClass(e){return this.classes.get(e)?.styles??[]}clear(){_r(),this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.root=void 0}}});function F6e(t){if(!t.length)return[];let e=[],r=[];return t.forEach(n=>{let i={name:n.name,children:n.type==="Leaf"?void 0:[]};for(i.classSelector=n?.classSelector,n?.cssCompiledStyles&&(i.cssCompiledStyles=n.cssCompiledStyles),n.type==="Leaf"&&n.value!==void 0&&(i.value=n.value);r.length>0&&r[r.length-1].level>=n.level;)r.pop();if(r.length===0)e.push(i);else{let a=r[r.length-1].node;a.children?a.children.push(i):a.children=[i]}n.type!=="Leaf"&&r.push({node:i,level:n.level})}),e}var $6e=O(()=>{"use strict";o(F6e,"buildHierarchy")});var M0t,I0t,nH,z6e=O(()=>{"use strict";up();xt();Vm();$6e();rH();M0t=o((t,e)=>{ql(t,e);let r=[];for(let a of t.TreemapRows??[])a.$type==="ClassDefStatement"&&e.addClass(a.className??"",a.styleText??"");for(let a of t.TreemapRows??[]){let s=a.item;if(!s)continue;let l=a.indent?parseInt(a.indent):0,u=I0t(s),h=s.classSelector?e.getStylesForClass(s.classSelector):[],f=h.length>0?h:void 0,d={level:l,name:u,type:s.$type,value:s.value,classSelector:s.classSelector,cssCompiledStyles:f};r.push(d)}let n=F6e(r),i=o((a,s)=>{for(let l of a)e.addNode(l,s),l.children&&l.children.length>0&&i(l.children,s+1)},"addNodesRecursively");i(n,0)},"populate"),I0t=o(t=>t.name?String(t.name):"","getItemName"),nH={parser:{yy:void 0},parse:o(async t=>{try{let r=await Us("treemap",t);K.debug("Treemap AST:",r);let n=nH.parser?.yy;if(!(n instanceof r2))throw new Error("parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");M0t(r,n)}catch(e){throw K.error("Error parsing treemap:",e),e}},"parse")}});var O0t,n2,M3,P0t,B0t,G6e,V6e=O(()=>{"use strict";Ul();Ld();Ti();Ar();Ut();$r();xt();O0t=10,n2=10,M3=25,P0t=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),s=a.padding??O0t,l=i.getDiagramTitle(),u=i.getRoot(),{themeVariables:h}=Zt();if(!u)return;let f=l?30:0,d=Ii(e),p=a.nodeWidth?a.nodeWidth*n2:960,m=a.nodeHeight?a.nodeHeight*n2:500,g=p,y=m+f;d.attr("viewBox",`0 0 ${g} ${y}`),Zr(d,y,g,a.useMaxWidth);let v;try{let D=a.valueFormat||",";if(D==="$0,0")v=o(M=>"$"+tu(",")(M),"valueFormat");else if(D.startsWith("$")&&D.includes(",")){let M=/\.\d+/.exec(D),R=M?M[0]:"";v=o(P=>"$"+tu(","+R)(P),"valueFormat")}else if(D.startsWith("$")){let M=D.substring(1);v=o(R=>"$"+tu(M||"")(R),"valueFormat")}else v=tu(D)}catch(D){K.error("Error creating format function:",D),v=tu(",")}let x=Fo().range(["transparent",h.cScale0,h.cScale1,h.cScale2,h.cScale3,h.cScale4,h.cScale5,h.cScale6,h.cScale7,h.cScale8,h.cScale9,h.cScale10,h.cScale11]),b=Fo().range(["transparent",h.cScalePeer0,h.cScalePeer1,h.cScalePeer2,h.cScalePeer3,h.cScalePeer4,h.cScalePeer5,h.cScalePeer6,h.cScalePeer7,h.cScalePeer8,h.cScalePeer9,h.cScalePeer10,h.cScalePeer11]),T=Fo().range([h.cScaleLabel0,h.cScaleLabel1,h.cScaleLabel2,h.cScaleLabel3,h.cScaleLabel4,h.cScaleLabel5,h.cScaleLabel6,h.cScaleLabel7,h.cScaleLabel8,h.cScaleLabel9,h.cScaleLabel10,h.cScaleLabel11]);l&&d.append("text").attr("x",g/2).attr("y",f/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(l);let E=d.append("g").attr("transform",`translate(0, ${f})`).attr("class","treemapContainer"),w=Mg(u).sum(D=>D.value??0).sort((D,M)=>(M.value??0)-(D.value??0)),S=_5().size([p,m]).paddingTop(D=>D.children&&D.children.length>0?M3+n2:0).paddingInner(s).paddingLeft(D=>D.children&&D.children.length>0?n2:0).paddingRight(D=>D.children&&D.children.length>0?n2:0).paddingBottom(D=>D.children&&D.children.length>0?n2:0).round(!0)(w),A=S.descendants().filter(D=>D.children&&D.children.length>0),L=E.selectAll(".treemapSection").data(A).enter().append("g").attr("class","treemapSection").attr("transform",D=>`translate(${D.x0},${D.y0})`);L.append("rect").attr("width",D=>D.x1-D.x0).attr("height",M3).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",D=>D.depth===0?"display: none;":""),L.append("clipPath").attr("id",(D,M)=>`clip-section-${e}-${M}`).append("rect").attr("width",D=>Math.max(0,D.x1-D.x0-12)).attr("height",M3),L.append("rect").attr("width",D=>D.x1-D.x0).attr("height",D=>D.y1-D.y0).attr("class",(D,M)=>`treemapSection section${M}`).attr("fill",D=>x(D.data.name)).attr("fill-opacity",.6).attr("stroke",D=>b(D.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",D=>{if(D.depth===0)return"display: none;";let M=Ze({cssCompiledStyles:D.data.cssCompiledStyles});return M.nodeStyles+";"+M.borderStyles.join(";")}),L.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",M3/2).attr("dominant-baseline","middle").text(D=>D.depth===0?"":D.data.name).attr("font-weight","bold").attr("style",D=>{if(D.depth===0)return"display: none;";let M="dominant-baseline: middle; font-size: 12px; fill:"+T(D.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",R=Ze({cssCompiledStyles:D.data.cssCompiledStyles});return M+R.labelStyles.replace("color:","fill:")}).each(function(D){if(D.depth===0)return;let M=je(this),R=D.data.name;M.text(R);let P=D.x1-D.x0,B=6,F;a.showValues!==!1&&D.value?F=P-10-30-10-B:F=P-B-6;let $=Math.max(15,F),V=M.node();if(V.getComputedTextLength()>$){let H=R;for(;H.length>0;){if(H=R.substring(0,H.length-1),H.length===0){M.text("..."),V.getComputedTextLength()>$&&M.text("");break}if(M.text(H+"..."),V.getComputedTextLength()<=$)break}}}),a.showValues!==!1&&L.append("text").attr("class","treemapSectionValue").attr("x",D=>D.x1-D.x0-10).attr("y",M3/2).attr("text-anchor","end").attr("dominant-baseline","middle").text(D=>D.value?v(D.value):"").attr("font-style","italic").attr("style",D=>{if(D.depth===0)return"display: none;";let M="text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+T(D.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",R=Ze({cssCompiledStyles:D.data.cssCompiledStyles});return M+R.labelStyles.replace("color:","fill:")});let I=S.leaves(),N=E.selectAll(".treemapLeafGroup").data(I).enter().append("g").attr("class",(D,M)=>`treemapNode treemapLeafGroup leaf${M}${D.data.classSelector?` ${D.data.classSelector}`:""}x`).attr("transform",D=>`translate(${D.x0},${D.y0})`);N.append("rect").attr("width",D=>D.x1-D.x0).attr("height",D=>D.y1-D.y0).attr("class","treemapLeaf").attr("fill",D=>D.parent?x(D.parent.data.name):x(D.data.name)).attr("style",D=>Ze({cssCompiledStyles:D.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",D=>D.parent?x(D.parent.data.name):x(D.data.name)).attr("stroke-width",3),N.append("clipPath").attr("id",(D,M)=>`clip-${e}-${M}`).append("rect").attr("width",D=>Math.max(0,D.x1-D.x0-4)).attr("height",D=>Math.max(0,D.y1-D.y0-4)),N.append("text").attr("class","treemapLabel").attr("x",D=>(D.x1-D.x0)/2).attr("y",D=>(D.y1-D.y0)/2).attr("style",D=>{let M="text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+T(D.data.name)+";",R=Ze({cssCompiledStyles:D.data.cssCompiledStyles});return M+R.labelStyles.replace("color:","fill:")}).attr("clip-path",(D,M)=>`url(#clip-${e}-${M})`).text(D=>D.data.name).each(function(D){let M=je(this),R=D.x1-D.x0,P=D.y1-D.y0,B=M.node(),F=4,G=R-2*F,$=P-2*F;if(G<10||$<10){M.style("display","none");return}let V=parseInt(M.style("font-size"),10),X=8,Q=28,H=.6,ie=6,Y=2;for(;B.getComputedTextLength()>G&&V>X;)V--,M.style("font-size",`${V}px`);let le=Math.max(ie,Math.min(Q,Math.round(V*H))),ee=V+Y+le;for(;ee>$&&V>X&&(V--,le=Math.max(ie,Math.min(Q,Math.round(V*H))),!(le$;M.style("font-size",`${V}px`),(B.getComputedTextLength()>G||V(M.x1-M.x0)/2).attr("y",function(M){return(M.y1-M.y0)/2}).attr("style",M=>{let R="text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+T(M.data.name)+";",P=Ze({cssCompiledStyles:M.data.cssCompiledStyles});return R+P.labelStyles.replace("color:","fill:")}).attr("clip-path",(M,R)=>`url(#clip-${e}-${R})`).text(M=>M.value?v(M.value):"").each(function(M){let R=je(this),P=this.parentNode;if(!P){R.style("display","none");return}let B=je(P).select(".treemapLabel");if(B.empty()||B.style("display")==="none"){R.style("display","none");return}let F=parseFloat(B.style("font-size")),G=28,$=.6,V=6,X=2,Q=Math.max(V,Math.min(G,Math.round(F*$)));R.style("font-size",`${Q}px`);let ie=(M.y1-M.y0)/2+F/2+X;R.attr("y",ie);let Y=M.x1-M.x0,J=M.y1-M.y0-4,te=Y-8;R.node().getComputedTextLength()>te||ie+Q>J||Q{"use strict";ar();F0t={sectionStrokeColor:"black",sectionStrokeWidth:"1",sectionFillColor:"#efefef",leafStrokeColor:"black",leafStrokeWidth:"1",leafFillColor:"#efefef",labelColor:"black",labelFontSize:"12px",valueFontSize:"10px",valueColor:"black",titleColor:"black",titleFontSize:"14px"},$0t=o(({treemap:t}={})=>{let e=Pn(F0t,t);return` - .treemapNode.section { - stroke: ${e.sectionStrokeColor}; - stroke-width: ${e.sectionStrokeWidth}; - fill: ${e.sectionFillColor}; - } - .treemapNode.leaf { - stroke: ${e.leafStrokeColor}; - stroke-width: ${e.leafStrokeWidth}; - fill: ${e.leafFillColor}; - } - .treemapLabel { - fill: ${e.labelColor}; - font-size: ${e.labelFontSize}; - } - .treemapValue { - fill: ${e.valueColor}; - font-size: ${e.valueFontSize}; - } - .treemapTitle { - fill: ${e.titleColor}; - font-size: ${e.titleFontSize}; - } - `},"getStyles"),q6e=$0t});var W6e={};vr(W6e,{diagram:()=>z0t});var z0t,H6e=O(()=>{"use strict";rH();z6e();V6e();U6e();z0t={parser:nH,get db(){return new r2},renderer:G6e,styles:q6e}});var Cmt={};vr(Cmt,{default:()=>Smt});Xc();vD();Fp();var _Pe=o(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),DPe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Jre(),Zre));return{id:"c4",diagram:t}},"loader"),RPe={id:"c4",detector:_Pe,loader:DPe},ene=RPe;var Vge="flowchart",Zet=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),Jet=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(EC(),kC));return{id:Vge,diagram:t}},"loader"),ett={id:Vge,detector:Zet,loader:Jet},qge=ett;var Uge="flowchart-v2",ttt=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),rtt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(EC(),kC));return{id:Uge,diagram:t}},"loader"),ntt={id:Uge,detector:ttt,loader:rtt},Wge=ntt;var ltt=o(t=>/^\s*erDiagram/.test(t),"detector"),ctt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Jge(),Zge));return{id:"er",diagram:t}},"loader"),utt={id:"er",detector:ltt,loader:ctt},e1e=utt;var D4e="gitGraph",Nst=o(t=>/^\s*gitGraph/.test(t),"detector"),Mst=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(_4e(),A4e));return{id:D4e,diagram:t}},"loader"),Ist={id:D4e,detector:Nst,loader:Mst},R4e=Ist;var l3e="gantt",Tot=o(t=>/^\s*gantt/.test(t),"detector"),wot=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(o3e(),s3e));return{id:l3e,diagram:t}},"loader"),kot={id:l3e,detector:Tot,loader:wot},c3e=kot;var v3e="info",_ot=o(t=>/^\s*info/.test(t),"detector"),Dot=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(y3e(),g3e));return{id:v3e,diagram:t}},"loader"),x3e={id:v3e,detector:_ot,loader:Dot};var Vot=o(t=>/^\s*pie/.test(t),"detector"),qot=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(_3e(),A3e));return{id:"pie",diagram:t}},"loader"),D3e={id:"pie",detector:Vot,loader:qot};var V3e="quadrantChart",olt=o(t=>/^\s*quadrantChart/.test(t),"detector"),llt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(G3e(),z3e));return{id:V3e,diagram:t}},"loader"),clt={id:V3e,detector:olt,loader:llt},q3e=clt;var gwe="xychart",Clt=o(t=>/^\s*xychart(-beta)?/.test(t),"detector"),Alt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(mwe(),pwe));return{id:gwe,diagram:t}},"loader"),_lt={id:gwe,detector:Clt,loader:Alt},ywe=_lt;var Cwe="requirement",Nlt=o(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),Mlt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Swe(),Ewe));return{id:Cwe,diagram:t}},"loader"),Ilt={id:Cwe,detector:Nlt,loader:Mlt},Awe=Ilt;var Wwe="sequence",Rct=o(t=>/^\s*sequenceDiagram/.test(t),"detector"),Lct=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Uwe(),qwe));return{id:Wwe,diagram:t}},"loader"),Nct={id:Wwe,detector:Rct,loader:Lct},Hwe=Nct;var Zwe="class",Fct=o((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),$ct=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Qwe(),Kwe));return{id:Zwe,diagram:t}},"loader"),zct={id:Zwe,detector:Fct,loader:$ct},Jwe=zct;var r5e="classDiagram",Vct=o((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),qct=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(t5e(),e5e));return{id:r5e,diagram:t}},"loader"),Uct={id:r5e,detector:Vct,loader:qct},n5e=Uct;var O5e="state",gut=o((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),yut=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(I5e(),M5e));return{id:O5e,diagram:t}},"loader"),vut={id:O5e,detector:gut,loader:yut},P5e=vut;var $5e="stateDiagram",but=o((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),Tut=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(F5e(),B5e));return{id:$5e,diagram:t}},"loader"),wut={id:$5e,detector:but,loader:Tut},z5e=wut;var rke="journey",qut=o(t=>/^\s*journey/.test(t),"detector"),Uut=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(tke(),eke));return{id:rke,diagram:t}},"loader"),Wut={id:rke,detector:qut,loader:Uut},nke=Wut;xt();Ul();Ti();var Hut=o((t,e,r)=>{K.debug(`rendering svg for syntax error -`);let n=Ii(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),Zr(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),BU={draw:Hut},ike=BU;var Yut={db:{},renderer:BU,parser:{parse:o(()=>{},"parse")}},ake=Yut;var ske="flowchart-elk",jut=o((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*(flowchart|graph)/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),Xut=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(EC(),kC));return{id:ske,diagram:t}},"loader"),Kut={id:ske,detector:jut,loader:Xut},oke=Kut;var Mke="timeline",mht=o(t=>/^\s*timeline/.test(t),"detector"),ght=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Nke(),Lke));return{id:Mke,diagram:t}},"loader"),yht={id:Mke,detector:mht,loader:ght},Ike=yht;var Zke="mindmap",Sht=o(t=>/^\s*mindmap/.test(t),"detector"),Cht=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Qke(),Kke));return{id:Zke,diagram:t}},"loader"),Aht={id:Zke,detector:Sht,loader:Cht},Jke=Aht;var hEe="kanban",qht=o(t=>/^\s*kanban/.test(t),"detector"),Uht=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(uEe(),cEe));return{id:hEe,diagram:t}},"loader"),Wht={id:hEe,detector:qht,loader:Uht},fEe=Wht;var YEe="sankey",pft=o(t=>/^\s*sankey(-beta)?/.test(t),"detector"),mft=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(HEe(),WEe));return{id:YEe,diagram:t}},"loader"),gft={id:YEe,detector:pft,loader:mft},jEe=gft;var rSe="packet",Sft=o(t=>/^\s*packet(-beta)?/.test(t),"detector"),Cft=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(tSe(),eSe));return{id:rSe,diagram:t}},"loader"),nSe={id:rSe,detector:Sft,loader:Cft};var pSe="radar",jft=o(t=>/^\s*radar-beta/.test(t),"detector"),Xft=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(dSe(),fSe));return{id:pSe,diagram:t}},"loader"),mSe={id:pSe,detector:jft,loader:Xft};var vCe="block",ppt=o(t=>/^\s*block(-beta)?/.test(t),"detector"),mpt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(yCe(),gCe));return{id:vCe,diagram:t}},"loader"),gpt={id:vCe,detector:ppt,loader:mpt},xCe=gpt;var GCe="architecture",Lpt=o(t=>/^\s*architecture/.test(t),"detector"),Npt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(zCe(),$Ce));return{id:GCe,diagram:t}},"loader"),Mpt={id:GCe,detector:Lpt,loader:Npt},VCe=Mpt;var a6e="ishikawa",Hpt=o(t=>/^\s*ishikawa(-beta)?\b/i.test(t),"detector"),Ypt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(i6e(),n6e));return{id:a6e,diagram:t}},"loader"),s6e={id:a6e,detector:Hpt,loader:Ypt};var P6e="venn",R0t=o(t=>/^\s*venn-beta/.test(t),"detector"),L0t=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(O6e(),I6e));return{id:P6e,diagram:t}},"loader"),N0t={id:P6e,detector:R0t,loader:L0t},B6e=N0t;Fp();jt();var Y6e="treemap",G0t=o(t=>/^\s*treemap/.test(t),"detector"),V0t=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(H6e(),W6e));return{id:Y6e,diagram:t}},"loader"),j6e={id:Y6e,detector:G0t,loader:V0t};var X6e=!1,i2=o(()=>{X6e||(X6e=!0,$p("error",ake,t=>t.toLowerCase().trim()==="error"),$p("---",{db:{clear:o(()=>{},"clear")},styles:{},renderer:{draw:o(()=>{},"draw")},parser:{parse:o(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:o(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),B2(oke,Jke,VCe),B2(ene,fEe,n5e,Jwe,e1e,c3e,x3e,D3e,Awe,Hwe,Wge,qge,Ike,R4e,z5e,P5e,nke,q3e,jEe,nSe,ywe,xCe,mSe,s6e,j6e,B6e))},"addDiagrams");xt();Fp();jt();var K6e=o(async()=>{K.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(uh).map(async([r,{detector:n,loader:i}])=>{if(i)try{V2(r)}catch{try{let{diagram:a,id:s}=await i();$p(s,a,n)}catch(a){throw K.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete uh[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){K.error(`Failed to load ${e.length} external diagrams`);for(let r of e)K.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams");xt();Ar();var __="comm",D_="rule",R_="decl";var Q6e="@import";var Z6e="@namespace",J6e="@keyframes";var eAe="@layer";var iH=Math.abs,I3=String.fromCharCode;function L_(t){return t.trim()}o(L_,"trim");function O3(t,e,r){return t.replace(e,r)}o(O3,"replace");function tAe(t,e,r){return t.indexOf(e,r)}o(tAe,"indexof");function wp(t,e){return t.charCodeAt(e)|0}o(wp,"charat");function kp(t,e,r){return t.slice(e,r)}o(kp,"substr");function ol(t){return t.length}o(ol,"strlen");function rAe(t){return t.length}o(rAe,"sizeof");function a2(t,e){return e.push(t),t}o(a2,"append");var N_=1,s2=1,nAe=0,jl=0,Xi=0,l2="";function M_(t,e,r,n,i,a,s,l){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:N_,column:s2,length:s,return:"",siblings:l}}o(M_,"node");function iAe(){return Xi}o(iAe,"char");function aAe(){return Xi=jl>0?wp(l2,--jl):0,s2--,Xi===10&&(s2=1,N_--),Xi}o(aAe,"prev");function Xl(){return Xi=jl2||o2(Xi)>3?"":" "}o(lAe,"whitespace");function cAe(t,e){for(;--e&&Xl()&&!(Xi<48||Xi>102||Xi>57&&Xi<65||Xi>70&&Xi<97););return I_(t,P3()+(e<6&&ff()==32&&Xl()==32))}o(cAe,"escaping");function aH(t){for(;Xl();)switch(Xi){case t:return jl;case 34:case 39:t!==34&&t!==39&&aH(Xi);break;case 40:t===41&&aH(t);break;case 92:Xl();break}return jl}o(aH,"delimiter");function uAe(t,e){for(;Xl()&&t+Xi!==57;)if(t+Xi===84&&ff()===47)break;return"/*"+I_(e,jl-1)+"*"+I3(t===47?t:Xl())}o(uAe,"commenter");function hAe(t){for(;!o2(ff());)Xl();return I_(t,jl)}o(hAe,"identifier");function pAe(t){return oAe(P_("",null,null,null,[""],t=sAe(t),0,[0],t))}o(pAe,"compile");function P_(t,e,r,n,i,a,s,l,u){for(var h=0,f=0,d=s,p=0,m=0,g=0,y=1,v=1,x=1,b=0,T="",E=i,w=a,k=n,S=T;v;)switch(g=b,b=Xl()){case 40:if(g!=108&&wp(S,d-1)==58){tAe(S+=O3(O_(b),"&","&\f"),"&\f",iH(h?l[h-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:S+=O_(b);break;case 9:case 10:case 13:case 32:S+=lAe(g);break;case 92:S+=cAe(P3()-1,7);continue;case 47:switch(ff()){case 42:case 47:a2(q0t(uAe(Xl(),P3()),e,r,u),u),(o2(g||1)==5||o2(ff()||1)==5)&&ol(S)&&kp(S,-1,void 0)!==" "&&(S+=" ");break;default:S+="/"}break;case 123*y:l[h++]=ol(S)*x;case 125*y:case 59:case 0:switch(b){case 0:case 125:v=0;case 59+f:x==-1&&(S=O3(S,/\f/g,"")),m>0&&(ol(S)-d||y===0&&g===47)&&a2(m>32?dAe(S+";",n,r,d-1,u):dAe(O3(S," ","")+";",n,r,d-2,u),u);break;case 59:S+=";";default:if(a2(k=fAe(S,e,r,h,f,i,l,T,E=[],w=[],d,a),a),b===123)if(f===0)P_(S,e,k,k,E,a,d,l,w);else{switch(p){case 99:if(wp(S,3)===110)break;case 108:if(wp(S,2)===97)break;default:f=0;case 100:case 109:case 115:}f?P_(t,k,k,n&&a2(fAe(t,k,k,0,0,i,l,T,i,E=[],d,w),w),i,w,d,l,n?E:w):P_(S,k,k,k,[""],w,0,l,w)}}h=f=m=0,y=x=1,T=S="",d=s;break;case 58:d=1+ol(S),m=g;default:if(y<1){if(b==123)--y;else if(b==125&&y++==0&&aAe()==125)continue}switch(S+=I3(b),b*y){case 38:x=f>0?1:(S+="\f",-1);break;case 44:l[h++]=(ol(S)-1)*x,x=1;break;case 64:ff()===45&&(S+=O_(Xl())),p=ff(),f=d=ol(T=S+=hAe(P3())),b++;break;case 45:g===45&&ol(S)==2&&(y=0)}}return a}o(P_,"parse");function fAe(t,e,r,n,i,a,s,l,u,h,f,d){for(var p=i-1,m=i===0?a:[""],g=rAe(m),y=0,v=0,x=0;y0?m[b]+" "+T:O3(T,/&\f/g,m[b])))&&(u[x++]=E);return M_(t,e,r,i===0?D_:l,u,h,f,d)}o(fAe,"ruleset");function q0t(t,e,r,n){return M_(t,e,r,__,I3(iAe()),kp(t,2,-2),0,n)}o(q0t,"comment");function dAe(t,e,r,n,i){return M_(t,e,r,R_,kp(t,0,n),kp(t,n+1,-1),n,i)}o(dAe,"declaration");function B_(t,e){for(var r="",n=0;n{vAe.forEach(t=>{t()}),vAe=[]},"attachFunctions");xt();var bAe=o(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");Ow();ib();function TAe(t){let e=t.match(Iw);if(!e)return{text:t,metadata:{}};let r=Kf(e[1],{schema:Xf})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}o(TAe,"extractFrontMatter");ar();var W0t=o(t=>t.replace(/\r\n?/g,` -`).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),H0t=o(t=>{let{text:e,metadata:r}=TAe(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),Y0t=o(t=>{let e=Xt.detectInit(t)??{},r=Xt.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:Gre(t),directive:e}},"processDirectives");function sH(t){let e=W0t(t),r=H0t(e),n=Y0t(r.text),i=Pn(r.config,n.directive);return t=bAe(n.text),{code:t,title:r.title,config:i}}o(sH,"preprocessDiagram");wD();Q3();ar();function wAe(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}o(wAe,"toBase64");var j0t=5e4,X0t="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",K0t="sandbox",Q0t="loose",Z0t="http://www.w3.org/2000/svg",J0t="http://www.w3.org/1999/xlink",emt="http://www.w3.org/1999/xhtml",tmt="100%",rmt="100%",nmt="border:0;margin:0;",imt="margin:0",amt="allow-top-navigation-by-user-activation allow-popups",smt='The "iframe" tag is not supported by your browser.',omt=["foreignobject"],lmt=["dominant-baseline"];function CAe(t){let e=sH(t);return x2(),bY(e.config??{}),e}o(CAe,"processAndSetConfigs");async function cmt(t,e){i2();try{let{code:r,config:n}=CAe(t);return{diagramType:(await AAe(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}o(cmt,"parse");var kAe=o((t,e,r=[])=>` -.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),umt=o((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` -${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` -:root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` -:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=Sr(t)?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(l=>{Er(l.styles)||s.forEach(u=>{r+=kAe(l.id,u,l.styles)}),Er(l.textStyles)||(r+=kAe(l.id,"tspan",(l?.textStyles||[]).map(u=>u.replace("color","fill"))))})}return r},"createCssStyles"),hmt=o((t,e,r,n)=>{let i=umt(t,r),a=CX(e,i,t.themeVariables);return B_(pAe(`${n}{${a}}`),mAe)},"createUserStyles"),fmt=o((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=ao(n),n=n.replace(/
    /g,"
    "),n},"cleanUpSvgCode"),dmt=o((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":rmt,n=wAe(`${t}`);return``},"putIntoIFrame"),EAe=o((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",Z0t);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function SAe(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}o(SAe,"sandboxedIframe");var pmt=o((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),mmt=o(async function(t,e,r){i2();let n=CAe(e);e=n.code;let i=Zt();K.debug(i),e.length>(i?.maxTextSize??j0t)&&(e=X0t);let a="#"+t,s="i"+t,l="#"+s,u="d"+t,h="#"+u,f=o(()=>{let _=je(p?l:h).node();_&&"remove"in _&&_.remove()},"removeTempElements"),d=je("body"),p=i.securityLevel===K0t,m=i.securityLevel===Q0t,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),p){let C=SAe(je(r),s);d=je(C.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=je(r);EAe(d,t,u,`font-family: ${g}`,J0t)}else{if(pmt(document,t,u,s),p){let C=SAe(je("body"),s);d=je(C.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=je("body");EAe(d,t,u)}let y,v;try{y=await c2.fromText(e,{title:n.title})}catch(C){if(i.suppressErrorRendering)throw f(),C;y=await c2.fromText("error"),v=C}let x=d.select(h).node(),b=y.type,T=x.firstChild,E=T.firstChild,w=y.renderer.getClasses?.(e,y),k=hmt(i,b,w,a),S=document.createElement("style");S.innerHTML=k,T.insertBefore(S,E);try{await y.renderer.draw(e,t,"11.13.0",y)}catch(C){throw i.suppressErrorRendering?f():ike.draw(e,t,"11.13.0"),C}let A=d.select(`${h} svg`),L=y.db.getAccTitle?.(),I=y.db.getAccDescription?.();ymt(b,A,L,I),d.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",emt);let N=d.select(h).node().innerHTML;if(K.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),N=fmt(N,p,Xs(i.arrowMarkerAbsolute)),p){let C=d.select(h+" svg").node();N=dmt(N,C)}else m||(N=fl.sanitize(N,{ADD_TAGS:omt,ADD_ATTR:lmt,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(xAe(),v)throw v;return f(),{diagramType:b,svg:N,bindFunctions:y.db.bindFunctions}},"render");function gmt(t={}){let e=Vn({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),yY(e),e?.theme&&e.theme in ul?e.themeVariables=ul[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=ul.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?m8(e):g8();h2(r.logLevel),i2()}o(gmt,"initialize");var AAe=o((t,e={})=>{let{code:r}=sH(t);return c2.fromText(r,e)},"getDiagramFromText");function ymt(t,e,r,n){gAe(e,t),yAe(e,r,n,e.attr("id"))}o(ymt,"addA11yInfo");var Ep=Object.freeze({render:mmt,parse:cmt,getDiagramFromText:AAe,initialize:gmt,getConfig:Zt,setConfig:ew,getSiteConfig:g8,updateSiteConfig:vY,reset:o(()=>{x2()},"reset"),globalReset:o(()=>{x2(vf)},"globalReset"),defaultConfig:vf});h2(Zt().logLevel);x2(Zt());Rd();ar();var vmt=o((t,e,r)=>{K.warn(t),ON(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),_Ae=o(async function(t={querySelector:".mermaid"}){try{await xmt(t)}catch(e){if(ON(e)&&K.error(e.str),df.parseError&&df.parseError(e),!t.suppressErrors)throw K.error("Use the suppressErrors option to suppress these errors"),e}},"run"),xmt=o(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=Ep.getConfig();K.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");K.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(K.debug("Start On Load: "+n?.startOnLoad),Ep.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new Xt.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,l=[];for(let u of Array.from(i)){K.info("Rendering diagram: "+u.id);if(u.getAttribute("data-processed"))continue;u.setAttribute("data-processed","true");let h=`mermaid-${a.next()}`;s=u.innerHTML,s=Mw(Xt.entityDecode(s)).trim().replace(//gi,"
    ");let f=Xt.detectInit(s);f&&K.debug("Detected early reinit: ",f);try{let{svg:d,bindFunctions:p}=await NAe(h,s,u);u.innerHTML=d,t&&await t(h),p&&p(u)}catch(d){vmt(d,l,df.parseError)}}if(l.length>0)throw l[0]},"runThrowsErrors"),DAe=o(function(t){Ep.initialize(t)},"initialize"),bmt=o(async function(t,e,r){K.warn("mermaid.init is deprecated. Please use run instead."),t&&DAe(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await _Ae(n)},"init"),Tmt=o(async(t,{lazyLoad:e=!0}={})=>{i2(),B2(...t),e===!1&&await K6e()},"registerExternalDiagrams"),RAe=o(function(){if(df.startOnLoad){let{startOnLoad:t}=Ep.getConfig();t&&df.run().catch(e=>K.error("Mermaid failed to initialize",e))}},"contentLoaded");if(typeof document<"u"){window.addEventListener("load",RAe,!1)}var wmt=o(function(t){df.parseError=t},"setParseErrorHandler"),F_=[],oH=!1,LAe=o(async()=>{if(!oH){for(oH=!0;F_.length>0;){let t=F_.shift();if(t)try{await t()}catch(e){K.error("Error executing queue",e)}}oH=!1}},"executeQueue"),kmt=o(async(t,e)=>new Promise((r,n)=>{let i=o(()=>new Promise((a,s)=>{Ep.parse(t,e).then(l=>{a(l),r(l)},l=>{K.error("Error parsing",l),df.parseError?.(l),s(l),n(l)})}),"performCall");F_.push(i),LAe().catch(n)}),"parse"),NAe=o((t,e,r)=>new Promise((n,i)=>{let a=o(()=>new Promise((s,l)=>{Ep.render(t,e,r).then(u=>{s(u),n(u)},u=>{K.error("Error parsing",u),df.parseError?.(u),l(u),i(u)})}),"performCall");F_.push(a),LAe().catch(i)}),"render"),Emt=o(()=>Object.keys(uh).map(t=>({id:t})),"getRegisteredDiagramsMetadata"),df={startOnLoad:!0,mermaidAPI:Ep,parse:kmt,render:NAe,init:bmt,run:_Ae,registerExternalDiagrams:Tmt,registerLayoutLoaders:LB,initialize:DAe,parseError:void 0,contentLoaded:RAe,setParseErrorHandler:wmt,detectType:vg,registerIconPacks:Nw,getRegisteredDiagramsMetadata:Emt},Smt=df;return G3(Cmt);})(); -/*! Check if previously processed */ -/*! - * Wait for document loaded before starting the execution - */ -/*! Bundled license information: - -dompurify/dist/purify.es.mjs: - (*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE *) - -js-yaml/dist/js-yaml.mjs: - (*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT *) - -lodash-es/lodash.js: - (** - * @license - * Lodash (Custom Build) - * Build: `lodash modularize exports="es" -o ./` - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - *) - -cytoscape/dist/cytoscape.esm.mjs: - (*! - Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable - Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) - Licensed under The MIT License (http://opensource.org/licenses/MIT) - *) - (*! - Event object based on jQuery events, MIT license - - https://jquery.org/license/ - https://tldrlegal.com/license/mit-license - https://github.com/jquery/jquery/blob/master/src/event.js - *) - (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) - (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) -*/ -globalThis["mermaid"] = globalThis.__esbuild_esm_mermaid_nm["mermaid"].default; diff --git a/Sources/STMarkdown/Table/STMarkdownTableActionMenu.swift b/Sources/STMarkdown/Table/STMarkdownTableActionMenu.swift deleted file mode 100644 index b436aff..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableActionMenu.swift +++ /dev/null @@ -1,163 +0,0 @@ -// -// STMarkdownTableActionMenu.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/06/04. -// - -import UIKit - -public enum STMarkdownTableAction { - case copyText - case copyImage - case saveImage -} - -public enum STMarkdownTableActionMenuIcon { - case systemName(String) - case image(UIImage) -} - -public struct STMarkdownTableActionMenuItem { - public let title: String - public let icon: STMarkdownTableActionMenuIcon - public let action: STMarkdownTableAction - - public init(title: String, icon: STMarkdownTableActionMenuIcon, action: STMarkdownTableAction) { - self.title = title - self.icon = icon - self.action = action - } - - public static let defaultItems: [STMarkdownTableActionMenuItem] = [ - STMarkdownTableActionMenuItem(title: "复制", icon: .systemName("doc.on.doc"), action: .copyText), - STMarkdownTableActionMenuItem(title: "复制为图片", icon: .systemName("photo"), action: .copyImage), - STMarkdownTableActionMenuItem(title: "保存到相册", icon: .systemName("square.and.arrow.down"), action: .saveImage) - ] -} - -final class STMarkdownTableActionMenu: UIView { - - var onSelect: ((STMarkdownTableAction) -> Void)? - - private let card = UIView() - private let style: STMarkdownStyle - private let rowHeight: CGFloat = 52 - private let cardWidth: CGFloat = 200 - private let items: [STMarkdownTableActionMenuItem] - - init(style: STMarkdownStyle, items: [STMarkdownTableActionMenuItem] = STMarkdownTableActionMenuItem.defaultItems) { - self.style = style - self.items = items - super.init(frame: .zero) - self.setupCard() - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func setupCard() { - self.backgroundColor = .clear - - self.card.backgroundColor = self.style.tableBackgroundColor ?? UIColor.secondarySystemBackground - self.card.layer.cornerRadius = 14 - self.card.layer.shadowColor = UIColor.black.cgColor - self.card.layer.shadowOpacity = 0.18 - self.card.layer.shadowRadius = 16 - self.card.layer.shadowOffset = CGSize(width: 0, height: 6) - self.addSubview(self.card) - - let separatorColor = self.style.tableBorderColor ?? UIColor.separator - let textColor = self.style.textColor - - for (index, item) in self.items.enumerated() { - let row = UIControl() - row.tag = index - row.isAccessibilityElement = true - row.accessibilityLabel = item.title - row.accessibilityTraits = .button - row.addTarget(self, action: #selector(self.handleRowTap(_:)), for: .touchUpInside) - row.frame = CGRect(x: 0, y: CGFloat(index) * self.rowHeight, width: self.cardWidth, height: self.rowHeight) - - let titleLabel = UILabel() - titleLabel.text = item.title - titleLabel.font = UIFont.st_systemFont(ofSize: 16, weight: .regular) - titleLabel.textColor = textColor - titleLabel.frame = CGRect(x: 18, y: 0, width: self.cardWidth - 18 - 48, height: self.rowHeight) - row.addSubview(titleLabel) - - let iconView = UIImageView(image: item.icon.image) - iconView.tintColor = textColor - iconView.contentMode = .scaleAspectFit - iconView.frame = CGRect(x: self.cardWidth - 18 - 22, y: (self.rowHeight - 22) / 2, width: 22, height: 22) - row.addSubview(iconView) - - if index < self.items.count - 1 { - let line = UIView(frame: CGRect(x: 16, y: self.rowHeight - 0.5, width: self.cardWidth - 32, height: 0.5)) - line.backgroundColor = separatorColor.withAlphaComponent(0.5) - row.addSubview(line) - } - self.card.addSubview(row) - } - } - - func present(in container: UIView, at point: CGPoint) { - guard !self.items.isEmpty else { return } - self.frame = container.bounds - container.addSubview(self) - let cardHeight = CGFloat(self.items.count) * self.rowHeight - var originX = point.x - var originY = point.y - originX = min(max(8, originX), container.bounds.width - self.cardWidth - 8) - originY = min(max(8, originY), container.bounds.height - cardHeight - 8) - self.card.frame = CGRect(x: originX, y: originY, width: self.cardWidth, height: cardHeight) - self.card.transform = CGAffineTransform(scaleX: 0.92, y: 0.92) - self.card.alpha = 0 - UIView.animate(withDuration: 0.18, delay: 0, options: [.curveEaseOut]) { - self.card.transform = .identity - self.card.alpha = 1 - } - } - - @objc private func handleRowTap(_ sender: UIControl) { - guard sender.tag < self.items.count else { return } - let action = self.items[sender.tag].action - self.dismiss { [weak self] in - self?.onSelect?(action) - } - } - - private func dismiss(completion: (() -> Void)? = nil) { - UIView.animate(withDuration: 0.12, animations: { - self.card.alpha = 0 - self.card.transform = CGAffineTransform(scaleX: 0.96, y: 0.96) - }, completion: { _ in - self.removeFromSuperview() - completion?() - }) - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - if let touch = touches.first { - let location = touch.location(in: self) - if !self.card.frame.contains(location) { - self.dismiss() - return - } - } - super.touchesBegan(touches, with: event) - } -} - -private extension STMarkdownTableActionMenuIcon { - var image: UIImage? { - switch self { - case .systemName(let name): - return UIImage(systemName: name) - case .image(let image): - return image - } - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableAttachmentRenderer.swift b/Sources/STMarkdown/Table/STMarkdownTableAttachmentRenderer.swift deleted file mode 100644 index 1ce63f4..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableAttachmentRenderer.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// STMarkdownTableAttachmentRenderer.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public struct STMarkdownTableAttachmentRenderer: STMarkdownTableRendering { - - public var advancedRenderers: STMarkdownAdvancedRenderers - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? - public var onDownloadTable: ((STMarkdownTableViewModel) -> Void)? - - public init( - advancedRenderers: STMarkdownAdvancedRenderers = .empty, - onExpandTable: ((STMarkdownTableViewModel) -> Void)? = nil, - onDownloadTable: ((STMarkdownTableViewModel) -> Void)? = nil - ) { - self.advancedRenderers = advancedRenderers - self.onExpandTable = onExpandTable - self.onDownloadTable = onDownloadTable - } - - public func renderTable(_ table: STMarkdownTableModel, style: STMarkdownStyle) -> NSAttributedString? { - guard (table.header != nil && !table.header!.isEmpty) || !table.rows.isEmpty else { return nil } - let containerWidth = style.renderWidth - let viewModel = STMarkdownTableViewModel(from: table, style: style, advancedRenderers: self.advancedRenderers) - let attachment = STMarkdownTableViewAttachment(tableViewModel: viewModel, style: style, containerWidth: containerWidth > 0 ? containerWidth : 300) - attachment.onExpandTable = self.onExpandTable - attachment.onDownloadTable = self.onDownloadTable - return NSAttributedString(attachment: attachment) - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableCell.swift b/Sources/STMarkdown/Table/STMarkdownTableCell.swift deleted file mode 100644 index b1e9f69..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableCell.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// STMarkdownTableCell.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 表格 UICollectionView 的 cell,使用 UILabel 展示带样式的 NSAttributedString。 -/// Citation badge 已作为内联 NSTextAttachment 嵌入 attributedContent,无需额外 UIButton 叠加。 -public final class STMarkdownTableCell: UICollectionViewCell { - - static let reuseIdentifier = "STMarkdownTableCell" - - public var contentInsets = UIEdgeInsets(top: 8, left: 10, bottom: 8, right: 10) { - didSet { self.setNeedsLayout() } - } - - private let contentLabel: UILabel = { - let label = UILabel() - label.numberOfLines = 0 - label.lineBreakMode = .byWordWrapping - return label - }() - - var onCitationTap: ((String) -> Void)? - - public override init(frame: CGRect) { - super.init(frame: frame) - self.contentView.addSubview(self.contentLabel) - self.contentView.clipsToBounds = true - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - public override func layoutSubviews() { - super.layoutSubviews() - let insets = self.contentInsets - self.contentLabel.frame = CGRect( - x: insets.left, - y: insets.top, - width: self.contentView.bounds.width - insets.left - insets.right, - height: self.contentView.bounds.height - insets.top - insets.bottom - ) - } - - public override func prepareForReuse() { - super.prepareForReuse() - self.contentLabel.attributedText = nil - } - - func configure(with cellData: STMarkdownTableCellData, style: STMarkdownStyle) { - let displayText: NSAttributedString - if let tableFont = style.tableFont { - let mutable = NSMutableAttributedString(attributedString: cellData.attributedContent) - let fullRange = NSRange(location: 0, length: mutable.length) - mutable.enumerateAttribute(.font, in: fullRange, options: []) { value, range, _ in - if let originalFont = value as? UIFont { - mutable.addAttribute(.font, value: originalFont.withSize(tableFont.pointSize), range: range) - } - } - displayText = mutable - } else { - displayText = cellData.attributedContent - } - self.contentLabel.attributedText = displayText - let bgColor = style.tableBackgroundColor ?? UIColor.secondarySystemBackground - if cellData.role.isHeader { - self.contentView.backgroundColor = style.tableHeaderRowBackgroundColor ?? bgColor.withAlphaComponent(0.92) - } else { - self.contentView.backgroundColor = bgColor - } - } - - static func sizeThatFits(cellData: STMarkdownTableCellData, constrainedWidth: CGFloat, contentInsets: UIEdgeInsets) -> CGSize { - let textWidth = constrainedWidth - contentInsets.left - contentInsets.right - guard textWidth > 0 else { - return CGSize(width: constrainedWidth, height: contentInsets.top + contentInsets.bottom) - } - let boundingSize = CGSize(width: textWidth, height: .greatestFiniteMagnitude) - // Take MAX of both measurement options, matching FluidMarkdown's approach. - // .usesFontLeading and .usesDeviceMetrics can return different heights for - // system fonts with mixed weights/inline attachments — using only one causes - // text view height to "jump" when TextKit and UILabel disagree on final height. - let textRect1 = cellData.attributedContent.boundingRect( - with: boundingSize, - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil - ) - let textRect2 = cellData.attributedContent.boundingRect( - with: boundingSize, - options: [.usesLineFragmentOrigin, .usesDeviceMetrics], - context: nil - ) - let finalHeight = ceil(max(textRect1.height, textRect2.height)) - let finalWidth = min(constrainedWidth, ceil(max(textRect1.width, textRect2.width))) - let width = finalWidth + contentInsets.left + contentInsets.right - let height = finalHeight + contentInsets.top + contentInsets.bottom - return CGSize(width: width, height: height) - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableDetailViewController.swift b/Sources/STMarkdown/Table/STMarkdownTableDetailViewController.swift deleted file mode 100644 index cbc1026..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableDetailViewController.swift +++ /dev/null @@ -1,235 +0,0 @@ -// -// STMarkdownTableDetailViewController.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/05/21. -// - -import UIKit - -open class STMarkdownTableDetailViewController: UIViewController { - - public var onDismiss: (() -> Void)? - public var onCitationTap: ((String) -> Void)? { - didSet { - if self.isViewLoaded { - self.tableView.onCitationTap = self.onCitationTap - } - } - } - public var onPortraitTransitionCompleted: (() -> Void)? - public var actionMenuItems: [STMarkdownTableActionMenuItem] - public let style: STMarkdownStyle - public let collectionSize: CGSize? - public let tableViewModel: STMarkdownTableViewModel - - private var copyResetWorkItem: DispatchWorkItem? - private weak var actionMenu: STMarkdownTableActionMenu? - - public init( - tableViewModel: STMarkdownTableViewModel, - style: STMarkdownStyle, - collectionSize: CGSize? = nil, - actionMenuItems: [STMarkdownTableActionMenuItem] = STMarkdownTableActionMenuItem.defaultItems - ) { - self.tableViewModel = tableViewModel - self.style = style - self.collectionSize = collectionSize - self.actionMenuItems = actionMenuItems - super.init(nibName: nil, bundle: nil) - self.modalPresentationStyle = .fullScreen - } - - @available(*, unavailable) - required public init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - open override func viewDidLoad() { - super.viewDidLoad() - self.setupUI() - } - - open override var prefersStatusBarHidden: Bool { - return true - } - - open override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - self.layoutRotatedContent() - } - - open func setupUI() { - self.view.backgroundColor = self.style.tableBackgroundColor ?? UIColor.systemBackground - - self.rotationContainer.backgroundColor = .clear - self.view.addSubview(self.rotationContainer) - - self.topBar.backgroundColor = .clear - self.rotationContainer.addSubview(self.topBar) - - let buttonStack = UIStackView(arrangedSubviews: [self.copyButton, self.downloadButton]) - buttonStack.axis = .horizontal - buttonStack.spacing = 8 - buttonStack.alignment = .center - buttonStack.translatesAutoresizingMaskIntoConstraints = false - - self.backButton.translatesAutoresizingMaskIntoConstraints = false - self.topBar.addSubview(self.backButton) - self.topBar.addSubview(buttonStack) - - self.tableView.onCitationTap = self.onCitationTap - self.rotationContainer.addSubview(self.tableView) - - NSLayoutConstraint.activate([ - self.backButton.leadingAnchor.constraint(equalTo: self.topBar.leadingAnchor), - self.backButton.centerYAnchor.constraint(equalTo: self.topBar.centerYAnchor), - self.backButton.widthAnchor.constraint(equalToConstant: 40), - self.backButton.heightAnchor.constraint(equalToConstant: 40), - - buttonStack.trailingAnchor.constraint(equalTo: self.topBar.trailingAnchor), - buttonStack.centerYAnchor.constraint(equalTo: self.topBar.centerYAnchor), - buttonStack.heightAnchor.constraint(equalToConstant: 40) - ]) - - let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.handleLongPress(_:))) - self.tableView.addGestureRecognizer(longPress) - - self.backButton.contentHorizontalAlignment = .left - } - - private func layoutRotatedContent() { - let bounds = self.view.bounds - let landscapeSize = CGSize(width: bounds.height, height: bounds.width) - self.rotationContainer.bounds = CGRect(origin: .zero, size: landscapeSize) - self.rotationContainer.center = CGPoint(x: bounds.midX, y: bounds.midY) - self.rotationContainer.transform = CGAffineTransform(rotationAngle: .pi / 2) - - let safeAreaInsets = self.view.safeAreaInsets - let leftInset = max(safeAreaInsets.top, 16) - let rightInset = max(safeAreaInsets.bottom, 16) - let topInset: CGFloat = 12 - let bottomInset: CGFloat = 12 - let contentWidth = landscapeSize.width - leftInset - rightInset - let topBarHeight: CGFloat = 44 - - self.topBar.frame = CGRect(x: leftInset, y: topInset, width: contentWidth, height: topBarHeight) - let tableY = self.topBar.frame.maxY + 8 - self.tableView.frame = CGRect( - x: leftInset, - y: tableY, - width: contentWidth, - height: landscapeSize.height - tableY - bottomInset - ) - } - - private func makeToolButton(systemName: String, action: Selector) -> UIButton { - let button = UIButton(type: .system) - let config = UIImage.SymbolConfiguration(pointSize: 18, weight: .medium) - button.setImage(UIImage(systemName: systemName, withConfiguration: config), for: .normal) - button.tintColor = self.style.textColor - button.addTarget(self, action: action, for: .touchUpInside) - button.widthAnchor.constraint(equalToConstant: 40).isActive = true - return button - } - - @objc private func handleBack() { - self.onPortraitTransitionCompleted?() - if let onDismiss { - onDismiss() - } else { - self.dismiss(animated: true) - } - } - - @objc private func handleCopy() { - UIPasteboard.general.string = self.tableViewModel.plainText() - self.flashCopyFeedback() - } - - @objc private func handleDownload() { - let text = self.tableViewModel.plainText() - guard !text.isEmpty else { return } - self.presentShareSheet(items: [text], sourceView: self.downloadButton) - } - - private func flashCopyFeedback() { - self.copyResetWorkItem?.cancel() - let config = UIImage.SymbolConfiguration(pointSize: 18, weight: .medium) - self.copyButton.setImage(UIImage(systemName: "checkmark", withConfiguration: config), for: .normal) - let workItem = DispatchWorkItem { [weak self] in - self?.copyButton.setImage(UIImage(systemName: "doc.on.doc", withConfiguration: config), for: .normal) - } - self.copyResetWorkItem = workItem - DispatchQueue.main.asyncAfter(deadline: .now() + 1.2, execute: workItem) - } - - @objc private func handleLongPress(_ gesture: UILongPressGestureRecognizer) { - guard gesture.state == .began else { return } - self.actionMenu?.removeFromSuperview() - let point = gesture.location(in: self.rotationContainer) - let menu = STMarkdownTableActionMenu(style: self.style, items: self.actionMenuItems) - menu.onSelect = { [weak self] action in - self?.performMenuAction(action) - } - menu.present(in: self.rotationContainer, at: point) - self.actionMenu = menu - } - - private func performMenuAction(_ action: STMarkdownTableAction) { - switch action { - case .copyText: - UIPasteboard.general.string = self.tableViewModel.plainText() - self.flashCopyFeedback() - case .copyImage: - if let image = self.tableView.renderFullTableImage() { - UIPasteboard.general.image = image - } - case .saveImage: - if let image = self.tableView.renderFullTableImage() { - self.presentShareSheet(items: [image], sourceView: self.tableView) - } - } - } - - private func presentShareSheet(items: [Any], sourceView: UIView) { - let activity = UIActivityViewController(activityItems: items, applicationActivities: nil) - if let popover = activity.popoverPresentationController { - popover.sourceView = sourceView - popover.sourceRect = CGRect(x: sourceView.bounds.midX, y: sourceView.bounds.midY, width: 0, height: 0) - popover.permittedArrowDirections = [] - } - self.present(activity, animated: true) - } - - /// 横屏内容容器。顶栏 + 表格都放在这里,跟随系统横屏 bounds 布局。 - public lazy var rotationContainer: UIView = { - let view = UIView() - return view - }() - - public lazy var topBar: UIView = { - let view = UIView() - return view - }() - - public lazy var backButton: UIButton = { - return self.makeToolButton(systemName: "chevron.left", action: #selector(self.handleBack)) - }() - - public lazy var copyButton: UIButton = { - return self.makeToolButton(systemName: "doc.on.doc", action: #selector(self.handleCopy)) - }() - - public lazy var downloadButton: UIButton = { - return self.makeToolButton(systemName: "square.and.arrow.down", action: #selector(self.handleDownload)) - }() - - public lazy var tableView: STMarkdownTableView = { - let view = STMarkdownTableView(style: self.style) - view.showsHeader = false - view.isFullScreenPresentation = true - view.tableData = self.tableViewModel - return view - }() -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableGridLayout.swift b/Sources/STMarkdown/Table/STMarkdownTableGridLayout.swift deleted file mode 100644 index 24d07cd..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableGridLayout.swift +++ /dev/null @@ -1,258 +0,0 @@ -// -// STMarkdownTableGridLayout.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 表格 UICollectionView 的自定义 grid 布局。 -/// section = 行, item = 列。 -/// 借鉴 FluidMarkdown AMMarkdownTableLayout 的思想: -/// 逐列取最大宽度,逐行取最大高度,窄表按比例填充。 -public final class STMarkdownTableGridLayout: UICollectionViewLayout { - - public var fillWidth: Bool = true - public var minimumRowHeight: CGFloat = 35 - public var maximumColumnWidth: CGFloat = 360 - public var interItemSpacing: CGFloat = 0.5 - public var lineSpacing: CGFloat = 0.5 - public var minimumColumnWidth: CGFloat = 56 - /// Visual row-span groups for the first column. Values are UICollectionView section indexes. - public var firstColumnRowGroups: [[Int]] = [] { - didSet { self.mergedFirstColumnRows = Self.makeMergedFirstColumnRows(from: self.firstColumnRowGroups) } - } - - /// 流式表格逐行追加时为 true:让本次 batch update 中新出现(appearing)的 cell - /// 从 alpha 0 在最终位置原地淡入。仅在 `STMarkdownTableView` 的行追加动画期间置位, - /// 动画结束即复位,故 reloadData 等非动画路径不受影响。 - var animatesAppearingItemsFade: Bool = false - - var sizeForItem: ((_ indexPath: IndexPath) -> CGSize)? - - private var allAttributes: [[UICollectionViewLayoutAttributes]] = [] - private var cachedContentSize: CGSize = .zero - private var columnWidths: [CGFloat] = [] - private var rowHeights: [CGFloat] = [] - private var mergedFirstColumnRows: [Int: (head: Int, count: Int)] = [:] - - public override func prepare() { - super.prepare() - guard let collectionView else { return } - - let sections = collectionView.numberOfSections - guard sections > 0 else { - self.allAttributes = [] - self.cachedContentSize = .zero - return - } - - let columns = collectionView.numberOfItems(inSection: 0) - guard columns > 0 else { - self.allAttributes = [] - self.cachedContentSize = .zero - return - } - - var sizeCache: [[CGSize]] = [] - for section in 0.. 0 { - let availableWidth = containerWidth - totalSpacing - for col in 0.. 1 { - let mergedHeight = Self.mergedHeight( - rowHeights: rHeights, - lineSpacing: self.lineSpacing, - start: section, - count: merged.count - ) - attribute.frame = CGRect(x: x, y: y, width: width, height: mergedHeight) - } else { - attribute.frame = CGRect(x: x, y: y, width: width, height: height) - } - rowAttrs.append(attribute) - x += width + self.interItemSpacing - } - attrs.append(rowAttrs) - y += height + self.lineSpacing - } - - self.allAttributes = attrs - self.columnWidths = colWidths - self.rowHeights = rHeights - let totalWidth = colWidths.reduce(0, +) + totalSpacing - let totalHeight = y > 0 ? y - self.lineSpacing : 0 - self.cachedContentSize = CGSize(width: totalWidth, height: totalHeight) - } - - public override var collectionViewContentSize: CGSize { - self.cachedContentSize - } - - public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { - self.allAttributes.flatMap { $0 }.filter { $0.frame.intersects(rect) } - } - - public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { - guard indexPath.section < self.allAttributes.count, - indexPath.item < self.allAttributes[indexPath.section].count else { - return nil - } - return self.allAttributes[indexPath.section][indexPath.item] - } - - /// 默认自定义 layout 会让 appearing item 直接出现在最终位置(无淡入)。 - /// 行追加动画期间返回「最终帧位置 + alpha 0」的属性,使新插入 section 的 cell 原地淡入; - /// 追加发生在表尾、已有行不位移,故只有新 section 的 cell 命中 appearing 路径。 - public override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { - guard self.animatesAppearingItemsFade else { - return super.initialLayoutAttributesForAppearingItem(at: itemIndexPath) - } - guard let attributes = self.layoutAttributesForItem(at: itemIndexPath)?.copy() as? UICollectionViewLayoutAttributes else { - return super.initialLayoutAttributesForAppearingItem(at: itemIndexPath) - } - attributes.alpha = 0 - return attributes - } - - public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { - guard let collectionView else { return false } - return self.fillWidth && newBounds.width != collectionView.bounds.width - } - - public struct ComputeSizeMetrics { - public var fillWidth: Bool - public var containerWidth: CGFloat - public var minimumRowHeight: CGFloat - public var minimumColumnWidth: CGFloat - public var maximumColumnWidth: CGFloat - public var interItemSpacing: CGFloat - public var lineSpacing: CGFloat - - public init(fillWidth: Bool, - containerWidth: CGFloat, - minimumRowHeight: CGFloat, - minimumColumnWidth: CGFloat, - maximumColumnWidth: CGFloat, - interItemSpacing: CGFloat, - lineSpacing: CGFloat) { - self.fillWidth = fillWidth - self.containerWidth = containerWidth - self.minimumRowHeight = minimumRowHeight - self.minimumColumnWidth = minimumColumnWidth - self.maximumColumnWidth = maximumColumnWidth - self.interItemSpacing = interItemSpacing - self.lineSpacing = lineSpacing - } - } - - /// 静态计算表格尺寸(不需要 collectionView 实例) - public static func computeSize(rows: Int, columns: Int, sizeForItem: (_ indexPath: IndexPath) -> CGSize, metrics: ComputeSizeMetrics) -> CGSize { - guard rows > 0, columns > 0 else { return .zero } - var colWidths = Array(repeating: metrics.minimumColumnWidth, count: columns) - var rowHeights = Array(repeating: metrics.minimumRowHeight, count: rows) - for section in 0.. 0 { - let availableWidth = metrics.containerWidth - totalSpacing - for col in 0.. [Int: (head: Int, count: Int)] { - var result: [Int: (head: Int, count: Int)] = [:] - for group in rowGroups where group.count > 1 { - let sorted = group.sorted() - guard let head = sorted.first else { continue } - let count = sorted.count - for row in sorted { - result[row] = (head: head, count: count) - } - } - return result - } - - private static func mergedHeight(rowHeights: [CGFloat], lineSpacing: CGFloat, start: Int, count: Int) -> CGFloat { - guard start < rowHeights.count, count > 1 else { - return start < rowHeights.count ? rowHeights[start] : 0 - } - let end = min(start + count, rowHeights.count) - let height = rowHeights[start.. Void - - public init( - identifier: String, - image: UIImage?, - action: @escaping (STMarkdownTableView) -> Void - ) { - self.identifier = identifier - self.image = image - self.action = action - } -} - -extension STMarkdownTableHeaderItem { - /// 内建「复制」按钮:将表格纯文本复制到剪贴板并播放反馈。 - public static func copyItem(image: UIImage? = UIImage(systemName: "doc.on.doc")) -> STMarkdownTableHeaderItem { - STMarkdownTableHeaderItem(identifier: "copy", image: image) { tableView in - guard let tableData = tableView.tableData else { return } - UIPasteboard.general.string = tableData.plainText() - tableView.onCopyTable?() - tableView.showCopyFeedback() - } - } - - /// 内建「下载」按钮:触发 `onDownloadTable` 回调。 - public static func downloadItem(image: UIImage? = UIImage(systemName: "square.and.arrow.down")) -> STMarkdownTableHeaderItem { - STMarkdownTableHeaderItem(identifier: "download", image: image) { tableView in - guard let tableData = tableView.tableData else { return } - tableView.onDownloadTable?(tableData) - } - } - - /// 内建「全屏」按钮:触发 `onExpandTable` 回调。 - public static func fullscreenItem(image: UIImage? = UIImage(systemName: "arrow.up.left.and.arrow.down.right")) -> STMarkdownTableHeaderItem { - STMarkdownTableHeaderItem(identifier: "fullscreen", image: image) { tableView in - guard let tableData = tableView.tableData else { return } - tableView.onExpandTable?(tableData) - } - } - - /// 默认三个按钮集合:复制、下载、全屏。 - public static var defaultItems: [STMarkdownTableHeaderItem] { - [.copyItem(), .downloadItem(), .fullscreenItem()] - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableOverlayCoordinator.swift b/Sources/STMarkdown/Table/STMarkdownTableOverlayCoordinator.swift deleted file mode 100644 index 1d9cd2c..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableOverlayCoordinator.swift +++ /dev/null @@ -1,123 +0,0 @@ -// -// STMarkdownTableOverlayCoordinator.swift -// STBaseProject -// -// Created by 寒江孤影 on 2025/04/29. -// - -import UIKit - -final class STMarkdownTableOverlayCoordinator { - - var onCitationTap: ((String) -> Void)? - var onExpandTable: ((STMarkdownTableViewModel) -> Void)? - var onDownloadTable: ((STMarkdownTableViewModel) -> Void)? - - private weak var textView: UITextView? - private var tableViewOverlays: [Int: STMarkdownTableView] = [:] - private var tableOverlayNeedsUpdate = false - private(set) var lastTableOverlayLayoutSize: CGSize = .zero - - init(textView: UITextView) { - self.textView = textView - } - - func markDirty() { - self.tableOverlayNeedsUpdate = true - self.textView?.setNeedsLayout() - } - - func updateIfNeeded(attributedText: NSAttributedString, containerBounds: CGRect) { - // Always update overlays on every layout pass — not just when markDirty was - // called or the container size changed. TextKit may not have finished re-laying-out - // glyphs on the first pass after attributedText is set, so a stale glyphRect would - // give the overlay the wrong (previously cached) height. By running every pass, - // the overlay frame converges to match the latest glyph positions automatically. - self.updateTableViewOverlays(attributedText: attributedText) - self.tableOverlayNeedsUpdate = false - self.lastTableOverlayLayoutSize = containerBounds.size - } - - func reset() { - for (_, tableView) in self.tableViewOverlays { - tableView.removeFromSuperview() - } - self.tableViewOverlays.removeAll() - self.tableOverlayNeedsUpdate = false - self.lastTableOverlayLayoutSize = .zero - } - - private func updateTableViewOverlays(attributedText: NSAttributedString) { - guard let textView = self.textView else { - self.reset() - return - } - guard attributedText.length > 0 else { - self.reset() - return - } - - var foundKeys = Set() - let fullRange = NSRange(location: 0, length: attributedText.length) - - attributedText.enumerateAttribute(.attachment, in: fullRange, options: []) { value, range, _ in - guard let attachment = value as? STMarkdownTableViewAttachment else { return } - let charIndex = range.location - foundKeys.insert(charIndex) - - let glyphRange = textView.layoutManager.glyphRange( - forCharacterRange: range, - actualCharacterRange: nil - ) - guard glyphRange.location != NSNotFound, glyphRange.length > 0 else { return } - let glyphRect = textView.layoutManager.boundingRect( - forGlyphRange: glyphRange, - in: textView.textContainer - ) - let frame = CGRect( - x: glyphRect.origin.x + textView.textContainerInset.left, - y: glyphRect.origin.y + textView.textContainerInset.top, - width: attachment.containerWidth, - height: glyphRect.height - ) - - if let existing = self.tableViewOverlays[charIndex] { - // 先设最终 frame(高度取自新 model 的 attachmentBounds,仅高度变、宽度不变, - // shouldInvalidateLayout(forBoundsChange:) 返回 false),再设 tableData 触发逐行 - // 追加动画——让新行在最终高度区域内淡入,避免在旧矮 bounds 里动画后再被撑高的错位。 - existing.frame = frame - existing.onCitationTap = { [weak self] number in - self?.onCitationTap?(number) - } - existing.onExpandTable = { [weak self] tableViewModel in - self?.onExpandTable?(tableViewModel) - } - existing.onDownloadTable = { [weak self] tableViewModel in - self?.onDownloadTable?(tableViewModel) - } - if existing.tableData !== attachment.tableViewModel { - existing.tableData = attachment.tableViewModel - } - } else { - let tableView = attachment.tableView - tableView.onCitationTap = { [weak self] number in - self?.onCitationTap?(number) - } - tableView.onExpandTable = { [weak self] tableViewModel in - self?.onExpandTable?(tableViewModel) - } - tableView.onDownloadTable = { [weak self] tableViewModel in - self?.onDownloadTable?(tableViewModel) - } - tableView.frame = frame - textView.addSubview(tableView) - self.tableViewOverlays[charIndex] = tableView - } - } - - for (key, tableView) in self.tableViewOverlays where !foundKeys.contains(key) { - tableView.removeFromSuperview() - self.tableViewOverlays.removeValue(forKey: key) - } - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableView.swift b/Sources/STMarkdown/Table/STMarkdownTableView.swift deleted file mode 100644 index 5e53150..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableView.swift +++ /dev/null @@ -1,586 +0,0 @@ -// -// STMarkdownTableView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -// MARK: - STMarkdownTableHeaderItem -// 类型定义见 STMarkdownTableHeaderItem.swift(含 action / defaultItems / copyItem() 等),本文件不再重复声明。 - -// MARK: - STMarkdownTableView - -open class STMarkdownTableView: UIView { - - /// 表格数据 façade。流式逐行追加(同列数、已有行内容不变、行数严格增多)时, - /// 用 `performBatchUpdates` 插入新 section 并逐行淡入;否则全量 `reloadData()`。 - /// 注意:dataSource 实际读 `renderedTableData`,追加动画在 batch block 内才翻转底层数据, - /// 以保证 UICollectionView 的 before/after section 数一致(否则会断言崩溃)。 - public var tableData: STMarkdownTableViewModel? { - get { self.renderedTableData } - set { self.applyTableData(newValue) } - } - - /// 是否对「纯行追加」启用逐行淡入。详情页/一次性渲染不会触发追加,默认开即可。 - public var animatesRowAppends: Bool = true - - /// Streaming path: update only appended rows or changed cells when the table shape is stable. - /// Falls back to `tableData` assignment for all structural changes. - public func updateStreamingTableData(_ newValue: STMarkdownTableViewModel?) { - self.applyTableData(newValue, allowsCellDiff: true) - } - - private var renderedTableData: STMarkdownTableViewModel? - private var isApplyingAppend = false - - public var style: STMarkdownStyle = .default { - didSet { - self.applyStyle() - self.applyStyleHeaderItems() - self.reloadData() - } - } - - public var onCitationTap: ((String) -> Void)? - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? - public var onCopyTable: (() -> Void)? - public var onDownloadTable: ((STMarkdownTableViewModel) -> Void)? - - /// 顶部工具条按钮列表。默认为 [copy, download, fullscreen],赋新值后立即重建按钮栈。 - /// 赋空数组可隐藏所有按钮但保留标题行;配合 showsHeader=false 可完全隐藏工具条。 - public var headerItems: [STMarkdownTableHeaderItem] = [] { - didSet { self.rebuildButtonStack() } - } - - /// 顶部工具条左侧标题,默认 "表格"。 - public var headerTitle: String = "表格" { - didSet { self.titleLabel.text = self.headerTitle } - } - - /// 顶部工具条高度(圆角卡片化后预留给「表格 / 复制 / 下载 / 全屏」)。 - public static let headerHeight: CGFloat = 41 - /// 整块表格圆角半径。 - public var cornerRadius: CGFloat = 8 { - didSet { self.layer.cornerRadius = self.cornerRadius } - } - /// 是否展示顶部工具条。全屏详情页关闭(自带关闭按钮,避免重复表头与"全屏中再全屏")。 - public var showsHeader: Bool = true { - didSet { - guard oldValue != self.showsHeader else { return } - self.headerBar.isHidden = !self.showsHeader - self.invalidateIntrinsicContentSize() - self.setNeedsLayout() - } - } - - /// 单元格内边距,影响列宽/行高计算,与 computeSize 保持一致。 - public var cellInsets: UIEdgeInsets = UIEdgeInsets(top: 8, left: 10, bottom: 8, right: 10) - - private let gridLayout: STMarkdownTableGridLayout - private let collectionView: UICollectionView - - private let headerBar = UIView() - private let titleLabel = UILabel() - private let buttonStack = UIStackView() - private let headerSeparator = UIView() - private var headerButtons: [(item: STMarkdownTableHeaderItem, button: UIButton)] = [] - private var copyResetWorkItem: DispatchWorkItem? - private weak var copyButtonRef: UIButton? - private weak var expandGesture: UILongPressGestureRecognizer? - - /// 全屏详情态:开启上下/左右滚动条与回弹,并关闭内置「长按展开」手势(由详情页接管长按菜单)。 - public var isFullScreenPresentation: Bool = false { - didSet { - guard oldValue != self.isFullScreenPresentation else { return } - let full = self.isFullScreenPresentation - self.collectionView.showsVerticalScrollIndicator = full - self.collectionView.bounces = full - self.collectionView.alwaysBounceVertical = false - self.expandGesture?.isEnabled = !full - } - } - - public init(style: STMarkdownStyle) { - self.style = style - self.gridLayout = STMarkdownTableGridLayout() - self.collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.gridLayout) - super.init(frame: .zero) - self.clipsToBounds = true - self.layer.cornerRadius = self.cornerRadius - self.layer.borderWidth = 0.5 - if let mask = style.tableCornerMask as CACornerMask? { - self.layer.maskedCorners = mask - } - self.gridLayout.minimumRowHeight = style.tableMinimumRowHeight - self.setupCollectionView() - self.setupHeader() - self.headerItems = style.tableHeaderItems ?? STMarkdownTableHeaderItem.defaultItems - self.rebuildButtonStack() - self.applyStyle() - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func setupCollectionView() { - self.collectionView.register(STMarkdownTableCell.self, forCellWithReuseIdentifier: STMarkdownTableCell.reuseIdentifier) - self.collectionView.dataSource = self - self.collectionView.delegate = self - self.collectionView.bounces = false - self.collectionView.alwaysBounceHorizontal = false - self.collectionView.alwaysBounceVertical = false - self.collectionView.showsHorizontalScrollIndicator = true - self.collectionView.showsVerticalScrollIndicator = false - self.collectionView.isScrollEnabled = true - self.collectionView.scrollsToTop = false - self.collectionView.contentInset = .zero - let expandGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.handleExpandGesture(_:))) - self.collectionView.addGestureRecognizer(expandGesture) - self.expandGesture = expandGesture - self.addSubview(self.collectionView) - - self.gridLayout.sizeForItem = { [weak self] indexPath in - self?.sizeForItem(at: indexPath) ?? CGSize(width: 56, height: 35) - } - } - - private func setupHeader() { - self.titleLabel.text = self.style.tableTitleText ?? "表格" - self.titleLabel.font = self.style.tableTitleFont ?? UIFont.st_systemFont(ofSize: 14, weight: .medium) - - let items = self.style.tableHeaderItems?.isEmpty == false - ? self.style.tableHeaderItems! - : STMarkdownTableHeaderItem.defaultItems - let imageConfig = UIImage.SymbolConfiguration(pointSize: 15, weight: .regular) - - for item in items { - let button = UIButton(type: .system) - button.setImage(item.image, for: .normal) - button.setPreferredSymbolConfiguration(imageConfig, forImageIn: .normal) - button.widthAnchor.constraint(equalToConstant: self.style.tableHeaderButtonWidth).isActive = true - button.heightAnchor.constraint(equalToConstant: self.style.tableHeaderButtonHeight).isActive = true - button.addAction(UIAction { [weak self] _ in - guard let self else { return } - item.action(self) - }, for: .touchUpInside) - self.headerButtons.append((item: item, button: button)) - self.buttonStack.addArrangedSubview(button) - } - - self.buttonStack.axis = .horizontal - self.buttonStack.alignment = .center - self.buttonStack.spacing = self.style.tableHeaderButtonSpacing - - self.titleLabel.translatesAutoresizingMaskIntoConstraints = false - self.buttonStack.translatesAutoresizingMaskIntoConstraints = false - self.headerSeparator.translatesAutoresizingMaskIntoConstraints = false - self.headerBar.addSubview(self.titleLabel) - self.headerBar.addSubview(self.buttonStack) - self.headerBar.addSubview(self.headerSeparator) - self.addSubview(self.headerBar) - - NSLayoutConstraint.activate([ - self.titleLabel.leadingAnchor.constraint(equalTo: self.headerBar.leadingAnchor, constant: 14), - self.titleLabel.centerYAnchor.constraint(equalTo: self.headerBar.centerYAnchor), - - self.buttonStack.trailingAnchor.constraint(equalTo: self.headerBar.trailingAnchor, constant: -10), - self.buttonStack.centerYAnchor.constraint(equalTo: self.headerBar.centerYAnchor), - - self.headerSeparator.leadingAnchor.constraint(equalTo: self.headerBar.leadingAnchor), - self.headerSeparator.trailingAnchor.constraint(equalTo: self.headerBar.trailingAnchor), - self.headerSeparator.bottomAnchor.constraint(equalTo: self.headerBar.bottomAnchor), - self.headerSeparator.heightAnchor.constraint(equalToConstant: 0.5) - ]) - } - - /// 从 headerItems 重建 buttonStack 中的所有按钮,每次 headerItems 变更时调用。 - private func rebuildButtonStack() { - self.buttonStack.arrangedSubviews.forEach { - self.buttonStack.removeArrangedSubview($0) - $0.removeFromSuperview() - } - let symbolConfig = UIImage.SymbolConfiguration(pointSize: 15, weight: .regular) - let buttonWidth = self.style.tableHeaderButtonWidth - let secondaryColor = (self.style.tableHeaderTextColor ?? self.style.textColor).withAlphaComponent(0.6) - for item in self.headerItems { - let button = UIButton(type: .system) - let isSystemSymbol = item.image?.isSymbolImage ?? false - if isSystemSymbol { - button.setPreferredSymbolConfiguration(symbolConfig, forImageIn: .normal) - } - button.setImage(item.image, for: .normal) - button.tintColor = secondaryColor - button.imageView?.contentMode = .scaleAspectFit - button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true - button.heightAnchor.constraint(equalToConstant: buttonWidth).isActive = true - button.accessibilityIdentifier = item.identifier - button.addAction(UIAction { [weak self] _ in - guard let self else { return } - item.action(self) - }, for: .touchUpInside) - if item.identifier == "copy" { - self.copyButtonRef = button - } - self.buttonStack.addArrangedSubview(button) - } - } - - private func applyStyle() { - let borderColor = self.style.tableBorderColor ?? UIColor.separator - self.collectionView.backgroundColor = borderColor - self.backgroundColor = borderColor - self.gridLayout.interItemSpacing = 0.5 - self.gridLayout.lineSpacing = 0.5 - self.gridLayout.minimumRowHeight = self.style.tableMinimumRowHeight - self.layer.borderColor = borderColor.cgColor - self.layer.maskedCorners = self.style.tableCornerMask - - let headerBg = self.style.tableHeaderBarBackgroundColor - ?? self.style.tableBackgroundColor - ?? UIColor.secondarySystemBackground - let secondaryColor = (self.style.tableTitleTextColor - ?? self.style.tableHeaderTextColor - ?? self.style.textColor).withAlphaComponent(0.6) - self.headerBar.backgroundColor = headerBg - self.headerSeparator.backgroundColor = borderColor - self.titleLabel.textColor = secondaryColor - self.titleLabel.font = self.style.tableTitleFont ?? UIFont.st_systemFont(ofSize: 14, weight: .medium) - self.titleLabel.text = self.style.tableTitleText ?? "表格" - for (_, button) in self.headerButtons { - button.tintColor = secondaryColor - } - } - - /// style 变更时同步按钮项(优先用 style.tableHeaderItems,否则 defaultItems)。 - private func applyStyleHeaderItems() { - self.headerItems = self.style.tableHeaderItems ?? STMarkdownTableHeaderItem.defaultItems - } - - public override func layoutSubviews() { - super.layoutSubviews() - let headerHeight = self.showsHeader ? Self.headerHeight : 0 - if self.showsHeader { - let headerFrame = CGRect(x: 0, y: 0, width: self.bounds.width, height: headerHeight) - if self.headerBar.frame != headerFrame { - self.headerBar.frame = headerFrame - } - } - let gridFrame = CGRect( - x: 0, - y: headerHeight, - width: self.bounds.width, - height: max(self.bounds.height - headerHeight, 0) - ) - if self.collectionView.frame != gridFrame { - self.collectionView.frame = gridFrame - } - } - - public override func sizeThatFits(_ size: CGSize) -> CGSize { - guard let tableData, tableData.rowCount > 0, tableData.columnCount > 0 else { return .zero } - return Self.computeSize( - tableData: tableData, - containerWidth: size.width, - style: self.style, - cellInsets: self.cellInsets, - includesHeader: self.showsHeader - ) - } - - public override var intrinsicContentSize: CGSize { - let width = self.bounds.width > 1 ? self.bounds.width : UIScreen.main.bounds.width - return self.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude)) - } - - public static func computeSize( - tableData: STMarkdownTableViewModel, - containerWidth: CGFloat, - style: STMarkdownStyle, - cellInsets: UIEdgeInsets = UIEdgeInsets(top: 8, left: 10, bottom: 8, right: 10), - includesHeader: Bool = true - ) -> CGSize { - let gridSize = STMarkdownTableGridLayout.computeSize( - rows: tableData.rowCount, - columns: tableData.columnCount, - sizeForItem: { indexPath in - let cellData = tableData.cells[indexPath.section][indexPath.item] - return STMarkdownTableCell.sizeThatFits( - cellData: cellData, - constrainedWidth: 360, - contentInsets: cellInsets - ) - }, - metrics: STMarkdownTableGridLayout.ComputeSizeMetrics( - fillWidth: true, - containerWidth: containerWidth, - minimumRowHeight: style.tableMinimumRowHeight, - minimumColumnWidth: 56, - maximumColumnWidth: 360, - interItemSpacing: 0.5, - lineSpacing: 0.5 - ) - ) - guard gridSize.height > 0 else { return gridSize } - let extra = includesHeader ? Self.headerHeight : 0 - return CGSize(width: gridSize.width, height: gridSize.height + extra) - } - - private func reloadData() { - self.gridLayout.firstColumnRowGroups = self.makeFirstColumnRowGroupsForLayout(from: self.renderedTableData) - self.gridLayout.invalidateLayout() - self.collectionView.reloadData() - self.invalidateIntrinsicContentSize() - self.setNeedsLayout() - } - - private func applyTableData(_ newValue: STMarkdownTableViewModel?, allowsCellDiff: Bool = false) { - let old = self.renderedTableData - guard let newValue else { - self.renderedTableData = nil - self.reloadData() - return - } - // 仅在「在屏 + 同一表格纯行追加 + 未处于动画中」时逐行淡入;其余一律 reloadData(崩溃安全)。 - if self.animatesRowAppends, - !self.isApplyingAppend, - self.window != nil, - self.bounds.height > 0, - let old, - Self.isPureRowAppend(from: old, to: newValue), - Self.appendKeepsExistingRowGroupsStable(from: old, to: newValue) { - self.animateRowAppend(from: old.rowCount, newData: newValue) - } else if allowsCellDiff, - self.window != nil, - self.bounds.height > 0, - let old, - Self.hasStableLayoutShape(from: old, to: newValue), - let changedIndexPaths = Self.changedCellIndexPathsForStableShape(from: old, to: newValue) { - self.renderedTableData = newValue - self.gridLayout.firstColumnRowGroups = self.makeFirstColumnRowGroupsForLayout(from: newValue) - guard !changedIndexPaths.isEmpty else { return } - UIView.performWithoutAnimation { - self.collectionView.reloadItems(at: changedIndexPaths) - self.gridLayout.invalidateLayout() - self.collectionView.layoutIfNeeded() - } - self.invalidateIntrinsicContentSize() - self.setNeedsLayout() - } else { - self.renderedTableData = newValue - if allowsCellDiff, self.window != nil { - self.reloadDataWithoutAnimation() - } else { - self.reloadData() - } - } - } - - /// new 是否为 old 的「纯行追加」:同列数、行数严格增多、且 old 的每一行内容未变。 - private static func isPureRowAppend(from old: STMarkdownTableViewModel, to new: STMarkdownTableViewModel) -> Bool { - guard new.columnCount == old.columnCount, new.columnCount > 0 else { return false } - guard new.rowCount > old.rowCount, old.rowCount > 0 else { return false } - guard new.cells.count == new.rowCount, old.cells.count == old.rowCount else { return false } - for row in 0.. [IndexPath]? { - guard new.columnCount == old.columnCount, - new.rowCount == old.rowCount, - new.columnCount > 0, - new.cells.count == old.cells.count else { - return nil - } - var changed: [IndexPath] = [] - for row in 0.. Bool { - old.hasHeader == new.hasHeader - && old.columnCount == new.columnCount - && old.rowCount == new.rowCount - && old.rowGroups == new.rowGroups - } - - private static func appendKeepsExistingRowGroupsStable(from old: STMarkdownTableViewModel, to new: STMarkdownTableViewModel) -> Bool { - guard old.hasHeader == new.hasHeader, - new.rowCount > old.rowCount else { - return false - } - return !new.rowGroups.contains { group in - group.contains { $0 < old.rowCount } && group.contains { $0 >= old.rowCount } - } - } - - private func reloadDataWithoutAnimation() { - UIView.performWithoutAnimation { - self.reloadData() - self.collectionView.layoutIfNeeded() - self.layoutIfNeeded() - } - } - - private func animateRowAppend(from oldRowCount: Int, newData: STMarkdownTableViewModel) { - let targetRowCount = newData.rowCount - self.isApplyingAppend = true - self.gridLayout.animatesAppearingItemsFade = true - self.collectionView.performBatchUpdates({ - // 在 block 内翻转底层数据:block 前 dataSource 仍返回旧行数,block 后返回新行数, - // 与 insertSections 的增量一致,避免 NSInternalInconsistencyException。 - self.renderedTableData = newData - self.gridLayout.firstColumnRowGroups = self.makeFirstColumnRowGroupsForLayout(from: newData) - self.gridLayout.invalidateLayout() - self.collectionView.insertSections(IndexSet(integersIn: oldRowCount.. [[Int]] { - guard let tableData else { return [] } - let rowOffset = tableData.hasHeader ? 1 : 0 - return tableData.rowGroups.map { group in - group.compactMap { row in - let section = row + rowOffset - return section >= 0 && section < tableData.rowCount ? section : nil - } - } - .filter { $0.count > 1 } - } - - private func sizeForItem(at indexPath: IndexPath) -> CGSize { - guard let tableData, - indexPath.section < tableData.cells.count, - indexPath.item < tableData.cells[indexPath.section].count else { - return CGSize(width: 56, height: 35) - } - let cellData = tableData.cells[indexPath.section][indexPath.item] - return STMarkdownTableCell.sizeThatFits( - cellData: cellData, - constrainedWidth: 360, - contentInsets: self.cellInsets - ) - } - - @objc private func handleExpandGesture(_ gestureRecognizer: UILongPressGestureRecognizer) { - guard gestureRecognizer.state == .began else { return } - guard let tableData else { return } - self.onExpandTable?(tableData) - } - - /// 将整张表格(含离屏行列)渲染为图片,供「复制为图片 / 保存到相册」使用。 - /// 注意:会临时把 collectionView 放大到完整 contentSize 强制生成全部 cell 再渲染,渲染后还原。 - public func renderFullTableImage() -> UIImage? { - guard self.tableData != nil else { return nil } - self.collectionView.layoutIfNeeded() - let contentSize = self.collectionView.collectionViewLayout.collectionViewContentSize - guard contentSize.width > 0, contentSize.height > 0 else { return nil } - - let savedFrame = self.collectionView.frame - let savedOffset = self.collectionView.contentOffset - self.collectionView.frame = CGRect(origin: .zero, size: contentSize) - self.collectionView.setContentOffset(.zero, animated: false) - self.collectionView.layoutIfNeeded() - - let borderColor = self.style.tableBorderColor ?? UIColor.separator - let renderer = UIGraphicsImageRenderer(size: contentSize) - let image = renderer.image { context in - borderColor.setFill() - context.fill(CGRect(origin: .zero, size: contentSize)) - self.collectionView.layer.render(in: context.cgContext) - } - - self.collectionView.frame = savedFrame - self.collectionView.setContentOffset(savedOffset, animated: false) - self.collectionView.layoutIfNeeded() - return image - } - - /// 复制成功后将图标临时切换为对勾,~1.2s 后还原,提供轻量内建反馈(无需宿主接线)。 - /// 仅对 `identifier == "copy"` 的按钮生效;若无匹配按钮则静默跳过。 - public func showCopyFeedback() { - guard let entry = self.headerButtons.first(where: { $0.item.identifier == "copy" }) else { return } - self.copyResetWorkItem?.cancel() - entry.button.setImage(UIImage(systemName: "checkmark"), for: .normal) - let workItem = DispatchWorkItem { [weak button = entry.button, image = entry.item.image] in - button?.setImage(image, for: .normal) - } - self.copyResetWorkItem = workItem - DispatchQueue.main.asyncAfter(deadline: .now() + 1.2, execute: workItem) - } -} - -extension STMarkdownTableView: UICollectionViewDelegate { - public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - collectionView.deselectItem(at: indexPath, animated: false) - guard let tableData, - indexPath.section < tableData.cells.count, - indexPath.item < tableData.cells[indexPath.section].count else { return } - let citations = tableData.cells[indexPath.section][indexPath.item].citations - if let first = citations.first { - self.onCitationTap?(first) - return - } - self.onExpandTable?(tableData) - } -} - -extension STMarkdownTableView: UICollectionViewDataSource { - - public func numberOfSections(in collectionView: UICollectionView) -> Int { - self.tableData?.rowCount ?? 0 - } - - public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - self.tableData?.columnCount ?? 0 - } - - public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCell( - withReuseIdentifier: STMarkdownTableCell.reuseIdentifier, - for: indexPath - ) - guard let cell = cell as? STMarkdownTableCell else { - return cell - } - - if let tableData, - indexPath.section < tableData.cells.count, - indexPath.item < tableData.cells[indexPath.section].count { - let cellData = tableData.cells[indexPath.section][indexPath.item] - cell.configure(with: cellData, style: self.style) - cell.onCitationTap = { [weak self] number in - self?.onCitationTap?(number) - } - } - return cell - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableViewAttachment.swift b/Sources/STMarkdown/Table/STMarkdownTableViewAttachment.swift deleted file mode 100644 index 8cfbfc3..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableViewAttachment.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// STMarkdownTableViewAttachment.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// AST 模式下的表格 NSTextAttachment:持有一个真实的 STMarkdownTableView。 -/// 类似 FluidMarkdown 的 AMTableViewAttachment 设计: -/// - image 返回 nil(view-based,不走 TextKit 绘制) -/// - attachmentBounds 返回 containerWidth × computedHeight 作为占位 -/// - 由 MarkdownTextView 的 overlay 系统负责定位 tableView -public final class STMarkdownTableViewAttachment: NSTextAttachment { - - public let tableViewModel: STMarkdownTableViewModel - public let style: STMarkdownStyle - public let containerWidth: CGFloat - public var onCitationTap: ((String) -> Void)? { - didSet { - self._tableView?.onCitationTap = self.onCitationTap - } - } - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? { - didSet { - self._tableView?.onExpandTable = self.onExpandTable - } - } - public var onCopyTable: (() -> Void)? { - didSet { - self._tableView?.onCopyTable = self.onCopyTable - } - } - public var onDownloadTable: ((STMarkdownTableViewModel) -> Void)? { - didSet { - self._tableView?.onDownloadTable = self.onDownloadTable - } - } - - private var _tableView: STMarkdownTableView? - - public var tableView: STMarkdownTableView { - if let existing = self._tableView { return existing } - let view = STMarkdownTableView(style: self.style) - view.tableData = self.tableViewModel - view.onCitationTap = { [weak self] number in - self?.onCitationTap?(number) - } - view.onExpandTable = { [weak self] tableViewModel in - self?.onExpandTable?(tableViewModel) - } - view.onCopyTable = { [weak self] in - self?.onCopyTable?() - } - view.onDownloadTable = { [weak self] tableViewModel in - self?.onDownloadTable?(tableViewModel) - } - self._tableView = view - return view - } - - public init( - tableViewModel: STMarkdownTableViewModel, - style: STMarkdownStyle, - containerWidth: CGFloat - ) { - self.tableViewModel = tableViewModel - self.style = style - self.containerWidth = containerWidth - super.init(data: nil, ofType: nil) - self.image = nil - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - public override var image: UIImage? { - get { nil } - set { super.image = nil } - } - - public override func attachmentBounds( - for textContainer: NSTextContainer?, - proposedLineFragment lineFrag: CGRect, - glyphPosition position: CGPoint, - characterIndex charIndex: Int - ) -> CGRect { - // Always recompute — don't cache. TextKit may call this multiple times with - // different proposed widths (e.g. during streaming layout passes), and a stale - // cached size causes the TextKit placeholder rect to disagree with the actual - // table view height, producing visible height jumps. - // - // FluidMarkdown's AMTableViewAttachment doesn't cache either — it calls - // sizeThatFits each time through the table data source. - let size = STMarkdownTableView.computeSize( - tableData: self.tableViewModel, - containerWidth: self.containerWidth, - style: self.style - ) - let resultSize = CGSize(width: self.containerWidth, height: size.height) - return CGRect(origin: .zero, size: resultSize) - } -} diff --git a/Sources/STMarkdown/Table/STMarkdownTableViewModel.swift b/Sources/STMarkdown/Table/STMarkdownTableViewModel.swift deleted file mode 100644 index c50527c..0000000 --- a/Sources/STMarkdown/Table/STMarkdownTableViewModel.swift +++ /dev/null @@ -1,352 +0,0 @@ -// -// STMarkdownTableViewModel.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// Semantic role of a markdown table cell (header row vs body row). -public enum STMarkdownTableCellRole: Sendable, Equatable { - case header - case body - - public var isHeader: Bool { self == .header } -} - -/// 表格 cell 的渲染数据:包含带样式的 NSAttributedString 和 citation 信息 -public struct STMarkdownTableCellData { - public let attributedContent: NSAttributedString - public let citations: [String] - public let role: STMarkdownTableCellRole - - public init(attributedContent: NSAttributedString, citations: [String], role: STMarkdownTableCellRole) { - self.attributedContent = attributedContent - self.citations = citations - self.role = role - } -} - -/// 表格的视图模型,将 STMarkdownTableModel 转换为 UICollectionView 可直接消费的数据 -public final class STMarkdownTableViewModel { - - public let columnCount: Int - public let rowCount: Int - public let hasHeader: Bool - public let columnAlignments: [STMarkdownColumnAlignment] - public let cells: [[STMarkdownTableCellData]] - /// `STMarkdownTableModel.rowGroups` 的直传,基于 `table.rows` 的 0-based 下标。 - /// `hasHeader == true` 时 `cells` 的第 0 行是表头,使用时对行号 +1 对齐。 - public let rowGroups: [[Int]] - - public init( - from table: STMarkdownTableModel, - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers = .empty - ) { - self.hasHeader = table.header != nil - self.columnAlignments = table.columnAlignments - self.rowGroups = table.rowGroups - - let renderer = STMarkdownAttributedStringRenderer( - style: style, - advancedRenderers: advancedRenderers - ) - - let headerFont = style.tableHeaderFont - ?? UIFont.st_systemFont(ofSize: max(style.font.pointSize - 1, 12), weight: .semibold) - let bodyFont = style.tableFont - ?? UIFont.st_systemFont(ofSize: max(style.font.pointSize - 1, 12), weight: .regular) - let headerTextColor = style.tableHeaderTextColor ?? style.textColor - let bodyTextColor = style.tableTextColor ?? style.textColor - - var allRows: [[[STMarkdownInlineNode]]] = [] - if let header = table.header { - allRows.append(header) - } - allRows.append(contentsOf: table.rows) - - let maxCols = allRows.map(\.count).max() ?? 0 - - var builtCells: [[STMarkdownTableCellData]] = [] - for (rowIndex, row) in allRows.enumerated() { - let role: STMarkdownTableCellRole = (self.hasHeader && rowIndex == 0) ? .header : .body - let font = role.isHeader ? headerFont : bodyFont - let textColor = role.isHeader ? headerTextColor : bodyTextColor - var rowCells: [STMarkdownTableCellData] = [] - for colIndex in 0.. String { - self.cells.map { row in - row.map { cell in - cell.attributedContent.string.trimmingCharacters(in: .whitespacesAndNewlines) - }.joined(separator: columnSeparator) - }.joined(separator: rowSeparator) - } - - // MARK: - Private - - private static let citationInTextRegex = try! NSRegularExpression( - pattern: #"\[Citation:(\d+)\]"# - ) - private static let citationStripRegexes: [NSRegularExpression] = [ - try! NSRegularExpression(pattern: #"\[\[?\s*(?:[Cc]itation|[Ww]ebpage)\s*:?\s*\d+\s*\]?\]?"#), - try! NSRegularExpression(pattern: #"\b(?:[Cc]itation|[Ww]ebpage)\s*:\s*\d+"#), - ] - private static let citationBadgeRegexes: [NSRegularExpression] = [ - try! NSRegularExpression(pattern: #"\[?\[?\s*(?:[Cc]itation|[Ww]ebpage)\s*:?\s*(\d+)\s*\]?\]?"#), - try! NSRegularExpression(pattern: #"(?:[Cc]itation|[Ww]ebpage)\s*:\s*(\d+)"#), - ] - - private static func textAlignment(for alignment: STMarkdownColumnAlignment) -> NSTextAlignment { - switch alignment { - case .left: return .left - case .center: return .center - case .right: return .right - } - } - - private static func extractCitations(from nodes: [STMarkdownInlineNode]) -> [String] { - var citations: [String] = [] - Self.collectCitations(from: nodes, into: &citations) - return citations - } - - private static func collectCitations(from nodes: [STMarkdownInlineNode], into citations: inout [String]) { - for node in nodes { - switch node { - case .link(let destination, let children): - if destination.isEmpty, - let number = extractCitationNumber(from: children) { - citations.append(number) - } else { - collectCitations(from: children, into: &citations) - } - case .emphasis(let children), .strong(let children), .strikethrough(let children): - collectCitations(from: children, into: &citations) - case .text(let text): - let ns = text as NSString - let matches = Self.citationInTextRegex.matches( - in: text, - range: NSRange(location: 0, length: ns.length) - ) - for match in matches { - let numberRange = match.range(at: 1) - if numberRange.location != NSNotFound { - citations.append(ns.substring(with: numberRange)) - } - } - default: - break - } - } - } - - private static func extractCitationNumber(from children: [STMarkdownInlineNode]) -> String? { - STMarkdownCitationReferenceSupport.extractCitationNumber(from: children) - } - - // MARK: - Strip Citations from Display - - /// 从 inline nodes 中移除 citation 引用,仅保留正常内容用于显示。 - /// Citation 以 badge 形式由 STMarkdownTableCell 单独渲染,避免显示重复。 - private static func stripCitationNodes(from nodes: [STMarkdownInlineNode]) -> [STMarkdownInlineNode] { - var result: [STMarkdownInlineNode] = [] - for node in nodes { - switch node { - case .link(let destination, let children): - if destination.isEmpty, extractCitationNumber(from: children) != nil { - // Citation link:不加入显示节点 - continue - } - let stripped = stripCitationNodes(from: children) - result.append(.link(destination: destination, children: stripped)) - case .emphasis(let children): - let stripped = stripCitationNodes(from: children) - if !stripped.isEmpty { result.append(.emphasis(stripped)) } - case .strong(let children): - let stripped = stripCitationNodes(from: children) - if !stripped.isEmpty { result.append(.strong(stripped)) } - case .strikethrough(let children): - let stripped = stripCitationNodes(from: children) - if !stripped.isEmpty { result.append(.strikethrough(stripped)) } - case .text(let text): - let cleaned = Self.stripCitationTextPatterns(from: text) - if !cleaned.isEmpty { - result.append(.text(cleaned)) - } - default: - result.append(node) - } - } - return result - } - - /// 从纯文本中移除 [Citation:N] 及 Citation:N 模式的残留文本。 - private static func stripCitationTextPatterns(from text: String) -> String { - var result = text - for regex in Self.citationStripRegexes { - let ns = result as NSString - result = regex.stringByReplacingMatches( - in: result, - range: NSRange(location: 0, length: ns.length), - withTemplate: "" - ) - } - // 清理残留的空括号和多余空格 - result = result.replacingOccurrences(of: "()", with: "") - result = result.replacingOccurrences(of: "[]", with: "") - result = result.replacingOccurrences(of: " ", with: " ") - result = result.trimmingCharacters(in: .whitespaces) - return result - } - - // MARK: - Inline Citation Badge - - /// 在已渲染的 NSAttributedString 中查找 citation 文本模式,将其替换为内联 badge 图片。 - /// 支持以下模式: - /// - 链接文本 "Citation:N"(由 .link 节点渲染) - /// - 纯文本 "[Citation:N]"、"Citation:N" - private static func replaceCitationTextWithBadges( - in attributedString: NSAttributedString, - baseFont: UIFont, - style: STMarkdownStyle - ) -> NSAttributedString { - let result = NSMutableAttributedString(attributedString: attributedString) - let text = result.string as NSString - - // 匹配 [Citation:N]、[[Citation:N]]、Citation:N 及链接文本 "Citation:N",从后往前替换以保持索引有效 - var replacements: [(range: NSRange, number: String)] = [] - for regex in Self.citationBadgeRegexes { - let matches = regex.matches(in: text as String, range: NSRange(location: 0, length: text.length)) - for match in matches { - let numberRange = match.range(at: 1) - guard numberRange.location != NSNotFound else { continue } - let number = text.substring(with: numberRange) - let fullRange = match.range(at: 0) - // 检查是否与已收集的范围重叠 - let overlaps = replacements.contains { existing in - NSIntersectionRange(existing.range, fullRange).length > 0 - } - if !overlaps { - replacements.append((range: fullRange, number: number)) - } - } - } - - // 从后往前替换,保持索引有效 - replacements.sort { $0.range.location > $1.range.location } - for replacement in replacements { - let badge = Self.makeCitationBadgeAttachment( - number: replacement.number, - baseFont: baseFont, - style: style - ) - let badgeString = NSAttributedString(attachment: badge) - // 清理 badge 前后可能残留的空格 - var replaceRange = replacement.range - // 如果 badge 前面是空格,一并移除 - if replaceRange.location > 0 { - let charBefore = text.character(at: replaceRange.location - 1) - if charBefore == 0x20 /* space */ { - replaceRange = NSRange(location: replaceRange.location - 1, length: replaceRange.length + 1) - } - } - result.replaceCharacters(in: replaceRange, with: badgeString) - } - - return result - } - - /// 生成 citation badge 的 NSTextAttachment(内联圆形数字图片)。 - private static func makeCitationBadgeAttachment( - number: String, - baseFont: UIFont, - style: STMarkdownStyle - ) -> NSTextAttachment { - let diameter: CGFloat = 16 - let renderer = UIGraphicsImageRenderer(size: CGSize(width: diameter, height: diameter)) - let image = renderer.image { _ in - let bgColor = style.citationBadgeBgColor ?? .systemBlue - bgColor.setFill() - UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: diameter, height: diameter)).fill() - let attrs: [NSAttributedString.Key: Any] = [ - .font: UIFont.systemFont(ofSize: 9, weight: .semibold), - .foregroundColor: style.citationBadgeTextColor ?? UIColor.white, - ] - let textSize = (number as NSString).size(withAttributes: attrs) - let textRect = CGRect( - x: (diameter - textSize.width) / 2, - y: (diameter - textSize.height) / 2, - width: textSize.width, - height: textSize.height - ) - (number as NSString).draw(in: textRect, withAttributes: attrs) - } - let attachment = NSTextAttachment() - attachment.image = image - // 与文本基线对齐 - attachment.bounds = CGRect( - x: 0, - y: (baseFont.capHeight - diameter) / 2, - width: diameter, - height: diameter - ) - return attachment - } -} diff --git a/Sources/STMarkdown/Table/STScrollableTableAttachment.swift b/Sources/STMarkdown/Table/STScrollableTableAttachment.swift deleted file mode 100644 index 5580485..0000000 --- a/Sources/STMarkdown/Table/STScrollableTableAttachment.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// STScrollableTableAttachment.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 用于可水平滑动 Markdown 表格的 NSTextAttachment 子类。 -/// -/// TextKit 测量时返回 containerWidth × 等比高度 作为占位尺寸, -/// 避免超宽图片撑破 UITextView 布局;实际完整宽度的表格图片由 -/// 业务层视图中的 overlay UIScrollView 负责展示。 -public final class STScrollableTableAttachment: NSTextAttachment { - - public let tableImage: UIImage - public let containerWidth: CGFloat - public let backgroundColor: UIColor? - /// 表格图片中 Citation 角标的位置列表,供 overlay 层叠加可点击按钮 - public let citationRegions: [STTableCitationRegion] - - public init( - tableImage: UIImage, - containerWidth: CGFloat, - backgroundColor: UIColor? = nil, - citationRegions: [STTableCitationRegion] = [] - ) { - self.tableImage = tableImage - self.containerWidth = containerWidth - self.backgroundColor = backgroundColor - self.citationRegions = citationRegions - super.init(data: nil, ofType: nil) - // 将 image 设为 nil,防止 TextKit 用原始超宽图片直接绘制导致”背景占位图”残留 - self.image = nil - } - - /// 强制返回 nil,确保 TextKit 渲染路径完全不绘制背景,由应用层 UIScrollView 提供背景色 - public override var image: UIImage? { - get { return nil } - set { super.image = nil } - } - - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - /// TextKit 向此方法询问附件在 line fragment 中的尺寸。 - /// 返回 containerWidth × 等比缩放后的高度,保证 UITextView 高度测量正确, - /// 同时保证占位宽度不超出容器(避免触发 UITextView 横向扩展)。 - public override func attachmentBounds(for textContainer: NSTextContainer?, proposedLineFragment lineFrag: CGRect, glyphPosition position: CGPoint, characterIndex charIndex: Int) -> CGRect { - let imageSize = tableImage.size - guard imageSize.width > 0, imageSize.height > 0 else { - return CGRect(origin: .zero, size: CGSize(width: containerWidth, height: 44)) - } - // 宽度固定为容器宽度,高度采用图片自然高度(不再按比例缩小),以防止垂直滚动并保持排版正确。 - return CGRect(origin: .zero, size: CGSize(width: containerWidth, height: imageSize.height)) - } -} diff --git a/Sources/STMarkdown/Table/STStaticTableAttachment.swift b/Sources/STMarkdown/Table/STStaticTableAttachment.swift deleted file mode 100644 index 2256bed..0000000 --- a/Sources/STMarkdown/Table/STStaticTableAttachment.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// STStaticTableAttachment.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -/// 非滚动表格的 NSTextAttachment 子类,携带 Citation 角标位置信息。 -/// 用于在 MarkdownTextView 中叠加可点击的透明 UIButton 覆盖层。 -public final class STStaticTableAttachment: NSTextAttachment { - public let tableImage: UIImage - public let citationRegions: [STTableCitationRegion] - - public init(tableImage: UIImage, displayBounds: CGRect, citationRegions: [STTableCitationRegion]) { - self.tableImage = tableImage - self.citationRegions = citationRegions - super.init(data: nil, ofType: nil) - self.image = tableImage - self.bounds = displayBounds - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Sources/STMarkdown/Table/STStreamingMarkdownTableHostView.swift b/Sources/STMarkdown/Table/STStreamingMarkdownTableHostView.swift deleted file mode 100644 index 2af3890..0000000 --- a/Sources/STMarkdown/Table/STStreamingMarkdownTableHostView.swift +++ /dev/null @@ -1,136 +0,0 @@ -// -// STStreamingMarkdownTableHostView.swift -// STMarkdown -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit -import STBaseProject - -public final class STStreamingMarkdownTableHostView: UIView { - - private let tableView: STMarkdownTableView - private var cachedMeasure: (tableID: ObjectIdentifier, width: CGFloat, topInset: CGFloat, height: CGFloat)? - public private(set) var maxUpdateDuration: CFTimeInterval = 0 - public private(set) var maxMeasureDuration: CFTimeInterval = 0 - - /// 表格之前若有正文,给表格留出与最终 AST 一致的顶部间距。 - public var topInset: CGFloat = 0 { - didSet { - guard oldValue != self.topInset else { return } - self.tableTopConstraint.constant = self.topInset - self.cachedMeasure = nil - self.invalidateIntrinsicContentSize() - self.setNeedsLayout() - } - } - - /// 宿主注入的实测渲染宽度,用于 intrinsicContentSize 的高度计算。 - public var preferredContentWidth: CGFloat = 0 { - didSet { - guard abs(oldValue - self.preferredContentWidth) > 0.5 else { return } - self.invalidateIntrinsicContentSize() - } - } - - public var tableStyle: STMarkdownStyle { - didSet { - self.cachedMeasure = nil - self.tableView.style = self.tableStyle - } - } - - public var onCitationTap: ((String) -> Void)? { - didSet { self.tableView.onCitationTap = self.onCitationTap } - } - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? { - didSet { self.tableView.onExpandTable = self.onExpandTable } - } - public var onDownloadTable: ((STMarkdownTableViewModel) -> Void)? { - didSet { self.tableView.onDownloadTable = self.onDownloadTable } - } - - private var tableTopConstraint: NSLayoutConstraint! - - public init(style: STMarkdownStyle) { - self.tableStyle = style - self.tableView = STMarkdownTableView(style: style) - super.init(frame: .zero) - self.backgroundColor = .clear - self.tableView.animatesRowAppends = true - self.tableView.translatesAutoresizingMaskIntoConstraints = false - self.addSubview(self.tableView) - self.tableTopConstraint = self.tableView.topAnchor.constraint(equalTo: self.topAnchor, constant: self.topInset) - NSLayoutConstraint.activate([ - self.tableTopConstraint, - self.tableView.leadingAnchor.constraint(equalTo: self.leadingAnchor), - self.tableView.trailingAnchor.constraint(equalTo: self.trailingAnchor), - self.tableView.bottomAnchor.constraint(equalTo: self.bottomAnchor) - ]) - } - - @available(*, unavailable) - public required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - /// 当前是否承载有效表格数据。 - public var hasContent: Bool { - guard let data = self.tableView.tableData else { return false } - return data.rowCount > 0 && data.columnCount > 0 - } - - /// 行追加 / 当前 cell 追加 / 全量替换由 STMarkdownTableView 内部判定。 - public func update(tableData: STMarkdownTableViewModel?) { - let startedAt = CACurrentMediaTime() - defer { - self.maxUpdateDuration = max(self.maxUpdateDuration, CACurrentMediaTime() - startedAt) - } - self.tableView.updateStreamingTableData(tableData) - self.cachedMeasure = nil - self.invalidateIntrinsicContentSize() - self.setNeedsLayout() - } - - public func clear() { - self.tableView.tableData = nil - self.cachedMeasure = nil - self.maxUpdateDuration = 0 - self.maxMeasureDuration = 0 - self.invalidateIntrinsicContentSize() - } - - /// 在给定宽度下测量宿主高度(含 topInset 与表格自身的 header)。供外部高度合算使用。 - public func measuredHeight(forWidth width: CGFloat) -> CGFloat { - guard let data = self.tableView.tableData, data.rowCount > 0, data.columnCount > 0, width > 1 else { - return 0 - } - let tableID = ObjectIdentifier(data) - if let cached = self.cachedMeasure, - cached.tableID == tableID, - abs(cached.width - width) < 0.5, - abs(cached.topInset - self.topInset) < 0.5 { - return cached.height - } - let startedAt = CACurrentMediaTime() - defer { - self.maxMeasureDuration = max(self.maxMeasureDuration, CACurrentMediaTime() - startedAt) - } - let size = STMarkdownTableView.computeSize( - tableData: data, - containerWidth: width, - style: self.tableStyle - ) - guard size.height > 0 else { return 0 } - let height = ceil(size.height + self.topInset) - self.cachedMeasure = (tableID: tableID, width: width, topInset: self.topInset, height: height) - return height - } - - public override var intrinsicContentSize: CGSize { - let width = self.preferredContentWidth > 0 ? self.preferredContentWidth : self.bounds.width - let height = self.measuredHeight(forWidth: width) - return CGSize(width: UIView.noIntrinsicMetric, height: height) - } -} diff --git a/Sources/STMarkdown/Table/STTableCitationRegion.swift b/Sources/STMarkdown/Table/STTableCitationRegion.swift deleted file mode 100644 index dc7ac3c..0000000 --- a/Sources/STMarkdown/Table/STTableCitationRegion.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// STTableCitationRegion.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import CoreGraphics - -/// 表格图片中一个 Citation 角标的位置与编号。 -/// frame 坐标系为图片 UIKit 坐标系(origin 左上角,y 轴向下,单位为 points)。 -public struct STTableCitationRegion { - public let frame: CGRect - public let number: String - public init(frame: CGRect, number: String) { - self.frame = frame - self.number = number - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownBaseTextView.swift b/Sources/STMarkdown/UI/STMarkdownBaseTextView.swift deleted file mode 100644 index 1a9762d..0000000 --- a/Sources/STMarkdown/UI/STMarkdownBaseTextView.swift +++ /dev/null @@ -1,497 +0,0 @@ -// -// STMarkdownBaseTextView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public class STMarkdownBaseTextView: UIView, STMarkdownInteractable { - - public var markdownStyle: STMarkdownStyle { - didSet { - guard self.isApplyingConfiguration == false else { return } - self.textView.font = self.markdownStyle.font - self.textView.textColor = self.markdownStyle.textColor - self.rebuildRenderer() - if self.rawMarkdown.isEmpty == false { - self.configurationDidChangeRerender() - } - } - } - - public var advancedRenderers: STMarkdownAdvancedRenderers { - didSet { - guard self.isApplyingConfiguration == false else { return } - self.rebuildRenderer() - if self.rawMarkdown.isEmpty == false { - self.configurationDidChangeRerender() - } - } - } - - public var engine: STMarkdownEngine - public var onLinkTap: ((URL) -> Void)? - public var onFootnoteTap: ((String) -> Void)? - /// 目录随管线刷新时回调(含流式 ``STMarkdownStreamingTextView`` 每帧更新);用于侧栏 TOC 与正文同帧对齐。 - public var onTableOfContentsChange: (([STMarkdownTOCItem]) -> Void)? - public var onSelectionChange: ((String) -> Void)? - /// 内容高度变化回调;相对 ``contentLayoutHeightNotificationThreshold`` 防抖,避免频繁抖动。 - /// - /// - Note: 不影响 ``intrinsicContentSize`` 的计算与 Auto Layout intrinsic 更新,仅控制该可选回调的触发频率。 - public var onContentLayoutHeightChange: ((CGFloat) -> Void)? - /// 与 ``onContentLayoutHeightChange`` 搭配:高度变化小于该阈值(pt)时不触发回调。 - public var contentLayoutHeightNotificationThreshold: CGFloat = 9 - /// 已有文本但测得高度为 0 时跳过高度回调(等待后续布局 pass)。 - public var suppressTransientZeroContentLayoutHeightNotification: Bool = true - /// 两次 ``onContentLayoutHeightChange`` 之间的最短间隔(秒);0 表示不节流。用于 TableView Cell 流式输出时压低高度抖动频率。 - public var contentLayoutHeightNotificationMinInterval: TimeInterval = 0 - - public var onCitationTap: ((String) -> Void)? { - didSet { - self.tableOverlayCoordinator.onCitationTap = self.onCitationTap - } - } - - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? { - didSet { - self.tableOverlayCoordinator.onExpandTable = self.onExpandTable - } - } - - public var onDownloadTable: ((STMarkdownTableViewModel) -> Void)? { - didSet { - self.tableOverlayCoordinator.onDownloadTable = self.onDownloadTable - } - } - - public var isTextSelectionEnabled: Bool { - get { self.textView.isSelectable } - set { self.textView.isSelectable = newValue } - } - - public var isSelectable: Bool { - get { self.isTextSelectionEnabled } - set { self.isTextSelectionEnabled = newValue } - } - - public var linkTextAttributes: [NSAttributedString.Key: Any] { - get { self.textView.linkTextAttributes } - set { self.textView.linkTextAttributes = newValue } - } - - public internal(set) var rawMarkdown: String = "" - - /// 最近一次管线渲染对应的目录(对齐对比文档 P1);与 ``scrollToHeadingAnchor`` 使用同一套 ``anchorId``。 - public private(set) var tableOfContents: [STMarkdownTOCItem] = [] - - public var attributedText: NSAttributedString { - self.currentAttributedText - } - - public var contentTextView: UITextView { - self.textView - } - - public var textViewInset: UIEdgeInsets { - get { self.textView.textContainerInset } - set { - self.textView.textContainerInset = newValue - self.markTableOverlayDirty() - self.invalidateIntrinsicContentSize() - } - } - - public var preferredContentWidth: CGFloat = 0 { - didSet { - guard self.preferredContentWidth != oldValue else { return } - self.invalidateIntrinsicContentSize() - } - } - - internal let textView: UITextView - internal var isApplyingConfiguration = false - internal var renderer: STMarkdownAttributedStringRenderer - - /// 当前 attributedText 上所有异步 attachment 的刷新订阅。 - /// 文本被替换时需要先把旧 token 全部 `invalidate`,避免共享 attachment 的多个 TextView - /// 在旧内容被丢弃后仍然收到回调(虽然 `[weak self]` 会让回调成为 no-op,但仍会在 - /// attachment 内保留无效 entry)。 - private var attachmentRefreshTokens: [STMarkdownRefreshObservation] = [] - - private var lastLaidOutSize: CGSize = .zero - private var lastNotifiedContentLayoutHeight: CGFloat = -1 - private var lastContentLayoutHeightNotifyUptime: TimeInterval = -1 - - internal init( - textView: UITextView, - frame: CGRect, - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers, - engine: STMarkdownEngine, - accessibilityTraits: UIAccessibilityTraits - ) { - self.textView = textView - self.markdownStyle = style - self.advancedRenderers = advancedRenderers - self.engine = engine - self.renderer = STMarkdownAttributedStringRenderer( - style: style, - advancedRenderers: advancedRenderers - ) - super.init(frame: frame) - self.setup(accessibilityTraits: accessibilityTraits) - } - - internal init?( - textView: UITextView, - coder: NSCoder, - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers, - engine: STMarkdownEngine, - accessibilityTraits: UIAccessibilityTraits - ) { - self.textView = textView - self.markdownStyle = style - self.advancedRenderers = advancedRenderers - self.engine = engine - self.renderer = STMarkdownAttributedStringRenderer( - style: style, - advancedRenderers: advancedRenderers - ) - super.init(coder: coder) - self.setup(accessibilityTraits: accessibilityTraits) - } - - public required init?(coder: NSCoder) { - let style = STMarkdownStyle.default - self.textView = UITextView(usingTextLayoutManager: false) - self.markdownStyle = style - self.advancedRenderers = .empty - self.engine = STMarkdownEngine() - self.renderer = STMarkdownAttributedStringRenderer(style: style, advancedRenderers: .empty) - super.init(coder: coder) - self.setup(accessibilityTraits: .staticText) - } - - public override var intrinsicContentSize: CGSize { - let w = self.resolvedMarkdownMeasurementWidth() - let fitting = self.textView.sizeThatFits( - CGSize(width: w, height: .greatestFiniteMagnitude) - ) - let h = self.resolvedTextViewContentHeight( - width: w, - sizeThatFitsHeight: fitting.height - ) - return CGSize(width: UIView.noIntrinsicMetric, height: h) - } - - public override func sizeThatFits(_ size: CGSize) -> CGSize { - return self.textView.sizeThatFits(size) - } - - public override func layoutSubviews() { - super.layoutSubviews() - let sizeChanged = self.bounds.size != self.lastLaidOutSize - self.lastLaidOutSize = self.bounds.size - self.tableOverlayCoordinator.updateIfNeeded( - attributedText: self.currentAttributedText, - containerBounds: self.bounds - ) - if sizeChanged && self.bounds.width > 0 { - self.invalidateIntrinsicContentSize() - self.publishContentLayoutHeightNotificationIfNeeded(force: false) - } - } - - public func sizeThatFitsMarkdown(width: CGFloat) -> CGSize { - let size = self.textView.sizeThatFits( - CGSize(width: width, height: .greatestFiniteMagnitude) - ) - let h = self.resolvedTextViewContentHeight(width: width, sizeThatFitsHeight: size.height) - return CGSize(width: width, height: h) - } - - internal var currentAttributedText: NSAttributedString { - self.textView.attributedText ?? NSAttributedString() - } - - internal func updateTableOfContents(from result: STMarkdownPipelineResult) { - self.tableOfContents = result.tableOfContents - self.onTableOfContentsChange?(self.tableOfContents) - } - - /// 从渲染 AST 刷新目录(供流式 ``STMarkdownPipeline/processIncremental`` 合并结果等路径使用)。 - internal func updateTableOfContents(from renderDocument: STMarkdownRenderDocument) { - self.tableOfContents = STMarkdownTOCExtraction.items(from: renderDocument) - self.onTableOfContentsChange?(self.tableOfContents) - } - - internal func renderMarkdown(_ markdown: String) -> NSAttributedString { - let result = self.engine.process(markdown) - self.updateTableOfContents(from: result) - return self.renderer.render(document: result.renderDocument) - } - - /// 将可见区域滚动到指定标题锚点(``NSAttributedString.Key.stMarkdownHeadingAnchor``)。 - /// - Returns: 是否找到对应锚点。 - @discardableResult - public func scrollToHeadingAnchor(id: String, animated _: Bool) -> Bool { - guard let attr = self.textView.attributedText, attr.length > 0 else { return false } - var target: NSRange? - attr.enumerateAttribute( - .stMarkdownHeadingAnchor, - in: NSRange(location: 0, length: attr.length) - ) { value, range, stop in - guard let s = value as? String, s == id else { return } - target = range - stop.pointee = true - } - guard let range = target else { return false } - self.textView.scrollRangeToVisible(range) - let selection = NSRange(location: range.location, length: 0) - self.textView.selectedRange = selection - return true - } - - /// 与 ``scrollToHeadingAnchor`` 等价;命名对齐常见 TOC API(对比文档 §6.3)。 - @discardableResult - public func scrollToTOCItem(anchorId: String, animated: Bool) -> Bool { - return self.scrollToHeadingAnchor(id: anchorId, animated: animated) - } - - /// 查询标题锚点在富文本中的 UTF-16 范围(便于外层 ``UIScrollView`` 自行滚动)。 - public func characterRangeForHeadingAnchor(id: String) -> NSRange? { - guard let attr = self.textView.attributedText, attr.length > 0 else { return nil } - var target: NSRange? - attr.enumerateAttribute( - .stMarkdownHeadingAnchor, - in: NSRange(location: 0, length: attr.length) - ) { value, range, stop in - guard let s = value as? String, s == id else { return } - target = range - stop.pointee = true - } - return target - } - - internal func applyConfigurationCommon( - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers, - engine: STMarkdownEngine - ) { - self.isApplyingConfiguration = true - self.markdownStyle = style - self.advancedRenderers = advancedRenderers - self.engine = engine - self.isApplyingConfiguration = false - self.textView.font = style.font - self.textView.textColor = style.textColor - self.rebuildRenderer() - } - - internal func finalizeRenderUpdate(rendered: NSAttributedString) { - self.textView.accessibilityValue = rendered.string - self.bindAttachmentRefreshHandlers(in: rendered) - self.markTableOverlayDirty() - self.invalidateIntrinsicContentSize() - self.publishContentLayoutHeightNotificationIfNeeded(force: false) - } - - internal func publishContentLayoutHeightNotificationIfNeeded(force: Bool = false) { - guard self.onContentLayoutHeightChange != nil else { return } - let height = self.currentMeasuredTextViewContentHeight() - let hasContent = !self.rawMarkdown.isEmpty || (self.textView.attributedText?.length ?? 0) > 0 - if self.suppressTransientZeroContentLayoutHeightNotification && !force && height <= 0 && hasContent { - return - } - let last = self.lastNotifiedContentLayoutHeight - guard force || last < 0 || abs(height - last) >= self.contentLayoutHeightNotificationThreshold else { - return - } - if force == false, - self.contentLayoutHeightNotificationMinInterval > 0 { - let now = ProcessInfo.processInfo.systemUptime - if self.lastContentLayoutHeightNotifyUptime >= 0, - now - self.lastContentLayoutHeightNotifyUptime < self.contentLayoutHeightNotificationMinInterval { - return - } - } - self.lastNotifiedContentLayoutHeight = height - if self.contentLayoutHeightNotificationMinInterval > 0 { - self.lastContentLayoutHeightNotifyUptime = ProcessInfo.processInfo.systemUptime - } - self.onContentLayoutHeightChange?(height) - } - - private func currentMeasuredTextViewContentHeight() -> CGFloat { - let w = self.resolvedMarkdownMeasurementWidth() - let fitting = self.textView.sizeThatFits( - CGSize(width: w, height: .greatestFiniteMagnitude) - ) - return self.resolvedTextViewContentHeight(width: w, sizeThatFitsHeight: fitting.height) - } - - /// Cell 流式场景下 superview 尚未完成布局时,优先用 ``preferredContentWidth``,其次用自身 bounds、再 fallback 到 TextView 的几何宽度。 - internal func resolvedMarkdownMeasurementWidth() -> CGFloat { - if self.preferredContentWidth > 0 { - return self.preferredContentWidth - } - if self.bounds.width > 0 { - return self.bounds.width - } - if self.textView.bounds.width > 0 { - return self.textView.bounds.width - } - if self.textView.frame.width > 0 { - return self.textView.frame.width - } - return self.window?.bounds.width ?? UIScreen.main.bounds.width - } - - /// 对齐常见 Markdown 组件:在 `sizeThatFits` 暂为 0 时回退 `contentSize` / `bounds` 高度,减轻 Cell 初始 pass 的 0↔实际高度跳变。 - private func resolvedTextViewContentHeight(width: CGFloat, sizeThatFitsHeight: CGFloat) -> CGFloat { - var h = ceil(sizeThatFitsHeight) - let hasAttr = (self.textView.attributedText?.length ?? 0) > 0 - if h <= 0, hasAttr, width > 0 { - let contentH = ceil(self.textView.contentSize.height) - if contentH > 0 { - h = contentH - } - } - if h <= 0, hasAttr, self.textView.bounds.height > 0 { - h = ceil(self.textView.bounds.height) - } - return h - } - - internal func resetBaseState() { - self.rawMarkdown = "" - self.tableOfContents = [] - self.onTableOfContentsChange?([]) - for token in self.attachmentRefreshTokens { - token.invalidate() - } - self.attachmentRefreshTokens.removeAll() - self.tableOverlayCoordinator.reset() - self.invalidateIntrinsicContentSize() - self.lastNotifiedContentLayoutHeight = -1 - self.lastContentLayoutHeightNotifyUptime = -1 - } - - internal func markTableOverlayDirty() { - self.tableOverlayCoordinator.markDirty() - } - - internal func configurationDidChangeRerender() { - } - - private func setup(accessibilityTraits: UIAccessibilityTraits) { - self.backgroundColor = .clear - self.isAccessibilityElement = false - self.textView.translatesAutoresizingMaskIntoConstraints = false - self.textView.isEditable = false - self.textView.isSelectable = true - self.textView.isScrollEnabled = false - self.textView.backgroundColor = .clear - self.textView.textContainerInset = .zero - self.textView.textContainer.lineFragmentPadding = 0 - self.textView.font = self.markdownStyle.font - self.textView.textColor = self.markdownStyle.textColor - self.textView.accessibilityTraits = accessibilityTraits - self.textView.delegate = self - self.addSubview(self.textView) - NSLayoutConstraint.activate([ - self.textView.topAnchor.constraint(equalTo: self.topAnchor), - self.textView.leadingAnchor.constraint(equalTo: self.leadingAnchor), - self.textView.trailingAnchor.constraint(equalTo: self.trailingAnchor), - self.textView.bottomAnchor.constraint(equalTo: self.bottomAnchor), - ]) - } - - private func rebuildRenderer() { - self.renderer = STMarkdownAttributedStringRenderer( - style: self.markdownStyle, - advancedRenderers: self.advancedRenderers - ) - } - - @MainActor - private func refreshRenderedAttachment(_ attachment: NSTextAttachment) { - let content = self.currentAttributedText - guard content.length > 0 else { return } - var hit: NSRange? - content.enumerateAttribute( - .attachment, - in: NSRange(location: 0, length: content.length) - ) { value, range, stop in - if let candidate = value as? NSTextAttachment, candidate === attachment { - hit = range - stop.pointee = true - } - } - guard let range = hit else { return } - self.textView.layoutManager.invalidateDisplay(forCharacterRange: range) - self.textView.layoutManager.invalidateLayout(forCharacterRange: range, actualCharacterRange: nil) - self.invalidateIntrinsicContentSize() - } - - private func bindAttachmentRefreshHandlers(in attributedText: NSAttributedString) { - // 先释放旧订阅,避免 TextView 在不同 attributedText 之间切换时, - // 共享的 attachment 继续把回调派发到已被替换的内容上。 - for token in self.attachmentRefreshTokens { - token.invalidate() - } - self.attachmentRefreshTokens = STMarkdownAttachmentRefreshSupport.bindRefreshHandlers(in: attributedText) { [weak self] attachment in - self?.refreshRenderedAttachment(attachment) - } - } - - private lazy var tableOverlayCoordinator: STMarkdownTableOverlayCoordinator = { - return STMarkdownTableOverlayCoordinator(textView: self.textView) - }() -} - -extension STMarkdownBaseTextView: UITextViewDelegate { - public func textViewDidChangeSelection(_ textView: UITextView) { - guard let range = textView.selectedTextRange else { - self.onSelectionChange?("") - return - } - self.onSelectionChange?(textView.text(in: range) ?? "") - } - - public func textView( - _ textView: UITextView, - shouldInteractWith url: URL, - in characterRange: NSRange, - interaction: UITextItemInteraction - ) -> Bool { - if let label = STMarkdownFootnoteDeepLink.label(from: url) { - self.onFootnoteTap?(label) - return false - } - self.onLinkTap?(url) - return false - } - - @available(iOS 17.0, *) - public func textView( - _ textView: UITextView, - primaryActionFor textItem: UITextItem, - defaultAction: UIAction - ) -> UIAction? { - guard case let .link(url) = textItem.content else { - return defaultAction - } - if let label = STMarkdownFootnoteDeepLink.label(from: url) { - return UIAction { [weak self] _ in - self?.onFootnoteTap?(label) - } - } - return UIAction { [weak self] _ in - self?.onLinkTap?(url) - } - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownCodeContentView.swift b/Sources/STMarkdown/UI/STMarkdownCodeContentView.swift deleted file mode 100644 index 5331360..0000000 --- a/Sources/STMarkdown/UI/STMarkdownCodeContentView.swift +++ /dev/null @@ -1,230 +0,0 @@ -// -// STMarkdownCodeContentView.swift -// STMarkdown -// -// 代码内容视图:行号 + 语法高亮,支持渲染为图片(UIGraphicsImageRenderer)。 -// 所有颜色通过参数注入,不直接引用 ThemeManager。 -// - -import UIKit -import STBaseProject - -/// 代码内容展示视图,带行号边栏和语法高亮,支持渲染为图片供附件使用。 -public final class STMarkdownCodeContentView: UIView, UITextViewDelegate { - - private var lineNumberGutterWidth: CGFloat = 42 - private var lineNumberGutterWidthConstraint: NSLayoutConstraint? - private var lineNumberHeightConstraint: NSLayoutConstraint? - private var lineNumberTextContentHeight: CGFloat = 0 - private var isSyncingCodeScroll = false - private var currentCode: String = "" - private var currentStyle: STMarkdownStyle? - private var currentCodeBlockTextColor: UIColor = UIColor.label - private var currentLineNumberColor: UIColor = UIColor.secondaryLabel - - /// 可替换的代码字体 - public var codeFont: UIFont = UIFont.st_monospacedSystemFont(ofSize: 14, weight: .regular) - /// 可替换的行号字体 - public var lineNumberFont: UIFont = UIFont.st_monospacedSystemFont(ofSize: 12, weight: .regular) - - public override init(frame: CGRect) { - super.init(frame: frame) - self.setupUI() - } - - public required init?(coder: NSCoder) { - return nil - } - - /// 应用主题颜色(从外部注入,不直接引用 ThemeManager)。 - public func applyTheme(codeBlockTextColor: UIColor, - lineNumberColor: UIColor, - lineNumberBackgroundColor: UIColor, - codeBackgroundColor: UIColor) { - self.backgroundColor = .clear - self.lineNumberContainerView.backgroundColor = lineNumberBackgroundColor - self.codeTextView.backgroundColor = .clear - self.codeTextView.textColor = codeBlockTextColor - self.currentCodeBlockTextColor = codeBlockTextColor - self.currentLineNumberColor = lineNumberColor - if let style = self.currentStyle { - self.rebuildLineNumbersIfPossible(rawCode: self.currentCode, style: style) - } - } - - public func update(code: String, language: String?, style: STMarkdownStyle) { - self.currentCode = code - self.currentStyle = style - let font = self.codeFont - let lineSpacing = max(style.bodyLineSpacing, 2) - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineBreakMode = .byCharWrapping - paragraphStyle.lineSpacing = lineSpacing - self.codeTextView.attributedText = STMarkdownCodeSyntaxHighlighter.highlightedBody( - language: language, - code: code, - font: font, - textColor: style.codeBlockTextColor ?? self.currentCodeBlockTextColor, - paragraphStyle: paragraphStyle - ) - let logicalLines = max(code.components(separatedBy: .newlines).count, 1) - let digits = String(logicalLines).count - let gutterWidth = max(34, CGFloat(digits) * 8 + 14) - self.lineNumberGutterWidth = gutterWidth - self.lineNumberGutterWidthConstraint?.constant = gutterWidth - self.rebuildLineNumbersIfPossible(rawCode: code, style: style) - self.syncLineNumberOffset(with: self.codeTextView.contentOffset) - } - - /// 将代码内容渲染为 UIImage(用于附件快照)。 - public func renderCodeImage(style: STMarkdownStyle, - codeBackgroundColor: UIColor, - gutterBackgroundColor: UIColor) -> UIImage? { - guard let codeAttributed = self.codeTextView.attributedText, codeAttributed.length > 0 else { return nil } - let gutterWidth = self.lineNumberGutterWidth - let targetWidth = max(self.bounds.width, 200) - let codeWidth = max(targetWidth - gutterWidth, 120) - let codeInsets = self.codeTextView.textContainerInset - let lineContentHeight = self.lineNumberTextContentHeight - let codeContentHeight = codeAttributed.boundingRect( - with: CGSize(width: codeWidth - codeInsets.left - codeInsets.right, height: .greatestFiniteMagnitude), - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil - ).height + codeInsets.top + codeInsets.bottom - let contentHeight = max(ceil(max(lineContentHeight, codeContentHeight)), 100) - let imageSize = CGSize(width: gutterWidth + codeWidth, height: contentHeight) - let format = UIGraphicsImageRendererFormat.default() - format.opaque = true - format.scale = max(UIScreen.main.scale, 3.0) - let renderer = UIGraphicsImageRenderer(size: imageSize, format: format) - return renderer.image { context in - codeBackgroundColor.setFill() - context.fill(CGRect(origin: .zero, size: imageSize)) - gutterBackgroundColor.setFill() - context.fill(CGRect(x: 0, y: 0, width: gutterWidth, height: contentHeight)) - let lineRect = CGRect(x: 0, y: 0, width: gutterWidth, height: contentHeight) - let codeRect = CGRect(x: gutterWidth, y: 0, width: codeWidth, height: contentHeight) - self.lineNumberLabel.render(in: context.cgContext, bounds: lineRect) - codeAttributed.draw( - with: codeRect.inset(by: UIEdgeInsets(top: codeInsets.top, left: codeInsets.left, bottom: codeInsets.bottom, right: codeInsets.right)), - options: [.usesLineFragmentOrigin, .usesFontLeading], - context: nil - ) - } - } - - public override func layoutSubviews() { - super.layoutSubviews() - if let style = self.currentStyle, !self.currentCode.isEmpty { - self.rebuildLineNumbersIfPossible(rawCode: self.currentCode, style: style) - } - } - - public func scrollViewDidScroll(_ scrollView: UIScrollView) { - guard scrollView === self.codeTextView, !self.isSyncingCodeScroll else { return } - self.syncLineNumberOffset(with: scrollView.contentOffset) - } - - private func setupUI() { - self.lineNumberContainerView.translatesAutoresizingMaskIntoConstraints = false - self.codeTextView.translatesAutoresizingMaskIntoConstraints = false - self.lineNumberLabel.translatesAutoresizingMaskIntoConstraints = false - - self.addSubview(self.lineNumberContainerView) - self.lineNumberContainerView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true - self.lineNumberContainerView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true - self.lineNumberContainerView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true - self.lineNumberGutterWidthConstraint = self.lineNumberContainerView.widthAnchor.constraint(equalToConstant: 42) - self.lineNumberGutterWidthConstraint?.isActive = true - - self.lineNumberContainerView.addSubview(self.lineNumberLabel) - self.lineNumberLabel.leadingAnchor.constraint(equalTo: self.lineNumberContainerView.leadingAnchor).isActive = true - self.lineNumberLabel.topAnchor.constraint(equalTo: self.lineNumberContainerView.topAnchor).isActive = true - self.lineNumberLabel.trailingAnchor.constraint(equalTo: self.lineNumberContainerView.trailingAnchor).isActive = true - self.lineNumberHeightConstraint = self.lineNumberLabel.heightAnchor.constraint(equalToConstant: 1) - self.lineNumberHeightConstraint?.isActive = true - - self.addSubview(self.codeTextView) - self.codeTextView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true - self.codeTextView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true - self.codeTextView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true - self.codeTextView.leadingAnchor.constraint(equalTo: self.lineNumberContainerView.trailingAnchor).isActive = true - } - - private func rebuildLineNumbersIfPossible(rawCode: String, style: STMarkdownStyle) { - guard let codeAttributed = self.codeTextView.attributedText, codeAttributed.length > 0 else { return } - let layoutManager = self.codeTextView.layoutManager - let container = self.codeTextView.textContainer - layoutManager.ensureLayout(for: container) - let codeNSString = rawCode as NSString - let glyphRange = layoutManager.glyphRange(for: container) - var currentLogicalLine = 1 - var entries: [STMarkdownLineNumberEntry] = [] - let topInset = self.codeTextView.textContainerInset.top - layoutManager.enumerateLineFragments(forGlyphRange: glyphRange) { _, _, _, fragmentGlyphRange, _ in - let charRange = layoutManager.characterRange(forGlyphRange: fragmentGlyphRange, actualGlyphRange: nil) - let isLineStart = charRange.location == 0 || - (charRange.location > 0 && codeNSString.character(at: charRange.location - 1) == 10) - let rawY = layoutManager.lineFragmentRect(forGlyphAt: fragmentGlyphRange.location, effectiveRange: nil).minY + topInset - let lineY = self.alignToPixel(rawY) - if isLineStart { - entries.append(.init(text: String(currentLogicalLine), y: lineY)) - currentLogicalLine += 1 - } - } - if entries.isEmpty { - entries = [.init(text: "1", y: topInset)] - } - let usedHeight = layoutManager.usedRect(for: container).height + self.codeTextView.textContainerInset.top + self.codeTextView.textContainerInset.bottom - let contentHeight = max(ceil(usedHeight), ceil(self.codeTextView.contentSize.height), 1) - self.lineNumberTextContentHeight = contentHeight - self.lineNumberHeightConstraint?.constant = contentHeight - self.lineNumberLabel.update(entries: entries, font: self.lineNumberFont, color: self.currentLineNumberColor, rightInset: self.lineNumberInsets.right) - } - - private func alignToPixel(_ value: CGFloat) -> CGFloat { - let scale = max(UIScreen.main.scale, 1) - return (value * scale).rounded(.toNearestOrAwayFromZero) / scale - } - - private func syncLineNumberOffset(with contentOffset: CGPoint) { - guard !self.isSyncingCodeScroll else { return } - self.isSyncingCodeScroll = true - let maxOffsetY = max(self.lineNumberTextContentHeight - self.lineNumberContainerView.bounds.height, 0) - let y = min(max(contentOffset.y, 0), maxOffsetY) - self.lineNumberLabel.transform = CGAffineTransform(translationX: 0, y: -y) - self.isSyncingCodeScroll = false - } - - private var lineNumberInsets: UIEdgeInsets { - UIEdgeInsets(top: 12, left: 0, bottom: 20, right: 6) - } - - private lazy var lineNumberContainerView: UIView = { - let view = UIView() - view.clipsToBounds = true - view.backgroundColor = .clear - return view - }() - - private lazy var lineNumberLabel: STMarkdownLineNumberDrawView = { - let view = STMarkdownLineNumberDrawView() - view.backgroundColor = .clear - return view - }() - - /// 公开 codeTextView 供外部自定义 - public private(set) lazy var codeTextView: UITextView = { - let view = UITextView() - view.isEditable = false - view.isSelectable = true - view.backgroundColor = .clear - view.textContainerInset = UIEdgeInsets(top: 12, left: 8, bottom: 20, right: 12) - view.font = self.codeFont - view.showsVerticalScrollIndicator = true - view.alwaysBounceVertical = true - view.delegate = self - view.textColor = UIColor.label - return view - }() -} diff --git a/Sources/STMarkdown/UI/STMarkdownCodeSheetViewController.swift b/Sources/STMarkdown/UI/STMarkdownCodeSheetViewController.swift deleted file mode 100644 index a678db4..0000000 --- a/Sources/STMarkdown/UI/STMarkdownCodeSheetViewController.swift +++ /dev/null @@ -1,193 +0,0 @@ -// -// STMarkdownCodeSheetViewController.swift -// STMarkdown -// - -import UIKit -import STBaseProject - -/// 代码弹窗通用底部容器 VC。 -/// 提供 dimming view、sheet view、grabber、close/copy 按钮和标题布局,以及弹出/收起动画。 -/// 子类只需在 viewDidLoad 中调用 setupBottomSheetLayout、layoutCommonGrabberAndClose、layoutCommonCopyAndTitle -/// 即可获得完整的底部弹窗交互。 -open class STMarkdownCodeSheetViewController: UIViewController { - public enum LayoutMetrics { - public static let initialSheetBottomOffset: CGFloat = 900 - public static let grabberTop: CGFloat = 8 - public static let grabberWidth: CGFloat = 40 - public static let grabberHeight: CGFloat = 4 - public static let closeTop: CGFloat = 12 - public static let closeTrailing: CGFloat = 12 - public static let closeSize: CGFloat = 25 - public static let copyTrailingToRightAnchor: CGFloat = 18 - public static let copySize: CGFloat = 18 - public static let titleLeading: CGFloat = 16 - public static let titleTrailingToCopy: CGFloat = 10 - public static let contentTopSpacing: CGFloat = 12 - } - - private weak var managedDimmingView: UIView? - private var managedSheetBottomConstraint: NSLayoutConstraint? - private var didAnimateIn = false - public var onCopyTapped: (() -> Void)? - public var onCloseTapped: (() -> Void)? - public var headerTitle: String = "" { - didSet { - self.titleLabel.text = self.headerTitle - } - } - - /// 可注入的关闭/复制图标 - public var closeImage: UIImage? { - didSet { self.closeButton.setImage(self.closeImage, for: .normal) } - } - public var copyImage: UIImage? { - didSet { self.copyButton.setImage(self.copyImage?.withRenderingMode(.alwaysTemplate), for: .normal) } - } - - /// 配置底部弹窗布局。 - public func setupBottomSheetLayout(heightRatio: CGFloat = 0.88, dimmingView: UIView, sheetView: UIView) { - self.managedDimmingView = dimmingView - dimmingView.translatesAutoresizingMaskIntoConstraints = false - sheetView.translatesAutoresizingMaskIntoConstraints = false - self.view.addSubview(dimmingView) - NSLayoutConstraint.activate([ - dimmingView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - dimmingView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), - dimmingView.topAnchor.constraint(equalTo: self.view.topAnchor), - dimmingView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), - ]) - self.view.addSubview(sheetView) - NSLayoutConstraint.activate([ - sheetView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), - sheetView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), - sheetView.heightAnchor.constraint(equalTo: self.view.heightAnchor, multiplier: heightRatio), - ]) - self.managedSheetBottomConstraint = sheetView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: LayoutMetrics.initialSheetBottomOffset) - self.managedSheetBottomConstraint?.isActive = true - } - - open override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - guard !self.didAnimateIn else { return } - self.didAnimateIn = true - self.animateBottomSheetIn() - } - - /// 弹出动画 - public func animateBottomSheetIn() { - self.view.layoutIfNeeded() - UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseOut) { - self.managedDimmingView?.backgroundColor = UIColor.black.withAlphaComponent(0.5) - self.managedSheetBottomConstraint?.constant = 0 - self.view.layoutIfNeeded() - } - } - - /// 收起并 dismiss - public func dismissBottomSheet() { - UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn) { - self.managedDimmingView?.backgroundColor = UIColor.black.withAlphaComponent(0) - self.managedSheetBottomConstraint?.constant = 900 - self.view.layoutIfNeeded() - } completion: { _ in - self.dismiss(animated: false) - } - } - - /// 应用公共 header 主题 - public func applyCommonHeaderTheme(separatorColor: UIColor, titleColor: UIColor, bottomMenuColor: UIColor) { - self.grabberView.backgroundColor = separatorColor - self.titleLabel.textColor = titleColor - self.copyButton.tintColor = bottomMenuColor - } - - /// 布局 grabber 和 close 按钮到 sheetView - public func layoutCommonGrabberAndClose(in sheetView: UIView) { - self.grabberView.translatesAutoresizingMaskIntoConstraints = false - self.closeButton.translatesAutoresizingMaskIntoConstraints = false - sheetView.addSubview(self.grabberView) - NSLayoutConstraint.activate([ - self.grabberView.topAnchor.constraint(equalTo: sheetView.topAnchor, constant: LayoutMetrics.grabberTop), - self.grabberView.centerXAnchor.constraint(equalTo: sheetView.centerXAnchor), - self.grabberView.widthAnchor.constraint(equalToConstant: LayoutMetrics.grabberWidth), - self.grabberView.heightAnchor.constraint(equalToConstant: LayoutMetrics.grabberHeight), - ]) - sheetView.addSubview(self.closeButton) - NSLayoutConstraint.activate([ - self.closeButton.topAnchor.constraint(equalTo: self.grabberView.bottomAnchor, constant: LayoutMetrics.closeTop), - self.closeButton.trailingAnchor.constraint(equalTo: sheetView.trailingAnchor, constant: -LayoutMetrics.closeTrailing), - self.closeButton.widthAnchor.constraint(equalToConstant: LayoutMetrics.closeSize), - self.closeButton.heightAnchor.constraint(equalToConstant: LayoutMetrics.closeSize), - ]) - } - - /// 布局 copy 按钮和 title 到 sheetView - public func layoutCommonCopyAndTitle(in sheetView: UIView, copyRightAnchor: UIView, copyCenterYAnchor: UIView, titleCenterYAnchor: UIView) { - self.copyButton.translatesAutoresizingMaskIntoConstraints = false - self.titleLabel.translatesAutoresizingMaskIntoConstraints = false - sheetView.addSubview(self.copyButton) - NSLayoutConstraint.activate([ - self.copyButton.centerYAnchor.constraint(equalTo: copyCenterYAnchor.centerYAnchor), - self.copyButton.trailingAnchor.constraint(equalTo: copyRightAnchor.leadingAnchor, constant: -LayoutMetrics.copyTrailingToRightAnchor), - self.copyButton.widthAnchor.constraint(equalToConstant: LayoutMetrics.copySize), - self.copyButton.heightAnchor.constraint(equalToConstant: LayoutMetrics.copySize), - ]) - sheetView.addSubview(self.titleLabel) - NSLayoutConstraint.activate([ - self.titleLabel.leadingAnchor.constraint(equalTo: sheetView.leadingAnchor, constant: LayoutMetrics.titleLeading), - self.titleLabel.centerYAnchor.constraint(equalTo: titleCenterYAnchor.centerYAnchor), - self.titleLabel.trailingAnchor.constraint(equalTo: self.copyButton.leadingAnchor, constant: -LayoutMetrics.titleTrailingToCopy), - ]) - } - - @objc private func handleCloseAction() { - if let onCloseTapped { - onCloseTapped() - } else { - self.dismissBottomSheet() - } - } - - @objc private func handleCopyAction() { - self.onCopyTapped?() - } - - public lazy var grabberView: UIView = { - let view = UIView() - view.layer.cornerRadius = 2 - return view - }() - - public lazy var titleLabel: UILabel = { - let label = UILabel() - label.text = self.headerTitle - label.lineBreakMode = .byTruncatingTail - label.font = UIFont.st_systemFont(ofSize: 14, weight: .semibold) - return label - }() - - public lazy var copyButton: UIButton = { - let button = UIButton(type: .custom) - if let image = self.copyImage { - button.setImage(image.withRenderingMode(.alwaysTemplate), for: .normal) - } else { - button.setImage(UIImage(named: "复制")?.withRenderingMode(.alwaysTemplate), for: .normal) - } - button.imageView?.contentMode = .scaleAspectFit - button.addTarget(self, action: #selector(self.handleCopyAction), for: .touchUpInside) - return button - }() - - public lazy var closeButton: UIButton = { - let button = UIButton(type: .custom) - if let image = self.closeImage { - button.setImage(image, for: .normal) - } else { - button.setImage(UIImage(named: "close_x"), for: .normal) - } - button.imageView?.contentMode = .scaleAspectFit - button.addTarget(self, action: #selector(self.handleCloseAction), for: .touchUpInside) - return button - }() -} \ No newline at end of file diff --git a/Sources/STMarkdown/UI/STMarkdownLineNumberDrawView.swift b/Sources/STMarkdown/UI/STMarkdownLineNumberDrawView.swift deleted file mode 100644 index 5c34b20..0000000 --- a/Sources/STMarkdown/UI/STMarkdownLineNumberDrawView.swift +++ /dev/null @@ -1,96 +0,0 @@ -// -// STMarkdownLineNumberDrawView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2026/05/26. -// - -import UIKit - -public struct STMarkdownLineNumberEntry { - public let text: String - public let y: CGFloat - public init(text: String, y: CGFloat) { - self.text = text - self.y = y - } -} - -/// 行号绘制视图,通过 `update(entries:font:color:rightInset:)` 驱动,无主题系统依赖。 -public final class STMarkdownLineNumberDrawView: UIView { - private var entries: [STMarkdownLineNumberEntry] = [] - private var drawFont: UIFont = UIFont.st_monospacedSystemFont(ofSize: 12, weight: .regular) - private var drawColor: UIColor = .systemGray - private var rightInset: CGFloat = 6 - private var lineHeight: CGFloat = UIFont.st_monospacedSystemFont(ofSize: 12, weight: .regular).lineHeight - - public override init(frame: CGRect) { - super.init(frame: frame) - self.isOpaque = false - self.contentMode = .redraw - } - - public required init?(coder: NSCoder) { nil } - - public func update( - entries: [STMarkdownLineNumberEntry], - font: UIFont, - color: UIColor, - rightInset: CGFloat - ) { - self.entries = entries - self.drawFont = font - self.drawColor = color - self.rightInset = rightInset - self.lineHeight = max(font.lineHeight, 1) - self.setNeedsDisplay() - } - - public override func draw(_ rect: CGRect) { - self.drawEntries(in: rect) - } - - public func drawEntries(in rect: CGRect) { - guard !self.entries.isEmpty else { return } - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.alignment = .right - paragraphStyle.lineBreakMode = .byClipping - let attributes: [NSAttributedString.Key: Any] = [ - .font: self.drawFont, - .foregroundColor: self.drawColor, - .paragraphStyle: paragraphStyle, - ] - for entry in self.entries { - let alignedY = self.alignToPixel(entry.y) - let lineRect = CGRect( - x: 0, - y: alignedY, - width: self.alignToPixel(max(self.bounds.width - self.rightInset, 1)), - height: self.alignToPixel(self.lineHeight) - ) - if lineRect.maxY < rect.minY || lineRect.minY > rect.maxY { continue } - (entry.text as NSString).draw(in: lineRect, withAttributes: attributes) - } - } - - public func render(in context: CGContext, bounds: CGRect) { - context.saveGState() - context.translateBy( - x: self.alignToPixel(bounds.minX), - y: self.alignToPixel(bounds.minY) - ) - self.drawEntries(in: CGRect( - origin: .zero, - size: CGSize( - width: self.alignToPixel(bounds.size.width), - height: self.alignToPixel(bounds.size.height) - ) - )) - context.restoreGState() - } - - private func alignToPixel(_ value: CGFloat) -> CGFloat { - let scale = max(UIScreen.main.scale, 1) - return (value * scale).rounded(.toNearestOrAwayFromZero) / scale - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownStreamingTextView.swift b/Sources/STMarkdown/UI/STMarkdownStreamingTextView.swift deleted file mode 100644 index 399af3f..0000000 --- a/Sources/STMarkdown/UI/STMarkdownStreamingTextView.swift +++ /dev/null @@ -1,1113 +0,0 @@ -// -// STMarkdownStreamingTextView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public final class STMarkdownStreamingTextView: STMarkdownBaseTextView { - internal enum SmartStreamingRenderMode { - case full - case incremental - } - - private struct PendingAnimatedSuffix { - let generation: Int - let suffix: NSAttributedString - let trailingSuffix: NSAttributedString? - } - - public var tokenFadeDuration: TimeInterval { - get { self.shimmerTextView.tokenFadeDuration } - set { - _requestedTokenFadeDuration = newValue - self.shimmerTextView.tokenFadeDuration = self.markdownStyle.streamFadeInEnabled ? newValue : 0 - } - } - - public var customDocumentRenderer: ((STMarkdownRenderDocument) -> NSAttributedString)? - - public var suppressSystemTextMenu: Bool { - get { self.shimmerTextView.suppressSystemTextMenu } - set { self.shimmerTextView.suppressSystemTextMenu = newValue } - } - - public var animateAcrossNewlines: Bool { - get { self.shimmerTextView.animateAcrossNewlines } - set { self.shimmerTextView.animateAcrossNewlines = newValue } - } - - /// 流式动画 / 容器尾段延迟追加的兜底超时;超时后强制收口,避免宿主一直等不到完成态。 - public var streamingAnimationWatchdogTimeout: TimeInterval = 4.0 - - private var smartStreamBuffer: STMarkdownStreamBuffer? - private var smartStreamingSessionActive = false - private var isApplyingSmartStreamMarkdownUpdate = false - private var streamingAnimationGeneration: Int = 0 - private var pendingStreamingSuffixWorkItem: DispatchWorkItem? - private var pendingAnimatedSuffix: PendingAnimatedSuffix? - private var streamingWatchdogWorkItem: DispatchWorkItem? - private var streamingWatchdogGeneration: Int = 0 - /// tokenFadeDuration 最后一次被外部请求设置的值;样式允许 fade 时以此值写入 shimmerTextView。 - private var _requestedTokenFadeDuration: TimeInterval = 0.3 - /// 上一帧已交给 ``setMarkdown(_:animated:)`` 的「安全前缀」展示串(经 ``stripUnclosedTailMarkers``)。 - /// 当缓冲器仅增长尾部、``committedSafePrefix`` 不变时跳过整段重解析,降低流式 CPU 占用(对齐对比文档 P0)。 - private var lastSmartStreamRenderedDisplayMarkdown: String? - private var lastSmartStreamRenderedCanonicalMarkdown: String? - private var lastSmartStreamRenderDocument: STMarkdownRenderDocument? - internal private(set) var lastSmartStreamingRenderMode: SmartStreamingRenderMode? - - /// 是否处于 ``beginSmartMarkdownStreaming()`` 开启的智能缓冲流式会话中。 - public var isSmartMarkdownStreamingActive: Bool { - self.smartStreamingSessionActive - } - - /// true 表示没有待执行的容器延迟尾段,也没有进行中的文本 reveal 动画。 - public var isStreamingAnimationIdle: Bool { - self.pendingAnimatedSuffix == nil && self.shimmerTextView.isAnimatingTextReveal == false - } - - /// 会话中的完整累积 Markdown(含尚未通过模块检测的尾部);非会话中为 `nil`。 - public var smartStreamingAccumulatedText: String? { - self.smartStreamBuffer?.fullAccumulatedText - } - - /// `containerThenContent` 命中时,容器/块级前缀先上屏,再等待这一小段间隔后让尾部正文继续 token 动画。 - public var containerRevealGapDuration: TimeInterval = 0.06 - - private var shimmerTextView: STShimmerTextView { - guard let textView = self.textView as? STShimmerTextView else { - preconditionFailure("STMarkdownStreamingTextView requires STShimmerTextView") - } - return textView - } - - public override var attributedText: NSAttributedString { - self.shimmerTextView.renderedAttributedText - } - - internal override var currentAttributedText: NSAttributedString { - self.shimmerTextView.renderedAttributedText - } - - public init(frame: CGRect, usesTextLayoutManager: Bool = true) { - super.init( - textView: STShimmerTextView(usingTextLayoutManager: usesTextLayoutManager), - frame: frame, - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine(), - accessibilityTraits: [.staticText, .updatesFrequently] - ) - self.installStreamingAnimationObservers() - } - - public convenience init( - style: STMarkdownStyle = .default, - advancedRenderers: STMarkdownAdvancedRenderers = .empty, - engine: STMarkdownEngine = STMarkdownEngine(), - usesTextLayoutManager: Bool = true - ) { - self.init(frame: .zero, usesTextLayoutManager: usesTextLayoutManager) - self.applyConfigurationCommon( - style: style, - advancedRenderers: advancedRenderers, - engine: engine - ) - } - - public required init?(coder: NSCoder) { - super.init( - textView: STShimmerTextView(usingTextLayoutManager: true), - coder: coder, - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine(), - accessibilityTraits: [.staticText, .updatesFrequently] - ) - self.installStreamingAnimationObservers() - } - - public func reset() { - self.invalidatePendingStreamingAnimation() - self.invalidateStreamingAnimationWatchdog() - self.cancelSmartMarkdownStreamingSession() - self.shimmerTextView.reset() - self.resetBaseState() - } - - public func finishStreaming() { - self.flushPendingAnimatedSuffixIfNeeded() - self.shimmerTextView.finishAnimations() - self.invalidateStreamingAnimationWatchdog() - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - } - - public func setMarkdown(_ markdown: String, animated: Bool = false) { - self.invalidatePendingStreamingAnimation() - if self.smartStreamingSessionActive && !self.isApplyingSmartStreamMarkdownUpdate { - self.cancelSmartMarkdownStreamingSession() - } - let markdownForRender = animated - ? Self.stripUnclosedTailMarkers(in: markdown) - : markdown - let displayRendered = self.render(markdownForRender) - self.applySetMarkdownAnimatedDiff(markdown: markdown, displayRendered: displayRendered, animated: animated) - } - - private func applySetMarkdownAnimatedDiff( - markdown: String, - displayRendered: NSAttributedString, - animated: Bool - ) { - guard animated, !self.rawMarkdown.isEmpty else { - self.applyFullReplace(markdown: markdown, rendered: displayRendered) - return - } - - let current = self.shimmerTextView.renderedAttributedText - let currentStr = current.string - let renderedStr = displayRendered.string - - if renderedStr.utf16.count >= currentStr.utf16.count, - (renderedStr as NSString).hasPrefix(currentStr) { - let prefixChanged = current.length > 0 - && !displayRendered.attributedSubstring( - from: NSRange(location: 0, length: current.length) - ).isEqual(to: current) - if prefixChanged { - self.applyFullReplace(markdown: markdown, rendered: displayRendered) - return - } - let deltaLen = displayRendered.length - current.length - if deltaLen > 0 { - let delta = displayRendered.attributedSubstring( - from: NSRange(location: current.length, length: deltaLen) - ) - self.applyAppendDelta(markdown: markdown, delta: delta) - } else { - self.rawMarkdown = markdown - self.textView.accessibilityValue = self.shimmerTextView.renderedAttributedText.string - } - return - } - - let commonLen = currentStr.commonPrefix(with: renderedStr).utf16.count - if commonLen > 0 { - let commonPrefixChanged = !current.attributedSubstring( - from: NSRange(location: 0, length: commonLen) - ).isEqual(to: displayRendered.attributedSubstring( - from: NSRange(location: 0, length: commonLen) - )) - let listMarkerInvolved = self.shouldDisableAnimationForTrailingReplacement( - current: current, - rendered: displayRendered, - commonLength: commonLen - ) - if commonPrefixChanged { - self.applyFullReplace(markdown: markdown, rendered: displayRendered) - } else if listMarkerInvolved { - let replaceStart = self.replacementStartForListTransition( - currentString: currentStr, - commonLength: commonLen - ) - let trailing = displayRendered.attributedSubstring( - from: NSRange(location: replaceStart, length: displayRendered.length - replaceStart) - ) - self.applyTrailingReplace( - markdown: markdown, - from: replaceStart, - trailing: trailing, - animate: false - ) - } else { - let trailing = displayRendered.attributedSubstring( - from: NSRange(location: commonLen, length: displayRendered.length - commonLen) - ) - self.applyTrailingReplace( - markdown: markdown, - from: commonLen, - trailing: trailing, - animate: true - ) - } - return - } - - self.applyFullReplace(markdown: markdown, rendered: displayRendered) - } - - public func applyConfiguration( - markdown: String, - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers, - engine: STMarkdownEngine, - animated: Bool - ) { - self.applyConfigurationCommon( - style: style, - advancedRenderers: advancedRenderers, - engine: engine - ) - self.setMarkdown(markdown, animated: animated) - } - - public func appendMarkdownFragment(_ fragment: String, animated: Bool = true) { - guard fragment.isEmpty == false else { return } - if self.smartStreamingSessionActive { - self.appendSmartMarkdownStreamingChunk(fragment) - return - } - self.setMarkdown(self.rawMarkdown + fragment, animated: animated) - } - - public func updateStreamingMarkdown(_ fullMarkdown: String) { - self.cancelSmartMarkdownStreamingSession() - self.setMarkdown(fullMarkdown, animated: true) - } - - /// 开始智能流式会话:先 ``reset()``,再用 ``STMarkdownStreamBuffer`` 按安全模块边界累积 chunk。 - public func beginSmartMarkdownStreaming() { - self.reset() - self.smartStreamBuffer = STMarkdownStreamBuffer( - minModuleLength: self.markdownStyle.streamMinModuleLength - ) - self.smartStreamingSessionActive = true - - // 启用推测重写时,切换为带 streaming parser 的 engine - if self.markdownStyle.streamSpeculativeRewriteEnabled { - let streamingParser = STMarkdownStructureParser.streamingParser() - self.engine = STMarkdownEngine( - configuration: self.engine.pipeline.configuration, - parser: streamingParser, - renderAdapter: self.engine.pipeline.renderAdapter - ) - } - } - - /// 向智能流式缓冲追加一段 chunk 并刷新显示(仅显示已通过检测的安全前缀 + 尾部裁剪)。 - public func appendSmartMarkdownStreamingChunk(_ chunk: String) { - guard chunk.isEmpty == false else { return } - guard self.smartStreamingSessionActive, let buffer = self.smartStreamBuffer else { - self.setMarkdown(self.rawMarkdown + chunk, animated: true) - return - } - buffer.updateMinModuleLength(self.markdownStyle.streamMinModuleLength) - _ = buffer.append(chunk) - self.applySmartStreamingPresentation(animated: true) - } - - /// 结束智能流式会话;默认 ``flush`` 后按完整累积文本做一次非动画收敛。 - public func endSmartMarkdownStreaming(flushPending: Bool = true) { - guard self.smartStreamingSessionActive, let buffer = self.smartStreamBuffer else { return } - if flushPending { - _ = buffer.flush() - } - let snapshot = buffer.fullAccumulatedText - self.smartStreamBuffer = nil - self.smartStreamingSessionActive = false - self.lastSmartStreamRenderedDisplayMarkdown = nil - self.lastSmartStreamRenderedCanonicalMarkdown = nil - self.lastSmartStreamRenderDocument = nil - self.lastSmartStreamingRenderMode = nil - let md = Self.stripUnclosedTailMarkers(in: snapshot) - self.isApplyingSmartStreamMarkdownUpdate = true - defer { self.isApplyingSmartStreamMarkdownUpdate = false } - self.setMarkdown(md, animated: false) - self.rawMarkdown = snapshot - self.invalidateStreamingAnimationWatchdog() - self.publishContentLayoutHeightNotificationIfNeeded(force: true) - } - - internal override func configurationDidChangeRerender() { - self.syncTokenFadeDurationFromStyle() - if self.smartStreamingSessionActive { - self.smartStreamBuffer?.updateMinModuleLength(self.markdownStyle.streamMinModuleLength) - self.applySmartStreamingPresentation(animated: false, force: true) - } else { - self.setMarkdown(self.rawMarkdown, animated: false) - } - } - - private func cancelSmartMarkdownStreamingSession() { - self.smartStreamBuffer = nil - self.smartStreamingSessionActive = false - self.lastSmartStreamRenderedDisplayMarkdown = nil - self.lastSmartStreamRenderedCanonicalMarkdown = nil - self.lastSmartStreamRenderDocument = nil - self.lastSmartStreamingRenderMode = nil - } - - internal override func applyConfigurationCommon( - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers, - engine: STMarkdownEngine - ) { - var finalEngine = engine - if style.streamSpeculativeRewriteEnabled { - let isStreamingParser = engine.pipeline.parser is STMarkdownStructureParser && (engine.pipeline.parser as! STMarkdownStructureParser).hasActiveSpeculativeRewriters - if !isStreamingParser { - let streamingParser = STMarkdownStructureParser.streamingParser() - finalEngine = STMarkdownEngine( - configuration: engine.pipeline.configuration, - parser: streamingParser, - renderAdapter: engine.pipeline.renderAdapter - ) - } - } - super.applyConfigurationCommon(style: style, advancedRenderers: advancedRenderers, engine: finalEngine) - self.syncTokenFadeDurationFromStyle() - } - - private func syncTokenFadeDurationFromStyle() { - let isLineFade = self.markdownStyle.streamFadeInEnabled && self.markdownStyle.streamLineFadeEnabled - self.shimmerTextView.lineFadeMode = isLineFade - self.shimmerTextView.tokenFadeDuration = (self.markdownStyle.streamFadeInEnabled && !isLineFade) - ? _requestedTokenFadeDuration - : 0 - } - - private func applySmartStreamingPresentation(animated: Bool, force: Bool = false) { - guard let buffer = self.smartStreamBuffer else { return } - let accumulated = buffer.fullAccumulatedText - let committed = buffer.committedSafePrefix - let md = Self.stripUnclosedTailMarkers(in: committed) - if force == false, md == self.lastSmartStreamRenderedDisplayMarkdown { - self.rawMarkdown = accumulated - return - } - self.isApplyingSmartStreamMarkdownUpdate = true - defer { self.isApplyingSmartStreamMarkdownUpdate = false } - let rendered = self.renderSmartStreamingDisplayMarkdown(md, forceFull: force) - self.applySetMarkdownAnimatedDiff(markdown: md, displayRendered: rendered, animated: animated) - self.lastSmartStreamRenderedDisplayMarkdown = md - self.rawMarkdown = accumulated - } - - private func renderSmartStreamingDisplayMarkdown(_ markdown: String, forceFull: Bool) -> NSAttributedString { - let canonicalMarkdown = self.canonicalMarkdownForIncremental(from: markdown) - - if forceFull == false, - let previousCanonical = self.lastSmartStreamRenderedCanonicalMarkdown, - let previousDocument = self.lastSmartStreamRenderDocument, - previousCanonical.isEmpty == false, - canonicalMarkdown.count >= previousCanonical.count, - canonicalMarkdown.hasPrefix(previousCanonical) { - let incremental = self.engine.processIncremental( - STMarkdownIncrementalParameters( - canonicalMarkdown: canonicalMarkdown, - lastCommittedExclusiveEnd: previousCanonical.count, - currentSafeExclusiveEnd: canonicalMarkdown.count, - contextWindowSize: 200, - previousTotalRenderBlockCount: previousDocument.blocks.count - ) - ) - let mergedDocument = self.normalizedMergedIncrementalRenderDocument( - incremental.mergedRenderDocument(previous: previousDocument) - ) - self.updateTableOfContents(from: mergedDocument) - self.lastSmartStreamRenderedCanonicalMarkdown = canonicalMarkdown - self.lastSmartStreamRenderDocument = mergedDocument - self.lastSmartStreamingRenderMode = .incremental - return self.render(document: mergedDocument) - } - - let (rendered, renderDocument) = self.renderWithDocument(markdown) - self.lastSmartStreamRenderedCanonicalMarkdown = canonicalMarkdown - self.lastSmartStreamRenderDocument = renderDocument - self.lastSmartStreamingRenderMode = .full - return rendered - } - - private func canonicalMarkdownForIncremental(from markdown: String) -> String { - let configuration = self.engine.pipeline.configuration - guard configuration.enableInputSanitizer else { - return markdown - } - let sanitizer = STMarkdownInputSanitizer(rules: configuration.sanitizerRules) - return sanitizer.sanitize(markdown, debug: configuration.debug).sanitizedText - } - - private func render(document: STMarkdownRenderDocument) -> NSAttributedString { - if let customRenderer = self.customDocumentRenderer { - return customRenderer(document) - } - return self.renderer.render(document: document) - } - - private func normalizedMergedIncrementalRenderDocument( - _ document: STMarkdownRenderDocument - ) -> STMarkdownRenderDocument { - var slugger = STMarkdownAnchorSlugRegistry() - let blocks = document.blocks.enumerated().map { - self.normalizedMergedRenderBlock( - $0.element, - path: ["b:\($0.offset)"], - slugger: &slugger - ) - } - return STMarkdownRenderDocument(blocks: blocks) - } - - private func normalizedMergedRenderBlock( - _ block: STMarkdownRenderBlock, - path: [String], - slugger: inout STMarkdownAnchorSlugRegistry - ) -> STMarkdownRenderBlock { - switch block { - case .paragraph(let metadata, let inlines): - return .paragraph( - self.rebasedMetadata(metadata, kind: .paragraph, path: path), - inlines - ) - case .heading(let metadata, level: let level, anchorId: _, content: let content): - let anchorId = slugger.uniqueAnchorId(forPlainTitle: content.st_plainTextForTOC()) - return .heading( - self.rebasedMetadata(metadata, kind: .heading, path: path), - level: level, - anchorId: anchorId, - content: content - ) - case .quote(let metadata, let blocks): - return .quote( - self.rebasedMetadata(metadata, kind: .quote, path: path), - blocks.enumerated().map { - self.normalizedMergedRenderBlock( - $0.element, - path: path + ["q:\($0.offset)"], - slugger: &slugger - ) - } - ) - case .list(let metadata, let items): - return .list( - self.rebasedMetadata(metadata, kind: .list, path: path), - items.enumerated().map { index, item in - let itemPath = path + ["li:\(index)"] - return STMarkdownRenderListItem( - blocks: item.blocks.enumerated().map { - self.normalizedMergedRenderBlock( - $0.element, - path: itemPath + ["b:\($0.offset)"], - slugger: &slugger - ) - }, - ordered: item.ordered, - level: item.level, - orderedIndex: item.orderedIndex, - checkbox: item.checkbox - ) - } - ) - case .codeBlock(let metadata, language: let language, code: let code): - return .codeBlock( - self.rebasedMetadata(metadata, kind: .codeBlock, path: path), - language: language, - code: code - ) - case .table(let metadata, let table): - return .table(self.rebasedMetadata(metadata, kind: .table, path: path), table) - case .mathBlock(let metadata, let latex): - return .mathBlock(self.rebasedMetadata(metadata, kind: .mathBlock, path: path), latex) - case .image(let metadata, url: let url, altText: let altText, title: let title): - return .image( - self.rebasedMetadata(metadata, kind: .image, path: path), - url: url, - altText: altText, - title: title - ) - case .thematicBreak(let metadata): - return .thematicBreak(self.rebasedMetadata(metadata, kind: .thematicBreak, path: path)) - case .details(let metadata, summary: let summary, body: let body): - return .details( - self.rebasedMetadata(metadata, kind: .details, path: path), - summary: summary, - body: body.enumerated().map { - self.normalizedMergedRenderBlock( - $0.element, - path: path + ["d:\($0.offset)"], - slugger: &slugger - ) - } - ) - case .rawHTML(let metadata, let html): - return .rawHTML(self.rebasedMetadata(metadata, kind: .rawHTML, path: path), html) - } - } - - private func rebasedMetadata( - _ metadata: STMarkdownRenderBlockMetadata, - kind: STMarkdownRenderBlockKind, - path: [String] - ) -> STMarkdownRenderBlockMetadata { - STMarkdownRenderBlockMetadata( - id: path.joined(separator: "/"), - path: path, - kind: kind, - revealPolicy: metadata.revealPolicy - ) - } - - private func renderWithDocument(_ markdown: String) -> (NSAttributedString, STMarkdownRenderDocument) { - let result = self.engine.process(markdown) - self.updateTableOfContents(from: result) - return (self.render(document: result.renderDocument), result.renderDocument) - } - - private func applyFullReplace(markdown: String, rendered: NSAttributedString) { - self.invalidatePendingStreamingAnimation() - self.rawMarkdown = markdown - self.shimmerTextView.setRenderedAttributedText(rendered) - self.finalizeRenderUpdate(rendered: rendered) - } - - private func applyAppendDelta(markdown: String, delta: NSAttributedString) { - self.rawMarkdown = markdown - self.invalidatePendingStreamingAnimation() - let plan = self.streamingAnimationPlan(for: delta) - if plan.immediatePrefix.length > 0 { - self.shimmerTextView.appendAttributedText(plan.immediatePrefix, animated: false) - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - } - if let animatedSuffix = plan.animatedSuffix, animatedSuffix.length > 0 { - self.enqueueAnimatedStreamingSuffix( - animatedSuffix, - trailingSuffix: plan.trailingSuffix, - shouldDelay: plan.requiresContainerGap - ) - return - } - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - } - - private func applyTrailingReplace( - markdown: String, - from location: Int, - trailing: NSAttributedString, - animate: Bool - ) { - self.rawMarkdown = markdown - self.invalidatePendingStreamingAnimation() - if animate { - let plan = self.streamingAnimationPlan(for: trailing) - if let animatedSuffix = plan.animatedSuffix, animatedSuffix.length > 0 { - self.shimmerTextView.replaceTrailingAttributedText( - from: location, - with: plan.immediatePrefix, - animateNewPortion: false - ) - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - self.enqueueAnimatedStreamingSuffix( - animatedSuffix, - trailingSuffix: plan.trailingSuffix, - shouldDelay: plan.requiresContainerGap - ) - return - } else { - self.shimmerTextView.replaceTrailingAttributedText( - from: location, - with: trailing, - animateNewPortion: false - ) - } - } else { - self.shimmerTextView.replaceTrailingAttributedText( - from: location, - with: trailing, - animateNewPortion: false - ) - } - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - } - - /// 按尾部 reveal policy 把增量切成"立即显示前缀 + 可动画后缀"。 - /// 规则: - /// 1. 仅当尾部最后一个 render block 的 reveal policy 是 `inlineProgressive` 时,才对该 block 动画; - /// 2. `atomicBlock` / `containerThenContent` 本身立即上屏; - /// 3. 这样 quote/list/details 等容器可先稳定出现,再让最后一个正文 block 继续 token 输出。 - private func streamingAnimationPlan(for attributedText: NSAttributedString) -> ( - immediatePrefix: NSAttributedString, - animatedSuffix: NSAttributedString?, - trailingSuffix: NSAttributedString?, - requiresContainerGap: Bool - ) { - guard attributedText.length > 0 else { - return (NSAttributedString(), nil, nil, false) - } - - guard let suffixRange = self.trailingAnimatedBlockRange(in: attributedText) else { - return (attributedText, nil, nil, false) - } - - let suffixEnd = suffixRange.location + suffixRange.length - let trailingLength = attributedText.length - suffixEnd - let trailingSuffix: NSAttributedString? = trailingLength > 0 - ? attributedText.attributedSubstring(from: NSRange(location: suffixEnd, length: trailingLength)) - : nil - - if suffixRange.location == 0 { - return (NSAttributedString(), attributedText.attributedSubstring(from: suffixRange), trailingSuffix, false) - } - - let immediatePrefix = attributedText.attributedSubstring( - from: NSRange(location: 0, length: suffixRange.location) - ) - let animatedSuffix = attributedText.attributedSubstring(from: suffixRange) - return ( - immediatePrefix, - animatedSuffix, - trailingSuffix, - self.containsContainerRevealPolicy(in: immediatePrefix) - ) - } - - private func trailingAnimatedBlockRange(in attributedText: NSAttributedString) -> NSRange? { - guard attributedText.length > 0 else { return nil } - - var cursor = attributedText.length - 1 - while cursor >= 0 { - var blockRange = NSRange(location: 0, length: 0) - let rawBlockIDValue = attributedText.attribute( - .stMarkdownBlockID, - at: cursor, - effectiveRange: &blockRange - ) - guard let blockID = rawBlockIDValue as? String, - blockID.isEmpty == false else { - return nil - } - - if blockID == "__separator__" { - cursor = blockRange.location - 1 - continue - } - - guard let revealRaw = attributedText.attribute( - .stMarkdownRevealPolicy, - at: cursor, - effectiveRange: nil - ) as? String, - let revealPolicy = STMarkdownRevealPolicy(rawValue: revealRaw) else { - return nil - } - - if revealPolicy == .inlineProgressive { - return blockRange - } - return nil - } - - return nil - } - - private func containsContainerRevealPolicy(in attributedText: NSAttributedString) -> Bool { - guard attributedText.length > 0 else { return false } - let fullRange = NSRange(location: 0, length: attributedText.length) - var found = false - attributedText.enumerateAttribute(.stMarkdownRevealPolicy, in: fullRange, options: []) { value, _, stop in - guard let raw = value as? String, - let policy = STMarkdownRevealPolicy(rawValue: raw), - policy == .containerThenContent else { - return - } - found = true - stop.pointee = true - } - return found - } - - private func enqueueAnimatedStreamingSuffix( - _ suffix: NSAttributedString, - trailingSuffix: NSAttributedString?, - shouldDelay: Bool - ) { - let generation = self.streamingAnimationGeneration - self.pendingAnimatedSuffix = PendingAnimatedSuffix( - generation: generation, - suffix: suffix, - trailingSuffix: trailingSuffix - ) - - if shouldDelay, self.containerRevealGapDuration > 0 { - let workItem = DispatchWorkItem { [weak self] in - self?.applyPendingAnimatedSuffixIfNeeded(generation: generation, animated: true) - } - self.pendingStreamingSuffixWorkItem = workItem - DispatchQueue.main.asyncAfter( - deadline: .now() + self.containerRevealGapDuration, - execute: workItem - ) - } else { - self.applyPendingAnimatedSuffixIfNeeded(generation: generation, animated: true) - } - self.feedStreamingAnimationWatchdogIfNeeded() - } - - private func invalidatePendingStreamingAnimation() { - self.streamingAnimationGeneration += 1 - self.pendingStreamingSuffixWorkItem?.cancel() - self.pendingStreamingSuffixWorkItem = nil - self.pendingAnimatedSuffix = nil - self.invalidateStreamingAnimationWatchdog() - } - - private func installStreamingAnimationObservers() { - self.shimmerTextView.onAnimationStateChange = { [weak self] _ in - self?.feedStreamingAnimationWatchdogIfNeeded() - } - } - - private func applyPendingAnimatedSuffixIfNeeded(generation: Int, animated: Bool) { - guard self.streamingAnimationGeneration == generation, - let pending = self.pendingAnimatedSuffix, - pending.generation == generation else { - return - } - self.pendingStreamingSuffixWorkItem?.cancel() - self.pendingStreamingSuffixWorkItem = nil - self.pendingAnimatedSuffix = nil - self.shimmerTextView.appendAttributedText(pending.suffix, animated: animated) - if let trailingSuffix = pending.trailingSuffix, trailingSuffix.length > 0 { - self.shimmerTextView.appendAttributedText(trailingSuffix, animated: false) - } - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - self.feedStreamingAnimationWatchdogIfNeeded() - } - - private func flushPendingAnimatedSuffixIfNeeded() { - guard let pending = self.pendingAnimatedSuffix else { return } - self.pendingStreamingSuffixWorkItem?.cancel() - self.pendingStreamingSuffixWorkItem = nil - self.pendingAnimatedSuffix = nil - self.shimmerTextView.appendAttributedText(pending.suffix, animated: false) - if let trailingSuffix = pending.trailingSuffix, trailingSuffix.length > 0 { - self.shimmerTextView.appendAttributedText(trailingSuffix, animated: false) - } - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - } - - private func feedStreamingAnimationWatchdogIfNeeded() { - self.streamingWatchdogWorkItem?.cancel() - self.streamingWatchdogWorkItem = nil - - guard self.streamingAnimationWatchdogTimeout > 0, - self.isStreamingAnimationIdle == false else { - return - } - - self.streamingWatchdogGeneration += 1 - let generation = self.streamingWatchdogGeneration - let workItem = DispatchWorkItem { [weak self] in - guard let self, self.streamingWatchdogGeneration == generation else { return } - self.forceFinishStreamingAnimationIfNeeded() - } - self.streamingWatchdogWorkItem = workItem - DispatchQueue.main.asyncAfter( - deadline: .now() + self.streamingAnimationWatchdogTimeout, - execute: workItem - ) - } - - private func invalidateStreamingAnimationWatchdog() { - self.streamingWatchdogGeneration += 1 - self.streamingWatchdogWorkItem?.cancel() - self.streamingWatchdogWorkItem = nil - } - - private func forceFinishStreamingAnimationIfNeeded() { - guard self.isStreamingAnimationIdle == false else { - self.invalidateStreamingAnimationWatchdog() - return - } - self.flushPendingAnimatedSuffixIfNeeded() - self.shimmerTextView.finishAnimations() - self.invalidateStreamingAnimationWatchdog() - self.finalizeRenderUpdate(rendered: self.shimmerTextView.renderedAttributedText) - } - - private func render(_ markdown: String) -> NSAttributedString { - self.renderWithDocument(markdown).0 - } - - /// 流式期间,若源 markdown 尾部存在**尚未闭合**的 delimiter token(例如只打了 - /// 开头的 `**`、`~~`、`$$`、` ``` `、`\(`,或 task list 的前缀 `- [ ]`),直接把 - /// 它们丢给渲染引擎会导致字面字符抖动。历史版本对最终 `NSAttributedString` - /// 做全局字符串删除,会把代码块里展示的 `$$`、`**`,inline code 里的 `` ` ``, - /// 以及正文里字面 `- [ ]` 等**合法内容**一起吞掉。 - /// - /// 这里改为只裁剪源 markdown 的**尾部未闭合片段**,完全不触碰已渲染的正文: - /// 1. 保留所有已完整闭合的代码块、公式块、inline 标记; - /// 2. 若最末尾处于一个 fenced code block 未闭合(奇数个 ```),则删掉末尾那组 ``` - /// 所在行及之后的流式片段; - /// 3. 只对最末一行做未闭合 inline delimiter(`**` / `__` / `~~` / `\(`) - /// 的 opening marker 裁剪,且通过**成对计数**判定,不会误伤已闭合对; - /// 4. task list 前缀 `- [ ]` / `- [x]` 仅当该行只有前缀、尚无实际文字时才暂时隐藏。 - private static func stripUnclosedTailMarkers(in markdown: String) -> String { - guard markdown.isEmpty == false else { return markdown } - - var working = Self.stripUnclosedFencedCodeTail(in: markdown) - working = Self.stripUnclosedDollarMathBlockTail(in: working) - working = Self.stripUnclosedInlineTailMarkers(in: working) - working = Self.stripBareTaskListPrefix(in: working) - working = Self.stripBareHeadingPrefix(in: working) - working = Self.stripBareBlockquotePrefix(in: working) - working = Self.stripBareListPrefix(in: working) - return working - } - - /// 末行仅为 Heading 前缀(如 `##`)且无后续文字时,暂时隐藏, - /// 避免流式过程中 "##" 字面字符闪一下。 - private static func stripBareHeadingPrefix(in markdown: String) -> String { - let ns = markdown as NSString - let newline = ns.range(of: "\n", options: .backwards) - let lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - let lastLine = ns.substring(from: lastLineStart) - let lineRange = NSRange(location: 0, length: (lastLine as NSString).length) - guard Self.bareHeadingPrefixRegex.firstMatch(in: lastLine, options: [], range: lineRange) != nil else { - return markdown - } - return ns.substring(to: lastLineStart) - } - - /// 末行仅为 Blockquote 前缀(如 `>`)且无后续文字时,暂时隐藏, - /// 避免流式过程中 ">" 字面字符闪一下。 - private static func stripBareBlockquotePrefix(in markdown: String) -> String { - let ns = markdown as NSString - let newline = ns.range(of: "\n", options: .backwards) - let lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - let lastLine = ns.substring(from: lastLineStart) - let lineRange = NSRange(location: 0, length: (lastLine as NSString).length) - guard Self.bareBlockquotePrefixRegex.firstMatch(in: lastLine, options: [], range: lineRange) != nil else { - return markdown - } - return ns.substring(to: lastLineStart) - } - - /// 末行仅为列表标记前缀(如 `-` 或 `1.`)且无后续文字时,暂时隐藏, - /// 避免流式过程中 "- " 等字面字符闪一下。 - private static func stripBareListPrefix(in markdown: String) -> String { - let ns = markdown as NSString - let newline = ns.range(of: "\n", options: .backwards) - let lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - let lastLine = ns.substring(from: lastLineStart) - let lineRange = NSRange(location: 0, length: (lastLine as NSString).length) - guard Self.bareListPrefixRegex.firstMatch(in: lastLine, options: [], range: lineRange) != nil else { - return markdown - } - return ns.substring(to: lastLineStart) - } - - /// 若源字符串包含奇数个 ``` fence,则截断到最后一个 fence 之前(保留其前的换行), - /// 这样最后那个 "打开但未闭合" 的代码块在流式期间暂时不显示,等到下一帧闭合后再一起渲染。 - private static func stripUnclosedFencedCodeTail(in markdown: String) -> String { - let ns = markdown as NSString - let fenceMatches = Self.fencedCodeRegex.matches( - in: markdown, - options: [], - range: NSRange(location: 0, length: ns.length) - ) - guard fenceMatches.count % 2 == 1, let last = fenceMatches.last else { - return markdown - } - // 截到最后一个未闭合 fence 所在行的起点;找不到就截到 fence 之前。 - let lastLineStart: Int - let prefixRange = NSRange(location: 0, length: last.range.location) - let prefix = ns.substring(with: prefixRange) as NSString - let newline = prefix.range(of: "\n", options: .backwards) - lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - return ns.substring(to: lastLineStart) - } - - /// 若源字符串包含奇数个 `$$`,说明末尾存在未闭合块公式。 - /// 流式阶段先隐藏从打开 `$$` 所在行起的尾段,避免 `$$` 或公式体以普通文本闪烁。 - private static func stripUnclosedDollarMathBlockTail(in markdown: String) -> String { - let ns = markdown as NSString - let matches = Self.dollarMathFenceRegex.matches( - in: markdown, - options: [], - range: NSRange(location: 0, length: ns.length) - ) - guard matches.count % 2 == 1, let last = matches.last else { - return markdown - } - - let prefix = ns.substring(to: last.range.location) as NSString - let newline = prefix.range(of: "\n", options: .backwards) - let lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - return ns.substring(to: lastLineStart) - } - - /// 只处理最末一行的未闭合 inline delimiter:成对数量为奇数时裁剪最后一个 opening marker。 - /// 这样 "文本里已经成对闭合" 的 `**foo**` 不会被动到,代码块内已完整闭合的 token 也不会被动到。 - private static func stripUnclosedInlineTailMarkers(in markdown: String) -> String { - let ns = markdown as NSString - let newline = ns.range(of: "\n", options: .backwards) - let lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - let lastLine = ns.substring(from: lastLineStart) - guard lastLine.isEmpty == false else { return markdown } - - var trimmed = lastLine - // 按“从长到短 / 从强到弱”的顺序,避免 `**` 被当成两个 `*`。 - for token in Self.inlinePairableTokens { - trimmed = Self.trimUnclosedInlineToken(token, in: trimmed) - } - // `\(` 单独处理:无配对 `\)` 时,先隐藏 opening marker,保留已到达的公式体文本。 - trimmed = Self.trimUnclosedMathOpen(in: trimmed) - - if trimmed == lastLine { - return markdown - } - let prefix = ns.substring(to: lastLineStart) - return prefix + trimmed - } - - /// 若该行 `token` 数量为奇数,说明最后一个 token 是未闭合 opener; - /// 去掉 opener 本身但保留其后的流式正文,避免显示原始 Markdown 定界符。 - private static func trimUnclosedInlineToken(_ token: String, in line: String) -> String { - let count = line.components(separatedBy: token).count - 1 - guard count % 2 == 1 else { return line } - - guard let range = line.range(of: token, options: .backwards) else { - return line - } - var result = line - result.removeSubrange(range) - return result - } - - private static func trimUnclosedMathOpen(in line: String) -> String { - // `\(` 与 `\)` 成对;未闭合时移除最后一个 opening marker, - // 避免流式中间态把 `\(` 直接暴露给用户。 - let opens = line.components(separatedBy: #"\("#).count - 1 - let closes = line.components(separatedBy: #"\)"#).count - 1 - guard opens > closes else { return line } - - guard let range = line.range(of: #"\("#, options: .backwards) else { - return line - } - var result = line - result.removeSubrange(range) - return result - } - - /// 末行仅为 task list 前缀(`- [ ] ` / `- [x] `)且无后续文字时,暂时隐藏, - /// 避免流式过程中 "- [ ]" 字面字符闪一下。已包含任何可见文字则保留, - /// 这样用户/模型想展示字面 `- [ ]` 也不会被吞。 - private static func stripBareTaskListPrefix(in markdown: String) -> String { - let ns = markdown as NSString - let newline = ns.range(of: "\n", options: .backwards) - let lastLineStart = newline.location == NSNotFound ? 0 : newline.location + newline.length - let lastLine = ns.substring(from: lastLineStart) - let lineRange = NSRange(location: 0, length: (lastLine as NSString).length) - guard Self.bareTaskPrefixRegex.firstMatch(in: lastLine, options: [], range: lineRange) != nil else { - return markdown - } - return ns.substring(to: lastLineStart) - } - - private static let fencedCodeRegex: NSRegularExpression = { - // 行首(允许前置空白)出现至少三个反引号的 fence 标记。 - return try! NSRegularExpression(pattern: #"(?m)^[ \t]*`{3,}"#, options: []) - }() - - private static let dollarMathFenceRegex: NSRegularExpression = { - return try! NSRegularExpression(pattern: #"\$\$"#, options: []) - }() - - private static let bareTaskPrefixRegex: NSRegularExpression = { - // 行首为 task list 前缀但没有任何可见正文。 - return try! NSRegularExpression( - pattern: #"^[ \t]*[-*+][ \t]+\[[ xX]\][ \t]*$"#, - options: [] - ) - }() - - private static let inlinePairableTokens: [String] = [ - "```", - "**", - "__", - "~~" - ] - - private func shouldDisableAnimationForTrailingReplacement( - current: NSAttributedString, - rendered: NSAttributedString, - commonLength: Int - ) -> Bool { - let currentSuffix = current.length > commonLength - ? current.attributedSubstring( - from: NSRange(location: commonLength, length: current.length - commonLength) - ).string - : "" - let renderedSuffix = rendered.length > commonLength - ? rendered.attributedSubstring( - from: NSRange(location: commonLength, length: rendered.length - commonLength) - ).string - : "" - - return Self.containsRenderedListMarker(in: currentSuffix) - || Self.containsRenderedListMarker(in: renderedSuffix) - } - - private func replacementStartForListTransition(currentString: String, commonLength: Int) -> Int { - guard commonLength > 0 else { return 0 } - let prefix = (currentString as NSString).substring(to: commonLength) as NSString - let lastNewline = prefix.range(of: "\n", options: .backwards) - guard lastNewline.location != NSNotFound else { return 0 } - return lastNewline.location + lastNewline.length - } - - private static func containsRenderedListMarker(in text: String) -> Bool { - guard text.isEmpty == false else { return false } - let range = NSRange(location: 0, length: text.utf16.count) - return Self.unorderedListMarkerRegex.firstMatch(in: text, options: [], range: range) != nil - || Self.orderedListMarkerRegex.firstMatch(in: text, options: [], range: range) != nil - } - - private static let bareHeadingPrefixRegex = try! NSRegularExpression( - pattern: #"^[ \t]*[#]{1,6}[ \t]*$"#, - options: [] - ) - - private static let bareBlockquotePrefixRegex = try! NSRegularExpression( - pattern: #"^[ \t]*>[ \t]*$"#, - options: [] - ) - - private static let bareListPrefixRegex = try! NSRegularExpression( - pattern: #"^[ \t]*(?:[-*+]|\d+\.)[ \t]*$"#, - options: [] - ) - - private static let orderedListMarkerRegex = try! NSRegularExpression( - pattern: #"(?m)^\t*\d+\.\t"#, - options: [] - ) - - private static let unorderedListMarkerRegex = try! NSRegularExpression( - pattern: #"(?m)(?:^|\n)\t*[●○▪]\t"#, - options: [] - ) - - /// 启发式判断文本是否**不太可能**含有常见 Markdown 块级/行内标记。 - /// - /// 适用于宿主自行缓冲 LLM 输出时决定是否采用更细粒度(例如按单行 `\n`)的提交策略; - /// 与 ``setMarkdown(_:animated:)`` 内置的尾部定界符裁剪正交,可独立使用。 - public static func isLikelyMarkdownFreePlainText(_ text: String) -> Bool { - let blockMarkers = [ - "#", "> ", "```", "---", "***", - "- ", "* ", "+ ", "| ", - "1. ", "2. ", "3. ", - "![", "](", - ] - for marker in blockMarkers where text.contains(marker) { - return false - } - if text.contains("**") || text.contains("__") || text.contains("`") || text.contains("$$") { - return false - } - return true - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownSwiftUIView.swift b/Sources/STMarkdown/UI/STMarkdownSwiftUIView.swift deleted file mode 100644 index df9efdc..0000000 --- a/Sources/STMarkdown/UI/STMarkdownSwiftUIView.swift +++ /dev/null @@ -1,255 +0,0 @@ -// -// STMarkdownSwiftUIView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import SwiftUI - -/// SwiftUI 包装:静态 Markdown 渲染视图 -public struct STMarkdownSwiftUIView: UIViewRepresentable { - public let markdown: String - public var style: STMarkdownStyle - public var advancedRenderers: STMarkdownAdvancedRenderers - public var engine: STMarkdownEngine - public var isTextSelectionEnabled: Bool - public var onLinkTap: ((URL) -> Void)? - public var onFootnoteTap: ((String) -> Void)? - public var onSelectionChange: ((String) -> Void)? - public var onCitationTap: ((String) -> Void)? - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? - - public init( - markdown: String, - style: STMarkdownStyle = .default, - advancedRenderers: STMarkdownAdvancedRenderers = .empty, - engine: STMarkdownEngine = STMarkdownEngine(), - isTextSelectionEnabled: Bool = true, - onLinkTap: ((URL) -> Void)? = nil, - onFootnoteTap: ((String) -> Void)? = nil, - onSelectionChange: ((String) -> Void)? = nil, - onCitationTap: ((String) -> Void)? = nil, - onExpandTable: ((STMarkdownTableViewModel) -> Void)? = nil - ) { - self.markdown = markdown - self.style = style - self.advancedRenderers = advancedRenderers - self.engine = engine - self.isTextSelectionEnabled = isTextSelectionEnabled - self.onLinkTap = onLinkTap - self.onFootnoteTap = onFootnoteTap - self.onSelectionChange = onSelectionChange - self.onCitationTap = onCitationTap - self.onExpandTable = onExpandTable - } - - public func makeUIView(context: Context) -> STMarkdownTextView { - let view = STMarkdownTextView( - style: self.style, - advancedRenderers: self.advancedRenderers, - engine: self.engine - ) - self.applyCallbacks(to: view) - view.isTextSelectionEnabled = self.isTextSelectionEnabled - view.setMarkdown(self.markdown) - context.coordinator.lastMarkdown = self.markdown - context.coordinator.lastEngine = ObjectIdentifier(self.engine) - return view - } - - public func updateUIView(_ uiView: STMarkdownTextView, context: Context) { - self.applyCallbacks(to: uiView) - if uiView.isTextSelectionEnabled != self.isTextSelectionEnabled { - uiView.isTextSelectionEnabled = self.isTextSelectionEnabled - } - let markdownChanged = context.coordinator.lastMarkdown != self.markdown - let engineChanged = context.coordinator.lastEngine != ObjectIdentifier(self.engine) - // style / advancedRenderers 是无 Equatable 的 struct,无法廉价 diff;只要这两项 - // 在父视图重建时没换实例,就不触发重渲染。典型 SwiftUI 场景下父组件会把它们以 - // 常量传入,短路 markdown 未变化即可消除大部分无效 render。 - guard markdownChanged || engineChanged else { return } - if engineChanged { - uiView.applyConfiguration( - markdown: self.markdown, - style: self.style, - advancedRenderers: self.advancedRenderers, - engine: self.engine - ) - } else { - uiView.setMarkdown(self.markdown) - } - context.coordinator.lastMarkdown = self.markdown - context.coordinator.lastEngine = ObjectIdentifier(self.engine) - } - - public func makeCoordinator() -> Coordinator { - Coordinator() - } - - public final class Coordinator { - var lastMarkdown: String? - var lastEngine: ObjectIdentifier? - } - - private func applyCallbacks(to view: STMarkdownTextView) { - view.onLinkTap = self.onLinkTap - view.onFootnoteTap = self.onFootnoteTap - view.onSelectionChange = self.onSelectionChange - view.onCitationTap = self.onCitationTap - view.onExpandTable = self.onExpandTable - } -} - -/// 外部驱动流式视图命令的令牌。递增 `tick` 即触发对应动作;适配 SwiftUI @State 的值语义。 -public struct STMarkdownStreamingCommand: Equatable { - public enum Action: Equatable { case finish, reset } - public var action: Action - public var tick: Int - - public init(action: Action = .finish, tick: Int = 0) { - self.action = action - self.tick = tick - } -} - -/// SwiftUI 包装:流式 Markdown 渲染视图(支持增量追加动画) -public struct STMarkdownStreamingSwiftUIView: UIViewRepresentable { - public let markdown: String - public var style: STMarkdownStyle - public var advancedRenderers: STMarkdownAdvancedRenderers - public var engine: STMarkdownEngine - public var animated: Bool - public var isTextSelectionEnabled: Bool - public var suppressSystemTextMenu: Bool - public var animateAcrossNewlines: Bool - public var tokenFadeDuration: TimeInterval? - public var command: STMarkdownStreamingCommand? - public var onLinkTap: ((URL) -> Void)? - public var onFootnoteTap: ((String) -> Void)? - public var onSelectionChange: ((String) -> Void)? - public var onCitationTap: ((String) -> Void)? - public var onExpandTable: ((STMarkdownTableViewModel) -> Void)? - /// 与 ``STMarkdownBaseTextView/onTableOfContentsChange`` 一致:目录随渲染刷新(含流式每帧)。 - public var onTableOfContentsChange: (([STMarkdownTOCItem]) -> Void)? - - public init( - markdown: String, - style: STMarkdownStyle = .default, - advancedRenderers: STMarkdownAdvancedRenderers = .empty, - engine: STMarkdownEngine = STMarkdownEngine(), - animated: Bool = true, - isTextSelectionEnabled: Bool = true, - suppressSystemTextMenu: Bool = false, - animateAcrossNewlines: Bool = false, - tokenFadeDuration: TimeInterval? = nil, - command: STMarkdownStreamingCommand? = nil, - onLinkTap: ((URL) -> Void)? = nil, - onFootnoteTap: ((String) -> Void)? = nil, - onSelectionChange: ((String) -> Void)? = nil, - onCitationTap: ((String) -> Void)? = nil, - onExpandTable: ((STMarkdownTableViewModel) -> Void)? = nil, - onTableOfContentsChange: (([STMarkdownTOCItem]) -> Void)? = nil - ) { - self.markdown = markdown - self.style = style - self.advancedRenderers = advancedRenderers - self.engine = engine - self.animated = animated - self.isTextSelectionEnabled = isTextSelectionEnabled - self.suppressSystemTextMenu = suppressSystemTextMenu - self.animateAcrossNewlines = animateAcrossNewlines - self.tokenFadeDuration = tokenFadeDuration - self.command = command - self.onLinkTap = onLinkTap - self.onFootnoteTap = onFootnoteTap - self.onSelectionChange = onSelectionChange - self.onCitationTap = onCitationTap - self.onExpandTable = onExpandTable - self.onTableOfContentsChange = onTableOfContentsChange - } - - public func makeUIView(context: Context) -> STMarkdownStreamingTextView { - let view = STMarkdownStreamingTextView( - style: self.style, - advancedRenderers: self.advancedRenderers, - engine: self.engine - ) - self.applyCallbacks(to: view) - self.applyToggles(to: view) - view.setMarkdown(self.markdown, animated: self.animated) - context.coordinator.lastMarkdown = self.markdown - context.coordinator.lastEngine = ObjectIdentifier(self.engine) - context.coordinator.lastCommand = self.command - return view - } - - public func updateUIView(_ uiView: STMarkdownStreamingTextView, context: Context) { - self.applyCallbacks(to: uiView) - self.applyToggles(to: uiView) - let markdownChanged = context.coordinator.lastMarkdown != self.markdown - let engineChanged = context.coordinator.lastEngine != ObjectIdentifier(self.engine) - if markdownChanged || engineChanged { - if engineChanged { - // 配置变化走静态路径(animated: false),避免把配置切换误识别为增量 token 动画。 - uiView.applyConfiguration( - markdown: self.markdown, - style: self.style, - advancedRenderers: self.advancedRenderers, - engine: self.engine, - animated: false - ) - } else { - uiView.setMarkdown(self.markdown, animated: self.animated) - } - context.coordinator.lastMarkdown = self.markdown - context.coordinator.lastEngine = ObjectIdentifier(self.engine) - } - self.dispatchCommandIfNeeded(uiView: uiView, coordinator: context.coordinator) - } - - public func makeCoordinator() -> Coordinator { - Coordinator() - } - - public final class Coordinator { - var lastMarkdown: String? - var lastEngine: ObjectIdentifier? - var lastCommand: STMarkdownStreamingCommand? - } - - private func applyCallbacks(to view: STMarkdownStreamingTextView) { - view.onLinkTap = self.onLinkTap - view.onFootnoteTap = self.onFootnoteTap - view.onSelectionChange = self.onSelectionChange - view.onCitationTap = self.onCitationTap - view.onExpandTable = self.onExpandTable - view.onTableOfContentsChange = self.onTableOfContentsChange - } - - private func applyToggles(to view: STMarkdownStreamingTextView) { - if view.isTextSelectionEnabled != self.isTextSelectionEnabled { - view.isTextSelectionEnabled = self.isTextSelectionEnabled - } - if view.suppressSystemTextMenu != self.suppressSystemTextMenu { - view.suppressSystemTextMenu = self.suppressSystemTextMenu - } - if view.animateAcrossNewlines != self.animateAcrossNewlines { - view.animateAcrossNewlines = self.animateAcrossNewlines - } - if let duration = self.tokenFadeDuration, view.tokenFadeDuration != duration { - view.tokenFadeDuration = duration - } - } - - private func dispatchCommandIfNeeded(uiView: STMarkdownStreamingTextView, coordinator: Coordinator) { - guard let command = self.command, command != coordinator.lastCommand else { return } - coordinator.lastCommand = command - switch command.action { - case .finish: - uiView.finishStreaming() - case .reset: - uiView.reset() - } - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownTextView.swift b/Sources/STMarkdown/UI/STMarkdownTextView.swift deleted file mode 100644 index 06a86e5..0000000 --- a/Sources/STMarkdown/UI/STMarkdownTextView.swift +++ /dev/null @@ -1,77 +0,0 @@ -// -// STMarkdownTextView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -public final class STMarkdownTextView: STMarkdownBaseTextView { - - public init(frame: CGRect, usesTextLayoutManager: Bool = false) { - super.init( - textView: UITextView(usingTextLayoutManager: usesTextLayoutManager), - frame: frame, - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine(), - accessibilityTraits: .staticText - ) - } - - public convenience init( - style: STMarkdownStyle = .default, - advancedRenderers: STMarkdownAdvancedRenderers = .empty, - engine: STMarkdownEngine = STMarkdownEngine(), - usesTextLayoutManager: Bool = false - ) { - self.init(frame: .zero, usesTextLayoutManager: usesTextLayoutManager) - self.applyConfigurationCommon( - style: style, - advancedRenderers: advancedRenderers, - engine: engine - ) - } - - public required init?(coder: NSCoder) { - super.init( - textView: UITextView(usingTextLayoutManager: false), - coder: coder, - style: .default, - advancedRenderers: .empty, - engine: STMarkdownEngine(), - accessibilityTraits: .staticText - ) - } - - public func setMarkdown(_ markdown: String) { - self.rawMarkdown = markdown - let rendered = self.renderMarkdown(markdown) - self.textView.attributedText = rendered - self.finalizeRenderUpdate(rendered: rendered) - } - - public func applyConfiguration( - markdown: String, - style: STMarkdownStyle, - advancedRenderers: STMarkdownAdvancedRenderers, - engine: STMarkdownEngine - ) { - self.applyConfigurationCommon( - style: style, - advancedRenderers: advancedRenderers, - engine: engine - ) - self.setMarkdown(markdown) - } - - public func reset() { - self.textView.attributedText = NSAttributedString() - self.resetBaseState() - } - - internal override func configurationDidChangeRerender() { - self.setMarkdown(self.rawMarkdown) - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownTextViewLinkHitTest.swift b/Sources/STMarkdown/UI/STMarkdownTextViewLinkHitTest.swift deleted file mode 100644 index 0bd33b3..0000000 --- a/Sources/STMarkdown/UI/STMarkdownTextViewLinkHitTest.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// STMarkdownTextViewLinkHitTest.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/04/26. -// - -import UIKit - -/// TextKit 1 `UITextView` 链接命中测试工具。 -/// -/// 在点击位置精确命中 glyph 后读取 `.link` 属性,返回对应 `URL`。 -/// 与 Markdown / 流式渲染无耦合,可在任何含超链接的 `UITextView` 场景复用。 -public enum STMarkdownTextViewLinkHitTest { - - /// 在 `textView` 坐标系内的给定点命中链接,返回 `URL`;未命中返回 `nil`。 - /// - /// - Parameters: - /// - textView: 目标 `UITextView`(TextKit 1) - /// - point: 相对于 `textView` 坐标系的点 - /// - Returns: 命中的链接 `URL`,或 `nil` - public static func linkURL(in textView: UITextView, at point: CGPoint) -> URL? { - guard let attributedText = textView.attributedText, attributedText.length > 0 else { return nil } - - let textContainerPoint = CGPoint( - x: point.x - textView.textContainerInset.left - textView.textContainer.lineFragmentPadding, - y: point.y - textView.textContainerInset.top - ) - guard textContainerPoint.x >= 0, textContainerPoint.y >= 0 else { return nil } - - let layoutManager = textView.layoutManager - let textContainer = textView.textContainer - let glyphIndex = layoutManager.glyphIndex(for: textContainerPoint, in: textContainer) - guard glyphIndex < layoutManager.numberOfGlyphs else { return nil } - - let glyphRect = layoutManager.boundingRect( - forGlyphRange: NSRange(location: glyphIndex, length: 1), - in: textContainer - ) - // 给予 ±6pt 点击容差,改善小字体链接的可点击性 - guard glyphRect.insetBy(dx: -6, dy: -6).contains(textContainerPoint) else { return nil } - - let characterIndex = layoutManager.characterIndexForGlyph(at: glyphIndex) - guard characterIndex < attributedText.length else { return nil } - - if let url = attributedText.attribute(.link, at: characterIndex, effectiveRange: nil) as? URL { - return url - } - if let urlString = attributedText.attribute(.link, at: characterIndex, effectiveRange: nil) as? String { - return URL(string: urlString) - } - return nil - } -} diff --git a/Sources/STMarkdown/UI/STMarkdownTextViewMeasure.swift b/Sources/STMarkdown/UI/STMarkdownTextViewMeasure.swift deleted file mode 100644 index 01d9e8a..0000000 --- a/Sources/STMarkdown/UI/STMarkdownTextViewMeasure.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// STMarkdownTextViewMeasure.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/04/26. -// - -import UIKit - -/// TextKit 1 `UITextView` 高度测量工具。 -/// -/// 使用 `layoutManager.usedRect(for:)` 计算精确内容高度, -/// 结果对齐到指定网格(`gridSize`),避免亚像素抖动。 -/// -/// 与视图层无耦合,可在任何需要测量 `UITextView` 高度的场景复用。 -public enum STMarkdownTextViewMeasure { - - /// 测量 `UITextView` 在给定宽度下的内容高度。 - /// - /// 内部会强制将 `textView.bounds.width` 与 `containerView.bounds.width` 对齐到 - /// `targetWidth`,触发 TextKit 重新布局后读取 `usedRect`。 - /// - /// - Parameters: - /// - textView: 目标 `UITextView`(TextKit 1,`layoutManager` 非 nil) - /// - width: 期望的测量宽度(> 0) - /// - gridSize: 高度对齐网格步长(≥ 1),默认 2.0pt - /// - containerView: 若 `textView` 嵌套在额外容器内,传入该容器以一并设置宽度 - /// - Returns: 对齐到 `gridSize` 的最小内容高度(≥ 1pt) - public static func measure( - _ textView: UITextView, - width: CGFloat, - gridSize: CGFloat = 2.0, - containerView: UIView? = nil - ) -> CGFloat { - let targetWidth = max(width, 1) - - if let containerView, abs(containerView.bounds.width - targetWidth) > 0.5 { - containerView.bounds.size.width = targetWidth - containerView.setNeedsLayout() - containerView.layoutIfNeeded() - } - if abs(textView.bounds.width - targetWidth) > 0.5 { - textView.bounds.size.width = targetWidth - } - textView.setNeedsLayout() - textView.layoutIfNeeded() - textView.layoutManager.ensureLayout(for: textView.textContainer) - - let usedRect = textView.layoutManager.usedRect(for: textView.textContainer) - let fixedDescender = max(ceil(abs(textView.font?.descender ?? 0)), 2) - let rawHeight = usedRect.height - + textView.textContainerInset.top - + textView.textContainerInset.bottom - + fixedDescender - - let appliedGrid = max(gridSize, 1) - return max(ceil(rawHeight / appliedGrid) * appliedGrid, 1) - } -} diff --git a/Sources/STMarkdown/UI/STScrollableMarkdownView.swift b/Sources/STMarkdown/UI/STScrollableMarkdownView.swift deleted file mode 100644 index 3e1fab2..0000000 --- a/Sources/STMarkdown/UI/STScrollableMarkdownView.swift +++ /dev/null @@ -1,196 +0,0 @@ -// -// STScrollableMarkdownView.swift -// STBaseProject -// -// Created by 寒江孤影 on 2019/03/16. -// - -import UIKit - -// MARK: - 内置目录列表(侧栏) - -private final class STMarkdownTOCListHost: NSObject, UITableViewDataSource, UITableViewDelegate { - - var items: [STMarkdownTOCItem] = [] - weak var markdownTextView: STMarkdownBaseTextView? - - var onTOCItemTap: ((STMarkdownTOCItem) -> Void)? - - let tableView: UITableView - - override init() { - self.tableView = UITableView(frame: .zero, style: .plain) - super.init() - self.tableView.dataSource = self - self.tableView.delegate = self - self.tableView.rowHeight = 40 - self.tableView.separatorInset = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8) - self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "toc") - self.tableView.backgroundColor = .secondarySystemGroupedBackground - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - self.items.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "toc", for: indexPath) - let item = self.items[indexPath.row] - let indent = String(repeating: " ", count: max(0, item.level - 1)) - cell.textLabel?.font = .preferredFont(forTextStyle: .subheadline) - cell.textLabel?.numberOfLines = 2 - cell.textLabel?.text = indent + item.title - cell.accessibilityLabel = "TOC, level \(item.level), \(item.title)" - cell.backgroundColor = .clear - cell.selectionStyle = .default - return cell - } - - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let item = self.items[indexPath.row] - _ = self.markdownTextView?.scrollToTOCItem(anchorId: item.anchorId, animated: true) - self.onTOCItemTap?(item) - } -} - -// MARK: - 滚动容器 - -/// 将 ``STMarkdownTextView`` 嵌入 ``UIScrollView``,并可选展示内置目录侧栏(对比文档 P1)。 -public final class STScrollableMarkdownView: UIView { - - public let scrollView: UIScrollView - public let markdownTextView: STMarkdownTextView - - /// 为 `true` 时在正文左侧展示可点击的标题目录列表。 - public var showsTableOfContents: Bool = false { - didSet { self.applyTOCChromeVisibility() } - } - - /// 侧栏目录宽度(pt);仅在 ``showsTableOfContents`` 为 `true` 时生效。 - public var tableOfContentsPanelWidth: CGFloat = 168 { - didSet { self.applyTOCChromeVisibility() } - } - - /// 用户点击目录行后调用(在滚动到锚点之后);与 Vendor ``onTOCItemTap`` 语义对齐。 - public var onTOCItemTap: ((STMarkdownTOCItem) -> Void)? { - get { self.tocHost.onTOCItemTap } - set { self.tocHost.onTOCItemTap = newValue } - } - - public var onLinkTap: ((URL) -> Void)? { - get { self.markdownTextView.onLinkTap } - set { self.markdownTextView.onLinkTap = newValue } - } - - public var onFootnoteTap: ((String) -> Void)? { - get { self.markdownTextView.onFootnoteTap } - set { self.markdownTextView.onFootnoteTap = newValue } - } - - public var onContentLayoutHeightChange: ((CGFloat) -> Void)? { - get { self.markdownTextView.onContentLayoutHeightChange } - set { self.markdownTextView.onContentLayoutHeightChange = newValue } - } - - /// 目录随正文管线刷新时调用(在更新内置侧栏之后);流式宿主可在此与侧栏同帧对齐。 - public var onTableOfContentsChange: (([STMarkdownTOCItem]) -> Void)? - - private let horizontalStack = UIStackView() - private let tocPanel = UIView() - private let tocSeparator = UIView() - private let tocHost = STMarkdownTOCListHost() - private var tocWidthConstraint: NSLayoutConstraint! - private var tocSeparatorWidthConstraint: NSLayoutConstraint! - - /// - Parameter usesTextLayoutManager: 传入内层 ``STMarkdownTextView`` 的 TextKit 2 开关(iOS 16+)。 - public init(frame: CGRect, usesTextLayoutManager: Bool = false) { - self.scrollView = UIScrollView() - self.markdownTextView = STMarkdownTextView(frame: .zero, usesTextLayoutManager: usesTextLayoutManager) - super.init(frame: frame) - self.installHierarchy() - } - - public required init?(coder: NSCoder) { - self.scrollView = UIScrollView() - self.markdownTextView = STMarkdownTextView(coder: coder) ?? STMarkdownTextView(frame: .zero) - super.init(coder: coder) - self.installHierarchy() - } - - public func setMarkdown(_ markdown: String) { - self.markdownTextView.setMarkdown(markdown) - } - - private func installHierarchy() { - self.tocHost.markdownTextView = self.markdownTextView - - self.horizontalStack.translatesAutoresizingMaskIntoConstraints = false - self.horizontalStack.axis = .horizontal - self.horizontalStack.alignment = .fill - self.horizontalStack.distribution = .fill - self.horizontalStack.spacing = 0 - self.addSubview(self.horizontalStack) - - self.tocPanel.translatesAutoresizingMaskIntoConstraints = false - self.tocSeparator.translatesAutoresizingMaskIntoConstraints = false - self.scrollView.translatesAutoresizingMaskIntoConstraints = false - self.markdownTextView.translatesAutoresizingMaskIntoConstraints = false - - self.tocSeparator.backgroundColor = .separator - - let table = self.tocHost.tableView - table.translatesAutoresizingMaskIntoConstraints = false - self.tocPanel.addSubview(table) - NSLayoutConstraint.activate([ - table.leadingAnchor.constraint(equalTo: self.tocPanel.leadingAnchor), - table.trailingAnchor.constraint(equalTo: self.tocPanel.trailingAnchor), - table.topAnchor.constraint(equalTo: self.tocPanel.topAnchor), - table.bottomAnchor.constraint(equalTo: self.tocPanel.bottomAnchor), - ]) - - self.horizontalStack.addArrangedSubview(self.tocPanel) - self.horizontalStack.addArrangedSubview(self.tocSeparator) - self.horizontalStack.addArrangedSubview(self.scrollView) - - self.scrollView.alwaysBounceVertical = true - self.scrollView.keyboardDismissMode = .interactive - self.scrollView.addSubview(self.markdownTextView) - - self.tocWidthConstraint = self.tocPanel.widthAnchor.constraint(equalToConstant: 0) - self.tocSeparatorWidthConstraint = self.tocSeparator.widthAnchor.constraint(equalToConstant: 0) - - NSLayoutConstraint.activate([ - self.horizontalStack.leadingAnchor.constraint(equalTo: self.leadingAnchor), - self.horizontalStack.trailingAnchor.constraint(equalTo: self.trailingAnchor), - self.horizontalStack.topAnchor.constraint(equalTo: self.topAnchor), - self.horizontalStack.bottomAnchor.constraint(equalTo: self.bottomAnchor), - self.tocWidthConstraint, - self.tocSeparatorWidthConstraint, - self.markdownTextView.leadingAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.leadingAnchor), - self.markdownTextView.trailingAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.trailingAnchor), - self.markdownTextView.topAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.topAnchor), - self.markdownTextView.bottomAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.bottomAnchor), - self.markdownTextView.widthAnchor.constraint(equalTo: self.scrollView.frameLayoutGuide.widthAnchor), - ]) - - self.markdownTextView.onTableOfContentsChange = { [weak self] items in - guard let self else { return } - self.tocHost.items = items - self.tocHost.tableView.reloadData() - self.onTableOfContentsChange?(items) - } - - self.applyTOCChromeVisibility() - } - - private func applyTOCChromeVisibility() { - let show = self.showsTableOfContents - let w = max(0, self.tableOfContentsPanelWidth) - self.tocWidthConstraint.constant = show ? w : 0 - self.tocSeparatorWidthConstraint.constant = show ? (1.0 / max(UIScreen.main.scale, 1)) : 0 - self.tocPanel.isHidden = !show - self.tocSeparator.isHidden = !show - self.tocPanel.isUserInteractionEnabled = show - } -} diff --git a/Sources/STMedia/PrivacyInfo.xcprivacy b/Sources/STMedia/PrivacyInfo.xcprivacy deleted file mode 100644 index 2009fb7..0000000 --- a/Sources/STMedia/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,14 +0,0 @@ - - - - - NSPrivacyTracking - - NSPrivacyTrackingDomains - - NSPrivacyCollectedDataTypes - - NSPrivacyAccessedAPITypes - - - diff --git a/Sources/STMedia/STImage.swift b/Sources/STMedia/STImage.swift index 058edc9..d0cfe76 100644 --- a/Sources/STMedia/STImage.swift +++ b/Sources/STMedia/STImage.swift @@ -6,7 +6,6 @@ // import UIKit -import Photos public enum STImageError: LocalizedError { case invalidData @@ -310,24 +309,6 @@ extension UIImage { return UIImage(cgImage: adjustedCGImage) } - // MARK: - 网络与相册 - - public static func load(from url: URL) async throws -> UIImage { - let (data, _) = try await URLSession.shared.data(from: url) - guard let image = UIImage(data: data) else { throw STImageError.invalidData } - return image - } - - public func saveToPhotoLibrary() async throws { - let status = await PHPhotoLibrary.requestAuthorization(for: .addOnly) - guard status == .authorized || status == .limited else { - throw STImageError.photoLibraryPermissionDenied - } - try await PHPhotoLibrary.shared().performChanges { - PHAssetChangeRequest.creationRequestForAsset(from: self) - } - } - // MARK: - Factory /// 使用纯色生成指定尺寸的图片 diff --git a/Sources/STMedia/STImageManager.swift b/Sources/STMedia/STImageManager.swift deleted file mode 100644 index 5da6013..0000000 --- a/Sources/STMedia/STImageManager.swift +++ /dev/null @@ -1,290 +0,0 @@ -// -// STImageManager.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import UIKit -import Photos -import PhotosUI -import AVFoundation - -public enum STImageSource { - case camera - case photoLibrary - case simulator - case unknown - - public var description: String { - switch self { - case .camera: return "camera" - case .photoLibrary: return "photo_library" - case .simulator: return "simulator" - case .unknown: return "unknown" - } - } -} - -public struct STImageManagerModel { - public let image: UIImage - public let imageData: Data - public let fileName: String - public let mimeType: String - public let source: STImageSource - - public init(image: UIImage, imageData: Data, fileName: String, mimeType: String, source: STImageSource) { - self.image = image - self.imageData = imageData - self.fileName = fileName - self.mimeType = mimeType - self.source = source - } -} - -public struct STImageManagerConfiguration: Sendable { - public var allowsEditing: Bool = true - public var showsCameraControls: Bool = true - public var cameraDevice: UIImagePickerController.CameraDevice = .rear - public var maxFileSize: Int = 300 - public var imageFormat: String = "jpeg" - public var compressionQuality: CGFloat = 0.8 - public var pickerTitle: String = "选择图片来源" - public var cameraButtonTitle: String = "相机" - public var photoLibraryButtonTitle: String = "照片库" - public var cancelButtonTitle: String = "取消" - - public init() {} -} - -public enum STImageManagerError: LocalizedError { - case permissionDenied(STImageSource) - case deviceNotAvailable(STImageSource) - case userCancelled - case compressionFailed - case unknown - - public var errorDescription: String? { - switch self { - case .permissionDenied(let source): - return "Permission denied for \(source.description)" - case .deviceNotAvailable(let source): - return "Device not available: \(source.description)" - case .userCancelled: - return "User cancelled" - case .compressionFailed: - return "Image compression failed" - case .unknown: - return "Unknown error occurred" - } - } -} - -@MainActor -public class STImageManager: NSObject { - - public static let shared = STImageManager() - - private var configuration: STImageManagerConfiguration = STImageManagerConfiguration() - private var pickerContinuation: CheckedContinuation? - private var cameraContinuation: CheckedContinuation? - private var imagePickerController: UIImagePickerController? - - private override init() { - super.init() - } - - deinit { - self.imagePickerController = nil - } - - public func updateConfiguration(_ config: STImageManagerConfiguration) { - self.configuration = config - } - - // MARK: - Public async API - - public func selectImage( - from viewController: UIViewController, - source: STImageSource = .photoLibrary, - configuration: STImageManagerConfiguration? = nil - ) async throws -> STImageManagerModel { - if let config = configuration { self.configuration = config } - switch source { - case .camera: - return try await self.selectFromCamera(from: viewController) - case .photoLibrary: - return try await self.selectFromPhotoLibrary(from: viewController) - case .simulator: - throw STImageManagerError.deviceNotAvailable(.simulator) - case .unknown: - throw STImageManagerError.unknown - } - } - - public func showImagePicker( - from viewController: UIViewController, - configuration: STImageManagerConfiguration? = nil - ) async throws -> STImageManagerModel { - if let config = configuration { self.configuration = config } - let source: STImageSource = try await withCheckedThrowingContinuation { continuation in - let alert = UIAlertController(title: self.configuration.pickerTitle, message: nil, preferredStyle: .actionSheet) - alert.addAction(UIAlertAction(title: self.configuration.cameraButtonTitle, style: .default) { _ in - continuation.resume(returning: .camera) - }) - alert.addAction(UIAlertAction(title: self.configuration.photoLibraryButtonTitle, style: .default) { _ in - continuation.resume(returning: .photoLibrary) - }) - alert.addAction(UIAlertAction(title: self.configuration.cancelButtonTitle, style: .cancel) { _ in - continuation.resume(throwing: STImageManagerError.userCancelled) - }) - viewController.present(alert, animated: true) - } - return try await self.selectImage(from: viewController, source: source) - } - - // MARK: - Private photo library - - private func selectFromPhotoLibrary(from viewController: UIViewController) async throws -> STImageManagerModel { - // 取消之前未完成的请求,避免旧 continuation 永远挂起 - self.resolvePendingPickerContinuation(with: .userCancelled) - return try await withCheckedThrowingContinuation { continuation in - self.pickerContinuation = continuation - var config = PHPickerConfiguration(photoLibrary: .shared()) - config.filter = .images - config.selectionLimit = 1 - let picker = PHPickerViewController(configuration: config) - picker.delegate = self - viewController.present(picker, animated: true) - } - } - - private func selectFromCamera(from viewController: UIViewController) async throws -> STImageManagerModel { - try await self.checkCameraPermission() - self.resolvePendingCameraContinuation(with: .userCancelled) - return try await withCheckedThrowingContinuation { continuation in - self.cameraContinuation = continuation - let picker = UIImagePickerController() - picker.sourceType = .camera - picker.allowsEditing = self.configuration.allowsEditing - picker.cameraDevice = self.configuration.cameraDevice - picker.showsCameraControls = self.configuration.showsCameraControls - picker.delegate = self - self.imagePickerController = picker - viewController.present(picker, animated: true) - } - } - - private func checkCameraPermission() async throws { - guard UIImagePickerController.isSourceTypeAvailable(.camera) else { - throw STImageManagerError.deviceNotAvailable(.camera) - } - let status = AVCaptureDevice.authorizationStatus(for: .video) - switch status { - case .authorized: - return - case .notDetermined: - let granted: Bool = await withCheckedContinuation { continuation in - AVCaptureDevice.requestAccess(for: .video) { continuation.resume(returning: $0) } - } - if !granted { throw STImageManagerError.permissionDenied(.camera) } - case .denied, .restricted: - throw STImageManagerError.permissionDenied(.camera) - @unknown default: - throw STImageManagerError.unknown - } - } - - private func resolvePendingPickerContinuation(with error: STImageManagerError) { - guard let pending = self.pickerContinuation else { return } - self.pickerContinuation = nil - pending.resume(throwing: error) - } - - private func resolvePendingCameraContinuation(with error: STImageManagerError) { - guard let pending = self.cameraContinuation else { return } - self.cameraContinuation = nil - pending.resume(throwing: error) - } - - public nonisolated static func buildModel( - from image: UIImage, - source: STImageSource, - config: STImageManagerConfiguration - ) throws -> STImageManagerModel { - guard let compressedData = UIImage.smartCompress(image, maxFileSize: config.maxFileSize) else { - throw STImageManagerError.compressionFailed - } - let format = image.getTypeString() ?? config.imageFormat - let timestamp = Date().timeIntervalSince1970 - return STImageManagerModel( - image: image, - imageData: compressedData, - fileName: "photo_\(timestamp).\(format)", - mimeType: "image/\(format)", - source: source - ) - } -} - -extension STImageManager: PHPickerViewControllerDelegate { - public func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { - picker.dismiss(animated: true) - guard let result = results.first else { - self.resolvePendingPickerContinuation(with: .userCancelled) - return - } - guard result.itemProvider.canLoadObject(ofClass: UIImage.self) else { - self.resolvePendingPickerContinuation(with: .unknown) - return - } - let continuation = self.pickerContinuation - self.pickerContinuation = nil - let config = self.configuration - result.itemProvider.loadObject(ofClass: UIImage.self) { object, error in - if let error { - continuation?.resume(throwing: error) - return - } - guard let image = object as? UIImage else { - continuation?.resume(throwing: STImageManagerError.unknown) - return - } - Task.detached(priority: .userInitiated) { - do { - let model = try STImageManager.buildModel(from: image, source: .photoLibrary, config: config) - continuation?.resume(returning: model) - } catch { - continuation?.resume(throwing: error) - } - } - } - } -} - -extension STImageManager: UIImagePickerControllerDelegate, UINavigationControllerDelegate { - public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { - picker.dismiss(animated: true) - let imageKey: UIImagePickerController.InfoKey = self.configuration.allowsEditing ? .editedImage : .originalImage - guard let image = info[imageKey] as? UIImage else { - self.resolvePendingCameraContinuation(with: .unknown) - return - } - let continuation = self.cameraContinuation - self.cameraContinuation = nil - let config = self.configuration - Task.detached(priority: .userInitiated) { - do { - let model = try STImageManager.buildModel(from: image, source: .camera, config: config) - continuation?.resume(returning: model) - } catch { - continuation?.resume(throwing: error) - } - } - } - - public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { - picker.dismiss(animated: true) - self.resolvePendingCameraContinuation(with: .userCancelled) - } -} diff --git a/Sources/STMedia/STScanManager.swift b/Sources/STMedia/STScanManager.swift deleted file mode 100644 index 714cfb8..0000000 --- a/Sources/STMedia/STScanManager.swift +++ /dev/null @@ -1,371 +0,0 @@ -// -// STScanManager.swift -// STBaseProject -// -// Created by 寒江孤影 on 2018/3/14. -// - -import UIKit -import Photos -import AVFoundation - -public enum STScanType { - case qrCode - case barCode - case all -} - -public typealias STScanFinishBlock = (_ result: String) -> Void - -public enum STScanError: LocalizedError { - case invalidContent - case invalidSize - case recognitionFailed - case noQRCodeFound - case cameraNotAvailable - case cameraPermissionDenied - - public var errorDescription: String? { - switch self { - case .invalidContent: return "Content is empty" - case .invalidSize: return "Size is zero" - case .recognitionFailed: return "Failed to process image" - case .noQRCodeFound: return "No QR code found in image" - case .cameraNotAvailable: return "Camera is not available" - case .cameraPermissionDenied: return "Camera permission denied" - } - } -} - -public class STScanManager: NSObject { - - public var scanRect: CGRect? - public var scanRectView: STScanView? - - private weak var presentVC: UIViewController? - private var scanFinishBlock: STScanFinishBlock? - private var scanType: STScanType = .qrCode - - private var device: AVCaptureDevice? - private var session: AVCaptureSession? - private var input: AVCaptureDeviceInput? - private var output: AVCaptureMetadataOutput? - private var preview: AVCaptureVideoPreviewLayer? - - // AVCaptureSession 的所有配置、startRunning、stopRunning 必须在此队列执行 - private let sessionQueue = DispatchQueue(label: "com.st.scan.session", qos: .userInitiated) - - public init(presentViewController: UIViewController) { - super.init() - self.presentVC = presentViewController - } - - public init(qrType type: STScanType, presentViewController: UIViewController, onFinish: @escaping STScanFinishBlock) { - super.init() - self.presentVC = presentViewController - self.scanType = type - self.scanFinishBlock = onFinish - self.configScanManager() - } - - deinit { - self.sessionQueue.async { [session = self.session] in - session?.stopRunning() - } - self.session = nil - } - - // MARK: - Public instance API - - public func st_scanFinishCallback(block: @escaping STScanFinishBlock) { - self.scanFinishBlock = block - } - - public func st_beginScan() { - self.sessionQueue.async { [weak self] in - self?.session?.startRunning() - } - } - - public func st_stopScan() { - self.sessionQueue.async { [weak self] in - guard let session = self?.session, session.isRunning else { return } - session.stopRunning() - } - } - - public func detailSelectPhoto(image: UIImage) { - Task { @MainActor [weak self] in - guard let self else { return } - do { - let result = try await STScanManager.recognizeQRCode(in: image) - self.st_renderUrlStr(url: result) - } catch { - self.st_renderUrlStr(url: "") - } - } - } - - // MARK: - Static async API(CPU 密集操作下沉到后台线程) - - public static func recognizeQRCode(in image: UIImage) async throws -> String { - return try await Task.detached(priority: .userInitiated) { - guard let ciImage = CIImage(image: image) else { throw STScanError.recognitionFailed } - let context = CIContext() - let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]) - let features = detector?.features(in: ciImage) ?? [] - guard let feature = features.first as? CIQRCodeFeature, - let result = feature.messageString else { - throw STScanError.noQRCodeFound - } - return result - }.value - } - - public static func generateQRCode( - content: String, - size: CGSize, - color: UIColor = .black, - background: UIColor = .white - ) async throws -> UIImage { - guard !content.isEmpty else { throw STScanError.invalidContent } - guard size != .zero else { throw STScanError.invalidSize } - return try await Task.detached(priority: .userInitiated) { - try _generateQRImage(content: content, size: size, color: color, background: background) - }.value - } - - public static func generateQRCode( - content: String, - size: CGSize, - watermark: UIImage, - watermarkSize: CGSize - ) async throws -> UIImage { - guard !content.isEmpty else { throw STScanError.invalidContent } - guard size != .zero, watermarkSize != .zero else { throw STScanError.invalidSize } - return try await Task.detached(priority: .userInitiated) { - try _generateQRImageWithWatermark(content: content, size: size, watermark: watermark, watermarkSize: watermarkSize) - }.value - } - - public static func generateBarCode( - content: String, - size: CGSize, - color: UIColor = .black, - background: UIColor = .white - ) async throws -> UIImage { - guard !content.isEmpty else { throw STScanError.invalidContent } - guard size != .zero else { throw STScanError.invalidSize } - return try await Task.detached(priority: .userInitiated) { - try _generateBarCodeImage(content: content, size: size, color: color, background: background) - }.value - } - - // MARK: - Private image helpers - - private static func _generateQRImage( - content: String, - size: CGSize, - color: UIColor, - background: UIColor - ) throws -> UIImage { - guard let data = content.data(using: .utf8) else { throw STScanError.invalidContent } - guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { throw STScanError.recognitionFailed } - qrFilter.setValue(data, forKey: "inputMessage") - qrFilter.setValue("H", forKey: "inputCorrectionLevel") - guard let colorFilter = CIFilter(name: "CIFalseColor", parameters: [ - "inputImage": qrFilter.outputImage ?? CIImage.empty(), - "inputColor0": CIColor(cgColor: color.cgColor), - "inputColor1": CIColor(cgColor: background.cgColor) - ]) else { throw STScanError.recognitionFailed } - let ciImage = colorFilter.outputImage ?? CIImage.empty() - guard let cgImage = CIContext().createCGImage(ciImage, from: ciImage.extent) else { - throw STScanError.recognitionFailed - } - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { ctx in - ctx.cgContext.interpolationQuality = .none - UIImage(cgImage: cgImage).draw(in: CGRect(origin: .zero, size: size)) - } - } - - private static func _generateBarCodeImage( - content: String, - size: CGSize, - color: UIColor, - background: UIColor - ) throws -> UIImage { - guard let data = content.data(using: .utf8) else { throw STScanError.invalidContent } - guard let barFilter = CIFilter(name: "CICode128BarcodeGenerator") else { throw STScanError.recognitionFailed } - barFilter.setValue(data, forKey: "inputMessage") - guard let colorFilter = CIFilter(name: "CIFalseColor", parameters: [ - "inputImage": barFilter.outputImage ?? CIImage.empty(), - "inputColor0": CIColor(cgColor: color.cgColor), - "inputColor1": CIColor(cgColor: background.cgColor) - ]) else { throw STScanError.recognitionFailed } - let ciImage = colorFilter.outputImage ?? CIImage.empty() - guard let cgImage = CIContext().createCGImage(ciImage, from: ciImage.extent) else { - throw STScanError.recognitionFailed - } - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { ctx in - ctx.cgContext.interpolationQuality = .none - UIImage(cgImage: cgImage).draw(in: CGRect(origin: .zero, size: size)) - } - } - - private static func _generateQRImageWithWatermark( - content: String, - size: CGSize, - watermark: UIImage, - watermarkSize: CGSize - ) throws -> UIImage { - guard let data = content.data(using: .utf8) else { throw STScanError.invalidContent } - guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { throw STScanError.recognitionFailed } - qrFilter.setValue(data, forKey: "inputMessage") - qrFilter.setValue("H", forKey: "inputCorrectionLevel") - let ciImage = qrFilter.outputImage ?? CIImage.empty() - let extent = ciImage.extent.integral - let scale = min(size.width / extent.width, size.height / extent.height) - let scaledWidth = extent.width * scale - let scaledHeight = extent.height * scale - let cs = CGColorSpaceCreateDeviceGray() - guard let bitmapCtx = CGContext( - data: nil, - width: Int(scaledWidth), height: Int(scaledHeight), - bitsPerComponent: 8, bytesPerRow: 0, - space: cs, - bitmapInfo: CGImageAlphaInfo.none.rawValue - ) else { throw STScanError.recognitionFailed } - guard let baseCGImage = CIContext().createCGImage(ciImage, from: extent) else { - throw STScanError.recognitionFailed - } - bitmapCtx.interpolationQuality = .none - bitmapCtx.scaleBy(x: scale, y: scale) - bitmapCtx.draw(baseCGImage, in: extent) - guard let scaledCGImage = bitmapCtx.makeImage() else { throw STScanError.recognitionFailed } - let baseImage = UIImage(cgImage: scaledCGImage) - let renderer = UIGraphicsImageRenderer(size: size) - return renderer.image { _ in - baseImage.draw(in: CGRect(origin: .zero, size: size)) - let origin = CGPoint( - x: (size.width - watermarkSize.width) / 2.0, - y: (size.height - watermarkSize.height) / 2.0 - ) - watermark.draw(in: CGRect(origin: origin, size: watermarkSize)) - } - } - - // MARK: - Private setup - - private func configScanManager() { - self.st_scanDevice() - self.st_drawScanView() - } - - private func st_scanDevice() { - self.checkCameraPermission { [weak self] granted in - guard let self, granted else { return } - // AVCaptureSession 配置移至 sessionQueue,避免主线程阻塞 - self.sessionQueue.async { [weak self] in - guard let self else { return } - guard let device = AVCaptureDevice.default(for: .video) else { return } - self.device = device - let input: AVCaptureDeviceInput - do { - input = try AVCaptureDeviceInput(device: device) - } catch { - print("[STScanManager] AVCaptureDeviceInput 创建失败: \(error.localizedDescription)") - return - } - self.input = input - let output = AVCaptureMetadataOutput() - self.output = output - output.setMetadataObjectsDelegate(self, queue: .main) - let session = AVCaptureSession() - self.session = session - if session.canAddInput(input) { session.addInput(input) } - if session.canAddOutput(output) { - session.addOutput(output) - output.metadataObjectTypes = self.metadataObjectTypes(for: self.scanType) - output.rectOfInterest = self.st_scanRectWithScale(scale: 1).rectOfInterest - } - // 预览层必须在主线程插入 - DispatchQueue.main.async { [weak self] in - guard let self else { return } - let preview = AVCaptureVideoPreviewLayer(session: session) - self.preview = preview - preview.videoGravity = .resizeAspectFill - preview.frame = UIScreen.main.bounds - self.presentVC?.view.layer.insertSublayer(preview, at: 0) - } - } - } - } - - private func metadataObjectTypes(for type: STScanType) -> [AVMetadataObject.ObjectType] { - switch type { - case .qrCode: return [.qr] - case .barCode: return [.code128, .code39, .ean13, .ean8, .upce, .pdf417] - case .all: return [.qr, .code128, .code39, .ean13, .ean8, .upce, .pdf417] - } - } - - private func checkCameraPermission(completion: @escaping (Bool) -> Void) { - guard UIImagePickerController.isSourceTypeAvailable(.camera) else { - completion(false) - return - } - let status = AVCaptureDevice.authorizationStatus(for: .video) - switch status { - case .authorized: - completion(true) - case .notDetermined: - AVCaptureDevice.requestAccess(for: .video) { granted in - DispatchQueue.main.async { completion(granted) } - } - case .denied, .restricted: - completion(false) - @unknown default: - completion(false) - } - } - - private func st_drawScanView() { - let width = self.presentVC?.view.bounds.size.width ?? UIScreen.main.bounds.width - let height = self.presentVC?.view.bounds.size.height ?? UIScreen.main.bounds.height - let view = STScanView(frame: CGRect(x: 0, y: 0, width: width, height: height)) - view.st_configScanType(scanType: self.scanType) - self.scanRectView = view - self.presentVC?.view.addSubview(view) - } - - private func st_scanRectWithScale(scale: CGFloat) -> (rectOfInterest: CGRect, scanSize: CGSize) { - let windowSize = UIScreen.main.bounds.size - let left = 60.0 / scale - let scanWidth = (self.presentVC?.view.frame.size.width ?? windowSize.width) - left * 2.0 - let scanSize = CGSize(width: scanWidth, height: scanWidth / scale) - let scanX = (windowSize.width - scanSize.width) / 2.0 - let scanY = (windowSize.height - scanSize.height) / 2.0 - // AVFoundation rectOfInterest: normalized coords, axes swapped vs portrait screen - let rectOfInterest = CGRect( - x: scanY / windowSize.height, - y: scanX / windowSize.width, - width: scanSize.height / windowSize.height, - height: scanSize.width / windowSize.width - ) - return (rectOfInterest, scanSize) - } - - private func st_renderUrlStr(url: String) { - self.scanFinishBlock?(url) - } -} - -extension STScanManager: AVCaptureMetadataOutputObjectsDelegate { - public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { - guard let metadataObject = metadataObjects.first as? AVMetadataMachineReadableCodeObject else { return } - self.st_stopScan() - self.st_renderUrlStr(url: metadataObject.stringValue ?? "") - } -} diff --git a/Sources/STMedia/STScanView.swift b/Sources/STMedia/STScanView.swift index 5d5e52f..cf7cabd 100644 --- a/Sources/STMedia/STScanView.swift +++ b/Sources/STMedia/STScanView.swift @@ -7,6 +7,12 @@ import UIKit +public enum STScanType: Sendable { + case qrCode + case barCode + case all +} + /// Safe-area adaptation toggle for `STScanView`. public enum STSafeAreaAdaptation: Sendable, Equatable { case enabled diff --git a/Sources/STMedia/STScreenshot.swift b/Sources/STMedia/STScreenshot.swift index 2d1fddd..5095afb 100644 --- a/Sources/STMedia/STScreenshot.swift +++ b/Sources/STMedia/STScreenshot.swift @@ -84,5 +84,4 @@ public final class STScreenshot: NSObject { imageView.layer.shadowOffset = CGSize(width: 4, height: 4) return imageView } - } diff --git a/Sources/STUIKit/STButton/STIconBtn.swift b/Sources/STUIKit/STButton/STIconBtn.swift index e471bbf..e7c31ae 100644 --- a/Sources/STUIKit/STButton/STIconBtn.swift +++ b/Sources/STUIKit/STButton/STIconBtn.swift @@ -172,6 +172,26 @@ open class STIconBtn: STBtn { self.setNeedsUpdateConfiguration() } + // MARK: - 惰性无障碍标签 + // 仅当调用方未显式设置 accessibilityLabel 时,才按下述兜底链计算: + // 有 title 用 title;无 title 但有 image 用兜底文案;二者皆无则 nil。 + // 采用惰性读取而非在 image/title 赋值时写入,从根本上消除属性赋值顺序依赖。 + private var st_explicitAccessibilityLabel: String? + /// 仅含图片时的默认无障碍文案;可设置以区分不同按钮语义(如"返回"/"更多"),亦可被子类重写本地化。 + open var st_fallbackAccessibilityLabel: String = "按钮" + + open override var accessibilityLabel: String? { + get { + if let explicit = self.st_explicitAccessibilityLabel { return explicit } + if let title = self.currentTitle, !title.isEmpty { return title } + if self.currentImage != nil { return self.st_fallbackAccessibilityLabel } + return nil + } + set { + self.st_explicitAccessibilityLabel = newValue + } + } + open override func refineButtonConfiguration(_ button: UIButton, configuration config: inout UIButton.Configuration) { super.refineButtonConfiguration(button, configuration: &config) diff --git a/Sources/STUIKit/STTextView/STShimmerTextView.swift b/Sources/STUIKit/STTextView/STShimmerTextView.swift index 81b8757..6f6b573 100644 --- a/Sources/STUIKit/STTextView/STShimmerTextView.swift +++ b/Sources/STUIKit/STTextView/STShimmerTextView.swift @@ -44,10 +44,10 @@ open class STShimmerTextView: UITextView { /// 为 true 时,跨换行也保持连续 token 渐显; /// 为 false 时,新增 delta 中最后一个换行前的内容会立即显示,仅最后一行保留动画。 public var animateAcrossNewlines: Bool = false - /// `true` 时改用 FluidMarkdown 风格的行级 CAGradientLayer 水平扫入遮罩动画, - /// 替代默认的 token 级 foregroundColor 淡入;由 STMarkdownStreamingTextView 根据样式同步。 + /// `true` 时改用行级 CAGradientLayer 水平扫入遮罩动画, + /// 替代默认的 token 级 foregroundColor 淡入。 public var lineFadeMode: Bool = false - /// 行级扫入动画时长(秒),默认 0.15 s,与 FluidMarkdown 对齐。 + /// 行级扫入动画时长(秒),默认 0.15 s。 public var lineFadeDuration: TimeInterval = 0.15 /// 当前 token 输出行尾部的柔和渐隐宽度。 public var lineFadeTrailingWidth: CGFloat = 18