oh-my-codex 0.21.0 → 0.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.toml +1 -1
- package/README.md +4 -2
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.d.ts +2 -0
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.d.ts.map +1 -0
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.js +592 -0
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.js.map +1 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.js +270 -33
- package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +133 -5
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +543 -2
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.d.ts +2 -0
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.d.ts.map +1 -0
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.js +17 -0
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.js.map +1 -0
- package/dist/cli/__tests__/launch-fallback.test.js +15 -3
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +20 -0
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.d.ts +2 -0
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.js +76 -0
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.js.map +1 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.d.ts +2 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.js +1662 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.js.map +1 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.d.ts +2 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.js +522 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan-advisory.test.d.ts +2 -0
- package/dist/cli/__tests__/ralplan-advisory.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralplan-advisory.test.js +301 -0
- package/dist/cli/__tests__/ralplan-advisory.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan.test.js +39 -0
- package/dist/cli/__tests__/ralplan.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +81 -6
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-scoped-runtime.test.js +423 -4
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +60 -3
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +9 -0
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +4 -0
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +71 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +30 -4
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +57 -8
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +113 -7
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1850 -185
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/native-assets.d.ts +2 -1
- package/dist/cli/native-assets.d.ts.map +1 -1
- package/dist/cli/native-assets.js +7 -7
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +89 -4
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +2135 -118
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/ralplan.d.ts +2 -1
- package/dist/cli/ralplan.d.ts.map +1 -1
- package/dist/cli/ralplan.js +149 -9
- package/dist/cli/ralplan.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +7 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.d.ts.map +1 -1
- package/dist/cli/sparkshell.js +9 -10
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/update-worker.js +9 -0
- package/dist/cli/update-worker.js.map +1 -1
- package/dist/cli/update.d.ts +1 -0
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +9 -0
- package/dist/cli/update.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +118 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +74 -4
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +74 -0
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.d.ts +2 -0
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.js +250 -0
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.js.map +1 -0
- package/dist/hooks/__tests__/session.test.js +10 -1
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +8 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +130 -9
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/session.d.ts +5 -0
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +17 -3
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +16 -1
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +134 -7
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/render.test.js +57 -0
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/__tests__/session-attached.test.d.ts +2 -0
- package/dist/hud/__tests__/session-attached.test.d.ts.map +1 -0
- package/dist/hud/__tests__/session-attached.test.js +82 -0
- package/dist/hud/__tests__/session-attached.test.js.map +1 -0
- package/dist/hud/__tests__/state.test.js +94 -2
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux-split-realtmux.test.js +169 -2
- package/dist/hud/__tests__/tmux-split-realtmux.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +104 -22
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/__tests__/types.test.js +9 -0
- package/dist/hud/__tests__/types.test.js.map +1 -1
- package/dist/hud/__tests__/watch-detached.test.d.ts +2 -0
- package/dist/hud/__tests__/watch-detached.test.d.ts.map +1 -0
- package/dist/hud/__tests__/watch-detached.test.js +383 -0
- package/dist/hud/__tests__/watch-detached.test.js.map +1 -0
- package/dist/hud/__tests__/watch-realtmux.test.d.ts +2 -0
- package/dist/hud/__tests__/watch-realtmux.test.d.ts.map +1 -0
- package/dist/hud/__tests__/watch-realtmux.test.js +322 -0
- package/dist/hud/__tests__/watch-realtmux.test.js.map +1 -0
- package/dist/hud/index.d.ts +3 -0
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +98 -20
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +68 -24
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +20 -0
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/session-attached.d.ts +15 -0
- package/dist/hud/session-attached.d.ts.map +1 -0
- package/dist/hud/session-attached.js +47 -0
- package/dist/hud/session-attached.js.map +1 -0
- package/dist/hud/state.d.ts +9 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +140 -3
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.d.ts +4 -0
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +86 -23
- package/dist/hud/tmux.js.map +1 -1
- package/dist/hud/types.d.ts +20 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +3 -0
- package/dist/hud/types.js.map +1 -1
- package/dist/modes/base.d.ts +15 -2
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +105 -16
- package/dist/modes/base.js.map +1 -1
- package/dist/question/autopilot-wait.js +2 -2
- package/dist/question/autopilot-wait.js.map +1 -1
- package/dist/question/deep-interview.js +2 -2
- package/dist/question/deep-interview.js.map +1 -1
- package/dist/ralplan/__tests__/advisory-activation.test.d.ts +2 -0
- package/dist/ralplan/__tests__/advisory-activation.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/advisory-activation.test.js +700 -0
- package/dist/ralplan/__tests__/advisory-activation.test.js.map +1 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.d.ts +2 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.js +88 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.js.map +1 -0
- package/dist/ralplan/__tests__/advisory.test.d.ts +2 -0
- package/dist/ralplan/__tests__/advisory.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/advisory.test.js +1087 -0
- package/dist/ralplan/__tests__/advisory.test.js.map +1 -0
- package/dist/ralplan/__tests__/runtime.test.js +416 -7
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/advisory-activation-verifier.d.ts +19 -0
- package/dist/ralplan/advisory-activation-verifier.d.ts.map +1 -0
- package/dist/ralplan/advisory-activation-verifier.js +77 -0
- package/dist/ralplan/advisory-activation-verifier.js.map +1 -0
- package/dist/ralplan/advisory-activation.d.ts +34 -0
- package/dist/ralplan/advisory-activation.d.ts.map +1 -0
- package/dist/ralplan/advisory-activation.js +205 -0
- package/dist/ralplan/advisory-activation.js.map +1 -0
- package/dist/ralplan/advisory-contract.d.ts +103 -0
- package/dist/ralplan/advisory-contract.d.ts.map +1 -0
- package/dist/ralplan/advisory-contract.js +83 -0
- package/dist/ralplan/advisory-contract.js.map +1 -0
- package/dist/ralplan/advisory-detached-transition.d.ts +11 -0
- package/dist/ralplan/advisory-detached-transition.d.ts.map +1 -0
- package/dist/ralplan/advisory-detached-transition.js +21 -0
- package/dist/ralplan/advisory-detached-transition.js.map +1 -0
- package/dist/ralplan/advisory-evidence.d.ts +91 -0
- package/dist/ralplan/advisory-evidence.d.ts.map +1 -0
- package/dist/ralplan/advisory-evidence.js +393 -0
- package/dist/ralplan/advisory-evidence.js.map +1 -0
- package/dist/ralplan/advisory-lifecycle-validation.d.ts +11 -0
- package/dist/ralplan/advisory-lifecycle-validation.d.ts.map +1 -0
- package/dist/ralplan/advisory-lifecycle-validation.js +72 -0
- package/dist/ralplan/advisory-lifecycle-validation.js.map +1 -0
- package/dist/ralplan/advisory-postconditions.d.ts +3 -0
- package/dist/ralplan/advisory-postconditions.d.ts.map +1 -0
- package/dist/ralplan/advisory-postconditions.js +33 -0
- package/dist/ralplan/advisory-postconditions.js.map +1 -0
- package/dist/ralplan/advisory-recovery-journal.d.ts +56 -0
- package/dist/ralplan/advisory-recovery-journal.d.ts.map +1 -0
- package/dist/ralplan/advisory-recovery-journal.js +136 -0
- package/dist/ralplan/advisory-recovery-journal.js.map +1 -0
- package/dist/ralplan/advisory-storage.d.ts +24 -0
- package/dist/ralplan/advisory-storage.d.ts.map +1 -0
- package/dist/ralplan/advisory-storage.js +106 -0
- package/dist/ralplan/advisory-storage.js.map +1 -0
- package/dist/ralplan/advisory.d.ts +99 -0
- package/dist/ralplan/advisory.d.ts.map +1 -0
- package/dist/ralplan/advisory.js +914 -0
- package/dist/ralplan/advisory.js.map +1 -0
- package/dist/ralplan/documented-leader-preflight.d.ts +8 -0
- package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -1
- package/dist/ralplan/documented-leader-preflight.js +60 -2
- package/dist/ralplan/documented-leader-preflight.js.map +1 -1
- package/dist/ralplan/runtime-advisory-lifecycle.d.ts +74 -0
- package/dist/ralplan/runtime-advisory-lifecycle.d.ts.map +1 -0
- package/dist/ralplan/runtime-advisory-lifecycle.js +352 -0
- package/dist/ralplan/runtime-advisory-lifecycle.js.map +1 -0
- package/dist/ralplan/runtime-contract.d.ts +126 -0
- package/dist/ralplan/runtime-contract.d.ts.map +1 -0
- package/dist/ralplan/runtime-contract.js +2 -0
- package/dist/ralplan/runtime-contract.js.map +1 -0
- package/dist/ralplan/runtime.d.ts +6 -109
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +174 -56
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/scripts/__tests__/postinstall.test.js +26 -0
- package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.d.ts +2 -0
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.js +299 -0
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.js.map +1 -0
- package/dist/scripts/__tests__/smoke-packed-install.test.js +102 -8
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts +20 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +226 -15
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/postinstall.d.ts +7 -0
- package/dist/scripts/postinstall.d.ts.map +1 -1
- package/dist/scripts/postinstall.js +40 -0
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +21 -5
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +157 -57
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/state/__tests__/mode-binding-lease.test.d.ts +2 -0
- package/dist/state/__tests__/mode-binding-lease.test.d.ts.map +1 -0
- package/dist/state/__tests__/mode-binding-lease.test.js +498 -0
- package/dist/state/__tests__/mode-binding-lease.test.js.map +1 -0
- package/dist/state/__tests__/operations.test.js +1 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/pinned-atomic-file.test.d.ts +2 -0
- package/dist/state/__tests__/pinned-atomic-file.test.d.ts.map +1 -0
- package/dist/state/__tests__/pinned-atomic-file.test.js +438 -0
- package/dist/state/__tests__/pinned-atomic-file.test.js.map +1 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.d.ts +2 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.d.ts.map +1 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.js +179 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.js.map +1 -0
- package/dist/state/__tests__/skill-active.test.js +29 -1
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/mode-binding-lease-helper.d.ts +2 -0
- package/dist/state/mode-binding-lease-helper.d.ts.map +1 -0
- package/dist/state/mode-binding-lease-helper.js +623 -0
- package/dist/state/mode-binding-lease-helper.js.map +1 -0
- package/dist/state/mode-binding-lease.d.ts +25 -0
- package/dist/state/mode-binding-lease.d.ts.map +1 -0
- package/dist/state/mode-binding-lease.js +380 -0
- package/dist/state/mode-binding-lease.js.map +1 -0
- package/dist/state/operations.d.ts +29 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +203 -122
- package/dist/state/operations.js.map +1 -1
- package/dist/state/pinned-atomic-file-darwin-client.d.ts +34 -0
- package/dist/state/pinned-atomic-file-darwin-client.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-client.js +174 -0
- package/dist/state/pinned-atomic-file-darwin-client.js.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-helper.d.ts +2 -0
- package/dist/state/pinned-atomic-file-darwin-helper.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-helper.js +275 -0
- package/dist/state/pinned-atomic-file-darwin-helper.js.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.d.ts +2 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.js +272 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.js.map +1 -0
- package/dist/state/pinned-atomic-file.d.ts +29 -0
- package/dist/state/pinned-atomic-file.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file.js +536 -0
- package/dist/state/pinned-atomic-file.js.map +1 -0
- package/dist/state/process-identity.d.ts +30 -0
- package/dist/state/process-identity.d.ts.map +1 -0
- package/dist/state/process-identity.js +99 -0
- package/dist/state/process-identity.js.map +1 -0
- package/dist/state/skill-active.d.ts +18 -1
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +82 -5
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +1 -1
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +109 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +10 -1
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/utils/__tests__/file-durability.test.js +20 -0
- package/dist/utils/__tests__/file-durability.test.js.map +1 -1
- package/dist/utils/file-durability.d.ts +1 -1
- package/dist/utils/file-durability.d.ts.map +1 -1
- package/dist/utils/file-durability.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +12 -4
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/verification/__tests__/ci-trusted-publish.test.d.ts +2 -0
- package/dist/verification/__tests__/ci-trusted-publish.test.d.ts.map +1 -0
- package/dist/verification/__tests__/ci-trusted-publish.test.js +205 -0
- package/dist/verification/__tests__/ci-trusted-publish.test.js.map +1 -0
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js +10 -5
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
- package/dist/verification/__tests__/publish-npm-manual-retired.test.d.ts +2 -0
- package/dist/verification/__tests__/publish-npm-manual-retired.test.d.ts.map +1 -0
- package/dist/verification/__tests__/publish-npm-manual-retired.test.js +22 -0
- package/dist/verification/__tests__/publish-npm-manual-retired.test.js.map +1 -0
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/doctor/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +10 -1
- package/plugins/oh-my-codex/skills/team/SKILL.md +2 -0
- package/skills/doctor/SKILL.md +1 -1
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/ralplan/SKILL.md +10 -1
- package/skills/team/SKILL.md +2 -0
- package/src/scripts/__tests__/postinstall.test.ts +28 -0
- package/src/scripts/__tests__/ralplan-advisory-hook.test.ts +320 -0
- package/src/scripts/__tests__/smoke-packed-install.test.ts +120 -7
- package/src/scripts/codex-native-hook.ts +220 -10
- package/src/scripts/postinstall.ts +46 -0
- package/src/scripts/smoke-packed-install.ts +175 -70
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detached-launch-diagnostics-3578.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/detached-launch-diagnostics-3578.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAoB,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,sCAAsC,EACtC,+CAA+C,EAC/C,iCAAiC,EACjC,yBAAyB,EACzB,uCAAuC,EACvC,+BAA+B,EAC/B,oCAAoC,EACpC,oCAAoC,EACpC,gCAAgC,GAEjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAErG,SAAS,cAAc,CAAC,CAAc;IACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,mBAAmB,EAAE;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,2DAA2D,CAAC,CAAC;IACrG,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,GAA4B,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAExH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;YAC5F,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC;gBAC5C,WAAW,EAAE,aAAa;gBAC1B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,GAAG;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,cAAc,EAAE,sBAAsB;gBACtC,YAAY,EAAE,aAAa;aAC5B,CAAC,EAAE,KAAK,CAAC,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,gCAAgC,CAAC;gBACnD,WAAW,EAAE,aAAa;gBAC1B,qBAAqB,EAAE,IAAI;gBAC3B,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,GAAG;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,cAAc,EAAE,sBAAsB;gBACtC,YAAY,EAAE,aAAa;aAC5B,CAAC,EAAE,wCAAwC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;YAC/F,MAAM,QAAQ,GAAG;gBACf,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,gBAAgB;gBAC3B,WAAW,EAAE,aAAa;gBAC1B,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,KAAK;gBACnB,aAAa,EAAE,GAAG;aACnB,CAAC;YACF,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,CAAU,EAAE,IAAI,EAAE,OAAgB,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC3G,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,CAAU,EAAE,IAAI,EAAE,QAAiB,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC7G,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;YACvF,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAChF,MAAM,SAAS,GAAG,IAAI,yBAAyB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YAChG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACjD,oEAAoE;YACpE,MAAM,SAAS,GAAG,IAAI,yBAAyB,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACjH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iGAAiG,EAAE,GAAG,EAAE;YACzG,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,yBAAyB,CAAC,EAAE,CAAC;gBACpH,MAAM,KAAK,GAAG,IAAI,yBAAyB,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC/F,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClG,CAAC;YACD,6EAA6E;YAC7E,MAAM,KAAK,GAAG,IAAI,yBAAyB,CAAC,eAAe,EAAE,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;YACpH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,WAAW,GAAG,IAAI,yBAAyB,CAAC,YAAY,EAAE,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YACvG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;YACtG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACrE,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,OAAO,GAAG,iCAAiC,CAAC;gBAChD,KAAK,EAAE,kFAAkF;gBACzF,SAAS,EAAE,gCAAgC;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAE,OAA6B,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;YAEpF,MAAM,KAAK,GAAG,iCAAiC,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAC3F,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,iEAAiE;YACjE,qEAAqE;YACrE,MAAM,WAAW,GAAG,iCAAiC,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACjG,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,CAAC,WAAW,CAAC,EAAE,iDAAiD,CAAC,CAAC;YACrG,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;YAClE,2DAA2D;YAC3D,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,IAAI,cAAc,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrG,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;YAClG,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,iCAAiC,CAAC,EAAE,SAAS,EAAE,gCAAgC,EAAE,CAAC,CAAC;gBACnG,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,uCAAuC,CAAC,CAAC;gBACvF,MAAM,QAAQ,GAAa,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/D,OAAO,CAAC,MAAgD,CAAC,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;oBAClF,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC;gBACF,IAAI,CAAC;oBACH,oCAAoC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACrD,CAAC;wBAAS,CAAC;oBACR,OAAO,CAAC,MAAgD,CAAC,KAAK,GAAG,aAAa,CAAC;gBAClF,CAAC;gBACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,2FAA2F,CAAC,CAAC;gBAClH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,qEAAqE,CAAC,CAAC;gBAC5F,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,oDAAoD,CAAC,CAAC;YAC7E,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;YAChF,MAAM,OAAO,GAAG,iCAAiC,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/D,OAAO,CAAC,MAAgD,CAAC,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;gBAClF,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YACF,IAAI,CAAC;gBACH,oCAAoC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACR,OAAO,CAAC,MAAgD,CAAC,KAAK,GAAG,aAAa,CAAC;YAClF,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+CAA+C,CAAC,CAAC;YACtE,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;YAChE,4EAA4E;YAC5E,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,CAAC,MAAgD,CAAC,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE;gBAClF,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YACF,IAAI,CAAC;gBACH,oCAAoC,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,MAAM,CAAC,CAAC;YACjG,CAAC;oBAAS,CAAC;gBACR,OAAO,CAAC,MAAgD,CAAC,KAAK,GAAG,OAAO,CAAC;YAC5E,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACtE,EAAE,CAAC,2EAA2E,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1F,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,uCAAuC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,+CAA+C,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,kDAAkD,CAAC,CAAC;gBACxG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,yDAAyD,CAAC,CAAC;YACvH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1E,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,4BAA4B,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzF,+CAA+C,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC9E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,6CAA6C,CAAC,CAAC;YAC/J,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACjF,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,oCAAoC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,2BAA2B,CAAC,CAAC;gBACpF,+CAA+C,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE;oBACjF,oEAAoE;oBACpE,4DAA4D;oBAC5D,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3F,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,2CAA2C,CAAC,CAAC;YAC7J,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAaH,MAAM,cAAc,GAAG,CAAC,OAA4C,EAAE,WAAmB,EAAE,OAAe,EAAoB,EAAE;YAC9H,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,AAAD,EAAG,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;gBAC3F,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI;gBACrC,4GAA4G;aAC7G,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,UAAU,IAAI,SAAS,IAAI,cAAc,IAAI,QAAQ,CAAC,CAAC;YAC3E,OAAO;gBACL,MAAM,EAAE,MAAO;gBACf,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;gBAC3B,WAAW;gBACX,SAAS,EAAE,SAAU;gBACrB,cAAc,EAAE,cAAe;gBAC/B,WAAW,EAAE,CAAC,WAAW,IAAI,GAAG,CAAE;gBAClC,QAAQ,EAAE,QAAS;gBACnB,OAAO;aACR,CAAC;QACJ,CAAC,CAAC;QAEF,EAAE,CAAC,iFAAiF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAChG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,sBAAsB,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;oBAC5B,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;iBAC/E,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,0EAA0E;gBAC1E,sDAAsD;gBACtD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,KAAK,CACV,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAC/G,KAAK,EACL,yDAAyD,CAC1D,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAU,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC9H,+BAA+B,CAAC,SAAS,CAAC,CAAC;gBAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzD,qEAAqE;gBACrE,0EAA0E;gBAC1E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,oDAAoD,CAAC,CAAC;YACvK,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACxF,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,2BAA2B,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;oBAC5B,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;iBAC/E,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBACxE,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,KAAK,CACV,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAC9E,GAAG,EACH,uEAAuE,CACxE,CAAC;gBACF,MAAM,CAAC,KAAK,CACV,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,EACvF,EAAE,EACF,mDAAmD,CACpD,CAAC;gBACF,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,+BAA+B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,6CAA6C,CAAC,CAAC;gBAC9J,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;gBAC3J,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3H,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mGAAmG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAClH,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,qBAAqB,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,iEAAiE;gBACjE,qEAAqE;gBACrE,qDAAqD;gBACrD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,+BAA+B,CAAC,SAAS,EAAE,IAAI,CAAC,EACtD,iCAAiC,EACjC,yDAAyD,CAC1D,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,sCAAsC,CAAC,CAAC;YACxJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oGAAoG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACnH,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,wBAAwB,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,wEAAwE;gBACxE,uEAAuE;gBACvE,kCAAkC;gBAClC,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC,CAAC;gBACpF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAChD,iCAAiC,EACjC,wDAAwD,CACzD,CAAC;gBACF,gFAAgF;gBAChF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9H,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,wCAAwC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACvG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,yBAAyB,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC;gBACzE,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAChD,iCAAiC,EACjC,6EAA6E,CAC9E,CAAC;gBACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,wCAAwC,CAAC,CAAC;gBAC7F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,KAAK,GAAG,iCAAiC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;YAChE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iGAAiG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAChH,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,oBAAoB,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;gBACjD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAChD,iCAAiC,EACjC,2DAA2D,CAC5D,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,2BAA2B,CAAC,CAAC,CAAC;gBAChG,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAChD,iCAAiC,EACjC,0DAA0D,CAC3D,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,kCAAkC,CAAC,CAAC;YACpJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sGAAsG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACrH,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,0BAA0B,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;oBAC5B,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW;iBAC/E,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,KAAK,CACV,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAC9E,GAAG,EACH,uFAAuF,CACxF,CAAC;gBACF,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,sCAAsC,CAAC,SAAS,EAAE,GAAG,EAAE;oBAC3D,iEAAiE;oBACjE,6DAA6D;oBAC7D,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAC3F,CAAC,CAAC,EACF,iCAAiC,EACjC,sEAAsE,CACvE,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBAC3J,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC;gBACrK,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC;gBAC/I,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,qCAAqC,CAAC,CAAC;YAC9J,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACvG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,6BAA6B,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAClG,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,IAAI,eAQS,CAAC;gBACd,MAAM,QAAQ,GAAG;oBACf,KAAK,EAAE,qBAAqB;oBAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,WAAW;oBACX,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,SAAS,CAAC,MAAM;oBAC9B,aAAa,EAAE,SAAS,CAAC,OAAO;iBACjC,CAAC;gBACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpC,sCAAsC,CACpC,SAAS,EACT,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,EACL,GAAG,EAAE,CAAC,KAAK,EACX,GAAG,EAAE;oBACH,gEAAgE;oBAChE,kEAAkE;oBAClE,iDAAiD;oBACjD,eAAe,GAAG;wBAChB,OAAO,EAAE,CAAC;wBACV,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;wBACjC,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,SAAS,EAAE,SAAS,CAAC,OAAO;qBAC7B,CAAC;gBACJ,CAAC,CACF,CAAC;gBACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAG,KAAK,EAAE,wDAAwD,CAAC,CAAC;gBAC3G,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;gBACxH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBAC5I,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,gCAAgC,CAAC,CAAC;YACzJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3G,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,6BAA6B,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,MAAM,QAAQ,GAAG;oBACf,KAAK,EAAE,oBAAoB;oBAC3B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,WAAW;oBACX,YAAY,EAAE,SAAS,CAAC,MAAM;oBAC9B,aAAa,EAAE,SAAS,CAAC,OAAO;iBACjC,CAAC;gBACF,IAAI,YAQS,CAAC;gBACd,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpC,sCAAsC,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;gBAChF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAG,KAAK,EAAE,0DAA0D,CAAC,CAAC;gBAC7G,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC9G,UAAU,CAAC,GAAG,EAAE;oBACd,YAAY,GAAG;wBACb,OAAO,EAAE,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,WAAW;wBACX,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,SAAS,EAAE,SAAS,CAAC,OAAO;qBAC7B,CAAC;oBACF,+CAA+C,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAChF,CAAC,EAAE,GAAG,CAAC,CAAC;gBACR,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;oBAC/I,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;gBACnI,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,sDAAsD,CAAC,CAAC;gBAC5G,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACpG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,4BAA4B,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAClG,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,IAAI,YAQS,CAAC;gBACd,MAAM,cAAc,GAAG;oBACrB,KAAK,EAAE,mBAAmB;oBAC1B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,WAAW;oBACX,YAAY,EAAE,SAAS,CAAC,MAAM;oBAC9B,aAAa,EAAE,SAAS,CAAC,OAAO;iBACjC,CAAC;gBACF,sCAAsC,CACpC,SAAS,EACT,GAAG,EAAE;oBACH,kEAAkE;oBAClE,iEAAiE;oBACjE,mCAAmC;oBACnC,YAAY,GAAG;wBACb,OAAO,EAAE,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,cAAc,CAAC,KAAK;wBAC3B,SAAS,EAAE,cAAc,CAAC,SAAS;wBACnC,WAAW,EAAE,cAAc,CAAC,WAAW;wBACvC,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,uDAAuD;wBACvD,kCAAkC;wBAClC,SAAS,EAAE,SAAS,CAAC,OAAO,GAAG,CAAC;qBACjC,CAAC;gBACJ,CAAC,EACD,KAAK,EACL,GAAG,EAAE,CAAC,KAAK,EACX,SAAS,EACT,IAAI,EACJ,GAAG,EAAE,CAAC,uCAAuC,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CACrF,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;gBACnG,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;gBACpG,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,4DAA4D,CAAC,CAAC;gBAClH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,0CAA0C,CAAC,CAAC;YACxG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAChG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,uBAAuB,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAClG,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrG,IAAI,eAQS,CAAC;gBACd,MAAM,QAAQ,GAAG;oBACf,KAAK,EAAE,oBAAoB;oBAC3B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,WAAW;oBACX,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,SAAS,CAAC,MAAM;oBAC9B,aAAa,EAAE,SAAS,CAAC,OAAO;iBACjC,CAAC;gBACF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,sCAAsC,CAC1C,SAAS,EACT,GAAG,EAAE;oBACH,4DAA4D;oBAC5D,8DAA8D;oBAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC3E,CAAC,EACD,KAAK,EACL,GAAG,EAAE;oBACH,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;oBACzC,OAAO,KAAK,CAAC;gBACf,CAAC,EACD,GAAG,EAAE;oBACH,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;oBAC3G,eAAe,GAAG;wBAChB,OAAO,EAAE,CAAC;wBACV,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;wBACjC,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,SAAS,EAAE,YAAY;qBACxB,CAAC;gBACJ,CAAC,CACF,EACD,iCAAiC,EACjC,sDAAsD,CACvD,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,6DAA6D,CAAC,CAAC;gBAC9I,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,yCAAyC,CAAC,CAAC;gBAC9F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;YAClG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4GAA4G,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3H,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC/B,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC1C,MAAM,WAAW,GAAG,+BAA+B,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,uBAAuB,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,KAAK,CACV,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAC9E,GAAG,EACH,mEAAmE,CACpE,CAAC;gBACF,MAAM,kBAAkB,GAAG,GAAG,WAAW,UAAU,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAErG,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,sCAAsC,CAAC,SAAS,EAAE,GAAG,EAAE;oBAC3D,0DAA0D;oBAC1D,mEAAmE;oBACnE,iEAAiE;oBACjE,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;oBACjD,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,CAAC;gBAC1F,CAAC,CAAC,EACF,iCAAiC,EACjC,oDAAoD,CACrD,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;gBACvJ,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,qCAAqC,CAAC,CAAC;YAC9J,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -6,7 +6,7 @@ import { join, dirname } from 'node:path';
|
|
|
6
6
|
import { randomUUID } from 'node:crypto';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { describe, it } from 'node:test';
|
|
9
|
-
import { applyDetachedTerminalExitStatus, buildDetachedSessionBootstrapSteps, DETACHED_LEADER_READY_TIMEOUT_MS, cleanupDetachedPreReportSession, cleanupDetachedHudPane, decodeDetachedLeaderPayload, describeDetachedLeaderFailure,
|
|
9
|
+
import { applyDetachedTerminalExitStatus, buildDetachedSessionBootstrapSteps, DETACHED_LEADER_READY_TIMEOUT_MS, cleanupDetachedPreReportSession, cleanupDetachedHudPane, cleanupFinalizedDetachedHud, decodeDetachedLeaderPayload, describeDetachedLeaderFailure, publishDetachedReleaseMarker, parseDetachedLeaderPaneIdByPid, isDetachedReadyReportAuthorized, probeExactDetachedSessionExists, resolveDetachedAttachExitStatus, } from '../index.js';
|
|
10
10
|
import { isRealTmuxAvailable, tmuxSessionExists, withTempTmuxSession } from '../../team/__tests__/tmux-test-fixture.js';
|
|
11
11
|
const TEST_TIMEOUT_MS = 45_000;
|
|
12
12
|
const POLL_INTERVAL_MS = 50;
|
|
@@ -46,6 +46,18 @@ async function readReportWhen(path, predicate) {
|
|
|
46
46
|
function paneExists(fixture, paneId) {
|
|
47
47
|
return fixture.run(['list-panes', '-a', '-F', '#{pane_id}']).split('\n').includes(paneId);
|
|
48
48
|
}
|
|
49
|
+
function createOwnedHud(fixture, ownerId) {
|
|
50
|
+
const operationMarker = randomUUID();
|
|
51
|
+
const [paneId, panePidRaw, sessionName, sessionId, sessionCreated, windowId] = fixture.run([
|
|
52
|
+
'split-window', '-d', '-P', '-F', '#{pane_id}\t#{pane_pid}\t#{session_name}\t#{session_id}\t#{session_created}\t#{window_id}',
|
|
53
|
+
'-t', fixture.sessionName, `env OMX_DETACHED_HUD_OPERATION=${operationMarker} sleep 120`,
|
|
54
|
+
]).trim().split('\t');
|
|
55
|
+
const panePid = Number(panePidRaw);
|
|
56
|
+
assert.ok(paneId && sessionName && sessionId && sessionCreated && windowId);
|
|
57
|
+
assert.equal(Number.isSafeInteger(panePid) && panePid > 0, true);
|
|
58
|
+
fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', ownerId]);
|
|
59
|
+
return { paneId, panePid, sessionName, sessionId, sessionCreated, windowId, operationMarker };
|
|
60
|
+
}
|
|
49
61
|
function assertProcessDead(pid) {
|
|
50
62
|
assert.throws(() => process.kill(pid, 0), (error) => error.code === 'ESRCH');
|
|
51
63
|
}
|
|
@@ -93,20 +105,25 @@ async function startDetachedLeader(fixture, wd, sessionName, sessionId, nonce, f
|
|
|
93
105
|
const operationMarker = randomUUID();
|
|
94
106
|
const splitArgs = [...splitHud.args];
|
|
95
107
|
splitArgs[splitArgs.length - 1] = `env OMX_DETACHED_HUD_OPERATION=${operationMarker} ${splitArgs.at(-1)}`;
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
108
|
+
const splitFormatIndex = splitArgs.indexOf('-F');
|
|
109
|
+
assert.ok(splitFormatIndex >= 0 && splitArgs[splitFormatIndex + 1] === '#{pane_id}');
|
|
110
|
+
splitArgs[splitFormatIndex + 1] = '#{pane_id}\t#{pane_pid}\t#{session_name}\t#{session_id}\t#{session_created}\t#{window_id}\tRECEIPT';
|
|
111
|
+
const splitReceipt = fixture.run(splitArgs).trim().split('\t');
|
|
112
|
+
assert.equal(splitReceipt.length, 7, 'the HUD split must return the seven-field production receipt');
|
|
113
|
+
const [paneId, panePidRaw, hudSessionName, hudSessionId, sessionCreated, windowId, observedReceipt] = splitReceipt;
|
|
114
|
+
assert.match(observedReceipt ?? '', /^RECEIPT$/, 'the HUD split receipt must terminate with the literal receipt marker');
|
|
100
115
|
const panePid = Number(panePidRaw);
|
|
101
|
-
assert.equal(paneId, hudPaneId);
|
|
102
116
|
assert.equal(Number.isSafeInteger(panePid) && panePid > 0, true);
|
|
103
117
|
assert.notEqual(windowId, '');
|
|
118
|
+
// The production split sink tags the created HUD pane with the session owner
|
|
119
|
+
// before any finalize step runs.
|
|
120
|
+
fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', sessionId]);
|
|
104
121
|
const ready = await readReportWhen(releaseMarkerPath, (report) => report.kind === 'ready');
|
|
105
122
|
assert.equal(ready.nonce, nonce);
|
|
106
123
|
assert.equal(ready.sessionId, sessionId);
|
|
107
124
|
assert.equal(ready.sessionName, sessionName);
|
|
108
125
|
assert.equal(Number.isSafeInteger(ready.leaderPid) && ready.leaderPid > 0, true);
|
|
109
|
-
const hud = { paneId, panePid, sessionId: hudSessionId, windowId, operationMarker };
|
|
126
|
+
const hud = { paneId, panePid, sessionName: hudSessionName, sessionId: hudSessionId, sessionCreated, windowId, operationMarker };
|
|
110
127
|
publishDetachedReleaseMarker(releaseMarkerPath, nonce, sessionId, sessionName, ready.leaderPid, hud);
|
|
111
128
|
return { releaseMarkerPath, leaderPaneId, hud };
|
|
112
129
|
}
|
|
@@ -175,7 +192,7 @@ describe('detached leader HUD teardown', () => {
|
|
|
175
192
|
assert.equal(isDetachedReadyReportAuthorized(report, { ...expected, shouldAttach: false }), true);
|
|
176
193
|
assert.equal(isDetachedReadyReportAuthorized({ ...report, paneId: '%8' }, { ...expected, shouldAttach: false }), false);
|
|
177
194
|
});
|
|
178
|
-
it('cleans an exact retained dead pane
|
|
195
|
+
it('cleans an exact retained dead pane with its owner tag and rejects changed identity', async (t) => {
|
|
179
196
|
if (!skipUnlessTmux(t))
|
|
180
197
|
return;
|
|
181
198
|
await withTempTmuxSession(async (fixture) => {
|
|
@@ -189,15 +206,17 @@ describe('detached leader HUD teardown', () => {
|
|
|
189
206
|
if (!sessionName || !sessionId || !sessionCreated || !windowId || !paneId || !Number.isSafeInteger(panePid)) {
|
|
190
207
|
throw new Error('invalid retained-pane topology fixture');
|
|
191
208
|
}
|
|
192
|
-
fixture.
|
|
209
|
+
fixture.run(['set-option', '-t', fixture.sessionName, '@omx_instance_id', 'missing-owner-tag']);
|
|
193
210
|
process.kill(panePid, 'SIGTERM');
|
|
194
211
|
await poll('retained dead pane', () => fixture.run(['display-message', '-p', '-t', paneId, '#{pane_dead}']) === '1' ? true : undefined);
|
|
195
212
|
const authority = {
|
|
196
213
|
paneId, panePid, sessionName, sessionId, sessionCreated, windowId,
|
|
197
214
|
windowIndex: '0', ownerId: 'missing-owner-tag',
|
|
198
215
|
};
|
|
199
|
-
|
|
216
|
+
fixture.run(['set-option', '-t', fixture.sessionName, '@omx_instance_id', 'foreign-owner']);
|
|
217
|
+
assert.throws(() => cleanupDetachedPreReportSession(authority), /topology changed before cleanup/);
|
|
200
218
|
assert.equal(fixture.sessionExists(sessionName), true);
|
|
219
|
+
fixture.run(['set-option', '-t', fixture.sessionName, '@omx_instance_id', authority.ownerId]);
|
|
201
220
|
cleanupDetachedPreReportSession(authority);
|
|
202
221
|
await poll('pre-report session destruction', () => !fixture.sessionExists(sessionName) ? true : undefined);
|
|
203
222
|
});
|
|
@@ -209,18 +228,11 @@ describe('detached leader HUD teardown', () => {
|
|
|
209
228
|
const [leaderPaneId, leaderPidRaw] = fixture.run([
|
|
210
229
|
'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
|
|
211
230
|
]).split('\t');
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
'-t', fixture.sessionName, 'sleep 120',
|
|
215
|
-
]).split('\t');
|
|
216
|
-
if (!leaderPaneId || !paneId || !sessionId || !windowId)
|
|
231
|
+
const hud = createOwnedHud(fixture, 'owner-zero');
|
|
232
|
+
if (!leaderPaneId)
|
|
217
233
|
throw new Error('invalid HUD teardown fixture');
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
assert.equal(discovered?.paneId, paneId);
|
|
221
|
-
assert.equal(discovered?.panePid, Number(panePidRaw));
|
|
222
|
-
cleanupDetachedHudPane({ paneId, panePid: Number(panePidRaw), sessionId, windowId, operationMarker: randomUUID() }, 'owner-zero');
|
|
223
|
-
await poll('proven HUD pane removal', () => !fixture.run(['list-panes', '-a', '-F', '#{pane_id}']).split('\n').includes(paneId) ? true : undefined);
|
|
234
|
+
assert.equal(cleanupDetachedHudPane(hud, 'owner-zero'), true);
|
|
235
|
+
await poll('proven HUD pane removal', () => !fixture.run(['list-panes', '-a', '-F', '#{pane_id}']).split('\n').includes(hud.paneId) ? true : undefined);
|
|
224
236
|
process.kill(Number(leaderPidRaw), 'SIGTERM');
|
|
225
237
|
await poll('last-pane session destruction', () => !fixture.sessionExists() ? true : undefined);
|
|
226
238
|
});
|
|
@@ -228,29 +240,175 @@ describe('detached leader HUD teardown', () => {
|
|
|
228
240
|
const [, leaderPidRaw] = fixture.run([
|
|
229
241
|
'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
|
|
230
242
|
]).split('\t');
|
|
231
|
-
const [paneId, panePidRaw, sessionId, windowId] = fixture.run([
|
|
232
|
-
'split-window', '-d', '-P', '-F', '#{pane_id}\t#{pane_pid}\t#{session_id}\t#{window_id}',
|
|
233
|
-
'-t', fixture.sessionName, 'sleep 120',
|
|
234
|
-
]).split('\t');
|
|
235
243
|
const userPaneId = fixture.run([
|
|
236
244
|
'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
|
|
237
245
|
]);
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', 'owner-user-pane']);
|
|
241
|
-
assert.equal(discoverDetachedHudAuthority(fixture.sessionName, 'owner-user-pane')?.paneId, paneId);
|
|
242
|
-
const staleHudProof = { paneId, panePid: Number(panePidRaw), sessionId, windowId, operationMarker: randomUUID() };
|
|
243
|
-
cleanupDetachedHudPane(staleHudProof, 'owner-user-pane');
|
|
246
|
+
const staleHudProof = createOwnedHud(fixture, 'owner-user-pane');
|
|
247
|
+
assert.equal(cleanupDetachedHudPane(staleHudProof, 'owner-user-pane'), true);
|
|
244
248
|
const replacementPaneId = fixture.run([
|
|
245
249
|
'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
|
|
246
250
|
]);
|
|
247
|
-
|
|
251
|
+
// A stale proof must be an ordinary fail-closed preserve, never a throw.
|
|
252
|
+
assert.equal(cleanupDetachedHudPane(staleHudProof, 'owner-user-pane'), false, 'a stale proof must fail closed as a boolean false');
|
|
248
253
|
assert.equal(fixture.run(['display-message', '-p', '-t', replacementPaneId, '#{pane_id}']), replacementPaneId);
|
|
249
254
|
process.kill(Number(leaderPidRaw), 'SIGTERM');
|
|
250
255
|
await poll('unrelated pane survives leader exit', () => fixture.sessionExists() ? true : undefined);
|
|
251
256
|
assert.equal(fixture.run(['display-message', '-p', '-t', userPaneId, '#{pane_id}']), userPaneId);
|
|
252
257
|
});
|
|
253
258
|
});
|
|
259
|
+
it('treats a stale or missing HUD proof target as an ordinary preserved mismatch without destroying the server', async (t) => {
|
|
260
|
+
if (!skipUnlessTmux(t))
|
|
261
|
+
return;
|
|
262
|
+
// Stale proof after the proven HUD was already removed and the pane id was
|
|
263
|
+
// replaced by a new pane. The stale `-t %N` target must resolve to an
|
|
264
|
+
// ordinary fail-closed preserve result: no throw, no server/session loss,
|
|
265
|
+
// and no harm to the replacement or foreign panes.
|
|
266
|
+
await withTempTmuxSession(async (fixture) => {
|
|
267
|
+
const [, leaderPidRaw] = fixture.run([
|
|
268
|
+
'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
|
|
269
|
+
]).split('\t');
|
|
270
|
+
const userPaneId = fixture.run([
|
|
271
|
+
'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
|
|
272
|
+
]);
|
|
273
|
+
const staleHudProof = createOwnedHud(fixture, 'stale-proof-owner');
|
|
274
|
+
assert.equal(cleanupDetachedHudPane(staleHudProof, 'stale-proof-owner'), true);
|
|
275
|
+
await poll('proven HUD removal', () => !paneExists(fixture, staleHudProof.paneId) ? true : undefined);
|
|
276
|
+
const replacementPaneId = fixture.run([
|
|
277
|
+
'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
|
|
278
|
+
]);
|
|
279
|
+
assert.equal(cleanupDetachedHudPane(staleHudProof, 'stale-proof-owner'), false, 'a stale proof must fail closed as a boolean false');
|
|
280
|
+
assert.doesNotThrow(() => cleanupDetachedHudPane(staleHudProof, 'stale-proof-owner'));
|
|
281
|
+
assert.equal(paneExists(fixture, replacementPaneId), true, 'the replacement pane must survive a stale proof');
|
|
282
|
+
assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive a stale proof');
|
|
283
|
+
assert.equal(fixture.run(['display-message', '-p', '-t', userPaneId, '#{pane_id}']), userPaneId);
|
|
284
|
+
process.kill(Number(leaderPidRaw), 'SIGTERM');
|
|
285
|
+
});
|
|
286
|
+
// Missing proof target: the proof pane id no longer exists anywhere.
|
|
287
|
+
await withTempTmuxSession(async (fixture) => {
|
|
288
|
+
const missingProof = createOwnedHud(fixture, 'missing-proof-owner');
|
|
289
|
+
assert.equal(cleanupDetachedHudPane(missingProof, 'missing-proof-owner'), true);
|
|
290
|
+
await poll('proven HUD removal', () => !paneExists(fixture, missingProof.paneId) ? true : undefined);
|
|
291
|
+
const ghostProof = { ...missingProof, paneId: '%999999' };
|
|
292
|
+
assert.equal(cleanupDetachedHudPane(ghostProof, 'missing-proof-owner'), false, 'a missing proof target must fail closed as a boolean false');
|
|
293
|
+
assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive a missing proof target');
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
it('preserves the tmux server, leader, replacement pane, and foreign session across a stale HUD proof attack', async (t) => {
|
|
297
|
+
if (!skipUnlessTmux(t))
|
|
298
|
+
return;
|
|
299
|
+
const fixtureServer = await withTempTmuxSession(async (fixture) => {
|
|
300
|
+
const [leaderPaneId, leaderPidRaw] = fixture.run([
|
|
301
|
+
'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
|
|
302
|
+
]).split('\t');
|
|
303
|
+
const staleProof = createOwnedHud(fixture, 'attack-owner');
|
|
304
|
+
// Remove the proven HUD and let its pane id be recycled by a replacement pane.
|
|
305
|
+
assert.equal(cleanupDetachedHudPane(staleProof, 'attack-owner'), true);
|
|
306
|
+
await poll('proven HUD removal', () => !paneExists(fixture, staleProof.paneId) ? true : undefined);
|
|
307
|
+
const replacementPaneId = fixture.run([
|
|
308
|
+
'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
|
|
309
|
+
]);
|
|
310
|
+
const foreignSessionName = `${fixture.sessionName}-foreign`;
|
|
311
|
+
fixture.run(['new-session', '-d', '-s', foreignSessionName, '-c', fixture.sessionName, 'sleep 120']);
|
|
312
|
+
// The stale proof must fail closed without killing the server, session, or panes.
|
|
313
|
+
assert.equal(cleanupDetachedHudPane(staleProof, 'attack-owner'), false, 'a stale proof must fail closed as a boolean false');
|
|
314
|
+
assert.equal(fixture.sessionExists(), true, 'leader session must survive');
|
|
315
|
+
assert.equal(tmuxSessionExists(foreignSessionName, fixture.serverName), true, 'foreign session must survive');
|
|
316
|
+
assert.equal(paneExists(fixture, leaderPaneId), true, 'leader pane must survive');
|
|
317
|
+
assert.equal(paneExists(fixture, replacementPaneId), true, 'replacement pane must survive');
|
|
318
|
+
// The server must still be reachable for ordinary commands after the attack.
|
|
319
|
+
assert.ok(fixture.run(['list-sessions', '-F', '#{session_name}']).includes(fixture.sessionName));
|
|
320
|
+
return fixture.serverName;
|
|
321
|
+
});
|
|
322
|
+
// Server liveness must persist past the fixture scope: the cleanup kill-server
|
|
323
|
+
// in withTempTmuxSession proves termination is fixture-owned, not attack-owned.
|
|
324
|
+
assert.ok(typeof fixtureServer === 'string');
|
|
325
|
+
});
|
|
326
|
+
it('preserves the leader, session, and foreign panes across normal child-exit teardown with a recycled HUD proof', async (t) => {
|
|
327
|
+
if (!skipUnlessTmux(t))
|
|
328
|
+
return;
|
|
329
|
+
const wd = mkdtempSync(join(tmpdir(), 'omx-detached-leader-stale-seam-'));
|
|
330
|
+
// This subtest preserves every leader-session pane (remain-on-exit keeps the
|
|
331
|
+
// dead leader visible), so the HUD watcher keeps running until fixture teardown.
|
|
332
|
+
let hudPanePid;
|
|
333
|
+
try {
|
|
334
|
+
await withTempTmuxSession(async (fixture) => {
|
|
335
|
+
const sessionName = 'omx-detached-stale-seam';
|
|
336
|
+
const sessionId = 'detached-stale-seam-session';
|
|
337
|
+
const sentinel = join(wd, 'child-release');
|
|
338
|
+
// The child blocks on a sentinel so the HUD proof can be recycled before
|
|
339
|
+
// the leader reaches normal child-exit teardown.
|
|
340
|
+
const fakeChild = writeChild(wd, 'while [ ! -f child-release ]; do sleep 0.1; done\nexit 0');
|
|
341
|
+
const started = await startDetachedLeader(fixture, wd, sessionName, sessionId, 'stale-seam-nonce', fakeChild);
|
|
342
|
+
hudPanePid = started.hud.panePid;
|
|
343
|
+
// Retain the dead leader pane: with remain-on-exit on, an executed
|
|
344
|
+
// `kill-pane -t leaderPaneId` destroys the pane (and the session when it
|
|
345
|
+
// is the last one), while a preserved zero-mutation teardown leaves it
|
|
346
|
+
// visible as dead. This makes the leader kill observable even after the
|
|
347
|
+
// leader process has exited normally.
|
|
348
|
+
fixture.run(['set-option', '-t', sessionName, 'remain-on-exit', 'on']);
|
|
349
|
+
// Remove the proven HUD out from under the leader's retained proof and
|
|
350
|
+
// recycle its pane id, exactly like the stale-proof attack, then add a
|
|
351
|
+
// replacement pane and a foreign session that must all survive teardown.
|
|
352
|
+
assert.equal(cleanupDetachedHudPane(started.hud, sessionId), true);
|
|
353
|
+
await poll('proven HUD removal', () => !paneExists(fixture, started.hud.paneId) ? true : undefined);
|
|
354
|
+
const replacementPaneId = fixture.run([
|
|
355
|
+
'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', sessionName, '-c', wd, 'sleep 300',
|
|
356
|
+
]);
|
|
357
|
+
const foreignSessionName = `${sessionName}-foreign`;
|
|
358
|
+
fixture.run(['new-session', '-d', '-s', foreignSessionName, '-c', wd, 'sleep 300']);
|
|
359
|
+
// Release the child into its normal exit and let the leader finalize.
|
|
360
|
+
writeFileSync(sentinel, 'released\n');
|
|
361
|
+
const terminal = await readReportWhen(started.releaseMarkerPath, (report) => report.kind === 'terminal');
|
|
362
|
+
assert.equal(terminal.finalized, true);
|
|
363
|
+
assert.equal(terminal.exitStatus, 0);
|
|
364
|
+
await poll('retained dead leader pane', () => fixture.run([
|
|
365
|
+
'display-message', '-p', '-t', started.leaderPaneId, '#{pane_dead}',
|
|
366
|
+
]) === '1' ? true : undefined);
|
|
367
|
+
// Fail-closed teardown: the recycled HUD proof must suppress the leader
|
|
368
|
+
// kill entirely, leaving the leader, session, and every bystander intact.
|
|
369
|
+
assert.equal(paneExists(fixture, started.leaderPaneId), true, 'the dead leader pane must be retained, not killed');
|
|
370
|
+
assert.equal(tmuxSessionExists(sessionName, fixture.serverName), true, 'the leader session must survive zero-mutation teardown');
|
|
371
|
+
assert.equal(paneExists(fixture, replacementPaneId), true, 'the replacement pane must survive zero-mutation teardown');
|
|
372
|
+
assert.equal(tmuxSessionExists(foreignSessionName, fixture.serverName), true, 'the foreign session must survive zero-mutation teardown');
|
|
373
|
+
assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive zero-mutation teardown');
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
finally {
|
|
377
|
+
await cleanupDetachedWorkdir(wd, hudPanePid);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
it('removes only the matching bootstrap HUD after a finalized leader failure', async (t) => {
|
|
381
|
+
if (!skipUnlessTmux(t))
|
|
382
|
+
return;
|
|
383
|
+
await withTempTmuxSession(async (fixture) => {
|
|
384
|
+
const ownerId = 'finalized-failure-owner';
|
|
385
|
+
const expected = createOwnedHud(fixture, ownerId);
|
|
386
|
+
assert.equal(cleanupFinalizedDetachedHud(expected, ownerId), true);
|
|
387
|
+
await poll('bootstrap HUD removal', () => !paneExists(fixture, expected.paneId) ? true : undefined);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
it('preserves a bootstrap HUD when its proof or owner changes before finalized failure cleanup', async (t) => {
|
|
391
|
+
if (!skipUnlessTmux(t))
|
|
392
|
+
return;
|
|
393
|
+
const mutations = [
|
|
394
|
+
['owner', (fixture, proof) => {
|
|
395
|
+
fixture.run(['set-option', '-pq', '-t', proof.paneId, '@omx_hud_owner', 'foreign-owner']);
|
|
396
|
+
return proof;
|
|
397
|
+
}],
|
|
398
|
+
['pane PID', (_fixture, proof) => ({ ...proof, panePid: proof.panePid + 1 })],
|
|
399
|
+
['session creation', (_fixture, proof) => ({ ...proof, sessionCreated: `${Number(proof.sessionCreated) + 1}` })],
|
|
400
|
+
['window topology', (_fixture, proof) => ({ ...proof, windowId: '@999999' })],
|
|
401
|
+
['operation marker', (_fixture, proof) => ({ ...proof, operationMarker: randomUUID() })],
|
|
402
|
+
];
|
|
403
|
+
for (const [name, mutate] of mutations) {
|
|
404
|
+
await withTempTmuxSession(async (fixture) => {
|
|
405
|
+
const ownerId = `finalized-failure-${name}`;
|
|
406
|
+
const expected = createOwnedHud(fixture, ownerId);
|
|
407
|
+
assert.equal(cleanupFinalizedDetachedHud(mutate(fixture, expected), ownerId), false, name);
|
|
408
|
+
assert.equal(paneExists(fixture, expected.paneId), true, name);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
});
|
|
254
412
|
it('tears down the proven HUD pane and session after a zero-status child exit', async (t) => {
|
|
255
413
|
if (!skipUnlessTmux(t))
|
|
256
414
|
return;
|
|
@@ -261,10 +419,15 @@ describe('detached leader HUD teardown', () => {
|
|
|
261
419
|
const sessionId = 'detached-zero-session';
|
|
262
420
|
const fakeChild = writeChild(wd, 'sleep 1\nexit 0');
|
|
263
421
|
const started = await startDetachedLeader(fixture, wd, sessionName, sessionId, 'zero-nonce', fakeChild);
|
|
422
|
+
// Retain the dead leader pane: the teardown must still kill it, proving
|
|
423
|
+
// the leader kill runs when and only when HUD cleanup succeeded.
|
|
424
|
+
fixture.run(['set-option', '-t', sessionName, 'remain-on-exit', 'on']);
|
|
264
425
|
const terminal = await readReportWhen(started.releaseMarkerPath, (report) => report.kind === 'terminal');
|
|
265
426
|
assert.equal(terminal.finalized, true);
|
|
266
427
|
assert.equal(terminal.exitStatus, 0);
|
|
267
428
|
await poll('leader pane removal', () => !paneExists(fixture, started.leaderPaneId) ? true : undefined);
|
|
429
|
+
// Under remain-on-exit retention, only the teardown's own leader
|
|
430
|
+
// kill-pane can destroy this pane: natural exit would retain it dead.
|
|
268
431
|
await poll('HUD pane removal', () => !paneExists(fixture, started.hud.paneId) ? true : undefined);
|
|
269
432
|
await poll('leader session destruction', () => !tmuxSessionExists(sessionName, fixture.serverName) ? true : undefined);
|
|
270
433
|
await poll('HUD process exit', () => !processAlive(started.hud.panePid) ? true : undefined);
|
|
@@ -362,6 +525,80 @@ describe('detached leader HUD teardown', () => {
|
|
|
362
525
|
await cleanupDetachedWorkdir(wd);
|
|
363
526
|
}
|
|
364
527
|
});
|
|
528
|
+
it('tears down the matching HUD and leader from a non-current window while preserving foreign windows and sessions', async (t) => {
|
|
529
|
+
if (!skipUnlessTmux(t))
|
|
530
|
+
return;
|
|
531
|
+
const wd = mkdtempSync(join(tmpdir(), 'omx-detached-leader-cross-window-'));
|
|
532
|
+
try {
|
|
533
|
+
await withTempTmuxSession(async (fixture) => {
|
|
534
|
+
const sessionName = 'omx-detached-cross-window';
|
|
535
|
+
const sessionId = 'detached-cross-window-session';
|
|
536
|
+
const sentinel = join(wd, 'child-release');
|
|
537
|
+
// Block the child on a sentinel so the session topology can change
|
|
538
|
+
// before the leader reaches normal child-exit teardown.
|
|
539
|
+
const fakeChild = writeChild(wd, 'while [ ! -f child-release ]; do sleep 0.1; done\nexit 0');
|
|
540
|
+
const started = await startDetachedLeader(fixture, wd, sessionName, sessionId, 'cross-window-nonce', fakeChild);
|
|
541
|
+
// Retain the dead leader pane so the leader kill stays observable under
|
|
542
|
+
// remain-on-exit even after the leader process exits normally.
|
|
543
|
+
fixture.run(['set-option', '-t', sessionName, 'remain-on-exit', 'on']);
|
|
544
|
+
// An attached user creates and selects another window in the leader
|
|
545
|
+
// session: the proven HUD stays in the original (now non-current)
|
|
546
|
+
// window while the session's current window moves to window 1.
|
|
547
|
+
const foreignWindowPaneId = fixture.run([
|
|
548
|
+
'new-window', '-d', '-P', '-F', '#{pane_id}', '-t', `${sessionName}:`, '-c', wd, 'sleep 300',
|
|
549
|
+
]);
|
|
550
|
+
fixture.run(['select-window', '-t', `${sessionName}:1`]);
|
|
551
|
+
assert.equal(fixture.run(['display-message', '-p', '-t', sessionName, '#{window_id}']), fixture.run(['display-message', '-p', '-t', foreignWindowPaneId, '#{window_id}']), 'the selected window must be the foreign window, not the HUD window');
|
|
552
|
+
assert.equal(fixture.run(['list-panes', '-t', sessionName, '-F', '#{pane_id}']).split('\n').includes(started.hud.paneId), false, 'a window-scoped listing must not see the HUD in the non-current window');
|
|
553
|
+
const foreignSessionName = `${sessionName}-foreign`;
|
|
554
|
+
fixture.run(['new-session', '-d', '-s', foreignSessionName, '-c', wd, 'sleep 300']);
|
|
555
|
+
// Release the child into its normal exit and let the leader finalize.
|
|
556
|
+
writeFileSync(sentinel, 'released\n');
|
|
557
|
+
const terminal = await readReportWhen(started.releaseMarkerPath, (report) => report.kind === 'terminal');
|
|
558
|
+
assert.equal(terminal.finalized, true);
|
|
559
|
+
assert.equal(terminal.exitStatus, 0);
|
|
560
|
+
// Session-wide proof enumeration must still authenticate the HUD in the
|
|
561
|
+
// non-current window, so teardown removes the HUD and the gated leader.
|
|
562
|
+
await poll('leader pane removal', () => !paneExists(fixture, started.leaderPaneId) ? true : undefined);
|
|
563
|
+
await poll('HUD pane removal', () => !paneExists(fixture, started.hud.paneId) ? true : undefined);
|
|
564
|
+
await poll('HUD process exit', () => !processAlive(started.hud.panePid) ? true : undefined);
|
|
565
|
+
assertProcessDead(started.hud.panePid);
|
|
566
|
+
// The user-added window keeps its live pane, so the leader session is
|
|
567
|
+
// deliberately preserved (#3266 contract): natural closure happens only
|
|
568
|
+
// when no other panes remain. The foreign window pane, the foreign
|
|
569
|
+
// session on the same server, and the private fixture session survive.
|
|
570
|
+
assert.equal(paneExists(fixture, foreignWindowPaneId), true, 'the foreign window pane must survive cross-window teardown');
|
|
571
|
+
assert.equal(tmuxSessionExists(sessionName, fixture.serverName), true, 'the leader session must survive with a preserved user pane');
|
|
572
|
+
assert.equal(tmuxSessionExists(foreignSessionName, fixture.serverName), true, 'the foreign session must survive cross-window teardown');
|
|
573
|
+
assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive cross-window teardown');
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
finally {
|
|
577
|
+
await cleanupDetachedWorkdir(wd);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
it('removes the proven HUD from a non-current window without harming an impostor pane in another window', async (t) => {
|
|
581
|
+
if (!skipUnlessTmux(t))
|
|
582
|
+
return;
|
|
583
|
+
await withTempTmuxSession(async (fixture) => {
|
|
584
|
+
const ownerId = 'cross-window-impostor-owner';
|
|
585
|
+
const expected = createOwnedHud(fixture, ownerId);
|
|
586
|
+
// Create an impostor pane in another window carrying the same operation
|
|
587
|
+
// marker text and the same owner tag but none of the proof's pane
|
|
588
|
+
// identity: it must not become an authority match, must not be harmed,
|
|
589
|
+
// and must not stop the exact proof from authorizing the real HUD.
|
|
590
|
+
const impostorWindowPaneId = fixture.run([
|
|
591
|
+
'new-window', '-d', '-P', '-F', '#{pane_id}', '-t', `${fixture.sessionName}:`,
|
|
592
|
+
`env OMX_DETACHED_HUD_OPERATION=${expected.operationMarker} sleep 120`,
|
|
593
|
+
]);
|
|
594
|
+
fixture.run(['set-option', '-pq', '-t', impostorWindowPaneId, '@omx_hud_owner', ownerId]);
|
|
595
|
+
fixture.run(['select-window', '-t', `${fixture.sessionName}:1`]);
|
|
596
|
+
assert.equal(fixture.run(['display-message', '-p', '-t', fixture.sessionName, '#{window_id}']), fixture.run(['display-message', '-p', '-t', impostorWindowPaneId, '#{window_id}']), 'the selected window must be the impostor window, not the HUD window');
|
|
597
|
+
assert.equal(cleanupDetachedHudPane(expected, ownerId), true, 'the exact proof must still authorize the real HUD');
|
|
598
|
+
await poll('proven HUD removal', () => !paneExists(fixture, expected.paneId) ? true : undefined);
|
|
599
|
+
assert.equal(paneExists(fixture, impostorWindowPaneId), true, 'the impostor pane in the other window must be preserved');
|
|
600
|
+
});
|
|
601
|
+
});
|
|
365
602
|
it('applies only a matching finalized terminal exit status', () => {
|
|
366
603
|
const wd = mkdtempSync(join(tmpdir(), 'omx-detached-exit-status-'));
|
|
367
604
|
const path = join(wd, 'marker.release');
|
|
@@ -392,7 +629,7 @@ describe('detached leader HUD teardown', () => {
|
|
|
392
629
|
it('publishes an optional HUD authority proof exactly', () => {
|
|
393
630
|
const wd = mkdtempSync(join(tmpdir(), 'omx-detached-release-marker-'));
|
|
394
631
|
const path = join(wd, 'marker.release');
|
|
395
|
-
const hud = { paneId: '%1', panePid: 123, sessionId: '$1', windowId: '@1', operationMarker: 'operation' };
|
|
632
|
+
const hud = { paneId: '%1', panePid: 123, sessionName: 'session', sessionId: '$1', sessionCreated: '1', windowId: '@1', operationMarker: 'operation' };
|
|
396
633
|
try {
|
|
397
634
|
publishDetachedReleaseMarker(path, 'n', 's', 'sn', 456, hud);
|
|
398
635
|
assert.deepEqual(JSON.parse(readFileSync(`${path}.release`, 'utf-8')), {
|