From 04d56d5aa23ef6afc11774a231c3eb04bb68a111 Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 5 Oct 2026 20:23:05 +0800 Subject: [PATCH] feat: introduce Vue Bootstrap interface and scoped router network status --- .gitignore | 3 + ARCHITECTURE.md | 6 + README.md | 6 + RELEASE-v0.1.35.md | 18 + VERSION | 2 +- app.py | 10 +- frontend/README.md | 32 + frontend/THIRD-PARTY-LICENSES.txt | 46 + frontend/index.html | 1 + frontend/package.json | 18 + frontend/pnpm-lock.yaml | 862 ++++++++ frontend/pnpm-workspace.yaml | 2 + frontend/src/App.vue | 11 + frontend/src/compat/load.js | 20 + frontend/src/compat/scripts.json | 28 + frontend/src/components/AppHeader.vue | 3 + frontend/src/components/AppIcon.vue | 34 + frontend/src/components/AppSidebar.vue | 24 + frontend/src/components/DeviceCollection.vue | 153 ++ .../src/components/DeviceNetworkPanel.vue | 5 + frontend/src/components/HomeExplorer.vue | 406 ++++ frontend/src/components/NetworkMap.vue | 117 + frontend/src/components/NetworkStatus.vue | 13 + frontend/src/components/RuntimeOverlays.vue | 25 + frontend/src/components/Workspace.vue | 72 + frontend/src/composables/bridge.js | 6 + frontend/src/main.js | 9 + frontend/src/theme.css | 1912 +++++++++++++++++ frontend/vite.config.js | 3 + network_status.py | 104 + test-support/ui-source.js | 2 + test_app.py | 11 +- test_daily_flow.js | 2 +- test_households_ui.js | 2 +- test_journal.js | 4 +- test_network_status.py | 66 + test_steward.js | 2 +- test_theme.js | 13 +- test_vue_ui.js | 29 + web/app.js | 9 +- web/devices.js | 8 +- web/households.js | 3 + web/index.html | 119 - web/steward.js | 4 +- web/ui/assets/index-DxbM73EL.css | 1 + web/ui/assets/index-YWYfmYO_.js | 1 + web/ui/index.html | 3 + web/vue-bridge.js | 11 + 48 files changed, 4096 insertions(+), 145 deletions(-) create mode 100644 RELEASE-v0.1.35.md create mode 100644 frontend/README.md create mode 100644 frontend/THIRD-PARTY-LICENSES.txt create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/pnpm-workspace.yaml create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/compat/load.js create mode 100644 frontend/src/compat/scripts.json create mode 100644 frontend/src/components/AppHeader.vue create mode 100644 frontend/src/components/AppIcon.vue create mode 100644 frontend/src/components/AppSidebar.vue create mode 100644 frontend/src/components/DeviceCollection.vue create mode 100644 frontend/src/components/DeviceNetworkPanel.vue create mode 100644 frontend/src/components/HomeExplorer.vue create mode 100644 frontend/src/components/NetworkMap.vue create mode 100644 frontend/src/components/NetworkStatus.vue create mode 100644 frontend/src/components/RuntimeOverlays.vue create mode 100644 frontend/src/components/Workspace.vue create mode 100644 frontend/src/composables/bridge.js create mode 100644 frontend/src/main.js create mode 100644 frontend/src/theme.css create mode 100644 frontend/vite.config.js create mode 100644 network_status.py create mode 100644 test-support/ui-source.js create mode 100644 test_network_status.py create mode 100644 test_vue_ui.js delete mode 100644 web/index.html create mode 100644 web/ui/assets/index-DxbM73EL.css create mode 100644 web/ui/assets/index-YWYfmYO_.js create mode 100644 web/ui/index.html create mode 100644 web/vue-bridge.js diff --git a/.gitignore b/.gitignore index ad9caec..ec50e2a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ mediamtx mediamtx.exe *.tar.gz + +/frontend/node_modules/ +/frontend/.vite/ diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index ef44199..2fae883 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,5 +1,11 @@ # 赵府智家系统架构 +## 前端(v0.1.35) + +Vue 3 单文件组件负责应用外壳、家庭卡片、设备目录和网络图,Vite 打包,Bootstrap 5 提供布局与控件样式。`frontend/src/composables/bridge.js` 接收已鉴权的状态快照;`web/vue-bridge.js` 封装现有业务动作。视频、家谱、记事等旧业务控制器暂按依赖顺序加载,只管理各自的兼容容器,不能覆盖 Vue 管理的节点。 + +生产请求 `/` 返回预构建的 `web/ui/index.html`,仅允许读取哈希命名的 JS/CSS;源码与构建产物一起提交,生产主机不运行构建工具。网络状态接口只检查当前管理员授权范围内的已登记设备,30 秒缓存,区别节点在线、端口可达与子网路由可见。 + ## 部署与职责 系统运行于自己的 Ubuntu 小电脑,提供局域网和 Tailscale 网页入口。第一阶段是视觉模块。管理程序、SQLite 和 MediaMTX 在同一主机运行,使用独立服务用户;网页只访问管理程序,设备凭据与媒体管理接口留在服务端。 diff --git a/README.md b/README.md index f6258eb..b07aefb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # 赵府智家 · 视觉系统 +## v0.1.35 · Vue、Bootstrap 与设备网络状态 + +前端采用 Vue 3 + Vite + Bootstrap 5,家庭卡片、设备目录与网络拓扑组件化,提供桌面及手机布局。GL.iNet 等路由器显示服务器探测状态、Tailscale 节点与子网路由状态,并提供管理后台跳转。权限仍以家庭/场所隔离。 + +详见 [本次发布](RELEASE-v0.1.35.md) 与 [前端构建和模块边界](frontend/README.md)。复杂视频、家谱、记事控制器暂通过兼容层保留;生产主机直接使用已提交的构建产物,无需安装 Node。 + ## v0.1.32 · 真实网盘验收与保存反馈 - 修复家庭档案已保存、后续列表刷新失败时提示不可见的问题;立即提示保存结果,刷新失败单独提示,无需重复提交。 diff --git a/RELEASE-v0.1.35.md b/RELEASE-v0.1.35.md new file mode 100644 index 0000000..f480284 --- /dev/null +++ b/RELEASE-v0.1.35.md @@ -0,0 +1,18 @@ +# v0.1.35 — Vue 与 Bootstrap 界面、路由器网络状态 + +- 新增 Vue 3 + Vite + Bootstrap 5 前端,统一侧栏、页首、卡片、按钮、表单、弹窗及手机排版。使用本地构建资源,不依赖外部 CDN,生产主机不需要 Node。 +- 家庭卡片、分页、布局排序、整体拓扑、设备卡片与场所网络拓扑迁为 Vue 组件;复杂记事、家谱和视频控制器暂保留在明确的兼容边界中,避免重建正在播放的视频。 +- 路由器、网关及服务器卡片自动检查登记地址的服务端口;设备详情也提供网络检查。区分服务器到设备的实际可达性、Tailscale 节点在线状态和所需子网路由是否可见。 +- 增加“打开管理后台”入口,分别显示设备地址和 Tailscale 地址,在新标签页打开。未检测到 Web 服务时保留标有“待连通”的默认 HTTP 入口;当前浏览器仍须具备到设备的网络路径。 +- 网络接口仅允许本家庭/场所管理员及超级管理员访问已授权设备;禁止通过请求传入任意目标。检查缓存 30 秒,限制并发,切换场所或账号时丢弃旧结果。不会保存路由器密码或修改其配置。 +- 修复显式点击摄像头“设备详情”时被自动跳转到实时画面的问题。 + +## 验证 + +167 项 Python、131 项 JavaScript 回归测试。Edge 实际操作覆盖登录、三列卡片布局保存、家庭下钻、设备新增及编辑回填、所有人/负责人选择、上级关联、自动拓扑更新、个人记事保存清空与预览、退出登录及普通成员范围隔离。检查 390 像素手机布局与折叠菜单。 + +## 范围 + +网络状态来自服务器端 TCP 检查及 Tailscale 本机视图,不代表完整物理布线发现,也不等于互联网出口健康检查。设备未连通时仍会保留档案。未迁移的业务控制器保留在兼容层;这次不是所有旧业务 JavaScript 的完全重写。 + +公开仓库不含用户资料、业务数据库、网盘授权或设备凭据。 diff --git a/VERSION b/VERSION index 9dd1793..a52e041 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.34 +0.1.35 diff --git a/app.py b/app.py index fb27b90..f5353c8 100644 --- a/app.py +++ b/app.py @@ -34,6 +34,7 @@ import genealogy import geography import households import inventory +import network_status import heritage import appearance import cloud_images @@ -84,6 +85,7 @@ ACCOUNTS = identity.Accounts(sys.modules[__name__]) FAMILY = genealogy.Family(sys.modules[__name__]) HOUSEHOLDS = households.Households(sys.modules[__name__]) INVENTORY = inventory.Inventory(sys.modules[__name__]) +NETWORK = network_status.NetworkStatus(sys.modules[__name__]) HERITAGE = heritage.Heritage(sys.modules[__name__]) APPEARANCE = appearance.Appearance(sys.modules[__name__]) BACKUPS = backups.Backups(sys.modules[__name__]) @@ -922,6 +924,8 @@ class Handler(BaseHTTPRequestHandler): self.require_auth() if path == '/api/state': self.answer(ACCOUNTS.state(self.user, status())) + elif path == '/api/devices/network': + self.require_manager(); self.answer(NETWORK.read(self.user, query)) elif path == '/api/baidu/config': self.require_admin(); self.answer(BAIDU.public_config()) elif path == '/api/baidu/status': @@ -1054,7 +1058,7 @@ class Handler(BaseHTTPRequestHandler): else: raise Problem('接口不存在', 404) else: - files = {'/': 'index.html', '/app.js': 'app.js', '/live-player.js': 'live-player.js', '/style.css': 'style.css', + files = {'/': 'ui/index.html', '/vue-bridge.js':'vue-bridge.js', '/app.js': 'app.js', '/live-player.js': 'live-player.js', '/style.css': 'style.css', '/family.js': 'family.js', '/kinship.js': 'kinship.js', '/households.js': 'households.js', '/device-model.js': 'device-model.js', '/devices.js': 'devices.js', '/steward.js': 'steward.js', '/heritage.js': 'heritage.js', '/personalization.js': 'personalization.js', @@ -1069,7 +1073,9 @@ class Handler(BaseHTTPRequestHandler): '/monitor.js': 'monitor.js', '/calendar.js': 'calendar.js', '/date-fields.js': 'date-fields.js', '/zhao-icon.png': 'zhao-icon.png', '/vendor/hls.min.js': 'vendor/hls.min.js'} - if path not in files: + if re.fullmatch(r'/ui/assets/[A-Za-z0-9_-]+\.(?:js|css)', path): + files[path] = path[1:] + if path not in files or not (ROOT / 'web' / files[path]).is_file(): raise Problem('页面不存在', 404) file = ROOT / 'web' / files[path] raw = file.read_bytes() diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..9f74479 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,32 @@ +# 赵府 Vue 前端 + +Vue 3 + Vite + Bootstrap 5。Python 服务提供 API 和本地静态资源;生产主机无需安装 Node。 + +## 构建 + +在仓库根目录运行: + +```sh +pnpm --dir frontend install --frozen-lockfile +pnpm --dir frontend build +``` + +提交 `frontend/` 源码、锁文件及 `web/ui/` 构建产物后发布。根路径 `/` 返回 `web/ui/index.html`,资源名含内容哈希。Bootstrap、Vue 和字体均无需外部 CDN。域控制器版本随 `compat/load.js` 发布号更新。 + +## 模块边界 + +- `App.vue`、`AppSidebar`、`AppHeader`:应用外壳与导航。 +- `HomeExplorer`:账号独立的卡片布局、分页、排序及场所总拓扑。 +- `DeviceCollection`、`NetworkMap`:同一设备目录的卡片和拓扑视图。 +- `NetworkStatus`:授权设备的实时网络检查与后台入口,清理定时器并丢弃过期响应。 +- `Workspace`、`RuntimeOverlays`:现有业务页面与表单模板。 +- `composables/bridge.js`、`web/vue-bridge.js`:Vue 与现有业务控制器的状态边界。 +- `compat/scripts.json`:旧业务控制器依赖顺序,按顺序加载。视频播放器、家谱、记事等复杂交互暂时保留原控制器;尚未全部迁为 Vue 状态管理。 + +Vue 管理家庭卡片、设备列表、网络拓扑的 DOM;旧控制器只发布数据,不再覆盖这些容器。表单及播放器的兼容容器由原控制器管理,Vue 不重建其内部节点,避免轮询时重建视频。`web/index.html` 已移除,模板以 Vue 组件为准。 + +## 网络状态 + +`GET /api/devices/network?source=device|camera|recorder&id=...` 只允许当前家庭管理员与超级管理员检查本归属下的已登记设备。端口探测与 Tailscale 节点状态分别显示,30 秒缓存、并发限制;用户输入不能指定任意检查目标。只连接 TCP 端口,不修改设备、不发送登录密码。 + +“服务可达”表示从服务器能连接常用端口,并不证明设备品牌或互联网出口正常。管理后台优先使用探测到的 HTTP/HTTPS 端口,未检测到时提供标有“待连通”的默认 HTTP 入口,方便在设备同一局域网的浏览器打开。Tailscale 路由状态来自本服务器看到的路由,不等于完整物理布线发现。 diff --git a/frontend/THIRD-PARTY-LICENSES.txt b/frontend/THIRD-PARTY-LICENSES.txt new file mode 100644 index 0000000..2c771c7 --- /dev/null +++ b/frontend/THIRD-PARTY-LICENSES.txt @@ -0,0 +1,46 @@ +vue +The MIT License (MIT) + +Copyright (c) 2018-present, Yuxi (Evan) You + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +bootstrap +The MIT License (MIT) + +Copyright (c) 2011-2025 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..70e9508 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1 @@ +赵府 · 智能数字管家
diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..de3bde7 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,18 @@ +{ + "name": "zhao-steward-ui", + "private": true, + "version": "0.1.35", + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite --host 127.0.0.1" + }, + "dependencies": { + "bootstrap": "5.3.8", + "vue": "^3.5.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.0" + } +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..ddb269e --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,862 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + bootstrap: + specifier: 5.3.8 + version: 5.3.8(@popperjs/core@2.11.8) + vue: + specifier: ^3.5.0 + version: 3.5.43 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^6.0.0 + version: 6.0.9(vite@7.3.6)(vue@3.5.43) + vite: + specifier: ^7.0.0 + version: 7.3.6 + +packages: + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/rollup-android-arm-eabi@4.64.0': + resolution: {integrity: sha512-FLLpX941CD/7aBvX3GqLGBM9OvY5PGXTryPJkG5r5/OuBpZpV5k45Uo3RxAvqd35tsyc3hH1bhtz921IKzoIzg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.64.0': + resolution: {integrity: sha512-iI32XM/jnDYJsvx5ai/za/7gWO9XoSeFFtU06/ZCaRgyilfJOjaopD3nOpk2WrTCGOyeDt4hleUiGOAnd5tHNg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.64.0': + resolution: {integrity: sha512-dRBZlbt2sEtF8Mn4MODThze9fIPdDoOhVSlXMAKy5dQbOYK9pOOoPY4Fat3OTtr0+8zbJo5TTZwlsfxY/kDNJg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.64.0': + resolution: {integrity: sha512-Y3whrJOMucfkhgNkvcM93M6j8C53iEAMmPMYD99C6G1kUy4ELigLWk9ar2/4aCBSRgsql0zdlOemLgW2m5GZgQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.64.0': + resolution: {integrity: sha512-S6S1GEzPjFF6IONYJX3AKt/799+8RgBgCcwRnUo+Ep1IvBxUbw5M51iU0TDdK2NWWVnSvCQ8yi6Em0fGASMOng==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.64.0': + resolution: {integrity: sha512-Ed1DPoFENkXj4IGzSB12SesV40iP6LxCCrbTIkSGIQBpOOxpBM+0kj62lmaeIHfMWTDoddqTOtqc7s8LYfn+Pw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.64.0': + resolution: {integrity: sha512-J/6xhutJPtFyIkmHdf4olOdHHKH5kOJNumojdWn+Elv5ICEYTVOa362Vw27TxsK0BLzb1le3EDlO3UbvFK1lnQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.64.0': + resolution: {integrity: sha512-G4L/Nnx59d2LvDoV/P4S5lZ7oVLT6hodOHMacqjiq2LL2gts86KbkEBTYL53+fBt0odhf7XPIbIATGoYiJctxg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.64.0': + resolution: {integrity: sha512-zF16pvJDEUksGYRbfnXne7pdklAyj2XDmJeYKgP93oq0cUyX9Y8O7lUo1R+IY1GagP/YBvCEDCe7eEcAKpw//g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.64.0': + resolution: {integrity: sha512-nIggWn8n+w12+R5lsV+PYYoUY8vuObxPAQqJI7WES+9v0qspYuAHoZMfYM0yLxlipasT5BY9ht5W8t5c/rSCkg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.64.0': + resolution: {integrity: sha512-WLOTiHPzszP0dxIMsHpFeDSOSB5I49Mj8K4+yKE3H1X/D0JRG5XZ5jrctJLMjnUc/LUzaKiwq6EHWNJ8pup8PA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.64.0': + resolution: {integrity: sha512-35RK9aRhh7g7Pmeu5gQ01aCvrhXzj9LoBE6xtUcEH1ns+nyTaSzxSpADmBQINu4QiTDGvmQYwo1j5hlg1rRXFw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.64.0': + resolution: {integrity: sha512-RqTfnpoTjuWfPAmqK5p2edt2AMCDJWm6oTn7sKfmyx+6tRga0ip05SJ977o6udTcIiDeF/CJMUfkaN4gtWt6Aw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.64.0': + resolution: {integrity: sha512-RQjZPigjxFvFZDijG6rjlSXxhRaTf9zLYVpGK+lVcga64oMqP1GbgVqCb46eHTTceSIgp89Ja0y5aPe3GFBYHg==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.64.0': + resolution: {integrity: sha512-tjL58mgQcTRnDRpeky+Sth1MKQeYi2Ct6r3Luq9E5aTSjnM/i/JbozqZkKqp9thM5+oDSZxo+05f9kdQedfTGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.64.0': + resolution: {integrity: sha512-ictoRyVaoZ8C67myHef+8hhCa6IplXJJ/xUCkVCxziV4zxMZh+jvhkhGsPBLqj1S72fnqD0QH5zL4lcaa4X7DQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.64.0': + resolution: {integrity: sha512-8aVvZ2hfr9RLFzBQkQNmYeHLDja8fLeQAmLt757zdKN/B+8L809KlLJKctQjS22wZotptV8G6o7fVPuAs8S1tQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.64.0': + resolution: {integrity: sha512-2dEF8GAcDKwshUfydD+GhosppNyBzhVUHkdFF3CXd3FpOkzj/RZzF5aoEtzklujklT5qFVRU2GK/cFeLaTNKVg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.64.0': + resolution: {integrity: sha512-3XHTvoo2hKkh0MiOfS7SkhHjMaaWF7P4F3drocZZaho/Z8w7h/jpnuBHm91BOQLfvrKHs1yR+zir4E8RI3XzTQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.64.0': + resolution: {integrity: sha512-HKtkzodL4a3KFWDXDoO61cRynAWTR3LnAE0oGtfG9lcNFpNuVYUFOByxDgNqEvic9rvaQbAj+SFwTEWDptRaIw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.64.0': + resolution: {integrity: sha512-JBsxqiY16uyyCujtoC3s7zL+SrYyNElptD7K4V+KUoJ2V8/XG3hPWpheK+SuPwNh1cikJvIZmIdsrYXvD6PLJw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.64.0': + resolution: {integrity: sha512-S5Qrijh37qhnUYQ0ay8WN3LuWeKjow7wTUyCOPMZtnXiBXYXdsZETI6ZLfYnQAKovltckPLBFdNeD61P2rJc7g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.64.0': + resolution: {integrity: sha512-zbZ6iMmLFEsCtTdc2/y1F/cDFVNNCPF7Ae8PCT/wdPE//hGwYp6r+MyCLMFX+kOeIe09Pz6ASfnnfpSTN1FJQQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.64.0': + resolution: {integrity: sha512-L6Hw69oNpuYaOr1zCG30v0/DqKYCSRwodPGwIcVZ/6f8SOzq9rxtL/xNVI5MO4wjli+Ko0ErK9uHJL3mNPt8wQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.64.0': + resolution: {integrity: sha512-nl+CTWIgOGszQmUz/kanfgrfFZ4qiwxKIfT/ryl3N3Ewk5tqizmYtNXiqb7Bu/fDtNgu1kyxdFiAUJNur3iysg==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@vitejs/plugin-vue@6.0.9': + resolution: {integrity: sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.43': + resolution: {integrity: sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==} + + '@vue/compiler-dom@3.5.43': + resolution: {integrity: sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==} + + '@vue/compiler-sfc@3.5.43': + resolution: {integrity: sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==} + + '@vue/compiler-ssr@3.5.43': + resolution: {integrity: sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==} + + '@vue/reactivity@3.5.43': + resolution: {integrity: sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==} + + '@vue/runtime-core@3.5.43': + resolution: {integrity: sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==} + + '@vue/runtime-dom@3.5.43': + resolution: {integrity: sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==} + + '@vue/server-renderer@3.5.43': + resolution: {integrity: sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==} + + '@vue/shared@3.5.43': + resolution: {integrity: sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==} + + bootstrap@5.3.8: + resolution: {integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==} + peerDependencies: + '@popperjs/core': ^2.11.8 + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + rollup@4.64.0: + resolution: {integrity: sha512-gjA/kFeDfffII8COoPsvLPvE16hWDTEc1+0QKQNKUkuV8iJjqsC4xXs8/FzuL0v9EV39kuxTbAgcFoTRyy2TGQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue@3.5.43: + resolution: {integrity: sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@popperjs/core@2.11.8': {} + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/rollup-android-arm-eabi@4.64.0': + optional: true + + '@rollup/rollup-android-arm64@4.64.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.64.0': + optional: true + + '@rollup/rollup-darwin-x64@4.64.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.64.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.64.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.64.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.64.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.64.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.64.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.64.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.64.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.64.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.64.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.64.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.64.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.64.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.64.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.64.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.64.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.64.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.64.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.64.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.64.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.64.0': + optional: true + + '@types/estree@1.0.9': {} + + '@vitejs/plugin-vue@6.0.9(vite@7.3.6)(vue@3.5.43)': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 7.3.6 + vue: 3.5.43 + + '@vue/compiler-core@3.5.43': + dependencies: + '@babel/parser': 7.29.9 + '@vue/shared': 3.5.43 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.2 + + '@vue/compiler-dom@3.5.43': + dependencies: + '@vue/compiler-core': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/compiler-sfc@3.5.43': + dependencies: + '@babel/parser': 7.29.9 + '@vue/compiler-core': 3.5.43 + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-ssr': 3.5.43 + '@vue/shared': 3.5.43 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.28 + source-map-js: 1.2.2 + + '@vue/compiler-ssr@3.5.43': + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/reactivity@3.5.43': + dependencies: + '@vue/shared': 3.5.43 + + '@vue/runtime-core@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/runtime-dom@3.5.43': + dependencies: + '@vue/reactivity': 3.5.43 + '@vue/runtime-core': 3.5.43 + '@vue/shared': 3.5.43 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.43': + dependencies: + '@vue/compiler-ssr': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/shared': 3.5.43 + + '@vue/shared@3.5.43': {} + + bootstrap@5.3.8(@popperjs/core@2.11.8): + dependencies: + '@popperjs/core': 2.11.8 + + csstype@3.2.3: {} + + entities@7.0.1: {} + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + fsevents@2.3.3: + optional: true + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + nanoid@3.3.19: {} + + picocolors@1.1.1: {} + + picomatch@4.0.7: {} + + postcss@8.5.28: + dependencies: + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.2 + + rollup@4.64.0: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.64.0 + '@rollup/rollup-android-arm64': 4.64.0 + '@rollup/rollup-darwin-arm64': 4.64.0 + '@rollup/rollup-darwin-x64': 4.64.0 + '@rollup/rollup-freebsd-arm64': 4.64.0 + '@rollup/rollup-freebsd-x64': 4.64.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.64.0 + '@rollup/rollup-linux-arm-musleabihf': 4.64.0 + '@rollup/rollup-linux-arm64-gnu': 4.64.0 + '@rollup/rollup-linux-arm64-musl': 4.64.0 + '@rollup/rollup-linux-loong64-gnu': 4.64.0 + '@rollup/rollup-linux-loong64-musl': 4.64.0 + '@rollup/rollup-linux-ppc64-gnu': 4.64.0 + '@rollup/rollup-linux-ppc64-musl': 4.64.0 + '@rollup/rollup-linux-riscv64-gnu': 4.64.0 + '@rollup/rollup-linux-riscv64-musl': 4.64.0 + '@rollup/rollup-linux-s390x-gnu': 4.64.0 + '@rollup/rollup-linux-x64-gnu': 4.64.0 + '@rollup/rollup-linux-x64-musl': 4.64.0 + '@rollup/rollup-openbsd-x64': 4.64.0 + '@rollup/rollup-openharmony-arm64': 4.64.0 + '@rollup/rollup-win32-arm64-msvc': 4.64.0 + '@rollup/rollup-win32-ia32-msvc': 4.64.0 + '@rollup/rollup-win32-x64-gnu': 4.64.0 + '@rollup/rollup-win32-x64-msvc': 4.64.0 + fsevents: 2.3.3 + + source-map-js@1.2.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + vite@7.3.6: + dependencies: + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.28 + rollup: 4.64.0 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vue@3.5.43: + dependencies: + '@vue/compiler-dom': 3.5.43 + '@vue/compiler-sfc': 3.5.43 + '@vue/runtime-dom': 3.5.43 + '@vue/server-renderer': 3.5.43 + '@vue/shared': 3.5.43 diff --git a/frontend/pnpm-workspace.yaml b/frontend/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/frontend/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..a1419fe --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,11 @@ + + diff --git a/frontend/src/compat/load.js b/frontend/src/compat/load.js new file mode 100644 index 0000000..5d6a82f --- /dev/null +++ b/frontend/src/compat/load.js @@ -0,0 +1,20 @@ +import scripts from './scripts.json' +// Existing domain controllers keep their event contracts while pages migrate to Vue. +// This observer styles only controls; it never owns their state or recreates players. +export function enhance(root){ + if(!(root instanceof Element))return + const elements=[root,...root.querySelectorAll('button,input,select,textarea,table')] + for(const el of elements){ + if(el.matches('button')&&!el.closest('.family-map-viewport')&&!el.classList.contains('btn'))el.classList.add('btn',el.matches('.quiet,.secondary')?'btn-outline-secondary':'btn-primary') + if(el.matches('select'))el.classList.add('form-select') + if(el.matches('textarea,input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=hidden])'))el.classList.add('form-control') + if(el.matches('input[type=checkbox],input[type=radio]'))el.classList.add('form-check-input') + if(el.matches('table'))el.classList.add('table','align-middle') + } +} +export async function loadControllers(){ + enhance(document.getElementById('app')) + new MutationObserver(records=>{for(const record of records)for(const node of record.addedNodes)enhance(node)}).observe(document.getElementById('app'),{childList:true,subtree:true}) + for(const path of [...scripts,'/vue-bridge.js'])await new Promise((resolve,reject)=>{const script=document.createElement('script');script.src=path+'?ui=0.1.35';script.onload=resolve;script.onerror=()=>reject(new Error('Could not load '+path));document.head.append(script)}) + await window.ZhaoVue.boot() +} diff --git a/frontend/src/compat/scripts.json b/frontend/src/compat/scripts.json new file mode 100644 index 0000000..98dcedb --- /dev/null +++ b/frontend/src/compat/scripts.json @@ -0,0 +1,28 @@ +[ + "/vendor/hls.min.js", + "/live-player.js", + "/kinship.js", + "/family-graph.js", + "/calendar.js", + "/device-model.js", + "/data/geography-data.js", + "/geography.js", + "/app.js", + "/monitor.js", + "/date-fields.js", + "/family-map.js", + "/family.js", + "/family-events.js", + "/family-history.js", + "/camera-settings.js", + "/recording-ranges.js", + "/recording-ui.js", + "/snapshot.js", + "/households.js", + "/devices.js", + "/steward.js", + "/heritage.js", + "/personalization.js", + "/file-hash.js", + "/journal.js" +] \ No newline at end of file diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue new file mode 100644 index 0000000..a4f104b --- /dev/null +++ b/frontend/src/components/AppHeader.vue @@ -0,0 +1,3 @@ + diff --git a/frontend/src/components/AppIcon.vue b/frontend/src/components/AppIcon.vue new file mode 100644 index 0000000..f7c550f --- /dev/null +++ b/frontend/src/components/AppIcon.vue @@ -0,0 +1,34 @@ + + diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue new file mode 100644 index 0000000..e6dae74 --- /dev/null +++ b/frontend/src/components/AppSidebar.vue @@ -0,0 +1,24 @@ + + diff --git a/frontend/src/components/DeviceCollection.vue b/frontend/src/components/DeviceCollection.vue new file mode 100644 index 0000000..10a234c --- /dev/null +++ b/frontend/src/components/DeviceCollection.vue @@ -0,0 +1,153 @@ + + diff --git a/frontend/src/components/DeviceNetworkPanel.vue b/frontend/src/components/DeviceNetworkPanel.vue new file mode 100644 index 0000000..5e34bcb --- /dev/null +++ b/frontend/src/components/DeviceNetworkPanel.vue @@ -0,0 +1,5 @@ + + diff --git a/frontend/src/components/HomeExplorer.vue b/frontend/src/components/HomeExplorer.vue new file mode 100644 index 0000000..063cde8 --- /dev/null +++ b/frontend/src/components/HomeExplorer.vue @@ -0,0 +1,406 @@ + + diff --git a/frontend/src/components/NetworkMap.vue b/frontend/src/components/NetworkMap.vue new file mode 100644 index 0000000..7c495d3 --- /dev/null +++ b/frontend/src/components/NetworkMap.vue @@ -0,0 +1,117 @@ + + diff --git a/frontend/src/components/NetworkStatus.vue b/frontend/src/components/NetworkStatus.vue new file mode 100644 index 0000000..80d6868 --- /dev/null +++ b/frontend/src/components/NetworkStatus.vue @@ -0,0 +1,13 @@ + + diff --git a/frontend/src/components/RuntimeOverlays.vue b/frontend/src/components/RuntimeOverlays.vue new file mode 100644 index 0000000..372b22d --- /dev/null +++ b/frontend/src/components/RuntimeOverlays.vue @@ -0,0 +1,25 @@ + diff --git a/frontend/src/components/Workspace.vue b/frontend/src/components/Workspace.vue new file mode 100644 index 0000000..a8f2899 --- /dev/null +++ b/frontend/src/components/Workspace.vue @@ -0,0 +1,72 @@ + + diff --git a/frontend/src/composables/bridge.js b/frontend/src/composables/bridge.js new file mode 100644 index 0000000..a6c2ae0 --- /dev/null +++ b/frontend/src/composables/bridge.js @@ -0,0 +1,6 @@ +import {shallowRef} from 'vue' +export const snapshot=shallowRef({state:{households:[],sites:[],cameras:[]},admin:false,loggedIn:false,page:'households',session:0,device:null}) +export const deviceView=shallowRef({devices:[],groups:[],rows:[]}) +window.ZhaoVue={enabled:true,accept(value){snapshot.value=value},setDevices(value){deviceView.value=value},clear(){deviceView.value={devices:[],groups:[],rows:[]}}} +export const bridge=()=>window.ZhaoVue +export const accessLabel=value=>({lan:'局域网',tailscale:'Tailscale',public:'公网',unknown:'接入待确认'}[value]||'接入待确认') diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..cdc64ea --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,9 @@ +import {createApp} from 'vue' +import '../../web/style.css' +import '../../web/family-map.css' +import '../../web/chinese-theme.css' +import 'bootstrap/dist/css/bootstrap.min.css' +import './theme.css' +import App from './App.vue' +import './composables/bridge.js' +createApp(App).mount('#app') diff --git a/frontend/src/theme.css b/frontend/src/theme.css new file mode 100644 index 0000000..07034d0 --- /dev/null +++ b/frontend/src/theme.css @@ -0,0 +1,1912 @@ +/* Vue + Bootstrap visual system. Domain-specific video and genealogy geometry stays intact. */ +:root { + --bs-primary: #28624f; + --bs-primary-rgb: 40, 98, 79; + --bs-body-color: #263f36; + --bs-body-bg: #f4f6f4; + --bs-border-color: #dde4df; + --bs-border-radius: 0.65rem; + --ui-surface: #fff; + --ui-muted: #67776d; + --ui-line: #dfe6e1; + --ui-sidebar: #193c32; + --ui-accent: #28624f; + --ui-bg: #f4f6f4; + --ink: #263f36; + --muted: #67776d; + --paper: #fff; + --line: #dfe6e1; + --green: #28624f; + --green-dark: #193c32; + --cream: #f4f6f4; +} +html, +body { + min-width: 320px; + margin: 0; + background: var(--ui-bg) !important; + color: var(--ink); + font-family: Inter, "Segoe UI", "Microsoft YaHei", system-ui, sans-serif; + font-size: 14px; + line-height: 1.65; +} +body { + display: block !important; + background-image: none !important; +} +body::before, +body::after { + display: none !important; +} +#app { + min-height: 100vh; + display: grid; + grid-template-columns: 232px minmax(0, 1fr); +} +*, +*::before, +*::after { + box-sizing: border-box; +} +[hidden] { + display: none !important; +} +button, +input, +select, +textarea { + font: inherit; +} +button, +a, +input, +select, +textarea { + touch-action: manipulation; +} +button { + letter-spacing: 0 !important; +} +.app-icon { + width: 20px; + height: 20px; + flex: 0 0 20px; + vertical-align: middle; +} +.btn .app-icon { + width: 17px; + height: 17px; +} +.sidebar { + width: 232px !important; + position: fixed !important; + inset: 0 auto 0 0; + z-index: 20; + background: var(--ui-sidebar) !important; + color: #e6f0eb; + padding: 28px 18px 20px !important; + display: flex; + flex-direction: column; + height: 100dvh; + overflow: auto; + border: 0 !important; + box-shadow: none !important; +} +.brand { + padding: 0 6px 24px !important; + gap: 12px; + text-decoration: none; + color: #fff !important; + border-bottom: 1px solid #ffffff14 !important; + margin: 0 0 24px !important; + display: flex; + align-items: center; +} +.brand-icon { + width: 42px !important; + height: 42px !important; + object-fit: contain; + border-radius: 10px; +} +.brand > span > span { + font-size: 22px !important; + line-height: 1.2; + letter-spacing: 2px; +} +.brand small { + font-size: 11px !important; + letter-spacing: 1px; + color: #acc4b8 !important; + margin-top: 6px; + display: block; +} +.nav-label { + font-size: 10px !important; + letter-spacing: 2px; + padding: 0 12px; + margin-bottom: 12px; + color: #95b5a6 !important; +} +.sidebar nav { + display: flex !important; + flex-direction: column !important; + gap: 5px; +} +.sidebar nav button { + display: flex; + gap: 12px; + align-items: center; + text-align: left; + width: 100%; + color: #c0d6c9 !important; + background: transparent !important; + border: 0 !important; + box-shadow: none !important; + border-radius: 8px !important; + min-height: 44px; + padding: 10px 13px !important; + font-size: 13px !important; + white-space: normal; +} +.sidebar nav button:hover { + background: #ffffff0d !important; + color: #fff !important; +} +.sidebar nav button.active { + background: #ffffffed !important; + color: #234c3d !important; + font-weight: 600; +} +.sidebar nav .app-icon { + opacity: 0.85; +} +#scope-navigation { + border: 0 !important; + padding: 18px 0 10px !important; + margin: 7px 0 !important; + box-shadow: + 0 -1px #ffffff14, + 0 1px #ffffff14; +} +#scope-nav-name { + max-width: 185px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0 0 12px; +} +.side-note { + margin-top: auto; + padding: 36px 12px 16px; + font-size: 10px; + color: #9abbab; +} +.side-note p { + display: none; +} +.sidebar #current-user { + color: #c1d3c8 !important; + border-top: 1px solid #ffffff18; + padding-top: 14px; + font-size: 11px; + margin: 0 0 8px; +} +.sidebar > #account-password, +.sidebar > #logout { + border-color: #ffffff20 !important; + color: #c1d3c8 !important; + background: transparent !important; + font-size: 11px; + min-height: 32px; + padding: 5px; + margin: 4px 0; +} +.mobile-nav-toggle { + display: none; +} +#app > main { + grid-column: 2; + margin: 0 !important; + padding: 28px 34px 20px !important; + width: 100%; + min-width: 0; + max-width: 1800px; + min-height: 100vh; + background: none !important; +} +main > header { + padding: 0 0 24px !important; + margin: 0 0 24px !important; + border-bottom: 1px solid var(--ui-line) !important; + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + min-height: 0 !important; + background: none !important; + position: relative; +} +main > header::after, +main > header::before { + display: none !important; +} +.eyebrow { + font-size: 10px; + letter-spacing: 2px; + color: var(--ui-muted) !important; + margin-bottom: 7px; +} +h1, +#page-title { + font-family: inherit !important; + font-size: 26px !important; + font-weight: 650 !important; + line-height: 1.35; + letter-spacing: -0.5px !important; + margin: 0 0 7px !important; +} +h2 { + font-size: 19px !important; + font-weight: 600 !important; + line-height: 1.45; + letter-spacing: 0 !important; + margin: 0 0 5px !important; +} +h3 { + font-size: 16px !important; + line-height: 1.5; + font-weight: 600 !important; + letter-spacing: 0 !important; +} +h2, +h3, +h4 { + font-family: inherit !important; +} +#page-note { + font-size: 12px !important; + color: var(--ui-muted); + margin: 0 !important; +} +.header-status { + align-items: flex-end; + gap: 8px; + font-size: 10px !important; + white-space: nowrap; +} +#service-status { + font-size: 10px; +} +#clock { + color: var(--ui-muted); + background: none !important; + padding: 0 !important; +} +#clock::before { + display: none !important; +} +.btn { + border-radius: 7px !important; + min-height: 36px; + padding: 7px 13px; + font-size: 12px; + font-weight: 500; + box-shadow: none; + line-height: 1.65; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 5px; + white-space: normal; +} +.btn-primary { + --bs-btn-bg: var(--ui-accent); + --bs-btn-border-color: var(--ui-accent); + --bs-btn-hover-bg: #1d4d3c; + --bs-btn-hover-border-color: #1d4d3c; + --bs-btn-disabled-bg: #80988d; + --bs-btn-disabled-border-color: #80988d; + --bs-btn-active-bg: #1d4d3c; + --bs-btn-active-border-color: #1d4d3c; + color: #fff !important; +} +.btn-outline-secondary { + --bs-btn-color: #54685d; + --bs-btn-border-color: #d8e1da; + --bs-btn-hover-bg: #edf3ee; + --bs-btn-hover-border-color: #bacdc0; + --bs-btn-hover-color: #264d3b; + --bs-btn-active-bg: #e0ece4; + --bs-btn-active-border-color: #a7c0ae; + --bs-btn-active-color: #254e3b; + --bs-btn-disabled-color: #9faea4; + --bs-btn-disabled-border-color: #e0e5e2; + background: transparent; +} +.btn-sm { + min-height: 30px; + padding: 4px 9px; + font-size: 11px; +} +.btn-link { + color: var(--ui-accent); + text-decoration: none; + background: transparent; + border: 0; +} +.btn-link:hover { + text-decoration: underline; +} +.btn:focus-visible, +.form-control:focus, +.form-select:focus { + box-shadow: 0 0 0 3px #28744c1c !important; + outline: 0 !important; + border-color: #679b79; +} +.btn-group > .btn { + border-radius: 0 !important; +} +.btn-group > .btn:first-child { + border-radius: 7px 0 0 7px !important; +} +.btn-group > .btn:last-child { + border-radius: 0 7px 7px 0 !important; +} +.form-control, +.form-select { + color: var(--ink); + background-color: var(--ui-surface); + border: 1px solid var(--ui-line); + border-radius: 7px !important; + font-size: 13px; + padding: 9px 12px; + min-height: 40px; + max-width: 100%; + box-shadow: none; +} +.form-select { + padding-right: 32px; +} +.form-check-input { + width: 16px; + height: 16px; + min-height: 0; + margin: 0 6px 0 0; + vertical-align: middle; + flex: 0 0 16px; +} +.form-check-input:checked { + background-color: var(--ui-accent); + border-color: var(--ui-accent); +} +label { + font-size: 12px; + color: #617367; + gap: 7px; +} +.form-grid { + gap: 16px 20px !important; +} +.form-grid label { + min-width: 0; +} +.form-grid .full { + grid-column: 1/-1; +} +textarea.form-control { + min-height: 100px; +} +input[type="file"] { + font-size: 12px; + padding: 8px; + overflow: hidden; +} +input[type="range"] { + max-width: 100%; +} +fieldset { + border: 1px solid var(--ui-line) !important; + border-radius: 9px; + padding: 14px !important; +} +legend { + float: none; + width: auto; + padding: 0 6px; + font-size: 12px; +} +.description, +.hint { + font-size: 12px !important; + line-height: 1.8 !important; + color: var(--ui-muted) !important; +} +p { + overflow-wrap: anywhere; +} +code { + color: #3b6755; + font-size: 12px; +} +.table { + font-size: 12px; + --bs-table-bg: transparent; +} +.table td, +.table th { + padding: 12px !important; + border-color: var(--ui-line); +} +.table-wrap { + overflow: auto; + border-radius: 8px; + border: 1px solid var(--ui-line); +} +.panel, +.site-card, +.card, +.camera-card, +.person-card { + background: var(--ui-surface) !important; + border: 1px solid var(--ui-line) !important; + border-radius: 11px !important; + box-shadow: 0 3px 12px #193c3204 !important; + overflow: hidden; +} +.panel { + padding: 22px !important; + margin-bottom: 18px; +} +.site-card { + padding: 22px !important; +} +.card-body { + padding: 20px; +} +.card-footer { + background: transparent; + border-top: 1px solid var(--ui-line); + padding: 12px 18px; +} +.section-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 18px !important; +} +.section-head h2 small, +.section-head h3 small { + display: none; +} +.badge { + font-size: 10px; + line-height: 1.4; + font-weight: 500 !important; + letter-spacing: 0 !important; + background: #edf4ee !important; + color: #3c7056 !important; + border: 1px solid #d6e6d9 !important; + border-radius: 5px !important; + padding: 5px 8px !important; +} +.badge.off { + background: #f7eeea !important; + border-color: #ecd9d0 !important; + color: #a66044 !important; +} +.count-pill { + display: inline-block; + padding: 2px 7px; + background: #e6ede8; + color: #4b705b; + border-radius: 5px; + font-size: 11px; + vertical-align: middle; + margin-left: 7px; +} +.group-title { + font-size: 13px !important; + color: #6a7c70; + margin: 24px 0 12px !important; + display: flex; + gap: 5px; + align-items: center; +} +.site-heading { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} +.household-context { + padding: 12px 16px !important; + border-radius: 9px !important; + background: #eaf0eb !important; + border: 1px solid var(--ui-line); + gap: 12px; + display: flex; + align-items: center; + flex-wrap: wrap; + margin-bottom: 18px !important; +} +.household-context label { + display: flex; + align-items: center; + gap: 10px; + margin: 0; +} +.household-context select { + width: auto; + max-width: 260px; + min-height: 34px; + padding-top: 6px; + padding-bottom: 6px; +} +.household-context span { + font-size: 11px; + color: var(--ui-muted); +} +#scope-back { + margin-left: auto; +} +.device-context { + border-radius: 9px; + background: #eaf0eb !important; + padding: 16px !important; + margin-bottom: 18px; +} +.device-context p { + font-size: 12px; + margin: 0 0 10px; +} +.device-context .btn.active { + background: var(--ui-accent) !important; + color: white !important; +} +.filter-row { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + margin: 0 0 18px; + padding: 0 !important; + font-size: 12px; +} +.filter-row label { + display: flex; + align-items: center; + gap: 8px; + margin: 0; +} +.filter-row select { + width: 180px; +} +.filter-row > button { + margin-left: auto; +} +.metrics { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; + margin: 0 0 22px !important; + padding: 0 !important; + background: none !important; + border: 0 !important; +} +.metrics > div { + background: var(--ui-surface); + border: 1px solid var(--ui-line); + border-radius: 9px; + padding: 14px 18px !important; + display: flex; + justify-content: space-between; + align-items: center; + border-right: 1px solid var(--ui-line) !important; +} +.metrics span { + font-size: 11px; + color: var(--ui-muted); +} +.metrics strong { + font-family: inherit; + font-size: 23px !important; + font-weight: 600; + color: var(--ui-accent); +} +.home-toolbar { + display: flex; + gap: 16px; + flex-wrap: wrap; + align-items: center; + padding: 13px 0; + margin: 0 0 7px; + border-top: 1px solid var(--ui-line); + border-bottom: 1px solid var(--ui-line); +} +.home-layout-controls { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; + margin-left: auto; +} +.home-layout-controls label { + display: flex; + align-items: center; + gap: 7px; + margin: 0; +} +.home-layout-controls select { + width: 80px !important; + min-height: 34px; + padding-top: 5px; + padding-bottom: 5px; +} +.home-layout-controls > .form-select { + width: 80px !important; +} +.inline-check { + white-space: nowrap; + font-size: 11px; +} +#home-layout-status { + margin-bottom: 18px; + font-size: 11px !important; +} +.home-card-grid { + display: grid !important; + grid-template-columns: repeat(var(--home-columns, 2), minmax(0, 1fr)); + gap: 20px !important; +} +.home-city-group { + display: block; +} +.home-card { + padding: 0 !important; + margin: 0 !important; + min-width: 0; + align-self: start; +} +.home-cover { + position: relative; + height: 178px !important; + min-height: 178px !important; + background: linear-gradient(135deg, #567d65, #203e36) !important; + overflow: hidden; +} +.home-cover img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; +} +.cover-shade { + position: absolute; + inset: 0; + background: linear-gradient(180deg, #132e2430 10%, #0e261ccc 100%); +} +.home-cover-content { + position: relative; + z-index: 1; + height: 100%; + padding: 17px 20px !important; + display: flex; + flex-direction: column; + justify-content: space-between; + background: none !important; +} +.home-cover-content h3 { + font-family: inherit !important; + font-size: 21px !important; + color: #fff !important; + margin: 0 0 6px !important; + letter-spacing: 0; +} +.home-cover-content .badge { + background: #ffffffd9 !important; + color: #244d3a !important; + border-color: transparent !important; + font-size: 10px; +} +.home-location { + font-size: 11px !important; + color: #e8f0eb !important; + line-height: 1.6; + margin: 0 !important; +} +.cover-edit { + color: #fff !important; + background: #213e3670 !important; + border: 1px solid #ffffff60 !important; + backdrop-filter: blur(8px); +} +.home-summary { + font-size: 12px; + color: var(--ui-muted); + margin-bottom: 15px; + min-height: 20px; +} +.home-numbers { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + padding: 0 0 17px; + border-bottom: 1px solid var(--ui-line); + margin-bottom: 13px; +} +.home-numbers span { + display: flex; + align-items: baseline; + gap: 7px; + color: var(--ui-muted); + font-size: 11px; +} +.home-numbers b { + font-size: 21px; + font-weight: 600; + color: var(--ink); +} +.compact-details { + margin: 0 !important; + display: grid; + gap: 7px !important; + font-size: 12px; +} +.compact-details > div { + display: grid; + grid-template-columns: 100px minmax(0, 1fr); + gap: 12px !important; + padding: 0 !important; +} +.compact-details dt { + font-weight: 400; + color: var(--ui-muted); +} +.compact-details dd { + margin: 0; + overflow-wrap: anywhere; + color: var(--ink); +} +.home-card-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 17px; + padding-top: 14px; + border-top: 1px solid var(--ui-line); +} +.home-card-actions .btn-primary { + flex: 1; +} +.home-order-actions { + display: flex; + align-items: center; + gap: 5px; + margin-bottom: 12px; +} +.home-order-actions span { + font-size: 10px; + flex: 1; +} +.home-pagination { + display: flex; + justify-content: flex-end; + align-items: center; + gap: 10px; + margin: 22px 0; +} +.home-pagination span { + margin-right: auto; + font-size: 11px; + color: var(--ui-muted); +} +.device-card-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, 330px), 1fr)); + gap: 18px; +} +.device-card { + min-width: 0; +} +.device-card-heading { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 15px; +} +.device-symbol { + width: 42px; + height: 42px; + border-radius: 10px; + background: #eaf2ec; + color: var(--ui-accent); + display: grid; + place-items: center; +} +.device-symbol .app-icon { + width: 23px; + height: 23px; +} +.device-card-heading h3 { + margin: 0 !important; + font-size: 16px !important; +} +.device-title { + padding: 0 !important; + border: 0 !important; + background: none !important; + text-align: left !important; + min-height: 0 !important; + color: var(--ink) !important; + font-weight: 600 !important; + font-size: 16px !important; + box-shadow: none !important; +} +.device-title:hover { + color: var(--ui-accent) !important; + text-decoration: underline; +} +.device-location { + font-size: 11px; + color: var(--ui-muted); + margin-bottom: 15px; +} +.device-card-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} +.device-tags { + display: flex; + flex-wrap: wrap; + gap: 5px; + margin: 12px 0 0; +} +.device-tags span { + background: #edf1ee; + font-size: 10px; + color: #667e6d; + padding: 2px 8px; + border-radius: 4px; +} +.device-view-controls { + display: flex; + flex-wrap: wrap; + gap: 12px; +} +.device-view-controls label { + display: flex; + align-items: center; + gap: 9px; +} +.group-custom { + font-size: 12px; +} +.group-step { + max-width: 100%; +} +.group-step select { + max-width: 200px; +} +.view-presets { + display: flex; + gap: 6px; + flex-wrap: wrap; +} +#device-count { + font-size: 11px !important; +} +.device-group:first-child > .group-title { + margin-top: 4px !important; +} +#asset-list .empty { + min-height: 160px; +} +.device-tags + .network-status-block { + margin-top: 12px; +} +.network-status-block { + padding-top: 12px; + margin-top: 14px; + border-top: 1px solid var(--ui-line); + font-size: 11px; +} +.network-status-title { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-bottom: 6px; +} +.network-status-title > span { + font-weight: 600; +} +.status-dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: #b4b9b5; + display: inline-block; + margin-right: 6px; +} +.status-dot.online { + background: #37a06a; + box-shadow: 0 0 0 3px #38a16a12; +} +.network-target { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 7px; + margin: 4px 0; +} +.network-target > span:first-child { + width: 65px; + color: var(--ui-muted); +} +.network-target code { + font-size: 11px; +} +.network-target > span:last-child { + margin-left: auto; + font-size: 10px; +} +.network-status-block p { + margin: 6px 0; + font-size: 11px !important; +} +.management-links { + display: flex; + gap: 6px; + flex-wrap: wrap; + margin: 9px 0; +} +.network-check-time { + font-size: 10px; + color: #8b9c90; + line-height: 1.5; + display: block; +} +.network-platform { + display: flex; + align-items: center; + gap: 15px; + background: #edf3ee; + border: 1px solid #d6e4d9; + padding: 20px; + border-radius: 10px; + margin-bottom: 16px; +} +.network-platform > .app-icon { + width: 32px; + height: 32px; + flex-basis: 32px; + color: var(--ui-accent); +} +.network-platform h3 { + margin: 0 0 3px !important; + font-size: 18px !important; +} +.network-platform p { + margin: 0; + font-size: 11px; + color: var(--ui-muted); +} +.platform-place-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); + gap: 18px; +} +.platform-place-node { + display: flex !important; + flex-direction: column; + align-items: flex-start !important; + text-align: left !important; + padding: 20px !important; + gap: 9px; + border: 1px solid var(--ui-line) !important; + position: relative; + color: var(--ink) !important; +} +.platform-place-node:hover { + border-color: #81ad90 !important; + box-shadow: 0 4px 16px #2d4b3610 !important; +} +.platform-place-node h3 { + font-size: 17px !important; + margin: 3px 0; +} +.platform-place-node p, +.platform-place-node small { + font-size: 11px; + color: var(--ui-muted); + margin: 0; +} +.network-open { + padding-top: 12px; + margin-top: auto; + color: var(--ui-accent); + font-size: 11px; +} +.network-node { + margin: 0 0 14px calc(var(--depth) * 22px); + overflow: visible !important; + position: relative; +} +.network-node.nested::before { + position: absolute; + content: ""; + border-left: 2px solid #c1d3c6; + border-bottom: 2px solid #c1d3c6; + width: 15px; + left: -17px; + top: -15px; + height: 50px; + border-bottom-left-radius: 6px; +} +.network-node .card-body { + padding: 18px; +} +.network-node .device-card-heading { + margin-bottom: 9px; +} +.network-facts { + display: flex; + flex-wrap: wrap; + gap: 8px 24px; + font-size: 11px; + color: var(--ui-muted); +} +.network-facts b { + font-weight: 500; + color: var(--ink); + margin-left: 7px; + overflow-wrap: anywhere; +} +.network-map { + overflow: hidden; +} +.network-map .network-platform { + max-width: none; +} +.network-overview { + margin-top: 18px; +} +.scope-intro { + padding: 0 !important; + margin-bottom: 24px !important; +} +.scope-intro h2 { + font-size: 24px !important; +} +.scope-intro p { + font-size: 13px !important; + color: var(--ui-muted); +} +.steward-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); + gap: 18px; +} +.steward-tile { + padding: 22px !important; + min-height: 160px !important; + background: var(--ui-surface) !important; + border: 1px solid var(--ui-line) !important; + border-radius: 10px !important; + text-align: left !important; + display: flex; + align-items: flex-start !important; + flex-direction: column; + justify-content: flex-start !important; + gap: 10px; + color: var(--ink) !important; + box-shadow: none !important; +} +.steward-tile::before { + display: none !important; +} +.steward-tile:hover { + border-color: #8caf99 !important; + background: #f9fcf9 !important; + transform: translateY(-1px); +} +.steward-tile strong { + font-family: inherit !important; + font-size: 19px !important; + font-weight: 600 !important; +} +.steward-tile span { + font-size: 12px !important; +} +.steward-tile small { + font-size: 11px !important; + color: var(--ui-muted); + line-height: 1.8; +} +.camera-meta { + padding: 16px !important; +} +.camera-meta strong { + font-size: 14px !important; +} +.camera-meta p { + font-size: 11px !important; + margin: 4px 0 !important; +} +.camera-actions { + padding: 0 16px 16px; + display: flex; + flex-wrap: wrap; + gap: 7px; +} +.camera-card { + background: var(--ui-surface) !important; +} +.live-grid { + gap: 18px; +} +.video-panel { + background: #152720 !important; +} +.video-error { + font-size: 12px; +} +.video-empty { + color: #9bad9f; +} +.wall-toolbar { + padding: 12px !important; + border-radius: 9px; + gap: 10px; +} +.wall-toolbar label { + font-size: 11px; +} +.wall-toolbar select { + width: auto; +} +#live-stage:fullscreen { + background: #101c17; +} +.wall-fullscreen .camera-card { + border-color: #284336 !important; +} +.playback-panel { + background: var(--ui-surface) !important; +} +.settings-sections { + display: flex; + gap: 7px; + flex-wrap: wrap; + margin-bottom: 20px; +} +.settings-sections .btn[aria-pressed="true"] { + background: var(--ui-accent) !important; + color: white !important; +} +.journal-card { + max-width: 100% !important; + background: var(--ui-surface) !important; + border-radius: 11px !important; + padding: 22px !important; + border: 1px solid var(--ui-line) !important; +} +.journal-attachments { + gap: 14px; +} +.journal-attachments img { + border-radius: 8px; +} +.journal-media-library { + max-width: 100%; +} +.journal-pager { + font-size: 12px; +} +.family-toolbar { + flex-wrap: wrap; +} +.family-card, +.person-card { + padding: 16px; +} +.family-detail h2 { + font-size: 20px !important; +} +dialog { + max-width: min(900px, calc(100vw - 32px)) !important; + width: 800px; + padding: 26px !important; + border: 1px solid var(--ui-line) !important; + border-radius: 14px !important; + background: var(--ui-surface) !important; + color: var(--ink) !important; + box-shadow: 0 24px 80px #0f2d3d38 !important; + max-height: calc(100dvh - 48px); + overflow: auto; + margin: auto !important; +} +dialog::backdrop { + background: #10291e70; + backdrop-filter: blur(3px); +} +dialog h2 { + font-size: 21px !important; +} +dialog .dialog-heading, +dialog > header, +dialog form > header { + padding: 0 0 18px !important; + margin: 0 0 20px !important; + border-bottom: 1px solid var(--ui-line); + display: flex; + align-items: center; + justify-content: space-between; + gap: 15px; + background: none; +} +dialog form > .form-grid { + margin-top: 5px; +} +dialog footer, +dialog .dialog-actions { + padding: 18px 0 0 !important; + margin: 20px 0 0 !important; + border-top: 1px solid var(--ui-line); + display: flex; + justify-content: flex-end; + gap: 10px; +} +#auth-dialog { + width: 420px !important; + padding: 32px !important; +} +#auth-dialog h2 { + font-size: 25px !important; +} +#auth-dialog p { + font-size: 12px; +} +#auth-form { + display: grid; + gap: 15px; +} +#auth-form label { + margin: 0; +} +.form-error { + font-size: 12px; + color: #b15a3c; + min-height: 0; +} +#toast { + position: fixed; + bottom: 24px; + right: 24px; + z-index: 200; + background: #234c39 !important; + color: #fff !important; + padding: 12px 20px !important; + border-radius: 9px !important; + font-size: 13px !important; + box-shadow: 0 6px 22px #193c3226; + max-width: calc(100vw - 32px); +} +main > footer { + padding: 22px 0 0 !important; + margin: 30px 0 0 !important; + border-top: 1px solid var(--ui-line); + font-size: 10px !important; + color: var(--ui-muted); +} +.empty { + border: 1px dashed #cfdbd2; + background: #f8faf8; + border-radius: 9px; + color: var(--ui-muted); + text-align: center; + padding: 40px 20px !important; +} +.empty h3 { + margin-top: 10px; +} +.empty p { + font-size: 12px; +} +.banner { + padding: 12px 16px; + border-radius: 8px; + font-size: 12px; +} +html[data-theme="clean"] { + --ui-bg: #f4f6f9; + --ui-accent: #31655b; + --ui-surface: #fff; +} +html[data-theme="ink"] { + --ui-bg: #14221e; + --ui-surface: #1c2e26; + --ui-line: #334a3e; + --ui-muted: #a5baad; + --ink: #e1ece5; + --bs-body-color: #e1ece5; + --bs-border-color: #334a3e; + --ui-accent: #397359; + --bs-secondary-color: #a5baad; +} +html[data-theme="ink"] .form-control, +html[data-theme="ink"] .form-select { + background-color: #20352a; + color: #e1ece5; +} +html[data-theme="ink"] .network-platform, +html[data-theme="ink"] .household-context, +html[data-theme="ink"] .device-context, +html[data-theme="ink"] .empty { + background: #213d2d !important; +} +html[data-theme="ink"] .description, +html[data-theme="ink"] label { + color: #a5baad !important; +} +html[data-theme="ink"] .btn-outline-secondary { + color: #b9cec0; + border-color: #476152; +} +html[data-density="compact"] #app > main { + padding: 20px 25px !important; +} +html[data-density="compact"] .panel, +html[data-density="compact"] .card-body { + padding: 15px !important; +} +html[data-density="compact"] .home-cover { + height: 150px !important; + min-height: 150px !important; +} +html[data-layout="top"] #app { + display: block; +} +html[data-layout="top"] .sidebar { + position: relative !important; + width: 100% !important; + height: auto; + padding: 12px 24px !important; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + gap: 12px; +} +html[data-layout="top"] .sidebar .brand { + padding: 0 15px 0 0 !important; + margin: 0 !important; + border: 0 !important; +} +html[data-layout="top"] .sidebar > .nav-label, +html[data-layout="top"] .side-note, +html[data-layout="top"] #current-user, +html[data-layout="top"] #scope-nav-name { + display: none; +} +html[data-layout="top"] .sidebar nav { + flex-direction: row !important; + flex: 1; + flex-wrap: wrap; +} +html[data-layout="top"] #scope-navigation { + display: flex; + padding: 0 !important; + margin: 0 !important; + box-shadow: none; +} +html[data-layout="top"] .sidebar nav button { + width: auto !important; + padding: 8px 10px !important; +} +html[data-layout="top"] #app > main { + margin: auto !important; + max-width: 1800px; +} +@media (min-width: 1500px) { + .home-card-grid[style] { + gap: 22px; + } +} +@media (max-width: 1200px) { + #app > main { + padding: 24px !important; + } + #app { + grid-template-columns: 210px minmax(0, 1fr); + } + .sidebar { + width: 210px !important; + padding: 24px 14px !important; + } + .home-toolbar { + align-items: flex-start; + } + .home-layout-controls { + margin-left: 0; + } + .home-card-grid { + grid-template-columns: repeat( + min(var(--home-columns, 2), 2), + minmax(0, 1fr) + ); + } + .metrics > div { + padding: 12px !important; + } + .metrics strong { + font-size: 19px !important; + } + .compact-details > div { + grid-template-columns: 90px minmax(0, 1fr); + } +} +@media (max-width: 767px) { + html, + body { + font-size: 14px; + } + #app { + display: block !important; + } + .sidebar, + html[data-layout="top"] .sidebar { + position: relative !important; + width: 100% !important; + height: auto !important; + padding: 13px 16px !important; + display: grid !important; + grid-template-columns: 1fr auto !important; + overflow: visible !important; + } + .brand, + html[data-layout="top"] .sidebar .brand { + padding: 0 !important; + margin: 0 !important; + border: 0 !important; + gap: 10px; + } + .brand-icon { + width: 34px !important; + height: 34px !important; + } + .brand > span > span { + font-size: 19px !important; + } + .brand small { + font-size: 9px !important; + margin-top: 2px; + } + .sidebar > .nav-label, + .side-note, + #current-user, + .sidebar > #account-password, + .sidebar > #logout { + display: none !important; + } + .mobile-nav-toggle { + display: flex !important; + color: #e8f1ec !important; + border: 1px solid #ffffff30 !important; + background: transparent !important; + font-size: 12px; + min-height: 36px; + } + .sidebar nav, + html[data-layout="top"] .sidebar nav { + display: none !important; + grid-column: 1/-1; + } + .sidebar.mobile-open nav, + html[data-layout="top"] .sidebar.mobile-open nav { + display: flex !important; + flex-direction: column !important; + margin-top: 15px; + } + .sidebar.mobile-open > #account-password, + .sidebar.mobile-open > #logout { + display: block !important; + } + .sidebar.mobile-open > #current-user { + display: block !important; + grid-column: 1/-1; + } + .sidebar.mobile-open > #account-password { + grid-column: 1; + } + .sidebar.mobile-open > #logout { + grid-column: 2; + } + html[data-layout="top"] #scope-navigation { + display: block; + } + .sidebar nav button { + width: 100% !important; + } + .sidebar #scope-navigation { + padding: 14px 0 !important; + } + #app > main, + html[data-density="compact"] #app > main { + padding: 20px 15px !important; + min-height: calc(100vh - 65px); + width: 100% !important; + } + main > header { + gap: 12px; + align-items: flex-start; + margin-bottom: 20px !important; + padding-bottom: 18px !important; + } + #page-title { + font-size: 22px !important; + } + #page-note { + font-size: 11px !important; + } + .eyebrow { + font-size: 9px; + margin-bottom: 5px; + letter-spacing: 1px; + } + .header-status { + font-size: 9px !important; + gap: 5px; + max-width: 100px; + white-space: normal; + text-align: right; + } + #service-status { + font-size: 9px !important; + padding: 4px 6px !important; + } + #clock { + font-size: 9px; + } + .section-head { + gap: 12px; + align-items: flex-start; + flex-wrap: wrap; + } + .section-head > .btn { + margin-left: 0; + font-size: 11px; + } + h2 { + font-size: 17px !important; + } + .home-toolbar { + gap: 13px; + } + .home-layout-controls { + gap: 9px; + width: 100%; + font-size: 11px; + } + .home-layout-controls .form-select { + min-height: 32px; + font-size: 11px; + } + .home-layout-controls .btn { + font-size: 11px; + min-height: 32px; + } + .home-card-grid { + grid-template-columns: minmax(0, 1fr) !important; + gap: 17px !important; + } + .home-cover { + height: 170px !important; + min-height: 170px !important; + } + .home-cover-content { + padding: 16px 18px !important; + } + .card-body { + padding: 17px; + } + .home-numbers b { + font-size: 21px; + } + .home-pagination { + flex-wrap: wrap; + } + .home-pagination span { + width: 100%; + } + .home-pagination .btn { + flex: 1; + } + .household-context { + padding: 10px !important; + gap: 9px; + } + .household-context label { + width: 100%; + } + .household-context select { + max-width: none; + flex: 1; + min-width: 0; + } + #household-context-note { + display: none; + } + #scope-back { + width: 100%; + margin: 0; + } + .metrics { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + } + .metrics > div { + padding: 11px 13px !important; + } + .metrics strong { + font-size: 20px !important; + } + .filter-row { + gap: 9px; + } + .filter-row label { + flex: 1; + min-width: 0; + } + .filter-row select { + width: 100%; + min-width: 0; + } + #filter-caption { + display: none; + } + .filter-row > button { + font-size: 11px; + } + .panel { + padding: 17px !important; + } + .form-grid { + grid-template-columns: minmax(0, 1fr) !important; + gap: 14px !important; + } + .form-grid > * { + min-width: 0; + grid-column: auto; + } + .form-grid .full { + grid-column: 1; + } + .site-grid, + .steward-grid, + .platform-place-grid, + .device-card-grid { + grid-template-columns: minmax(0, 1fr) !important; + } + .device-view-controls { + display: flex; + flex-direction: column; + align-items: stretch; + } + .device-view-controls label { + width: 100%; + } + .device-view-controls input, + .device-view-controls select { + width: 100%; + min-width: 0; + } + .network-node { + margin-left: calc(min(var(--depth), 2) * 12px); + } + .network-node.nested::before { + left: -10px; + width: 8px; + } + .network-node .card-body { + padding: 14px; + } + .network-facts { + display: grid; + gap: 6px; + } + .network-platform { + padding: 16px; + } + .network-platform h3 { + font-size: 16px !important; + } + .network-target { + font-size: 10px; + } + .network-target code { + font-size: 10px; + word-break: break-all; + } + .management-links a { + max-width: 100%; + font-size: 10px; + } + .network-node .device-card-heading h3 { + font-size: 14px !important; + } + .network-node .device-title { + font-size: 14px !important; + } + .device-context [role="group"] { + display: flex; + flex-wrap: wrap; + gap: 7px; + } + .device-context .btn { + flex: 1; + min-width: 100px; + font-size: 11px; + } + .steward-tile { + min-height: 145px !important; + } + .steward-tile strong { + font-size: 18px !important; + } + .journal-card { + padding: 17px !important; + } + .journal-attachments { + grid-template-columns: minmax(0, 1fr) !important; + } + .journal-attachments audio, + .journal-attachments video { + width: 100%; + max-width: 100%; + } + .journal-upload-controls { + display: flex; + flex-wrap: wrap; + } + .journal-upload-controls > * { + max-width: 100%; + } + .settings-sections { + gap: 6px; + } + .settings-sections .btn { + flex: 1; + min-width: calc(50% - 6px); + font-size: 11px; + } + dialog { + max-width: calc(100vw - 20px) !important; + padding: 20px !important; + max-height: calc(100dvh - 20px); + border-radius: 12px !important; + } + dialog h2 { + font-size: 19px !important; + } + dialog .dialog-heading { + padding-bottom: 14px !important; + margin-bottom: 16px !important; + } + dialog .dialog-heading .btn { + min-width: 54px; + } + #auth-dialog { + padding: 25px !important; + } + .brand-image-grid { + grid-template-columns: 1fr !important; + } + #toast { + bottom: 16px; + right: 16px; + font-size: 12px !important; + } + .wall-toolbar { + gap: 7px; + } + .wall-toolbar label { + width: auto; + } + .table-wrap { + max-width: 100%; + } + main > footer { + font-size: 9px !important; + gap: 10px; + flex-wrap: wrap; + } + .network-node .device-card-heading > .btn { + font-size: 10px; + min-height: 28px; + padding: 3px 7px; + } + html[data-layout="top"] .sidebar.mobile-open nav button { + width: 100% !important; + } +} + +@media (min-width: 768px) { + .sidebar > .mobile-nav-toggle { + display: none !important; + } +} +.sidebar nav button { + justify-content: flex-start !important; +} +.sidebar nav button.active::after { + display: none !important; +} +.section-head > div:first-child { + display: block; +} +.inline-check .form-check-input { + width: 16px !important; + height: 16px !important; + min-height: 0 !important; + padding: 0 !important; +} +.form-check-input { + padding: 0 !important; +} +.dialog-footer { + display: flex; + justify-content: flex-end; + gap: 10px; + margin-top: 20px; + padding-top: 18px; + border-top: 1px solid var(--ui-line); +} + +html[data-font="serif"] #page-title, +html[data-font="serif"] .scope-intro h2 { + font-family: "Noto Serif SC", "Songti SC", "SimSun", serif !important; + font-weight: 600 !important; +} +html[data-backdrop="mountains"] #app > main { + background-image: + linear-gradient(150deg, transparent 70%, #8ba58f08 70%, transparent 85%), + linear-gradient(170deg, transparent 60%, #8ba58f06 60%, transparent 90%) !important; + background-size: 100% 360px !important; + background-repeat: no-repeat !important; +} +@media (max-width: 767px) { + .form-control, + .form-select { + font-size: 16px !important; + min-height: 44px; + } + .btn { + min-height: 42px; + font-size: 13px; + } + .home-layout-controls .form-select { + font-size: 14px !important; + min-height: 40px; + } + .home-layout-controls .btn, + .network-status-title .btn, + .management-links .btn { + min-height: 40px; + font-size: 12px; + } + .network-target code { + font-size: 12px; + } + .mobile-nav-toggle { + min-height: 42px; + } + .device-card-actions .btn { + min-height: 42px; + font-size: 12px; + } +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..0f4a83b --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,3 @@ +import {defineConfig} from 'vite' +import vue from '@vitejs/plugin-vue' +export default defineConfig({plugins:[vue({template:{transformAssetUrls:false}})],base:'/ui/',build:{outDir:'../web/ui',emptyOutDir:true,assetsDir:'assets'}}) diff --git a/network_status.py b/network_status.py new file mode 100644 index 0000000..4349357 --- /dev/null +++ b/network_status.py @@ -0,0 +1,104 @@ +"""Read-only, scoped network checks for registered equipment. Never logs credentials.""" +import ipaddress +import json +import re +import socket +import subprocess +import threading +import time +from concurrent.futures import ThreadPoolExecutor + + +def safe_ip(value): + ip = ipaddress.ip_address(value) + return not (ip.is_loopback or ip.is_link_local or ip.is_multicast or ip.is_unspecified or ip.is_reserved) + + +def probe(host): + """Connect only to resolved, validated addresses, preventing DNS rebinding.""" + try: + addresses = list(dict.fromkeys(x[4][0] for x in socket.getaddrinfo(host, None, type=socket.SOCK_STREAM)))[:3] + if not addresses or not all(safe_ip(ip) for ip in addresses): + return dict(host=host, reachable=False, ports=[], error='地址不能用于设备网络探测') + except (OSError, ValueError): + return dict(host=host, reachable=False, ports=[], error='地址解析失败') + def connect(port): + for ip in addresses: + try: + with socket.create_connection((ip, port), timeout=.55): return port + except OSError: pass + return None + with ThreadPoolExecutor(max_workers=5) as pool: + ports = [port for port in pool.map(connect, (80, 443, 22, 554, 8790)) if port] + return dict(host=host, reachable=bool(ports), ports=ports, + error='' if ports else '常用服务端口未响应,设备可能离线或未开放这些服务') + + +def tail_peer(host, cidr): + if not host: return None + try: + result = subprocess.run(['tailscale', 'status', '--json'], capture_output=True, text=True, timeout=2, check=True) + status = json.loads(result.stdout) + peer = next((p for p in (status.get('Peer') or {}).values() + if host in p.get('TailscaleIPs', []) or host.lower().rstrip('.') == p.get('DNSName', '').lower().rstrip('.')), None) + if not peer: return dict(available=False, note='本机 Tailscale 未找到此节点') + routes = list(dict.fromkeys((peer.get('PrimaryRoutes') or [])+(peer.get('AllowedIPs') or []))) + # Online is control-plane presence; it does not prove the subnet is reachable. + return dict(available=True, online=bool(peer.get('Online')), active=bool(peer.get('Active')), + subnet=cidr, subnetAvailable=(cidr in routes) if cidr else None) + except (OSError, subprocess.SubprocessError, ValueError, TypeError): + return dict(available=False, note='本机暂时无法读取 Tailscale 状态') + + +def management_links(results): + links=[] + for item in results: + host=item['host']; authority='['+host+']' if ':' in host else host + try: + if not safe_ip(host):continue + except ValueError: + if not re.fullmatch(r'[A-Za-z0-9.-]{1,253}',host):continue + ports=item.get('ports',[]) + port=next((p for p in (443,80,8790) if p in ports),80) + scheme='https' if port==443 else 'http' + links.append(dict(kind=item['kind'],url=scheme+'://'+authority+(':'+str(port) if port==8790 else '')+'/',port=port,verified=port in ports)) + return links + + +class NetworkStatus: + def __init__(self, app): + self.a=app; self.cache={}; self.lock=threading.Lock(); self.gates={} + + def read(self, user, query): + a=self.a + if not a.HOUSEHOLDS.manager(user): raise a.Problem('此操作需要家庭管理员权限',403) + table={'device':'devices','camera':'assets','recorder':'recorders'}.get(query.get('source')) + if not table: raise a.Problem('设备类型不正确') + item=next((d for d in a.HOUSEHOLDS.objects(user,table) if d['id']==query.get('id')),None) + if not item: raise a.Problem('设备不存在或未获授权',404) + hosts=[] + direct=item.get('host') if table=='recorders' else item.get('managementHost') + if table=='assets': + direct=next((c.get('host') for c in a.HOUSEHOLDS.objects(user,'cameras') if c.get('assetId')==item['id'] and c.get('sourceKind')!='recorder' and c.get('host')),direct) + for kind,host in [('local',direct),('tailscale',item.get('tailscaleHost'))]: + if host and host not in [h[1] for h in hosts]: hosts.append((kind,host)) + key=(a.HOUSEHOLDS.family_of(item),table,item['id'],tuple(hosts),item.get('networkCidr','')) + with self.lock: + if key in self.cache and time.monotonic()-self.cache[key][0]<30:return {**self.cache[key][1],'cached':True} + # Cap concurrency and collapse repeated requests to the same device. + if key in self.gates:raise a.Problem('正在检查该设备,请稍后再试',429) + if len(self.gates)>=4:raise a.Problem('网络检查繁忙,请稍后再试',429) + self.gates[key]=True + try: + with ThreadPoolExecutor(max_workers=3) as pool: + futures=[(kind,pool.submit(probe,host)) for kind,host in hosts] + tail=pool.submit(tail_peer,item.get('tailscaleHost',''),item.get('networkCidr','')) + targets=[dict(f.result(),kind=kind) for kind,f in futures] + result=dict(id=item['id'],source=query['source'],checkedAt=time.time(),targets=targets,tailscale=tail.result(),links=management_links(targets),cached=False) + with self.lock: + self.cache={k:v for k,v in self.cache.items() if time.monotonic()-v[0]<30} + if len(self.cache)>=256:self.cache.pop(next(iter(self.cache))) + self.cache[key]=(time.monotonic(),result) + return result + finally: + with self.lock:self.gates.pop(key,None) diff --git a/test-support/ui-source.js b/test-support/ui-source.js new file mode 100644 index 0000000..23859c8 --- /dev/null +++ b/test-support/ui-source.js @@ -0,0 +1,2 @@ +const fs=require('node:fs'),path=require('node:path'); +module.exports=()=>['AppSidebar','AppHeader','Workspace','RuntimeOverlays','HomeExplorer','DeviceCollection','NetworkMap'].map(name=>fs.readFileSync(path.join(__dirname,'../frontend/src/components',name+'.vue'),'utf8')).join('\n'); diff --git a/test_app.py b/test_app.py index a02dc8c..a2bb027 100644 --- a/test_app.py +++ b/test_app.py @@ -97,7 +97,7 @@ class WebTests(unittest.TestCase): def test_live_quality_has_only_main_and_sub(self): code, _, body = self.request('/', False) self.assertEqual(code, 200) - select = re.search(r'', body.decode()).group(1) + select = re.search(r'', (app.ROOT/'frontend/src/components/Workspace.vue').read_text(encoding='utf8')).group(1) self.assertEqual(re.findall(r'', select), [('hd', '主码流'), ('compat', '子码流')]) @@ -106,12 +106,13 @@ class WebTests(unittest.TestCase): self.assertEqual(code, 200) self.assertEqual(headers['Cache-Control'], 'no-store') self.assertNotIn(b'__ASSET_VERSION__', body) - assets = re.findall(r'(?:src|href)="(/[^"?]+\.(?:js|css)\?v=[^"]+)"', body.decode()) - self.assertEqual(len(assets), 29) - version = (app.ROOT / 'VERSION').read_text().strip() + assets = re.findall(r'(?:src|href)="(/ui/assets/[^"?]+\.(?:js|css))"', body.decode()) + self.assertEqual(len(assets), 2) for asset in assets: - self.assertTrue(asset.endswith('?v=' + version)) + self.assertRegex(asset,r'/ui/assets/index-[A-Za-z0-9_-]+\.(js|css)$') self.assertEqual(self.request(asset, False)[0], 200) + for path in ['/ui/assets/../../vision.db','/ui/assets/missing.js','/ui/index.html']: + self.assertEqual(self.request(path,False)[0],404) def test_origin_rejected(self): self.assertEqual(self.request('/api/storage', data={}, origin='https://example.org')[0], 403) diff --git a/test_daily_flow.js b/test_daily_flow.js index 336383f..821b5fd 100644 --- a/test_daily_flow.js +++ b/test_daily_flow.js @@ -62,7 +62,7 @@ test('mobile navigation toggles an accessible control without changing scope',() c.setMobileMenu(false);assert.equal(opened,false);assert.equal(button['aria-expanded'],'false'); }); test('mobile forms use readable inputs, touch targets and bounded dialogs',()=>{ - const css=source('chinese-theme.css'),html=source('index.html'); + const css=source('chinese-theme.css'),html=require('./test-support/ui-source')(); assert.match(css,/font-size:16px!important;min-height:44px/); assert.match(css,/max-height:90dvh/);assert.match(css,/sidebar:not\(\.mobile-open\)>nav/); assert.match(html,/aria-controls="main-navigation"/); diff --git a/test_households_ui.js b/test_households_ui.js index 80d87b7..6bbbcba 100644 --- a/test_households_ui.js +++ b/test_households_ui.js @@ -68,7 +68,7 @@ test('a stale post-save refresh does not show a new-session warning',async()=>{ }); test('storage guide names cloud categories and avoids old all-local claims',()=>{ - const html=fs.readFileSync('web/index.html','utf8'); + const html=require('./test-support/ui-source')(); assert.ok(html.includes('id="baidu-storage-guide"')); for(const label of ['家庭与场所:','平台外观:','个人记事:','数据库备份:'])assert.ok(html.includes(label)); assert.ok(!html.includes('自有部署 · 本地存储'));assert.ok(!app.includes('数据存于本机')); diff --git a/test_journal.js b/test_journal.js index 9846a02..6b24c87 100644 --- a/test_journal.js +++ b/test_journal.js @@ -11,7 +11,7 @@ test('browser hashes in 4 MiB slices rather than loading the entire video',async await assert.rejects(hash.blocks(file,()=>{},()=>false),/取消/); }); test('journals default to private and encode content before rendering',()=>{ - const html=fs.readFileSync('web/index.html','utf8'),js=fs.readFileSync('web/journal.js','utf8'); + const html=require('./test-support/ui-source')(),js=fs.readFileSync('web/journal.js','utf8'); assert.match(html,/ - -
设备—
已接通码流—
录像占用—
空间档案—
-
可选择任意区域,包含其下级区域
- - - - -

本场所监控墙

这里汇总当前场所内已授权的镜头;点击摄像头详情可进入单台设备。

主码流画面更清晰,最高 1920×1080;子码流更流畅,最高 768×432,适合网络较慢时使用。

- - - - - - - - - - - - -
灯火可亲 · 归家有时

欢迎回来

使用自己的账号,进入家庭空间。

-

设备档案

网络与连接

保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。

手机、灯、冰箱等当前支持设备档案、分类和责任归属。自动控制需另行接入对应协议,登记不代表已连接设备。

-

传承资料

这里只保存资料和意愿;不会据此转移财产或授予任何账号权限。链接内容保存在原位置,本系统保存链接和文字记录。

-

空间档案

-

镜头通道配置

直接接入摄像头时,可读取设备实际提供的媒体配置。端口请按设备填写:通常为 80,部分 TP-Link 设备为 2020。服务器需要能够访问该设备所在网络。

账号和密码只保存在本机受限数据目录。RTSP 服务响应代表设备可达,实际码流接通后才显示在线。路径预设需要与设备型号、通道一致。

-

摄像头对象

网络与连接

保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。

-

录像机配置

网络与连接

保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。

驱动在当前版本提供路径模板。录像机历史录像检索、回放及通道自动导入,需要型号确认后接入,当前尚未实现。

-

负责人安排与交接

先建立至少两位家庭 / 场所管理员,再指定主要和备用负责人。家庭的主要负责人即一家之主;备用负责人已具有本归属管理权限,意外发生也能继续管理。正式交接由当前主要负责人或超级管理员办理。

交接后原负责人仍保留本归属的管理员权限。系统不会依据未登录或家谱去世日期自动转移权限;交接记录可追溯。

-

家庭 / 场所档案

照片仅向有权进入该家庭或场所的账号开放。

创建后进入该归属,建立管理员,再自行划分区域和登记设备。

-

账号档案

允许查看摄像头的空间

普通成员只访问本归属内已授权的区域。默认仅授权所选区域;勾选“包含下级区域”后同时包含其所有后代。管理员可管理本归属全部区域。

- -

家谱人物

出生日期日期不详可留空
籍贯(祖籍)
出生地

籍贯与出生地可不同;选择中国、世界或自定义地域,不详的层级可留空。

-

连接人物关系

每条亲子关系连接一位父母与一位子女。录入另一位父母时,再建立一条关系。

-

写一则家族记事

事情发生的日期 *
关联人物(可多选)

未选择人物时记为全家记事。每位关联人物的档案都可以追溯到这条记事。

正式发布后,有家谱查看权限的账号即可在时间线看到;草稿只对有编辑权限的人可见。

-
家事 · 家声
-

修改记录

人物、关系与记事每次保存都会留存版本。仅有家谱编辑权限的账号可查阅和恢复。

-

修改我的密码

保存后,这个账号在所有设备上都需要用新密码重新登录。

-

摄像机参数

图像与日夜模式

作用于当前物理镜头,主、子码流共用这些图像参数。

码流与清晰度

作用于上方选定的码流。保存后画面可能短暂重连,录像机也会使用调整后的码流。本页保留原有视频编码。

其他萤石功能的接入情况
  • 云台方向微调与预置位:在实时画面的“云台”中使用,按设备能力启用。
  • 实时声音与全屏:通过画面播放器控制。
  • 双向对讲、智能追踪、声光告警、隐私遮蔽、设备翻转、云录像和消息推送:当前尚未接入,请使用萤石 App。
  • 录像机原有录像:仍通过录像机或原厂 App 查看;本系统已支持本机额外录像的回放。

功能按设备实际开放能力逐项接入,型号与固件不同可能有差异。

- -

画面截图

当前视频画面截图

下载 PNG 图片
-

附件预览

- - diff --git a/web/steward.js b/web/steward.js index ba98473..e93844a 100644 --- a/web/steward.js +++ b/web/steward.js @@ -15,12 +15,12 @@ function deviceCameras(cameras,context=deviceContext){ if(context.source==='recorder')return cameras.filter(c=>c.recorderId===context.id||c.archiveRecorderId===context.id); return []; } -function enterDevice(source,id,tab='device'){ +function enterDevice(source,id,tab='auto'){ const device=ZhaoDevices.catalog(state).find(d=>d.source===source&&d.id===id); if(!device){toast('该设备不存在或未获授权');return;} stopPlayers();resetPlayback();if(typeof closePtz==='function')closePtz(); const returnSite=$('#site-filter').value;$('#site-filter').value='';deviceContext={source,id,returnSite};scopeEntered=true; - showPage(tab==='device'&&source==='camera'&&deviceCameras(state.cameras).length?'live':tab); + showPage(tab==='auto'?(source==='camera'&&deviceCameras(state.cameras).length?'live':'device'):tab); } function renderSteward(){ const home=currentHome(),device=selectedDevice(),within=loggedIn&&scopeEntered&&!!home; diff --git a/web/ui/assets/index-DxbM73EL.css b/web/ui/assets/index-DxbM73EL.css new file mode 100644 index 0000000..49cbc9b --- /dev/null +++ b/web/ui/assets/index-DxbM73EL.css @@ -0,0 +1 @@ +@charset "UTF-8";:root{font-family:Inter,Microsoft YaHei,system-ui,sans-serif;color:#dae4e6;background:#10191d;font-synthesis:none;--muted:#8faaaF;--line:#2b3b40;--panel:#18252b;--accent:#74d5bb}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit}button,.button{border:1px solid transparent;background:var(--accent);color:#153b31;padding:11px 18px;border-radius:8px;font-weight:600;cursor:pointer;white-space:nowrap;text-decoration:none;font-size:14px}button:hover,.button:hover{filter:brightness(1.08)}button:disabled{opacity:.5;cursor:wait}.secondary{background:#263a40;color:#cfe7e5;border-color:#385058}.quiet{background:transparent;border-color:var(--line);color:var(--muted);padding:9px 13px;font-size:13px}input,select{background:#111e24;border:1px solid #3a4e55;color:#e3f0ef;border-radius:7px;padding:10px 11px;min-width:0;max-width:100%;outline:none}input:focus,select:focus{border-color:var(--accent)}label{font-size:13px;color:#a5bec1;display:flex;gap:8px;align-items:center}h1,h2,h3,p{margin-top:0}h1{font-size:30px;letter-spacing:1px;margin:8px 0}h2{font-size:19px;font-weight:600}h3{font-size:16px}p{line-height:1.8}small{font-weight:400}.sidebar{position:fixed;left:0;top:0;bottom:0;width:238px;background:#111e24;border-right:1px solid var(--line);padding:32px 20px;display:flex;flex-direction:column}.brand{display:flex;gap:12px;align-items:center;color:#e9f3f1;text-decoration:none;font-size:21px;font-weight:600;padding:5px 8px 40px}.brand-icon{color:var(--accent);font-size:39px}.brand small{display:block;font-size:9px;letter-spacing:1.1px;margin-top:7px;color:var(--muted)}.nav-label{color:#6b868b;font-size:11px;letter-spacing:3px;padding:14px 15px}nav{display:grid;gap:8px}nav button{text-align:left;background:transparent;color:#8fa9ae;display:flex;gap:15px;font-size:18px;padding:14px 16px}nav button span{font-size:14px}nav button.active{background:#244038;color:#9ee8d3}.side-note{margin-top:auto;padding:20px 9px;font-size:12px;color:#8ebdb1}.side-note p{color:#5e8086;font-size:11px;margin:16px 0}.dot{display:inline-block;width:7px;height:7px;background:#7bd5b5;border-radius:50%;margin-right:5px}main{margin-left:238px;padding:38px 42px 18px;max-width:1800px}header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:27px}.eyebrow{font-size:10px;letter-spacing:3px;color:#77aa9e}header p{color:var(--muted);font-size:13px;margin:0}.header-status{display:grid;justify-items:end;gap:13px;padding-top:4px;font-size:11px;color:#718f96}.badge{font-size:11px;background:#243c36;color:#8bddbd;padding:6px 10px;border-radius:5px}.badge.off{background:#372d27;color:#d7ae87}.metrics{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line);background:#152329;border-radius:12px;overflow:hidden}.metrics>div{padding:21px 25px;border-right:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:10px}.metrics>div:last-child{border:0}.metrics span{font-size:12px;color:var(--muted)}.metrics strong{font-size:26px;font-weight:500}.filter-row{display:flex;gap:16px;align-items:center;margin:26px 0;color:#728c93;font-size:12px}.filter-row select{max-width:280px}.section-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:28px 0 17px}.section-head h2{margin:0}.section-head small{font-size:9px;color:#637f87;letter-spacing:2px;margin-left:12px}.section-head>div{display:flex;align-items:center;gap:16px}.live-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.camera-card{border:1px solid var(--line);border-radius:11px;background:var(--panel);overflow:hidden}.camera-card .video-panel{border:0;border-radius:0;margin:0}.video-panel{position:relative;aspect-ratio:16/9;background:#070e12;overflow:hidden;border:1px solid var(--line);border-radius:10px;margin-bottom:16px}.video-panel video{width:100%;height:100%;object-fit:contain;display:block}.video-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:13px;color:#5c7b85;font-size:13px;pointer-events:none;background:radial-gradient(ellipse at center,#142a32 0,transparent 70%)}.video-empty .lens{font-size:36px;color:#456773}.video-error{position:absolute;left:14px;right:14px;bottom:48px;background:#271d1ce6;border-radius:6px;color:#e3b7a1;padding:9px 12px;font-size:12px}.camera-meta{display:flex;justify-content:space-between;gap:12px;padding:16px 18px}.camera-meta strong{font-size:14px}.camera-meta p{color:#728f96;font-size:11px;margin:6px 0 0}.camera-meta .badge{align-self:flex-start}.camera-actions{display:flex;gap:8px;padding:0 18px 14px}.camera-actions button{font-size:11px;padding:7px 10px}.empty{grid-column:1/-1;padding:62px 20px;text-align:center;background:var(--panel);border:1px dashed #354b52;border-radius:12px;color:#819da5}.empty h3{font-size:19px;color:#c4d5d6;font-weight:500}.empty p{font-size:13px;margin-bottom:22px}.panel{padding:22px;background:var(--panel);border:1px solid var(--line);border-radius:10px;margin-bottom:18px}.playback-controls{display:flex;align-items:end;gap:15px;flex-wrap:wrap}.playback-controls label{display:grid}.playback-controls>span{font-size:12px;color:var(--muted);margin:auto 0}.timeline-head{display:flex;justify-content:space-between;font-size:12px;margin-bottom:20px}.timeline-head span{color:var(--muted)}.legend{display:inline-block;background:var(--accent);width:15px;height:6px;margin-right:7px}#timeline{width:100%;height:76px;display:block;cursor:crosshair}.time-labels{display:flex;justify-content:space-between;font-size:10px;color:#74949c}.seek-row{margin-top:22px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}.recording-list{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.recording-item{text-align:left;background:#203139;color:#bdd5d8;font-size:12px;border:1px solid var(--line);white-space:normal}.recording-item small{display:block;color:#719499;margin-top:7px}.discovery{display:flex;align-items:center;gap:14px}.discovery>div{margin-right:auto}.discovery p{font-size:12px;color:var(--muted);margin:5px 0 0}.discovery input{width:190px}.scan-chip{display:inline-flex;gap:16px;align-items:center;margin:0 12px 14px 0;padding:12px 16px;border:1px solid var(--line);border-radius:8px;font-size:13px}.scan-chip button{padding:6px 10px;font-size:11px}.table-wrap{overflow:auto}.device-table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);font-size:13px}.device-table th{text-align:left;font-size:11px;color:#8ba9ae;font-weight:400;padding:15px}.device-table td{padding:18px 15px;border-top:1px solid var(--line)}.device-table td small{display:block;margin-top:7px;color:#75969d}.site-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.site-card{background:var(--panel);border:1px solid var(--line);padding:24px;border-radius:10px}.site-heading{display:flex;justify-content:space-between;gap:12px}.site-card h3{margin:12px 0}.site-card dl{font-size:12px}.site-card dl>div{display:flex;gap:18px;padding:7px 0}.site-card dt{color:#718d94;width:80px;flex-shrink:0}.site-card dd{margin:0;color:#b6cccf;word-break:break-word}.description{font-size:12px;color:var(--muted);line-height:1.9}.storage-grid{display:grid;grid-template-columns:1fr 1.2fr;gap:22px}.storage-grid form>label{display:grid;margin:20px 0}.storage-grid dl{font-size:13px}.storage-grid dl div{display:flex;justify-content:space-between;gap:15px;padding:15px 0;border-bottom:1px solid var(--line)}.storage-grid dt{color:var(--muted)}.storage-grid dd{margin:0}.audit-item{font-size:11px;padding:10px 0;border-top:1px solid var(--line);color:#9ab8bd}.audit-item small{display:block;color:#607f89;margin-bottom:5px}.banner{background:#493c24;border:1px solid #6b5430;color:#e1c69a;border-radius:8px;padding:13px 17px;font-size:13px;margin-bottom:22px}dialog{color:#dae4e6;background:#192a31;border:1px solid #3b555d;border-radius:15px;width:min(760px,94vw);max-height:90vh;padding:30px;box-shadow:0 25px 120px #0008}dialog::backdrop{background:#061015dd;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}#auth-dialog{max-width:430px;padding:38px}#auth-form h2{font-size:28px;margin:18px 0 10px}#auth-form>label{display:grid;margin:22px 0}#auth-form p{color:#93afb5;font-size:13px}.dialog-heading{display:flex;justify-content:space-between;align-items:center;margin-bottom:25px}.dialog-heading h2{margin:0}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.form-grid label{display:grid;gap:8px}.form-grid .check{display:flex}.check input{accent-color:var(--accent);width:16px;height:16px}.dialog-footer{display:flex;justify-content:flex-end;margin-top:20px;padding-top:20px;border-top:1px solid var(--line)}.form-error{font-size:12px;color:#efab97;line-height:1.6}.wide{width:100%}footer{font-size:10px;color:#54727c;display:flex;justify-content:space-between;margin-top:40px;padding-top:18px;border-top:1px solid var(--line)}#toast{position:fixed;bottom:28px;left:50%;transform:translate(-50%);border:1px solid #4a7d70;background:#1a3c32;color:#b5efd9;padding:13px 22px;border-radius:9px;z-index:5;box-shadow:0 10px 30px #0005;font-size:13px}:focus-visible{outline:2px solid var(--accent);outline-offset:3px}@media(min-width:1600px){.live-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:1100px){.sidebar{width:190px;padding:25px 14px}.brand{font-size:17px}.brand-icon{font-size:30px}.brand small{font-size:8px}main{margin-left:190px;padding:25px}.metrics>div{padding:18px 14px}.metrics strong{font-size:22px}.storage-grid{grid-template-columns:1fr}.section-head small{display:none}}@media(max-width:760px){.sidebar{position:static;width:auto;padding:18px 16px 8px;border-right:0;border-bottom:1px solid var(--line)}.brand{padding:0 3px 16px}.brand small{font-size:9px}.sidebar nav{display:flex;gap:3px;overflow:auto}.sidebar nav button{padding:10px;font-size:14px;gap:6px}.sidebar nav button span{font-size:11px}.nav-label,.side-note,.sidebar #logout{display:none}main{margin:0;padding:23px 16px}h1{font-size:25px}.header-status{font-size:9px}.metrics{grid-template-columns:1fr 1fr}.metrics>div{border-bottom:1px solid var(--line)}.metrics>div:nth-child(2){border-right:0}.live-grid,.site-grid{grid-template-columns:1fr}.filter-row{flex-wrap:wrap;gap:10px}.filter-row>span{display:none}.filter-row select{max-width:200px}.section-head{align-items:start}.section-head>div{flex-wrap:wrap;justify-content:flex-end;gap:8px}.section-head button{padding:9px 11px;font-size:12px}.section-head h2{font-size:16px}.section-head label{font-size:11px}.section-head select{padding:6px}.discovery{flex-wrap:wrap}.discovery>div{width:100%}.discovery input{flex:1}.recording-list{grid-template-columns:1fr 1fr}.timeline-head{gap:10px;font-size:10px}.form-grid{gap:13px}.form-grid label{font-size:12px}dialog{padding:23px}.form-grid .full{grid-column:1/-1}.playback-controls label{flex:1}.video-empty{font-size:11px}.camera-meta{padding:14px}.seek-row label{width:100%}#auth-dialog{padding:30px}footer{font-size:9px}}.sidebar{overflow-y:auto}.sidebar .brand{padding-bottom:18px}.sidebar nav{gap:3px}.sidebar nav button{padding-top:10px;padding-bottom:10px}.sidebar .side-note{padding-bottom:0}.sidebar .side-note p{display:none}textarea{font:inherit;color:#e3f0ef;background:#111e24;border:1px solid #3a4e55;border-radius:7px;padding:10px;resize:vertical;max-width:100%}textarea:focus{outline:2px solid var(--accent)}fieldset{border:1px solid var(--line);border-radius:8px;padding:15px}legend{color:var(--muted);font-size:13px}#user-sites{display:flex;flex-wrap:wrap;gap:16px}.family-toolbar{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.family-toolbar>span{margin-left:auto;font-size:12px;color:var(--muted)}.family-layout{display:grid;grid-template-columns:260px minmax(0,1fr);gap:20px;align-items:start}.family-people{display:grid;gap:10px;max-height:720px;overflow:auto}.person-card{text-align:left;display:grid;gap:8px;white-space:normal;background:var(--panel);color:#dae4e6;border:1px solid var(--line);padding:18px}.person-card.selected{border-color:var(--accent);background:#234037}.person-card span{font-size:12px;color:var(--accent)}.person-card small{font-size:11px;color:var(--muted)}#family-detail .section-head{margin-top:0}#family-detail h2{margin:10px 0}.family-prose{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px}.family-link{display:flex;gap:15px;justify-content:space-between;align-items:center;padding:12px 0;border-bottom:1px solid var(--line);font-size:13px}.family-link small{display:block;color:var(--muted);margin-top:7px}.family-tree{display:grid;grid-template-columns:1fr 1fr;gap:25px;overflow:auto}.family-tree ul{padding-left:20px;list-style:none;border-left:1px solid #3f6359}.family-tree li{padding:6px 0}.family-tree button{max-width:100%;white-space:normal}.family-tree small{color:var(--muted);font-size:11px}.family-spouses{grid-column:1/-1}#family-error:empty{display:none}.family-people .empty{padding:30px 12px}.family-people .empty h3{font-size:16px}#current-user{font-size:12px;margin:12px 0}@media(max-width:900px){.family-layout{grid-template-columns:1fr}.family-people{grid-template-columns:repeat(2,minmax(0,1fr));max-height:350px}.family-tree{grid-template-columns:1fr}.family-spouses{grid-column:auto}.family-toolbar label{flex-wrap:wrap}.family-toolbar input{width:100%}}@media(max-width:760px){.sidebar #logout{display:block;align-self:flex-end}.sidebar #current-user{position:absolute;right:130px;top:15px;font-size:10px}.form-grid{grid-template-columns:1fr}.family-tree ul{padding-left:12px}}#family-detail dl{display:grid;grid-template-columns:1fr 1fr;gap:14px 28px;margin:20px 0 26px}#family-detail dl>div{display:grid;grid-template-columns:105px 1fr;gap:10px;border-bottom:1px solid var(--line);padding-bottom:10px}#family-detail dt{font-size:12px;color:var(--muted)}#family-detail dd{margin:0;font-size:13px;overflow-wrap:anywhere}@media(max-width:1000px){#family-detail dl{grid-template-columns:1fr}}.brand-icon{width:44px;height:44px;object-fit:cover;border-radius:12px;flex-shrink:0}.wall-toolbar{display:flex;align-items:center;gap:15px;flex-wrap:wrap;margin:16px 0}.wall-toolbar select{padding:8px}.wall-paging{display:flex;align-items:center;gap:9px;color:var(--muted);font-size:12px}#wall-clock{margin-left:auto;color:var(--muted);font-size:12px}.live-grid[data-layout="1"]{grid-template-columns:1fr}.live-grid[data-layout="2"],.live-grid[data-layout="4"]{grid-template-columns:repeat(2,minmax(0,1fr))}.live-grid[data-layout="6"],.live-grid[data-layout="9"]{grid-template-columns:repeat(3,minmax(0,1fr))}.live-grid[data-layout="16"]{grid-template-columns:repeat(4,minmax(0,1fr))}.wall-reorder{display:none;padding:8px 12px;align-items:center;gap:8px}.arranging .wall-reorder{display:flex}.wall-reorder span{cursor:grab;margin-right:auto;font-size:12px;color:var(--muted)}.wall-reorder button{padding:4px 9px;font-size:11px}#page-live:fullscreen{background:#070f12;padding:12px;width:100vw;height:100dvh;display:flex;flex-direction:column;overflow:hidden}#page-live:fullscreen>.section-head,#page-live:fullscreen>#quality-note{display:none}#page-live:fullscreen .wall-toolbar{margin:0 0 10px;flex-shrink:0}#page-live:fullscreen .live-grid{flex:1;min-height:0;gap:8px;grid-template-rows:repeat(2,minmax(0,1fr))}#page-live:fullscreen .live-grid[data-layout="1"],#page-live:fullscreen .live-grid[data-layout="2"]{grid-template-rows:1fr}#page-live:fullscreen .live-grid[data-layout="9"]{grid-template-rows:repeat(3,minmax(0,1fr))}#page-live:fullscreen .live-grid[data-layout="16"]{grid-template-rows:repeat(4,minmax(0,1fr))}#page-live:fullscreen .camera-card{display:flex;flex-direction:column;min-height:0;position:relative}#page-live:fullscreen .video-panel{flex:1;min-height:0;aspect-ratio:auto}#page-live:fullscreen .camera-meta{padding:7px 10px;align-items:center}#page-live:fullscreen .camera-meta p,#page-live:fullscreen .camera-meta .badge{display:none}#page-live:fullscreen .camera-meta strong{font-size:12px}#page-live:fullscreen .camera-actions{position:absolute;bottom:34px;right:6px;padding:4px;background:#10191ddd;border-radius:6px;opacity:0}#page-live:fullscreen .camera-card:hover .camera-actions,#page-live:fullscreen .camera-card:focus-within .camera-actions{opacity:1}#page-live:fullscreen .camera-actions [data-edit-camera],#page-live:fullscreen .camera-actions [data-play-camera]{display:none}.ptz-panel{background:#1a3038;border:1px solid #41656c;border-radius:12px;padding:16px;display:flex;align-items:center;gap:22px;position:fixed;bottom:22px;right:22px;z-index:4;max-width:calc(100vw - 32px);box-shadow:0 12px 50px #0008}.ptz-panel p{font-size:12px;color:var(--muted);max-width:320px;margin:8px 0 0}.ptz-pad{display:grid;grid-template-columns:repeat(3,46px);grid-template-rows:repeat(3,40px);gap:4px}.ptz-pad button{padding:5px;font-size:17px}.ptz-pad [data-ptz-action=up]{grid-column:2}.ptz-pad [data-ptz-action=left]{grid-column:1;grid-row:2}.ptz-pad [data-ptz-action=stop]{grid-column:2;grid-row:2;background:#f0bda6;font-size:12px}.ptz-pad [data-ptz-action=right]{grid-column:3;grid-row:2}.ptz-pad [data-ptz-action=down]{grid-column:2;grid-row:3}.family-date{border:1px solid var(--line);border-radius:8px;padding:14px;margin:0;min-width:0}.family-date legend{font-size:13px;color:#a5bec1}.family-date label{margin-bottom:10px}.family-date output{display:block;font-size:12px;line-height:1.7;color:var(--accent)}@media(max-width:760px){.wall-toolbar{gap:9px}#wall-clock{display:none}.camera-meta strong{font-size:12px}.camera-actions{flex-wrap:wrap;padding:0 8px 8px}.camera-meta{padding:9px}.ptz-panel{flex-wrap:wrap;gap:12px}.ptz-panel>div:first-child{flex:1;min-width:160px}.family-date{grid-column:1/-1}#page-live:fullscreen .camera-actions{opacity:1}.live-grid[data-layout="16"] .camera-meta strong{font-size:9px}}#page-live:fullscreen .live-grid[data-layout=auto]{grid-template-columns:repeat(3,minmax(0,1fr))}.wall-reorder [data-wall-drag]{touch-action:none;-webkit-user-select:none;user-select:none;padding:5px 0}.camera-card.wall-drop-target{outline:2px solid var(--accent);outline-offset:-3px}#camera-settings-dialog{width:min(1060px,94vw)}#camera-settings-info dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:18px 0 24px;padding:16px;border:1px solid var(--line);border-radius:10px}#camera-settings-info dt{font-size:12px;color:var(--muted);margin-bottom:6px}#camera-settings-info dd{font-size:13px;margin:0;overflow-wrap:anywhere}#camera-image-fields,#camera-video-fields{grid-template-columns:repeat(3,minmax(0,1fr))}#camera-settings-status:empty{display:none}#camera-settings-dialog details{margin-top:20px;color:var(--muted);font-size:13px;line-height:1.8}#page-live:fullscreen .camera-actions [data-camera-settings]{display:none}@media(max-width:700px){#camera-settings-info dl,#camera-image-fields,#camera-video-fields{grid-template-columns:1fr 1fr}}@media(max-width:420px){#camera-settings-info dl,#camera-image-fields,#camera-video-fields{grid-template-columns:1fr}}.ptz-panel{width:620px;display:grid;grid-template-columns:1fr auto;max-height:80dvh;overflow:auto;align-items:start}.ptz-panel>div:first-child{grid-column:1}.ptz-panel .ptz-pad{grid-column:2;grid-row:1/3}#ptz-presets{grid-column:1/-1;min-width:0;border-top:1px solid var(--line);padding-top:12px}#ptz-presets .section-head{margin:0;gap:10px}#ptz-presets p{max-width:none;line-height:1.6}#preset-count{color:var(--muted);font-size:12px}.preset-row{display:flex;align-items:center;gap:5px;padding:9px 0;border-bottom:1px solid var(--line);flex-wrap:wrap}.preset-row strong{font-size:13px;flex:1;overflow-wrap:anywhere}.preset-row button{padding:5px 8px;font-size:12px}#preset-form{display:flex;align-items:end;gap:10px;margin-top:12px}#preset-form label{flex:1;margin:0}#preset-name{width:100%}#preset-confirmation{padding:12px;background:#553b31;border-radius:8px;margin-top:10px}#ptz-close{justify-self:start}.playback-tools{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0}.playback-tools .check{margin:0}.clip-editor{border-top:1px solid var(--line);padding-top:12px}.clip-editor summary{cursor:pointer;margin-bottom:14px}#snapshot-dialog{width:min(1000px,92vw)}#snapshot-image{width:100%;max-height:65vh;object-fit:contain;background:#000;border-radius:8px}#play-position{font-size:13px;color:var(--muted)}@media(max-width:600px){.ptz-panel{right:12px;bottom:12px;padding:12px;gap:12px}.ptz-panel .ptz-pad{grid-column:2}#preset-form{flex-wrap:wrap}#preset-form label{flex-basis:100%}}.settings-sections,.view-presets{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0 22px}.settings-sections button[aria-pressed=true],.view-presets button[aria-pressed=true]{background:var(--accent,#30594e);color:var(--paper,#fff);border-color:var(--accent,#30594e)}.group-custom{margin:16px 0}.group-custom summary{cursor:pointer;padding:10px 0}.device-search-row>button{align-self:end}.journal-entry.just-saved{outline:2px solid var(--accent,#30594e);outline-offset:4px;scroll-margin-block:24px}.family-workspace{display:grid;grid-template-columns:minmax(0,1fr) 310px;gap:18px;align-items:start}.family-canvas-panel{background:#17262b;border:1px solid #39504f;border-radius:14px;overflow:hidden;min-width:0}.family-map-heading{padding:22px 22px 16px;display:flex;justify-content:space-between;align-items:center;gap:14px}.family-map-heading h2{font-size:23px;margin:8px 0 0;letter-spacing:2px}.family-map-heading .eyebrow{font-size:9px}.family-view-tabs{display:flex;border:1px solid var(--line);border-radius:8px;padding:3px;flex-shrink:0}.family-view-tabs button{border:0;padding:8px 12px;border-radius:5px;font-size:12px}.family-view-tabs [aria-pressed=true]{background:#30574c;color:#b8f2df}.family-map-controls{padding:0 20px 16px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.family-map-controls button{font-size:12px;padding:7px 10px}.family-zoom-controls{display:flex;gap:5px;align-items:center;margin-right:auto}.family-zoom-controls output{font-size:11px;min-width:38px;text-align:center;color:var(--muted)}.family-map-viewport{height:clamp(440px,65vh,740px);overflow:auto;background-color:#e8eeea;background-image:radial-gradient(#b5c5bb 1px,transparent 1px);background-size:22px 22px;position:relative;overscroll-behavior:contain;cursor:grab;scrollbar-color:#82988b #dce5de;scrollbar-width:thin;outline-offset:-3px}.family-map-viewport.panning{cursor:grabbing;-webkit-user-select:none;user-select:none}.family-map-space{position:relative;min-width:100%;min-height:100%}.family-map-surface{position:absolute;left:0;top:0;transform-origin:0 0}.family-map-lines{position:absolute;inset:0;overflow:visible;pointer-events:none}.family-edge{fill:none;stroke:#86a299;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}.family-edge.spouse{stroke:#bd9050;stroke-dasharray:5 4;stroke-width:2}.family-edge.nonbiological{stroke:#9987b4;stroke-dasharray:4 3}.family-edge.focused{stroke-width:2.6;stroke:#337b66}.family-edge.spouse.focused{stroke:#ab791e}.family-edge.nonbiological.focused{stroke:#7b55a2}.family-branch-label{position:absolute;color:#536c60;font-size:12px;letter-spacing:1px;pointer-events:none}.family-node{position:absolute;border:1px solid #c4d0c7;border-radius:12px;background:#fffef9;color:#273e33;padding:13px 15px;text-align:left;white-space:normal;box-shadow:0 4px 11px #263c3010;display:flex;flex-direction:column;gap:4px;overflow:visible;cursor:pointer;transition:box-shadow .15s,border-color .15s}.family-node:hover{filter:none;box-shadow:0 6px 20px #30583d30;border-color:#5b9179}.family-node:focus-visible{outline:3px solid #205a48;outline-offset:4px}.family-node>strong{font-size:16px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:30px}.family-node-top{position:absolute;right:12px;top:12px}.family-node-avatar{display:flex;width:28px;height:28px;align-items:center;justify-content:center;background:#e9f0e8;border-radius:9px;font-family:"Noto Serif SC",SimSun,serif;color:#48745c;font-size:17px}.family-node-flags{position:absolute;right:0;top:36px;display:grid;gap:4px;justify-items:end;white-space:nowrap}.family-node-flags>small{font-size:9px;color:#748375}.family-node .family-node-relation{display:block;font-size:11px;color:#577868;max-width:120px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.family-node>small{font-size:10px;color:#7a8a80;margin-top:auto}.family-node.self{background:#f6d795;border:2px solid #c49337;box-shadow:0 5px 18px #b487242e}.family-node.self .family-node-avatar{background:#fbe8bd;color:#82561f}.family-node.self>strong{color:#5d3d15}.family-node.self .family-node-relation,.family-node.self>small{color:#7d622f}.self-badge{display:inline-block;border-radius:4px;background:#996e2b;color:#fff4d7;padding:2px 5px;font-size:9px;font-weight:600;letter-spacing:.5px}.family-node.selected{outline:3px solid #3d9175;outline-offset:4px}.family-node.search-hit:after{content:"匹配";position:absolute;left:12px;top:-12px;padding:2px 6px;border-radius:4px;background:#315f8d;color:#fff;font-size:9px;box-shadow:0 2px 4px #0002}.family-node.archived{border-style:dashed}.family-map-footer{padding:15px 20px;border-top:1px solid #a4b7a41f}.family-map-legend{display:flex;gap:15px;flex-wrap:wrap;font-size:11px;color:#a5bbb4;margin-bottom:9px}.family-map-legend>span{display:flex;align-items:center;gap:6px}.family-map-legend i{display:inline-block;width:19px;height:2px;background:#86a299}.family-map-legend i.legend-self{width:11px;height:11px;background:#f6d795;border-radius:3px}.family-map-legend i.legend-selected{width:11px;height:11px;background:transparent;border:2px solid #64bc9d;border-radius:3px}.family-map-legend i.legend-spouse{background:none;border-top:2px dashed #bd9050}.family-map-legend i.legend-adoptive{background:none;border-top:2px dashed #aa98c4}.family-map-footer .description{font-size:11px;margin:0;line-height:1.8}.family-map-footer #family-map-note:not(:empty){padding:8px 0;color:#c9bc9a}.family-inspector{position:sticky;top:18px;max-height:calc(100vh - 36px);overflow:auto;margin:0;padding:20px;min-width:0;scrollbar-width:thin}.family-inspector.is-self{border-color:#b08848;background:linear-gradient(145deg,#343323,#18272a 55%)}.family-self-heading{color:#e8c780;font-size:12px;margin-bottom:18px}.family-back-to-map{display:block;margin:0 0 18px auto;font-size:11px}#family-detail .section-head{gap:12px;flex-wrap:wrap}#family-detail .section-head>div{display:block}#family-detail .section-head h2{font-size:23px;overflow-wrap:anywhere}#family-detail dl{grid-template-columns:1fr;gap:12px;margin:18px 0 24px}#family-detail dl>div{grid-template-columns:76px minmax(0,1fr);gap:9px}#family-detail h3{font-size:14px;margin-top:24px}#family-detail .family-link{align-items:flex-start;overflow-wrap:anywhere;font-size:12px}#family-detail .family-link .quiet{padding:5px 8px;font-size:11px}#family-detail .family-prose{font-size:13px}.family-register{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));max-height:clamp(440px,65vh,740px);overflow:auto;padding:20px;align-content:start;background:#132226}.person-card.self{background:#463e27;border-color:#b28f50;color:#f1dca7}.person-card.self span:not(.self-badge){color:#e0c995}.person-card.self small{color:#b8a98b}.person-card.selected{outline:2px solid #63b89c;outline-offset:-2px}.family-map-viewport>.empty{border:0;background:transparent;color:#5c7567;height:100%;display:flex;flex-direction:column;justify-content:center;margin:0}.family-map-viewport>.empty h3{color:#314d3d}.family-toolbar #family-search{width:190px}.family-toolbar #family-reference{max-width:180px}.family-toolbar{gap:12px}.family-workspace:is(:fullscreen,.family-expanded){width:100vw;height:100dvh;background:#10191d;padding:16px;align-items:stretch;overflow:auto}.family-workspace:is(:fullscreen,.family-expanded) .family-canvas-panel{height:100%;display:flex;flex-direction:column}.family-workspace:is(:fullscreen,.family-expanded) .family-map-viewport{flex:1;height:auto;min-height:200px}.family-workspace:is(:fullscreen,.family-expanded) .family-register{max-height:none;flex:1}.family-workspace:is(:fullscreen,.family-expanded) .family-inspector{position:static;max-height:100%;overflow:auto}.family-workspace:is(:fullscreen,.family-expanded) .family-map-heading{padding:14px 20px}.family-workspace:is(:fullscreen,.family-expanded) .family-map-footer{padding:10px 20px}@media(max-width:1250px){.family-workspace{grid-template-columns:minmax(0,1fr) 270px}.family-map-heading{align-items:flex-start;flex-wrap:wrap}.family-map-controls{gap:6px}.family-map-controls button{padding:7px 8px}.family-inspector{padding:16px}.family-toolbar>span{margin-left:0}}@media(max-width:1000px){.family-workspace{grid-template-columns:1fr}.family-inspector{position:static;max-height:none}.family-map-viewport{height:560px}.family-register{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));max-height:560px}.family-workspace:is(:fullscreen,.family-expanded){display:flex;flex-direction:column;gap:10px}.family-workspace:is(:fullscreen,.family-expanded) .family-canvas-panel{min-height:65vh;flex:1;flex-shrink:0}.family-workspace:is(:fullscreen,.family-expanded) .family-inspector{max-height:35vh;flex-shrink:0}}@media(max-width:600px){#page-family>.section-head{align-items:flex-start;flex-wrap:wrap}#page-family>.section-head>div{gap:7px;flex-wrap:wrap}#page-family>.section-head button{font-size:12px;padding:8px 10px}.family-toolbar{padding:15px}.family-toolbar label{width:100%;display:flex;justify-content:space-between;flex-wrap:nowrap}.family-toolbar label.check{justify-content:flex-start}.family-toolbar input,.family-toolbar #family-search,.family-toolbar #family-reference{width:60%;max-width:60%}.family-toolbar input[type=checkbox]{width:16px}.family-map-heading{padding:17px 15px}.family-map-heading h2{font-size:21px}.family-map-controls{padding:0 12px 14px}.family-map-footer{padding:13px 15px}.family-map-legend{gap:10px}.family-map-viewport{height:470px}.family-register{grid-template-columns:1fr 1fr;padding:12px;gap:10px}.family-register .person-card{padding:12px}.family-workspace:is(:fullscreen,.family-expanded){padding:8px}.family-map-footer>.description:last-child{font-size:10px}}.family-map-heading{flex-wrap:wrap}.family-view-tabs{max-width:100%;flex-wrap:wrap}.family-view-tabs button{font-size:11px}.family-event-intro{display:flex;justify-content:space-between;gap:15px;padding:8px 22px 12px;align-items:flex-start}.family-event-intro h3{font-size:16px;line-height:1.7;margin:0 0 7px}.family-event-intro p{margin:0}.family-event-intro button{font-size:12px;padding:9px 12px}.family-event-filters{display:flex;gap:12px;flex-wrap:wrap;padding:15px 22px;background:#101e2366;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}.family-event-filters label{display:flex;font-size:12px;gap:7px;flex-wrap:wrap}.family-event-filters input:not([type=checkbox]){width:170px}.family-event-filters select{max-width:180px;font-size:12px;padding:8px}.family-event-filters .check{width:100%;font-size:11px}.family-event-filters button{font-size:11px;padding:7px 10px}.family-event-filters #family-event-state-label{margin-right:auto}#family-event-count{padding:16px 22px 0;margin-bottom:0}.family-timeline{padding:0 22px 28px;max-height:680px;overflow:auto;scrollbar-width:thin}.timeline-year{font-family:Georgia,SimSun,serif;color:#a4d6c3;font-size:27px;margin:30px 0 18px;letter-spacing:1px}.timeline-year span{font-family:inherit;font-size:12px;color:var(--muted);margin-left:8px}.timeline-event{display:flex;align-items:flex-start;gap:18px;position:relative;width:100%;background:transparent;color:inherit;text-align:left;padding:0 0 24px;border-radius:0;border:0;white-space:normal}.timeline-event:hover{filter:none}.timeline-event:before{content:"";position:absolute;left:85px;top:10px;bottom:-10px;border-left:1px solid #466659}.timeline-event:after{content:"";position:absolute;left:81px;top:6px;width:9px;height:9px;border-radius:50%;background:#7eccac;box-shadow:0 0 0 4px #1c342d}.timeline-event>time{font-size:12px;font-weight:400;color:#9bb3ae;flex:0 0 70px;margin-top:1px}.timeline-event-body{margin-left:12px;flex:1;min-width:0;border:1px solid #345248;border-radius:10px;padding:17px 19px;background:#20352f;display:flex;flex-direction:column;gap:11px}.timeline-event:hover .timeline-event-body{border-color:#71ad94;background:#264037}.timeline-event-body>strong{font-size:17px;line-height:1.6;color:#dfebe5;overflow-wrap:anywhere}.timeline-event-status{font-size:9px;color:#9fc8b7;letter-spacing:1px}.timeline-summary{font-size:12px;color:#a4beb2;line-height:1.8;font-weight:400;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;white-space:pre-line;overflow-wrap:anywhere}.timeline-event-body>small{font-size:11px;color:#acc9b5;font-weight:400}.timeline-read{font-size:11px;color:#83d6b5;font-weight:400}.timeline-event.draft .timeline-event-body{border-style:dashed;background:#282e30}.timeline-event.draft:after{background:#aea087}.event-associated{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:22px 0}.event-associated button{font-size:12px}.event-detail-meta{display:flex;gap:15px;justify-content:space-between;align-items:flex-start;margin:20px 0;color:#97baac;font-size:12px}.event-detail-meta time{line-height:1.8}#event-detail-title{font-size:26px;line-height:1.6;overflow-wrap:anywhere}.event-lead{border-left:3px solid #8cb8a1;background:#233a32;padding:14px 18px;white-space:pre-wrap;font-size:14px;overflow-wrap:anywhere}.event-article{font-size:15px;line-height:2;margin:28px 0;color:#c9d9d1}.event-source{display:inline-block;white-space:normal;overflow-wrap:anywhere;line-height:1.7;margin:8px 0}.event-updated{border-top:1px solid var(--line);padding-top:18px;margin-top:22px}#event-person-choices{display:flex;gap:12px;flex-wrap:wrap;max-height:170px;overflow:auto;padding:14px 0}#event-person-choices label{display:flex;flex-direction:row;align-items:center}.event-editor-actions{gap:12px}.person-events{border-top:1px solid var(--line);margin-top:25px;padding-top:15px}.person-events .section-head{gap:8px}.person-events .section-head h3{margin:0!important;font-size:13px!important}.person-events .section-head small{letter-spacing:0;margin-left:4px}.person-events .section-head button{font-size:10px;padding:6px 7px}.person-event-link{display:flex;flex-direction:column;gap:6px;border:0;background:transparent;color:#c0d6c9;text-align:left;padding:10px 0;margin-bottom:8px;white-space:normal;line-height:1.7;font-size:12px}.person-event-link time{font-size:10px;color:#87a495}.family-workspace:is(:fullscreen,.family-expanded) #family-events{overflow:auto}.family-workspace:is(:fullscreen,.family-expanded) .family-timeline{max-height:none}@media(max-width:600px){.family-event-intro{flex-wrap:wrap;padding:8px 15px 15px}.family-event-filters{padding:15px;gap:10px}.family-event-filters label{font-size:11px}.family-event-filters .check{line-height:1.8;flex-wrap:nowrap}.family-timeline{padding:0 15px 22px}.timeline-event{gap:8px}.timeline-event>time{font-size:10px;flex-basis:55px}.timeline-event:before{left:62px}.timeline-event:after{left:58px}.timeline-event-body{padding:13px;margin-left:9px}.timeline-event-body>strong{font-size:15px}.family-view-tabs button{padding:8px 10px}#event-detail-title{font-size:22px}.event-detail-meta,.event-editor-actions{flex-wrap:wrap}}.family-workspace.family-expanded{position:fixed;inset:0;z-index:8}#history-dialog{width:min(1040px,94vw)}#history-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;max-height:260px;overflow:auto;margin:16px 0}.history-entry{text-align:left;display:flex;flex-direction:column;align-items:flex-start;gap:6px;white-space:normal}.history-entry small,.history-entry span{color:var(--muted);font-size:12px}.history-columns{display:grid;grid-template-columns:1fr 1fr;gap:20px}.history-columns section{min-width:0}.history-columns dd{white-space:pre-wrap;overflow-wrap:anywhere;max-height:240px;overflow:auto}.history-columns dl>div{padding:10px;border-bottom:1px solid #30434a}.history-changed{background:#27443e66;border-radius:8px}#history-confirm{padding:16px;border:1px solid #74d0b7;border-radius:12px;margin-top:18px}#history-confirm button{margin:6px}#history-error:empty{display:none}@media(max-width:650px){.history-columns{grid-template-columns:1fr}#history-list{max-height:200px}}:root{color-scheme:light;--paper: #f4f0e7;--ink: #2d3932;--muted: #6e6b5f;--line: #dcd5c6;--panel: #fffdf8;--accent: #315b4d;--cinnabar: #9e4b3d;--gold: #86682f;--serif: "Songti SC", "STSong", "SimSun", serif;--timeline-paper: #ede8dd;--timeline-grid: #d3ccbc;--timeline-range: #4c7761;color:var(--ink);background:var(--paper);font-family:Microsoft YaHei,PingFang SC,system-ui,sans-serif}body{background-image:radial-gradient(ellipse at 85% 0,#e4e9df80,transparent 50%);min-width:0}::selection{background:#e8d7ad;color:#2d3932}button,.button,input,select,textarea,fieldset{border-radius:5px}button,.button{background:var(--accent);color:#fffdf6;font-weight:500;transition:background .15s,border-color .15s,box-shadow .15s}button:hover,.button:hover{filter:brightness(.95)}.secondary{background:#e8ede5;color:#315b4d;border-color:#c7d3c4}.quiet{background:transparent;color:#586653;border-color:#cfcfbf}input,select,textarea{color:var(--ink);background:#fffefa;border-color:#cbc5b6}input::placeholder,textarea::placeholder{color:#847f72}input:focus,select:focus,textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px #315b4d12}input[type=range],input[type=checkbox]{accent-color:var(--accent)}label,.family-date legend{color:#625f53}h1,h2,h3{font-family:var(--serif);font-weight:600}h1{font-size:34px;letter-spacing:4px;margin-top:17px}h2{letter-spacing:1px}.sidebar{width:222px;background:#213d34;background-image:linear-gradient(145deg,#2d4b3d,transparent 60%);border-right:1px solid #425344;padding:30px 18px 20px;color:#ebe7d8;scrollbar-width:thin;scrollbar-color:#6f8271 #213d34}.sidebar .brand{gap:11px;padding:4px 5px 30px;color:#f3eddf;font-family:var(--serif);font-size:22px;letter-spacing:2px}.brand-icon{width:44px;height:44px;border-radius:5px;outline:1px solid #c6b98c66;outline-offset:3px}.brand small{font-family:Microsoft YaHei,sans-serif;color:#c0c7b5;font-size:9px;letter-spacing:2px;margin-top:10px}.nav-label{color:#b2bba6;font-size:10px;padding:12px 13px 17px;letter-spacing:3px;border-top:1px solid #b9c2aa24}.sidebar nav{gap:5px}.sidebar nav button{color:#c9d1be;border-radius:4px;padding:12px 13px;gap:13px;position:relative;border:1px solid transparent;background:transparent}.sidebar nav button span{font-size:13px;letter-spacing:.6px}.sidebar nav button:hover{background:#ffffff09;filter:none}.sidebar nav button.active{background:#efebdc;border-color:#e0d6b8;color:#244638}.sidebar nav button.active:after{content:"";width:5px;height:5px;background:var(--cinnabar);position:absolute;right:13px;transform:rotate(45deg)}.sidebar .side-note{padding:22px 5px 8px;color:#c4ccb9;font-size:11px}.sidebar .dot{background:#afc39c;width:5px;height:5px}.sidebar #current-user{color:#d3d7c8;padding:10px 5px 0;border-top:1px solid #b9c2aa24}.sidebar .quiet{color:#d1d6c6;border-color:#8b9a813f;padding:9px;font-size:11px}.sidebar #account-password{margin-bottom:8px}.sidebar :focus-visible{outline-color:#e7c887}main{margin-left:222px;padding:30px 38px 22px;max-width:1900px}main>header{min-height:142px;padding:13px 0 23px;margin-bottom:25px;border-bottom:1px solid #b4b5a2;position:relative;gap:24px;isolation:isolate}main>header:after{content:"";position:absolute;bottom:-2px;left:0;height:3px;width:48px;background:var(--cinnabar)}main>header>div{position:relative;z-index:1}.eyebrow{color:var(--gold);font-size:10px;letter-spacing:3px}header p{color:#686f60;font-size:12px;letter-spacing:.5px}.header-status{color:#666e5e;gap:12px;font-size:11px;flex-shrink:0}.courtyard-landscape{position:absolute;width:330px;height:125px;right:5px;bottom:0;z-index:0;pointer-events:none;opacity:.55}.badge{background:#e4eddf;color:#355b3d;border:1px solid #c8d6be;border-radius:3px;font-size:10px}.badge.off{background:#f2e8d9;color:#835428;border-color:#dfc6a3}.metrics{background:#fcfaf4;border-radius:6px;box-shadow:0 3px 12px #3a402905}.metrics>div{padding:20px 22px;align-items:baseline}.metrics span{color:#6f7260}.metrics strong{font-family:Georgia,var(--serif);color:#365846;font-size:29px}.filter-row{color:#6e6b5f;margin:24px 0}.household-context{display:flex;flex-wrap:wrap;align-items:center;gap:12px 24px;margin:-5px 0 24px;padding:12px 16px;border-left:3px solid var(--gold);background:#eae8dc}.household-context span{font-size:11px;color:var(--muted)}.household-context select{min-width:140px;max-width:240px}.section-head{margin-top:25px}.section-head small{color:#8a7859;font-size:9px;letter-spacing:2px}.wall-toolbar{padding:12px 15px;background:#eae8dc;border:1px solid var(--line);border-radius:5px;gap:14px}.wall-toolbar select{background:#f9f6ed}.live-grid{gap:22px}.camera-card,.site-card,.panel,.empty,.family-canvas-panel{border-radius:6px;box-shadow:0 4px 18px #39422a05}.camera-card{border-color:#d2cebe}.camera-meta{padding:17px 18px 13px}.camera-meta strong{font-family:var(--serif);font-size:16px;letter-spacing:.5px}.camera-meta p{color:#737464;margin-top:7px}.camera-actions{flex-wrap:wrap;gap:7px;padding-bottom:16px}.camera-actions .quiet{border-color:#dbd9cb;color:#52604d;background:#faf9f2}.video-panel{border-radius:5px;border-color:#c1c6b8}.video-empty{color:#b0bdae;background:radial-gradient(ellipse at center,#243d34 0,transparent 70%)}.video-empty .lens{color:#a5bca4}.video-error{color:#f6d7c1;background:#472c26ed}.empty{color:#6c7462;border-color:#c3c6b6}.empty h3{color:#384e3b;font-size:21px}.panel{padding:24px}.time-labels{color:#6e705e}.recording-item{color:#35533f;background:#f9f7ee;border-color:#d5d1c0}.recording-item small{color:#737261}.scan-chip{background:#fffdf7;border-radius:5px}.device-table{border-radius:5px}.device-table th{color:#6a6d5c;background:#ecebde}.device-table td small{color:#737261}.device-table tbody tr:hover{background:#f2f1e7}.site-card h3{font-size:20px}.site-card dt{color:#737261}.site-card dd{color:#384e3b}.audit-item{color:#56654f}.audit-item small{color:#767461}.banner{color:#784c26;background:#f6e9cf;border-color:#dfc797}dialog{background:#fbf8ef;color:var(--ink);border:1px solid #d5c8ac;border-radius:8px;box-shadow:0 28px 100px #172c3455;padding:30px}dialog::backdrop{background:#20382cb8;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.dialog-heading{border-bottom:1px solid var(--line);padding-bottom:20px;gap:16px}.dialog-heading h2{font-size:23px}.dialog-footer{gap:10px;flex-wrap:wrap}#auth-dialog{border-top:4px solid var(--cinnabar);padding:38px;background-image:radial-gradient(ellipse at 100% 0,#e4e9dd,transparent 65%)}#auth-dialog .brand-icon{width:52px;height:52px}#auth-form h2{font-size:32px;letter-spacing:3px;margin-top:26px}#auth-form p{color:#6b725d}.form-error{color:#994437}footer{color:#716b5b;font-size:10px;letter-spacing:.5px}#toast{background:#2a4c3c;color:#f3efdc;border-color:#819672;border-radius:5px;box-shadow:0 8px 25px #30433726;max-width:calc(100vw - 30px)}.ptz-panel{background:#f8f5eb;border-color:#b9c5ad;border-radius:7px;box-shadow:0 12px 50px #26392d44;color:var(--ink)}.ptz-pad [data-ptz-action=stop]{color:#8b4236;background:#efdbd0;border-color:#d5b2a4}#preset-confirmation{background:#f4e2d5}#snapshot-image{border-radius:4px}.family-canvas-panel{background:#fcfaf3;border-color:#c7cbb7}.family-map-heading{padding-top:24px}.family-map-heading h2{letter-spacing:3px;font-size:25px}.family-view-tabs{background:#f1eee2;border-color:#d7d0bf;border-radius:4px}.family-view-tabs button{color:#606650;border-radius:2px}.family-view-tabs [aria-pressed=true]{background:#365945;color:#fffbed}.family-map-viewport{background-color:#efece0;background-image:radial-gradient(#c9cbbb 1px,transparent 1px);scrollbar-color:#8b9a7b #e8e6d8}.family-map-lines marker path{fill:#678b71}.family-edge{stroke:#94a58a}.family-edge.focused{stroke:#446b50}.family-edge.spouse{stroke:#a9854f}.family-edge.nonbiological{stroke:#93829e}.family-node{background:#fffdf6;border-color:#c9cdb9;border-radius:5px;color:#304632;box-shadow:0 3px 12px #3943250d}.family-node>strong{font-family:var(--serif);font-size:17px}.family-node-avatar{background:#e8ecdf;color:#536e45;border-radius:4px}.family-node .family-node-relation{color:#53664a}.family-node>small,.family-node-flags>small{color:#6f775f}.family-node.self{background:#f1ddb0;border-color:#af873f;box-shadow:0 5px 18px #b4872425}.family-node.self .family-node-avatar{background:#f8eac9}.family-node.selected{outline-color:#426c50}.family-node.search-hit:after{background:#596b78}.self-badge{background:#94682f;color:#fff8e9;border-radius:2px}.family-map-footer{border-color:#d0d3c0}.family-map-legend{color:#69705b}.family-map-footer #family-map-note:not(:empty){color:#87652f}.family-inspector.is-self{background:linear-gradient(135deg,#f3e3bd,#fcfaf1 65%);border-color:#c3a66b}.family-self-heading{color:#88652d;letter-spacing:1px}.family-register{background:#eeecdf}.person-card{color:#344732;border-color:#c9cbb9}.person-card.selected{background:#e6ecdc;outline-color:#66845b}.person-card.self{background:#f1ddb0;border-color:#b89553;color:#5f461f}.person-card.self span:not(.self-badge),.person-card.self small{color:#765b2e}.family-tree ul{border-color:#a2b197}.family-workspace:is(:fullscreen,.family-expanded){background:var(--paper)}.family-event-filters{background:#f0eee2}.timeline-year{color:#456344;font-family:var(--serif)}.timeline-event:before{border-color:#b7c2a5}.timeline-event:after{background:#768d5f;box-shadow:0 0 0 4px #e7ebdc}.timeline-event>time{color:#6c745d}.timeline-event-body{background:#fffdf6;border-color:#d3d6c2;border-radius:5px}.timeline-event:hover .timeline-event-body{background:#f7f7ec;border-color:#8caa78}.timeline-event-body>strong{color:#344d32;font-family:var(--serif);font-size:18px}.timeline-event-status,.timeline-summary,.timeline-event-body>small{color:#6b725b}.timeline-read{color:#41623b}.timeline-event.draft .timeline-event-body{background:#efede3}.timeline-event.draft:after{background:#a28a62}.event-detail-meta,.person-event-link time{color:#71745e}.event-lead{background:#eaecdd;border-color:#8e9f77;color:#46553b}.event-article{color:#424c3a}.person-event-link{color:#455a3c}.history-columns dl>div{border-color:#d9d6c4}.history-changed{background:#e8ecda;border-radius:4px}#history-confirm{border-color:#b3be98;border-radius:5px;background:#efefdf}#page-live:fullscreen{--muted: #c0c9b4;--line: #52614d;--panel: #25352c;color:#efecdd;background:#111c16;color-scheme:dark}#page-live:fullscreen .wall-toolbar{background:#24372b;border-color:#40543e}#page-live:fullscreen label{color:#d9deca}#page-live:fullscreen select{background:#1a2a20;color:#ebeede;border-color:#65765a}#page-live:fullscreen .quiet{color:#d9dfca;border-color:#66765a;background:transparent}#page-live:fullscreen .camera-card{border-color:#394f38}#page-live:fullscreen .camera-actions{background:#17251ee8}#page-live:fullscreen .ptz-panel{--muted: #6e6b5f;--line: #dcd5c6;color-scheme:light}#page-live:fullscreen .ptz-panel label,#page-live:fullscreen .ptz-panel .quiet{color:#586653;border-color:#cfcfbf}@media(min-width:1600px){main{padding-left:46px;padding-right:46px}}@media(max-width:1100px){.sidebar{width:200px;padding:27px 14px 18px}.sidebar .brand{font-size:20px;gap:9px}.brand-icon{width:38px;height:38px}main{margin-left:200px;padding:24px}.metrics>div{padding:18px 14px}.metrics strong{font-size:25px}.courtyard-landscape{width:260px;opacity:.4}}@media(max-width:760px){.sidebar{position:static;width:auto;padding:22px 17px 14px;display:grid;grid-template-columns:1fr auto;gap:0 10px;overflow:visible}.sidebar .brand{padding:2px 4px 20px;font-size:22px;grid-column:1/-1}.brand-icon{width:38px;height:38px}.brand small{font-size:9px}.sidebar nav{grid-column:1/-1;display:flex;overflow-x:auto;gap:5px;padding-bottom:12px;scrollbar-width:thin;scrollbar-color:#819573 #213d34}.sidebar nav button{padding:10px 12px;gap:7px;flex-shrink:0}.sidebar nav button span{font-size:12px}.sidebar nav button.active:after{display:none}.sidebar #current-user{position:static;grid-column:1/-1;margin:4px 0 10px;padding-top:12px;font-size:11px}.sidebar #account-password,.sidebar #logout{margin:0;font-size:11px;padding:8px 12px;align-self:center;width:fit-content}.sidebar #logout{justify-self:end}main{margin:0;padding:20px 17px}main>header{min-height:132px;padding-top:9px;gap:10px;margin-bottom:20px}h1{font-size:28px;letter-spacing:3px}.eyebrow{font-size:9px;letter-spacing:2px}.header-status{font-size:9px;gap:9px;max-width:123px;padding-top:2px}.header-status .badge{font-size:9px}header p{max-width:205px;font-size:11px;line-height:1.8}.courtyard-landscape{width:170px;height:90px;right:0;opacity:.38}.metrics>div{padding:16px}.metrics strong{font-size:25px}.metrics>div:nth-last-child(-n+2){border-bottom:0}.filter-row{margin:20px 0}.filter-row select{max-width:155px}.filter-row>button{padding:9px}.section-head{flex-wrap:wrap}.section-head>div{gap:10px}.wall-toolbar{padding:11px;gap:10px}.wall-toolbar label{font-size:12px}#wall-fullscreen{padding:10px 12px}.camera-meta{padding:14px}.camera-meta strong{font-size:15px}.camera-actions{padding:0 14px 14px;gap:8px}.camera-actions button{padding:9px 11px}.panel,.site-card{padding:18px}.family-map-heading h2{font-size:23px}dialog{padding:22px}#auth-dialog{padding:30px 26px}.dialog-heading h2{font-size:21px}.dialog-footer{gap:8px}footer{gap:16px;flex-wrap:wrap;font-size:9px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;transition:none!important}}.household-actions{display:flex;gap:10px;flex-wrap:wrap;margin:18px 0}.household-context select{max-width:100%}.household-context label{min-width:0}.device-actions,.device-search-row,.device-group-order,.group-step{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.device-search-row{align-items:end}.device-search-row label{flex:1;min-width:160px}.device-group-order{margin:12px 0}.group-step{padding:7px;background:var(--paper);border:1px solid var(--line);border-radius:5px}.group-step select{width:auto;max-width:145px}.group-step button{padding:7px 11px}.group-step>span{color:var(--muted)}.device-group{margin:26px 0}.device-group>h3{font-family:var(--serif);font-size:20px;overflow-wrap:anywhere}.device-group>h3>span{color:var(--gold);padding:0 8px}.device-group>h3 small{font:12px var(--sans);color:var(--muted);white-space:nowrap}.device-tags{display:flex;flex-wrap:wrap;gap:6px}.device-tags span{font-size:11px;padding:3px 8px;background:var(--paper);border:1px solid var(--line)}.site-card dd,.site-card .description{overflow-wrap:anywhere;min-width:0}@media(max-width:600px){.device-actions{width:100%}.device-actions button{flex:1;white-space:normal}.group-step{width:100%}.group-step select{flex:1;max-width:none;min-width:0}.device-group>h3{font-size:18px}}#scope-navigation{border-left:1px solid #6d8270;margin:12px 0 12px 10px;padding-left:9px}#scope-navigation .nav-label{padding:10px 12px;overflow-wrap:anywhere}.device-context{padding:18px 22px;margin:20px 0;border:1px solid var(--line);border-left:4px solid var(--accent);background:var(--panel)}.device-context p{color:var(--muted);overflow-wrap:anywhere;margin:0 0 14px}.device-context [role=group]{display:flex;flex-wrap:wrap;gap:8px}.device-context button.active{color:var(--paper);background:var(--accent)}.device-title{border:0;padding:0;background:transparent;color:var(--ink);font:inherit;text-align:left;box-shadow:none;white-space:normal;overflow-wrap:anywhere}.device-title:hover{color:var(--accent);background:transparent}.device-title span{color:var(--accent)}.scope-intro{padding:28px 0}.scope-intro h2{font:500 32px var(--serif);margin:12px 0}.scope-intro p{color:var(--muted);line-height:1.8}.steward-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.steward-tile{display:flex;flex-direction:column;text-align:left;gap:12px;min-height:190px;padding:28px;border:1px solid var(--line);border-top:3px solid var(--accent);background:var(--panel);color:var(--ink);white-space:normal;box-shadow:0 3px 12px #22332208}.steward-tile strong{font-size:23px;font-family:var(--serif);font-weight:500}.steward-tile span,.steward-tile small{color:var(--muted);line-height:1.7}.steward-tile:hover{background:var(--paper);border-color:var(--accent)}#device-detail dl,#heritage-detail dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}#device-detail dl>div,#heritage-detail dl>div{border-bottom:1px solid var(--line);padding-bottom:12px}#device-detail dt,#heritage-detail dt{font-size:12px;color:var(--muted);margin-bottom:6px}#device-detail dd,#heritage-detail dd{margin:0;overflow-wrap:anywhere}.heritage-prose{white-space:pre-wrap;line-height:1.9;overflow-wrap:anywhere;margin:24px 0}#heritage-detail{margin-top:24px}.heritage-controls{display:flex;gap:18px;flex-wrap:wrap;align-items:center;margin-bottom:22px}.heritage-controls label{min-width:0}.household-context{flex-wrap:wrap}@media(max-width:720px){.steward-grid{grid-template-columns:1fr}.steward-tile{min-height:150px;padding:22px}.device-context{padding:16px}.device-context button{flex:1 1 40%;min-width:0}#device-detail dl,#heritage-detail dl{grid-template-columns:1fr}#scope-navigation{display:flex;flex-wrap:wrap;border:0;margin:0;padding:0;width:100%}#scope-navigation .nav-label{width:100%;padding:8px 4px}.scope-intro h2{font-size:26px}}#household-list{display:block}.home-city-group{margin:24px 0 36px}.home-city-group>h3{font-size:21px}.home-city-group>h3 small{font:12px sans-serif;color:var(--muted);margin-left:12px}.home-card{padding:0;overflow:hidden}.home-cover{position:relative;min-height:210px;background:linear-gradient(145deg,#4b6957,#253d34);isolation:isolate;color:#fffdf6}.home-cover>img{position:absolute;width:100%;height:100%;object-fit:cover;inset:0;z-index:-2}.home-cover:after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,#102019db,transparent);z-index:-1}.home-cover-content{padding:24px;min-height:210px;display:flex;flex-direction:column;justify-content:end}.home-cover .site-heading{margin-bottom:auto}.home-cover h3{margin:26px 0 4px;color:#fffdf6;text-shadow:0 1px 3px #000a;font-size:25px}.home-cover .quiet{background:#172a25ba;color:#fff;border-color:#bccabd80}.home-cover .badge{background:#f9f5e5e8;color:#244638;border-color:transparent}.home-location{font-size:12px;margin:8px 0 0;color:#fffdf6}.home-cover-placeholder{position:absolute;top:88px;right:22px;opacity:.3;font:18px var(--serif);letter-spacing:5px}.home-card-body{padding:24px}.home-card-body .household-actions{margin-bottom:0}.cover-editor img{width:100%;max-height:230px;object-fit:contain;border:1px solid var(--line);margin-bottom:12px;background:var(--paper)}#page-settings h3{font-size:21px;margin-top:8px}#page-settings .form-grid{margin:22px 0}#page-settings input:not([type=checkbox]),#page-settings select{width:100%;min-width:0}.brand-image-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin:28px 0}.brand-image-grid>div{border:1px solid var(--line);padding:18px;border-radius:6px;min-width:0}.brand-image-grid img{width:80px;height:80px;object-fit:contain;background:var(--paper);border-radius:6px;display:block;margin-bottom:18px}.brand-image-grid label{display:grid;gap:12px;margin-bottom:14px}.config-import{font-size:12px;max-width:300px}.backup-row{display:grid;gap:8px;padding:18px 0;border-bottom:1px solid var(--line);font-size:12px}.backup-row small,.backup-row code{overflow-wrap:anywhere}.backup-row span{color:var(--muted)}#settings-error,#brand-status,#preferences-status,#backup-save-status,#backup-result{line-height:1.8;font-size:13px;overflow-wrap:anywhere}.brand #brand-name{overflow-wrap:anywhere;letter-spacing:1px}.brand #brand-subtitle{overflow-wrap:anywhere;line-height:1.8;letter-spacing:1px}html[data-backdrop=plain] body{background-image:none}html[data-backdrop=plain] .courtyard-landscape{display:none}html[data-font=sans]{--serif:"Microsoft YaHei","PingFang SC",system-ui,sans-serif}html[data-density=compact] main{padding:20px 26px}html[data-density=compact] main>header{min-height:100px;padding:6px 0 15px;margin-bottom:20px}html[data-density=compact] .panel,html[data-density=compact] .site-card:not(.home-card),html[data-density=compact] .home-card-body{padding:17px}html[data-density=compact] .sidebar nav button{padding:9px 12px}html[data-density=compact] .steward-tile{min-height:150px;padding:20px}html[data-density=compact] .metrics>div{padding:13px 18px}html[data-density=compact] .home-cover,html[data-density=compact] .home-cover-content{min-height:180px}html[data-theme=clean]{--paper:#f3f6fa;--ink:#203349;--muted:#53667d;--panel:#ffffff;--line:#d2dce7;--accent:#285ca0;--gold:#52657f;--cinnabar:#386ea8;--timeline-paper:#edf2f8;--timeline-grid:#cbd6e4;--timeline-range:#4c72a5;--surface-alt:#e8eff8;--side:#1e3551;--on-accent:#ffffff;color-scheme:light}html[data-theme=ink]{--paper:#151d22;--ink:#e3e9e5;--muted:#afbdb5;--panel:#202c32;--line:#46565a;--accent:#a2cab4;--gold:#d6bd83;--cinnabar:#e0a390;--timeline-paper:#26343b;--timeline-grid:#516369;--timeline-range:#91bda6;--surface-alt:#2a3940;--side:#132020;--on-accent:#13231c;color-scheme:dark}html[data-theme=clean] body,html[data-theme=ink] body{background-color:var(--paper);color:var(--ink)}html:is([data-theme=clean],[data-theme=ink]) .sidebar{background:var(--side);border-color:var(--line)}html:is([data-theme=clean],[data-theme=ink]) main>header{border-color:var(--line)}html:is([data-theme=clean],[data-theme=ink]) :is(.metrics,.panel,.site-card,.camera-card,.empty,.family-canvas-panel,.scan-chip,dialog){background-color:var(--panel);border-color:var(--line);color:var(--ink)}html:is([data-theme=clean],[data-theme=ink]) :is(.household-context,.wall-toolbar,.device-table th,.family-view-tabs,.family-map-viewport,#preset-confirmation){background-color:var(--surface-alt);color:var(--ink);border-color:var(--line)}html:is([data-theme=clean],[data-theme=ink]) :is(input,select,textarea){background:var(--panel);border-color:var(--line);color:var(--ink)}html:is([data-theme=clean],[data-theme=ink]) :is(input,textarea)::placeholder{color:var(--muted)}html:is([data-theme=clean],[data-theme=ink]) :is(label,header p,.header-status,.metrics span,.filter-row,.section-head small,.camera-meta p,.empty,.time-labels,.recording-item small,.device-table td small,.site-card dt,.audit-item,.audit-item small,footer,#auth-form p,.family-date legend){color:var(--muted)}html:is([data-theme=clean],[data-theme=ink]) :is(.metrics strong,.empty h3,.site-card dd){color:var(--ink)}html:is([data-theme=clean],[data-theme=ink]) button:not(.quiet):not(.secondary):not(.device-title):not(.steward-tile),html:is([data-theme=clean],[data-theme=ink]) .button{background:var(--accent);color:var(--on-accent)}html:is([data-theme=clean],[data-theme=ink]) :is(.quiet,.secondary,.recording-item,.camera-actions .quiet){background:var(--surface-alt);color:var(--ink);border-color:var(--line)}html:is([data-theme=clean],[data-theme=ink]) .sidebar nav button{background:transparent;color:#dbe5e4}html:is([data-theme=clean],[data-theme=ink]) .sidebar nav button.active{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}html:is([data-theme=clean],[data-theme=ink]) .sidebar>.quiet{background:transparent;color:#dbe5e4}html:is([data-theme=clean],[data-theme=ink]) #auth-dialog{background-image:none;background-color:var(--panel)}html:is([data-theme=clean],[data-theme=ink]) .device-table tbody tr:hover{background:var(--surface-alt)}html:is([data-theme=clean],[data-theme=ink]) .family-node{background:var(--panel);border-color:var(--line);color:var(--ink)}html:is([data-theme=clean],[data-theme=ink]) .family-node.self{background:#ebd6aa;color:#2b3b30;border-color:#b79a59}html:is([data-theme=clean],[data-theme=ink]) .family-node.self :is(small,span,strong){color:#2b3b30}html[data-theme=ink] :is(.form-error,.family-warning){color:#ffc8b6}html[data-theme=ink] .ptz-panel{background:var(--panel);color:var(--ink);border-color:var(--line)}html[data-theme=ink] .home-cover .quiet{background:#172a25df;color:#fff}html[data-theme=ink] body{background-image:radial-gradient(ellipse at 90% 0,#263c3340,transparent 65%)}@media(min-width:761px){html[data-layout=top] .sidebar{position:relative;width:100%;padding:16px 30px;display:flex;align-items:center;flex-wrap:wrap;gap:12px 22px;min-height:0;height:auto;border-right:0;border-bottom:1px solid var(--line)}html[data-layout=top] .sidebar .brand{padding:0;max-width:250px}html[data-layout=top] .sidebar>.nav-label,html[data-layout=top] .side-note{display:none}html[data-layout=top] .sidebar nav{display:flex;flex:1;flex-wrap:wrap;min-width:250px;gap:6px}html[data-layout=top] #scope-navigation{display:flex;flex-wrap:wrap;width:100%;order:1;margin:0;padding:0;border:0}html[data-layout=top] #scope-navigation .nav-label{display:none}html[data-layout=top] .sidebar #current-user{margin:0;padding:0;border:0}html[data-layout=top] .sidebar>.quiet{margin:0}html[data-layout=top] main{margin-right:auto;margin-left:auto}html[data-layout=top] .sidebar nav button{width:auto;white-space:nowrap}}@media(max-width:760px){.brand-image-grid{grid-template-columns:1fr}.home-cover-content,.home-card-body{padding:20px}.home-cover-placeholder{font-size:15px}.sidebar #logout{display:block}#page-settings .form-grid{grid-template-columns:1fr}html[data-density=compact] main{padding:18px 14px}#household-form .form-grid{grid-template-columns:1fr}.home-city-group>h3 small{display:block;margin:8px 0}}.journal-feed{max-width:1080px;margin:0 auto}.journal-compose textarea{resize:vertical;min-height:130px}.journal-compose>label{display:grid;gap:12px}.journal-add-media,.journal-reactions{display:flex;flex-wrap:wrap;gap:12px;margin:20px 0}.journal-add-media>label{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.journal-add-media input{max-width:260px}.journal-filters{display:flex;align-items:end;flex-wrap:wrap;gap:16px}.journal-filters label{flex:1;min-width:145px;display:grid;gap:7px}.journal-entry{border-left:3px solid #a98964;margin-bottom:26px}.journal-entry .section-head small{display:block;color:var(--muted);margin-top:6px}.journal-text{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.95;font-size:17px}.journal-author{font-size:20px!important;font-family:serif}.journal-media{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.journal-media figure{margin:0;min-width:0}.journal-media img,.journal-media video{width:100%;max-height:450px;object-fit:contain;border-radius:8px;background:#1a2925}.journal-media audio{width:100%;max-width:100%}.journal-media figcaption{font-size:13px;overflow-wrap:anywhere;margin-top:6px}.journal-image-load{width:100%;min-height:150px;background:#e9eee2!important}.journal-upload{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;border-bottom:1px solid #d9d7c8;padding:12px 0}.journal-upload label{flex:1;overflow-wrap:anywhere}.journal-upload small{display:block}.journal-upload input[type=checkbox]{width:auto}.journal-resume input{max-width:220px}.journal-comments{border-top:1px solid #d9d7c8;padding-top:15px}.journal-comments form{display:flex;align-items:end;gap:12px;flex-wrap:wrap}.journal-comments form label{flex:1;min-width:170px}.journal-comment{padding:10px 0;border-bottom:1px dashed #d9d7c8;overflow-wrap:anywhere}.journal-comment small{font-size:11px;color:var(--muted)}.journal-reactions [aria-pressed=true]{color:#ad5842!important}.journal-comments .quiet{padding:4px 8px;font-size:12px}.journal-feed .panel{overflow:hidden}html[data-theme=ink] .journal-image-load{background:#293f37!important}.journal-upload-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,280px),1fr));gap:18px;margin:20px 0}.journal-upload-card{border:1px solid var(--line,#d9d7c8);border-radius:12px;padding:16px;background:var(--surface,#fffdf8);min-width:0;display:flex;flex-direction:column;gap:14px}.journal-upload-card:has(input:checked){border-color:#456f5f;box-shadow:0 0 0 1px #456f5f}.journal-upload-select{display:flex!important;align-items:flex-start;gap:10px;overflow-wrap:anywhere;line-height:1.5}.journal-upload-select input[type=checkbox]{width:18px;min-width:18px;height:18px;margin-top:3px;accent-color:#315a4e}.journal-upload-select small{display:block;font-size:12px;color:var(--muted);margin-top:4px}.journal-card-actions{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-top:auto}.journal-card-actions button{padding:8px 13px;font-size:13px}.journal-card-actions [data-remove-upload]{margin-left:auto;color:#954f40}.journal-card-actions a,.journal-media-caption a{font-size:13px;color:var(--accent,#315a4e)}.journal-attachment{margin:0;min-width:0}.journal-photo{display:block;position:relative;width:100%;padding:0!important;border:0!important;background:#e6e9df!important;border-radius:9px;overflow:hidden;color:#fff!important}.journal-photo img{display:block;width:100%;min-height:120px;max-height:450px;object-fit:contain;aspect-ratio:16/10;background:#e6e9df;border-radius:9px}.journal-photo-hint{position:absolute;right:10px;bottom:10px;padding:4px 9px;background:#213a30c9;border-radius:5px;font-size:12px}.journal-upload-card .journal-photo img{height:180px;min-height:0;object-fit:cover}.journal-attachment video{width:100%;max-height:450px;border-radius:8px;background:#1a2925}.journal-upload-card video{height:180px}.journal-attachment audio{width:100%;max-width:100%}.journal-audio{background:#e9eee5;border:1px solid #d5decd;border-radius:10px;padding:14px}.journal-audio-label{display:flex;align-items:center;gap:10px;color:#42614f;font-size:13px;letter-spacing:1px;margin:0 0 14px}.journal-audio-label span{font-size:28px}.journal-media-state{display:block;font-size:12px;color:var(--muted);padding-top:6px;min-height:0}.journal-media-state:empty{display:none}.journal-media-caption{font-size:12px;color:var(--muted);overflow-wrap:anywhere;margin:8px 0 16px}.journal-trash{padding:12px 0;border-top:1px solid #d9d7c8}.journal-trash-row{display:flex;align-items:center;gap:15px;justify-content:space-between;padding:10px 0;border-bottom:1px solid #d9d7c8;overflow-wrap:anywhere}.journal-preview{width:min(960px,94vw);max-width:94vw;padding:24px;max-height:94vh}.journal-preview header,.journal-preview footer{display:flex;align-items:center;justify-content:space-between;gap:18px;position:static}.journal-preview header{margin-bottom:20px}.journal-preview h2{font-size:22px;overflow-wrap:anywhere;margin:0}.journal-preview footer{font-size:13px;margin-top:18px}.journal-preview .journal-photo img{max-height:65vh;min-height:0;aspect-ratio:auto}.journal-preview .journal-photo{pointer-events:none}.journal-preview .journal-photo-hint{display:none}.journal-preview video{max-height:65vh}html[data-theme=ink] .journal-upload-card{background:#20352d}html[data-theme=ink] .journal-audio{background:#293f37;border-color:#436152}html[data-theme=ink] .journal-audio-label{color:#d5e2ce}@media(max-width:600px){.journal-upload-grid{grid-template-columns:1fr}.journal-preview{padding:16px}.journal-preview h2{font-size:17px}.journal-preview header button{flex-shrink:0}.journal-media{grid-template-columns:1fr}}@media(max-width:760px){.sidebar{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;padding:14px 16px;height:auto;min-height:0}.sidebar .brand{min-width:0;padding:0;gap:10px}.sidebar .brand>span{min-width:0}.sidebar #brand-name{font-size:23px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar .brand-icon{width:38px;height:44px}.sidebar #brand-subtitle{font-size:11px;letter-spacing:1px}.sidebar .mobile-nav-toggle{display:block;margin:0;min-height:44px;color:#f7f3e5;border-color:#8faaa0;padding:9px 14px}.sidebar:not(.mobile-open)>nav,.sidebar:not(.mobile-open)>#current-user,.sidebar:not(.mobile-open)>#account-password,.sidebar:not(.mobile-open)>#logout{display:none}.sidebar>nav,.sidebar>#current-user{grid-column:1/-1}.sidebar.mobile-open>nav{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:0;padding:8px 0 0}.sidebar #scope-navigation{display:contents}.sidebar #scope-navigation[hidden]{display:none}.sidebar nav button{width:100%;text-align:left;min-height:44px;white-space:normal;margin:0;font-size:14px}.sidebar.mobile-open>#current-user{margin:0;padding:12px 0 0}.sidebar.mobile-open>#account-password,.sidebar.mobile-open>#logout{display:block;min-height:44px;margin:0}main{padding:22px 16px}main>header{margin-bottom:22px}.header-status #clock{display:none}input:not([type=checkbox]):not([type=radio]):not([type=range]),select,textarea{font-size:16px!important;min-height:44px}button,.button{min-height:44px;touch-action:manipulation}.form-grid{grid-template-columns:1fr}.form-grid>*{min-width:0}.form-grid .wide{grid-column:1/-1}.section-head{flex-wrap:wrap;gap:12px}.section-head>div{max-width:100%}.section-head button{white-space:normal}.household-context{gap:10px;padding:12px}.household-context label{width:100%;display:flex;flex-wrap:wrap}.household-context select{flex:1;min-width:0}.household-context #household-context-note{display:none}.filter-row{gap:10px;flex-wrap:wrap}.filter-row label{width:100%;display:grid;grid-template-columns:1fr}.filter-row select{width:100%}.settings-sections,.view-presets{gap:8px}.settings-sections button,.view-presets button{flex:1 1 100px;white-space:normal}.device-actions,.device-search-row{gap:10px}.device-search-row{display:grid;grid-template-columns:1fr}dialog{width:calc(100% - 24px);max-width:calc(100% - 24px);max-height:90vh;max-height:90dvh;padding:18px;overscroll-behavior:contain}dialog header,dialog .dialog-heading{gap:12px;align-items:flex-start}dialog h2{font-size:22px}dialog footer{flex-wrap:wrap}.journal-compose,.journal-entry{padding:18px}.journal-filters{gap:12px}.journal-filters label{flex-basis:100%;min-width:0}.journal-add-media input{max-width:100%;width:100%}.journal-add-media>label{width:100%}.journal-preview{padding:16px}.journal-preview .journal-photo img,.journal-preview video{max-height:60vh;max-height:60dvh}.journal-upload-card{padding:12px}.journal-media audio{min-width:0}.journal-comments form label{min-width:0;flex-basis:100%}.device-context [role=group]{display:flex;flex-wrap:wrap;gap:8px}.device-context button{flex:1 1 42%;white-space:normal}.metrics{margin-bottom:20px}}@media(max-width:760px){.sidebar .brand{grid-column:1;max-width:100%;width:auto}.sidebar>.mobile-nav-toggle{grid-column:2;grid-row:1;width:auto;max-width:110px}.sidebar .brand-icon{flex-shrink:0}.sidebar .brand>span{overflow:hidden}.sidebar #brand-name{font-size:21px}}.geo-picker{min-width:0;border:1px solid var(--line,#d8d2c3);border-radius:10px;padding:14px;margin:0}.geo-picker legend{padding:0 8px}.geo-picker .geo-path{display:block;overflow-wrap:anywhere;margin-top:10px;font-size:.9rem}.geo-picker .form-grid{min-width:0}.geo-picker input,.geo-picker select{width:100%;min-width:0}#household-cover-status[data-error=true]{color:#ad3c28;font-weight:600}#household-cover-preview{max-width:100%;max-height:240px;object-fit:contain}.home-layout-controls{padding:16px 20px}.home-layout-controls .device-actions{align-items:end;flex-wrap:wrap}.home-layout-controls label{margin:0;min-width:90px}.home-layout-controls label.check{min-width:0;align-self:center}.home-card-grid{display:grid;grid-template-columns:repeat(var(--home-columns,2),minmax(0,1fr));gap:20px;align-items:start}.home-card-grid .home-card{min-width:0}.home-card-grid .home-card-body{padding:18px}.home-card-grid .home-cover-content{min-height:190px;padding:18px}.home-card-grid .home-cover{min-height:190px}.home-card-grid .home-card-body dl{margin:12px 0}.home-card-grid .home-card-body .description{font-size:13px}.home-card-grid .household-actions{display:flex;flex-wrap:wrap;gap:8px}.home-card-grid .household-actions button{font-size:13px;padding:10px 12px}.home-order-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px}.home-order-actions span{font-size:12px;color:var(--muted)}.home-order-actions button{font-size:12px;padding:8px}.home-card[draggable=true]{cursor:grab;outline:1px dashed var(--accent);outline-offset:3px}.home-pagination{display:flex;gap:18px;justify-content:center;align-items:center;margin:24px 0;flex-wrap:wrap}.home-pagination span{font-size:13px;color:var(--muted)}@media(max-width:1100px){.home-card-grid{grid-template-columns:repeat(min(var(--home-columns,2),2),minmax(0,1fr))}}@media(max-width:650px){.home-card-grid{grid-template-columns:minmax(0,1fr)}.home-layout-controls{padding:12px}.home-layout-controls .device-actions{gap:10px}.home-layout-controls button{padding:10px 12px}.home-pagination{gap:10px}.home-card-grid .home-cover-content{padding:16px}}.device-network{min-width:0;border:1px solid var(--line);padding:16px}.device-network legend{padding:0 8px}.topology-tree,.topology-tree ul{list-style:none;padding:0;margin:20px 0}.topology-tree ul{margin-left:24px;padding-left:24px;border-left:2px solid var(--accent,#31584a)}.topology-tree li{position:relative;margin:18px 0;min-width:0}.topology-tree ul>li:before{content:"";position:absolute;left:-24px;top:28px;width:24px;border-top:2px solid var(--accent,#31584a)}.topology-node{border:1px solid var(--line);border-radius:10px;padding:20px;background:var(--paper);max-width:800px;overflow-wrap:anywhere}.topology-node h3{margin:12px 0}.topology-node dl{display:grid;gap:8px}.topology-node dl>div{display:grid;grid-template-columns:100px minmax(0,1fr);gap:10px}.topology-node dd{margin:0}.topology-node dt,.topology-node p{font-size:13px;color:var(--muted)}.topology-node .device-title{text-align:left}@media(max-width:650px){.topology-tree ul{margin-left:8px;padding-left:12px}.topology-tree ul>li:before{left:-12px;width:12px}.topology-node{padding:14px}.topology-node dl>div{grid-template-columns:72px minmax(0,1fr)}.device-network .form-grid{grid-template-columns:1fr}}.platform-topology-root{border:1px solid var(--line);border-top:4px solid var(--accent,#31584a);background:var(--paper);padding:22px;text-align:center;margin:24px auto;max-width:420px;border-radius:10px}.platform-place-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:24px;border-top:2px solid var(--line);padding-top:24px}.platform-place-node{position:relative;text-align:left;white-space:normal;min-width:0;border:1px solid var(--line);border-radius:10px;background:var(--paper);color:var(--text);padding:22px}.platform-place-node:before{position:absolute;content:"";height:25px;top:-25px;left:50%;border-left:2px solid var(--line)}.platform-place-node h3{margin:16px 0}.platform-place-node p,.platform-place-node small{color:var(--muted)}.platform-place-node>span:last-child{display:block;margin-top:18px}.platform-place-node:hover{border-color:var(--accent,#31584a);background:var(--surface,#f1f2e9)}.topology-tree{display:flex;gap:24px;align-items:start;flex-wrap:wrap}.topology-tree>li{flex:1 1 400px}.topology-tree ul{display:flex;gap:16px;flex-wrap:wrap}.topology-tree ul>li{flex:1 1 260px;max-width:560px}.topology-node{max-width:560px;padding:16px}.device-actions #devices-card-view[aria-pressed=true],.device-actions #devices-topology-view[aria-pressed=true],.device-actions #home-card-view[aria-pressed=true],.device-actions #home-topology-view[aria-pressed=true]{background:var(--accent,#31584a);color:#fff}.home-card-grid[hidden],.home-layout-controls[hidden],.home-pagination[hidden]{display:none!important}:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, .75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, .5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, .175);--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem rgba(0, 0, 0, .15);--bs-box-shadow-sm:0 .125rem .25rem rgba(0, 0, 0, .075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, .175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, .075);--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:rgba(13, 110, 253, .25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, .75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, .5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, .15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,:after,:before{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media(min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;line-height:inherit;font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale(1)}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}.lead{font-size:1.25rem;font-weight:300}.display-1{font-weight:300;line-height:1.2;font-size:calc(1.625rem + 4.5vw)}@media(min-width:1200px){.display-1{font-size:5rem}}.display-2{font-weight:300;line-height:1.2;font-size:calc(1.575rem + 3.9vw)}@media(min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-weight:300;line-height:1.2;font-size:calc(1.525rem + 3.3vw)}@media(min-width:1200px){.display-3{font-size:4rem}}.display-4{font-weight:300;line-height:1.2;font-size:calc(1.475rem + 2.7vw)}@media(min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-weight:300;line-height:1.2;font-size:calc(1.425rem + 2.1vw)}@media(min-width:1200px){.display-5{font-size:3rem}}.display-6{font-weight:300;line-height:1.2;font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media(min-width:576px){.container,.container-sm{max-width:540px}}@media(min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media(min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media(min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), .05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), .1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;max-width:100%;height:100%;padding:1rem .75rem;overflow:hidden;color:rgba(var(--bs-body-color-rgb),.65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:.75rem}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>textarea:focus~label:after,.form-floating>textarea:not(:placeholder-shown)~label:after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>textarea:disabled~label:after{background-color:var(--bs-secondary-bg)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--bs-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3.75rem + 1.5em)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3.75rem + 1.5em)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, .15),0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:.5rem;--bs-dropdown-spacer:.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle:after{display:none}.dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, .15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(-1 * var(--bs-border-width))}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(-1 * var(--bs-border-width))}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-grow:1;flex-basis:0;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), .65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), .8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), .3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), .15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, .55);--bs-navbar-hover-color:rgba(255, 255, 255, .75);--bs-navbar-disabled-color:rgba(255, 255, 255, .25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, .1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), .03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;inset:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-header,.card-group>.card:not(:last-child)>.card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-footer,.card-group>.card:not(:last-child)>.card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-header,.card-group>.card:not(:first-child)>.card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-footer,.card-group>.card:not(:first-child)>.card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:.75rem;--bs-pagination-padding-y:.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:.5rem;--bs-pagination-padding-y:.25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:.65em;--bs-badge-padding-y:.35em;--bs-badge-font-size:.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width .6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):focus,.list-group-item-action:not(.active):hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;filter:var(--bs-btn-close-filter);border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}:root,[data-bs-theme=light]{--bs-btn-close-filter: }[data-bs-theme=dark]{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:.75rem;--bs-toast-padding-y:.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:.5rem;--bs-modal-color:var(--bs-body-color);--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--bs-modal-header-padding-y));margin-right:calc(-.5 * var(--bs-modal-header-padding-x));margin-bottom:calc(-.5 * var(--bs-modal-header-padding-y));margin-left:auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media(min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media(min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:.5rem;--bs-tooltip-padding-y:.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:.9;--bs-tooltip-arrow-width:.8rem;--bs-tooltip-arrow-height:.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow:after,.popover .popover-arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-top>.popover-arrow:before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-end>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-start>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translate(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;filter:var(--bs-carousel-control-icon-filter);border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:var(--bs-carousel-indicator-active-bg);background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:var(--bs-carousel-caption-color);text-align:center}.carousel-dark{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}:root,[data-bs-theme=light]{--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }[data-bs-theme=dark]{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}.spinner-border,.spinner-grow{display:inline-block;flex-shrink:0;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-border-width:.25em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform .3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media(max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:575.98px)and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media(min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:767.98px)and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media(min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:991.98px)and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media(min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:1199.98px)and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:1399.98px)and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media(min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix:after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media(min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media(min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:.1}.border-opacity-25{--bs-border-opacity:.25}.border-opacity-50{--bs-border-opacity:.5}.border-opacity-75{--bs-border-opacity:.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:#00000080!important}.text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media(min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media(min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media(min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root{--bs-primary: #28624f;--bs-primary-rgb: 40, 98, 79;--bs-body-color: #263f36;--bs-body-bg: #f4f6f4;--bs-border-color: #dde4df;--bs-border-radius: .65rem;--ui-surface: #fff;--ui-muted: #67776d;--ui-line: #dfe6e1;--ui-sidebar: #193c32;--ui-accent: #28624f;--ui-bg: #f4f6f4;--ink: #263f36;--muted: #67776d;--paper: #fff;--line: #dfe6e1;--green: #28624f;--green-dark: #193c32;--cream: #f4f6f4}html,body{min-width:320px;margin:0;background:var(--ui-bg)!important;color:var(--ink);font-family:Inter,Segoe UI,Microsoft YaHei,system-ui,sans-serif;font-size:14px;line-height:1.65}body{display:block!important;background-image:none!important}body:before,body:after{display:none!important}#app{min-height:100vh;display:grid;grid-template-columns:232px minmax(0,1fr)}*,*:before,*:after{box-sizing:border-box}[hidden]{display:none!important}button,input,select,textarea{font:inherit}button,a,input,select,textarea{touch-action:manipulation}button{letter-spacing:0!important}.app-icon{width:20px;height:20px;flex:0 0 20px;vertical-align:middle}.btn .app-icon{width:17px;height:17px}.sidebar{width:232px!important;position:fixed!important;inset:0 auto 0 0;z-index:20;background:var(--ui-sidebar)!important;color:#e6f0eb;padding:28px 18px 20px!important;display:flex;flex-direction:column;height:100dvh;overflow:auto;border:0!important;box-shadow:none!important}.brand{padding:0 6px 24px!important;gap:12px;text-decoration:none;color:#fff!important;border-bottom:1px solid #ffffff14!important;margin:0 0 24px!important;display:flex;align-items:center}.brand-icon{width:42px!important;height:42px!important;object-fit:contain;border-radius:10px}.brand>span>span{font-size:22px!important;line-height:1.2;letter-spacing:2px}.brand small{font-size:11px!important;letter-spacing:1px;color:#acc4b8!important;margin-top:6px;display:block}.nav-label{font-size:10px!important;letter-spacing:2px;padding:0 12px;margin-bottom:12px;color:#95b5a6!important}.sidebar nav{display:flex!important;flex-direction:column!important;gap:5px}.sidebar nav button{display:flex;gap:12px;align-items:center;text-align:left;width:100%;color:#c0d6c9!important;background:transparent!important;border:0!important;box-shadow:none!important;border-radius:8px!important;min-height:44px;padding:10px 13px!important;font-size:13px!important;white-space:normal}.sidebar nav button:hover{background:#ffffff0d!important;color:#fff!important}.sidebar nav button.active{background:#ffffffed!important;color:#234c3d!important;font-weight:600}.sidebar nav .app-icon{opacity:.85}#scope-navigation{border:0!important;padding:18px 0 10px!important;margin:7px 0!important;box-shadow:0 -1px #ffffff14,0 1px #ffffff14}#scope-nav-name{max-width:185px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 0 12px}.side-note{margin-top:auto;padding:36px 12px 16px;font-size:10px;color:#9abbab}.side-note p{display:none}.sidebar #current-user{color:#c1d3c8!important;border-top:1px solid #ffffff18;padding-top:14px;font-size:11px;margin:0 0 8px}.sidebar>#account-password,.sidebar>#logout{border-color:#ffffff20!important;color:#c1d3c8!important;background:transparent!important;font-size:11px;min-height:32px;padding:5px;margin:4px 0}.mobile-nav-toggle{display:none}#app>main{grid-column:2;margin:0!important;padding:28px 34px 20px!important;width:100%;min-width:0;max-width:1800px;min-height:100vh;background:none!important}main>header{padding:0 0 24px!important;margin:0 0 24px!important;border-bottom:1px solid var(--ui-line)!important;display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:0!important;background:none!important;position:relative}main>header:after,main>header:before{display:none!important}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--ui-muted)!important;margin-bottom:7px}h1,#page-title{font-family:inherit!important;font-size:26px!important;font-weight:650!important;line-height:1.35;letter-spacing:-.5px!important;margin:0 0 7px!important}h2{font-size:19px!important;font-weight:600!important;line-height:1.45;letter-spacing:0!important;margin:0 0 5px!important}h3{font-size:16px!important;line-height:1.5;font-weight:600!important;letter-spacing:0!important}h2,h3,h4{font-family:inherit!important}#page-note{font-size:12px!important;color:var(--ui-muted);margin:0!important}.header-status{align-items:flex-end;gap:8px;font-size:10px!important;white-space:nowrap}#service-status{font-size:10px}#clock{color:var(--ui-muted);background:none!important;padding:0!important}#clock:before{display:none!important}.btn{border-radius:7px!important;min-height:36px;padding:7px 13px;font-size:12px;font-weight:500;box-shadow:none;line-height:1.65;display:inline-flex;align-items:center;justify-content:center;gap:5px;white-space:normal}.btn-primary{--bs-btn-bg: var(--ui-accent);--bs-btn-border-color: var(--ui-accent);--bs-btn-hover-bg: #1d4d3c;--bs-btn-hover-border-color: #1d4d3c;--bs-btn-disabled-bg: #80988d;--bs-btn-disabled-border-color: #80988d;--bs-btn-active-bg: #1d4d3c;--bs-btn-active-border-color: #1d4d3c;color:#fff!important}.btn-outline-secondary{--bs-btn-color: #54685d;--bs-btn-border-color: #d8e1da;--bs-btn-hover-bg: #edf3ee;--bs-btn-hover-border-color: #bacdc0;--bs-btn-hover-color: #264d3b;--bs-btn-active-bg: #e0ece4;--bs-btn-active-border-color: #a7c0ae;--bs-btn-active-color: #254e3b;--bs-btn-disabled-color: #9faea4;--bs-btn-disabled-border-color: #e0e5e2;background:transparent}.btn-sm{min-height:30px;padding:4px 9px;font-size:11px}.btn-link{color:var(--ui-accent);text-decoration:none;background:transparent;border:0}.btn-link:hover{text-decoration:underline}.btn:focus-visible,.form-control:focus,.form-select:focus{box-shadow:0 0 0 3px #28744c1c!important;outline:0!important;border-color:#679b79}.btn-group>.btn{border-radius:0!important}.btn-group>.btn:first-child{border-radius:7px 0 0 7px!important}.btn-group>.btn:last-child{border-radius:0 7px 7px 0!important}.form-control,.form-select{color:var(--ink);background-color:var(--ui-surface);border:1px solid var(--ui-line);border-radius:7px!important;font-size:13px;padding:9px 12px;min-height:40px;max-width:100%;box-shadow:none}.form-select{padding-right:32px}.form-check-input{width:16px;height:16px;min-height:0;margin:0 6px 0 0;vertical-align:middle;flex:0 0 16px}.form-check-input:checked{background-color:var(--ui-accent);border-color:var(--ui-accent)}label{font-size:12px;color:#617367;gap:7px}.form-grid{gap:16px 20px!important}.form-grid label{min-width:0}.form-grid .full{grid-column:1/-1}textarea.form-control{min-height:100px}input[type=file]{font-size:12px;padding:8px;overflow:hidden}input[type=range]{max-width:100%}fieldset{border:1px solid var(--ui-line)!important;border-radius:9px;padding:14px!important}legend{float:none;width:auto;padding:0 6px;font-size:12px}.description,.hint{font-size:12px!important;line-height:1.8!important;color:var(--ui-muted)!important}p{overflow-wrap:anywhere}code{color:#3b6755;font-size:12px}.table{font-size:12px;--bs-table-bg: transparent}.table td,.table th{padding:12px!important;border-color:var(--ui-line)}.table-wrap{overflow:auto;border-radius:8px;border:1px solid var(--ui-line)}.panel,.site-card,.card,.camera-card,.person-card{background:var(--ui-surface)!important;border:1px solid var(--ui-line)!important;border-radius:11px!important;box-shadow:0 3px 12px #193c3204!important;overflow:hidden}.panel{padding:22px!important;margin-bottom:18px}.site-card{padding:22px!important}.card-body{padding:20px}.card-footer{background:transparent;border-top:1px solid var(--ui-line);padding:12px 18px}.section-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:18px!important}.section-head h2 small,.section-head h3 small{display:none}.badge{font-size:10px;line-height:1.4;font-weight:500!important;letter-spacing:0!important;background:#edf4ee!important;color:#3c7056!important;border:1px solid #d6e6d9!important;border-radius:5px!important;padding:5px 8px!important}.badge.off{background:#f7eeea!important;border-color:#ecd9d0!important;color:#a66044!important}.count-pill{display:inline-block;padding:2px 7px;background:#e6ede8;color:#4b705b;border-radius:5px;font-size:11px;vertical-align:middle;margin-left:7px}.group-title{font-size:13px!important;color:#6a7c70;margin:24px 0 12px!important;display:flex;gap:5px;align-items:center}.site-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.household-context{padding:12px 16px!important;border-radius:9px!important;background:#eaf0eb!important;border:1px solid var(--ui-line);gap:12px;display:flex;align-items:center;flex-wrap:wrap;margin-bottom:18px!important}.household-context label{display:flex;align-items:center;gap:10px;margin:0}.household-context select{width:auto;max-width:260px;min-height:34px;padding-top:6px;padding-bottom:6px}.household-context span{font-size:11px;color:var(--ui-muted)}#scope-back{margin-left:auto}.device-context{border-radius:9px;background:#eaf0eb!important;padding:16px!important;margin-bottom:18px}.device-context p{font-size:12px;margin:0 0 10px}.device-context .btn.active{background:var(--ui-accent)!important;color:#fff!important}.filter-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 18px;padding:0!important;font-size:12px}.filter-row label{display:flex;align-items:center;gap:8px;margin:0}.filter-row select{width:180px}.filter-row>button{margin-left:auto}.metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin:0 0 22px!important;padding:0!important;background:none!important;border:0!important}.metrics>div{background:var(--ui-surface);border:1px solid var(--ui-line);border-radius:9px;padding:14px 18px!important;display:flex;justify-content:space-between;align-items:center;border-right:1px solid var(--ui-line)!important}.metrics span{font-size:11px;color:var(--ui-muted)}.metrics strong{font-family:inherit;font-size:23px!important;font-weight:600;color:var(--ui-accent)}.home-toolbar{display:flex;gap:16px;flex-wrap:wrap;align-items:center;padding:13px 0;margin:0 0 7px;border-top:1px solid var(--ui-line);border-bottom:1px solid var(--ui-line)}.home-layout-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-left:auto}.home-layout-controls label{display:flex;align-items:center;gap:7px;margin:0}.home-layout-controls select{width:80px!important;min-height:34px;padding-top:5px;padding-bottom:5px}.home-layout-controls>.form-select{width:80px!important}.inline-check{white-space:nowrap;font-size:11px}#home-layout-status{margin-bottom:18px;font-size:11px!important}.home-card-grid{display:grid!important;grid-template-columns:repeat(var(--home-columns, 2),minmax(0,1fr));gap:20px!important}.home-city-group{display:block}.home-card{padding:0!important;margin:0!important;min-width:0;align-self:start}.home-cover{position:relative;height:178px!important;min-height:178px!important;background:linear-gradient(135deg,#567d65,#203e36)!important;overflow:hidden}.home-cover img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.cover-shade{position:absolute;inset:0;background:linear-gradient(180deg,#132e2430 10%,#0e261ccc)}.home-cover-content{position:relative;z-index:1;height:100%;padding:17px 20px!important;display:flex;flex-direction:column;justify-content:space-between;background:none!important}.home-cover-content h3{font-family:inherit!important;font-size:21px!important;color:#fff!important;margin:0 0 6px!important;letter-spacing:0}.home-cover-content .badge{background:#ffffffd9!important;color:#244d3a!important;border-color:transparent!important;font-size:10px}.home-location{font-size:11px!important;color:#e8f0eb!important;line-height:1.6;margin:0!important}.cover-edit{color:#fff!important;background:#213e3670!important;border:1px solid #ffffff60!important;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.home-summary{font-size:12px;color:var(--ui-muted);margin-bottom:15px;min-height:20px}.home-numbers{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:0 0 17px;border-bottom:1px solid var(--ui-line);margin-bottom:13px}.home-numbers span{display:flex;align-items:baseline;gap:7px;color:var(--ui-muted);font-size:11px}.home-numbers b{font-size:21px;font-weight:600;color:var(--ink)}.compact-details{margin:0!important;display:grid;gap:7px!important;font-size:12px}.compact-details>div{display:grid;grid-template-columns:100px minmax(0,1fr);gap:12px!important;padding:0!important}.compact-details dt{font-weight:400;color:var(--ui-muted)}.compact-details dd{margin:0;overflow-wrap:anywhere;color:var(--ink)}.home-card-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:17px;padding-top:14px;border-top:1px solid var(--ui-line)}.home-card-actions .btn-primary{flex:1}.home-order-actions{display:flex;align-items:center;gap:5px;margin-bottom:12px}.home-order-actions span{font-size:10px;flex:1}.home-pagination{display:flex;justify-content:flex-end;align-items:center;gap:10px;margin:22px 0}.home-pagination span{margin-right:auto;font-size:11px;color:var(--ui-muted)}.device-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,330px),1fr));gap:18px}.device-card{min-width:0}.device-card-heading{display:flex;align-items:center;gap:12px;margin-bottom:15px}.device-symbol{width:42px;height:42px;border-radius:10px;background:#eaf2ec;color:var(--ui-accent);display:grid;place-items:center}.device-symbol .app-icon{width:23px;height:23px}.device-card-heading h3{margin:0!important;font-size:16px!important}.device-title{padding:0!important;border:0!important;background:none!important;text-align:left!important;min-height:0!important;color:var(--ink)!important;font-weight:600!important;font-size:16px!important;box-shadow:none!important}.device-title:hover{color:var(--ui-accent)!important;text-decoration:underline}.device-location{font-size:11px;color:var(--ui-muted);margin-bottom:15px}.device-card-actions{display:flex;flex-wrap:wrap;gap:8px}.device-tags{display:flex;flex-wrap:wrap;gap:5px;margin:12px 0 0}.device-tags span{background:#edf1ee;font-size:10px;color:#667e6d;padding:2px 8px;border-radius:4px}.device-view-controls{display:flex;flex-wrap:wrap;gap:12px}.device-view-controls label{display:flex;align-items:center;gap:9px}.group-custom{font-size:12px}.group-step{max-width:100%}.group-step select{max-width:200px}.view-presets{display:flex;gap:6px;flex-wrap:wrap}#device-count{font-size:11px!important}.device-group:first-child>.group-title{margin-top:4px!important}#asset-list .empty{min-height:160px}.device-tags+.network-status-block{margin-top:12px}.network-status-block{padding-top:12px;margin-top:14px;border-top:1px solid var(--ui-line);font-size:11px}.network-status-title{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.network-status-title>span{font-weight:600}.status-dot{width:7px;height:7px;border-radius:50%;background:#b4b9b5;display:inline-block;margin-right:6px}.status-dot.online{background:#37a06a;box-shadow:0 0 0 3px #38a16a12}.network-target{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin:4px 0}.network-target>span:first-child{width:65px;color:var(--ui-muted)}.network-target code{font-size:11px}.network-target>span:last-child{margin-left:auto;font-size:10px}.network-status-block p{margin:6px 0;font-size:11px!important}.management-links{display:flex;gap:6px;flex-wrap:wrap;margin:9px 0}.network-check-time{font-size:10px;color:#8b9c90;line-height:1.5;display:block}.network-platform{display:flex;align-items:center;gap:15px;background:#edf3ee;border:1px solid #d6e4d9;padding:20px;border-radius:10px;margin-bottom:16px}.network-platform>.app-icon{width:32px;height:32px;flex-basis:32px;color:var(--ui-accent)}.network-platform h3{margin:0 0 3px!important;font-size:18px!important}.network-platform p{margin:0;font-size:11px;color:var(--ui-muted)}.platform-place-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr));gap:18px}.platform-place-node{display:flex!important;flex-direction:column;align-items:flex-start!important;text-align:left!important;padding:20px!important;gap:9px;border:1px solid var(--ui-line)!important;position:relative;color:var(--ink)!important}.platform-place-node:hover{border-color:#81ad90!important;box-shadow:0 4px 16px #2d4b3610!important}.platform-place-node h3{font-size:17px!important;margin:3px 0}.platform-place-node p,.platform-place-node small{font-size:11px;color:var(--ui-muted);margin:0}.network-open{padding-top:12px;margin-top:auto;color:var(--ui-accent);font-size:11px}.network-node{margin:0 0 14px calc(var(--depth) * 22px);overflow:visible!important;position:relative}.network-node.nested:before{position:absolute;content:"";border-left:2px solid #c1d3c6;border-bottom:2px solid #c1d3c6;width:15px;left:-17px;top:-15px;height:50px;border-bottom-left-radius:6px}.network-node .card-body{padding:18px}.network-node .device-card-heading{margin-bottom:9px}.network-facts{display:flex;flex-wrap:wrap;gap:8px 24px;font-size:11px;color:var(--ui-muted)}.network-facts b{font-weight:500;color:var(--ink);margin-left:7px;overflow-wrap:anywhere}.network-map{overflow:hidden}.network-map .network-platform{max-width:none}.network-overview{margin-top:18px}.scope-intro{padding:0!important;margin-bottom:24px!important}.scope-intro h2{font-size:24px!important}.scope-intro p{font-size:13px!important;color:var(--ui-muted)}.steward-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));gap:18px}.steward-tile{padding:22px!important;min-height:160px!important;background:var(--ui-surface)!important;border:1px solid var(--ui-line)!important;border-radius:10px!important;text-align:left!important;display:flex;align-items:flex-start!important;flex-direction:column;justify-content:flex-start!important;gap:10px;color:var(--ink)!important;box-shadow:none!important}.steward-tile:before{display:none!important}.steward-tile:hover{border-color:#8caf99!important;background:#f9fcf9!important;transform:translateY(-1px)}.steward-tile strong{font-family:inherit!important;font-size:19px!important;font-weight:600!important}.steward-tile span{font-size:12px!important}.steward-tile small{font-size:11px!important;color:var(--ui-muted);line-height:1.8}.camera-meta{padding:16px!important}.camera-meta strong{font-size:14px!important}.camera-meta p{font-size:11px!important;margin:4px 0!important}.camera-actions{padding:0 16px 16px;display:flex;flex-wrap:wrap;gap:7px}.camera-card{background:var(--ui-surface)!important}.live-grid{gap:18px}.video-panel{background:#152720!important}.video-error{font-size:12px}.video-empty{color:#9bad9f}.wall-toolbar{padding:12px!important;border-radius:9px;gap:10px}.wall-toolbar label{font-size:11px}.wall-toolbar select{width:auto}#live-stage:fullscreen{background:#101c17}.wall-fullscreen .camera-card{border-color:#284336!important}.playback-panel{background:var(--ui-surface)!important}.settings-sections{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:20px}.settings-sections .btn[aria-pressed=true]{background:var(--ui-accent)!important;color:#fff!important}.journal-card{max-width:100%!important;background:var(--ui-surface)!important;border-radius:11px!important;padding:22px!important;border:1px solid var(--ui-line)!important}.journal-attachments{gap:14px}.journal-attachments img{border-radius:8px}.journal-media-library{max-width:100%}.journal-pager{font-size:12px}.family-toolbar{flex-wrap:wrap}.family-card,.person-card{padding:16px}.family-detail h2{font-size:20px!important}dialog{max-width:min(900px,calc(100vw - 32px))!important;width:800px;padding:26px!important;border:1px solid var(--ui-line)!important;border-radius:14px!important;background:var(--ui-surface)!important;color:var(--ink)!important;box-shadow:0 24px 80px #0f2d3d38!important;max-height:calc(100dvh - 48px);overflow:auto;margin:auto!important}dialog::backdrop{background:#10291e70;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}dialog h2{font-size:21px!important}dialog .dialog-heading,dialog>header,dialog form>header{padding:0 0 18px!important;margin:0 0 20px!important;border-bottom:1px solid var(--ui-line);display:flex;align-items:center;justify-content:space-between;gap:15px;background:none}dialog form>.form-grid{margin-top:5px}dialog footer,dialog .dialog-actions{padding:18px 0 0!important;margin:20px 0 0!important;border-top:1px solid var(--ui-line);display:flex;justify-content:flex-end;gap:10px}#auth-dialog{width:420px!important;padding:32px!important}#auth-dialog h2{font-size:25px!important}#auth-dialog p{font-size:12px}#auth-form{display:grid;gap:15px}#auth-form label{margin:0}.form-error{font-size:12px;color:#b15a3c;min-height:0}#toast{position:fixed;bottom:24px;right:24px;z-index:200;background:#234c39!important;color:#fff!important;padding:12px 20px!important;border-radius:9px!important;font-size:13px!important;box-shadow:0 6px 22px #193c3226;max-width:calc(100vw - 32px)}main>footer{padding:22px 0 0!important;margin:30px 0 0!important;border-top:1px solid var(--ui-line);font-size:10px!important;color:var(--ui-muted)}.empty{border:1px dashed #cfdbd2;background:#f8faf8;border-radius:9px;color:var(--ui-muted);text-align:center;padding:40px 20px!important}.empty h3{margin-top:10px}.empty p{font-size:12px}.banner{padding:12px 16px;border-radius:8px;font-size:12px}html[data-theme=clean]{--ui-bg: #f4f6f9;--ui-accent: #31655b;--ui-surface: #fff}html[data-theme=ink]{--ui-bg: #14221e;--ui-surface: #1c2e26;--ui-line: #334a3e;--ui-muted: #a5baad;--ink: #e1ece5;--bs-body-color: #e1ece5;--bs-border-color: #334a3e;--ui-accent: #397359;--bs-secondary-color: #a5baad}html[data-theme=ink] .form-control,html[data-theme=ink] .form-select{background-color:#20352a;color:#e1ece5}html[data-theme=ink] .network-platform,html[data-theme=ink] .household-context,html[data-theme=ink] .device-context,html[data-theme=ink] .empty{background:#213d2d!important}html[data-theme=ink] .description,html[data-theme=ink] label{color:#a5baad!important}html[data-theme=ink] .btn-outline-secondary{color:#b9cec0;border-color:#476152}html[data-density=compact] #app>main{padding:20px 25px!important}html[data-density=compact] .panel,html[data-density=compact] .card-body{padding:15px!important}html[data-density=compact] .home-cover{height:150px!important;min-height:150px!important}html[data-layout=top] #app{display:block}html[data-layout=top] .sidebar{position:relative!important;width:100%!important;height:auto;padding:12px 24px!important;display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:12px}html[data-layout=top] .sidebar .brand{padding:0 15px 0 0!important;margin:0!important;border:0!important}html[data-layout=top] .sidebar>.nav-label,html[data-layout=top] .side-note,html[data-layout=top] #current-user,html[data-layout=top] #scope-nav-name{display:none}html[data-layout=top] .sidebar nav{flex-direction:row!important;flex:1;flex-wrap:wrap}html[data-layout=top] #scope-navigation{display:flex;padding:0!important;margin:0!important;box-shadow:none}html[data-layout=top] .sidebar nav button{width:auto!important;padding:8px 10px!important}html[data-layout=top] #app>main{margin:auto!important;max-width:1800px}@media(min-width:1500px){.home-card-grid[style]{gap:22px}}@media(max-width:1200px){#app>main{padding:24px!important}#app{grid-template-columns:210px minmax(0,1fr)}.sidebar{width:210px!important;padding:24px 14px!important}.home-toolbar{align-items:flex-start}.home-layout-controls{margin-left:0}.home-card-grid{grid-template-columns:repeat(min(var(--home-columns, 2),2),minmax(0,1fr))}.metrics>div{padding:12px!important}.metrics strong{font-size:19px!important}.compact-details>div{grid-template-columns:90px minmax(0,1fr)}}@media(max-width:767px){html,body{font-size:14px}#app{display:block!important}.sidebar,html[data-layout=top] .sidebar{position:relative!important;width:100%!important;height:auto!important;padding:13px 16px!important;display:grid!important;grid-template-columns:1fr auto!important;overflow:visible!important}.brand,html[data-layout=top] .sidebar .brand{padding:0!important;margin:0!important;border:0!important;gap:10px}.brand-icon{width:34px!important;height:34px!important}.brand>span>span{font-size:19px!important}.brand small{font-size:9px!important;margin-top:2px}.sidebar>.nav-label,.side-note,#current-user,.sidebar>#account-password,.sidebar>#logout{display:none!important}.mobile-nav-toggle{display:flex!important;color:#e8f1ec!important;border:1px solid #ffffff30!important;background:transparent!important;font-size:12px;min-height:36px}.sidebar nav,html[data-layout=top] .sidebar nav{display:none!important;grid-column:1/-1}.sidebar.mobile-open nav,html[data-layout=top] .sidebar.mobile-open nav{display:flex!important;flex-direction:column!important;margin-top:15px}.sidebar.mobile-open>#account-password,.sidebar.mobile-open>#logout{display:block!important}.sidebar.mobile-open>#current-user{display:block!important;grid-column:1/-1}.sidebar.mobile-open>#account-password{grid-column:1}.sidebar.mobile-open>#logout{grid-column:2}html[data-layout=top] #scope-navigation{display:block}.sidebar nav button{width:100%!important}.sidebar #scope-navigation{padding:14px 0!important}#app>main,html[data-density=compact] #app>main{padding:20px 15px!important;min-height:calc(100vh - 65px);width:100%!important}main>header{gap:12px;align-items:flex-start;margin-bottom:20px!important;padding-bottom:18px!important}#page-title{font-size:22px!important}#page-note{font-size:11px!important}.eyebrow{font-size:9px;margin-bottom:5px;letter-spacing:1px}.header-status{font-size:9px!important;gap:5px;max-width:100px;white-space:normal;text-align:right}#service-status{font-size:9px!important;padding:4px 6px!important}#clock{font-size:9px}.section-head{gap:12px;align-items:flex-start;flex-wrap:wrap}.section-head>.btn{margin-left:0;font-size:11px}h2{font-size:17px!important}.home-toolbar{gap:13px}.home-layout-controls{gap:9px;width:100%;font-size:11px}.home-layout-controls .form-select{min-height:32px;font-size:11px}.home-layout-controls .btn{font-size:11px;min-height:32px}.home-card-grid{grid-template-columns:minmax(0,1fr)!important;gap:17px!important}.home-cover{height:170px!important;min-height:170px!important}.home-cover-content{padding:16px 18px!important}.card-body{padding:17px}.home-numbers b{font-size:21px}.home-pagination{flex-wrap:wrap}.home-pagination span{width:100%}.home-pagination .btn{flex:1}.household-context{padding:10px!important;gap:9px}.household-context label{width:100%}.household-context select{max-width:none;flex:1;min-width:0}#household-context-note{display:none}#scope-back{width:100%;margin:0}.metrics{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.metrics>div{padding:11px 13px!important}.metrics strong{font-size:20px!important}.filter-row{gap:9px}.filter-row label{flex:1;min-width:0}.filter-row select{width:100%;min-width:0}#filter-caption{display:none}.filter-row>button{font-size:11px}.panel{padding:17px!important}.form-grid{grid-template-columns:minmax(0,1fr)!important;gap:14px!important}.form-grid>*{min-width:0;grid-column:auto}.form-grid .full{grid-column:1}.site-grid,.steward-grid,.platform-place-grid,.device-card-grid{grid-template-columns:minmax(0,1fr)!important}.device-view-controls{display:flex;flex-direction:column;align-items:stretch}.device-view-controls label{width:100%}.device-view-controls input,.device-view-controls select{width:100%;min-width:0}.network-node{margin-left:calc(min(var(--depth),2)*12px)}.network-node.nested:before{left:-10px;width:8px}.network-node .card-body{padding:14px}.network-facts{display:grid;gap:6px}.network-platform{padding:16px}.network-platform h3{font-size:16px!important}.network-target{font-size:10px}.network-target code{font-size:10px;word-break:break-all}.management-links a{max-width:100%;font-size:10px}.network-node .device-card-heading h3,.network-node .device-title{font-size:14px!important}.device-context [role=group]{display:flex;flex-wrap:wrap;gap:7px}.device-context .btn{flex:1;min-width:100px;font-size:11px}.steward-tile{min-height:145px!important}.steward-tile strong{font-size:18px!important}.journal-card{padding:17px!important}.journal-attachments{grid-template-columns:minmax(0,1fr)!important}.journal-attachments audio,.journal-attachments video{width:100%;max-width:100%}.journal-upload-controls{display:flex;flex-wrap:wrap}.journal-upload-controls>*{max-width:100%}.settings-sections{gap:6px}.settings-sections .btn{flex:1;min-width:calc(50% - 6px);font-size:11px}dialog{max-width:calc(100vw - 20px)!important;padding:20px!important;max-height:calc(100dvh - 20px);border-radius:12px!important}dialog h2{font-size:19px!important}dialog .dialog-heading{padding-bottom:14px!important;margin-bottom:16px!important}dialog .dialog-heading .btn{min-width:54px}#auth-dialog{padding:25px!important}.brand-image-grid{grid-template-columns:1fr!important}#toast{bottom:16px;right:16px;font-size:12px!important}.wall-toolbar{gap:7px}.wall-toolbar label{width:auto}.table-wrap{max-width:100%}main>footer{font-size:9px!important;gap:10px;flex-wrap:wrap}.network-node .device-card-heading>.btn{font-size:10px;min-height:28px;padding:3px 7px}html[data-layout=top] .sidebar.mobile-open nav button{width:100%!important}}@media(min-width:768px){.sidebar>.mobile-nav-toggle{display:none!important}}.sidebar nav button{justify-content:flex-start!important}.sidebar nav button.active:after{display:none!important}.section-head>div:first-child{display:block}.inline-check .form-check-input{width:16px!important;height:16px!important;min-height:0!important;padding:0!important}.form-check-input{padding:0!important}.dialog-footer{display:flex;justify-content:flex-end;gap:10px;margin-top:20px;padding-top:18px;border-top:1px solid var(--ui-line)}html[data-font=serif] #page-title,html[data-font=serif] .scope-intro h2{font-family:"Noto Serif SC",Songti SC,SimSun,serif!important;font-weight:600!important}html[data-backdrop=mountains] #app>main{background-image:linear-gradient(150deg,transparent 70%,#8ba58f08 70%,transparent 85%),linear-gradient(170deg,transparent 60%,#8ba58f06 60%,transparent 90%)!important;background-size:100% 360px!important;background-repeat:no-repeat!important}@media(max-width:767px){.form-control,.form-select{font-size:16px!important;min-height:44px}.btn{min-height:42px;font-size:13px}.home-layout-controls .form-select{font-size:14px!important;min-height:40px}.home-layout-controls .btn,.network-status-title .btn,.management-links .btn{min-height:40px;font-size:12px}.network-target code{font-size:12px}.mobile-nav-toggle{min-height:42px}.device-card-actions .btn{min-height:42px;font-size:12px}} diff --git a/web/ui/assets/index-YWYfmYO_.js b/web/ui/assets/index-YWYfmYO_.js new file mode 100644 index 0000000..236aee6 --- /dev/null +++ b/web/ui/assets/index-YWYfmYO_.js @@ -0,0 +1 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function l(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=l(i);fetch(i.href,o)}})();function es(e){const t=Object.create(null);for(const l of e.split(","))t[l]=1;return l=>l in t}const te={},gt=[],Ke=()=>{},cn=()=>!1,xl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),wl=e=>e.startsWith("onUpdate:"),me=Object.assign,ts=(e,t)=>{const l=e.indexOf(t);l>-1&&e.splice(l,1)},Ci=Object.prototype.hasOwnProperty,Y=(e,t)=>Ci.call(e,t),R=Array.isArray,at=e=>Yt(e)==="[object Map]",Xe=e=>Yt(e)==="[object Set]",js=e=>Yt(e)==="[object Date]",H=e=>typeof e=="function",ae=e=>typeof e=="string",Ue=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",un=e=>(Q(e)||H(e))&&H(e.then)&&H(e.catch),dn=Object.prototype.toString,Yt=e=>dn.call(e),Si=e=>Yt(e).slice(8,-1),fn=e=>Yt(e)==="[object Object]",ls=e=>ae(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=es(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),kl=e=>{const t=Object.create(null);return(l=>t[l]||(t[l]=e(l)))},Ti=/-\w/g,qe=kl(e=>e.replace(Ti,t=>t.slice(1).toUpperCase())),Mi=/\B([A-Z])/g,_t=kl(e=>e.replace(Mi,"-$1").toLowerCase()),pn=kl(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ol=kl(e=>e?`on${pn(e)}`:""),Ve=(e,t)=>!Object.is(e,t),rl=(e,...t)=>{for(let l=0;l{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:l})},mn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let As;const Cl=()=>As||(As=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Gt(e){if(R(e)){const t={};for(let l=0;ll.startsWith("/*")?"":l).split(ji).forEach(l=>{if(l){const n=l.split(Ai);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function ct(e){let t="";if(ae(e))t=e;else if(R(e))for(let l=0;lQe(l,t))}const gn=e=>!!(e&&e.__v_isRef===!0),j=e=>ae(e)?e:e==null?"":R(e)||Q(e)&&(e.toString===dn||!H(e.toString))?gn(e)?j(e.value):JSON.stringify(e,vn,2):String(e),vn=(e,t)=>gn(t)?vn(e,t.value):at(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((l,[n,i],o)=>(l[El(n,o)+" =>"]=i,l),{})}:Xe(t)?{[`Set(${t.size})`]:[...t.values()].map(l=>El(l))}:Ue(t)?El(t):Q(t)&&!R(t)&&!fn(t)?String(t):t,El=(e,t="")=>{var l;return Ue(e)?`Symbol(${(l=e.description)!=null?l:t})`:e};let de;class Ri{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&de&&(de.active?(this.parent=de,this.index=(de.scopes||(de.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,l;if(this.scopes){const n=this.scopes.slice();for(t=0,l=n.length;t0&&--this._on===0){if(de===this)de=this.prevScope;else{let t=de;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let l,n;for(l=0,n=this.effects.length;l0)return;if(Ft){let t=Ft;for(Ft=void 0;t;){const l=t.next;t.next=void 0,t.flags&=-9,t=l}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const l=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=l}}if(e)throw e}function wn(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function kn(e){let t,l=e.depsTail,n=l;for(;n;){const i=n.prevDep;n.version===-1?(n===l&&(l=i),os(n),Fi(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=l}function Ul(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Cn(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Cn(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Vt)||(e.globalVersion=Vt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ul(e))))return;e.flags|=2;const t=e.dep,l=se,n=Ie;se=e,Ie=!0;try{wn(e);const i=e.fn(e._value);(t.version===0||Ve(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{se=l,Ie=n,kn(e),e.flags&=-3}}function os(e,t=!1){const{dep:l,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),l.subs===e&&(l.subs=n,!n&&l.computed)){l.computed.flags&=-5;for(let o=l.computed.deps;o;o=o.nextDep)os(o,!0)}!t&&!--l.sc&&l.map&&l.map.delete(l.key)}function Fi(e){const{prevDep:t,nextDep:l}=e;t&&(t.nextDep=l,e.prevDep=void 0),l&&(l.prevDep=t,e.nextDep=void 0)}let Ie=!0;const Sn=[];function et(){Sn.push(Ie),Ie=!1}function tt(){const e=Sn.pop();Ie=e===void 0?!0:e}function qs(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const l=se;se=void 0;try{t()}finally{se=l}}}let Vt=0;class Ni{constructor(t,l){this.sub=t,this.dep=l,this.version=l.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class as{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!se||!Ie||se===this.computed)return;let l=this.activeLink;if(l===void 0||l.sub!==se)l=this.activeLink=new Ni(se,this),se.deps?(l.prevDep=se.depsTail,se.depsTail.nextDep=l,se.depsTail=l):se.deps=se.depsTail=l,Tn(l);else if(l.version===-1&&(l.version=this.version,l.nextDep)){const n=l.nextDep;n.prevDep=l.prevDep,l.prevDep&&(l.prevDep.nextDep=n),l.prevDep=se.depsTail,l.nextDep=void 0,se.depsTail.nextDep=l,se.depsTail=l,se.deps===l&&(se.deps=n)}return l}trigger(t){this.version++,Vt++,this.notify(t)}notify(t){ns();try{for(let l=this.subs;l;l=l.prevSub)l.sub.notify()&&l.sub.dep.notify()}finally{is()}}}function Tn(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Tn(n)}const l=e.dep.subs;l!==e&&(e.prevSub=l,l&&(l.nextSub=e)),e.dep.subs=e}}const Bl=new WeakMap,vt=Symbol(""),Wl=Symbol(""),Kt=Symbol("");function pe(e,t,l){if(Ie&&se){let n=Bl.get(e);n||Bl.set(e,n=new Map);let i=n.get(l);i||(n.set(l,i=new as),i.map=n,i.key=l),i.track()}}function Ye(e,t,l,n,i,o){const r=Bl.get(e);if(!r){Vt++;return}const a=c=>{c&&c.trigger()};if(ns(),t==="clear")r.forEach(a);else{const c=R(e),p=c&&ls(l);if(c&&l==="length"){const f=Number(n);r.forEach((b,S)=>{(S==="length"||S===Kt||!Ue(S)&&S>=f)&&a(b)})}else switch((l!==void 0||r.has(void 0))&&a(r.get(l)),p&&a(r.get(Kt)),t){case"add":c?p&&a(r.get("length")):(a(r.get(vt)),at(e)&&a(r.get(Wl)));break;case"delete":c||(a(r.get(vt)),at(e)&&a(r.get(Wl)));break;case"set":at(e)&&a(r.get(vt));break}}is()}function xt(e){const t=Z(e);return t===e||(pe(t,"iterate",Kt),je(e))?t:Be(e)?rt(e)?t.map(l=>ut(Ae(l))):t.map(ut):t.map(Ae)}function Sl(e){return pe(e=Z(e),"iterate",Kt),e}function He(e,t){return Be(e)?ut(rt(e)?Ae(t):t):Ae(t)}const Hi={__proto__:null,[Symbol.iterator](){return Dl(this,Symbol.iterator,e=>He(this,e))},concat(...e){return xt(this).concat(...e.map(t=>R(t)?xt(t):t))},entries(){return Dl(this,"entries",e=>(e[1]=He(this,e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,l=>l.map(n=>He(this,n)),arguments)},find(e,t){return We(this,"find",e,t,l=>He(this,l),arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,l=>He(this,l),arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return Fl(this,"includes",e)},indexOf(...e){return Fl(this,"indexOf",e)},join(e){return xt(this).join(e)},lastIndexOf(...e){return Fl(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return $t(this,"pop")},push(...e){return $t(this,"push",e)},reduce(e,...t){return Is(this,"reduce",e,t)},reduceRight(e,...t){return Is(this,"reduceRight",e,t)},shift(){return $t(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return $t(this,"splice",e)},toReversed(){return xt(this).toReversed()},toSorted(e){return xt(this).toSorted(e)},toSpliced(...e){return xt(this).toSpliced(...e)},unshift(...e){return $t(this,"unshift",e)},values(){return Dl(this,"values",e=>He(this,e))}};function Dl(e,t,l){const n=Sl(e),i=n[t]();return n!==e&&!je(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.done||(o.value=l(o.value)),o}),i}const Li=Array.prototype;function We(e,t,l,n,i,o){const r=Sl(e),a=r!==e&&!je(e),c=r[t];if(c!==Li[t]){const b=c.apply(e,o);return a?Ae(b):b}let p=l;r!==e&&(a?p=function(b,S){return l.call(this,He(e,b),S,e)}:l.length>2&&(p=function(b,S){return l.call(this,b,S,e)}));const f=c.call(r,p,n);return a&&i?i(f):f}function Is(e,t,l,n){const i=Sl(e),o=i!==e&&!je(e);let r=l,a=!1;i!==e&&(o?(a=n.length===0,r=function(p,f,b){return a&&(a=!1,p=He(e,p)),l.call(this,p,He(e,f),b,e)}):l.length>3&&(r=function(p,f,b){return l.call(this,p,f,b,e)}));const c=i[t](r,...n);return a?He(e,c):c}function Fl(e,t,l){const n=Z(e);pe(n,"iterate",Kt);const i=n[t](...l);return(i===-1||i===!1)&&ds(l[0])?(l[0]=Z(l[0]),n[t](...l)):i}function $t(e,t,l=[]){et(),ns();const n=Z(e)[t].apply(e,l);return is(),tt(),n}const Vi=es("__proto__,__v_isRef,__isVue"),Mn=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ue));function Ki(e){Ue(e)||(e=String(e));const t=Z(this);return pe(t,"has",e),t.hasOwnProperty(e)}class jn{constructor(t=!1,l=!1){this._isReadonly=t,this._isShallow=l}get(t,l,n){if(l==="__v_skip")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(l==="__v_isReactive")return!i;if(l==="__v_isReadonly")return i;if(l==="__v_isShallow")return o;if(l==="__v_raw")return n===(i?o?Qi:qn:o?$n:Pn).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=R(t);if(!i){let c;if(r&&(c=Hi[l]))return c;if(l==="hasOwnProperty")return Ki}const a=Reflect.get(t,l,he(t)?t:n);if((Ue(l)?Mn.has(l):Vi(l))||(i||pe(t,"get",l),o))return a;if(he(a)){const c=r&&ls(l)?a:a.value;return i&&Q(c)?Zl(c):c}return Q(a)?i?Zl(a):cs(a):a}}class An extends jn{constructor(t=!1){super(!1,t)}set(t,l,n,i){let o=t[l];const r=R(t)&&ls(l);if(!this._isShallow){const p=Be(o);if(!je(n)&&!Be(n)&&(o=Z(o),n=Z(n)),!r&&he(o)&&!he(n))return p||(o.value=n),!0}const a=r?Number(l)e,sl=e=>Reflect.getPrototypeOf(e);function Zi(e,t,l){return function(...n){const i=this.__v_raw,o=Z(i),r=at(o),a=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,p=i[e](...n),f=l?zl:t?ut:Ae;return!t&&pe(o,"iterate",c?Wl:vt),me(Object.create(p),{next(){const{value:b,done:S}=p.next();return S?{value:b,done:S}:{value:a?[f(b[0]),f(b[1])]:f(b),done:S}}})}}function nl(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Yi(e,t){const l={get(i){const o=this.__v_raw,r=Z(o),a=Z(i);e||(Ve(i,a)&&pe(r,"get",i),pe(r,"get",a));const{has:c}=sl(r),p=t?zl:e?ut:Ae;if(c.call(r,i))return p(o.get(i));if(c.call(r,a))return p(o.get(a));o!==r&&o.get(i)},get size(){const i=this.__v_raw;return!e&&pe(Z(i),"iterate",vt),i.size},has(i){const o=this.__v_raw,r=Z(o),a=Z(i);return e||(Ve(i,a)&&pe(r,"has",i),pe(r,"has",a)),i===a?o.has(i):o.has(i)||o.has(a)},forEach(i,o){const r=this,a=r.__v_raw,c=Z(a),p=t?zl:e?ut:Ae;return!e&&pe(c,"iterate",vt),a.forEach((f,b)=>i.call(o,p(f),p(b),r))}};return me(l,e?{add:nl("add"),set:nl("set"),delete:nl("delete"),clear:nl("clear")}:{add(i){const o=Z(this),r=sl(o),a=Z(i),c=!t&&!je(i)&&!Be(i)?a:i;return r.has.call(o,c)||Ve(i,c)&&r.has.call(o,i)||Ve(a,c)&&r.has.call(o,a)||(o.add(c),Ye(o,"add",c,c)),this},set(i,o){!t&&!je(o)&&!Be(o)&&(o=Z(o));const r=Z(this),{has:a,get:c}=sl(r);let p=a.call(r,i);p||(i=Z(i),p=a.call(r,i));const f=c.call(r,i);return r.set(i,o),p?Ve(o,f)&&Ye(r,"set",i,o):Ye(r,"add",i,o),this},delete(i){const o=Z(this),{has:r,get:a}=sl(o);let c=r.call(o,i);c||(i=Z(i),c=r.call(o,i)),a&&a.call(o,i);const p=o.delete(i);return c&&Ye(o,"delete",i,void 0),p},clear(){const i=Z(this),o=i.size!==0,r=i.clear();return o&&Ye(i,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(i=>{l[i]=Zi(i,e,t)}),l}function rs(e,t){const l=Yi(e,t);return(n,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(Y(l,i)&&i in n?l:n,i,o)}const Gi={get:rs(!1,!1)},Ji={get:rs(!1,!0)},Xi={get:rs(!0,!1)};const Pn=new WeakMap,$n=new WeakMap,qn=new WeakMap,Qi=new WeakMap;function eo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function cs(e){return Be(e)?e:us(e,!1,Bi,Gi,Pn)}function to(e){return us(e,!1,zi,Ji,$n)}function Zl(e){return us(e,!0,Wi,Xi,qn)}function us(e,t,l,n,i){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const o=i.get(e);if(o)return o;const r=eo(Si(e));if(r===0)return e;const a=new Proxy(e,r===2?n:l);return i.set(e,a),a}function rt(e){return Be(e)?rt(e.__v_raw):!!(e&&e.__v_isReactive)}function Be(e){return!!(e&&e.__v_isReadonly)}function je(e){return!!(e&&e.__v_isShallow)}function ds(e){return e?!!e.__v_raw:!1}function Z(e){const t=e&&e.__v_raw;return t?Z(t):e}function lo(e){return!Y(e,"__v_skip")&&Object.isExtensible(e)&&hn(e,"__v_skip",!0),e}const Ae=e=>Q(e)?cs(e):e,ut=e=>Q(e)?Zl(e):e;function he(e){return e?e.__v_isRef===!0:!1}function Se(e){return On(e,!1)}function In(e){return On(e,!0)}function On(e,t){return he(e)?e:new so(e,t)}class so{constructor(t,l){this.dep=new as,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=l?t:Z(t),this._value=l?t:Ae(t),this.__v_isShallow=l}get value(){return this.dep.track(),this._value}set value(t){const l=this._rawValue,n=this.__v_isShallow||je(t)||Be(t);t=n?t:Z(t),Ve(t,l)&&(this._rawValue=t,this._value=n?t:Ae(t),this.dep.trigger())}}function U(e){return he(e)?e.value:e}const no={get:(e,t,l)=>t==="__v_raw"?e:U(Reflect.get(e,t,l)),set:(e,t,l,n)=>{const i=e[t];return he(i)&&!he(l)?(i.value=l,!0):Reflect.set(e,t,l,n)}};function En(e){return rt(e)?e:new Proxy(e,no)}class io{constructor(t,l,n){this.fn=t,this.setter=l,this._value=void 0,this.dep=new as(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Vt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!l,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&se!==this)return xn(this,!0),!0}get value(){const t=this.dep.track();return Cn(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function oo(e,t,l=!1){let n,i;return H(e)?n=e:(n=e.get,i=e.set),new io(n,i,l)}const il={},fl=new WeakMap;let bt;function ao(e,t=!1,l=bt){if(l){let n=fl.get(l);n||fl.set(l,n=[]),n.push(e)}}function ro(e,t,l=te){const{immediate:n,deep:i,once:o,scheduler:r,augmentJob:a,call:c}=l,p=O=>i?O:je(O)||i===!1||i===0?Ge(O,1):Ge(O);let f,b,S,T,W=!1,F=!1;if(he(e)?(b=()=>e.value,W=je(e)):rt(e)?(b=()=>p(e),W=!0):R(e)?(F=!0,W=e.some(O=>rt(O)||je(O)),b=()=>e.map(O=>{if(he(O))return O.value;if(rt(O))return p(O);if(H(O))return c?c(O,2):O()})):H(e)?t?b=c?()=>c(e,2):e:b=()=>{if(S){et();try{S()}finally{tt()}}const O=bt;bt=f;try{return c?c(e,3,[T]):e(T)}finally{bt=O}}:b=Ke,t&&i){const O=b,D=i===!0?1/0:i;b=()=>Ge(O(),D)}const ie=Di(),J=()=>{f.stop(),ie&&ie.active&&ts(ie.effects,f)};if(o&&t){const O=t;t=(...D)=>{const x=O(...D);return J(),x}}let V=F?new Array(e.length).fill(il):il;const z=O=>{if(!(!(f.flags&1)||!f.dirty&&!O))if(t){const D=f.run();if(O||i||W||(F?D.some((x,A)=>Ve(x,V[A])):Ve(D,V))){S&&S();const x=bt;bt=f;try{const A=[D,V===il?void 0:F&&V[0]===il?[]:V,T];V=D,c?c(t,3,A):t(...A)}finally{bt=x}}}else f.run()};return a&&a(z),f=new yn(b),f.scheduler=r?()=>r(z,!1):z,T=O=>ao(O,!1,f),S=f.onStop=()=>{const O=fl.get(f);if(O){if(c)c(O,4);else for(const D of O)D();fl.delete(f)}},t?n?z(!0):V=f.run():r?r(z.bind(null,!0),!0):f.run(),J.pause=f.pause.bind(f),J.resume=f.resume.bind(f),J.stop=J,J}function Ge(e,t=1/0,l){if(t<=0||!Q(e)||e.__v_skip||(l=l||new Map,(l.get(e)||0)>=t))return e;if(l.set(e,t),t--,he(e))Ge(e.value,t,l);else if(R(e))for(let n=0;n{Ge(n,t,l)});else if(fn(e)){for(const n in e)Ge(e[n],t,l);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&Ge(e[n],t,l)}return e}function Jt(e,t,l,n){try{return n?e(...n):e()}catch(i){Tl(i,t,l)}}function Oe(e,t,l,n){if(H(e)){const i=Jt(e,t,l,n);return i&&un(i)&&i.catch(o=>{Tl(o,t,l)}),i}if(R(e)){const i=[];for(let o=0;o>>1,i=ve[n],o=Ut(i);o=Ut(l)?ve.push(e):ve.splice(uo(t),0,e),e.flags|=1,Fn()}}function Fn(){pl||(pl=Rn.then(Hn))}function fo(e){if(!R(e))it&&e.id===-1?it.splice(wt+1,0,e):e.flags&1||(kt.push(e),e.flags|=1);else for(let t=0;tUt(l)-Ut(n));if(kt.length=0,it){for(let l=0;le.id==null?e.flags&2?-1:1/0:e.id;function Hn(e){try{for(Ne=0;Ne{n._d&&Bs(-1);const o=hl(t),r=yt.length;let a;try{a=e(...i)}finally{for(let c=yt.length;c>r;c--)di();hl(o),n._d&&Bs(1)}return a};return n._n=!0,n._c=!0,n._d=!0,n}function nt(e,t){if(Me===null)return e;const l=$l(Me),n=e.dirs||(e.dirs=[]);for(let i=0;i1)return l&&H(t)?t.call(n&&n.proxy):t}}const mo=Symbol.for("v-scx"),bo=()=>cl(mo);function Ct(e,t,l){return Vn(e,t,l)}function Vn(e,t,l=te){const{immediate:n,deep:i,flush:o,once:r}=l,a=me({},l),c=t&&n||!t&&o!=="post";let p;if(zt){if(o==="sync"){const T=bo();p=T.__watcherHandles||(T.__watcherHandles=[])}else if(!c){const T=()=>{};return T.stop=Ke,T.resume=Ke,T.pause=Ke,T}}const f=ye;a.call=(T,W,F)=>Oe(T,f,W,F);let b=!1;o==="post"?a.scheduler=T=>{_e(T,f&&f.suspense)}:o!=="sync"&&(b=!0,a.scheduler=(T,W)=>{W?T():fs(T)}),a.augmentJob=T=>{t&&(T.flags|=4),b&&(T.flags|=2,f&&(T.id=f.uid,T.i=f))};const S=ro(e,t,a);return zt&&(p?p.push(S):c&&S()),S}function go(e,t,l){const n=this.proxy,i=ae(e)?e.includes(".")?Kn(n,e):()=>n[e]:e.bind(n,n);let o;H(t)?o=t:(o=t.handler,l=t);const r=Xt(this),a=Vn(i,o.bind(n),l);return r(),a}function Kn(e,t){const l=t.split(".");return()=>{let n=e;for(let i=0;ie.__isTeleport,Nl=Symbol("_leaveCb");function yo(e){let t=e[0];if(e.length>1){for(const l of e)if(l.type!==lt){t=l;break}}return t}function Un(e){if(!hs(e))return Ml(e.type)&&e.children?yo(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:l}=e;if(l){if(t&16)return l[0];if(t&32&&H(l.default))return l.default()}}function ps(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const l=e.component.subTree;ps(Ml(l.type)&&Un(l)||l,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Bn(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Es(e,t){let l;return!!((l=Object.getOwnPropertyDescriptor(e,t))&&!l.configurable)}const ml=new WeakMap;function Nt(e,t,l,n,i=!1){if(R(e)){e.forEach((F,ie)=>Nt(F,t&&(R(t)?t[ie]:t),l,n,i));return}if(Ht(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Nt(e,t,l,n.component.subTree);return}const o=n.shapeFlag&4?$l(n.component):n.el,r=i?null:o,{i:a,r:c}=e,p=t&&t.r,f=a.refs===te?a.refs={}:a.refs,b=a.setupState,S=Z(b),T=b===te?cn:F=>Es(f,F)?!1:Y(S,F),W=(F,ie)=>!(ie&&Es(f,ie));if(p!=null&&p!==c){if(Rs(t),ae(p))f[p]=null,T(p)&&(b[p]=null);else if(he(p)){const F=t;W(p,F.k)&&(p.value=null),F.k&&(f[F.k]=null)}}if(H(c))Jt(c,a,12,[r,f]);else{const F=ae(c),ie=he(c);if(F||ie){const J=()=>{if(e.f){const V=F?T(c)?b[c]:f[c]:W()||!e.k?c.value:f[e.k];if(i)R(V)&&ts(V,o);else if(R(V))V.includes(o)||V.push(o);else if(F)f[c]=[o],T(c)&&(b[c]=f[c]);else{const z=[o];W(c,e.k)&&(c.value=z),e.k&&(f[e.k]=z)}}else F?(f[c]=r,T(c)&&(b[c]=r)):ie&&(W(c,e.k)&&(c.value=r),e.k&&(f[e.k]=r))};if(r){const V=()=>{J(),ml.delete(e)};V.id=-1,ml.set(e,V),_e(V,l)}else Rs(e),J()}}}function Rs(e){const t=ml.get(e);t&&(t.flags|=8,ml.delete(e))}Cl().requestIdleCallback;Cl().cancelIdleCallback;const Ht=e=>!!e.type.__asyncLoader,hs=e=>e.type.__isKeepAlive;function _o(e,t){Wn(e,"a",t)}function xo(e,t){Wn(e,"da",t)}function Wn(e,t,l=ye){const n=e.__wdc||(e.__wdc=()=>{let i=l;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(jl(t,n,l),l){let i=l.parent;for(;i&&i.parent;)hs(i.parent.vnode)&&wo(n,t,l,i),i=i.parent}}function wo(e,t,l,n){const i=jl(t,e,n,!0);ms(()=>{ts(n[t],i)},l)}function jl(e,t,l=ye,n=!1){if(l){const i=l[e]||(l[e]=[]),o=t.__weh||(t.__weh=(...r)=>{et();const a=Xt(l),c=Oe(t,l,e,r);return a(),tt(),c});return n?i.unshift(o):i.push(o),o}}const st=e=>(t,l=ye)=>{(!zt||e==="sp")&&jl(e,(...n)=>t(...n),l)},ko=st("bm"),zn=st("m"),Co=st("bu"),So=st("u"),To=st("bum"),ms=st("um"),Mo=st("sp"),jo=st("rtg"),Ao=st("rtc");function Po(e,t=ye){jl("ec",e,t)}const $o=Symbol.for("v-ndc");function $e(e,t,l,n){let i;const o=l,r=R(e);if(r||ae(e)){const a=r&&rt(e);let c=!1,p=!1;a&&(c=!je(e),p=Be(e),e=Sl(e)),i=new Array(e.length);for(let f=0,b=e.length;ft(a,c,void 0,o));else{const a=Object.keys(e);i=new Array(a.length);for(let c=0,p=a.length;ce?bi(e)?$l(e):Yl(e.parent):null,Lt=me(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Yl(e.parent),$root:e=>Yl(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Yn(e),$forceUpdate:e=>e.f||(e.f=()=>{fs(e.update)}),$nextTick:e=>e.n||(e.n=Dn.bind(e.proxy)),$watch:e=>go.bind(e)}),Hl=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),qo={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:l,setupState:n,data:i,props:o,accessCache:r,type:a,appContext:c}=e;if(t[0]!=="$"){const S=r[t];if(S!==void 0)switch(S){case 1:return n[t];case 2:return i[t];case 4:return l[t];case 3:return o[t]}else{if(Hl(n,t))return r[t]=1,n[t];if(i!==te&&Y(i,t))return r[t]=2,i[t];if(Y(o,t))return r[t]=3,o[t];if(l!==te&&Y(l,t))return r[t]=4,l[t];Gl&&(r[t]=0)}}const p=Lt[t];let f,b;if(p)return t==="$attrs"&&pe(e.attrs,"get",""),p(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(l!==te&&Y(l,t))return r[t]=4,l[t];if(b=c.config.globalProperties,Y(b,t))return b[t]},set({_:e},t,l){const{data:n,setupState:i,ctx:o}=e;return Hl(i,t)?(i[t]=l,!0):n!==te&&Y(n,t)?(n[t]=l,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=l,!0)},has({_:{data:e,setupState:t,accessCache:l,ctx:n,appContext:i,props:o,type:r}},a){let c;return!!(l[a]||e!==te&&a[0]!=="$"&&Y(e,a)||Hl(t,a)||Y(o,a)||Y(n,a)||Y(Lt,a)||Y(i.config.globalProperties,a)||(c=r.__cssModules)&&c[a])},defineProperty(e,t,l){return l.get!=null?e._.accessCache[t]=0:Y(l,"value")&&this.set(e,t,l.value,null),Reflect.defineProperty(e,t,l)}};function Ds(e){return R(e)?e.reduce((t,l)=>(t[l]=null,t),{}):e}let Gl=!0;function Io(e){const t=Yn(e),l=e.proxy,n=e.ctx;Gl=!1,t.beforeCreate&&Fs(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:r,watch:a,provide:c,inject:p,created:f,beforeMount:b,mounted:S,beforeUpdate:T,updated:W,activated:F,deactivated:ie,beforeDestroy:J,beforeUnmount:V,destroyed:z,unmounted:O,render:D,renderTracked:x,renderTriggered:A,errorCaptured:I,serverPrefetch:ce,expose:xe,inheritAttrs:dt,components:Qt,directives:el,filters:ql}=t;if(p&&Oo(p,n,null),r)for(const oe in r){const le=r[oe];H(le)&&(n[oe]=le.bind(l))}if(i){const oe=i.call(l,l);Q(oe)&&(e.data=cs(oe))}if(Gl=!0,o)for(const oe in o){const le=o[oe],ft=H(le)?le.bind(l,l):H(le.get)?le.get.bind(l,l):Ke,tl=!H(le)&&H(le.set)?le.set.bind(l):Ke,pt=ot({get:ft,set:tl});Object.defineProperty(n,oe,{enumerable:!0,configurable:!0,get:()=>pt.value,set:Pe=>pt.value=Pe})}if(a)for(const oe in a)Zn(a[oe],n,l,oe);if(c){const oe=H(c)?c.call(l):c;Reflect.ownKeys(oe).forEach(le=>{ho(le,oe[le])})}f&&Fs(f,e,"c");function be(oe,le){R(le)?le.forEach(ft=>oe(ft.bind(l))):le&&oe(le.bind(l))}if(be(ko,b),be(zn,S),be(Co,T),be(So,W),be(_o,F),be(xo,ie),be(Po,I),be(Ao,x),be(jo,A),be(To,V),be(ms,O),be(Mo,ce),R(xe))if(xe.length){const oe=e.exposed||(e.exposed={});xe.forEach(le=>{Object.defineProperty(oe,le,{get:()=>l[le],set:ft=>l[le]=ft,enumerable:!0})})}else e.exposed||(e.exposed={});D&&e.render===Ke&&(e.render=D),dt!=null&&(e.inheritAttrs=dt),Qt&&(e.components=Qt),el&&(e.directives=el),ce&&Bn(e)}function Oo(e,t,l=Ke){R(e)&&(e=Jl(e));for(const n in e){const i=e[n];let o;Q(i)?"default"in i?o=cl(i.from||n,i.default,!0):o=cl(i.from||n):o=cl(i),he(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):t[n]=o}}function Fs(e,t,l){Oe(R(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,l)}function Zn(e,t,l,n){let i=n.includes(".")?Kn(l,n):()=>l[n];if(ae(e)){const o=t[e];H(o)&&Ct(i,o)}else if(H(e))Ct(i,e.bind(l));else if(Q(e))if(R(e))e.forEach(o=>Zn(o,t,l,n));else{const o=H(e.handler)?e.handler.bind(l):t[e.handler];H(o)&&Ct(i,o,e)}}function Yn(e){const t=e.type,{mixins:l,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,a=o.get(t);let c;return a?c=a:!i.length&&!l&&!n?c=t:(c={},i.length&&i.forEach(p=>bl(c,p,r,!0)),bl(c,t,r)),Q(t)&&o.set(t,c),c}function bl(e,t,l,n=!1){const{mixins:i,extends:o}=t;o&&bl(e,o,l,!0),i&&i.forEach(r=>bl(e,r,l,!0));for(const r in t)if(!(n&&r==="expose")){const a=Eo[r]||l&&l[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const Eo={data:Ns,props:Hs,emits:Hs,methods:Ot,computed:Ot,beforeCreate:ge,created:ge,beforeMount:ge,mounted:ge,beforeUpdate:ge,updated:ge,beforeDestroy:ge,beforeUnmount:ge,destroyed:ge,unmounted:ge,activated:ge,deactivated:ge,errorCaptured:ge,serverPrefetch:ge,components:Ot,directives:Ot,watch:Do,provide:Ns,inject:Ro};function Ns(e,t){return t?e?function(){return me(H(e)?e.call(this,this):e,H(t)?t.call(this,this):t)}:t:e}function Ro(e,t){return Ot(Jl(e),Jl(t))}function Jl(e){if(R(e)){const t={};for(let l=0;lt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${qe(t)}Modifiers`]||e[`${_t(t)}Modifiers`];function Lo(e,t,...l){if(e.isUnmounted)return;const n=e.vnode.props||te;let i=l;const o=t.startsWith("update:"),r=o&&Ho(n,t.slice(7));r&&(r.trim&&(i=l.map(f=>ae(f)?f.trim():f)),r.number&&(i=i.map(mn)));let a,c=n[a=Ol(t)]||n[a=Ol(qe(t))];!c&&o&&(c=n[a=Ol(_t(t))]),c&&Oe(c,e,6,i);const p=n[a+"Once"];if(p){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Oe(p,e,6,i)}}const Vo=new WeakMap;function Jn(e,t,l=!1){const n=l?Vo:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let r={},a=!1;if(!H(e)){const c=p=>{const f=Jn(p,t,!0);f&&(a=!0,me(r,f))};!l&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!a?(Q(e)&&n.set(e,null),null):(R(o)?o.forEach(c=>r[c]=null):me(r,o),Q(e)&&n.set(e,r),r)}function Al(e,t){return!e||!xl(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,_t(t))||Y(e,t))}function Ls(e){const{type:t,vnode:l,proxy:n,withProxy:i,propsOptions:[o],slots:r,attrs:a,emit:c,render:p,renderCache:f,props:b,data:S,setupState:T,ctx:W,inheritAttrs:F}=e,ie=hl(e);let J,V;try{if(l.shapeFlag&4){const O=i||n,D=O;J=Le(p.call(D,O,f,b,T,S,W)),V=a}else{const O=t;J=Le(O.length>1?O(b,{attrs:a,slots:r,emit:c}):O(b,null)),V=t.props?a:Ko(a)}}catch(O){yt.length=0,Tl(O,e,1),J=L(lt)}let z=J;if(V&&F!==!1){const O=Object.keys(V),{shapeFlag:D}=z;O.length&&D&7&&(o&&O.some(wl)&&(V=Uo(V,o)),z=Mt(z,V,!1,!0))}if(l.dirs&&(z=Mt(z,null,!1,!0),z.dirs=z.dirs?z.dirs.concat(l.dirs):l.dirs),l.transition){const O=Ml(z.type)&&Un(z)||z;ps(O,l.transition)}return J=z,hl(ie),J}const Ko=e=>{let t;for(const l in e)(l==="class"||l==="style"||xl(l))&&((t||(t={}))[l]=e[l]);return t},Uo=(e,t)=>{const l={};for(const n in e)(!wl(n)||!(n.slice(9)in t))&&(l[n]=e[n]);return l};function Bo(e,t,l){const{props:n,children:i,component:o}=e,{props:r,children:a,patchFlag:c}=t,p=o.emitsOptions;if(t.dirs||t.transition)return!0;if(l&&c>=0){if(c&1024)return!0;if(c&16)return n?Vs(n,r,p):!!r;if(c&8){const f=t.dynamicProps;for(let b=0;bObject.create(Qn),ti=e=>Object.getPrototypeOf(e)===Qn;function zo(e,t,l,n=!1){const i={},o=ei();e.propsDefaults=Object.create(null),li(e,t,i,o);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);l?e.props=n?i:to(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function Zo(e,t,l,n){const{props:i,attrs:o,vnode:{patchFlag:r}}=e,a=Z(i),[c]=e.propsOptions;let p=!1;if((n||r>0)&&!(r&16)){if(r&8){const f=e.vnode.dynamicProps;for(let b=0;b{c=!0;const[S,T]=si(b,t,!0);me(r,S),T&&a.push(...T)};!l&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return Q(e)&&n.set(e,gt),gt;if(R(o))for(let f=0;fe==="_"||e==="_ctx"||e==="$stable",gs=e=>R(e)?e.map(Le):[Le(e)],Go=(e,t,l)=>{if(t._n)return t;const n=po((...i)=>gs(t(...i)),l);return n._c=!1,n},ni=(e,t,l)=>{const n=e._ctx;for(const i in e){if(bs(i))continue;const o=e[i];if(H(o))t[i]=Go(i,o,n);else if(o!=null){const r=gs(o);t[i]=()=>r}}},ii=(e,t)=>{const l=gs(t);e.slots.default=()=>l},oi=(e,t,l)=>{for(const n in t)(l||!bs(n))&&(e[n]=t[n])},Jo=(e,t,l)=>{const n=e.slots=ei();if(e.vnode.shapeFlag&32){const i=t._;i?(oi(n,t,l),l&&hn(n,"_",i,!0)):ni(t,n)}else t&&ii(e,t)},Xo=(e,t,l)=>{const{vnode:n,slots:i}=e;let o=!0,r=te;if(n.shapeFlag&32){const a=t._;a?l&&a===1?o=!1:oi(i,t,l):(o=!t.$stable,ni(t,i)),r=t}else t&&(ii(e,t),r={default:1});if(o)for(const a in i)!bs(a)&&r[a]==null&&delete i[a]},_e=sa;function Qo(e){return ea(e)}function ea(e,t){const l=Cl();l.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:r,createText:a,createComment:c,setText:p,setElementText:f,parentNode:b,nextSibling:S,setScopeId:T=Ke,insertStaticContent:W}=e,F=(u,d,m,_=null,g=null,y=null,C=void 0,k=null,w=!!d.dynamicChildren)=>{if(u===d)return;u&&!qt(u,d)&&(_=ll(u),Pe(u,g,y,!0),u=null),d.patchFlag===-2&&(w=!1,d.dynamicChildren=null),d.dynamicChildren&&u&&u.dynamicChildren&&u.dynamicChildren.hasOnce&&(d.dynamicChildren===gt&&(d.dynamicChildren=[]),d.dynamicChildren.hasOnce=!0);const{type:v,ref:E,shapeFlag:M}=d;switch(v){case Pl:ie(u,d,m,_);break;case lt:J(u,d,m,_);break;case ul:u==null&&V(d,m,_,C);break;case G:Qt(u,d,m,_,g,y,C,k,w);break;default:M&1?D(u,d,m,_,g,y,C,k,w):M&6?el(u,d,m,_,g,y,C,k,w):(M&64||M&128)&&v.process(u,d,m,_,g,y,C,k,w,At)}E!=null&&g?Nt(E,u&&u.ref,y,d||u,!d):E==null&&u&&u.ref!=null&&Nt(u.ref,null,y,u,!0)},ie=(u,d,m,_)=>{if(u==null)n(d.el=a(d.children),m,_);else{const g=d.el=u.el;d.children!==u.children&&p(g,d.children)}},J=(u,d,m,_)=>{u==null?n(d.el=c(d.children||""),m,_):d.el=u.el},V=(u,d,m,_)=>{[u.el,u.anchor]=W(u.children,d,m,_,u.el,u.anchor)},z=({el:u,anchor:d},m,_)=>{let g;for(;u&&u!==d;)g=S(u),n(u,m,_),u=g;n(d,m,_)},O=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=S(u),i(u),u=m;i(d)},D=(u,d,m,_,g,y,C,k,w)=>{if(d.type==="svg"?C="svg":d.type==="math"&&(C="mathml"),u==null)x(d,m,_,g,y,C,k,w);else{const v=u.el&&u.el._isVueCE?u.el:null;try{v&&v._beginPatch(),ce(u,d,g,y,C,k,w)}finally{v&&v._endPatch()}}},x=(u,d,m,_,g,y,C,k)=>{let w,v;const{props:E,shapeFlag:M,transition:q,dirs:N}=u;if(w=u.el=r(u.type,y,E&&E.is,E),M&8?f(w,u.children):M&16&&I(u.children,w,null,_,g,Ll(u,y),C,k),N&&ht(u,null,_,"created"),A(w,u,u.scopeId,C,_),E){for(const ee in E)ee!=="value"&&!Rt(ee)&&o(w,ee,null,E[ee],y,_);"value"in E&&o(w,"value",null,E.value,y),(v=E.onVnodeBeforeMount)&&Fe(v,_,u)}N&&ht(u,null,_,"beforeMount");const K=ta(g,q);K&&q.beforeEnter(w),n(w,d,m),((v=E&&E.onVnodeMounted)||K||N)&&_e(()=>{v&&Fe(v,_,u),K&&q.enter(w),N&&ht(u,null,_,"mounted")},g)},A=(u,d,m,_,g)=>{if(m&&T(u,m),_)for(let y=0;y<_.length;y++)T(u,_[y]);if(g){let y=g.subTree;if(d===y||ui(y.type)&&(y.ssContent===d||y.ssFallback===d)){const C=g.vnode;A(u,C,C.scopeId,C.slotScopeIds,g.parent)}}},I=(u,d,m,_,g,y,C,k,w=0)=>{for(let v=w;v{const k=d.el=u.el;let{patchFlag:w,dynamicChildren:v,dirs:E}=d;w|=u.patchFlag&16;const M=u.props||te,q=d.props||te;let N;if(m&&mt(m,!1),(N=q.onVnodeBeforeUpdate)&&Fe(N,m,d,u),E&&ht(d,u,m,"beforeUpdate"),m&&mt(m,!0),v&&(!u.dynamicChildren||u.dynamicChildren.length!==v.length)&&(w=0,C=!1,v=null),(M.innerHTML&&q.innerHTML==null||M.textContent&&q.textContent==null)&&f(k,""),v?xe(u.dynamicChildren,v,k,m,_,Ll(d,g),y):C||le(u,d,k,null,m,_,Ll(d,g),y,!1),w>0){if(w&16)dt(k,M,q,m,g);else if(w&2&&M.class!==q.class&&o(k,"class",null,q.class,g),w&4&&o(k,"style",M.style,q.style,g),w&8){const K=d.dynamicProps;for(let ee=0;ee{N&&Fe(N,m,d,u),E&&ht(d,u,m,"updated")},_)},xe=(u,d,m,_,g,y,C)=>{for(let k=0;k{if(d!==m){if(d!==te)for(const y in d)!Rt(y)&&!(y in m)&&o(u,y,d[y],null,g,_);for(const y in m){if(Rt(y))continue;const C=m[y],k=d[y];C!==k&&y!=="value"&&o(u,y,k,C,g,_)}"value"in m&&o(u,"value",d.value,m.value,g)}},Qt=(u,d,m,_,g,y,C,k,w)=>{const v=d.el=u?u.el:a(""),E=d.anchor=u?u.anchor:a("");let{patchFlag:M,dynamicChildren:q,slotScopeIds:N}=d;N&&(k=k?k.concat(N):N),u==null?(n(v,m,_),n(E,m,_),I(d.children||[],m,E,g,y,C,k,w)):M>0&&M&64&&q&&u.dynamicChildren&&u.dynamicChildren.length===q.length?(xe(u.dynamicChildren,q,m,g,y,C,k),(d.key!=null||g&&d===g.subTree)&&ai(u,d,!0)):le(u,d,m,E,g,y,C,k,w)},el=(u,d,m,_,g,y,C,k,w)=>{d.slotScopeIds=k,u==null?d.shapeFlag&512?g.ctx.activate(d,m,_,C,w):ql(d,m,_,g,y,C,w):ws(u,d,w)},ql=(u,d,m,_,g,y,C)=>{const k=u.component=ra(u,_,g);if(hs(u)&&(k.ctx.renderer=At),ua(k,!1,C),k.asyncDep){if(g&&g.registerDep(k,be,C),!u.el){const w=k.subTree=L(lt);J(null,w,d,m),u.placeholder=w.el}}else be(k,u,d,m,g,y,C)},ws=(u,d,m)=>{const _=d.component=u.component;if(Bo(u,d,m))if(_.asyncDep&&!_.asyncResolved){d.el=u.el,oe(_,d,m);return}else _.next=d,_.update();else d.el=u.el,_.vnode=d},be=(u,d,m,_,g,y,C)=>{const k=()=>{if(u.isMounted){let{next:M,bu:q,u:N,parent:K,vnode:ee}=u;{const Re=ri(u);if(Re){M&&(M.el=ee.el,oe(u,M,C)),Re.asyncDep.then(()=>{_e(()=>{u.isUnmounted||v()},g)});return}}let X=M,re;mt(u,!1),M?(M.el=ee.el,oe(u,M,C)):M=ee,q&&rl(q),(re=M.props&&M.props.onVnodeBeforeUpdate)&&Fe(re,K,M,ee),mt(u,!0);const ue=Ls(u),Ee=u.subTree;u.subTree=ue,F(Ee,ue,b(Ee.el),ll(Ee),u,g,y),M.el=ue.el,X===null&&Wo(u,ue.el),N&&_e(N,g),(re=M.props&&M.props.onVnodeUpdated)&&_e(()=>Fe(re,K,M,ee),g)}else{let M;const{el:q,props:N}=d,{bm:K,m:ee,parent:X,root:re,type:ue}=u,Ee=Ht(d);mt(u,!1),K&&rl(K),!Ee&&(M=N&&N.onVnodeBeforeMount)&&Fe(M,X,d),mt(u,!0);{re.ce&&re.ce._hasShadowRoot()&&re.ce._injectChildStyle(ue,u.parent?u.parent.type:void 0);const Re=u.subTree=Ls(u);F(null,Re,m,_,u,g,y),d.el=Re.el}if(ee&&_e(ee,g),!Ee&&(M=N&&N.onVnodeMounted)){const Re=d;_e(()=>Fe(M,X,Re),g)}(d.shapeFlag&256||X&&Ht(X.vnode)&&X.vnode.shapeFlag&256)&&u.a&&_e(u.a,g),u.isMounted=!0,d=m=_=null}};u.scope.on();const w=u.effect=new yn(k);u.scope.off();const v=u.update=w.run.bind(w),E=u.job=w.runIfDirty.bind(w);E.i=u,E.id=u.uid,w.scheduler=()=>fs(E),mt(u,!0),v()},oe=(u,d,m)=>{d.component=u;const _=u.vnode.props;u.vnode=d,u.next=null,Zo(u,d.props,_,m),Xo(u,d.children,m),et(),Os(u),tt()},le=(u,d,m,_,g,y,C,k,w=!1)=>{const v=u&&u.children,E=u?u.shapeFlag:0,M=d.children,{patchFlag:q,shapeFlag:N}=d;if(q>0){if(q&128){tl(v,M,m,_,g,y,C,k,w);return}else if(q&256){ft(v,M,m,_,g,y,C,k,w);return}}N&8?(E&16&&jt(v,g,y),M!==v&&f(m,M)):E&16?N&16?tl(v,M,m,_,g,y,C,k,w):jt(v,g,y,!0):(E&8&&f(m,""),N&16&&I(M,m,_,g,y,C,k,w))},ft=(u,d,m,_,g,y,C,k,w)=>{u=u||gt,d=d||gt;const v=u.length,E=d.length,M=Math.min(v,E);let q;for(q=0;qE?jt(u,g,y,!0,!1,M):I(d,m,_,g,y,C,k,w,M)},tl=(u,d,m,_,g,y,C,k,w)=>{let v=0;const E=d.length;let M=u.length-1,q=E-1;for(;v<=M&&v<=q;){const N=u[v],K=d[v]=w?Ze(d[v]):Le(d[v]);if(qt(N,K))F(N,K,m,null,g,y,C,k,w);else break;v++}for(;v<=M&&v<=q;){const N=u[M],K=d[q]=w?Ze(d[q]):Le(d[q]);if(qt(N,K))F(N,K,m,null,g,y,C,k,w);else break;M--,q--}if(v>M){if(v<=q){const N=q+1,K=Nq)for(;v<=M;)Pe(u[v],g,y,!0),v++;else{const N=v,K=v,ee=new Map;for(v=K;v<=q;v++){const we=d[v]=w?Ze(d[v]):Le(d[v]);we.key!=null&&ee.set(we.key,v)}let X,re=0;const ue=q-K+1;let Ee=!1,Re=0;const Pt=new Array(ue);for(v=0;v=ue){Pe(we,g,y,!0);continue}let De;if(we.key!=null)De=ee.get(we.key);else for(X=K;X<=q;X++)if(Pt[X-K]===0&&qt(we,d[X])){De=X;break}De===void 0?Pe(we,g,y,!0):(Pt[De-K]=v+1,De>=Re?Re=De:Ee=!0,F(we,d[De],m,null,g,y,C,k,w),re++)}const Ss=Ee?la(Pt):gt;for(X=Ss.length-1,v=ue-1;v>=0;v--){const we=K+v,De=d[we],Ts=d[we+1],Ms=we+1{const{el:y,type:C,transition:k,children:w,shapeFlag:v}=u;if(v&6){pt(u.component.subTree,d,m,_);return}if(v&128){u.suspense.move(d,m,_);return}if(v&64){C.move(u,d,m,At);return}if(C===G){n(y,d,m);for(let M=0;Mk.enter(y),g));else{const{leave:M,delayLeave:q,afterLeave:N}=k,K=()=>{u.ctx.isUnmounted?i(y):n(y,d,m)},ee=()=>{const X=y._isLeaving||!!y[Nl];y._isLeaving&&y[Nl](!0),k.persisted&&!X?K():M(y,()=>{K(),N&&N()})};q?q(y,K,ee):ee()}else n(y,d,m)},Pe=(u,d,m,_=!1,g=!1)=>{const{type:y,props:C,ref:k,children:w,dynamicChildren:v,shapeFlag:E,patchFlag:M,dirs:q,cacheIndex:N,memo:K}=u;if((M===-2||v&&v.hasOnce)&&(g=!1),k!=null&&(et(),Nt(k,null,m,u,!0),tt()),N!=null&&(!u.ctx||u.ctx===d)&&(d.renderCache[N]=void 0),E&256){d.ctx.deactivate(u);return}const ee=E&1&&q,X=!Ht(u);let re;if(X&&(re=C&&C.onVnodeBeforeUnmount)&&Fe(re,d,u),E&6)ki(u.component,m,_);else{if(E&128){u.suspense.unmount(m,_);return}ee&&ht(u,null,d,"beforeUnmount"),E&64?u.type.remove(u,d,m,At,_):v&&!v.hasOnce&&(y!==G||M>0&&M&64)?jt(v,d,m,!1,!0):(y===G&&M&384||!g&&E&16)&&jt(w,d,m),_&&ks(u)}const ue=K!=null&&N==null;(X&&(re=C&&C.onVnodeUnmounted)||ee||ue)&&_e(()=>{re&&Fe(re,d,u),ee&&ht(u,null,d,"unmounted"),ue&&(u.el=null)},m)},ks=u=>{const{type:d,el:m,anchor:_,transition:g}=u;if(d===G){wi(m,_);return}if(d===ul){O(u),g&&!g.persisted&&g.afterLeave&&g.afterLeave();return}const y=()=>{i(m),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(u.shapeFlag&1&&g&&!g.persisted){const{leave:C,delayLeave:k}=g,w=()=>C(m,y);k?k(u.el,y,w):w()}else y()},wi=(u,d)=>{let m;for(;u!==d;)m=S(u),i(u),u=m;i(d)},ki=(u,d,m)=>{const{bum:_,scope:g,job:y,subTree:C,um:k,m:w,a:v}=u;Us(w),Us(v),_&&rl(_),g.stop(),y?(y.flags|=8,Pe(C,u,d,m)):u.vnode.el&&C&&(C.transition=u.vnode.transition,Pe(C,u,d,m)),k&&_e(k,d),_e(()=>{u.isUnmounted=!0},d)},jt=(u,d,m,_=!1,g=!1,y=0)=>{for(let C=y;C{if(u.shapeFlag&6)return ll(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=S(u.anchor||u.el),m=d&&d[vo];return m?S(m):d};let Il=!1;const Cs=(u,d,m)=>{let _;u==null?d._vnode&&(Pe(d._vnode,null,null,!0),_=d._vnode.component):F(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Il||(Il=!0,Os(_),Nn(),Il=!1)},At={p:F,um:Pe,m:pt,r:ks,mt:ql,mc:I,pc:le,pbc:xe,n:ll,o:e};return{render:Cs,hydrate:void 0,createApp:No(Cs)}}function Ll({type:e,props:t},l){return l==="svg"&&e==="foreignObject"||l==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:l}function mt({effect:e,job:t},l){l?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ta(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ai(e,t,l=!1){const n=e.children,i=t.children;if(R(n)&&R(i))for(let o=0;o>1,e[l[a]]0&&(t[n]=l[o-1]),l[o]=n)}}for(o=l.length,r=l[o-1];o-- >0;)l[o]=r,r=t[r];return l}function ri(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ri(t)}function Us(e){if(e)for(let t=0;te.__isSuspense;function sa(e,t){t&&t.pendingBranch?R(e)?t.effects.push(...e):t.effects.push(e):fo(e)}const G=Symbol.for("v-fgt"),Pl=Symbol.for("v-txt"),lt=Symbol.for("v-cmt"),ul=Symbol.for("v-stc"),yt=[];let Ce=null;function P(e=!1){yt.push(Ce=e?null:[])}function di(){yt.pop(),Ce=yt[yt.length-1]||null}let Bt=1;function Bs(e,t=!1){Bt+=e,e<0&&Ce&&t&&(Ce.hasOnce=!0)}function fi(e){return e.dynamicChildren=Bt>0?Ce||gt:null,di(),Bt>0&&Ce&&Ce.push(e),e}function $(e,t,l,n,i,o){return fi(s(e,t,l,n,i,o,!0))}function vs(e,t,l,n,i){return fi(L(e,t,l,n,i,!0))}function pi(e){return e?e.__v_isVNode===!0:!1}function qt(e,t){return e.type===t.type&&e.key===t.key}const hi=({key:e})=>e??null,dl=({ref:e,ref_key:t,ref_for:l})=>(typeof e=="number"&&(e=""+e),e!=null?ae(e)||he(e)||H(e)?{i:Me,r:e,k:t,f:!!l}:e:null);function s(e,t=null,l=null,n=0,i=null,o=e===G?0:1,r=!1,a=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&hi(t),ref:t&&dl(t),scopeId:Ln,slotScopeIds:null,children:l,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Me};return a?(gl(c,l),o&128&&e.normalize(c)):l&&(c.shapeFlag|=ae(l)?8:16),Bt>0&&!r&&Ce&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Ce.push(c),c}const L=na;function na(e,t=null,l=null,n=0,i=null,o=!1){if((!e||e===$o)&&(e=lt),pi(e)){const a=Mt(e,t,!0);return l&&gl(a,l),Bt>0&&!o&&Ce&&(a.shapeFlag&6?Ce[Ce.indexOf(e)]=a:Ce.push(a)),a.patchFlag=-2,a}if(ha(e)&&(e=e.__vccOpts),t){t=ia(t);let{class:a,style:c}=t;a&&!ae(a)&&(t.class=ct(a)),Q(c)&&(ds(c)&&!R(c)&&(c=me({},c)),t.style=Gt(c))}const r=ae(e)?1:ui(e)?128:Ml(e)?64:Q(e)?4:H(e)?2:0;return s(e,t,l,n,i,r,o,!0)}function ia(e){return e?ds(e)||ti(e)?me({},e):e:null}function Mt(e,t,l=!1,n=!1){const{props:i,ref:o,patchFlag:r,children:a,transition:c}=e,p=t?mi(i||{},t):i,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:p,key:p&&hi(p),ref:t&&t.ref?l&&o?R(o)?o.concat(dl(t)):[o,dl(t)]:dl(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==G?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Mt(e.ssContent),ssFallback:e.ssFallback&&Mt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&n&&ps(f,c.clone(f)),f}function h(e=" ",t=0){return L(Pl,null,e,t)}function ke(e,t){const l=L(ul,null,e);return l.staticCount=t,l}function B(e="",t=!1){return t?(P(),vs(lt,null,e)):L(lt,null,e)}function Le(e){return e==null||typeof e=="boolean"?L(lt):R(e)?L(G,null,e.slice()):pi(e)?Ze(e):L(Pl,null,String(e))}function Ze(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Mt(e)}function gl(e,t){let l=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(R(t))l=16;else if(typeof t=="object")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),gl(e,i()),i._c&&(i._d=!0));return}else{l=32;const i=t._;!i&&!ti(t)?t._ctx=Me:i===3&&Me&&(Me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(H(t)){if(n&65){gl(e,{default:t});return}t={default:t,_ctx:Me},l=32}else t=String(t),n&64?(l=16,t=[h(t)]):l=8;e.children=t,e.shapeFlag|=l}function mi(...e){const t={};for(let l=0;lye||Me;let vl,Wt;{const e=Cl(),t=(l,n)=>{let i;return(i=e[l])||(i=e[l]=[]),i.push(n),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};vl=t("__VUE_INSTANCE_SETTERS__",l=>ye=l),Wt=t("__VUE_SSR_SETTERS__",l=>zt=l)}const Xt=e=>{const t=ye;return vl(e),e.scope.on(),()=>{e.scope.off(),vl(t)}},Ws=()=>{ye&&ye.scope.off(),vl(null)};function bi(e){return e.vnode.shapeFlag&4}let zt=!1;function ua(e,t=!1,l=!1){t&&Wt(t);const{props:n,children:i}=e.vnode,o=bi(e);zo(e,n,o,t),Jo(e,i,l||t);const r=o?da(e,t):void 0;return t&&Wt(!1),r}function da(e,t){const l=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,qo);const{setup:n}=l;if(n){et();const i=e.setupContext=n.length>1?pa(e):null,o=Xt(e),r=Jt(n,e,0,[e.props,i]),a=un(r);if(tt(),o(),(a||e.sp)&&!Ht(e)&&Bn(e),a){if(r.then(Ws,Ws),t)return r.then(c=>{Wt(!0);try{zs(e,c,t)}finally{Wt(!1)}}).catch(c=>{Tl(c,e,0)});e.asyncDep=r}else zs(e,r)}else gi(e)}function zs(e,t,l){H(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=En(t)),gi(e)}function gi(e,t,l){const n=e.type;e.render||(e.render=n.render||Ke);{const i=Xt(e);et();try{Io(e)}finally{tt(),i()}}}const fa={get(e,t){return pe(e,"get",""),e[t]}};function pa(e){const t=l=>{e.exposed=l||{}};return{attrs:new Proxy(e.attrs,fa),slots:e.slots,emit:e.emit,expose:t}}function $l(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(En(lo(e.exposed)),{get(t,l){if(l in t)return t[l];if(l in Lt)return Lt[l](e)},has(t,l){return l in t||l in Lt}})):e.proxy}function ha(e){return H(e)&&"__vccOpts"in e}const ot=(e,t)=>oo(e,t,zt),ma="3.5.43";let Ql;const Zs=typeof window<"u"&&window.trustedTypes;if(Zs)try{Ql=Zs.createPolicy("vue",{createHTML:e=>e})}catch{}const vi=Ql?e=>Ql.createHTML(e):e=>e,ba="http://www.w3.org/2000/svg",ga="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Ys=ze&&ze.createElement("template"),va={insert:(e,t,l)=>{t.insertBefore(e,l||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,l,n)=>{const i=t==="svg"?ze.createElementNS(ba,e):t==="mathml"?ze.createElementNS(ga,e):l?ze.createElement(e,{is:l}):ze.createElement(e);return e==="select"&&n&&n.multiple!=null&&i.setAttribute("multiple",n.multiple),i},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,l,n,i,o){const r=l?l.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),l),!(i===o||!(i=i.nextSibling)););else{Ys.innerHTML=vi(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const a=Ys.content;if(n==="svg"||n==="mathml"){const c=a.firstChild;for(;c.firstChild;)a.appendChild(c.firstChild);a.removeChild(c)}t.insertBefore(a,l)}return[r?r.nextSibling:t.firstChild,l?l.previousSibling:t.lastChild]}},ya=Symbol("_vtc");function _a(e,t,l){const n=e[ya];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):l?e.setAttribute("class",t):e.className=t}const yl=Symbol("_vod"),yi=Symbol("_vsh"),ol={name:"show",beforeMount(e,{value:t},{transition:l}){e[yl]=e.style.display==="none"?"":e.style.display,l&&t?l.beforeEnter(e):It(e,t)},mounted(e,{value:t},{transition:l}){l&&t&&l.enter(e)},updated(e,{value:t,oldValue:l},{transition:n}){!t!=!l&&(n?t?(n.beforeEnter(e),It(e,!0),n.enter(e)):n.leave(e,()=>{It(e,!1)}):It(e,t))},beforeUnmount(e,{value:t}){It(e,t)}};function It(e,t){e.style.display=t?e[yl]:"none",e[yi]=!t}const xa=Symbol(""),wa=/(?:^|;)\s*display\s*:/;function ka(e,t,l){const n=e.style,i=ae(l);let o=!1;if(l&&!i){if(t)if(ae(t))for(const r of t.split(";")){const a=r.slice(0,r.indexOf(":")).trim();l[a]==null&&Et(n,a,"")}else for(const r in t)l[r]==null&&Et(n,r,"");for(const r in l){r==="display"&&(o=!0);const a=l[r];a!=null?Sa(e,r,!ae(t)&&t?t[r]:void 0,a)||Et(n,r,a):Et(n,r,"")}}else if(i){if(t!==l){const r=n[xa];r&&(l+=";"+r),n.cssText=l,o=wa.test(l)}}else t&&e.removeAttribute("style");yl in e&&(e[yl]=o?n.display:"",e[yi]&&(n.display="none"))}const al=/\s*!important$/;function Et(e,t,l){if(R(l))l.forEach(n=>Et(e,t,n));else if(l==null&&(l=""),t.startsWith("--"))al.test(l)?e.setProperty(t,l.replace(al,""),"important"):e.setProperty(t,l);else{const n=Ca(e,t);al.test(l)?e.setProperty(_t(n),l.replace(al,""),"important"):e[n]=l}}const Gs=["Webkit","Moz","ms"],Vl={};function Ca(e,t){const l=Vl[t];if(l)return l;let n=qe(t);if(n!=="filter"&&n in e)return Vl[t]=n;n=pn(n);for(let i=0;iKl||($a.then(()=>Kl=0),Kl=Date.now());function Ia(e,t){const l=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=l.attached)return;const i=l.value;if(R(i)){const o=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{o.call(n),n._stopped=!0};const r=i.slice(),a=[n];for(let c=0;ce.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Oa=(e,t,l,n,i,o)=>{const r=i==="svg";t==="class"?_a(e,n,r):t==="style"?ka(e,l,n):xl(t)?wl(t)||Ma(e,t,l,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ea(e,t,n,r))?(Qs(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Xs(e,t,n,r,o,t!=="value")):e._isVueCE&&(Ra(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ae(n)))?Qs(e,qe(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Xs(e,t,n,r))};function Ea(e,t,l,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&tn(t)&&H(l));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return tn(t)&&ae(l)?!1:t in e}function Ra(e,t){const l=e._def.props;if(!l)return!1;const n=qe(t);return Array.isArray(l)?l.some(i=>qe(i)===n):Object.keys(l).some(i=>qe(i)===n)}const _l=e=>{const t=e.props["onUpdate:modelValue"]||!1;return R(t)?l=>rl(t,l):t},Tt=Symbol("_assign"),ln={deep:!0,created(e,t,l){e[Tt]=_l(l),ys(e,"change",()=>{const n=e._modelValue,i=Zt(e),o=e.checked,r=e[Tt];if(R(n)){const a=ss(n,i),c=a!==-1;if(o&&!c)r(n.concat(i));else if(!o&&c){const p=[...n];p.splice(a,1),r(p)}}else if(Xe(n)){const a=new Set(n);o?a.add(i):a.delete(i),r(a)}else r(_i(e,o))})},mounted:sn,beforeUpdate(e,t,l){e[Tt]=_l(l),sn(e,t,l)}};function sn(e,{value:t,oldValue:l},n){e._modelValue=t;let i;if(R(t))i=ss(t,n.props.value)>-1;else if(Xe(t))i=t.has(n.props.value);else{if(t===l)return;i=Qe(t,_i(e,!0))}e.checked!==i&&(e.checked=i)}const nn={deep:!0,created(e,{value:t,modifiers:{number:l}},n){e._modelValue=t,ys(e,"change",()=>{const i=Array.prototype.filter.call(e.options,c=>c.selected).map(c=>l?mn(Zt(c)):Zt(c)),o=e.multiple,r=o?Xe(e._modelValue)?new Set(i):i:i[0],a=e._pendingValue=[o,o?R(r)?i.slice():i:r];try{e[Tt](r)}finally{Dn(()=>{e._pendingValue===a&&(e._pendingValue=void 0)})}}),e[Tt]=_l(n)},mounted(e,{value:t}){on(e,t)},beforeUpdate(e,{value:t},l){e._modelValue=t,e[Tt]=_l(l)},updated(e,{value:t}){const l=e._pendingValue;e._pendingValue=void 0,(!l||l[0]!==e.multiple||!Da(t,l[1],l[0]))&&on(e,t)}};function Da(e,t,l){if(!l||R(e))return Qe(e,t);if(Xe(e)){if(e.size!==t.length)return!1;for(const n of t)if(!e.has(n))return!1;return!0}return!1}function on(e,t){const l=e.multiple,n=R(t);if(!(l&&!n&&!Xe(t))){for(let i=0,o=e.options.length;iString(p)===String(a)):r.selected=ss(t,a)>-1}else r.selected=t.has(a);else if(Qe(Zt(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!l&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Zt(e){return"_value"in e?e._value:e.value}function _i(e,t){const l=t?"_trueValue":"_falseValue";return l in e?e[l]:t}const Fa=["ctrl","shift","alt","meta"],Na={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Fa.some(l=>e[`${l}Key`]&&!t.includes(l))},Ha=(e,t)=>{if(!e)return e;const l=e._withMods||(e._withMods={}),n=t.join(".");return l[n]||(l[n]=((i,...o)=>{for(let r=0;r{const t=Va().createApp(...e),{mount:l}=t;return t.mount=n=>{const i=Ba(n);if(!i)return;const o=t._component;!H(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=l(i,!1,Ua(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t});function Ua(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ba(e){return ae(e)?document.querySelector(e):e}const Wa={class:"app-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.65","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},za=["d"],fe={__name:"AppIcon",props:{name:{type:String,default:"grid"}},setup(e){const t={home:"m3 10 9-7 9 7v10H3Z M9 20v-7h6v7",journal:"M5 3h14v18H5Z M8 7h8 M8 11h8 M8 15h5",grid:"M3 3h7v7H3Z M14 3h7v7h-7Z M3 14h7v7H3Z M14 14h7v7h-7Z",devices:"M3 4h18v12H3Z M8 20h8 M12 16v4",tree:"M9 2h6v6H9Z M2 16h6v6H2Z M16 16h6v6h-6Z M12 8v4 M5 16v-4h14v4",users:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M22 21v-2a4 4 0 0 0-3-3.8 M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8 M17 3a4 4 0 0 1 0 8",settings:"M9 3h6l1 4 4 1v8l-4 1-1 4H9l-1-4-4-1V8l4-1Z M15 12a3 3 0 1 0-6 0 3 3 0 0 0 6 0",database:"M3 6c0-5 18-5 18 0s-18 5-18 0V18c0 5 18 5 18 0V6 M3 12c0 5 18 5 18 0",network:"M9 2h6v6H9Z M2 16h6v6H2Z M16 16h6v6h-6Z M12 8v4 M5 16v-4h14v4",arrow:"M5 12h14 M14 7l5 5-5 5",router:"M3 13h18v8H3Z M6 13V5 M18 13V5 M7 17h.01 M11 17h.01 M15 17h3",camera:"M3 6h12v12H3Z M15 10l6-4v12l-6-4"};return(l,n)=>(P(),$("svg",Wa,[s("path",{d:t[e.name]||t.grid},null,8,za)]))}},Za={class:"sidebar"},Ya={class:"nav flex-column",id:"main-navigation","aria-label":"主导航"},Ga={"data-page":"households",class:"active"},Ja={id:"scope-navigation",hidden:""},Xa={"data-page":"journal"},Qa={"data-page":"overview"},er={"data-page":"objects"},tr={"data-page":"heritage"},lr={"data-page":"users","data-admin":""},sr={"data-page":"settings"},nr={"data-page":"storage"},ir={__name:"AppSidebar",setup(e){return(t,l)=>(P(),$("aside",Za,[l[17]||(l[17]=ke('赵字古文字风格标识赵府智能数字管家',3)),s("nav",Ya,[s("button",Ga,[L(fe,{name:"home"}),l[0]||(l[0]=h()),l[1]||(l[1]=s("span",null,"我的家庭与场所",-1))]),s("div",Ja,[l[12]||(l[12]=s("div",{id:"scope-nav-name",class:"nav-label"},null,-1)),s("button",Xa,[L(fe,{name:"journal"}),l[2]||(l[2]=h()),l[3]||(l[3]=s("span",null,"记事与阅历",-1))]),s("button",Qa,[L(fe,{name:"grid"}),l[4]||(l[4]=h()),l[5]||(l[5]=s("span",null,"场所总览",-1))]),s("button",er,[L(fe,{name:"devices"}),l[6]||(l[6]=h()),l[7]||(l[7]=s("span",null,"区域与设备",-1))]),s("button",tr,[L(fe,{name:"tree"}),l[8]||(l[8]=h()),l[9]||(l[9]=s("span",null,"家庭传承",-1))]),s("button",lr,[L(fe,{name:"users"}),l[10]||(l[10]=h()),l[11]||(l[11]=s("span",null,"成员与权限",-1))])]),s("button",sr,[L(fe,{name:"settings"}),l[13]||(l[13]=h()),l[14]||(l[14]=s("span",null,"设置中心",-1))]),s("button",nr,[L(fe,{name:"database"}),l[15]||(l[15]=h()),l[16]||(l[16]=s("span",null,"平台存储与审计",-1))])]),l[18]||(l[18]=ke('
独立部署 · 数据自有

按空间组织画面
让每一段记录有处可寻

',4))]))}},xi=(e,t)=>{const l=e.__vccOpts||e;for(const[n,i]of t)l[n]=i;return l},or={};function ar(e,t){return P(),$("header",null,[...t[0]||(t[0]=[ke('
赵氏家宅 · 起居有序

我的家庭与场所

从一个空间,看到每一个位置。

等待连接
',2)])])}const rr=xi(or,[["render",ar]]),ne=In({state:{households:[],sites:[],cameras:[]},admin:!1,loggedIn:!1,page:"households",session:0,device:null}),Je=In({devices:[],groups:[],rows:[]});window.ZhaoVue={enabled:!0,accept(e){ne.value=e},setDevices(e){Je.value=e},clear(){Je.value={devices:[],groups:[],rows:[]}}};const Te=()=>window.ZhaoVue,_s=e=>({lan:"局域网",tailscale:"Tailscale",public:"公网",unknown:"接入待确认"})[e]||"接入待确认",cr={id:"page-households",class:"page"},ur={class:"section-head"},dr={class:"count-pill"},fr=["hidden"],pr={class:"home-toolbar"},hr={class:"btn-group",role:"group","aria-label":"场所显示方式"},mr=["aria-pressed"],br=["aria-pressed"],gr={class:"home-layout-controls"},vr=["disabled"],yr=["value"],_r=["disabled"],xr=["value"],wr={class:"inline-check"},kr=["disabled"],Cr={class:"inline-check"},Sr=["disabled"],Tr=["disabled"],Mr=["disabled"],jr={id:"home-layout-status",role:"status",class:"small text-secondary"},Ar={key:0,class:"group-title"},Pr={class:"home-card-grid"},$r=["draggable","onDragstart","onDrop"],qr={class:"home-cover"},Ir=["src","alt"],Or={class:"home-cover-content"},Er={class:"site-heading"},Rr={class:"badge"},Dr=["data-edit-household"],Fr={class:"home-location"},Nr={class:"card-body"},Hr={key:0,class:"home-order-actions"},Lr=["disabled","aria-label","onClick"],Vr=["disabled","aria-label","onClick"],Kr={class:"home-summary"},Ur={class:"home-numbers"},Br={class:"compact-details"},Wr={class:"home-card-actions"},zr=["onClick"],Zr=["data-leadership"],Yr={key:0,class:"empty"},Gr={id:"home-global-topology",class:"network-overview"},Jr={class:"network-platform"},Xr={class:"platform-place-grid"},Qr=["onClick"],ec={class:"badge"},tc={class:"home-pagination"},lc={id:"home-page-info"},sc=["disabled"],nc=["disabled"],ic={__name:"HomeExplorer",setup(e){const t=Se({revision:0,columns:2,rows:2,groupCity:!1,order:[]}),l=Se(!1),n=Se(!1),i=Se(0),o=Se(!1),r=Se("cards"),a=Se(""),c=Se("");let p="";Ct(ne,D=>{const x=D.user?.id+":"+D.session;p!==x&&(p=x,l.value=!1,n.value=!1,i.value=0,o.value=!1,r.value="cards",a.value="",c.value=""),!l.value&&!n.value&&(t.value={revision:0,columns:2,rows:2,groupCity:!1,order:[],...D.state.householdLayout})},{immediate:!0});const f=ot(()=>{const D=ne.value.state.households||[],x=new Map(D.map(A=>[A.id,A]));return[...new Set([...t.value.order,...D.map(A=>A.id)])].filter(A=>x.has(A)).map(A=>x.get(A))}),b=ot(()=>t.value.columns*t.value.rows),S=ot(()=>Math.max(1,Math.ceil(f.value.length/b.value)));Ct(S,D=>i.value=Math.min(i.value,D-1));const T=ot(()=>{const D=f.value.slice(i.value*b.value,(i.value+1)*b.value);if(!t.value.groupCity)return[{name:"",items:D}];const x=new Map;for(const A of D){const I=[A.geography?.country||A.country,A.province,A.city||"地区待填写"].filter(Boolean).join(" / ");x.has(I)||x.set(I,[]),x.get(I).push(A)}return[...x].map(([A,I])=>({name:A,items:I}))}),W=D=>({home:"家庭",office:"办公场所",factory:"工厂"})[D.kind||"home"]||"场所",F=D=>Te().address?.(D)||[D.province,D.city,D.district].filter(Boolean).join(" · ")||"地区待填写";function ie(){l.value=!0,i.value=0,t.value.groupCity&&(o.value=!1),c.value="布局已调整,保存后下次登录会沿用。"}function J(D,x,A){if(n.value)return;const I=f.value.map(dt=>dt.id),ce=I.indexOf(D),xe=A?I.indexOf(A):ce+x;ce<0||xe<0||xe>=I.length||ce===xe||(I.splice(ce,1),I.splice(xe,0,D),t.value.order=I,l.value=!0,i.value=Math.floor(xe/b.value))}function V(){l.value=!1,t.value={...ne.value.state.householdLayout},i.value=0,c.value=""}async function z(){const D=p;n.value=!0;try{const x=await Te().saveLayout({...t.value});if(D!==p)return;t.value=x,l.value=!1,c.value="布局与卡片顺序已保存"}catch(x){!x.stale&&D===p&&(c.value=x.message)}finally{D===p&&(n.value=!1)}}async function O(D,x=!1){await Te().enterHome(D.id,x)}return(D,x)=>(P(),$("section",cr,[s("div",ur,[s("div",null,[s("h2",null,[x[10]||(x[10]=h(" 我的空间 ",-1)),s("span",dr,j(f.value.length),1)]),x[11]||(x[11]=s("p",{class:"description mb-0"}," 家庭、办公与工厂,各自管理成员、区域和设备。 ",-1))]),s("button",{id:"new-household",class:"btn btn-primary",hidden:!U(ne).platformAdmin}," + 新建家庭或场所 ",8,fr)]),s("div",pr,[s("div",hr,[s("button",{id:"home-card-view",class:ct(["btn btn-outline-secondary",{active:r.value==="cards"}]),"aria-pressed":r.value==="cards",onClick:x[0]||(x[0]=A=>r.value="cards")},[L(fe,{name:"grid"}),x[12]||(x[12]=h(" 卡片",-1))],10,mr),s("button",{id:"home-topology-view",class:ct(["btn btn-outline-secondary",{active:r.value==="topology"}]),"aria-pressed":r.value==="topology",onClick:x[1]||(x[1]=A=>r.value="topology")},[L(fe,{name:"network"}),x[13]||(x[13]=h(" 整体拓扑 ",-1))],10,br)]),nt(s("div",gr,[s("label",null,[x[14]||(x[14]=h("每页 ",-1)),nt(s("select",{id:"home-columns","onUpdate:modelValue":x[2]||(x[2]=A=>t.value.columns=A),class:"form-select",disabled:n.value,onChange:ie},[(P(),$(G,null,$e(4,A=>s("option",{key:A,value:A},j(A)+" 列",9,yr)),64))],40,vr),[[nn,t.value.columns,void 0,{number:!0}]])]),x[17]||(x[17]=s("span",null,"×",-1)),nt(s("select",{id:"home-rows","onUpdate:modelValue":x[3]||(x[3]=A=>t.value.rows=A),"aria-label":"每页行数",class:"form-select",disabled:n.value,onChange:ie},[(P(),$(G,null,$e(4,A=>s("option",{key:A,value:A},j(A)+" 行",9,xr)),64))],40,_r),[[nn,t.value.rows,void 0,{number:!0}]]),s("label",wr,[nt(s("input",{id:"home-group-city","onUpdate:modelValue":x[4]||(x[4]=A=>t.value.groupCity=A),type:"checkbox",class:"form-check-input",disabled:n.value,onChange:ie},null,40,kr),[[ln,t.value.groupCity]]),x[15]||(x[15]=h("按城市分组",-1))]),s("label",Cr,[nt(s("input",{id:"home-arrange","onUpdate:modelValue":x[5]||(x[5]=A=>o.value=A),type:"checkbox",class:"form-check-input",disabled:t.value.groupCity||n.value},null,8,Sr),[[ln,o.value]]),x[16]||(x[16]=h("调整顺序",-1))]),s("button",{id:"home-layout-save",class:"btn btn-primary",disabled:!l.value||n.value,onClick:z},j(n.value?"保存中…":"保存布局"),9,Tr),s("button",{id:"home-layout-reset",class:"btn btn-outline-secondary",disabled:!l.value||n.value,onClick:V}," 撤销 ",8,Mr)],512),[[ol,r.value==="cards"]])]),s("p",jr,j(c.value||"布局仅影响你的账号;手机端自动适配为单列。"),1),nt(s("div",{id:"household-list",style:Gt({"--home-columns":t.value.columns})},[(P(!0),$(G,null,$e(T.value,A=>(P(),$("section",{key:A.name,class:"home-city-group"},[A.name?(P(),$("h3",Ar,j(A.name),1)):B("",!0),s("div",Pr,[(P(!0),$(G,null,$e(A.items,I=>(P(),$("article",{key:I.id,class:"card home-card",draggable:o.value&&!n.value,onDragstart:ce=>{a.value=I.id,ce.dataTransfer.setData("text/plain",I.id)},onDragend:x[6]||(x[6]=ce=>a.value=""),onDragover:x[7]||(x[7]=ce=>o.value&&a.value&&ce.preventDefault()),onDrop:Ha(ce=>{o.value&&a.value&&J(a.value,0,I.id),a.value=""},["prevent"])},[s("div",qr,[I.coverUrl?(P(),$("img",{key:0,src:I.coverUrl,alt:I.name+"封面",loading:"lazy"},null,8,Ir)):B("",!0),x[18]||(x[18]=s("div",{class:"cover-shade"},null,-1)),s("div",Or,[s("div",Er,[s("span",Rr,[h(j(W(I)),1),I.id===U(ne).state.familyId?(P(),$(G,{key:0},[h(" · 当前")],64)):B("",!0)]),U(ne).admin?(P(),$("button",{key:0,class:"btn btn-sm cover-edit","data-edit-household":I.id}," 编辑 ",8,Dr)):B("",!0)]),s("div",null,[s("h3",null,j(I.name),1),s("p",Fr,j(F(I)),1)])])]),s("div",Nr,[o.value?(P(),$("div",Hr,[x[19]||(x[19]=s("span",null,"拖动排序",-1)),s("button",{class:"btn btn-sm btn-outline-secondary",disabled:f.value[0]?.id===I.id||n.value,"aria-label":I.name+"前移",onClick:ce=>J(I.id,-1)}," ←",8,Lr),s("button",{class:"btn btn-sm btn-outline-secondary",disabled:f.value.at(-1)?.id===I.id||n.value,"aria-label":I.name+"后移",onClick:ce=>J(I.id,1)}," → ",8,Vr)])):B("",!0),s("p",Kr,j(I.note||"成员、空间与设备,独立管理。"),1),s("div",Ur,[s("span",null,[s("b",null,j(I.deviceCount||0),1),x[20]||(x[20]=h("设备",-1))]),s("span",null,[s("b",null,j(I.sites||0),1),x[21]||(x[21]=h("区域",-1))]),s("span",null,[s("b",null,j(I.members||0),1),x[22]||(x[22]=h("成员",-1))])]),s("dl",Br,[s("div",null,[s("dt",null,j(I.kind==="office"||I.kind==="factory"?"主要负责人":"一家之主"),1),s("dd",null,j(I.ownerName||"待指定"),1)]),s("div",null,[x[23]||(x[23]=s("dt",null,"备用负责人",-1)),s("dd",null,j(I.successorName||"待指定"),1)])]),s("div",Wr,[s("button",{class:"btn btn-primary",onClick:ce=>O(I)},[x[24]||(x[24]=h(" 进入空间 ",-1)),L(fe,{name:"arrow"})],8,zr),I.canAssignOwner?(P(),$("button",{key:0,class:"btn btn-link","data-leadership":I.id}," 负责人安排 ",8,Zr)):B("",!0)])])],40,$r))),128))])]))),128)),f.value.length?B("",!0):(P(),$("div",Yr," 登录后查看已授权的家庭与场所。 "))],4),[[ol,r.value==="cards"]]),nt(s("div",Gr,[s("div",Jr,[L(fe,{name:"network"}),s("div",null,[s("h3",null,j(U(ne).brandName||"赵府")+" · 数字管家",1),s("p",null,j(f.value.length)+" 个已授权空间",1)])]),x[26]||(x[26]=s("p",{class:"description"}," 平台与场所的管理关系;进入场所查看内部设备及网络。 ",-1)),s("div",Xr,[(P(!0),$(G,null,$e(f.value,A=>(P(),$("button",{key:A.id,class:"card platform-place-node",onClick:I=>O(A,!0)},[s("span",ec,j(W(A)),1),s("h3",null,j(A.name),1),s("p",null,j(F(A)),1),s("span",null,j(A.deviceCount||0)+" 台设备",1),s("small",null,j((A.networkAccesses||[]).map(U(_s)).join(" · ")||"网络待登记"),1),x[25]||(x[25]=s("span",{class:"network-open"},"查看网络拓扑 →",-1))],8,Qr))),128))])],512),[[ol,r.value==="topology"]]),nt(s("div",tc,[s("span",lc,"第 "+j(i.value+1)+" / "+j(S.value)+" 页 · 每页最多 "+j(b.value)+" 张",1),s("button",{id:"home-prev",class:"btn btn-outline-secondary",disabled:!i.value,onClick:x[8]||(x[8]=A=>i.value--)}," 上一页",8,sc),s("button",{id:"home-next",class:"btn btn-outline-secondary",disabled:i.value>=S.value-1,onClick:x[9]||(x[9]=A=>i.value++)}," 下一页 ",8,nc)],512),[[ol,r.value==="cards"]])]))}},oc={key:0,class:"network-status-block"},ac={class:"network-status-title"},rc=["disabled"],cc={key:0,class:"text-danger small",role:"status"},uc={key:0,class:"small text-secondary"},dc={key:1,class:"small text-secondary"},fc={key:2,class:"small text-secondary"},pc={class:"management-links"},hc=["href"],mc={key:0},bc={class:"network-check-time"},xs={__name:"NetworkStatus",props:{device:{type:Object,required:!0},active:{type:Boolean,default:!0}},setup(e){const t=e,l=Se(null),n=Se(!1),i=Se("");let o=0,r;const a=ot(()=>[t.device.id,t.device.source,t.device.managementHost,t.device.tailscaleHost,t.device.networkCidr,ne.value.state.familyId,ne.value.session,ne.value.admin,t.active].join("|"));async function c(){const b=o;if(!(n.value||!ne.value.admin||!t.active)){n.value=!0,i.value="";try{const S=await Te().api("/api/devices/network?source="+encodeURIComponent(t.device.source)+"&id="+encodeURIComponent(t.device.id));b===o&&(l.value=S)}catch(S){b===o&&!S.stale&&(i.value=S.message)}finally{b===o&&(n.value=!1,r=setTimeout(c,35e3))}}}Ct(a,()=>{o++,clearTimeout(r),n.value=!1,l.value=null,i.value="",ne.value.admin&&t.active&&c()},{immediate:!0}),ms(()=>{o++,clearTimeout(r)});const p=ot(()=>l.value?l.value.targets.some(b=>b.reachable)?"网络可达":"未连通":"等待检查");function f(){clearTimeout(r),c()}return(b,S)=>U(ne).admin?(P(),$("div",oc,[s("div",ac,[s("span",null,[s("i",{class:ct(["status-dot",{online:l.value?.targets.some(T=>T.reachable)}])},null,2),h(j(n.value?"正在检查…":p.value),1)]),s("button",{class:"btn btn-sm btn-link",disabled:n.value,onClick:f},"检查网络",8,rc)]),i.value?(P(),$("p",cc,j(i.value),1)):B("",!0),l.value?(P(),$(G,{key:1},[(P(!0),$(G,null,$e(l.value.targets,T=>(P(),$("div",{key:T.kind,class:"network-target"},[s("span",null,j(T.kind==="tailscale"?"Tailscale":"设备地址"),1),s("code",null,j(T.host),1),s("span",{class:ct(T.reachable?"text-success":"text-secondary")},j(T.reachable?"服务可达":"未响应"),3)]))),128)),l.value.targets.length?B("",!0):(P(),$("p",uc,"请编辑设备档案,填写 IP 或域名。")),l.value.tailscale?.available?(P(),$("p",dc,[h("Tailscale 节点"+j(l.value.tailscale.online?"在线":"离线"),1),l.value.tailscale.subnet?(P(),$(G,{key:0},[h(" · "+j(l.value.tailscale.subnetAvailable?"已发布":"未检测到")+" "+j(l.value.tailscale.subnet)+" 路由",1)],64)):B("",!0)])):l.value.tailscale?(P(),$("p",fc,j(l.value.tailscale.note),1)):B("",!0),s("div",pc,[(P(!0),$(G,null,$e(l.value.links,T=>(P(),$("a",{key:T.kind,href:T.url,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline-secondary"},[h("打开管理后台 · "+j(T.kind==="tailscale"?"Tailscale":"局域网")+" ↗",1),T.verified?B("",!0):(P(),$("span",mc,"(待连通)"))],8,hc))),128))]),s("small",bc,"检查于 "+j(new Date(l.value.checkedAt*1e3).toLocaleTimeString("zh-CN"))+" · 从服务器探测,打开后台需当前浏览器也能到达。",1)],64)):B("",!0)])):B("",!0)}},gc={id:"asset-list"},vc={class:"group-title"},yc={class:"count-pill"},_c={class:"device-card-grid"},xc={class:"card-body"},wc={class:"device-card-heading"},kc={class:"device-symbol"},Cc={class:"flex-grow-1"},Sc={class:"small text-secondary"},Tc=["onClick"],Mc={class:"device-location"},jc={class:"compact-details"},Ac={class:"font-monospace"},Pc={key:0},$c={key:0,class:"device-tags"},qc={class:"card-footer device-card-actions"},Ic=["onClick"],Oc=["onClick"],Ec=["onClick"],Rc={key:0,class:"empty"},Dc={__name:"DeviceCollection",setup(e){const t=i=>(ne.value.state.cameras||[]).filter(o=>i.source==="camera"?o.assetId===i.id:o.recorderId===i.id||o.archiveRecorderId===i.id),l=i=>({["data-"+(i.source==="camera"?"edit-asset":i.source==="recorder"?"edit-recorder":"edit-device")]:i.id}),n=i=>/路由|网关|服务器/.test(i.deviceType)||/gl\.inet/i.test(i.brand||"");return(i,o)=>(P(),$("div",gc,[(P(!0),$(G,null,$e(U(Je).groups,r=>(P(),$("section",{key:r.key,class:"device-group"},[s("h3",vc,[h(j(r.labels.join(" / ")||"全部设备")+" ",1),s("span",yc,j(r.items.length),1)]),s("div",_c,[(P(!0),$(G,null,$e(r.items,a=>(P(),$("article",{key:a.source+a.id,class:"card device-card"},[s("div",xc,[s("div",wc,[s("div",kc,[L(fe,{name:a.source==="camera"?"camera":n(a)?"router":"devices"},null,8,["name"])]),s("div",Cc,[s("span",Sc,j(a.deviceType),1),s("h3",null,[s("button",{class:"device-title",onClick:c=>U(Te)().enterDevice(a.source,a.id)},j(a.name),9,Tc)])]),U(ne).admin?(P(),$("button",mi({key:0,class:"btn btn-sm btn-outline-secondary"},{ref_for:!0},l(a))," 编辑 ",16)):B("",!0)]),s("p",Mc,[h(j(U(Te)().location?.(a.siteId)||"区域待填写"),1),a.point?(P(),$(G,{key:0},[h(" · "+j(a.point),1)],64)):B("",!0)]),s("dl",jc,[s("div",null,[o[0]||(o[0]=s("dt",null,"品牌型号",-1)),s("dd",null,j([a.brand,a.model].filter(Boolean).join(" / ")||"未填写"),1)]),s("div",null,[o[1]||(o[1]=s("dt",null,"设备地址",-1)),s("dd",Ac,j(a.networkHosts.join(" / ")||"未填写"),1)]),s("div",null,[o[2]||(o[2]=s("dt",null,"网络",-1)),s("dd",null,j(U(_s)(a.networkAccess)),1)]),s("div",null,[o[3]||(o[3]=s("dt",null,"所有人 / 负责人",-1)),s("dd",null,j(a.ownerName||"待指定")+" / "+j(a.managerName||"待指定"),1)]),a.source!=="device"?(P(),$("div",Pc,[o[4]||(o[4]=s("dt",null,"镜头通道",-1)),s("dd",null,j(t(a).length)+" 个已配置",1)])):B("",!0)]),a.tags?.length?(P(),$("div",$c,[(P(!0),$(G,null,$e(a.tags,c=>(P(),$("span",{key:c},j(c),1))),128))])):B("",!0),n(a)?(P(),vs(xs,{key:1,device:a,active:U(ne).page==="objects"&&U(Je).mode==="cards"},null,8,["device","active"])):B("",!0)]),s("div",qc,[s("button",{class:"btn btn-sm btn-outline-secondary",onClick:c=>U(Te)().enterDevice(a.source,a.id,"device")}," 设备详情",8,Ic),a.source!=="device"?(P(),$(G,{key:0},[U(ne).admin?(P(),$("button",{key:0,class:"btn btn-sm btn-outline-secondary",onClick:c=>U(Te)().enterDevice(a.source,a.id,"cameras")}," 配置镜头",8,Oc)):B("",!0),t(a).length?(P(),$("button",{key:1,class:"btn btn-sm btn-primary",onClick:c=>U(Te)().enterDevice(a.source,a.id,"live")}," 实时画面 ",8,Ec)):B("",!0)],64)):B("",!0)])]))),128))])]))),128)),U(Je).devices.length?B("",!0):(P(),$("div",Rc,[L(fe,{name:"devices"}),o[5]||(o[5]=s("h3",null,"当前范围没有设备",-1)),o[6]||(o[6]=s("p",null,"调整筛选条件,或添加摄像机、路由器、灯等设备。",-1))]))]))}},Fc={id:"device-topology",hidden:""},Nc={class:"panel network-map"},Hc={class:"network-platform"},Lc={class:"topology-nodes"},Vc={class:"card-body"},Kc={class:"device-card-heading"},Uc={class:"flex-grow-1"},Bc={class:"small text-secondary"},Wc=["onClick"],zc=["onClick"],Zc={class:"device-location"},Yc={class:"network-facts"},Gc={key:0},Jc={key:1},Xc={key:2},Qc={key:3},eu={key:0,class:"empty"},tu={__name:"NetworkMap",setup(e){const t=ot(()=>(ne.value.state.households||[]).find(l=>l.id===ne.value.state.familyId));return(l,n)=>(P(),$("div",Fc,[s("section",Nc,[s("div",Hc,[L(fe,{name:"network"}),s("div",null,[s("h3",null,j(t.value?.name||"当前场所"),1),s("p",null,j(U(Je).devices.length)+" 台设备 · 随设备档案自动更新",1)])]),n[7]||(n[7]=s("p",{class:"description"}," 连线来自已确认的上级设备关系。上级未填写时单独列出;不代表已自动发现所有交换机或布线。 ",-1)),s("div",Lc,[(P(!0),$(G,null,$e(U(Je).rows,i=>(P(),$("article",{key:i.device.id,class:ct(["network-node card",{nested:i.depth>0}]),style:Gt({"--depth":Math.min(i.depth,5)})},[s("div",Vc,[s("div",Kc,[L(fe,{name:i.device.source==="camera"?"camera":"router"},null,8,["name"]),s("div",Uc,[s("span",Bc,j(i.device.deviceType)+" · "+j(U(_s)(i.device.networkAccess)),1),s("h3",null,[s("button",{class:"device-title",onClick:o=>U(Te)().enterDevice(i.device.source,i.device.id)},j(i.device.name),9,Wc)])]),s("button",{class:"btn btn-sm btn-outline-secondary",onClick:o=>U(Te)().enterDevice(i.device.source,i.device.id,"device")}," 详情 → ",8,zc)]),s("p",Zc,[h(j(U(Te)().location?.(i.device.siteId)||"未指定区域")+" ",1),i.device.point?(P(),$(G,{key:0},[h(" · "+j(i.device.point),1)],64)):B("",!0)]),s("div",Yc,[s("span",null,[n[0]||(n[0]=h("IP ",-1)),s("b",null,j(i.device.networkHosts.join(" / ")||"待填写"),1)]),i.device.tailscaleHost?(P(),$("span",Gc,[n[1]||(n[1]=h("Tailscale ",-1)),s("b",null,j(i.device.tailscaleHost),1)])):B("",!0),i.device.networkCidr?(P(),$("span",Jc,[n[2]||(n[2]=h("网段 ",-1)),s("b",null,j(i.device.networkCidr),1)])):B("",!0),s("span",null,[n[3]||(n[3]=h("上级 ",-1)),s("b",null,j(i.parentName||"待确认 / 直接接入"),1)]),s("span",null,[n[4]||(n[4]=h("连接 ",-1)),s("b",null,j({wired:"网线",wifi:"Wi-Fi"}[i.device.connectionType]||"待确认"),1)]),i.via.length?(P(),$("span",Xc,[n[5]||(n[5]=h("取流经录像机 ",-1)),s("b",null,j(i.via.join("、")),1)])):B("",!0),i.archiveVia.length?(P(),$("span",Qc,[n[6]||(n[6]=h("录像归档 ",-1)),s("b",null,j(i.archiveVia.join("、")),1)])):B("",!0)]),/路由|网关|服务器/.test(i.device.deviceType)?(P(),vs(xs,{key:0,device:i.device,active:U(ne).page==="objects"&&U(Je).mode==="topology"},null,8,["device","active"])):B("",!0)])],6))),128)),U(Je).rows.length?B("",!0):(P(),$("p",eu," 当前范围尚未登记设备。 "))])])]))}},lu={key:0,class:"panel"},su={__name:"DeviceNetworkPanel",setup(e){return(t,l)=>U(ne).admin&&U(ne).device&&U(ne).page==="device"?(P(),$("section",lu,[l[0]||(l[0]=s("h3",null,"网络状态与管理入口",-1)),L(xs,{device:U(ne).device},null,8,["device"]),l[1]||(l[1]=s("p",{class:"description mb-0"},"只检查已登记的设备地址。常用端口未响应不一定表示断电;Tailscale 节点在线也不代表下级网段可达。",-1))])):B("",!0)}},nu={id:"page-device",class:"page",hidden:""},iu={id:"page-objects",class:"page",hidden:""},ou={__name:"Workspace",setup(e){return(t,l)=>(P(),$(G,null,[l[4]||(l[4]=s("div",{id:"household-context",class:"household-context",hidden:""},[s("label",null,[h("当前归属 "),s("select",{id:"household-filter","aria-label":"当前归属"})]),s("span",{id:"household-context-note"}),s("button",{id:"scope-back",class:"quiet"},"返回场所")],-1)),l[5]||(l[5]=s("div",{id:"device-context",class:"device-context",hidden:""},[s("p",{id:"device-breadcrumb"}),s("div",{role:"group","aria-label":"设备功能"},[s("button",{class:"quiet","data-device-tab":"device"},"设备档案"),s("button",{class:"quiet","data-device-tab":"live"},"实时画面"),s("button",{class:"quiet","data-device-tab":"playback"},"录像回放"),s("button",{class:"quiet","data-device-tab":"cameras"},"镜头与设置")])],-1)),l[6]||(l[6]=ke('
设备—
已接通码流—
录像占用—
空间档案—
可选择任意区域,包含其下级区域
',3)),l[7]||(l[7]=s("section",{id:"page-settings",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",null,"把这里布置成你习惯的样子"),s("button",{id:"settings-reload",class:"quiet"},"重新读取设置")]),s("p",{id:"settings-error",role:"status"}),s("div",{class:"settings-sections",role:"group","aria-label":"设置分类"},[s("button",{class:"quiet","data-settings-section":"preferences","aria-pressed":"true"},"我的偏好"),s("button",{class:"quiet","data-settings-section":"baidu","data-platform-setting":"",hidden:""},"网盘连接"),s("button",{class:"quiet","data-settings-section":"brand","data-platform-setting":"",hidden:""},"品牌与外观"),s("button",{class:"quiet","data-settings-section":"backup","data-platform-setting":"",hidden:""},"数据库备份")]),s("form",{id:"preferences-form",class:"panel"},[s("h3",null,"我的偏好"),s("p",{class:"description"},"只影响当前账号,保存后换电脑或手机登录也会沿用。切换选项可以预览,离开未保存的预览会撤销。"),s("div",{id:"personal-choices",class:"form-grid"}),s("p",{id:"preferences-status",role:"status"}),s("div",{class:"device-actions"},[s("button",{type:"submit"},"保存我的偏好"),s("button",{type:"button",id:"personal-follow",class:"quiet"},"全部跟随平台"),s("button",{type:"button",id:"personal-cancel",class:"quiet"},"撤销预览")])]),s("section",{id:"baidu-admin",class:"panel",hidden:""},[s("div",{class:"section-head"},[s("h3",null,"百度网盘 · 统一存储"),s("span",{class:"badge"},"仅超级管理员配置")]),s("p",{class:"description"},"连接一个网盘账号,统一保存封面、Logo、图标及各用户上传的照片、视频和语音。系统按用户、家庭和记事可见范围授权;网盘账号持有人本身可以管理网盘中的文件。服务器仅转发分片,不保存媒体原文件。"),s("details",{id:"baidu-storage-guide"},[s("summary",null,"文件存在哪里?"),s("ul",null,[s("li",null,"家庭与场所:按家庭或场所保存封面。"),s("li",null,"平台外观:保存 Logo 和图标。"),s("li",null,"个人记事:按家庭、用户分组,再分照片、视频、语音。"),s("li",null,"数据库备份:单独存放;新备份上传并校验成功后,清理超过一个自然月的旧云备份。")]),s("p",{class:"description"},"文字、权限和文件引用保存在本机数据库;个人媒体原文件保存在百度网盘。封面和品牌图片仅做有限的内存缓存。更换封面、移除附件或删除记事不会删除网盘原文件。")]),s("form",{id:"baidu-config"},[s("div",{class:"form-grid"},[s("label",null,[h("AppKey"),s("input",{name:"appKey",autocomplete:"off",maxlength:"150",required:""})]),s("label",null,[h("SecretKey"),s("input",{name:"secretKey",type:"password",autocomplete:"new-password",maxlength:"150"})]),s("label",null,[h("百度后台应用名称"),s("input",{name:"appFolder",value:"智家",required:"",maxlength:"40"})]),s("label",null,[h("OAuth 回调地址"),s("input",{name:"redirectUri",type:"url",placeholder:"https://你的域名/api/baidu/callback",required:"",maxlength:"400"})])]),s("p",{class:"description"},"回调地址须与百度后台完全一致。SecretKey 留空保持已保存值,SignKey 不需要填写。当前开发者应用仅限个人场景,适用范围以百度后台为准。"),s("p",{id:"baidu-config-status",role:"status"}),s("button",{type:"submit"},"保存网盘应用配置")]),s("hr"),s("p",{id:"baidu-status",role:"status"}),s("div",{class:"device-actions"},[s("button",{id:"baidu-connect"},"连接/重新授权百度网盘"),s("button",{id:"baidu-disconnect",class:"quiet"},"解除本机连接")]),s("p",{class:"description"},"解除连接不会删除云端文件。临时媒体地址由后台按需获取,令牌不发送给浏览器。网盘授权凭据单独保存在服务器受限目录,不包含在数据库备份或公开源码中。")]),s("div",{id:"settings-private",hidden:""},[s("form",{id:"brand-form",class:"panel"},[s("h3",null,"发布与品牌配置"),s("p",{class:"description"},"仅超级管理员可修改。名称、Logo、浏览器图标及登录文案会公开显示;适用于整套系统。已有个人偏好优先于平台默认。"),s("div",{class:"form-grid"},[s("label",null,[h("系统名称"),s("input",{name:"name",required:"",maxlength:"40"})]),s("label",null,[h("系统副标题"),s("input",{name:"subtitle",required:"",maxlength:"60"})]),s("label",{class:"full"},[h("页首题词"),s("input",{name:"motto",maxlength:"100"})]),s("label",null,[h("登录标题"),s("input",{name:"loginTitle",required:"",maxlength:"40"})]),s("label",null,[h("登录说明"),s("input",{name:"loginNote",maxlength:"160"})]),s("label",{class:"full"},[h("页脚说明"),s("input",{name:"footer",maxlength:"120"})])]),s("div",{class:"brand-image-grid"},[s("div",null,[s("img",{id:"brand-logo-preview",alt:"Logo 预览",src:"/zhao-icon.png"}),s("label",null,[h("更换系统 Logo"),s("input",{id:"brand-logo-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),s("button",{type:"button",id:"brand-logo-reset",class:"quiet"},"使用默认 Logo")]),s("div",null,[s("img",{id:"brand-icon-preview",alt:"浏览器图标预览",src:"/zhao-icon.png"}),s("label",null,[h("更换浏览器图标"),s("input",{id:"brand-icon-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),s("button",{type:"button",id:"brand-icon-reset",class:"quiet"},"使用默认图标")])]),s("p",{class:"description"},"支持 PNG、JPEG、WebP,原图最多 5 MB;上传时自动缩小,图片随系统数据库保存。"),s("h3",null,"新账号与跟随平台账号的默认外观"),s("div",{id:"brand-defaults",class:"form-grid"}),s("p",{id:"brand-status",role:"status"}),s("div",{class:"device-actions"},[s("button",{type:"submit"},"保存发布配置"),s("button",{type:"button",id:"brand-export",class:"quiet"},"导出发布配置"),s("label",{class:"config-import"},[h("导入配置到表单"),s("input",{id:"brand-import",type:"file",accept:"application/json,.json"})])]),s("p",{class:"description"},"导入后先核对再保存。导出的配置只含品牌与默认外观,不含账号、设备凭据、家庭资料和网络备份目录。")]),s("section",{id:"backup-panel",class:"panel"},[s("h3",null,"数据库备份"),s("p",{class:"description"},"整台服务的数据库包含所有家庭、账号、设备连接配置和网盘文件引用,因此仅超级管理员可操作。网盘中的照片、视频、语音及录像文件不包含在新数据库副本中;旧版备份可能仍含历史内嵌图片。恢复后所有账号需要重新登录。"),s("form",{id:"backup-form"},[s("div",{class:"form-grid"},[s("label",{class:"check full"},[s("input",{name:"enabled",type:"checkbox"}),h("启用每日定时备份")]),s("label",{class:"check full"},[s("input",{name:"baidu",type:"checkbox"}),h("同时上传到已连接的百度网盘")]),s("label",null,[h("每日时间(北京时间)"),s("input",{name:"time",type:"time",required:"",value:"03:00"})]),s("label",null,[h("本机/挂载目录保留份数"),s("input",{name:"keep",type:"number",min:"1",max:"90",required:"",value:"14"})]),s("label",{class:"full"},[h("网络备份目录(可留空)"),s("input",{name:"networkPath",maxlength:"500",placeholder:"/var/lib/zhaovision/network-backup"})])]),s("p",{class:"description"},"填写本服务器已挂载的网络盘目录。使用百度接口备份只需勾选上方选项;此路径用于其他已挂载的网络存储,不能填网页地址或分享链接。写入网络目录成功不等于已确认百度云端同步完成。"),s("p",{class:"description"},"默认部署允许写入 /var/lib/zhaovision 下的目录。挂载和目录权限须由主机管理员配置;本页不会保存网盘登录密码。保留份数只清理本机和挂载目录中本系统生成的旧备份,百度网盘保留最近一个自然月;新备份上传并校验成功后才清理本应用的过期副本。"),s("p",{id:"backup-local-path",class:"description"}),s("p",{id:"backup-save-status",role:"status"}),s("button",{type:"submit"},"保存备份设置")]),s("div",{class:"section-head"},[s("h3",null,"备份记录"),s("button",{id:"backup-run"},"立即备份数据库")]),s("p",{id:"backup-result",role:"status"}),s("div",{id:"backup-history"})])])],-1)),l[8]||(l[8]=s("section",{id:"page-journal",class:"page",hidden:""},[s("div",{class:"scope-intro"},[s("span",{class:"eyebrow"},"岁月有迹 · 日常成章"),s("h2",null,"把生活,写成自己的来时路"),s("p",null,"与家人分享近况,也为自己留下一份阅历。")]),s("form",{id:"journal-form",class:"panel journal-compose"},[s("input",{type:"hidden",name:"id"}),s("input",{type:"hidden",name:"revision",value:"0"}),s("input",{type:"hidden",name:"clientId"}),s("label",null,[h("此刻想记下什么?"),s("textarea",{name:"text",rows:"4",maxlength:"5000",placeholder:"今天的心情、一段往事,或一个值得记住的时刻…"})]),s("div",{class:"form-grid"},[s("label",null,[h("记事日期"),s("input",{name:"occurredOn",type:"date",required:""})]),s("label",null,[h("阅历分类"),s("select",{name:"category"},[s("option",null,"日常"),s("option",null,"成长"),s("option",null,"家庭"),s("option",null,"旅行"),s("option",null,"工作"),s("option",null,"其他")])]),s("label",null,[h("谁可以看到"),s("select",{name:"visibility"},[s("option",{value:"private"},"仅自己可见"),s("option",{value:"household"},"当前家庭/场所成员")])])]),s("div",{class:"journal-add-media"},[s("label",{class:"quiet"},[h("+ 照片、视频或语音"),s("input",{id:"journal-files",disabled:"",type:"file",accept:"image/jpeg,image/png,image/webp,video/mp4,video/quicktime,video/webm,audio/mpeg,audio/mp4,audio/aac,audio/wav,audio/ogg,audio/webm,.m4a"})]),s("button",{id:"journal-record",disabled:"",type:"button",class:"quiet"},"● 直接录音"),s("button",{id:"journal-stop-record",type:"button",hidden:""},"结束录音并上传"),s("button",{id:"journal-cancel-upload",type:"button",class:"quiet",hidden:""},"暂停上传")]),s("p",{id:"journal-cloud-note",class:"description"}),s("p",{class:"description"},"每条最多 9 个附件,单个文件最多 256 MB;一次上传一个文件。录音须通过 HTTPS 并允许麦克风,最长 5 分钟。上传完成后默认选中。保存后清空本次输入;再次使用可展开“我的附件库”。"),s("div",{id:"journal-upload-list",class:"journal-upload-grid"}),s("details",{id:"journal-library",class:"journal-library"},[s("summary",null,[h("我的附件库("),s("span",{id:"journal-library-count"},"0"),h(")")]),s("p",{class:"description"},"已上传的附件可预览、删除或再次用于记事。"),s("div",{id:"journal-library-list",class:"journal-upload-grid"})]),s("details",{id:"journal-trash",class:"journal-trash",hidden:""},[s("summary",null,[h("已删除附件("),s("span",{id:"journal-trash-count"},"0"),h(")")]),s("p",{class:"description"},"删除仅整理附件库,已发布的记事与网盘原文件保留。恢复后可再次使用。"),s("div",{id:"journal-trash-list"})]),s("p",{id:"journal-status",role:"status","aria-live":"polite"}),s("div",{class:"device-actions"},[s("button",{id:"journal-save",type:"submit"},"保存记事"),s("button",{id:"journal-new",type:"button",class:"quiet"},"另写一条")])]),s("form",{id:"journal-filter",class:"panel journal-filters"},[s("label",null,[h("查看方式"),s("select",{id:"journal-mode"},[s("option",{value:"feed"},"家庭/场所动态"),s("option",{value:"mine"},"我的个人阅历"),s("option",{value:"person"},"某个人的阅历")])]),s("label",{id:"journal-person-label",hidden:""},[h("人物"),s("select",{id:"journal-person"})]),s("label",null,[h("分类"),s("select",{id:"journal-category"},[s("option",{value:""},"全部分类"),s("option",null,"日常"),s("option",null,"成长"),s("option",null,"家庭"),s("option",null,"旅行"),s("option",null,"工作"),s("option",null,"其他")])]),s("label",null,[h("关键词"),s("input",{id:"journal-search",type:"search",maxlength:"120",placeholder:"在文字中查找"})]),s("label",null,[h("开始日期"),s("input",{id:"journal-from",type:"date"})]),s("label",null,[h("结束日期"),s("input",{id:"journal-to",type:"date"})]),s("button",{type:"submit"},"查询阅历"),s("button",{id:"journal-filter-clear",type:"button",class:"quiet"},"清除筛选")]),s("p",{class:"description"},"个人阅历保留同一条记事的文字、附件和互动;查看他人时只展示其分享给当前家庭/场所的内容。删除记事或移出附件列表不会删除网盘原文件。"),s("div",{class:"section-head"},[s("p",{id:"journal-query-status",role:"status"}),s("div",null,[s("button",{id:"journal-prev",class:"quiet"},"上一页"),s("button",{id:"journal-next",class:"quiet"},"下一页")])]),s("div",{id:"journal-list",class:"journal-feed"})],-1)),l[9]||(l[9]=s("section",{id:"page-overview",class:"page",hidden:""},[s("div",{id:"scope-overview"})],-1)),s("section",nu,[L(su),l[0]||(l[0]=s("div",{id:"device-detail"},null,-1))]),l[10]||(l[10]=s("section",{id:"page-heritage",class:"page",hidden:""},[s("div",{id:"heritage-home"})],-1)),l[11]||(l[11]=s("section",{id:"page-live",class:"page"},[s("div",{class:"section-head"},[s("h2",{id:"live-heading"},"本场所监控墙"),s("div",null,[s("label",null,[h("清晰度 "),s("select",{id:"quality"},[s("option",{value:"hd"},"主码流"),s("option",{value:"compat"},"子码流")])])])]),s("p",{id:"wall-context",class:"description"},"这里汇总当前场所内已授权的镜头;点击摄像头详情可进入单台设备。"),s("p",{class:"description",id:"quality-note"},"主码流画面更清晰,最高 1920×1080;子码流更流畅,最高 768×432,适合网络较慢时使用。"),s("div",{class:"wall-toolbar"},[s("label",null,[h("分屏 "),s("select",{id:"wall-layout"},[s("option",{value:"auto"},"自适应"),s("option",{value:"1"},"1 画面"),s("option",{value:"2"},"2 画面"),s("option",{value:"4"},"4 画面"),s("option",{value:"6"},"6 画面"),s("option",{value:"9"},"9 画面"),s("option",{value:"16"},"16 画面")])]),s("label",{class:"check"},[s("input",{id:"wall-arrange",type:"checkbox"}),h("调整顺序")]),s("div",{class:"wall-paging"},[s("button",{id:"wall-prev",class:"quiet","aria-label":"上一组画面"},"‹"),s("span",{id:"wall-page"}),s("button",{id:"wall-next",class:"quiet","aria-label":"下一组画面"},"›")]),s("span",{id:"wall-clock"}),s("button",{id:"wall-fullscreen"},"全屏监控")]),s("div",{id:"live-grid",class:"live-grid"}),s("section",{id:"ptz-panel",class:"ptz-panel",hidden:""},[s("div",null,[s("strong",{id:"ptz-title"},"云台"),s("p",{id:"ptz-status",role:"status"})]),s("div",{class:"ptz-pad"},[s("button",{"data-ptz-action":"up","aria-label":"云台向上"},"↑"),s("button",{"data-ptz-action":"left","aria-label":"云台向左"},"←"),s("button",{"data-ptz-action":"stop"},"停止"),s("button",{"data-ptz-action":"right","aria-label":"云台向右"},"→"),s("button",{"data-ptz-action":"down","aria-label":"云台向下"},"↓")]),s("div",{id:"ptz-presets"},[s("div",{class:"section-head"},[s("strong",null,[h("常用位置 "),s("small",{id:"preset-count"})]),s("button",{id:"preset-reload",class:"quiet"},"重新读取")]),s("p",{id:"preset-status",role:"status"}),s("div",{id:"preset-list"}),s("p",{class:"description"},"调整位置后可另存为新预置位。本版不覆盖已有位置,避免设备固件拒绝或误改。"),s("form",{id:"preset-form",hidden:""},[s("label",null,[h("当前位置名称"),s("input",{id:"preset-name",required:"",maxlength:"40",placeholder:"例如:大门、院子"})]),s("button",{type:"submit"},"保存当前位置")]),s("div",{id:"preset-confirmation",hidden:""},[s("p",{id:"preset-confirm-text"}),s("button",{id:"preset-confirm-yes"},"确认"),s("button",{id:"preset-confirm-cancel",class:"quiet"},"取消")])]),s("button",{id:"ptz-close",class:"quiet"},"收起云台")])],-1)),l[12]||(l[12]=s("section",{id:"page-playback",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",null,[h("回到那一刻 "),s("small",null,"光阴")])]),s("div",{class:"panel playback-controls"},[s("label",null,[h("镜头 / 通道"),s("select",{id:"play-camera"})]),s("label",null,[h("录像来源"),s("select",{id:"archive-source"},[s("option",{value:"recorder"},"录像机原有录像(待接入)"),s("option",{value:"local"},"小电脑本机录像")])]),s("label",null,[h("日期"),s("input",{id:"play-date",type:"date"})]),s("button",{id:"query-recordings"},"查找录像"),s("span",{id:"play-info"},"选择日期,查看实际录像时段")]),s("div",{class:"video-panel"},[s("video",{id:"play-video",controls:"",playsinline:""}),s("div",{id:"play-empty",class:"video-empty"},"选择一个有录像的时间段")]),s("div",{class:"panel"},[s("div",{class:"timeline-head"},[s("strong",null,"当日时间轴"),s("span",null,[s("i",{class:"legend"}),h(" 有录像的时段 · 点击定位")])]),s("canvas",{id:"timeline",height:"76","aria-label":"录像时间轴"}),s("div",{class:"time-labels"},[s("span",null,"00:00"),s("span",null,"06:00"),s("span",null,"12:00"),s("span",null,"18:00"),s("span",null,"24:00")]),s("div",{class:"seek-row"},[s("label",null,[h("定位时间 "),s("input",{id:"seek-time",type:"time",step:"1",value:"12:00:00"})]),s("button",{id:"seek-button",class:"secondary"},"定位播放"),s("a",{id:"download",class:"button secondary",hidden:""},"下载原始片段")])]),s("div",{class:"panel"},[s("div",{class:"playback-tools"},[s("label",{class:"check"},[s("input",{id:"play-autonext",type:"checkbox",checked:""}),h("自动续播下一时段(跳过空档)")]),s("button",{id:"play-snapshot",class:"quiet"},"回放截图"),s("span",{id:"play-position",role:"status"})]),s("details",{class:"clip-editor"},[s("summary",null,"选取并下载指定片段"),s("form",{id:"clip-form"},[s("div",{class:"form-grid"},[s("label",null,[h("开始时间"),s("input",{id:"clip-start",type:"datetime-local",step:"1",required:""})]),s("label",null,[h("结束时间"),s("input",{id:"clip-end",type:"datetime-local",step:"1",required:""})])]),s("div",{class:"playback-tools"},[s("button",{type:"button",class:"quiet","data-clip-mark":"start"},"当前位置作起点"),s("button",{type:"button",class:"quiet","data-clip-mark":"end"},"当前位置作终点"),s("button",{type:"submit"},"生成下载链接"),s("a",{id:"clip-download",class:"button secondary",hidden:""},"下载所选片段")]),s("p",{id:"clip-status",role:"status",class:"description"}),s("p",{class:"description"},"每段最多一小时,不可跨越无录像时段。下载保留原始编码,剪辑边界可能受设备关键帧影响。")])])]),s("div",{id:"recording-list",class:"recording-list"})],-1)),l[13]||(l[13]=ke('',1)),s("section",iu,[l[1]||(l[1]=ke('

一物一档 设备 · 归属

同一设备可同时记录类型、区域、所有人、负责人和标签。分组顺序可自由组合,例如“灯 → 卧室”或“负责人 → 类型 → 区域”。人员归属不自动授予访问权限。

',2)),l[2]||(l[2]=s("div",{class:"panel device-view-controls"},[s("div",{class:"device-search-row"},[s("label",null,[h("设备类型"),s("select",{id:"device-type"},[s("option",{value:""},"所有类型")])]),s("label",null,[h("搜索设备或人员"),s("input",{id:"device-search",type:"search",placeholder:"例如:卧室 灯;也可查 IP、品牌、型号、人员"})]),s("button",{id:"device-clear",type:"button",class:"quiet",hidden:""},"清除设备筛选")]),s("div",{class:"device-actions view-presets",role:"group","aria-label":"设备分组方式"},[s("button",{type:"button",class:"quiet","data-group-preset":"space,type"},"按区域查看"),s("button",{type:"button",class:"quiet","data-group-preset":"type,space"},"按类型查看"),s("button",{type:"button",class:"quiet","data-group-preset":"manager,type,space"},"按负责人查看")]),s("details",{class:"group-custom"},[s("summary",null,"自定义分组顺序"),s("p",{class:"description"},"依次分组(前面的维度优先,区域按你定义的完整层级展示)"),s("div",{id:"device-group-order",class:"device-group-order"}),s("div",{class:"device-actions"},[s("button",{id:"device-group-add",class:"quiet"},"+ 增加分组维度"),s("button",{"data-admin":"",id:"device-view-save",class:"secondary"},"保存为本归属的默认视图")])]),s("p",{id:"device-count",class:"description"})],-1)),l[3]||(l[3]=s("div",{class:"device-actions",role:"group","aria-label":"设备展示方式"},[s("button",{id:"devices-card-view",class:"quiet","aria-pressed":"true"},"设备卡片"),s("button",{id:"devices-topology-view",class:"quiet","aria-pressed":"false"},"网络拓扑")],-1)),L(Dc),L(tu)]),l[14]||(l[14]=ke('',3)),l[15]||(l[15]=s("section",{id:"page-heritage-records",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",{id:"heritage-records-title"},"文化与家风"),s("div",null,[s("button",{class:"quiet","data-page":"heritage"},"返回家庭传承"),s("button",{id:"heritage-new"},"+ 新建档案")])]),s("div",{class:"panel heritage-controls"},[s("label",null,[h("查找档案"),s("input",{id:"heritage-search",type:"search",placeholder:"名称、内容、相关人员"})]),s("label",{class:"check"},[s("input",{id:"heritage-archived",type:"checkbox"}),h("包含归档资料")]),s("button",{id:"heritage-reload",class:"quiet"},"重新载入")]),s("p",{id:"heritage-error",class:"form-error",role:"status"}),s("div",{id:"heritage-list",class:"site-grid"}),s("aside",{id:"heritage-detail",class:"panel",hidden:""})],-1)),l[16]||(l[16]=s("section",{id:"page-family",class:"page",hidden:""},[s("div",{class:"section-head"},[s("h2",null,[h("家族的来处与延续 "),s("small",null,"世系 · 传承")]),s("div",null,[s("button",{id:"family-reload",class:"quiet"},"重新载入"),s("button",{id:"family-export",class:"quiet"},"导出家谱"),s("button",{id:"new-person"},"+ 录入人物")])]),s("p",{class:"description"},"从祖辈到后辈,一张图看全家。点击人物查看档案,暖金色卡片是当前账号关联的本人。"),s("div",{class:"panel family-toolbar"},[s("label",null,[h("关系参照人物"),s("select",{id:"family-reference"})]),s("label",null,[h("查找人物"),s("input",{id:"family-search",type:"search",placeholder:"姓名、别名或籍贯"})]),s("button",{id:"family-find",class:"quiet",hidden:""},"定位搜索结果"),s("label",{class:"check"},[s("input",{id:"family-archived",type:"checkbox"}),h("显示归档人物")]),s("span",{id:"family-count"})]),s("div",{id:"family-error",class:"form-error",role:"status"}),s("div",{id:"family-workspace",class:"family-workspace"},[s("section",{id:"family-canvas-panel",class:"family-canvas-panel","aria-label":"全家关系图"},[s("div",{class:"family-map-heading"},[s("div",null,[s("span",{class:"eyebrow"},"枝叶相连 · 世代相承"),s("h2",{id:"family-view-title"},"全家关系图")]),s("div",{class:"family-view-tabs",role:"group","aria-label":"家谱显示方式"},[s("button",{id:"family-view-tree",class:"quiet","aria-pressed":"true"},"关系图"),s("button",{id:"family-view-list",class:"quiet","aria-pressed":"false"},"人物名册"),s("button",{id:"family-view-timeline",class:"quiet","aria-pressed":"false"},"家族时间线")])]),s("div",{id:"family-map-controls",class:"family-map-controls"},[s("div",{class:"family-zoom-controls"},[s("button",{id:"family-zoom-out",class:"quiet","aria-label":"缩小家谱"},"−"),s("output",{id:"family-zoom-value","aria-live":"polite"},"100%"),s("button",{id:"family-zoom-in",class:"quiet","aria-label":"放大家谱"},"+"),s("button",{id:"family-fit",class:"quiet"},"查看全谱")]),s("button",{id:"family-locate-self",class:"quiet"},"◎ 定位本人"),s("button",{id:"family-fullscreen",class:"quiet"},"全屏家谱")]),s("div",{id:"family-tree",class:"family-map-viewport",tabindex:"0",role:"region","aria-label":"家谱关系图,可拖动空白处或使用滚动条浏览"}),s("div",{id:"family-people",class:"family-people family-register",hidden:""}),s("section",{id:"family-events",hidden:"","aria-label":"家族重大记事"},[s("div",{class:"family-event-intro"},[s("div",null,[s("h3",null,"把值得记住的事,留给后来的人"),s("p",{class:"description"},"按事情发生的日期排列,可关联多位亲人,并附上详细记载或报道链接。")]),s("button",{id:"family-new-event"},"+ 写一则记事")]),s("div",{class:"family-event-filters"},[s("label",null,[h("关联人物"),s("select",{id:"family-event-person"},[s("option",{value:""},"全家")])]),s("label",null,[h("年份"),s("select",{id:"family-event-year"},[s("option",{value:""},"所有年份")])]),s("label",null,[h("排列"),s("select",{id:"family-event-order"},[s("option",{value:"desc"},"从近到远"),s("option",{value:"asc"},"从远到近")])]),s("label",null,[h("搜索记事"),s("input",{id:"family-event-search",type:"search",placeholder:"标题、摘要或正文"})]),s("label",{class:"check"},[s("input",{id:"family-event-relatives",type:"checkbox"}),h("包括此人的父母、配偶和子女")]),s("label",{id:"family-event-state-label"},[h("状态"),s("select",{id:"family-event-state"},[s("option",{value:"published"},"已发布"),s("option",{value:"draft"},"草稿箱"),s("option",{value:"archived"},"已归档"),s("option",{value:"all"},"全部")])]),s("button",{id:"family-event-clear",class:"quiet"},"清除筛选")]),s("p",{id:"family-event-count",class:"description",role:"status"}),s("div",{id:"family-timeline",class:"family-timeline"})]),s("div",{id:"family-map-footer",class:"family-map-footer"},[s("div",{class:"family-map-legend"},[s("span",null,[s("i",{class:"legend-self"}),h("本人")]),s("span",null,[s("i",{class:"legend-selected"}),h("正在查看")]),s("span",null,[s("i",{class:"legend-parent"}),h("父母 → 子女")]),s("span",null,[s("i",{class:"legend-spouse"}),h("配偶")]),s("span",null,[s("i",{class:"legend-adoptive"}),h("收养 / 继亲")])]),s("p",{id:"family-map-note",class:"description",role:"status"}),s("span",{class:"description"},"拖动空白处移动 · 点击人物查看档案 · 关系称谓按参照人物计算")])]),s("aside",{id:"family-detail",class:"panel family-inspector","aria-label":"人物档案"})])],-1)),L(ic),l[17]||(l[17]=ke('
赵府 · 智能数字管家独立部署 / 数据自有
',2))],64))}},au={};function ru(e,t){return P(),$(G,null,[t[0]||(t[0]=ke('
灯火可亲 · 归家有时

欢迎回来

使用自己的账号,进入家庭空间。

设备档案

网络与连接

保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。

手机、灯、冰箱等当前支持设备档案、分类和责任归属。自动控制需另行接入对应协议,登记不代表已连接设备。

传承资料

这里只保存资料和意愿;不会据此转移财产或授予任何账号权限。链接内容保存在原位置,本系统保存链接和文字记录。

空间档案

镜头通道配置

直接接入摄像头时,可读取设备实际提供的媒体配置。端口请按设备填写:通常为 80,部分 TP-Link 设备为 2020。服务器需要能够访问该设备所在网络。

账号和密码只保存在本机受限数据目录。RTSP 服务响应代表设备可达,实际码流接通后才显示在线。路径预设需要与设备型号、通道一致。

摄像头对象

网络与连接

保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。

录像机配置

网络与连接

保存后自动更新拓扑。网络信息用于设备档案;摄像机实际取流地址在“配置镜头”内设置。选择人员不改变账号访问权限。

驱动在当前版本提供路径模板。录像机历史录像检索、回放及通道自动导入,需要型号确认后接入,当前尚未实现。

',7)),t[1]||(t[1]=s("dialog",{id:"leadership-dialog"},[s("form",{id:"leadership-form"},[s("div",{class:"dialog-heading"},[s("h2",null,"负责人安排与交接"),s("button",{type:"button",class:"quiet","data-close":"leadership-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"revision",type:"hidden"}),s("p",{class:"description"},"先建立至少两位家庭 / 场所管理员,再指定主要和备用负责人。家庭的主要负责人即一家之主;备用负责人已具有本归属管理权限,意外发生也能继续管理。正式交接由当前主要负责人或超级管理员办理。"),s("div",{class:"form-grid"},[s("label",null,[h("主要负责人 *"),s("select",{name:"ownerId",required:""})]),s("label",null,[h("备用负责人"),s("select",{name:"successorId"})]),s("label",{class:"full"},[h("安排 / 交接说明 *"),s("textarea",{name:"reason",required:"",maxlength:"300",rows:"3",placeholder:"说明负责人安排或本次交接原因"})])]),s("p",{class:"description"},"交接后原负责人仍保留本归属的管理员权限。系统不会依据未登录或家谱去世日期自动转移权限;交接记录可追溯。"),s("p",{class:"form-error",role:"status"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"确认保存负责人安排")])])],-1)),t[2]||(t[2]=s("dialog",{id:"household-dialog"},[s("form",{id:"household-form"},[s("div",{class:"dialog-heading"},[s("h2",null,"家庭 / 场所档案"),s("button",{type:"button",class:"quiet","data-close":"household-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"profileRevision",type:"hidden",value:"0"}),s("div",{class:"form-grid"},[s("label",{class:"full"},[h("归属名称 *"),s("input",{name:"name",maxlength:"80",required:"",placeholder:"例如:赵府、济南办公室、莱阳工厂"})]),s("label",{class:"full"},[h("归属类型"),s("select",{name:"kind"},[s("option",{value:"home"},"家庭"),s("option",{value:"office"},"办公场所"),s("option",{value:"factory"},"工厂")])]),s("fieldset",{class:"full geo-picker","data-geography":"","data-geo-title":"所在地"}),s("div",{class:"full cover-editor"},[s("img",{id:"household-cover-preview",alt:"场所封面预览",hidden:""}),s("label",null,[h("卡片封面照片"),s("input",{id:"household-cover-file",type:"file",accept:"image/png,image/jpeg,image/webp"})]),s("button",{type:"button",id:"household-cover-cancel",class:"quiet"},"取消本次图片选择"),s("button",{type:"button",id:"household-cover-reset",class:"quiet"},"使用默认封面"),s("p",{id:"household-cover-status",class:"description",role:"status","aria-live":"polite"},"照片仅向有权进入该家庭或场所的账号开放。")]),s("label",{class:"full"},[h("备注"),s("textarea",{name:"note",maxlength:"300",rows:"3"})])]),s("p",{class:"description"},"创建后进入该归属,建立管理员,再自行划分区域和登记设备。"),s("p",{class:"form-error"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"保存家庭")])])],-1)),t[3]||(t[3]=ke('

账号档案

允许查看摄像头的空间

普通成员只访问本归属内已授权的区域。默认仅授权所选区域;勾选“包含下级区域”后同时包含其所有后代。管理员可管理本归属全部区域。

',2)),t[4]||(t[4]=s("dialog",{id:"person-dialog"},[s("form",{id:"person-form"},[s("div",{class:"dialog-heading"},[s("h2",null,"家谱人物"),s("button",{type:"button",class:"quiet","data-close":"person-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"revision",type:"hidden"}),s("div",{class:"form-grid"},[s("label",null,[h("姓名 / 称呼 *"),s("input",{name:"name",required:"",maxlength:"80",placeholder:"姓名暂不知时可先填称呼"})]),s("label",null,[h("别名 / 字 / 号"),s("input",{name:"alias",maxlength:"120"})]),s("label",null,[h("性别"),s("select",{name:"gender"},[s("option",{value:"unknown"},"待确认"),s("option",{value:"male"},"男"),s("option",{value:"female"},"女")])]),s("label",null,[h("在世情况"),s("select",{name:"lifeStatus"},[s("option",{value:"alive"},"在世"),s("option",{value:"deceased"},"不在世"),s("option",{value:"unknown"},"待确认")])]),s("fieldset",{class:"family-date","data-date-field":"birthDate"},[s("legend",null,"出生日期"),s("input",{name:"birthDate",type:"hidden"}),s("label",null,[h("历法"),s("select",{"data-calendar":"","aria-label":"出生日期历法"},[s("option",{value:"solar"},"公历"),s("option",{value:"lunar"},"农历")])]),s("label",null,[h("日期"),s("input",{"data-date-value":"","aria-label":"出生日期",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),s("label",{"data-leap-label":"",class:"check",hidden:""},[s("input",{"data-date-leap":"",type:"checkbox"}),h("闰月")]),s("output",{"data-date-hint":"","aria-live":"polite"},"日期不详可留空")]),s("fieldset",{class:"family-date","data-date-field":"deathDate",hidden:""},[s("legend",null,"去世日期"),s("input",{name:"deathDate",type:"hidden"}),s("label",null,[h("历法"),s("select",{"data-calendar":"","aria-label":"去世日期历法"},[s("option",{value:"solar"},"公历"),s("option",{value:"lunar"},"农历")])]),s("label",null,[h("日期"),s("input",{"data-date-value":"","aria-label":"去世日期",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),s("label",{"data-leap-label":"",class:"check",hidden:""},[s("input",{"data-date-leap":"",type:"checkbox"}),h("闰月")]),s("output",{"data-date-hint":"","aria-live":"polite"},"日期不详可留空")]),s("label",{class:"full",id:"person-legacy-place"},[h("原籍贯/出生地记录"),s("input",{name:"birthplace",maxlength:"160"}),s("small",null,"历史填写内容保留,可在下方分别补充。")]),s("fieldset",{class:"full person-location"},[s("legend",null,"籍贯(祖籍)"),s("div",{class:"form-grid"},[s("fieldset",{class:"full geo-picker","data-geography":"native","data-geo-title":"籍贯(祖籍)"}),s("label",null,[h("乡镇/街道"),s("input",{name:"nativeTown",maxlength:"80",placeholder:"","aria-label":"籍贯(祖籍) · 乡镇/街道"})]),s("label",null,[h("村/社区"),s("input",{name:"nativeCommunity",maxlength:"80",placeholder:"","aria-label":"籍贯(祖籍) · 村/社区"})]),s("label",{class:"full"},[h("详细地址/历史地名"),s("input",{name:"nativeAddress",maxlength:"200",placeholder:"楼栋、门牌或旧称,可按已知信息填写","aria-label":"籍贯(祖籍) · 详细地址/历史地名"})])])]),s("fieldset",{class:"full person-location"},[s("legend",null,"出生地"),s("div",{class:"form-grid"},[s("fieldset",{class:"full geo-picker","data-geography":"birth","data-geo-title":"出生地"}),s("label",null,[h("乡镇/街道"),s("input",{name:"birthTown",maxlength:"80",placeholder:"","aria-label":"出生地 · 乡镇/街道"})]),s("label",null,[h("村/社区"),s("input",{name:"birthCommunity",maxlength:"80",placeholder:"","aria-label":"出生地 · 村/社区"})]),s("label",{class:"full"},[h("详细地址/历史地名"),s("input",{name:"birthAddress",maxlength:"200",placeholder:"楼栋、门牌或旧称,可按已知信息填写","aria-label":"出生地 · 详细地址/历史地名"})])])]),s("p",{class:"description full"},"籍贯与出生地可不同;选择中国、世界或自定义地域,不详的层级可留空。"),s("label",{class:"full"},[h("生平简介"),s("textarea",{name:"biography",rows:"4",maxlength:"2000"})]),s("label",{class:"full"},[h("备注 / 信息来源"),s("textarea",{name:"note",rows:"3",maxlength:"500",placeholder:"例如:长辈口述、族谱记载、待考证信息"})]),s("label",{class:"check"},[s("input",{name:"archived",type:"checkbox"}),h("归档人物(保留关系,可恢复)")])]),s("p",{class:"form-error"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"保存人物")])])],-1)),t[5]||(t[5]=ke('

连接人物关系

每条亲子关系连接一位父母与一位子女。录入另一位父母时,再建立一条关系。

',1)),t[6]||(t[6]=s("dialog",{id:"event-dialog","aria-labelledby":"event-editor-title"},[s("form",{id:"event-form"},[s("div",{class:"dialog-heading"},[s("h2",{id:"event-editor-title"},"写一则家族记事"),s("button",{type:"button",class:"quiet","data-close":"event-dialog"},"关闭")]),s("input",{name:"id",type:"hidden"}),s("input",{name:"revision",type:"hidden"}),s("div",{class:"form-grid"},[s("label",{class:"full"},[h("记事标题 *"),s("input",{name:"title",required:"",maxlength:"160",placeholder:"用一句话概括这件事"})]),s("fieldset",{class:"family-date full","data-date-field":"eventDate"},[s("legend",null,"事情发生的日期 *"),s("input",{name:"eventDate",type:"hidden"}),s("label",null,[h("历法"),s("select",{"data-calendar":"","aria-label":"记事日期历法"},[s("option",{value:"solar"},"公历"),s("option",{value:"lunar"},"农历")])]),s("label",null,[h("日期"),s("input",{"data-date-value":"","aria-label":"记事日期",required:"",type:"text",inputmode:"numeric",placeholder:"YYYY-MM-DD",maxlength:"10"})]),s("label",{"data-leap-label":"",class:"check",hidden:""},[s("input",{"data-date-leap":"",type:"checkbox"}),h("闰月")]),s("output",{"data-date-hint":"","aria-live":"polite"})]),s("fieldset",{class:"full"},[s("legend",null,"关联人物(可多选)"),s("input",{id:"event-person-search",type:"search",placeholder:"查找要关联的亲人","aria-label":"查找关联人物"}),s("div",{id:"event-person-choices"}),s("p",{class:"description"},"未选择人物时记为全家记事。每位关联人物的档案都可以追溯到这条记事。")]),s("label",{class:"full"},[h("摘要"),s("textarea",{name:"summary",maxlength:"400",rows:"2",placeholder:"简要说明这件事"})]),s("label",{class:"full"},[h("详细记载"),s("textarea",{name:"body",maxlength:"12000",rows:"7",placeholder:"记录经过、意义、长辈口述或资料出处。可分段书写。"})]),s("label",null,[h("报道 / 资料来源"),s("input",{name:"sourceName",maxlength:"160",placeholder:"例如:报刊名称、个人博客"})]),s("label",null,[h("原始报道链接"),s("input",{name:"sourceUrl",type:"url",maxlength:"2000",placeholder:"https://…"})]),s("label",{class:"check full"},[s("input",{name:"archived",type:"checkbox"}),h("归档记事(保留内容,可恢复)")])]),s("p",{class:"description"},"正式发布后,有家谱查看权限的账号即可在时间线看到;草稿只对有编辑权限的人可见。"),s("p",{class:"form-error",role:"status"}),s("div",{class:"dialog-footer event-editor-actions"},[s("button",{type:"submit","data-save-event":"",value:"draft",class:"secondary"},"保存草稿"),s("button",{type:"submit","data-publish-event":"",value:"published"},"发布记事"),s("button",{type:"submit","data-withdraw-event":"",value:"draft",class:"secondary",hidden:""},"撤回为草稿")])])],-1)),t[7]||(t[7]=ke('
家事 · 家声
',1)),t[8]||(t[8]=s("dialog",{id:"history-dialog","aria-labelledby":"history-title"},[s("div",{class:"dialog-heading"},[s("h2",{id:"history-title"},"修改记录"),s("button",{type:"button",class:"quiet","data-close":"history-dialog"},"关闭")]),s("p",{class:"description"},"人物、关系与记事每次保存都会留存版本。仅有家谱编辑权限的账号可查阅和恢复。"),s("p",{id:"history-error",class:"form-error",role:"status"}),s("div",{id:"history-list"}),s("button",{id:"history-more",class:"quiet",hidden:""},"加载更早记录"),s("article",{id:"history-detail"})],-1)),t[9]||(t[9]=s("dialog",{id:"password-dialog","aria-labelledby":"password-title"},[s("form",{id:"password-form"},[s("div",{class:"dialog-heading"},[s("h2",{id:"password-title"},"修改我的密码"),s("button",{type:"button",class:"quiet","data-close":"password-dialog"},"关闭")]),s("p",{id:"password-account",class:"description"}),s("label",null,[h("当前密码"),s("input",{name:"currentPassword",type:"password",required:"",maxlength:"128",autocomplete:"current-password"})]),s("label",null,[h("新密码"),s("input",{name:"newPassword",type:"password",required:"",minlength:"8",maxlength:"128",autocomplete:"new-password"})]),s("label",null,[h("再次输入新密码"),s("input",{name:"confirmPassword",type:"password",required:"",minlength:"8",maxlength:"128",autocomplete:"new-password"})]),s("p",{class:"description"},"保存后,这个账号在所有设备上都需要用新密码重新登录。"),s("p",{class:"form-error",role:"status"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit"},"保存新密码")])])],-1)),t[10]||(t[10]=s("dialog",{id:"camera-settings-dialog","aria-labelledby":"camera-settings-title"},[s("div",{class:"dialog-heading"},[s("h2",{id:"camera-settings-title"},"摄像机参数"),s("button",{class:"quiet","data-close":"camera-settings-dialog"},"关闭")]),s("div",{class:"section-head"},[s("label",null,[h("设置码流"),s("select",{id:"camera-settings-quality"},[s("option",{value:"main"},"主码流"),s("option",{value:"sub"},"子码流")])]),s("button",{id:"camera-settings-reload",class:"quiet"},"重新读取")]),s("div",{id:"camera-settings-info"}),s("p",{id:"camera-settings-status",class:"form-error",role:"status"}),s("form",{id:"camera-image-form"},[s("h3",null,"图像与日夜模式"),s("p",{class:"description"},"作用于当前物理镜头,主、子码流共用这些图像参数。"),s("div",{id:"camera-image-fields",class:"form-grid"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit",disabled:""},"保存图像参数")])]),s("form",{id:"camera-video-form"},[s("h3",null,"码流与清晰度"),s("p",{class:"description"},"作用于上方选定的码流。保存后画面可能短暂重连,录像机也会使用调整后的码流。本页保留原有视频编码。"),s("div",{id:"camera-video-fields",class:"form-grid"}),s("div",{class:"dialog-footer"},[s("button",{type:"submit",disabled:""},"保存码流参数")])]),s("details",null,[s("summary",null,"其他萤石功能的接入情况"),s("ul",null,[s("li",null,"云台方向微调与预置位:在实时画面的“云台”中使用,按设备能力启用。"),s("li",null,"实时声音与全屏:通过画面播放器控制。"),s("li",null,"双向对讲、智能追踪、声光告警、隐私遮蔽、设备翻转、云录像和消息推送:当前尚未接入,请使用萤石 App。"),s("li",null,"录像机原有录像:仍通过录像机或原厂 App 查看;本系统已支持本机额外录像的回放。")]),s("p",{class:"description"},"功能按设备实际开放能力逐项接入,型号与固件不同可能有差异。")])],-1)),t[11]||(t[11]=s("div",{id:"toast",role:"status",hidden:""},null,-1)),t[12]||(t[12]=ke('

画面截图

当前视频画面截图

下载 PNG 图片

附件预览

',2))],64)}const cu=xi(au,[["render",ru]]),uu=["/vendor/hls.min.js","/live-player.js","/kinship.js","/family-graph.js","/calendar.js","/device-model.js","/data/geography-data.js","/geography.js","/app.js","/monitor.js","/date-fields.js","/family-map.js","/family.js","/family-events.js","/family-history.js","/camera-settings.js","/recording-ranges.js","/recording-ui.js","/snapshot.js","/households.js","/devices.js","/steward.js","/heritage.js","/personalization.js","/file-hash.js","/journal.js"];function rn(e){if(!(e instanceof Element))return;const t=[e,...e.querySelectorAll("button,input,select,textarea,table")];for(const l of t)l.matches("button")&&!l.closest(".family-map-viewport")&&!l.classList.contains("btn")&&l.classList.add("btn",l.matches(".quiet,.secondary")?"btn-outline-secondary":"btn-primary"),l.matches("select")&&l.classList.add("form-select"),l.matches("textarea,input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=hidden])")&&l.classList.add("form-control"),l.matches("input[type=checkbox],input[type=radio]")&&l.classList.add("form-check-input"),l.matches("table")&&l.classList.add("table","align-middle")}async function du(){rn(document.getElementById("app")),new MutationObserver(e=>{for(const t of e)for(const l of t.addedNodes)rn(l)}).observe(document.getElementById("app"),{childList:!0,subtree:!0});for(const e of[...uu,"/vue-bridge.js"])await new Promise((t,l)=>{const n=document.createElement("script");n.src=e+"?ui=0.1.35",n.onload=t,n.onerror=()=>l(new Error("Could not load "+e)),document.head.append(n)});await window.ZhaoVue.boot()}const fu={key:0,class:"alert alert-danger",role:"alert"},pu={__name:"App",setup(e){const t=Se(!1);return zn(async()=>{try{await du()}catch(l){console.error("Application startup failed",l),t.value=!0}}),(l,n)=>(P(),$(G,null,[L(ir),s("main",null,[L(rr),t.value?(P(),$("div",fu,"页面组件加载失败,请检查网络后重新打开页面。")):B("",!0),L(ou)]),L(cu)],64))}};Ka(pu).mount("#app"); diff --git a/web/ui/index.html b/web/ui/index.html new file mode 100644 index 0000000..ffd217c --- /dev/null +++ b/web/ui/index.html @@ -0,0 +1,3 @@ +赵府 · 智能数字管家 + +
diff --git a/web/vue-bridge.js b/web/vue-bridge.js new file mode 100644 index 0000000..db4b687 --- /dev/null +++ b/web/vue-bridge.js @@ -0,0 +1,11 @@ +'use strict'; +Object.assign(window.ZhaoVue,{ + boot:bootApplication, + publish(){this.accept({state,user:currentUser,admin:isAdmin(),platformAdmin:isPlatformAdmin(),loggedIn,page:activePage,session:sessionGeneration,device:selectedDevice(),brandName:branding.name});}, + api,notify:toast,address:ZhaoGeography.describe, + async saveLayout(value){const saved=await api('/api/households/layout',value);state.householdLayout=saved;this.publish();return saved;}, + async enterHome(id,network=false){try{if(id!==state.familyId&&!await switchHousehold(id))return;if(network){devicePresentation='topology';showPage('objects');}else showPage('overview');}catch(e){if(!e.stale)toast(e.message);}}, + enterDevice, + location(id){return siteName(id);}, + network(device){return ZhaoDevices.network(device,state);} +});