diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 3f489a8..06cef12 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -12,6 +12,11 @@ on: jobs: build-image: runs-on: ubuntu-latest + env: + # 关键: 显式固定 Android/OTA 后端地址, 覆盖 runner 环境里可能存在的 + # 其他 VITE_API_BASE 值。否则 OTA 包里的前端可能连错后端, 导致 + # "OTA 更新后登录失败/进不去内部"。与 android-build.yml 保持一致。 + VITE_API_BASE: http://bh.vps.honor3.com:3001 steps: - uses: https://gitea.com/actions/checkout@v4 @@ -51,6 +56,12 @@ jobs: - name: List images run: docker images + - name: Apply DB migrations + # 仓库内的 prisma 迁移自动应用 (migrate deploy 幂等, 无新迁移时为 no-op) + env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + run: npx prisma migrate deploy + - name: Remove old container run: docker rm -vf iboard || true @@ -60,10 +71,13 @@ jobs: - name: Run container # DATABASE_URL 通过 gitea Actions secret 注入, 不进镜像层 # OTA_PACKAGE_DIR 已在 Dockerfile 设为 /app/ota-package + # 米家凭证 (auth.txt) 不进 git: 运维放宿主机 /app/iboard/cache, bind-mount 进容器 (MIHOME_CACHE_DIR=/app/cache) run: | docker run -d --name iboard -p 3001:3001 \ -e DATABASE_URL="${{ secrets.DATABASE_URL }}" \ -e JWT_SECRET="${{ secrets.JWT_SECRET }}" \ + -e MIHOME_CACHE_DIR=/app/cache \ + -v /app/iboard/cache:/app/cache \ iboard:latest env: DATABASE_URL: ${{ secrets.DATABASE_URL }} diff --git a/.gitea/workflows/sync-registry.yml b/.gitea/workflows/sync-registry.yml new file mode 100644 index 0000000..4088774 --- /dev/null +++ b/.gitea/workflows/sync-registry.yml @@ -0,0 +1,52 @@ +name: Sync Secrets to Registry + +# 将本仓库 Gitea CI/CD secrets 明文写回注册中心 (Registry 配置管理中心) 的 MCP 服务 +# 目标: service-iboard 项目 (proj-msid70ql-6xbq4w) +# 触发: 仅手动 (workflow_dispatch) +# 依赖 secret: +# - REGISTRY_MCP_TOKEN : 注册中心 MCP 访问令牌 (在注册中心 🔑Token 管理 里生成) +# - 其余 secret 与三个构建 workflow 引用的保持一致 (未设置则跳过对应键) +# 注意: 传输为明文 http, 请保证注册中心仅内网可达; 若可访问则改用 https + +on: + workflow_dispatch: + inputs: + dry_run: + description: '仅预演不写入 (true=只打印计划)' + required: false + default: 'false' + +jobs: + sync-secrets: + runs-on: ubuntu-latest + permissions: + contents: read + env: + REGISTRY_MCP_URL: http://bh.vps.honor3.com:8008/mcp + REGISTRY_PROJECT_ID: proj-msid70ql-6xbq4w + REGISTRY_IDC: '1' + REGISTRY_ENVIRONMENT: '1' + steps: + - uses: https://gitea.com/actions/checkout@v4 + + - name: Setup Node + uses: https://gitea.com/actions/setup-node@v4 + with: + node-version: 22 + + - name: Sync secrets via MCP + run: | + if [ "${{ inputs.dry_run }}" = "true" ]; then + node scripts/sync-registry.mjs --dry-run + else + node scripts/sync-registry.mjs + fi + env: + REGISTRY_MCP_TOKEN: ${{ secrets.REGISTRY_MCP_TOKEN }} + MINISIGN_PRIVATE_KEY: ${{ secrets.MINISIGN_PRIVATE_KEY }} + DATABASE_URL: ${{ secrets.DATABASE_URL }} + JWT_SECRET: ${{ secrets.JWT_SECRET }} + ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} + ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} + PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3076d28..9edb0b1 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,9 @@ dist/* ota-package/* !ota-package/README.md -# apizero 文件缓存 (运行时按需生成) -cache/apizero/ -# Dockerfile 持久卷挂载点 (跟 ota-package 同类) +# apizero 文件缓存 (运行时按需生成) +cache/apizero/ +# Dockerfile 持久卷挂载点 (跟 ota-package 同类) .cache/ +# 米家凭证缓存 (含 token, 绝不能提交) +server/mihome/.cache/ diff --git a/Dockerfile b/Dockerfile index db9d99a..7b4405c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,6 +48,7 @@ COPY --from=builder /app/server ./server COPY --from=builder /app/generated ./generated COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/prisma.config.ts ./prisma.config.ts +COPY --from=builder /app/scripts ./scripts COPY --from=builder /app/content ./content COPY --from=builder /app/public ./public diff --git a/docs/环境监控模块设计.md b/docs/环境监控模块设计.md new file mode 100644 index 0000000..d2db4ac --- /dev/null +++ b/docs/环境监控模块设计.md @@ -0,0 +1,400 @@ +# 环境监控模块设计(米家温湿度长期记录) + +> 目标项目: iboard(Tauri + React + Express + Prisma/MariaDB) +> 状态: 设计稿 v1.1 · 2026-09-20 · 待评审(v1.1: 视图新增 今天/月/年三档粒度 + 标题显示电量) + +## 1. 需求与目标 + +在监控页新增「环境监控」tab,实现**多家庭**下温湿度**长期记录**: + +1. 监控页新增一个 tab「环境监控」。 +2. 多家庭支持:每个家庭一个可折叠 group,**手风琴**式展开(同一时间只能展开一个)。 +3. 每个设备可独立修改**别名**(仅本应用展示用,不改动米家云端设备名)。 +4. 数据**非实时**(定时批量,不做推送):**每小时采样 1 次**落库小时档,每日聚合成日档。 +5. 记录保留**永久**(无清理任务)。 +6. 缺失补齐语义(用户确认): + - **应用停机**导致的缺失 → 应用恢复后自动重新获取补齐(有统计的型号经云端聚合真实回填, + 见 §2.2B;无统计的型号保持缺口标注); + - **设备自身原因**(离线/故障)的缺失 → 保持缺失,不伪造数据; + - 总原则:**本地数据不少于米家可提供的数据**。 +7. 米家授权失效 → 前端显示「重新授权」按钮,点击弹出**二维码**,人工扫码后恢复。 +8. 每设备数据**默认显示当天**,粒度**小时**。 +9. 每设备数据可切换为**月**,粒度**天**。 +10. 每设备数据可切换为**年**,粒度**周**。 +11. 设备卡片**标题 = 别名 + 电量**(电量取当天缓存值,不必频繁更新)。 + +已确认的数据范围:仅**温湿度**(不含照度 / 人体存在)。 + +## 2. 已验证事实(调研结论,作为设计地基) + +调研用的账号 `18814803393`,登录链路与数据能力已实测(脚本位于 +`C:\Users\xydkj\AppData\Local\Temp\opencode\mibridge-research\`): + +| 项目 | 结论 | 证据 | +| --- | --- | --- | +| 登录方式 | 密码登录被米家拒绝(`70016`);**扫码登录可行** | `qr-once.mjs` | +| Token 有效期 | 30 天,`DiskCache` 持久化,脚本自动加载刷新 | `.mijia-cache/` | +| 实时读值 | `api.getDevicesProp([{did,siid,piid}])` 稳定可用,100 项请求 10 轮 100% 成功 | `env-monitor.mjs` | +| 单轮延迟 | p50 ≈ 520ms,p95 ≈ 612ms(10 项属性/轮) | 同上 | +| VRF 空调目标温写入 | 整数生效但**生效延迟 5~6s**(updateTime 才更新);半度 26.5 被服务端拒收(`-704220043`) | `vrf-temp-test*.mjs` | +| 温湿度历史读取 | **不可读**:`history-data(8.1)`/`start-time(8.3)` 返回 `-704010000`;`start-synic` 动作要求参数;`/v2/home/device/prop_history` 类端点不可达 | `dev-history-probe.mjs` | + +### 2.1 环境设备清单(共 3 台,均属家庭「黄金农场」505001017889) + +| 家庭 | 设备 | 型号 | did | 温度 | 湿度 | 电量 | +| --- | --- | --- | --- | --- | --- | --- | +| 黄金农场 | 炎米智能温湿度计 | `ym001.sensor_ht.ymwsdj` | `blt.3.1nmu8afgt0g00` | 2.1001 | 2.1002 | `3.1003` | +| 黄金农场 | 炎米智能温湿度计 2 | `ym001.sensor_ht.ymwsdj` | `blt.3.1nmu8eunt0001` | 2.1001 | 2.1002 | `3.1003` | +| 黄金农场 | 闹钟(青萍,含温湿) | `cgllc.clock.dove` | `blt.3.12cq3lu8glo00` | 2.1 | 2.2 | `2.3` | + +> 第二个家庭「韩家」(586001550228) 当前无环境设备,设计需容忍空家庭。 + +### 2.2 关键约束:逐点历史不可达,但云端「聚合统计历史」可用(实测反转) + +原结论"云端历史完全不可达"已推翻。实测分两条: + +**A. 逐点历史(设备本地日志)云 API 不可达** +- 炎米温湿度计:规格含 `8.1 history-data / 8.3 start-time / start-synic`,但 8.1/8.3 读取全返回 + `-704010000`(不可读),`start-synic` 动作试了 8 种参数形态全部报 `-704220025 参数个数不匹配`, + 判定为"局域网直连通道",云侧无暴露; +- 青萍闹钟:miot 规格仅 temperature / relative-humidity / battery-level,**无任何历史属性/动作**。 + +**B. 云端聚合统计历史「可用」(%@zythum02/mijia-api 可直接打 `POST /v2/user/statistics`)** +参数 `{ did, key(siid.piid), data_type, limit, time_start, time_end }`,用本库 `api.request()` 直连即可。 + +| data_type | 桶(Asia/Shanghai) | value 语义 | 实测(炎米 ym001.sensor_ht.ymwsdj) | +| --- | --- | --- | --- | +| `stat_hour_v3` | 1 小时整点 | 小时均值 | 连续入库(炎米1 有部分缺档),如 `[28.8]` | +| `stat_day_v3` | 1 天 00:00 | 当日 [min, max] | 45 天全有,如 `[28.1, 29.2]`,与实时读值吻合 | +| `stat_month_v3` | 1 月 | 当月 [min, max] | 回溯到 2026-01(联网注册后云端一直记账) | +| `stat_week_v3` | 1 周 | — | 该型号返回 `-8 invalid params`(未开通周档) | +| 回补深度 | — | — | 两台炎米均回溯到接入米家日起(实测到 2026-01-03);缺席日=设备当天无上报 | + +- 青萍闹钟 `cgllc.clock.dove` 与 VRF `proxy.624017060.00001` 全部 data_type 报 `-8 invalid params` + → **云侧未为其开通统计**(青萍与其无历史服务一致)。 +- 证据:`mibridge-research/stats-probe.mjs` / `stats-probe2.json`。 + +因此: + +- **停机缺口可补真值**:对开通统计的型号(炎米等),停机恢复后用 `stat_day_v3` 回填缺日 + [min,max]、`stat_hour_v3` 补小时均值,`origin=vendor_history`(见 §5.3); +- 「精确到某个刻的逐点值」仍不可得(那是设备本地日志,须走局域网 BLE/网关,见 §10); +- 未开通统计的型号(青萍)维持「当天实时采样 + 缺口标注」。 + +## 3. 总体方案 + +- 后端新增 `server/mihome/` 模块,封装与米家的认证 + 采集 + 查询; +- 依赖新增 `@zythum02/mijia-api`(扫码登录、`getDevicesProp`、`DiskCache`), + 认证缓存文件用 `DiskCache` 存于服务端磁盘(`.cache/`),与采集进程同机; +- **每小时**采样 1 次写小时档(`MihomeEnvHour`),**每日 03:00** (Asia/Shanghai) 聚合日档 + (均值/min/max)+ 读一次电量;服务启动时做**追赶同步**(缺小时/缺天则按序补齐), + 停机跨天的历史缺口由 `vendorHistoryFiller` 用 `/v2/user/statistics` 真实回填(有统计的型号); +- 前端 `MonitorPage` 增加 tab,`antd-mobile Collapse`(手风琴)+ `recharts` 趋势图, + 别名用 `Dialog.Prompt` 编辑;每设备卡片标题=别名+电量,展开后 `Segmented` 切换 + **今天(时)/月(天)/年(周)** 三档视图; +- 数据永久保存,小时档按 `(deviceId, hour)`、日档按 `(deviceId, date)` 唯一,天然防重。 + +## 4. 数据模型(Prisma) + +```prisma +// ===== 环境监控:米家 ===== + +// 米家授权状态(DiskCache 存凭证, 本表只存状态/错误供前端展示) +model MihomeAccount { + id Int @id @default(autoincrement()) + key String @unique @default("default") + userId String @default("") + status String @default("unknown") // ok | pending | expired + lastError String @default("") + updatedAt DateTime @updatedAt +} + +model MihomeHome { + id Int @id @default(autoincrement()) + homeId String @unique + name String + createdAt DateTime @default(now()) + devices MihomeDevice[] +} + +model MihomeDevice { + id Int @id @default(autoincrement()) + did String @unique + homeId String + home MihomeHome @relation(fields: [homeId], references: [homeId]) + model String + name String + alias String? // 用户别名, 仅本应用展示 + tempSiid Int + tempPiid Int + humSiid Int + humPiid Int + battSiid Int // 电池电量属性(如炎米3.1003 / 青萍2.3) + battPiid Int + battery Int? // 最近一次电量(每天读一次, 标题展示用) + batteryAt DateTime? // 电量读取时间(当天缓存, 不频繁更新) + enabled Boolean @default(true) + lastSyncAt DateTime? + createdAt DateTime @default(now()) + samples MihomeEnvSample[] + hours MihomeEnvHour[] +} + +model MihomeEnvSample { + id Int @id @default(autoincrement()) + deviceId Int + device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade) + date DateTime // 采样日(Asia/Shanghai 当日 00:00 存 UTC) + temperature Float? // 当日最后一次 live 值(或 vendor hour 均值) + humidity Float? + temperatureAvg Float? // 当日均值(由小时档聚合, 或 vendor_hour) + humidityAvg Float? + temperatureMin Float? // 当日最低 + temperatureMax Float? // 当日最高 + humidityMin Float? + humidityMax Float? + origin String @default("live") // live | vendor_history | backfill + sampledAt DateTime? + raw Json? + createdAt DateTime @default(now()) + + @@unique([deviceId, date]) // 一天一条, 防重 + @@index([deviceId, date]) +} + +model MihomeEnvHour { + id Int @id @default(autoincrement()) + deviceId Int + device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade) + hour DateTime // Asia/Shanghai 整点(存 UTC) + temperatureAvg Float? // 该小时均值(live 采样点聚合, 或 vendor_hour) + humidityAvg Float? + raw Json? + createdAt DateTime @default(now()) + + @@unique([deviceId, hour]) // 一小时一条, 防重 + @@index([deviceId, hour]) +} +``` + +要点: +- 凭证不进库,只在密钥盘(`server/mihome/.cache/`,需加入 `.gitignore`); +- `MihomeHome` / `MihomeDevice` 随每次同步 **upsert**(以米家为准,重扫不漏不错); +- 存储分三档:**小时档**(当天视图,逐小时)、**日档**(月视图,日均/min/max)、 + **年视图按日档现场聚合周桶**(不落库,见 §5.6); +- 电量只存在 `MihomeDevice.battery/batteryAt`,每天读 1 次覆盖当天展示用(需求 11); +- `MihomeEnvSample.origin`: + - `live`——定时采样的真实值(小时档写入,日档由小时聚合); + - `vendor_history`——经 `/v2/user/statistics` 拉回的云端聚合历史(min/max/hour 均值); + - `backfill`——停机恢复后对**当天**的补记(仍用真实值,与 `live` 同字段)。 + +## 5. 后端设计 + +### 5.1 代码结构 + +``` +server/mihome/ + index.js # 模块入口: 初始化 MijiaAPI + DiskCache, 导出 service + auth.js # 认证管理 + 扫码流程(后台 QRlogin 循环 + pendingQr 状态机) + collector.js # 采集器: 每小时采样 / 每日聚合 / 追赶同步 / 电量 / 设备发现 + vendorStats.js # /v2/user/statistics 封装(按型号探测可用性, 提供 hour/day 回填) + history.js # 查询聚合: today(时) / month(天) / year(周) + cache.js # DiskCache 路径与清理 +server/routes/mihome.js # REST 路由 (authRequired) +``` + +### 5.2 认证与「重新授权」 + +- 启动时加载 `DiskCache` 凭证,并用一次真实云请求(`getHomesList`)确认 token 仍有效; + 只有该请求通过才 `status=ok`。 +- 失败(30 天过期 / 风控 / 无凭证)→ `MihomeAccount.status=expired`,前端弹授权横幅 + 扫码窗。 +- 重新授权流程(服务端驱动,前端轮询): + +``` +POST /api/mihome/reauthorize + └─ 若已有流程在跑 => 直接复用(同一张二维码继续有效) + └─ 否则后台启动 QRlogin 循环(每轮 120s 超时自动续二维码, 最多续 2 次) + └─ 立即返回 { running, done, state, qrImageUrl } + +GET /api/mihome/reauthorize/status + └─ 返回 { running, done, state: idle|waiting|failed, qrImageUrl?, lastError? } + └─ done=true 表示扫码成功、凭证已落盘、authCache 已置 ok + +POST /api/mihome/reauthorize/cancel # 人工取消: 只让前端停止轮询, 后台长轮询自然结束 +``` + +- `qrState` 为模块级单例,防并发(同一时间只允许一个扫码流程)。 +- 前端在弹窗内 `setInterval 3s` 轮询,遇 `done=true` 关弹窗并刷新列表;`failed` 则停轮询显示错误。 +- 二维码图片接口在 `authRequired` 之后,`` 带不上 JWT,前端必须 `fetch` 后转 `blob:` URL 显示。 + +### 5.3 采集器 collector + +1. **预检**:`whoami().login` 不为真 → 置 `expired`,本轮跳过(不产生记录)。 +2. **设备发现**:`getDevicesList()` → upsert 家庭/设备;仅保留具备 + `temperature` + `relative-humidity` 属性的型号(经 `getDeviceInfo`/miot-spec 判定, + 当前命中 `ym001.sensor_ht.ymwsdj`、`cgllc.clock.dove` 白名单);记录其 `battSiid/battPiid`。 +3. **小时采样(每小时)**:批量 `getDevicesProp` 读温度+湿度 → upsert + `MihomeEnvHour(deviceId, hour=当前整点)`,写 `temperatureAvg/humidityAvg`(此小时第一个有效点 + 即视为小时值)。每台独立 try/catch: + - 设备离线/超时 → 该小时不写(缺口保持); + - 网络/API 异常 → 整体捕获,本轮不误标,留待下次。 +4. **电量(每天 1 次)**:每日首轮采样顺带读 `battery-level` → 写 + `MihomeDevice.battery/batteryAt`(当天缓存,标题展示用,不频繁更新)。读不到不报错。 +5. **每日聚合(03:00 + 启动追赶)**: upsert `MihomeEnvSample(deviceId, date)`: + - `temperatureAvg/humidityAvg` = 当日各小时均值;`temperatureMin/Max`、 + `humidityMin/Max` = 当日小时 min/max;`temperature/humidity` = 当日最后一次 live 值; + - 当日采样小时数 < 8h 且设备在线的 → 判定硬件故障?**否**:仅当设备整天在线的阈值外仍缺, + 视为设备离线缺档(保持缺口,不伪造)。 +6. **追赶同步(补齐)**:每次轮询/同步结束后检查——对每个设备 + 「缺小时档且采集入口健康」→ 按序补齐小时档;「今天就无样本」→ 立即执行每日聚合。 + 服务启动时触发一轮,实现**停机恢复当天即补**。 +7. **历史补齐(vendorHistoryFiller / vendorStats.js)**:每台设备先探测一次各 data_type + 可用性(实测:炎米 ✅ / 青萍、VRF ❌`-8 invalid params`),仅对可用型号扫描近 45 天缺口: + - 缺小时 → `stat_hour_v3` 回填 `MihomeEnvHour.temperatureAvg/humidityAvg`; + - 缺天 → `stat_day_v3` 回填日档 min/max,再由小时档均值回填 avg; + - 命中即写 `origin=vendor_history`;对「服务端停机跨天」缺口尤其有效。 +8. **缺口标记**:`GET /status` 计算每设备最近 30 天缺样本日期列表(`missingDays`): + 今天缺=待采;历史缺=先尝试 vendor 统计补齐,补不了则标注不可得。 + +> 补数边界(诚实策略):已开通统计的型号(炎米等)停机跨天缺口可用**云端聚合真值**补齐 +> ([min,max]/小时均值,`origin=vendor_history`);未开通的型号(青萍)保持缺口标注、不伪造。 +> 「精确逐点历史」仍不可得,只能走局域网 BLE/网关(§10 可选项 C)。 + +### 5.4 路由表(均在 `/api/mihome`,`authRequired`) + +| 方法 | 路径 | 说明 | +| --- | --- | --- | +| GET | `/status` | 授权状态 + 家庭/设备(含别名、**电量、最新样本**、30 天缺口、统计可用性探测结果);`?force=1` 跳过 5 分钟认证缓存强查一次 | +| GET | `/device/:did/history?range=today` | 当天逐小时(见 §5.6);缺省 `range=today` | +| GET | `/device/:did/history?range=month` | 近 30 天逐日(日均 + min/max) | +| GET | `/device/:did/history?range=year` | 近 52 周逐周(周均值 + min/max,服务端按日档聚合) | +| PUT | `/device/:did` | `{ alias }` 改别名(可清空) | +| POST | `/sync` | 手动触发一次采集(前端「立即同步」) | +| POST | `/reauthorize` | 开始扫码(返回二维码 URL) | +| GET | `/reauthorize/status` | 轮询扫码状态 | +| POST | `/reauthorize/cancel` | 取消扫码 | + +### 5.5 定时任务(并入 `server/cron.js`) + +- `0 * * * *`(Asia/Shanghai):小时采样(温度+湿度,每小时整点 +5min 缓冲)。 +- `5 0,3 * * *`:每日聚合 → `battery` 读取 → vendor 补齐扫描。 +- 兼容表达式:`npm run data:mihome`(手动跑一次采集器)备用。 + +### 5.6 历史查询聚合(history.js) + +| range | 时间窗 | 粒度 | 数据源/算法 | +| --- | --- | --- | --- | +| `today` | 当天 00:00→now | 小时 | `MihomeEnvHour` 当日行;未来小时返回 null | +| `month` | 近 30 天 | 天 | `MihomeEnvSample`:`temperatureAvg/humidityAvg`(折线)+ min/max(区间带) | +| `year` | 近 52 周 | 周 | 按日档**现场聚合**:每周 `avg`(日 avg 均值)、`min`(日 min 最小)、`max`(日 max 最大),不落库 | + +响应统一形如 `[{ t, temperature, temperatureMin, temperatureMax, humidity, humidityMin, humidityMax }]`, +`t` 为桶起始(Asia/Shanghai),缺数据字段为 null。 + +## 6. 前端设计 + +`src/pages/MonitorPage.jsx` 的 `tabs` 增加 `{ key: 'env', label: '环境监控' }`, +对应 `src/pages/monitor/EnvView.jsx`。 + +### EnvView 结构 + +1. **授权横幅**(`status !== ok`): + `米家授权已失效/待授权` + 【重新授权】按钮 → `Popup` 内 `` + 3s 轮询 `/reauthorize/status` → `done=true` 自动关闭并刷新。 + - `status=expired` 且非网络类错误时,进入页面**自动弹出一次**扫码窗(用户关掉后不再重复弹)。 + - 二维码图片接口在 `authRequired` 后面,`` 带不上 JWT,必须用 `fetch` + `Authorization` + 取二进制再转 `blob:` URL(见 `src/api/mihome.js` 的 `fetchMihomeQrImage()`),否则图片 401、弹窗里一片空白。 + - 认证探测不能只看 `api.refreshToken()`:该库在本地凭证字段齐全时直接返回成功而不请求云端, + 所以 `checkAuth()` 必须真打一次 `getHomesList()` 才能发现 30 天 token 过期。 +2. **顶部操作**:`立即同步`(POST `/sync`)。 +3. **家庭列表**:`antd-mobile ` 按家庭分组;组展开后显示该家庭 + 下的**环境设备卡片**;无环境设备的家庭 → 折叠标题旁标「无环境设备」占位。 +4. **设备卡片**(不可折叠,点击进入详情/趋势): + - 标题:**别名(无别名则原名)+ 电量**(如 `卧室 78%`,电量用 `battery` 当天缓存值, + 不频繁请求);附带编辑别名按钮(`Dialog.Prompt` → `PUT`); + - 概览:`温度 28.1℃ · 湿度 71%`(最新样本)+ 「缺 N 天」暗红角标; + - 图表区:`Segmented`(antd-mobile) 切换 **今天/月/年**,默认**今天**; + `recharts LineChart` 双线(温度/湿度)+ 可选 min/max 区间带(`Area` band): + - `今天` → X 轴逐小时(00:00→当前),数据 `/device/:did/history?range=today`; + - `月` → X 轴逐日(近 30 天),数据 `?range=month`(日均折线 + 日 min/max 影带); + - `年` → X 轴逐周(近 52 周),数据 `?range=year`(周均值折线 + 周 min/max 影带); + - 视图切换/拉数据留在卡片内部(不用全局 tab),逻辑沿用现有 `ServerDetail.jsx` / + `DataView.jsx` 图表写法。 +5. 样式复用 `globals.css` 的 `.card`/`.monitor-*` 体系,新增少量 collapse 样式。 + +> 手风琴用 `Collapse accordion`;「不同时打开」即一次仅一个家庭展开。 + +## 7. 迁移与部署 + +1. `npm i @zythum02/mijia-api`(加入 dependencies)。 +2. `schema.prisma` 追加 5 个模型 → `npx prisma migrate dev --name add_mihome_env`。 +3. `.env` 可选 `MIHOME_CACHE_DIR`(默认 `server/mihome/.cache`); + 服务端放 `.cache/` 于 `.gitignore`。 +4. 首次部署:在服务器上人工跑一次扫码授权(`npm run data:mihome` 的初始化提示 + 会输出二维码),写入服务器本地的 `.cache/`。 +5. 数据库迁移走现有 `prisma migrate deploy` 流程。 + +## 8. 风险与开放问题 + +| # | 风险/问题 | 应对 | +| --- | --- | --- | +| 1 | **逐点历史不可读**(设备本地日志),停机期要精确到刻的值补不上 | 已找到云端聚合通道(`/v2/user/statistics`,min/max/时均值,实测可行);按模型开通情况补齐(炎米 ✅ / 青萍 ❌);精确逐点 → 可选 §10 C | +| 2 | token 30 天过期需人工扫码 | 需求 4 的重新授权流程已覆盖;扫码流程 120s 超时自动换码 | +| 3 | 采样时刻固定凌晨,代表性一般 | 已改**每小时采样**,当天小时视图/日均/周均代表性充分;03:00 仅做日档聚合 | +| 4 | 第三方 `@zythum02` 库上游变动 | 锁定版本;模块边界隔离,只暴露我们自己需要的函数 | +| 5 | VRF/其他设备写入延迟 5~6s | 仅影响将来的控制功能,本模块只读,无影响 | + +## 9. 实施步骤(里程碑) + +- **M1 后端地基**:依赖 + Prisma 迁移(5 模型)+ `server/mihome` + (认证 + collector 小时采样/每日聚合/电量 + vendorStats 补齐 + history.js 三段聚合 + 路由)+ cron。 +- **M2 前端**:`EnvView`(授权弹窗 / 手风琴家庭组 / 设备卡=别名+电量 / + 别名编辑 / Segmented 今天·月·年视图与图表 / 缺口角标)。 +- **M3 联调**:真机/Web 端到端 —— 小时采样与日聚合、停机恢复追赶与 vendor 补齐、 + 扫码重授权、别名、电量、三个粒度的图表与缺口展示。 +- **M4(可选,已基本闭环)**:`/v2/user/statistics` 云端聚合历史通道已实测打通, + 直接并入 M1 的 `vendorHistoryFiller`(无需再抓包 App)。 +- **M5(可选)**:可选项 C 家侧本地采样代理(见 §10),用于「精确逐点」与分钟级采样。 + +## 10. 可选项 C:家侧本地采样代理 + 缓冲补数 + +> 背景:主线「云 API 每日采样」的停机跨天缺口现可由云端聚合统计(§2.2B)补齐到 [min,max]/小时 +> 粒度;可选项 C 是把它做到**精确逐点 / 分钟级**——家侧一个常驻采集进程(可选配合小米中枢网关), +> 本地连续采样并缓冲,服务端恢复后拉真值回填。 +> 与主线**并行可选**,不影响 §1~§9 落地;仅在追求细粒度历史时投入。 + +### 10.1 事实依据(已调研) + +| 事实 | 结论 | +| --- | --- | +| 家庭现有网关 | 无中枢/多模网关;`blt.*` 设备挂在「小爱音箱 Play 增强版」上转发,该音箱**不开放局域网 API** | +| 局域网直连设备本身 | 需本地 BLE 适配器;青萍闹钟(CGD1)协议已逆向但**仅有实时/设置**、无历史通道;炎米 ym001 **零社区支持**,需自行逆向厂商 GATT + 推导 MiKey,把握低 | +| 若有小米中枢网关 | 官方 HA 集成走网关**内置本地 MQTT Broker**,可本地化 WiFi+BLE 设备、断外网可用、延迟 10~50ms(社区实测 `ha_xiaomi_home`);但本地 Broker **只推实时 props,不提供历史** | +| 概率评估 | 本地实时读取:无网关走蓝牙 ~60~85%(青萍高/炎米中);加中枢网关 ~85%。补停机期历史:三条局域网路线均**不直接提供**,只能靠「本地连续采样 + 缓冲」自建 | + +### 10.2 方案 + +``` +家庭内常驻小机(现有 Windows 机 / 树莓派) 跑 server/mihome-agent/ + ├─ 采样源(可切换): a) 云 getDevicesProp (同 §5.3, 无需新硬件) + │ b) 加中枢网关后走本地 MQTT(断外网可用, 秒级粒度) + │ c) 未来本地 BLE 嗅探(青萍 CGD1 优先) + ├─ 每 N 分钟采样 → 写本地缓冲 SQLite/JSONL(本地保留 180 天) + └─ 提供 GET /samples?from&to&did 供服务端拉取 +服务端(iboard) + └─ 停机恢复/每日同步时: 调 agent 拉缺口区间真实值 → 写 MihomeEnvSample(origin=backfill) + (服务端主动拉 agent,agent 无需入公网,可用内网/隧道) +``` + +### 10.3 效果与代价 + +- **效果**:停机期 agent 缓冲持续采样,恢复后以**精确逐点/分钟级**真值回填(粒度高于 §2.2B 的 + 聚合统计);加中枢网关后数据链路断外网可用、秒级推送。 +- **代价**:家中常驻进程(可复用现有 Windows 开发机);可选购买中枢网关(~¥349); + agent 与服务端的传输通道需内网/VPN/隧道。 +- **决策点**:是否投入属产品决策。当前「补齐停机缺口」已被 §2.2B 的云端统计覆盖(满足 + 「数据不比米家少」);C 只对「要更细粒度」有增量价值。接入点:agent 值写入 + `MihomeEnvSample`,`origin=backfill`。 +- **本地直连协议现状**(中枢/蓝牙):官方 HA 集成走中枢内置 MQTT Broker(需 HA 或移植其 + `MipsLocalClient` 的证书鉴权+微链路,无公开协议,自有 Node agent 直连把握中低);纯 BLE + 嗅探见 §10.1 表格(青萍 CGD1 有逆向基础、炎米零资料)。 \ No newline at end of file diff --git a/generated/prisma/browser.ts b/generated/prisma/browser.ts index 209e28b..2b1f0eb 100644 --- a/generated/prisma/browser.ts +++ b/generated/prisma/browser.ts @@ -82,3 +82,28 @@ export type ScraperCache = Prisma.ScraperCacheModel * */ export type OilPriceHistory = Prisma.OilPriceHistoryModel +/** + * Model MihomeAccount + * + */ +export type MihomeAccount = Prisma.MihomeAccountModel +/** + * Model MihomeHome + * + */ +export type MihomeHome = Prisma.MihomeHomeModel +/** + * Model MihomeDevice + * + */ +export type MihomeDevice = Prisma.MihomeDeviceModel +/** + * Model MihomeEnvSample + * + */ +export type MihomeEnvSample = Prisma.MihomeEnvSampleModel +/** + * Model MihomeEnvHour + * + */ +export type MihomeEnvHour = Prisma.MihomeEnvHourModel diff --git a/generated/prisma/client.ts b/generated/prisma/client.ts index 3e172a1..5eb90db 100644 --- a/generated/prisma/client.ts +++ b/generated/prisma/client.ts @@ -106,3 +106,28 @@ export type ScraperCache = Prisma.ScraperCacheModel * */ export type OilPriceHistory = Prisma.OilPriceHistoryModel +/** + * Model MihomeAccount + * + */ +export type MihomeAccount = Prisma.MihomeAccountModel +/** + * Model MihomeHome + * + */ +export type MihomeHome = Prisma.MihomeHomeModel +/** + * Model MihomeDevice + * + */ +export type MihomeDevice = Prisma.MihomeDeviceModel +/** + * Model MihomeEnvSample + * + */ +export type MihomeEnvSample = Prisma.MihomeEnvSampleModel +/** + * Model MihomeEnvHour + * + */ +export type MihomeEnvHour = Prisma.MihomeEnvHourModel diff --git a/generated/prisma/commonInputTypes.ts b/generated/prisma/commonInputTypes.ts index 8eadb9c..d0d5081 100644 --- a/generated/prisma/commonInputTypes.ts +++ b/generated/prisma/commonInputTypes.ts @@ -306,6 +306,85 @@ export type JsonNullableWithAggregatesFilterBase<$PrismaModel = never> = { _max?: Prisma.NestedJsonNullableFilter<$PrismaModel> } +export type IntNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null +} + +export type DateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null +} + +export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedIntNullableFilter<$PrismaModel> + _max?: Prisma.NestedIntNullableFilter<$PrismaModel> +} + +export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> +} + +export type FloatNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null +} + +export type FloatNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _min?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _max?: Prisma.NestedFloatNullableFilter<$PrismaModel> +} + export type NestedIntFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> in?: number[] @@ -550,4 +629,72 @@ export type NestedJsonNullableFilterBase<$PrismaModel = never> = { not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter } +export type NestedDateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null +} + +export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedIntNullableFilter<$PrismaModel> + _max?: Prisma.NestedIntNullableFilter<$PrismaModel> +} + +export type NestedFloatNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null +} + +export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> +} + +export type NestedFloatNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | null + notIn?: number[] | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _min?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _max?: Prisma.NestedFloatNullableFilter<$PrismaModel> +} + diff --git a/generated/prisma/internal/class.ts b/generated/prisma/internal/class.ts index 41977bd..9d85193 100644 --- a/generated/prisma/internal/class.ts +++ b/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.7.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", "activeProvider": "mysql", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '98' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"date\",\"province\",\"fuel\",\"price\",\"source\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"updatedAt\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"month\",\"inventory\",\"name\",\"url\",\"status\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"period\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"title\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"every\",\"some\",\"none\",\"indicatorId_period\",\"description\",\"slug\",\"email\",\"password\",\"is\",\"isNot\",\"_relevance\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "3gNqtgEJxAEAAPACADDFAQAABAAQxgEAAPACADDHAQIAAAABzQFAAL0CACHfAUAAvQIAIegBAQC-AgAhoQIBAAAAAaICAQC-AgAhAQAAAAEAIAEAAAABACAJxAEAAPACADDFAQAABAAQxgEAAPACADDHAQIAvAIAIc0BQAC9AgAh3wFAAL0CACHoAQEAvgIAIaECAQC-AgAhogIBAL4CACEBpQIAANgDACADAAAABAAgAwAABQAwBAAAAQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACAGxwECAAAAAc0BQAAAAAHfAUAAAAAB6AEBAAAAAaECAQAAAAGiAgEAAAABAQgAAAkAIAbHAQIAAAABzQFAAAAAAd8BQAAAAAHoAQEAAAABoQIBAAAAAaICAQAAAAEBCAAACwAwBscBAgD5AgAhzQFAAPYCACHfAUAA9gIAIegBAQD3AgAhoQIBAPcCACGiAgEA9wIAIQIAAAABACAIAAANACAGxwECAPkCACHNAUAA9gIAId8BQAD2AgAh6AEBAPcCACGhAgEA9wIAIaICAQD3AgAhAgAAAAQAIAgAAA8AIAMAAAABACANAAAJACAOAAANACABAAAAAQAgAQAAAAQAIAUTAADTAwAgFAAA1AMAIBUAANcDACAWAADWAwAgFwAA1QMAIAnEAQAA7wIAMMUBAAAVABDGAQAA7wIAMMcBAgCvAgAhzQFAALACACHfAUAAsAIAIegBAQCxAgAhoQIBALECACGiAgEAsQIAIQMAAAAEACADAAAUADASAAAVACADAAAABAAgAwAABQAwBAAAAQAgCsQBAADuAgAwxQEAABsAEMYBAADuAgAwxwECAAAAAcgBAQC-AgAhzQFAAL0CACHfAUAAvQIAIY8CAQC-AgAhkQIBAL4CACGgAgEAAAABAQAAABgAIAEAAAAYACAKxAEAAO4CADDFAQAAGwAQxgEAAO4CADDHAQIAvAIAIcgBAQC-AgAhzQFAAL0CACHfAUAAvQIAIY8CAQC-AgAhkQIBAL4CACGgAgEAvgIAIQGlAgAA0gMAIAMAAAAbACADAAAcADAEAAAYACADAAAAGwAgAwAAHAAwBAAAGAAgAwAAABsAIAMAABwAMAQAABgAIAfHAQIAAAAByAEBAAAAAc0BQAAAAAHfAUAAAAABjwIBAAAAAZECAQAAAAGgAgEAAAABAQgAACAAIAfHAQIAAAAByAEBAAAAAc0BQAAAAAHfAUAAAAABjwIBAAAAAZECAQAAAAGgAgEAAAABAQgAACIAMAfHAQIA-QIAIcgBAQD3AgAhzQFAAPYCACHfAUAA9gIAIY8CAQD3AgAhkQIBAPcCACGgAgEA9wIAIQIAAAAYACAIAAAkACAHxwECAPkCACHIAQEA9wIAIc0BQAD2AgAh3wFAAPYCACGPAgEA9wIAIZECAQD3AgAhoAIBAPcCACECAAAAGwAgCAAAJgAgAwAAABgAIA0AACAAIA4AACQAIAEAAAAYACABAAAAGwAgBRMAAM0DACAUAADOAwAgFQAA0QMAIBYAANADACAXAADPAwAgCsQBAADtAgAwxQEAACwAEMYBAADtAgAwxwECAK8CACHIAQEAsQIAIc0BQACwAgAh3wFAALACACGPAgEAsQIAIZECAQCxAgAhoAIBALECACEDAAAAGwAgAwAAKwAwEgAALAAgAwAAABsAIAMAABwAMAQAABgAIAkIAADsAgAgxAEAAOsCADDFAQAAMgAQxgEAAOsCADDHAQIAAAABzQFAAL0CACHfAUAAvQIAIegBAQC-AgAhnwIBAL4CACEBAAAALwAgAQAAAC8AIAkIAADsAgAgxAEAAOsCADDFAQAAMgAQxgEAAOsCADDHAQIAvAIAIc0BQAC9AgAh3wFAAL0CACHoAQEAvgIAIZ8CAQC-AgAhAaUCAADMAwAgAwAAADIAIAMAADMAMAQAAC8AIAMAAAAyACADAAAzADAEAAAvACADAAAAMgAgAwAAMwAwBAAALwAgBgiAAAAAAccBAgAAAAHNAUAAAAAB3wFAAAAAAegBAQAAAAGfAgEAAAABAQgAADcAIAYIgAAAAAHHAQIAAAABzQFAAAAAAd8BQAAAAAHoAQEAAAABnwIBAAAAAQEIAAA5ADAGCIAAAAABxwECAPkCACHNAUAA9gIAId8BQAD2AgAh6AEBAPcCACGfAgEA9wIAIQIAAAAvACAIAAA7ACAGCIAAAAABxwECAPkCACHNAUAA9gIAId8BQAD2AgAh6AEBAPcCACGfAgEA9wIAIQIAAAAyACAIAAA9ACADAAAALwAgDQAANwAgDgAAOwAgAQAAAC8AIAEAAAAyACAFEwAAxwMAIBQAAMgDACAVAADLAwAgFgAAygMAIBcAAMkDACAJCAAA6QIAIMQBAADoAgAwxQEAAEMAEMYBAADoAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh6AEBALECACGfAgEAsQIAIQMAAAAyACADAABCADASAABDACADAAAAMgAgAwAAMwAwBAAALwAgDjcAAOQCACDEAQAA4gIAMMUBAABOABDGAQAA4gIAMMcBAgAAAAHMAQEAvgIAIc0BQAC9AgAh3wFAAL0CACHoAQEAAAABjwIBAL4CACGXAgEAvgIAIZgCAQC-AgAhmQIBAL4CACGaAiAA4wIAIQEAAABGACAKNgAA5wIAIMQBAADmAgAwxQEAAEgAEMYBAADmAgAwxwECALwCACHNAUAAvQIAId8BQAC9AgAh7wEBAL4CACGVAgIAvAIAIZYCCAC_AgAhAjYAAMUDACClAgAAxgMAIAs2AADnAgAgxAEAAOYCADDFAQAASAAQxgEAAOYCADDHAQIAAAABzQFAAL0CACHfAUAAvQIAIe8BAQC-AgAhlQICALwCACGWAggAvwIAIZ4CAADlAgAgAwAAAEgAIAMAAEkAMAQAAEoAIAEAAABIACABAAAARgAgDjcAAOQCACDEAQAA4gIAMMUBAABOABDGAQAA4gIAMMcBAgC8AgAhzAEBAL4CACHNAUAAvQIAId8BQAC9AgAh6AEBAL4CACGPAgEAvgIAIZcCAQC-AgAhmAIBAL4CACGZAgEAvgIAIZoCIADjAgAhAjcAAMMDACClAgAAxAMAIAMAAABOACADAABPADAEAABGACADAAAATgAgAwAATwAwBAAARgAgAwAAAE4AIAMAAE8AMAQAAEYAIAs3AADCAwAgxwECAAAAAcwBAQAAAAHNAUAAAAAB3wFAAAAAAegBAQAAAAGPAgEAAAABlwIBAAAAAZgCAQAAAAGZAgEAAAABmgIgAAAAAQEIAABTACAKxwECAAAAAcwBAQAAAAHNAUAAAAAB3wFAAAAAAegBAQAAAAGPAgEAAAABlwIBAAAAAZgCAQAAAAGZAgEAAAABmgIgAAAAAQEIAABVADALNwAAtQMAIMcBAgD5AgAhzAEBAPcCACHNAUAA9gIAId8BQAD2AgAh6AEBAPcCACGPAgEA9wIAIZcCAQD3AgAhmAIBAPcCACGZAgEA9wIAIZoCIAC0AwAhAgAAAEYAIAgAAFcAIArHAQIA-QIAIcwBAQD3AgAhzQFAAPYCACHfAUAA9gIAIegBAQD3AgAhjwIBAPcCACGXAgEA9wIAIZgCAQD3AgAhmQIBAPcCACGaAiAAtAMAIQIAAABOACAIAABZACADAAAARgAgDQAAUwAgDgAAVwAgAQAAAEYAIAEAAABOACAFEwAArwMAIBQAALADACAVAACzAwAgFgAAsgMAIBcAALEDACANxAEAAN4CADDFAQAAXwAQxgEAAN4CADDHAQIArwIAIcwBAQCxAgAhzQFAALACACHfAUAAsAIAIegBAQCxAgAhjwIBALECACGXAgEAsQIAIZgCAQCxAgAhmQIBALECACGaAiAA3wIAIQMAAABOACADAABeADASAABfACADAAAATgAgAwAATwAwBAAARgAgAQAAAEoAIAEAAABKACADAAAASAAgAwAASQAwBAAASgAgAwAAAEgAIAMAAEkAMAQAAEoAIAMAAABIACADAABJADAEAABKACAHNgAArgMAIMcBAgAAAAHNAUAAAAAB3wFAAAAAAe8BAQAAAAGVAgIAAAABlgIIAAAAAQEIAABnACAGxwECAAAAAc0BQAAAAAHfAUAAAAAB7wEBAAAAAZUCAgAAAAGWAggAAAABAQgAAGkAMAc2AACtAwAgxwECAPkCACHNAUAA9gIAId8BQAD2AgAh7wEBAPcCACGVAgIA-QIAIZYCCAD4AgAhAgAAAEoAIAgAAGsAIAbHAQIA-QIAIc0BQAD2AgAh3wFAAPYCACHvAQEA9wIAIZUCAgD5AgAhlgIIAPgCACECAAAASAAgCAAAbQAgAwAAAEoAIA0AAGcAIA4AAGsAIAEAAABKACABAAAASAAgBRMAAKgDACAUAACpAwAgFQAArAMAIBYAAKsDACAXAACqAwAgCcQBAADdAgAwxQEAAHMAEMYBAADdAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh7wEBALECACGVAgIArwIAIZYCCACyAgAhAwAAAEgAIAMAAHIAMBIAAHMAIAMAAABIACADAABJADAEAABKACANxAEAANsCADDFAQAAeQAQxgEAANsCADDHAQIAAAABzAEBAL4CACHNAUAAvQIAIekBAQC-AgAhjwIBAL4CACGQAgEAvgIAIZECAQDJAgAhkgJAAL0CACGTAgIAvAIAIZQCAADcAgAgAQAAAHYAIAEAAAB2ACAMxAEAANsCADDFAQAAeQAQxgEAANsCADDHAQIAvAIAIcwBAQC-AgAhzQFAAL0CACHpAQEAvgIAIY8CAQC-AgAhkAIBAL4CACGRAgEAyQIAIZICQAC9AgAhkwICALwCACECkQIAAPsCACClAgAApwMAIAMAAAB5ACADAAB6ADAEAAB2ACADAAAAeQAgAwAAegAwBAAAdgAgAwAAAHkAIAMAAHoAMAQAAHYAIAnHAQIAAAABzAEBAAAAAc0BQAAAAAHpAQEAAAABjwIBAAAAAZACAQAAAAGRAgEAAAABkgJAAAAAAZMCAgAAAAEBCAAAfgAgCccBAgAAAAHMAQEAAAABzQFAAAAAAekBAQAAAAGPAgEAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABkwICAAAAAQEIAACAAQAwCccBAgD5AgAhzAEBAPcCACHNAUAA9gIAIekBAQD3AgAhjwIBAPcCACGQAgEA9wIAIZECAQCBAwAhkgJAAPYCACGTAgIA-QIAIQIAAAB2ACAIAACCAQAgCccBAgD5AgAhzAEBAPcCACHNAUAA9gIAIekBAQD3AgAhjwIBAPcCACGQAgEA9wIAIZECAQCBAwAhkgJAAPYCACGTAgIA-QIAIQIAAAB5ACAIAACEAQAgAwAAAHYAIA0AAH4AIA4AAIIBACABAAAAdgAgAQAAAHkAIAYTAACiAwAgFAAAowMAIBUAAKYDACAWAAClAwAgFwAApAMAIJECAAD7AgAgDMQBAADaAgAwxQEAAIoBABDGAQAA2gIAMMcBAgCvAgAhzAEBALECACHNAUAAsAIAIekBAQCxAgAhjwIBALECACGQAgEAsQIAIZECAQDCAgAhkgJAALACACGTAgIArwIAIQMAAAB5ACADAACJAQAwEgAAigEAIAMAAAB5ACADAAB6ADAEAAB2ACANxAEAANkCADDFAQAAkAEAEMYBAADZAgAwxwECAAAAAc0BQAC9AgAh7wEBAL4CACGIAgEAvgIAIYkCCAC_AgAhigIIAL8CACGLAgEAvgIAIYwCAQC-AgAhjQIIAL8CACGOAggAvwIAIQEAAACNAQAgAQAAAI0BACANxAEAANkCADDFAQAAkAEAEMYBAADZAgAwxwECALwCACHNAUAAvQIAIe8BAQC-AgAhiAIBAL4CACGJAggAvwIAIYoCCAC_AgAhiwIBAL4CACGMAgEAvgIAIY0CCAC_AgAhjgIIAL8CACEBpQIAAKEDACADAAAAkAEAIAMAAJEBADAEAACNAQAgAwAAAJABACADAACRAQAwBAAAjQEAIAMAAACQAQAgAwAAkQEAMAQAAI0BACAKxwECAAAAAc0BQAAAAAHvAQEAAAABiAIBAAAAAYkCCAAAAAGKAggAAAABiwIBAAAAAYwCAQAAAAGNAggAAAABjgIIAAAAAQEIAACVAQAgCscBAgAAAAHNAUAAAAAB7wEBAAAAAYgCAQAAAAGJAggAAAABigIIAAAAAYsCAQAAAAGMAgEAAAABjQIIAAAAAY4CCAAAAAEBCAAAlwEAMArHAQIA-QIAIc0BQAD2AgAh7wEBAPcCACGIAgEA9wIAIYkCCAD4AgAhigIIAPgCACGLAgEA9wIAIYwCAQD3AgAhjQIIAPgCACGOAggA-AIAIQIAAACNAQAgCAAAmQEAIArHAQIA-QIAIc0BQAD2AgAh7wEBAPcCACGIAgEA9wIAIYkCCAD4AgAhigIIAPgCACGLAgEA9wIAIYwCAQD3AgAhjQIIAPgCACGOAggA-AIAIQIAAACQAQAgCAAAmwEAIAMAAACNAQAgDQAAlQEAIA4AAJkBACABAAAAjQEAIAEAAACQAQAgBRMAAJwDACAUAACdAwAgFQAAoAMAIBYAAJ8DACAXAACeAwAgDcQBAADYAgAwxQEAAKEBABDGAQAA2AIAMMcBAgCvAgAhzQFAALACACHvAQEAsQIAIYgCAQCxAgAhiQIIALICACGKAggAsgIAIYsCAQCxAgAhjAIBALECACGNAggAsgIAIY4CCACyAgAhAwAAAJABACADAACgAQAwEgAAoQEAIAMAAACQAQAgAwAAkQEAMAQAAI0BACAcxAEAANcCADDFAQAApwEAEMYBAADXAgAwxwECAAAAAc0BQAC9AgAh3wFAAL0CACHoAQEAvgIAIeoBAQC-AgAh7gEBAAAAAfQBBADUAgAh9QEEANQCACH2AQIAvAIAIfcBAgC8AgAh-QEBAL4CACH6AQEAvgIAIfsBAQC-AgAh_AEEANQCACH9AQQA1AIAIf4BAgC8AgAh_wEIAL8CACGAAgQA1AIAIYECBADUAgAhggIIAL8CACGDAggAvwIAIYQCCAC_AgAhhQIEANQCACGGAgQA1AIAIYcCQAC9AgAhAQAAAKQBACABAAAApAEAIBzEAQAA1wIAMMUBAACnAQAQxgEAANcCADDHAQIAvAIAIc0BQAC9AgAh3wFAAL0CACHoAQEAvgIAIeoBAQC-AgAh7gEBAL4CACH0AQQA1AIAIfUBBADUAgAh9gECALwCACH3AQIAvAIAIfkBAQC-AgAh-gEBAL4CACH7AQEAvgIAIfwBBADUAgAh_QEEANQCACH-AQIAvAIAIf8BCAC_AgAhgAIEANQCACGBAgQA1AIAIYICCAC_AgAhgwIIAL8CACGEAggAvwIAIYUCBADUAgAhhgIEANQCACGHAkAAvQIAIQGlAgAAmwMAIAMAAACnAQAgAwAAqAEAMAQAAKQBACADAAAApwEAIAMAAKgBADAEAACkAQAgAwAAAKcBACADAACoAQAwBAAApAEAIBnHAQIAAAABzQFAAAAAAd8BQAAAAAHoAQEAAAAB6gEBAAAAAe4BAQAAAAH0AQQAAAAB9QEEAAAAAfYBAgAAAAH3AQIAAAAB-QEBAAAAAfoBAQAAAAH7AQEAAAAB_AEEAAAAAf0BBAAAAAH-AQIAAAAB_wEIAAAAAYACBAAAAAGBAgQAAAABggIIAAAAAYMCCAAAAAGEAggAAAABhQIEAAAAAYYCBAAAAAGHAkAAAAABAQgAAKwBACAZxwECAAAAAc0BQAAAAAHfAUAAAAAB6AEBAAAAAeoBAQAAAAHuAQEAAAAB9AEEAAAAAfUBBAAAAAH2AQIAAAAB9wECAAAAAfkBAQAAAAH6AQEAAAAB-wEBAAAAAfwBBAAAAAH9AQQAAAAB_gECAAAAAf8BCAAAAAGAAgQAAAABgQIEAAAAAYICCAAAAAGDAggAAAABhAIIAAAAAYUCBAAAAAGGAgQAAAABhwJAAAAAAQEIAACuAQAwGccBAgD5AgAhzQFAAPYCACHfAUAA9gIAIegBAQD3AgAh6gEBAPcCACHuAQEA9wIAIfQBBACUAwAh9QEEAJQDACH2AQIA-QIAIfcBAgD5AgAh-QEBAPcCACH6AQEA9wIAIfsBAQD3AgAh_AEEAJQDACH9AQQAlAMAIf4BAgD5AgAh_wEIAPgCACGAAgQAlAMAIYECBACUAwAhggIIAPgCACGDAggA-AIAIYQCCAD4AgAhhQIEAJQDACGGAgQAlAMAIYcCQAD2AgAhAgAAAKQBACAIAACwAQAgGccBAgD5AgAhzQFAAPYCACHfAUAA9gIAIegBAQD3AgAh6gEBAPcCACHuAQEA9wIAIfQBBACUAwAh9QEEAJQDACH2AQIA-QIAIfcBAgD5AgAh-QEBAPcCACH6AQEA9wIAIfsBAQD3AgAh_AEEAJQDACH9AQQAlAMAIf4BAgD5AgAh_wEIAPgCACGAAgQAlAMAIYECBACUAwAhggIIAPgCACGDAggA-AIAIYQCCAD4AgAhhQIEAJQDACGGAgQAlAMAIYcCQAD2AgAhAgAAAKcBACAIAACyAQAgAwAAAKQBACANAACsAQAgDgAAsAEAIAEAAACkAQAgAQAAAKcBACAFEwAAlgMAIBQAAJcDACAVAACaAwAgFgAAmQMAIBcAAJgDACAcxAEAANYCADDFAQAAuAEAEMYBAADWAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh6AEBALECACHqAQEAsQIAIe4BAQCxAgAh9AEEANACACH1AQQA0AIAIfYBAgCvAgAh9wECAK8CACH5AQEAsQIAIfoBAQCxAgAh-wEBALECACH8AQQA0AIAIf0BBADQAgAh_gECAK8CACH_AQgAsgIAIYACBADQAgAhgQIEANACACGCAggAsgIAIYMCCACyAgAhhAIIALICACGFAgQA0AIAIYYCBADQAgAhhwJAALACACEDAAAApwEAIAMAALcBADASAAC4AQAgAwAAAKcBACADAACoAQAwBAAApAEAIBDEAQAA0wIAMMUBAAC-AQAQxgEAANMCADDHAQIAAAABzQFAAL0CACHuAQEAvgIAIe8BQAC9AgAh8AEIAL8CACHxAQQA1AIAIfIBCAC_AgAh8wEEANQCACH0AQQA1AIAIfUBBADUAgAh9gECALwCACH3AQIAvAIAIfgBAADVAgAgAQAAALsBACABAAAAuwEAIA_EAQAA0wIAMMUBAAC-AQAQxgEAANMCADDHAQIAvAIAIc0BQAC9AgAh7gEBAL4CACHvAUAAvQIAIfABCAC_AgAh8QEEANQCACHyAQgAvwIAIfMBBADUAgAh9AEEANQCACH1AQQA1AIAIfYBAgC8AgAh9wECALwCACEBpQIAAJUDACADAAAAvgEAIAMAAL8BADAEAAC7AQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAMAAAC-AQAgAwAAvwEAMAQAALsBACAMxwECAAAAAc0BQAAAAAHuAQEAAAAB7wFAAAAAAfABCAAAAAHxAQQAAAAB8gEIAAAAAfMBBAAAAAH0AQQAAAAB9QEEAAAAAfYBAgAAAAH3AQIAAAABAQgAAMMBACAMxwECAAAAAc0BQAAAAAHuAQEAAAAB7wFAAAAAAfABCAAAAAHxAQQAAAAB8gEIAAAAAfMBBAAAAAH0AQQAAAAB9QEEAAAAAfYBAgAAAAH3AQIAAAABAQgAAMUBADAMxwECAPkCACHNAUAA9gIAIe4BAQD3AgAh7wFAAPYCACHwAQgA-AIAIfEBBACUAwAh8gEIAPgCACHzAQQAlAMAIfQBBACUAwAh9QEEAJQDACH2AQIA-QIAIfcBAgD5AgAhAgAAALsBACAIAADHAQAgDMcBAgD5AgAhzQFAAPYCACHuAQEA9wIAIe8BQAD2AgAh8AEIAPgCACHxAQQAlAMAIfIBCAD4AgAh8wEEAJQDACH0AQQAlAMAIfUBBACUAwAh9gECAPkCACH3AQIA-QIAIQIAAAC-AQAgCAAAyQEAIAMAAAC7AQAgDQAAwwEAIA4AAMcBACABAAAAuwEAIAEAAAC-AQAgBRMAAI8DACAUAACQAwAgFQAAkwMAIBYAAJIDACAXAACRAwAgD8QBAADPAgAwxQEAAM8BABDGAQAAzwIAMMcBAgCvAgAhzQFAALACACHuAQEAsQIAIe8BQACwAgAh8AEIALICACHxAQQA0AIAIfIBCACyAgAh8wEEANACACH0AQQA0AIAIfUBBADQAgAh9gECAK8CACH3AQIArwIAIQMAAAC-AQAgAwAAzgEAMBIAAM8BACADAAAAvgEAIAMAAL8BADAEAAC7AQAgDMQBAADOAgAwxQEAANUBABDGAQAAzgIAMMcBAgAAAAHNAUAAvQIAId8BQAC9AgAh6AEBAAAAAekBAQC-AgAh6gEBAL4CACHrAQIAvAIAIewBAQC-AgAh7QFAAL0CACEBAAAA0gEAIAEAAADSAQAgDMQBAADOAgAwxQEAANUBABDGAQAAzgIAMMcBAgC8AgAhzQFAAL0CACHfAUAAvQIAIegBAQC-AgAh6QEBAL4CACHqAQEAvgIAIesBAgC8AgAh7AEBAL4CACHtAUAAvQIAIQGlAgAAjgMAIAMAAADVAQAgAwAA1gEAMAQAANIBACADAAAA1QEAIAMAANYBADAEAADSAQAgAwAAANUBACADAADWAQAwBAAA0gEAIAnHAQIAAAABzQFAAAAAAd8BQAAAAAHoAQEAAAAB6QEBAAAAAeoBAQAAAAHrAQIAAAAB7AEBAAAAAe0BQAAAAAEBCAAA2gEAIAnHAQIAAAABzQFAAAAAAd8BQAAAAAHoAQEAAAAB6QEBAAAAAeoBAQAAAAHrAQIAAAAB7AEBAAAAAe0BQAAAAAEBCAAA3AEAMAnHAQIA-QIAIc0BQAD2AgAh3wFAAPYCACHoAQEA9wIAIekBAQD3AgAh6gEBAPcCACHrAQIA-QIAIewBAQD3AgAh7QFAAPYCACECAAAA0gEAIAgAAN4BACAJxwECAPkCACHNAUAA9gIAId8BQAD2AgAh6AEBAPcCACHpAQEA9wIAIeoBAQD3AgAh6wECAPkCACHsAQEA9wIAIe0BQAD2AgAhAgAAANUBACAIAADgAQAgAwAAANIBACANAADaAQAgDgAA3gEAIAEAAADSAQAgAQAAANUBACAFEwAAiQMAIBQAAIoDACAVAACNAwAgFgAAjAMAIBcAAIsDACAMxAEAAM0CADDFAQAA5gEAEMYBAADNAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh6AEBALECACHpAQEAsQIAIeoBAQCxAgAh6wECAK8CACHsAQEAsQIAIe0BQACwAgAhAwAAANUBACADAADlAQAwEgAA5gEAIAMAAADVAQAgAwAA1gEAMAQAANIBACAIxAEAAMwCADDFAQAA7AEAEMYBAADMAgAwxwECAAAAAc0BQAC9AgAh3wFAAL0CACHmAQEAAAAB5wECALwCACEBAAAA6QEAIAEAAADpAQAgCMQBAADMAgAwxQEAAOwBABDGAQAAzAIAMMcBAgC8AgAhzQFAAL0CACHfAUAAvQIAIeYBAQC-AgAh5wECALwCACEBpQIAAIgDACADAAAA7AEAIAMAAO0BADAEAADpAQAgAwAAAOwBACADAADtAQAwBAAA6QEAIAMAAADsAQAgAwAA7QEAMAQAAOkBACAFxwECAAAAAc0BQAAAAAHfAUAAAAAB5gEBAAAAAecBAgAAAAEBCAAA8QEAIAXHAQIAAAABzQFAAAAAAd8BQAAAAAHmAQEAAAAB5wECAAAAAQEIAADzAQAwBccBAgD5AgAhzQFAAPYCACHfAUAA9gIAIeYBAQD3AgAh5wECAPkCACECAAAA6QEAIAgAAPUBACAFxwECAPkCACHNAUAA9gIAId8BQAD2AgAh5gEBAPcCACHnAQIA-QIAIQIAAADsAQAgCAAA9wEAIAMAAADpAQAgDQAA8QEAIA4AAPUBACABAAAA6QEAIAEAAADsAQAgBRMAAIMDACAUAACEAwAgFQAAhwMAIBYAAIYDACAXAACFAwAgCMQBAADLAgAwxQEAAP0BABDGAQAAywIAMMcBAgCvAgAhzQFAALACACHfAUAAsAIAIeYBAQCxAgAh5wECAK8CACEDAAAA7AEAIAMAAPwBADASAAD9AQAgAwAAAOwBACADAADtAQAwBAAA6QEAIArEAQAAyAIAMMUBAACDAgAQxgEAAMgCADDHAQIAAAABzQFAAL0CACHbAQEAAAAB3AEBAMkCACHdAUAAvQIAId4BAADKAgAg3wFAAL0CACEBAAAAgAIAIAEAAACAAgAgCsQBAADIAgAwxQEAAIMCABDGAQAAyAIAMMcBAgC8AgAhzQFAAL0CACHbAQEAvgIAIdwBAQDJAgAh3QFAAL0CACHeAQAAygIAIN8BQAC9AgAhA9wBAAD7AgAg3gEAAPsCACClAgAAggMAIAMAAACDAgAgAwAAhAIAMAQAAIACACADAAAAgwIAIAMAAIQCADAEAACAAgAgAwAAAIMCACADAACEAgAwBAAAgAIAIAfHAQIAAAABzQFAAAAAAdsBAQAAAAHcAQEAAAAB3QFAAAAAAd4BgAAAAAHfAUAAAAABAQgAAIgCACAHxwECAAAAAc0BQAAAAAHbAQEAAAAB3AEBAAAAAd0BQAAAAAHeAYAAAAAB3wFAAAAAAQEIAACKAgAwB8cBAgD5AgAhzQFAAPYCACHbAQEA9wIAIdwBAQCBAwAh3QFAAPYCACHeAYAAAAAB3wFAAPYCACECAAAAgAIAIAgAAIwCACAHxwECAPkCACHNAUAA9gIAIdsBAQD3AgAh3AEBAIEDACHdAUAA9gIAId4BgAAAAAHfAUAA9gIAIQIAAACDAgAgCAAAjgIAIAMAAACAAgAgDQAAiAIAIA4AAIwCACABAAAAgAIAIAEAAACDAgAgBxMAAPwCACAUAAD9AgAgFQAAgAMAIBYAAP8CACAXAAD-AgAg3AEAAPsCACDeAQAA-wIAIArEAQAAwQIAMMUBAACUAgAQxgEAAMECADDHAQIArwIAIc0BQACwAgAh2wEBALECACHcAQEAwgIAId0BQACwAgAh3gEAAMMCACDfAUAAsAIAIQMAAACDAgAgAwAAkwIAMBIAAJQCACADAAAAgwIAIAMAAIQCADAEAACAAgAgC8QBAAC7AgAwxQEAAJoCABDGAQAAuwIAMMcBAgAAAAHIAUAAvQIAIckBAQC-AgAhygEBAL4CACHLAQgAvwIAIcwBAQC-AgAhzQFAAL0CACHaAQAAwAIAIAEAAACXAgAgAQAAAJcCACAKxAEAALsCADDFAQAAmgIAEMYBAAC7AgAwxwECALwCACHIAUAAvQIAIckBAQC-AgAhygEBAL4CACHLAQgAvwIAIcwBAQC-AgAhzQFAAL0CACEBpQIAAPoCACADAAAAmgIAIAMAAJsCADAEAACXAgAgAwAAAJoCACADAACbAgAwBAAAlwIAIAMAAACaAgAgAwAAmwIAMAQAAJcCACAHxwECAAAAAcgBQAAAAAHJAQEAAAABygEBAAAAAcsBCAAAAAHMAQEAAAABzQFAAAAAAQEIAACfAgAgB8cBAgAAAAHIAUAAAAAByQEBAAAAAcoBAQAAAAHLAQgAAAABzAEBAAAAAc0BQAAAAAEBCAAAoQIAMAfHAQIA-QIAIcgBQAD2AgAhyQEBAPcCACHKAQEA9wIAIcsBCAD4AgAhzAEBAPcCACHNAUAA9gIAIQIAAACXAgAgCAAAowIAIAfHAQIA-QIAIcgBQAD2AgAhyQEBAPcCACHKAQEA9wIAIcsBCAD4AgAhzAEBAPcCACHNAUAA9gIAIQIAAACaAgAgCAAApQIAIAMAAACXAgAgDQAAnwIAIA4AAKMCACABAAAAlwIAIAEAAACaAgAgBRMAAPECACAUAADyAgAgFQAA9QIAIBYAAPQCACAXAADzAgAgCsQBAACuAgAwxQEAAKsCABDGAQAArgIAMMcBAgCvAgAhyAFAALACACHJAQEAsQIAIcoBAQCxAgAhywEIALICACHMAQEAsQIAIc0BQACwAgAhAwAAAJoCACADAACqAgAwEgAAqwIAIAMAAACaAgAgAwAAmwIAMAQAAJcCACAKxAEAAK4CADDFAQAAqwIAEMYBAACuAgAwxwECAK8CACHIAUAAsAIAIckBAQCxAgAhygEBALECACHLAQgAsgIAIcwBAQCxAgAhzQFAALACACENEwAAtAIAIBQAALUCACAVAAC0AgAgFgAAtAIAIBcAALQCACDOAQIAAAABzwECAAAABNABAgAAAATRAQIAAAAB0gECAAAAAdMBAgAAAAHUAQIAAAAB1QECALoCACELEwAAtAIAIBYAALkCACAXAAC5AgAgzgFAAAAAAc8BQAAAAATQAUAAAAAE0QFAAAAAAdIBQAAAAAHTAUAAAAAB1AFAAAAAAdUBQAC4AgAhDxMAALQCACAWAAC3AgAgFwAAtwIAIM4BAQAAAAHPAQEAAAAE0AEBAAAABNEBAQAAAAHSAQEAAAAB0wEBAAAAAdQBAQAAAAHVAQEAtgIAIdYBAQAAAAHXAQEAAAAB2AEBAAAAAdkBAQAAAAENEwAAtAIAIBQAALUCACAVAAC1AgAgFgAAtQIAIBcAALUCACDOAQgAAAABzwEIAAAABNABCAAAAATRAQgAAAAB0gEIAAAAAdMBCAAAAAHUAQgAAAAB1QEIALMCACENEwAAtAIAIBQAALUCACAVAAC1AgAgFgAAtQIAIBcAALUCACDOAQgAAAABzwEIAAAABNABCAAAAATRAQgAAAAB0gEIAAAAAdMBCAAAAAHUAQgAAAAB1QEIALMCACEIzgECAAAAAc8BAgAAAATQAQIAAAAE0QECAAAAAdIBAgAAAAHTAQIAAAAB1AECAAAAAdUBAgC0AgAhCM4BCAAAAAHPAQgAAAAE0AEIAAAABNEBCAAAAAHSAQgAAAAB0wEIAAAAAdQBCAAAAAHVAQgAtQIAIQ8TAAC0AgAgFgAAtwIAIBcAALcCACDOAQEAAAABzwEBAAAABNABAQAAAATRAQEAAAAB0gEBAAAAAdMBAQAAAAHUAQEAAAAB1QEBALYCACHWAQEAAAAB1wEBAAAAAdgBAQAAAAHZAQEAAAABDM4BAQAAAAHPAQEAAAAE0AEBAAAABNEBAQAAAAHSAQEAAAAB0wEBAAAAAdQBAQAAAAHVAQEAtwIAIdYBAQAAAAHXAQEAAAAB2AEBAAAAAdkBAQAAAAELEwAAtAIAIBYAALkCACAXAAC5AgAgzgFAAAAAAc8BQAAAAATQAUAAAAAE0QFAAAAAAdIBQAAAAAHTAUAAAAAB1AFAAAAAAdUBQAC4AgAhCM4BQAAAAAHPAUAAAAAE0AFAAAAABNEBQAAAAAHSAUAAAAAB0wFAAAAAAdQBQAAAAAHVAUAAuQIAIQ0TAAC0AgAgFAAAtQIAIBUAALQCACAWAAC0AgAgFwAAtAIAIM4BAgAAAAHPAQIAAAAE0AECAAAABNEBAgAAAAHSAQIAAAAB0wECAAAAAdQBAgAAAAHVAQIAugIAIQrEAQAAuwIAMMUBAACaAgAQxgEAALsCADDHAQIAvAIAIcgBQAC9AgAhyQEBAL4CACHKAQEAvgIAIcsBCAC_AgAhzAEBAL4CACHNAUAAvQIAIQjOAQIAAAABzwECAAAABNABAgAAAATRAQIAAAAB0gECAAAAAdMBAgAAAAHUAQIAAAAB1QECALQCACEIzgFAAAAAAc8BQAAAAATQAUAAAAAE0QFAAAAAAdIBQAAAAAHTAUAAAAAB1AFAAAAAAdUBQAC5AgAhDM4BAQAAAAHPAQEAAAAE0AEBAAAABNEBAQAAAAHSAQEAAAAB0wEBAAAAAdQBAQAAAAHVAQEAtwIAIdYBAQAAAAHXAQEAAAAB2AEBAAAAAdkBAQAAAAEIzgEIAAAAAc8BCAAAAATQAQgAAAAE0QEIAAAAAdIBCAAAAAHTAQgAAAAB1AEIAAAAAdUBCAC1AgAhA8gBQAAAAAHJAQEAAAABygEBAAAAAQrEAQAAwQIAMMUBAACUAgAQxgEAAMECADDHAQIArwIAIc0BQACwAgAh2wEBALECACHcAQEAwgIAId0BQACwAgAh3gEAAMMCACDfAUAAsAIAIQ8TAADEAgAgFgAAxwIAIBcAAMcCACDOAQEAAAABzwEBAAAABdABAQAAAAXRAQEAAAAB0gEBAAAAAdMBAQAAAAHUAQEAAAAB1QEBAMYCACHWAQEAAAAB1wEBAAAAAdgBAQAAAAHZAQEAAAABDxMAAMQCACAWAADFAgAgFwAAxQIAIM4BgAAAAAHRAYAAAAAB0gGAAAAAAdMBgAAAAAHUAYAAAAAB1QGAAAAAAeABAQAAAAHhAQEAAAAB4gEBAAAAAeMBgAAAAAHkAYAAAAAB5QGAAAAAAQjOAQIAAAABzwECAAAABdABAgAAAAXRAQIAAAAB0gECAAAAAdMBAgAAAAHUAQIAAAAB1QECAMQCACEMzgGAAAAAAdEBgAAAAAHSAYAAAAAB0wGAAAAAAdQBgAAAAAHVAYAAAAAB4AEBAAAAAeEBAQAAAAHiAQEAAAAB4wGAAAAAAeQBgAAAAAHlAYAAAAABDxMAAMQCACAWAADHAgAgFwAAxwIAIM4BAQAAAAHPAQEAAAAF0AEBAAAABdEBAQAAAAHSAQEAAAAB0wEBAAAAAdQBAQAAAAHVAQEAxgIAIdYBAQAAAAHXAQEAAAAB2AEBAAAAAdkBAQAAAAEMzgEBAAAAAc8BAQAAAAXQAQEAAAAF0QEBAAAAAdIBAQAAAAHTAQEAAAAB1AEBAAAAAdUBAQDHAgAh1gEBAAAAAdcBAQAAAAHYAQEAAAAB2QEBAAAAAQrEAQAAyAIAMMUBAACDAgAQxgEAAMgCADDHAQIAvAIAIc0BQAC9AgAh2wEBAL4CACHcAQEAyQIAId0BQAC9AgAh3gEAAMoCACDfAUAAvQIAIQzOAQEAAAABzwEBAAAABdABAQAAAAXRAQEAAAAB0gEBAAAAAdMBAQAAAAHUAQEAAAAB1QEBAMcCACHWAQEAAAAB1wEBAAAAAdgBAQAAAAHZAQEAAAABDM4BgAAAAAHRAYAAAAAB0gGAAAAAAdMBgAAAAAHUAYAAAAAB1QGAAAAAAeABAQAAAAHhAQEAAAAB4gEBAAAAAeMBgAAAAAHkAYAAAAAB5QGAAAAAAQjEAQAAywIAMMUBAAD9AQAQxgEAAMsCADDHAQIArwIAIc0BQACwAgAh3wFAALACACHmAQEAsQIAIecBAgCvAgAhCMQBAADMAgAwxQEAAOwBABDGAQAAzAIAMMcBAgC8AgAhzQFAAL0CACHfAUAAvQIAIeYBAQC-AgAh5wECALwCACEMxAEAAM0CADDFAQAA5gEAEMYBAADNAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh6AEBALECACHpAQEAsQIAIeoBAQCxAgAh6wECAK8CACHsAQEAsQIAIe0BQACwAgAhDMQBAADOAgAwxQEAANUBABDGAQAAzgIAMMcBAgC8AgAhzQFAAL0CACHfAUAAvQIAIegBAQC-AgAh6QEBAL4CACHqAQEAvgIAIesBAgC8AgAh7AEBAL4CACHtAUAAvQIAIQ_EAQAAzwIAMMUBAADPAQAQxgEAAM8CADDHAQIArwIAIc0BQACwAgAh7gEBALECACHvAUAAsAIAIfABCACyAgAh8QEEANACACHyAQgAsgIAIfMBBADQAgAh9AEEANACACH1AQQA0AIAIfYBAgCvAgAh9wECAK8CACENEwAAtAIAIBQAALUCACAVAADSAgAgFgAA0gIAIBcAANICACDOAQQAAAABzwEEAAAABNABBAAAAATRAQQAAAAB0gEEAAAAAdMBBAAAAAHUAQQAAAAB1QEEANECACENEwAAtAIAIBQAALUCACAVAADSAgAgFgAA0gIAIBcAANICACDOAQQAAAABzwEEAAAABNABBAAAAATRAQQAAAAB0gEEAAAAAdMBBAAAAAHUAQQAAAAB1QEEANECACEIzgEEAAAAAc8BBAAAAATQAQQAAAAE0QEEAAAAAdIBBAAAAAHTAQQAAAAB1AEEAAAAAdUBBADSAgAhD8QBAADTAgAwxQEAAL4BABDGAQAA0wIAMMcBAgC8AgAhzQFAAL0CACHuAQEAvgIAIe8BQAC9AgAh8AEIAL8CACHxAQQA1AIAIfIBCAC_AgAh8wEEANQCACH0AQQA1AIAIfUBBADUAgAh9gECALwCACH3AQIAvAIAIQjOAQQAAAABzwEEAAAABNABBAAAAATRAQQAAAAB0gEEAAAAAdMBBAAAAAHUAQQAAAAB1QEEANICACEC7gEBAAAAAe8BQAAAAAEcxAEAANYCADDFAQAAuAEAEMYBAADWAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh6AEBALECACHqAQEAsQIAIe4BAQCxAgAh9AEEANACACH1AQQA0AIAIfYBAgCvAgAh9wECAK8CACH5AQEAsQIAIfoBAQCxAgAh-wEBALECACH8AQQA0AIAIf0BBADQAgAh_gECAK8CACH_AQgAsgIAIYACBADQAgAhgQIEANACACGCAggAsgIAIYMCCACyAgAhhAIIALICACGFAgQA0AIAIYYCBADQAgAhhwJAALACACEcxAEAANcCADDFAQAApwEAEMYBAADXAgAwxwECALwCACHNAUAAvQIAId8BQAC9AgAh6AEBAL4CACHqAQEAvgIAIe4BAQC-AgAh9AEEANQCACH1AQQA1AIAIfYBAgC8AgAh9wECALwCACH5AQEAvgIAIfoBAQC-AgAh-wEBAL4CACH8AQQA1AIAIf0BBADUAgAh_gECALwCACH_AQgAvwIAIYACBADUAgAhgQIEANQCACGCAggAvwIAIYMCCAC_AgAhhAIIAL8CACGFAgQA1AIAIYYCBADUAgAhhwJAAL0CACENxAEAANgCADDFAQAAoQEAEMYBAADYAgAwxwECAK8CACHNAUAAsAIAIe8BAQCxAgAhiAIBALECACGJAggAsgIAIYoCCACyAgAhiwIBALECACGMAgEAsQIAIY0CCACyAgAhjgIIALICACENxAEAANkCADDFAQAAkAEAEMYBAADZAgAwxwECALwCACHNAUAAvQIAIe8BAQC-AgAhiAIBAL4CACGJAggAvwIAIYoCCAC_AgAhiwIBAL4CACGMAgEAvgIAIY0CCAC_AgAhjgIIAL8CACEMxAEAANoCADDFAQAAigEAEMYBAADaAgAwxwECAK8CACHMAQEAsQIAIc0BQACwAgAh6QEBALECACGPAgEAsQIAIZACAQCxAgAhkQIBAMICACGSAkAAsAIAIZMCAgCvAgAhDMQBAADbAgAwxQEAAHkAEMYBAADbAgAwxwECALwCACHMAQEAvgIAIc0BQAC9AgAh6QEBAL4CACGPAgEAvgIAIZACAQC-AgAhkQIBAMkCACGSAkAAvQIAIZMCAgC8AgAhAo8CAQAAAAGSAkAAAAABCcQBAADdAgAwxQEAAHMAEMYBAADdAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh7wEBALECACGVAgIArwIAIZYCCACyAgAhDcQBAADeAgAwxQEAAF8AEMYBAADeAgAwxwECAK8CACHMAQEAsQIAIc0BQACwAgAh3wFAALACACHoAQEAsQIAIY8CAQCxAgAhlwIBALECACGYAgEAsQIAIZkCAQCxAgAhmgIgAN8CACEFEwAAtAIAIBYAAOECACAXAADhAgAgzgEgAAAAAdUBIADgAgAhBRMAALQCACAWAADhAgAgFwAA4QIAIM4BIAAAAAHVASAA4AIAIQLOASAAAAAB1QEgAOECACEONwAA5AIAIMQBAADiAgAwxQEAAE4AEMYBAADiAgAwxwECALwCACHMAQEAvgIAIc0BQAC9AgAh3wFAAL0CACHoAQEAvgIAIY8CAQC-AgAhlwIBAL4CACGYAgEAvgIAIZkCAQC-AgAhmgIgAOMCACECzgEgAAAAAdUBIADhAgAhA5sCAABIACCcAgAASAAgnQIAAEgAIALvAQEAAAABlQICAAAAAQo2AADnAgAgxAEAAOYCADDFAQAASAAQxgEAAOYCADDHAQIAvAIAIc0BQAC9AgAh3wFAAL0CACHvAQEAvgIAIZUCAgC8AgAhlgIIAL8CACEQNwAA5AIAIMQBAADiAgAwxQEAAE4AEMYBAADiAgAwxwECALwCACHMAQEAvgIAIc0BQAC9AgAh3wFAAL0CACHoAQEAvgIAIY8CAQC-AgAhlwIBAL4CACGYAgEAvgIAIZkCAQC-AgAhmgIgAOMCACGjAgAATgAgpAIAAE4AIAkIAADpAgAgxAEAAOgCADDFAQAAQwAQxgEAAOgCADDHAQIArwIAIc0BQACwAgAh3wFAALACACHoAQEAsQIAIZ8CAQCxAgAhDxMAALQCACAWAADqAgAgFwAA6gIAIM4BgAAAAAHRAYAAAAAB0gGAAAAAAdMBgAAAAAHUAYAAAAAB1QGAAAAAAeABAQAAAAHhAQEAAAAB4gEBAAAAAeMBgAAAAAHkAYAAAAAB5QGAAAAAAQzOAYAAAAAB0QGAAAAAAdIBgAAAAAHTAYAAAAAB1AGAAAAAAdUBgAAAAAHgAQEAAAAB4QEBAAAAAeIBAQAAAAHjAYAAAAAB5AGAAAAAAeUBgAAAAAEJCAAA7AIAIMQBAADrAgAwxQEAADIAEMYBAADrAgAwxwECALwCACHNAUAAvQIAId8BQAC9AgAh6AEBAL4CACGfAgEAvgIAIQzOAYAAAAAB0QGAAAAAAdIBgAAAAAHTAYAAAAAB1AGAAAAAAdUBgAAAAAHgAQEAAAAB4QEBAAAAAeIBAQAAAAHjAYAAAAAB5AGAAAAAAeUBgAAAAAEKxAEAAO0CADDFAQAALAAQxgEAAO0CADDHAQIArwIAIcgBAQCxAgAhzQFAALACACHfAUAAsAIAIY8CAQCxAgAhkQIBALECACGgAgEAsQIAIQrEAQAA7gIAMMUBAAAbABDGAQAA7gIAMMcBAgC8AgAhyAEBAL4CACHNAUAAvQIAId8BQAC9AgAhjwIBAL4CACGRAgEAvgIAIaACAQC-AgAhCcQBAADvAgAwxQEAABUAEMYBAADvAgAwxwECAK8CACHNAUAAsAIAId8BQACwAgAh6AEBALECACGhAgEAsQIAIaICAQCxAgAhCcQBAADwAgAwxQEAAAQAEMYBAADwAgAwxwECALwCACHNAUAAvQIAId8BQAC9AgAh6AEBAL4CACGhAgEAvgIAIaICAQC-AgAhAAAAAAABqQJAAAAAAQGpAgEAAAABBakCCAAAAAGvAggAAAABsAIIAAAAAbECCAAAAAGyAggAAAABBakCAgAAAAGvAgIAAAABsAICAAAAAbECAgAAAAGyAgIAAAABAdkBAQAAAAEAAAAAAAABqQIBAAAAAQHZAQEAAAABAAAAAAAB2QEBAAAAAQAAAAAAAdkBAQAAAAEAAAAAAAWpAgQAAAABrwIEAAAAAbACBAAAAAGxAgQAAAABsgIEAAAAAQHZAQEAAAABAAAAAAAB2QEBAAAAAQAAAAAAAdkBAQAAAAEAAAAAAAHZAQEAAAABAAAAAAAFDQAA2gMAIA4AAN0DACCmAgAA2wMAIKcCAADcAwAgrAIAAEYAIAMNAADaAwAgpgIAANsDACCsAgAARgAgAAAAAAABqQIgAAAAAQsNAAC2AwAwDgAAuwMAMKYCAAC3AwAwpwIAALgDADCoAgAAuQMAIKkCAAC6AwAwqgIAALoDADCrAgAAugMAMKwCAAC6AwAwrQIAALwDADCuAgAAvQMAMAXHAQIAAAABzQFAAAAAAd8BQAAAAAHvAQEAAAABlgIIAAAAAQIAAABKACANAADBAwAgAwAAAEoAIA0AAMEDACAOAADAAwAgAQgAANkDADALNgAA5wIAIMQBAADmAgAwxQEAAEgAEMYBAADmAgAwxwECAAAAAc0BQAC9AgAh3wFAAL0CACHvAQEAvgIAIZUCAgC8AgAhlgIIAL8CACGeAgAA5QIAIAIAAABKACAIAADAAwAgAgAAAL4DACAIAAC_AwAgCcQBAAC9AwAwxQEAAL4DABDGAQAAvQMAMMcBAgC8AgAhzQFAAL0CACHfAUAAvQIAIe8BAQC-AgAhlQICALwCACGWAggAvwIAIQnEAQAAvQMAMMUBAAC-AwAQxgEAAL0DADDHAQIAvAIAIc0BQAC9AgAh3wFAAL0CACHvAQEAvgIAIZUCAgC8AgAhlgIIAL8CACEFxwECAPkCACHNAUAA9gIAId8BQAD2AgAh7wEBAPcCACGWAggA-AIAIQXHAQIA-QIAIc0BQAD2AgAh3wFAAPYCACHvAQEA9wIAIZYCCAD4AgAhBccBAgAAAAHNAUAAAAAB3wFAAAAAAe8BAQAAAAGWAggAAAABBA0AALYDADCmAgAAtwMAMKgCAAC5AwAgrAIAALoDADAAAdkBAQAAAAECNwAAwwMAIKUCAADEAwAgAdkBAQAAAAEAAAAAAAHZAQEAAAABAAAAAAAB2QEBAAAAAQAAAAAAAdkBAQAAAAEFxwECAAAAAc0BQAAAAAHfAUAAAAAB7wEBAAAAAZYCCAAAAAEKxwECAAAAAcwBAQAAAAHNAUAAAAAB3wFAAAAAAegBAQAAAAGPAgEAAAABlwIBAAAAAZgCAQAAAAGZAgEAAAABmgIgAAAAAQIAAABGACANAADaAwAgAwAAAE4AIA0AANoDACAOAADeAwAgDAAAAE4AIAgAAN4DACDHAQIA-QIAIcwBAQD3AgAhzQFAAPYCACHfAUAA9gIAIegBAQD3AgAhjwIBAPcCACGXAgEA9wIAIZgCAQD3AgAhmQIBAPcCACGaAiAAtAMAIQrHAQIA-QIAIcwBAQD3AgAhzQFAAPYCACHfAUAA9gIAIegBAQD3AgAhjwIBAPcCACGXAgEA9wIAIZgCAQD3AgAhmQIBAPcCACGaAiAAtAMAIQAABRMABBQABRUABhYABxcACAAAAAAABRMABBQABRUABhYABxcACAAFEwAMFAANFQAOFgAPFwAQAAAAAAAFEwAMFAANFQAOFgAPFwAQAAUTABQUABUVABYWABcXABgAAAAAAAUTABQUABUVABYWABcXABgCEwAcN0sbATYAGgE3TAAFEwAeFAAfFQAgFgAhFwAiAAAAAAAFEwAeFAAfFQAgFgAhFwAiBRMAJRQAJhUAJxYAKBcAKQAAAAAABRMAJRQAJhUAJxYAKBcAKQAFEwAtFAAuFQAvFgAwFwAxAAAAAAAFEwAtFAAuFQAvFgAwFwAxAAUTADUUADYVADcWADgXADkAAAAAAAUTADUUADYVADcWADgXADkABRMAPRQAPhUAPxYAQBcAQQAAAAAABRMAPRQAPhUAPxYAQBcAQQAFEwBFFABGFQBHFgBIFwBJAAAAAAAFEwBFFABGFQBHFgBIFwBJAAUTAE0UAE4VAE8WAFAXAFEAAAAAAAUTAE0UAE4VAE8WAFAXAFEABRMAVRQAVhUAVxYAWBcAWQAAAAAABRMAVRQAVhUAVxYAWBcAWQAFEwBdFABeFQBfFgBgFwBhAAAAAAAFEwBdFABeFQBfFgBgFwBhAAUTAGUUAGYVAGcWAGgXAGkAAAAAAAUTAGUUAGYVAGcWAGgXAGkBAgECAwEFBgEGBwEHCAEJCgEKDAILDgEMEAIPEQEQEgEREwIYFgMZFwkaGQobGgocHQodHgoeHwofIQogIwIhJQoiJwIjKAokKQolKgImLQsnLhEoMBIpMRIqNBIrNRIsNhItOBIuOgIvPBIwPgIxPxIyQBIzQQI0RBM1RRk4Rxo5TRo6UBo7URo8Uho9VBo-VgI_WBpAWgJBWxpCXBpDXQJEYB1FYSNGYhtHYxtIZBtJZRtKZhtLaBtMagJNbBtObgJPbxtQcBtRcQJSdCRTdSpUdytVeCtWeytXfCtYfStZfytagQECW4MBK1yFAQJdhgErXocBK1-IAQJgiwEsYYwBMmKOATNjjwEzZJIBM2WTATNmlAEzZ5YBM2iYAQJpmgEzapwBAmudATNsngEzbZ8BAm6iATRvowE6cKUBO3GmATtyqQE7c6oBO3SrATt1rQE7dq8BAnexATt4swECebQBO3q1ATt7tgECfLkBPH26AUJ-vAFDf70BQ4ABwAFDgQHBAUOCAcIBQ4MBxAFDhAHGAQKFAcgBQ4YBygEChwHLAUOIAcwBQ4kBzQECigHQAUSLAdEBSowB0wFLjQHUAUuOAdcBS48B2AFLkAHZAUuRAdsBS5IB3QECkwHfAUuUAeEBApUB4gFLlgHjAUuXAeQBApgB5wFMmQHoAVKaAeoBU5sB6wFTnAHuAVOdAe8BU54B8AFTnwHyAVOgAfQBAqEB9gFTogH4AQKjAfkBU6QB-gFTpQH7AQKmAf4BVKcB_wFaqAGBAlupAYICW6oBhQJbqwGGAlusAYcCW60BiQJbrgGLAgKvAY0CW7ABjwICsQGQAluyAZECW7MBkgICtAGVAly1AZYCYrYBmAJjtwGZAmO4AZwCY7kBnQJjugGeAmO7AaACY7wBogICvQGkAmO-AaYCAr8BpwJjwAGoAmPBAakCAsIBrAJkwwGtAmo" + strings: JSON.parse("[\"where\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"createdAt\",\"equals\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"in\",\"notIn\",\"date\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"did\",\"homeId\",\"model\",\"name\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"userId\",\"status\",\"lastError\",\"updatedAt\",\"province\",\"fuel\",\"price\",\"source\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"period\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"title\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"description\",\"slug\",\"email\",\"password\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"_relevance\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "2gWUAfwBCY8CAACFBAAwkAIAAAQAEJECAACFBAAwkgICAAAAAZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIYwDAQAAAAGNAwEAyAMAIQEAAAABACABAAAAAQAgCY8CAACFBAAwkAIAAAQAEJECAACFBAAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhzAJAAMkDACGMAwEAyAMAIY0DAQDIAwAhAZkDAADCBQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACADAAAABAAgAwAABQAwBAAAAQAgBpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAGMAwEAAAABjQMBAAAAAQEIAAAJACAGkgICAAAAAZgCQAAAAAG3AgEAAAABzAJAAAAAAYwDAQAAAAGNAwEAAAABAQgAAAsAMAaSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHMAkAAjAQAIYwDAQCWBAAhjQMBAJYEACECAAAAAQAgCAAADQAgBpICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhjAMBAJYEACGNAwEAlgQAIQIAAAAEACAIAAAPACADAAAAAQAgDQAACQAgDgAADQAgAQAAAAEAIAEAAAAEACAFEwAAvQUAIBQAAL4FACAVAADBBQAgFgAAwAUAIBcAAL8FACAJjwIAAIQEADCQAgAAFQAQkQIAAIQEADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHMAkAAqQMAIYwDAQC2AwAhjQMBALYDACEDAAAABAAgAwAAFAAwEgAAFQAgAwAAAAQAIAMAAAUAMAQAAAEAIAqPAgAAgwQAMJACAAAbABCRAgAAgwQAMJICAgAAAAGYAkAAyQMAIacCAQDIAwAhzAJAAMkDACH9AgEAyAMAIf8CAQDIAwAhiwMBAAAAAQEAAAAYACABAAAAGAAgCo8CAACDBAAwkAIAABsAEJECAACDBAAwkgICAMcDACGYAkAAyQMAIacCAQDIAwAhzAJAAMkDACH9AgEAyAMAIf8CAQDIAwAhiwMBAMgDACEBmQMAALwFACADAAAAGwAgAwAAHAAwBAAAGAAgAwAAABsAIAMAABwAMAQAABgAIAMAAAAbACADAAAcADAEAAAYACAHkgICAAAAAZgCQAAAAAGnAgEAAAABzAJAAAAAAf0CAQAAAAH_AgEAAAABiwMBAAAAAQEIAAAgACAHkgICAAAAAZgCQAAAAAGnAgEAAAABzAJAAAAAAf0CAQAAAAH_AgEAAAABiwMBAAAAAQEIAAAiADAHkgICAI4EACGYAkAAjAQAIacCAQCWBAAhzAJAAIwEACH9AgEAlgQAIf8CAQCWBAAhiwMBAJYEACECAAAAGAAgCAAAJAAgB5ICAgCOBAAhmAJAAIwEACGnAgEAlgQAIcwCQACMBAAh_QIBAJYEACH_AgEAlgQAIYsDAQCWBAAhAgAAABsAIAgAACYAIAMAAAAYACANAAAgACAOAAAkACABAAAAGAAgAQAAABsAIAUTAAC3BQAgFAAAuAUAIBUAALsFACAWAAC6BQAgFwAAuQUAIAqPAgAAggQAMJACAAAsABCRAgAAggQAMJICAgCoAwAhmAJAAKkDACGnAgEAtgMAIcwCQACpAwAh_QIBALYDACH_AgEAtgMAIYsDAQC2AwAhAwAAABsAIAMAACsAMBIAACwAIAMAAAAbACADAAAcADAEAAAYACAJCAAAgQQAII8CAACABAAwkAIAADIAEJECAACABAAwkgICAAAAAZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIYoDAQDIAwAhAQAAAC8AIAEAAAAvACAJCAAAgQQAII8CAACABAAwkAIAADIAEJECAACABAAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhzAJAAMkDACGKAwEAyAMAIQGZAwAAtgUAIAMAAAAyACADAAAzADAEAAAvACADAAAAMgAgAwAAMwAwBAAALwAgAwAAADIAIAMAADMAMAQAAC8AIAYIgAAAAAGSAgIAAAABmAJAAAAAAbcCAQAAAAHMAkAAAAABigMBAAAAAQEIAAA3ACAGCIAAAAABkgICAAAAAZgCQAAAAAG3AgEAAAABzAJAAAAAAYoDAQAAAAEBCAAAOQAwBgiAAAAAAZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhigMBAJYEACECAAAALwAgCAAAOwAgBgiAAAAAAZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhigMBAJYEACECAAAAMgAgCAAAPQAgAwAAAC8AIA0AADcAIA4AADsAIAEAAAAvACABAAAAMgAgBRMAALEFACAUAACyBQAgFQAAtQUAIBYAALQFACAXAACzBQAgCQgAAP4DACCPAgAA_QMAMJACAABDABCRAgAA_QMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcwCQACpAwAhigMBALYDACEDAAAAMgAgAwAAQgAwEgAAQwAgAwAAADIAIAMAADMAMAQAAC8AIA43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAAAABmAJAAMkDACG3AgEAAAABzAJAAMkDACHQAgEAyAMAIf0CAQDIAwAhhQMBAMgDACGGAwEAyAMAIYcDAQDIAwAhiAMgANYDACEBAAAARgAgCjYAAPwDACCPAgAA-wMAMJACAABIABCRAgAA-wMAMJICAgDHAwAhmAJAAMkDACHMAkAAyQMAId0CAQDIAwAhgwMCAMcDACGEAwgA4AMAIQI2AACvBQAgmQMAALAFACALNgAA_AMAII8CAAD7AwAwkAIAAEgAEJECAAD7AwAwkgICAAAAAZgCQADJAwAhzAJAAMkDACHdAgEAyAMAIYMDAgDHAwAhhAMIAOADACGJAwAA-gMAIAMAAABIACADAABJADAEAABKACABAAAASAAgAQAAAEYAIA43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIdACAQDIAwAh_QIBAMgDACGFAwEAyAMAIYYDAQDIAwAhhwMBAMgDACGIAyAA1gMAIQI3AACtBQAgmQMAAK4FACADAAAATgAgAwAATwAwBAAARgAgAwAAAE4AIAMAAE8AMAQAAEYAIAMAAABOACADAABPADAEAABGACALNwAArAUAIJICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAEBCAAAUwAgCpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAEBCAAAVQAwCzcAAJ8FACCSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHMAkAAjAQAIdACAQCWBAAh_QIBAJYEACGFAwEAlgQAIYYDAQCWBAAhhwMBAJYEACGIAyAAoQQAIQIAAABGACAIAABXACAKkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACECAAAATgAgCAAAWQAgAwAAAEYAIA0AAFMAIA4AAFcAIAEAAABGACABAAAATgAgBRMAAJoFACAUAACbBQAgFQAAngUAIBYAAJ0FACAXAACcBQAgDY8CAAD3AwAwkAIAAF8AEJECAAD3AwAwkgICAKgDACGYAkAAqQMAIbcCAQC2AwAhzAJAAKkDACHQAgEAtgMAIf0CAQC2AwAhhQMBALYDACGGAwEAtgMAIYcDAQC2AwAhiAMgAL8DACEDAAAATgAgAwAAXgAwEgAAXwAgAwAAAE4AIAMAAE8AMAQAAEYAIAEAAABKACABAAAASgAgAwAAAEgAIAMAAEkAMAQAAEoAIAMAAABIACADAABJADAEAABKACADAAAASAAgAwAASQAwBAAASgAgBzYAAJkFACCSAgIAAAABmAJAAAAAAcwCQAAAAAHdAgEAAAABgwMCAAAAAYQDCAAAAAEBCAAAZwAgBpICAgAAAAGYAkAAAAABzAJAAAAAAd0CAQAAAAGDAwIAAAABhAMIAAAAAQEIAABpADAHNgAAmAUAIJICAgCOBAAhmAJAAIwEACHMAkAAjAQAId0CAQCWBAAhgwMCAI4EACGEAwgA5gQAIQIAAABKACAIAABrACAGkgICAI4EACGYAkAAjAQAIcwCQACMBAAh3QIBAJYEACGDAwIAjgQAIYQDCADmBAAhAgAAAEgAIAgAAG0AIAMAAABKACANAABnACAOAABrACABAAAASgAgAQAAAEgAIAUTAACTBQAgFAAAlAUAIBUAAJcFACAWAACWBQAgFwAAlQUAIAmPAgAA9gMAMJACAABzABCRAgAA9gMAMJICAgCoAwAhmAJAAKkDACHMAkAAqQMAId0CAQC2AwAhgwMCAKgDACGEAwgA3QMAIQMAAABIACADAAByADASAABzACADAAAASAAgAwAASQAwBAAASgAgDY8CAAD0AwAwkAIAAHkAEJECAAD0AwAwkgICAAAAAZgCQADJAwAh0AIBAMgDACHYAgEAyAMAIf0CAQDIAwAh_gIBAMgDACH_AgEA1AMAIYADQADJAwAhgQMCAMcDACGCAwAA9QMAIAEAAAB2ACABAAAAdgAgDI8CAAD0AwAwkAIAAHkAEJECAAD0AwAwkgICAMcDACGYAkAAyQMAIdACAQDIAwAh2AIBAMgDACH9AgEAyAMAIf4CAQDIAwAh_wIBANQDACGAA0AAyQMAIYEDAgDHAwAhAv8CAACGBAAgmQMAAJIFACADAAAAeQAgAwAAegAwBAAAdgAgAwAAAHkAIAMAAHoAMAQAAHYAIAMAAAB5ACADAAB6ADAEAAB2ACAJkgICAAAAAZgCQAAAAAHQAgEAAAAB2AIBAAAAAf0CAQAAAAH-AgEAAAAB_wIBAAAAAYADQAAAAAGBAwIAAAABAQgAAH4AIAmSAgIAAAABmAJAAAAAAdACAQAAAAHYAgEAAAAB_QIBAAAAAf4CAQAAAAH_AgEAAAABgANAAAAAAYEDAgAAAAEBCAAAgAEAMAmSAgIAjgQAIZgCQACMBAAh0AIBAJYEACHYAgEAlgQAIf0CAQCWBAAh_gIBAJYEACH_AgEAnwQAIYADQACMBAAhgQMCAI4EACECAAAAdgAgCAAAggEAIAmSAgIAjgQAIZgCQACMBAAh0AIBAJYEACHYAgEAlgQAIf0CAQCWBAAh_gIBAJYEACH_AgEAnwQAIYADQACMBAAhgQMCAI4EACECAAAAeQAgCAAAhAEAIAMAAAB2ACANAAB-ACAOAACCAQAgAQAAAHYAIAEAAAB5ACAGEwAAjQUAIBQAAI4FACAVAACRBQAgFgAAkAUAIBcAAI8FACD_AgAAhgQAIAyPAgAA8wMAMJACAACKAQAQkQIAAPMDADCSAgIAqAMAIZgCQACpAwAh0AIBALYDACHYAgEAtgMAIf0CAQC2AwAh_gIBALYDACH_AgEAvQMAIYADQACpAwAhgQMCAKgDACEDAAAAeQAgAwAAiQEAMBIAAIoBACADAAAAeQAgAwAAegAwBAAAdgAgDY8CAADyAwAwkAIAAJABABCRAgAA8gMAMJICAgAAAAGYAkAAyQMAId0CAQDIAwAh9gIBAMgDACH3AggA4AMAIfgCCADgAwAh-QIBAMgDACH6AgEAyAMAIfsCCADgAwAh_AIIAOADACEBAAAAjQEAIAEAAACNAQAgDY8CAADyAwAwkAIAAJABABCRAgAA8gMAMJICAgDHAwAhmAJAAMkDACHdAgEAyAMAIfYCAQDIAwAh9wIIAOADACH4AggA4AMAIfkCAQDIAwAh-gIBAMgDACH7AggA4AMAIfwCCADgAwAhAZkDAACMBQAgAwAAAJABACADAACRAQAwBAAAjQEAIAMAAACQAQAgAwAAkQEAMAQAAI0BACADAAAAkAEAIAMAAJEBADAEAACNAQAgCpICAgAAAAGYAkAAAAAB3QIBAAAAAfYCAQAAAAH3AggAAAAB-AIIAAAAAfkCAQAAAAH6AgEAAAAB-wIIAAAAAfwCCAAAAAEBCAAAlQEAIAqSAgIAAAABmAJAAAAAAd0CAQAAAAH2AgEAAAAB9wIIAAAAAfgCCAAAAAH5AgEAAAAB-gIBAAAAAfsCCAAAAAH8AggAAAABAQgAAJcBADAKkgICAI4EACGYAkAAjAQAId0CAQCWBAAh9gIBAJYEACH3AggA5gQAIfgCCADmBAAh-QIBAJYEACH6AgEAlgQAIfsCCADmBAAh_AIIAOYEACECAAAAjQEAIAgAAJkBACAKkgICAI4EACGYAkAAjAQAId0CAQCWBAAh9gIBAJYEACH3AggA5gQAIfgCCADmBAAh-QIBAJYEACH6AgEAlgQAIfsCCADmBAAh_AIIAOYEACECAAAAkAEAIAgAAJsBACADAAAAjQEAIA0AAJUBACAOAACZAQAgAQAAAI0BACABAAAAkAEAIAUTAACHBQAgFAAAiAUAIBUAAIsFACAWAACKBQAgFwAAiQUAIA2PAgAA8QMAMJACAAChAQAQkQIAAPEDADCSAgIAqAMAIZgCQACpAwAh3QIBALYDACH2AgEAtgMAIfcCCADdAwAh-AIIAN0DACH5AgEAtgMAIfoCAQC2AwAh-wIIAN0DACH8AggA3QMAIQMAAACQAQAgAwAAoAEAMBIAAKEBACADAAAAkAEAIAMAAJEBADAEAACNAQAgHI8CAADwAwAwkAIAAKcBABCRAgAA8AMAMJICAgAAAAGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdwCAQAAAAHiAgQA7QMAIeMCBADtAwAh5AICAMcDACHlAgIAxwMAIecCAQDIAwAh6AIBAMgDACHpAgEAyAMAIeoCBADtAwAh6wIEAO0DACHsAgIAxwMAIe0CCADgAwAh7gIEAO0DACHvAgQA7QMAIfACCADgAwAh8QIIAOADACHyAggA4AMAIfMCBADtAwAh9AIEAO0DACH1AkAAyQMAIQEAAACkAQAgAQAAAKQBACAcjwIAAPADADCQAgAApwEAEJECAADwAwAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdwCAQDIAwAh4gIEAO0DACHjAgQA7QMAIeQCAgDHAwAh5QICAMcDACHnAgEAyAMAIegCAQDIAwAh6QIBAMgDACHqAgQA7QMAIesCBADtAwAh7AICAMcDACHtAggA4AMAIe4CBADtAwAh7wIEAO0DACHwAggA4AMAIfECCADgAwAh8gIIAOADACHzAgQA7QMAIfQCBADtAwAh9QJAAMkDACEBmQMAAIYFACADAAAApwEAIAMAAKgBADAEAACkAQAgAwAAAKcBACADAACoAQAwBAAApAEAIAMAAACnAQAgAwAAqAEAMAQAAKQBACAZkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHcAgEAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAecCAQAAAAHoAgEAAAAB6QIBAAAAAeoCBAAAAAHrAgQAAAAB7AICAAAAAe0CCAAAAAHuAgQAAAAB7wIEAAAAAfACCAAAAAHxAggAAAAB8gIIAAAAAfMCBAAAAAH0AgQAAAAB9QJAAAAAAQEIAACsAQAgGZICAgAAAAGYAkAAAAABtwIBAAAAAcoCAQAAAAHMAkAAAAAB3AIBAAAAAeICBAAAAAHjAgQAAAAB5AICAAAAAeUCAgAAAAHnAgEAAAAB6AIBAAAAAekCAQAAAAHqAgQAAAAB6wIEAAAAAewCAgAAAAHtAggAAAAB7gIEAAAAAe8CBAAAAAHwAggAAAAB8QIIAAAAAfICCAAAAAHzAgQAAAAB9AIEAAAAAfUCQAAAAAEBCAAArgEAMBmSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHKAgEAlgQAIcwCQACMBAAh3AIBAJYEACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIecCAQCWBAAh6AIBAJYEACHpAgEAlgQAIeoCBAD_BAAh6wIEAP8EACHsAgIAjgQAIe0CCADmBAAh7gIEAP8EACHvAgQA_wQAIfACCADmBAAh8QIIAOYEACHyAggA5gQAIfMCBAD_BAAh9AIEAP8EACH1AkAAjAQAIQIAAACkAQAgCAAAsAEAIBmSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHKAgEAlgQAIcwCQACMBAAh3AIBAJYEACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIecCAQCWBAAh6AIBAJYEACHpAgEAlgQAIeoCBAD_BAAh6wIEAP8EACHsAgIAjgQAIe0CCADmBAAh7gIEAP8EACHvAgQA_wQAIfACCADmBAAh8QIIAOYEACHyAggA5gQAIfMCBAD_BAAh9AIEAP8EACH1AkAAjAQAIQIAAACnAQAgCAAAsgEAIAMAAACkAQAgDQAArAEAIA4AALABACABAAAApAEAIAEAAACnAQAgBRMAAIEFACAUAACCBQAgFQAAhQUAIBYAAIQFACAXAACDBQAgHI8CAADvAwAwkAIAALgBABCRAgAA7wMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcoCAQC2AwAhzAJAAKkDACHcAgEAtgMAIeICBADpAwAh4wIEAOkDACHkAgIAqAMAIeUCAgCoAwAh5wIBALYDACHoAgEAtgMAIekCAQC2AwAh6gIEAOkDACHrAgQA6QMAIewCAgCoAwAh7QIIAN0DACHuAgQA6QMAIe8CBADpAwAh8AIIAN0DACHxAggA3QMAIfICCADdAwAh8wIEAOkDACH0AgQA6QMAIfUCQACpAwAhAwAAAKcBACADAAC3AQAwEgAAuAEAIAMAAACnAQAgAwAAqAEAMAQAAKQBACAQjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAAAAAZgCQADJAwAh3AIBAMgDACHdAkAAyQMAId4CCADgAwAh3wIEAO0DACHgAggA4AMAIeECBADtAwAh4gIEAO0DACHjAgQA7QMAIeQCAgDHAwAh5QICAMcDACHmAgAA7gMAIAEAAAC7AQAgAQAAALsBACAPjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAMcDACGYAkAAyQMAIdwCAQDIAwAh3QJAAMkDACHeAggA4AMAId8CBADtAwAh4AIIAOADACHhAgQA7QMAIeICBADtAwAh4wIEAO0DACHkAgIAxwMAIeUCAgDHAwAhAZkDAACABQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAMAAAC-AQAgAwAAvwEAMAQAALsBACADAAAAvgEAIAMAAL8BADAEAAC7AQAgDJICAgAAAAGYAkAAAAAB3AIBAAAAAd0CQAAAAAHeAggAAAAB3wIEAAAAAeACCAAAAAHhAgQAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAQEIAADDAQAgDJICAgAAAAGYAkAAAAAB3AIBAAAAAd0CQAAAAAHeAggAAAAB3wIEAAAAAeACCAAAAAHhAgQAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAQEIAADFAQAwDJICAgCOBAAhmAJAAIwEACHcAgEAlgQAId0CQACMBAAh3gIIAOYEACHfAgQA_wQAIeACCADmBAAh4QIEAP8EACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIQIAAAC7AQAgCAAAxwEAIAySAgIAjgQAIZgCQACMBAAh3AIBAJYEACHdAkAAjAQAId4CCADmBAAh3wIEAP8EACHgAggA5gQAIeECBAD_BAAh4gIEAP8EACHjAgQA_wQAIeQCAgCOBAAh5QICAI4EACECAAAAvgEAIAgAAMkBACADAAAAuwEAIA0AAMMBACAOAADHAQAgAQAAALsBACABAAAAvgEAIAUTAAD6BAAgFAAA-wQAIBUAAP4EACAWAAD9BAAgFwAA_AQAIA-PAgAA6AMAMJACAADPAQAQkQIAAOgDADCSAgIAqAMAIZgCQACpAwAh3AIBALYDACHdAkAAqQMAId4CCADdAwAh3wIEAOkDACHgAggA3QMAIeECBADpAwAh4gIEAOkDACHjAgQA6QMAIeQCAgCoAwAh5QICAKgDACEDAAAAvgEAIAMAAM4BADASAADPAQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAyPAgAA5wMAMJACAADVAQAQkQIAAOcDADCSAgIAAAABmAJAAMkDACG3AgEAAAABygIBAMgDACHMAkAAyQMAIdgCAQDIAwAh2QICAMcDACHaAgEAyAMAIdsCQADJAwAhAQAAANIBACABAAAA0gEAIAyPAgAA5wMAMJACAADVAQAQkQIAAOcDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHKAgEAyAMAIcwCQADJAwAh2AIBAMgDACHZAgIAxwMAIdoCAQDIAwAh2wJAAMkDACEBmQMAAPkEACADAAAA1QEAIAMAANYBADAEAADSAQAgAwAAANUBACADAADWAQAwBAAA0gEAIAMAAADVAQAgAwAA1gEAMAQAANIBACAJkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHYAgEAAAAB2QICAAAAAdoCAQAAAAHbAkAAAAABAQgAANoBACAJkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHYAgEAAAAB2QICAAAAAdoCAQAAAAHbAkAAAAABAQgAANwBADAJkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhygIBAJYEACHMAkAAjAQAIdgCAQCWBAAh2QICAI4EACHaAgEAlgQAIdsCQACMBAAhAgAAANIBACAIAADeAQAgCZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcoCAQCWBAAhzAJAAIwEACHYAgEAlgQAIdkCAgCOBAAh2gIBAJYEACHbAkAAjAQAIQIAAADVAQAgCAAA4AEAIAMAAADSAQAgDQAA2gEAIA4AAN4BACABAAAA0gEAIAEAAADVAQAgBRMAAPQEACAUAAD1BAAgFQAA-AQAIBYAAPcEACAXAAD2BAAgDI8CAADmAwAwkAIAAOYBABCRAgAA5gMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcoCAQC2AwAhzAJAAKkDACHYAgEAtgMAIdkCAgCoAwAh2gIBALYDACHbAkAAqQMAIQMAAADVAQAgAwAA5QEAMBIAAOYBACADAAAA1QEAIAMAANYBADAEAADSAQAgCI8CAADlAwAwkAIAAOwBABCRAgAA5QMAMJICAgAAAAGYAkAAyQMAIcwCQADJAwAh1gIBAAAAAdcCAgDHAwAhAQAAAOkBACABAAAA6QEAIAiPAgAA5QMAMJACAADsAQAQkQIAAOUDADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHWAgEAyAMAIdcCAgDHAwAhAZkDAADzBAAgAwAAAOwBACADAADtAQAwBAAA6QEAIAMAAADsAQAgAwAA7QEAMAQAAOkBACADAAAA7AEAIAMAAO0BADAEAADpAQAgBZICAgAAAAGYAkAAAAABzAJAAAAAAdYCAQAAAAHXAgIAAAABAQgAAPEBACAFkgICAAAAAZgCQAAAAAHMAkAAAAAB1gIBAAAAAdcCAgAAAAEBCAAA8wEAMAWSAgIAjgQAIZgCQACMBAAhzAJAAIwEACHWAgEAlgQAIdcCAgCOBAAhAgAAAOkBACAIAAD1AQAgBZICAgCOBAAhmAJAAIwEACHMAkAAjAQAIdYCAQCWBAAh1wICAI4EACECAAAA7AEAIAgAAPcBACADAAAA6QEAIA0AAPEBACAOAAD1AQAgAQAAAOkBACABAAAA7AEAIAUTAADuBAAgFAAA7wQAIBUAAPIEACAWAADxBAAgFwAA8AQAIAiPAgAA5AMAMJACAAD9AQAQkQIAAOQDADCSAgIAqAMAIZgCQACpAwAhzAJAAKkDACHWAgEAtgMAIdcCAgCoAwAhAwAAAOwBACADAAD8AQAwEgAA_QEAIAMAAADsAQAgAwAA7QEAMAQAAOkBACAKjwIAAOMDADCQAgAAgwIAEJECAADjAwAwkgICAAAAAZgCQADJAwAhzAJAAMkDACHSAgEAAAAB0wIBANQDACHUAkAAyQMAIdUCAADOAwAgAQAAAIACACABAAAAgAIAIAqPAgAA4wMAMJACAACDAgAQkQIAAOMDADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHSAgEAyAMAIdMCAQDUAwAh1AJAAMkDACHVAgAAzgMAIAPTAgAAhgQAINUCAACGBAAgmQMAAO0EACADAAAAgwIAIAMAAIQCADAEAACAAgAgAwAAAIMCACADAACEAgAwBAAAgAIAIAMAAACDAgAgAwAAhAIAMAQAAIACACAHkgICAAAAAZgCQAAAAAHMAkAAAAAB0gIBAAAAAdMCAQAAAAHUAkAAAAAB1QKAAAAAAQEIAACIAgAgB5ICAgAAAAGYAkAAAAABzAJAAAAAAdICAQAAAAHTAgEAAAAB1AJAAAAAAdUCgAAAAAEBCAAAigIAMAeSAgIAjgQAIZgCQACMBAAhzAJAAIwEACHSAgEAlgQAIdMCAQCfBAAh1AJAAIwEACHVAoAAAAABAgAAAIACACAIAACMAgAgB5ICAgCOBAAhmAJAAIwEACHMAkAAjAQAIdICAQCWBAAh0wIBAJ8EACHUAkAAjAQAIdUCgAAAAAECAAAAgwIAIAgAAI4CACADAAAAgAIAIA0AAIgCACAOAACMAgAgAQAAAIACACABAAAAgwIAIAcTAADoBAAgFAAA6QQAIBUAAOwEACAWAADrBAAgFwAA6gQAINMCAACGBAAg1QIAAIYEACAKjwIAAOIDADCQAgAAlAIAEJECAADiAwAwkgICAKgDACGYAkAAqQMAIcwCQACpAwAh0gIBALYDACHTAgEAvQMAIdQCQACpAwAh1QIAAKsDACADAAAAgwIAIAMAAJMCADASAACUAgAgAwAAAIMCACADAACEAgAwBAAAgAIAIAuPAgAA3wMAMJACAACaAgAQkQIAAN8DADCSAgIAAAABmAJAAMkDACGnAkAAyQMAIc0CAQDIAwAhzgIBAMgDACHPAggA4AMAIdACAQDIAwAh0QIAAOEDACABAAAAlwIAIAEAAACXAgAgCo8CAADfAwAwkAIAAJoCABCRAgAA3wMAMJICAgDHAwAhmAJAAMkDACGnAkAAyQMAIc0CAQDIAwAhzgIBAMgDACHPAggA4AMAIdACAQDIAwAhAZkDAADnBAAgAwAAAJoCACADAACbAgAwBAAAlwIAIAMAAACaAgAgAwAAmwIAMAQAAJcCACADAAAAmgIAIAMAAJsCADAEAACXAgAgB5ICAgAAAAGYAkAAAAABpwJAAAAAAc0CAQAAAAHOAgEAAAABzwIIAAAAAdACAQAAAAEBCAAAnwIAIAeSAgIAAAABmAJAAAAAAacCQAAAAAHNAgEAAAABzgIBAAAAAc8CCAAAAAHQAgEAAAABAQgAAKECADAHkgICAI4EACGYAkAAjAQAIacCQACMBAAhzQIBAJYEACHOAgEAlgQAIc8CCADmBAAh0AIBAJYEACECAAAAlwIAIAgAAKMCACAHkgICAI4EACGYAkAAjAQAIacCQACMBAAhzQIBAJYEACHOAgEAlgQAIc8CCADmBAAh0AIBAJYEACECAAAAmgIAIAgAAKUCACADAAAAlwIAIA0AAJ8CACAOAACjAgAgAQAAAJcCACABAAAAmgIAIAUTAADhBAAgFAAA4gQAIBUAAOUEACAWAADkBAAgFwAA4wQAIAqPAgAA3AMAMJACAACrAgAQkQIAANwDADCSAgIAqAMAIZgCQACpAwAhpwJAAKkDACHNAgEAtgMAIc4CAQC2AwAhzwIIAN0DACHQAgEAtgMAIQMAAACaAgAgAwAAqgIAMBIAAKsCACADAAAAmgIAIAMAAJsCADAEAACXAgAgCY8CAADbAwAwkAIAALECABCRAgAA2wMAMJICAgAAAAHIAgEAAAAByQIBAMgDACHKAgEAyAMAIcsCAQDIAwAhzAJAAMkDACEBAAAArgIAIAEAAACuAgAgCY8CAADbAwAwkAIAALECABCRAgAA2wMAMJICAgDHAwAhyAIBAMgDACHJAgEAyAMAIcoCAQDIAwAhywIBAMgDACHMAkAAyQMAIQGZAwAA4AQAIAMAAACxAgAgAwAAsgIAMAQAAK4CACADAAAAsQIAIAMAALICADAEAACuAgAgAwAAALECACADAACyAgAwBAAArgIAIAaSAgIAAAAByAIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAcwCQAAAAAEBCAAAtgIAIAaSAgIAAAAByAIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAcwCQAAAAAEBCAAAuAIAMAaSAgIAjgQAIcgCAQCWBAAhyQIBAJYEACHKAgEAlgQAIcsCAQCWBAAhzAJAAIwEACECAAAArgIAIAgAALoCACAGkgICAI4EACHIAgEAlgQAIckCAQCWBAAhygIBAJYEACHLAgEAlgQAIcwCQACMBAAhAgAAALECACAIAAC8AgAgAwAAAK4CACANAAC2AgAgDgAAugIAIAEAAACuAgAgAQAAALECACAFEwAA2wQAIBQAANwEACAVAADfBAAgFgAA3gQAIBcAAN0EACAJjwIAANoDADCQAgAAwgIAEJECAADaAwAwkgICAKgDACHIAgEAtgMAIckCAQC2AwAhygIBALYDACHLAgEAtgMAIcwCQACpAwAhAwAAALECACADAADBAgAwEgAAwgIAIAMAAACxAgAgAwAAsgIAMAQAAK4CACAI1gEAAMoDACCPAgAAxgMAMJACAADXAgAQkQIAAMYDADCSAgIAAAABmAJAAMkDACG1AgEAAAABtwIBAMgDACEBAAAAxQIAIBfSAQAA1wMAINQBAADYAwAg1QEAANkDACCPAgAA0wMAMJACAADHAgAQkQIAANMDADCSAgIAxwMAIZgCQADJAwAhtAIBAMgDACG1AgEAyAMAIbYCAQDIAwAhtwIBAMgDACG4AgEA1AMAIbkCAgDHAwAhugICAMcDACG7AgIAxwMAIbwCAgDHAwAhvQICAMcDACG-AgIAxwMAIb8CAgDVAwAhwAJAANIDACHBAiAA1gMAIcICQADSAwAhCNIBAADXBAAg1AEAANgEACDVAQAA2QQAILgCAACGBAAgvwIAAIYEACDAAgAAhgQAIMICAACGBAAgmQMAANoEACAX0gEAANcDACDUAQAA2AMAINUBAADZAwAgjwIAANMDADCQAgAAxwIAEJECAADTAwAwkgICAAAAAZgCQADJAwAhtAIBAAAAAbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEDAAAAxwIAIAMAAMgCADAEAADJAgAgE9MBAADPAwAgjwIAANEDADCQAgAAywIAEJECAADRAwAwkgICAMcDACGTAgIAxwMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhpwJAAMkDACGoAggAzQMAIakCCADNAwAhqgIIAM0DACGrAggAzQMAIawCCADNAwAhrQIIAM0DACGuAgEAyAMAIa8CQADSAwAhDNMBAADVBAAglQIAAIYEACCWAgAAhgQAIJcCAACGBAAgqAIAAIYEACCpAgAAhgQAIKoCAACGBAAgqwIAAIYEACCsAgAAhgQAIK0CAACGBAAgrwIAAIYEACCZAwAA1gQAIBTTAQAAzwMAII8CAADRAwAwkAIAAMsCABCRAgAA0QMAMJICAgAAAAGTAgIAxwMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhpwJAAMkDACGoAggAzQMAIakCCADNAwAhqgIIAM0DACGrAggAzQMAIawCCADNAwAhrQIIAM0DACGuAgEAyAMAIa8CQADSAwAhxwIAANADACADAAAAywIAIAMAAMwCADAEAADNAgAgC9MBAADPAwAgjwIAAMwDADCQAgAAzwIAEJECAADMAwAwkgICAMcDACGTAgIAxwMAIZQCQADJAwAhlQIIAM0DACGWAggAzQMAIZcCAADOAwAgmAJAAMkDACEE0wEAANUEACCVAgAAhgQAIJYCAACGBAAglwIAAIYEACAM0wEAAM8DACCPAgAAzAMAMJACAADPAgAQkQIAAMwDADCSAgIAAAABkwICAMcDACGUAkAAyQMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhxgIAAMsDACADAAAAzwIAIAMAANACADAEAADRAgAgAQAAAMsCACABAAAAzwIAIAEAAADHAgAgAQAAAMUCACAI1gEAAMoDACCPAgAAxgMAMJACAADXAgAQkQIAAMYDADCSAgIAxwMAIZgCQADJAwAhtQIBAMgDACG3AgEAyAMAIQLWAQAA0wQAIJkDAADUBAAgAwAAANcCACADAADYAgAwBAAAxQIAIAMAAADXAgAgAwAA2AIAMAQAAMUCACADAAAA1wIAIAMAANgCADAEAADFAgAgBdYBAADSBAAgkgICAAAAAZgCQAAAAAG1AgEAAAABtwIBAAAAAQEIAADcAgAgBJICAgAAAAGYAkAAAAABtQIBAAAAAbcCAQAAAAEBCAAA3gIAMAXWAQAAxQQAIJICAgCOBAAhmAJAAIwEACG1AgEAlgQAIbcCAQCWBAAhAgAAAMUCACAIAADgAgAgBJICAgCOBAAhmAJAAIwEACG1AgEAlgQAIbcCAQCWBAAhAgAAANcCACAIAADiAgAgAwAAAMUCACANAADcAgAgDgAA4AIAIAEAAADFAgAgAQAAANcCACAFEwAAwAQAIBQAAMEEACAVAADEBAAgFgAAwwQAIBcAAMIEACAHjwIAAMUDADCQAgAA6AIAEJECAADFAwAwkgICAKgDACGYAkAAqQMAIbUCAQC2AwAhtwIBALYDACEDAAAA1wIAIAMAAOcCADASAADoAgAgAwAAANcCACADAADYAgAwBAAAxQIAIAEAAADJAgAgAQAAAMkCACADAAAAxwIAIAMAAMgCADAEAADJAgAgAwAAAMcCACADAADIAgAwBAAAyQIAIAMAAADHAgAgAwAAyAIAMAQAAMkCACAU0gEAAL0EACDUAQAAvgQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAgAAAAG6AgIAAAABuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgAAAAHAAkAAAAABwQIgAAAAAcICQAAAAAEBCAAA8AIAIBGSAgIAAAABmAJAAAAAAbQCAQAAAAG1AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQEIAADyAgAwFNIBAACiBAAg1AEAAKMEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACECAAAAyQIAIAgAAPQCACARkgICAI4EACGYAkAAjAQAIbQCAQCWBAAhtQIBAJYEACG2AgEAlgQAIbcCAQCWBAAhuAIBAJ8EACG5AgIAjgQAIboCAgCOBAAhuwICAI4EACG8AgIAjgQAIb0CAgCOBAAhvgICAI4EACG_AgIAoAQAIcACQACXBAAhwQIgAKEEACHCAkAAlwQAIQIAAADHAgAgCAAA9gIAIAMAAADJAgAgDQAA8AIAIA4AAPQCACABAAAAyQIAIAEAAADHAgAgCRMAAJoEACAUAACbBAAgFQAAngQAIBYAAJ0EACAXAACcBAAguAIAAIYEACC_AgAAhgQAIMACAACGBAAgwgIAAIYEACAUjwIAALwDADCQAgAA_AIAEJECAAC8AwAwkgICAKgDACGYAkAAqQMAIbQCAQC2AwAhtQIBALYDACG2AgEAtgMAIbcCAQC2AwAhuAIBAL0DACG5AgIAqAMAIboCAgCoAwAhuwICAKgDACG8AgIAqAMAIb0CAgCoAwAhvgICAKgDACG_AgIAvgMAIcACQAC3AwAhwQIgAL8DACHCAkAAtwMAIQMAAADHAgAgAwAA-wIAMBIAAPwCACADAAAAxwIAIAMAAMgCADAEAADJAgAgAQAAAM0CACABAAAAzQIAIAMAAADLAgAgAwAAzAIAMAQAAM0CACADAAAAywIAIAMAAMwCADAEAADNAgAgAwAAAMsCACADAADMAgAwBAAAzQIAIBDTAQAAmQQAIJICAgAAAAGTAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQEIAACEAwAgD5ICAgAAAAGTAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQEIAACGAwAwENMBAACYBAAgkgICAI4EACGTAgIAjgQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACGnAkAAjAQAIagCCACNBAAhqQIIAI0EACGqAggAjQQAIasCCACNBAAhrAIIAI0EACGtAggAjQQAIa4CAQCWBAAhrwJAAJcEACECAAAAzQIAIAgAAIgDACAPkgICAI4EACGTAgIAjgQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACGnAkAAjAQAIagCCACNBAAhqQIIAI0EACGqAggAjQQAIasCCACNBAAhrAIIAI0EACGtAggAjQQAIa4CAQCWBAAhrwJAAJcEACECAAAAywIAIAgAAIoDACADAAAAzQIAIA0AAIQDACAOAACIAwAgAQAAAM0CACABAAAAywIAIA8TAACRBAAgFAAAkgQAIBUAAJUEACAWAACUBAAgFwAAkwQAIJUCAACGBAAglgIAAIYEACCXAgAAhgQAIKgCAACGBAAgqQIAAIYEACCqAgAAhgQAIKsCAACGBAAgrAIAAIYEACCtAgAAhgQAIK8CAACGBAAgEo8CAAC1AwAwkAIAAJADABCRAgAAtQMAMJICAgCoAwAhkwICAKgDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIacCQACpAwAhqAIIAKoDACGpAggAqgMAIaoCCACqAwAhqwIIAKoDACGsAggAqgMAIa0CCACqAwAhrgIBALYDACGvAkAAtwMAIQMAAADLAgAgAwAAjwMAMBIAAJADACADAAAAywIAIAMAAMwCADAEAADNAgAgAQAAANECACABAAAA0QIAIAMAAADPAgAgAwAA0AIAMAQAANECACADAAAAzwIAIAMAANACADAEAADRAgAgAwAAAM8CACADAADQAgAwBAAA0QIAIAjTAQAAkAQAIJICAgAAAAGTAgIAAAABlAJAAAAAAZUCCAAAAAGWAggAAAABlwKAAAAAAZgCQAAAAAEBCAAAmAMAIAeSAgIAAAABkwICAAAAAZQCQAAAAAGVAggAAAABlgIIAAAAAZcCgAAAAAGYAkAAAAABAQgAAJoDADAI0wEAAI8EACCSAgIAjgQAIZMCAgCOBAAhlAJAAIwEACGVAggAjQQAIZYCCACNBAAhlwKAAAAAAZgCQACMBAAhAgAAANECACAIAACcAwAgB5ICAgCOBAAhkwICAI4EACGUAkAAjAQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACECAAAAzwIAIAgAAJ4DACADAAAA0QIAIA0AAJgDACAOAACcAwAgAQAAANECACABAAAAzwIAIAgTAACHBAAgFAAAiAQAIBUAAIsEACAWAACKBAAgFwAAiQQAIJUCAACGBAAglgIAAIYEACCXAgAAhgQAIAqPAgAApwMAMJACAACkAwAQkQIAAKcDADCSAgIAqAMAIZMCAgCoAwAhlAJAAKkDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIQMAAADPAgAgAwAAowMAMBIAAKQDACADAAAAzwIAIAMAANACADAEAADRAgAgCo8CAACnAwAwkAIAAKQDABCRAgAApwMAMJICAgCoAwAhkwICAKgDACGUAkAAqQMAIZUCCACqAwAhlgIIAKoDACGXAgAAqwMAIJgCQACpAwAhDRMAALEDACAUAAC0AwAgFQAAsQMAIBYAALEDACAXAACxAwAgmQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAswMAIaUCAgAAAASmAgIAAAAECxMAALEDACAWAACyAwAgFwAAsgMAIJkCQAAAAAGgAkAAAAABoQJAAAAAAaICQAAAAAGjAkAAAAABpAJAALADACGlAkAAAAAEpgJAAAAABA0TAACsAwAgFAAArwMAIBUAAK8DACAWAACvAwAgFwAArwMAIJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAK4DACGlAggAAAAFpgIIAAAABQ8TAACsAwAgFgAArQMAIBcAAK0DACCZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEImQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIArAMAIaUCAgAAAAWmAgIAAAAFDJkCgAAAAAGaAgEAAAABmwIBAAAAAZwCAQAAAAGdAoAAAAABngKAAAAAAZ8CgAAAAAGgAoAAAAABoQKAAAAAAaICgAAAAAGjAoAAAAABpAKAAAAAAQ0TAACsAwAgFAAArwMAIBUAAK8DACAWAACvAwAgFwAArwMAIJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAK4DACGlAggAAAAFpgIIAAAABQiZAggAAAABoAIIAAAAAaECCAAAAAGiAggAAAABowIIAAAAAaQCCACvAwAhpQIIAAAABaYCCAAAAAULEwAAsQMAIBYAALIDACAXAACyAwAgmQJAAAAAAaACQAAAAAGhAkAAAAABogJAAAAAAaMCQAAAAAGkAkAAsAMAIaUCQAAAAASmAkAAAAAECJkCAgAAAAGgAgIAAAABoQICAAAAAaICAgAAAAGjAgIAAAABpAICALEDACGlAgIAAAAEpgICAAAABAiZAkAAAAABoAJAAAAAAaECQAAAAAGiAkAAAAABowJAAAAAAaQCQACyAwAhpQJAAAAABKYCQAAAAAQNEwAAsQMAIBQAALQDACAVAACxAwAgFgAAsQMAIBcAALEDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgCzAwAhpQICAAAABKYCAgAAAAQImQIIAAAAAaACCAAAAAGhAggAAAABogIIAAAAAaMCCAAAAAGkAggAtAMAIaUCCAAAAASmAggAAAAEEo8CAAC1AwAwkAIAAJADABCRAgAAtQMAMJICAgCoAwAhkwICAKgDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIacCQACpAwAhqAIIAKoDACGpAggAqgMAIaoCCACqAwAhqwIIAKoDACGsAggAqgMAIa0CCACqAwAhrgIBALYDACGvAkAAtwMAIQ8TAACxAwAgFgAAuwMAIBcAALsDACCZAgEAAAABoAIBAAAAAaECAQAAAAGiAgEAAAABowIBAAAAAaQCAQC6AwAhpQIBAAAABKYCAQAAAASwAgEAAAABsQIBAAAAAbICAQAAAAGzAgEAAAABCxMAAKwDACAWAAC5AwAgFwAAuQMAIJkCQAAAAAGgAkAAAAABoQJAAAAAAaICQAAAAAGjAkAAAAABpAJAALgDACGlAkAAAAAFpgJAAAAABQsTAACsAwAgFgAAuQMAIBcAALkDACCZAkAAAAABoAJAAAAAAaECQAAAAAGiAkAAAAABowJAAAAAAaQCQAC4AwAhpQJAAAAABaYCQAAAAAUImQJAAAAAAaACQAAAAAGhAkAAAAABogJAAAAAAaMCQAAAAAGkAkAAuQMAIaUCQAAAAAWmAkAAAAAFDxMAALEDACAWAAC7AwAgFwAAuwMAIJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBALoDACGlAgEAAAAEpgIBAAAABLACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAEMmQIBAAAAAaACAQAAAAGhAgEAAAABogIBAAAAAaMCAQAAAAGkAgEAuwMAIaUCAQAAAASmAgEAAAAEsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAARSPAgAAvAMAMJACAAD8AgAQkQIAALwDADCSAgIAqAMAIZgCQACpAwAhtAIBALYDACG1AgEAtgMAIbYCAQC2AwAhtwIBALYDACG4AgEAvQMAIbkCAgCoAwAhugICAKgDACG7AgIAqAMAIbwCAgCoAwAhvQICAKgDACG-AgIAqAMAIb8CAgC-AwAhwAJAALcDACHBAiAAvwMAIcICQAC3AwAhDxMAAKwDACAWAADEAwAgFwAAxAMAIJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBAMMDACGlAgEAAAAFpgIBAAAABbACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAENEwAArAMAIBQAAK8DACAVAACsAwAgFgAArAMAIBcAAKwDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgDCAwAhpQICAAAABaYCAgAAAAUFEwAAsQMAIBYAAMEDACAXAADBAwAgmQIgAAAAAaQCIADAAwAhBRMAALEDACAWAADBAwAgFwAAwQMAIJkCIAAAAAGkAiAAwAMAIQKZAiAAAAABpAIgAMEDACENEwAArAMAIBQAAK8DACAVAACsAwAgFgAArAMAIBcAAKwDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgDCAwAhpQICAAAABaYCAgAAAAUPEwAArAMAIBYAAMQDACAXAADEAwAgmQIBAAAAAaACAQAAAAGhAgEAAAABogIBAAAAAaMCAQAAAAGkAgEAwwMAIaUCAQAAAAWmAgEAAAAFsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAAQyZAgEAAAABoAIBAAAAAaECAQAAAAGiAgEAAAABowIBAAAAAaQCAQDEAwAhpQIBAAAABaYCAQAAAAWwAgEAAAABsQIBAAAAAbICAQAAAAGzAgEAAAABB48CAADFAwAwkAIAAOgCABCRAgAAxQMAMJICAgCoAwAhmAJAAKkDACG1AgEAtgMAIbcCAQC2AwAhCNYBAADKAwAgjwIAAMYDADCQAgAA1wIAEJECAADGAwAwkgICAMcDACGYAkAAyQMAIbUCAQDIAwAhtwIBAMgDACEImQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAsQMAIaUCAgAAAASmAgIAAAAEDJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBALsDACGlAgEAAAAEpgIBAAAABLACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAEImQJAAAAAAaACQAAAAAGhAkAAAAABogJAAAAAAaMCQAAAAAGkAkAAsgMAIaUCQAAAAASmAkAAAAAEA8MCAADHAgAgxAIAAMcCACDFAgAAxwIAIAKTAgIAAAABlAJAAAAAAQvTAQAAzwMAII8CAADMAwAwkAIAAM8CABCRAgAAzAMAMJICAgDHAwAhkwICAMcDACGUAkAAyQMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhCJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAK8DACGlAggAAAAFpgIIAAAABQyZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEZ0gEAANcDACDUAQAA2AMAINUBAADZAwAgjwIAANMDADCQAgAAxwIAEJECAADTAwAwkgICAMcDACGYAkAAyQMAIbQCAQDIAwAhtQIBAMgDACG2AgEAyAMAIbcCAQDIAwAhuAIBANQDACG5AgIAxwMAIboCAgDHAwAhuwICAMcDACG8AgIAxwMAIb0CAgDHAwAhvgICAMcDACG_AgIA1QMAIcACQADSAwAhwQIgANYDACHCAkAA0gMAIY4DAADHAgAgjwMAAMcCACACkwICAAAAAacCQAAAAAET0wEAAM8DACCPAgAA0QMAMJACAADLAgAQkQIAANEDADCSAgIAxwMAIZMCAgDHAwAhlQIIAM0DACGWAggAzQMAIZcCAADOAwAgmAJAAMkDACGnAkAAyQMAIagCCADNAwAhqQIIAM0DACGqAggAzQMAIasCCADNAwAhrAIIAM0DACGtAggAzQMAIa4CAQDIAwAhrwJAANIDACEImQJAAAAAAaACQAAAAAGhAkAAAAABogJAAAAAAaMCQAAAAAGkAkAAuQMAIaUCQAAAAAWmAkAAAAAFF9IBAADXAwAg1AEAANgDACDVAQAA2QMAII8CAADTAwAwkAIAAMcCABCRAgAA0wMAMJICAgDHAwAhmAJAAMkDACG0AgEAyAMAIbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEMmQIBAAAAAaACAQAAAAGhAgEAAAABogIBAAAAAaMCAQAAAAGkAgEAxAMAIaUCAQAAAAWmAgEAAAAFsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAAQiZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgCsAwAhpQICAAAABaYCAgAAAAUCmQIgAAAAAaQCIADBAwAhCtYBAADKAwAgjwIAAMYDADCQAgAA1wIAEJECAADGAwAwkgICAMcDACGYAkAAyQMAIbUCAQDIAwAhtwIBAMgDACGOAwAA1wIAII8DAADXAgAgA8MCAADLAgAgxAIAAMsCACDFAgAAywIAIAPDAgAAzwIAIMQCAADPAgAgxQIAAM8CACAJjwIAANoDADCQAgAAwgIAEJECAADaAwAwkgICAKgDACHIAgEAtgMAIckCAQC2AwAhygIBALYDACHLAgEAtgMAIcwCQACpAwAhCY8CAADbAwAwkAIAALECABCRAgAA2wMAMJICAgDHAwAhyAIBAMgDACHJAgEAyAMAIcoCAQDIAwAhywIBAMgDACHMAkAAyQMAIQqPAgAA3AMAMJACAACrAgAQkQIAANwDADCSAgIAqAMAIZgCQACpAwAhpwJAAKkDACHNAgEAtgMAIc4CAQC2AwAhzwIIAN0DACHQAgEAtgMAIQ0TAACxAwAgFAAAtAMAIBUAALQDACAWAAC0AwAgFwAAtAMAIJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAN4DACGlAggAAAAEpgIIAAAABA0TAACxAwAgFAAAtAMAIBUAALQDACAWAAC0AwAgFwAAtAMAIJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAN4DACGlAggAAAAEpgIIAAAABAqPAgAA3wMAMJACAACaAgAQkQIAAN8DADCSAgIAxwMAIZgCQADJAwAhpwJAAMkDACHNAgEAyAMAIc4CAQDIAwAhzwIIAOADACHQAgEAyAMAIQiZAggAAAABoAIIAAAAAaECCAAAAAGiAggAAAABowIIAAAAAaQCCAC0AwAhpQIIAAAABKYCCAAAAAQDpwJAAAAAAc0CAQAAAAHOAgEAAAABCo8CAADiAwAwkAIAAJQCABCRAgAA4gMAMJICAgCoAwAhmAJAAKkDACHMAkAAqQMAIdICAQC2AwAh0wIBAL0DACHUAkAAqQMAIdUCAACrAwAgCo8CAADjAwAwkAIAAIMCABCRAgAA4wMAMJICAgDHAwAhmAJAAMkDACHMAkAAyQMAIdICAQDIAwAh0wIBANQDACHUAkAAyQMAIdUCAADOAwAgCI8CAADkAwAwkAIAAP0BABCRAgAA5AMAMJICAgCoAwAhmAJAAKkDACHMAkAAqQMAIdYCAQC2AwAh1wICAKgDACEIjwIAAOUDADCQAgAA7AEAEJECAADlAwAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh1gIBAMgDACHXAgIAxwMAIQyPAgAA5gMAMJACAADmAQAQkQIAAOYDADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHKAgEAtgMAIcwCQACpAwAh2AIBALYDACHZAgIAqAMAIdoCAQC2AwAh2wJAAKkDACEMjwIAAOcDADCQAgAA1QEAEJECAADnAwAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdgCAQDIAwAh2QICAMcDACHaAgEAyAMAIdsCQADJAwAhD48CAADoAwAwkAIAAM8BABCRAgAA6AMAMJICAgCoAwAhmAJAAKkDACHcAgEAtgMAId0CQACpAwAh3gIIAN0DACHfAgQA6QMAIeACCADdAwAh4QIEAOkDACHiAgQA6QMAIeMCBADpAwAh5AICAKgDACHlAgIAqAMAIQ0TAACxAwAgFAAAtAMAIBUAAOsDACAWAADrAwAgFwAA6wMAIJkCBAAAAAGgAgQAAAABoQIEAAAAAaICBAAAAAGjAgQAAAABpAIEAOoDACGlAgQAAAAEpgIEAAAABA0TAACxAwAgFAAAtAMAIBUAAOsDACAWAADrAwAgFwAA6wMAIJkCBAAAAAGgAgQAAAABoQIEAAAAAaICBAAAAAGjAgQAAAABpAIEAOoDACGlAgQAAAAEpgIEAAAABAiZAgQAAAABoAIEAAAAAaECBAAAAAGiAgQAAAABowIEAAAAAaQCBADrAwAhpQIEAAAABKYCBAAAAAQPjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAMcDACGYAkAAyQMAIdwCAQDIAwAh3QJAAMkDACHeAggA4AMAId8CBADtAwAh4AIIAOADACHhAgQA7QMAIeICBADtAwAh4wIEAO0DACHkAgIAxwMAIeUCAgDHAwAhCJkCBAAAAAGgAgQAAAABoQIEAAAAAaICBAAAAAGjAgQAAAABpAIEAOsDACGlAgQAAAAEpgIEAAAABALcAgEAAAAB3QJAAAAAARyPAgAA7wMAMJACAAC4AQAQkQIAAO8DADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHKAgEAtgMAIcwCQACpAwAh3AIBALYDACHiAgQA6QMAIeMCBADpAwAh5AICAKgDACHlAgIAqAMAIecCAQC2AwAh6AIBALYDACHpAgEAtgMAIeoCBADpAwAh6wIEAOkDACHsAgIAqAMAIe0CCADdAwAh7gIEAOkDACHvAgQA6QMAIfACCADdAwAh8QIIAN0DACHyAggA3QMAIfMCBADpAwAh9AIEAOkDACH1AkAAqQMAIRyPAgAA8AMAMJACAACnAQAQkQIAAPADADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHKAgEAyAMAIcwCQADJAwAh3AIBAMgDACHiAgQA7QMAIeMCBADtAwAh5AICAMcDACHlAgIAxwMAIecCAQDIAwAh6AIBAMgDACHpAgEAyAMAIeoCBADtAwAh6wIEAO0DACHsAgIAxwMAIe0CCADgAwAh7gIEAO0DACHvAgQA7QMAIfACCADgAwAh8QIIAOADACHyAggA4AMAIfMCBADtAwAh9AIEAO0DACH1AkAAyQMAIQ2PAgAA8QMAMJACAAChAQAQkQIAAPEDADCSAgIAqAMAIZgCQACpAwAh3QIBALYDACH2AgEAtgMAIfcCCADdAwAh-AIIAN0DACH5AgEAtgMAIfoCAQC2AwAh-wIIAN0DACH8AggA3QMAIQ2PAgAA8gMAMJACAACQAQAQkQIAAPIDADCSAgIAxwMAIZgCQADJAwAh3QIBAMgDACH2AgEAyAMAIfcCCADgAwAh-AIIAOADACH5AgEAyAMAIfoCAQDIAwAh-wIIAOADACH8AggA4AMAIQyPAgAA8wMAMJACAACKAQAQkQIAAPMDADCSAgIAqAMAIZgCQACpAwAh0AIBALYDACHYAgEAtgMAIf0CAQC2AwAh_gIBALYDACH_AgEAvQMAIYADQACpAwAhgQMCAKgDACEMjwIAAPQDADCQAgAAeQAQkQIAAPQDADCSAgIAxwMAIZgCQADJAwAh0AIBAMgDACHYAgEAyAMAIf0CAQDIAwAh_gIBAMgDACH_AgEA1AMAIYADQADJAwAhgQMCAMcDACEC_QIBAAAAAYADQAAAAAEJjwIAAPYDADCQAgAAcwAQkQIAAPYDADCSAgIAqAMAIZgCQACpAwAhzAJAAKkDACHdAgEAtgMAIYMDAgCoAwAhhAMIAN0DACENjwIAAPcDADCQAgAAXwAQkQIAAPcDADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHMAkAAqQMAIdACAQC2AwAh_QIBALYDACGFAwEAtgMAIYYDAQC2AwAhhwMBALYDACGIAyAAvwMAIQ43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIdACAQDIAwAh_QIBAMgDACGFAwEAyAMAIYYDAQDIAwAhhwMBAMgDACGIAyAA1gMAIQPDAgAASAAgxAIAAEgAIMUCAABIACAC3QIBAAAAAYMDAgAAAAEKNgAA_AMAII8CAAD7AwAwkAIAAEgAEJECAAD7AwAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhEDcAAPkDACCPAgAA-AMAMJACAABOABCRAgAA-AMAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAh0AIBAMgDACH9AgEAyAMAIYUDAQDIAwAhhgMBAMgDACGHAwEAyAMAIYgDIADWAwAhjgMAAE4AII8DAABOACAJCAAA_gMAII8CAAD9AwAwkAIAAEMAEJECAAD9AwAwkgICAKgDACGYAkAAqQMAIbcCAQC2AwAhzAJAAKkDACGKAwEAtgMAIQ8TAACxAwAgFgAA_wMAIBcAAP8DACCZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEMmQKAAAAAAZoCAQAAAAGbAgEAAAABnAIBAAAAAZ0CgAAAAAGeAoAAAAABnwKAAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAaMCgAAAAAGkAoAAAAABCQgAAIEEACCPAgAAgAQAMJACAAAyABCRAgAAgAQAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAhigMBAMgDACEMmQKAAAAAAZoCAQAAAAGbAgEAAAABnAIBAAAAAZ0CgAAAAAGeAoAAAAABnwKAAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAaMCgAAAAAGkAoAAAAABCo8CAACCBAAwkAIAACwAEJECAACCBAAwkgICAKgDACGYAkAAqQMAIacCAQC2AwAhzAJAAKkDACH9AgEAtgMAIf8CAQC2AwAhiwMBALYDACEKjwIAAIMEADCQAgAAGwAQkQIAAIMEADCSAgIAxwMAIZgCQADJAwAhpwIBAMgDACHMAkAAyQMAIf0CAQDIAwAh_wIBAMgDACGLAwEAyAMAIQmPAgAAhAQAMJACAAAVABCRAgAAhAQAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcwCQACpAwAhjAMBALYDACGNAwEAtgMAIQmPAgAAhQQAMJACAAAEABCRAgAAhQQAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAhjAMBAMgDACGNAwEAyAMAIQAAAAAAAAGTA0AAAAABBZMDCAAAAAGaAwgAAAABmwMIAAAAAZwDCAAAAAGdAwgAAAABBZMDAgAAAAGaAwIAAAABmwMCAAAAAZwDAgAAAAGdAwIAAAABBQ0AANYFACAOAADZBQAgkAMAANcFACCRAwAA2AUAIJYDAADJAgAgAw0AANYFACCQAwAA1wUAIJYDAADJAgAgAAAAAAABkwMBAAAAAQGTA0AAAAABBQ0AANEFACAOAADUBQAgkAMAANIFACCRAwAA0wUAIJYDAADJAgAgAw0AANEFACCQAwAA0gUAIJYDAADJAgAgAAAAAAABkwMBAAAAAQWTAwIAAAABmgMCAAAAAZsDAgAAAAGcAwIAAAABnQMCAAAAAQGTAyAAAAABBQ0AAMoFACAOAADPBQAgkAMAAMsFACCRAwAAzgUAIJYDAADFAgAgCw0AALEEADAOAAC2BAAwkAMAALIEADCRAwAAswQAMJIDAAC0BAAgkwMAALUEADCUAwAAtQQAMJUDAAC1BAAwlgMAALUEADCXAwAAtwQAMJgDAAC4BAAwCw0AAKUEADAOAACqBAAwkAMAAKYEADCRAwAApwQAMJIDAACoBAAgkwMAAKkEADCUAwAAqQQAMJUDAACpBAAwlgMAAKkEADCXAwAAqwQAMJgDAACsBAAwBpICAgAAAAGUAkAAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAQIAAADRAgAgDQAAsAQAIAMAAADRAgAgDQAAsAQAIA4AAK8EACABCAAAzQUAMAzTAQAAzwMAII8CAADMAwAwkAIAAM8CABCRAgAAzAMAMJICAgAAAAGTAgIAxwMAIZQCQADJAwAhlQIIAM0DACGWAggAzQMAIZcCAADOAwAgmAJAAMkDACHGAgAAywMAIAIAAADRAgAgCAAArwQAIAIAAACtBAAgCAAArgQAIAqPAgAArAQAMJACAACtBAAQkQIAAKwEADCSAgIAxwMAIZMCAgDHAwAhlAJAAMkDACGVAggAzQMAIZYCCADNAwAhlwIAAM4DACCYAkAAyQMAIQqPAgAArAQAMJACAACtBAAQkQIAAKwEADCSAgIAxwMAIZMCAgDHAwAhlAJAAMkDACGVAggAzQMAIZYCCADNAwAhlwIAAM4DACCYAkAAyQMAIQaSAgIAjgQAIZQCQACMBAAhlQIIAI0EACGWAggAjQQAIZcCgAAAAAGYAkAAjAQAIQaSAgIAjgQAIZQCQACMBAAhlQIIAI0EACGWAggAjQQAIZcCgAAAAAGYAkAAjAQAIQaSAgIAAAABlAJAAAAAAZUCCAAAAAGWAggAAAABlwKAAAAAAZgCQAAAAAEOkgICAAAAAZUCCAAAAAGWAggAAAABlwKAAAAAAZgCQAAAAAGnAkAAAAABqAIIAAAAAakCCAAAAAGqAggAAAABqwIIAAAAAawCCAAAAAGtAggAAAABrgIBAAAAAa8CQAAAAAECAAAAzQIAIA0AALwEACADAAAAzQIAIA0AALwEACAOAAC7BAAgAQgAAMwFADAU0wEAAM8DACCPAgAA0QMAMJACAADLAgAQkQIAANEDADCSAgIAAAABkwICAMcDACGVAggAzQMAIZYCCADNAwAhlwIAAM4DACCYAkAAyQMAIacCQADJAwAhqAIIAM0DACGpAggAzQMAIaoCCADNAwAhqwIIAM0DACGsAggAzQMAIa0CCADNAwAhrgIBAMgDACGvAkAA0gMAIccCAADQAwAgAgAAAM0CACAIAAC7BAAgAgAAALkEACAIAAC6BAAgEo8CAAC4BAAwkAIAALkEABCRAgAAuAQAMJICAgDHAwAhkwICAMcDACGVAggAzQMAIZYCCADNAwAhlwIAAM4DACCYAkAAyQMAIacCQADJAwAhqAIIAM0DACGpAggAzQMAIaoCCADNAwAhqwIIAM0DACGsAggAzQMAIa0CCADNAwAhrgIBAMgDACGvAkAA0gMAIRKPAgAAuAQAMJACAAC5BAAQkQIAALgEADCSAgIAxwMAIZMCAgDHAwAhlQIIAM0DACGWAggAzQMAIZcCAADOAwAgmAJAAMkDACGnAkAAyQMAIagCCADNAwAhqQIIAM0DACGqAggAzQMAIasCCADNAwAhrAIIAM0DACGtAggAzQMAIa4CAQDIAwAhrwJAANIDACEOkgICAI4EACGVAggAjQQAIZYCCACNBAAhlwKAAAAAAZgCQACMBAAhpwJAAIwEACGoAggAjQQAIakCCACNBAAhqgIIAI0EACGrAggAjQQAIawCCACNBAAhrQIIAI0EACGuAgEAlgQAIa8CQACXBAAhDpICAgCOBAAhlQIIAI0EACGWAggAjQQAIZcCgAAAAAGYAkAAjAQAIacCQACMBAAhqAIIAI0EACGpAggAjQQAIaoCCACNBAAhqwIIAI0EACGsAggAjQQAIa0CCACNBAAhrgIBAJYEACGvAkAAlwQAIQ6SAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQMNAADKBQAgkAMAAMsFACCWAwAAxQIAIAQNAACxBAAwkAMAALIEADCSAwAAtAQAIJYDAAC1BAAwBA0AAKUEADCQAwAApgQAMJIDAACoBAAglgMAAKkEADAAAAAAAAsNAADGBAAwDgAAywQAMJADAADHBAAwkQMAAMgEADCSAwAAyQQAIJMDAADKBAAwlAMAAMoEADCVAwAAygQAMJYDAADKBAAwlwMAAMwEADCYAwAAzQQAMBLUAQAAvgQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQIAAADJAgAgDQAA0QQAIAMAAADJAgAgDQAA0QQAIA4AANAEACABCAAAyQUAMBfSAQAA1wMAINQBAADYAwAg1QEAANkDACCPAgAA0wMAMJACAADHAgAQkQIAANMDADCSAgIAAAABmAJAAMkDACG0AgEAAAABtQIBAMgDACG2AgEAyAMAIbcCAQDIAwAhuAIBANQDACG5AgIAxwMAIboCAgDHAwAhuwICAMcDACG8AgIAxwMAIb0CAgDHAwAhvgICAMcDACG_AgIA1QMAIcACQADSAwAhwQIgANYDACHCAkAA0gMAIQIAAADJAgAgCAAA0AQAIAIAAADOBAAgCAAAzwQAIBSPAgAAzQQAMJACAADOBAAQkQIAAM0EADCSAgIAxwMAIZgCQADJAwAhtAIBAMgDACG1AgEAyAMAIbYCAQDIAwAhtwIBAMgDACG4AgEA1AMAIbkCAgDHAwAhugICAMcDACG7AgIAxwMAIbwCAgDHAwAhvQICAMcDACG-AgIAxwMAIb8CAgDVAwAhwAJAANIDACHBAiAA1gMAIcICQADSAwAhFI8CAADNBAAwkAIAAM4EABCRAgAAzQQAMJICAgDHAwAhmAJAAMkDACG0AgEAyAMAIbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEQkgICAI4EACGYAkAAjAQAIbQCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACES1AEAAKMEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhEtQBAAC-BAAg1QEAAL8EACCSAgIAAAABmAJAAAAAAbQCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgIAAAABugICAAAAAbsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIAAAABwAJAAAAAAcECIAAAAAHCAkAAAAABBA0AAMYEADCQAwAAxwQAMJIDAADJBAAglgMAAMoEADAAAbMCAQAAAAEI0gEAANcEACDUAQAA2AQAINUBAADZBAAguAIAAIYEACC_AgAAhgQAIMACAACGBAAgwgIAAIYEACCZAwAA2gQAIAGzAgEAAAABAtYBAADTBAAgmQMAANQEACAAAAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAABZMDCAAAAAGaAwgAAAABmwMIAAAAAZwDCAAAAAGdAwgAAAABAbMCAQAAAAEAAAAAAAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAWTAwQAAAABmgMEAAAAAZsDBAAAAAGcAwQAAAABnQMEAAAAAQGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAGzAgEAAAABAAAAAAAFDQAAxAUAIA4AAMcFACCQAwAAxQUAIJEDAADGBQAglgMAAEYAIAMNAADEBQAgkAMAAMUFACCWAwAARgAgAAAAAAALDQAAoAUAMA4AAKUFADCQAwAAoQUAMJEDAACiBQAwkgMAAKMFACCTAwAApAUAMJQDAACkBQAwlQMAAKQFADCWAwAApAUAMJcDAACmBQAwmAMAAKcFADAFkgICAAAAAZgCQAAAAAHMAkAAAAAB3QIBAAAAAYQDCAAAAAECAAAASgAgDQAAqwUAIAMAAABKACANAACrBQAgDgAAqgUAIAEIAADDBQAwCzYAAPwDACCPAgAA-wMAMJACAABIABCRAgAA-wMAMJICAgAAAAGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhiQMAAPoDACACAAAASgAgCAAAqgUAIAIAAACoBQAgCAAAqQUAIAmPAgAApwUAMJACAACoBQAQkQIAAKcFADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHdAgEAyAMAIYMDAgDHAwAhhAMIAOADACEJjwIAAKcFADCQAgAAqAUAEJECAACnBQAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhBZICAgCOBAAhmAJAAIwEACHMAkAAjAQAId0CAQCWBAAhhAMIAOYEACEFkgICAI4EACGYAkAAjAQAIcwCQACMBAAh3QIBAJYEACGEAwgA5gQAIQWSAgIAAAABmAJAAAAAAcwCQAAAAAHdAgEAAAABhAMIAAAAAQQNAACgBQAwkAMAAKEFADCSAwAAowUAIJYDAACkBQAwAAGzAgEAAAABAjcAAK0FACCZAwAArgUAIAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAGzAgEAAAABBZICAgAAAAGYAkAAAAABzAJAAAAAAd0CAQAAAAGEAwgAAAABCpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAECAAAARgAgDQAAxAUAIAMAAABOACANAADEBQAgDgAAyAUAIAwAAABOACAIAADIBQAgkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACEKkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACEQkgICAAAAAZgCQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQSSAgIAAAABmAJAAAAAAbUCAQAAAAG3AgEAAAABAgAAAMUCACANAADKBQAgDpICAgAAAAGVAggAAAABlgIIAAAAAZcCgAAAAAGYAkAAAAABpwJAAAAAAagCCAAAAAGpAggAAAABqgIIAAAAAasCCAAAAAGsAggAAAABrQIIAAAAAa4CAQAAAAGvAkAAAAABBpICAgAAAAGUAkAAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAQMAAADXAgAgDQAAygUAIA4AANAFACAGAAAA1wIAIAgAANAFACCSAgIAjgQAIZgCQACMBAAhtQIBAJYEACG3AgEAlgQAIQSSAgIAjgQAIZgCQACMBAAhtQIBAJYEACG3AgEAlgQAIRPSAQAAvQQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAgAAAAG6AgIAAAABuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgAAAAHAAkAAAAABwQIgAAAAAcICQAAAAAECAAAAyQIAIA0AANEFACADAAAAxwIAIA0AANEFACAOAADVBQAgFQAAAMcCACAIAADVBQAg0gEAAKIEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACET0gEAAKIEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACET0gEAAL0EACDUAQAAvgQAIJICAgAAAAGYAkAAAAABtAIBAAAAAbUCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgIAAAABugICAAAAAbsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIAAAABwAJAAAAAAcECIAAAAAHCAkAAAAABAgAAAMkCACANAADWBQAgAwAAAMcCACANAADWBQAgDgAA2gUAIBUAAADHAgAgCAAA2gUAINIBAACiBAAg1AEAAKMEACCSAgIAjgQAIZgCQACMBAAhtAIBAJYEACG1AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhE9IBAACiBAAg1AEAAKMEACCSAgIAjgQAIZgCQACMBAAhtAIBAJYEACG1AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhAAAFEwAEFAAFFQAGFgAHFwAIAAAAAAAFEwAEFAAFFQAGFgAHFwAIAAUTAAwUAA0VAA4WAA8XABAAAAAAAAUTAAwUAA0VAA4WAA8XABAABRMAFBQAFRUAFhYAFxcAGAAAAAAABRMAFBQAFRUAFhYAFxcAGAITABw3SxsBNgAaATdMAAUTAB4UAB8VACAWACEXACIAAAAAAAUTAB4UAB8VACAWACEXACIFEwAlFAAmFQAnFgAoFwApAAAAAAAFEwAlFAAmFQAnFgAoFwApAAUTAC0UAC4VAC8WADAXADEAAAAAAAUTAC0UAC4VAC8WADAXADEABRMANRQANhUANxYAOBcAOQAAAAAABRMANRQANhUANxYAOBcAOQAFEwA9FAA-FQA_FgBAFwBBAAAAAAAFEwA9FAA-FQA_FgBAFwBBAAUTAEUUAEYVAEcWAEgXAEkAAAAAAAUTAEUUAEYVAEcWAEgXAEkABRMATRQAThUATxYAUBcAUQAAAAAABRMATRQAThUATxYAUBcAUQAFEwBVFABWFQBXFgBYFwBZAAAAAAAFEwBVFABWFQBXFgBYFwBZAAUTAF0UAF4VAF8WAGAXAGEAAAAAAAUTAF0UAF4VAF8WAGAXAGEABRMAZRQAZhUAZxYAaBcAaQAAAAAABRMAZRQAZhUAZxYAaBcAaQAFEwBtFABuFQBvFgBwFwBxAAAAAAAFEwBtFABuFQBvFgBwFwBxAhMAeNYBygJ0BBMAd9IBAHPUAc4CddUB0gJ2AdMBAHQB0wEAdALUAdMCANUB1AIAAdYB1QIABRMAehQAexUAfBYAfRcAfgAAAAAABRMAehQAexUAfBYAfRcAfgUTAIEBFACCARUAgwEWAIQBFwCFAQAAAAAABRMAgQEUAIIBFQCDARYAhAEXAIUBBRMAiAEUAIkBFQCKARYAiwEXAIwBAAAAAAAFEwCIARQAiQEVAIoBFgCLARcAjAEFEwCPARQAkAEVAJEBFgCSARcAkwEAAAAAAAUTAI8BFACQARUAkQEWAJIBFwCTAQECAQIDAQUGAQYHAQcIAQkKAQoMAgsOAQwQAg8RARASARETAhgWAxkXCRoZChsaChwdCh0eCh4fCh8hCiAjAiElCiInAiMoCiQpCiUqAiYtCycuESgwEikxEio0Eis1Eiw2Ei04Ei46Ai88EjA-AjE_EjJAEjNBAjREEzVFGThHGjlNGjpQGjtRGjxSGj1UGj5WAj9YGkBaAkFbGkJcGkNdAkRgHUVhI0ZiG0djG0hkG0llG0pmG0toG0xqAk1sG05uAk9vG1BwG1FxAlJ0JFN1KlR3K1V4K1Z7K1d8K1h9K1l_K1qBAQJbgwErXIUBAl2GAStehwErX4gBAmCLASxhjAEyYo4BM2OPATNkkgEzZZMBM2aUATNnlgEzaJgBAmmaATNqnAECa50BM2yeATNtnwECbqIBNG-jATpwpQE7caYBO3KpATtzqgE7dKsBO3WtATt2rwECd7EBO3izAQJ5tAE7erUBO3u2AQJ8uQE8fboBQn68AUN_vQFDgAHAAUOBAcEBQ4IBwgFDgwHEAUOEAcYBAoUByAFDhgHKAQKHAcsBQ4gBzAFDiQHNAQKKAdABRIsB0QFKjAHTAUuNAdQBS44B1wFLjwHYAUuQAdkBS5EB2wFLkgHdAQKTAd8BS5QB4QEClQHiAUuWAeMBS5cB5AECmAHnAUyZAegBUpoB6gFTmwHrAVOcAe4BU50B7wFTngHwAVOfAfIBU6AB9AECoQH2AVOiAfgBAqMB-QFTpAH6AVOlAfsBAqYB_gFUpwH_AVqoAYECW6kBggJbqgGFAlurAYYCW6wBhwJbrQGJAluuAYsCAq8BjQJbsAGPAgKxAZACW7IBkQJbswGSAgK0AZUCXLUBlgJitgGYAmO3AZkCY7gBnAJjuQGdAmO6AZ4CY7sBoAJjvAGiAgK9AaQCY74BpgICvwGnAmPAAagCY8EBqQICwgGsAmTDAa0CasQBrwJrxQGwAmvGAbMCa8cBtAJryAG1AmvJAbcCa8oBuQICywG7AmvMAb0CAs0BvgJrzgG_AmvPAcACAtABwwJs0QHEAnLXAcYCc9gB1gJz2QHZAnPaAdoCc9sB2wJz3AHdAnPdAd8CAt4B4QJz3wHjAgLgAeQCc-EB5QJz4gHmAgLjAekCeeQB6gJ_5QHrAnTmAewCdOcB7QJ06AHuAnTpAe8CdOoB8QJ06wHzAgLsAfUCdO0B9wIC7gH4AnTvAfkCdPAB-gIC8QH9AoAB8gH-AoYB8wH_AnX0AYADdfUBgQN19gGCA3X3AYMDdfgBhQN1-QGHAwL6AYkDdfsBiwMC_AGMA3X9AY0Ddf4BjgMC_wGRA4cBgAKSA40BgQKTA3aCApQDdoMClQN2hAKWA3aFApcDdoYCmQN2hwKbAwKIAp0DdokCnwMCigKgA3aLAqEDdowCogMCjQKlA44BjgKmA5QB" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -317,6 +317,56 @@ export interface PrismaClient< * ``` */ get oilPriceHistory(): Prisma.OilPriceHistoryDelegate; + + /** + * `prisma.mihomeAccount`: Exposes CRUD operations for the **MihomeAccount** model. + * Example usage: + * ```ts + * // Fetch zero or more MihomeAccounts + * const mihomeAccounts = await prisma.mihomeAccount.findMany() + * ``` + */ + get mihomeAccount(): Prisma.MihomeAccountDelegate; + + /** + * `prisma.mihomeHome`: Exposes CRUD operations for the **MihomeHome** model. + * Example usage: + * ```ts + * // Fetch zero or more MihomeHomes + * const mihomeHomes = await prisma.mihomeHome.findMany() + * ``` + */ + get mihomeHome(): Prisma.MihomeHomeDelegate; + + /** + * `prisma.mihomeDevice`: Exposes CRUD operations for the **MihomeDevice** model. + * Example usage: + * ```ts + * // Fetch zero or more MihomeDevices + * const mihomeDevices = await prisma.mihomeDevice.findMany() + * ``` + */ + get mihomeDevice(): Prisma.MihomeDeviceDelegate; + + /** + * `prisma.mihomeEnvSample`: Exposes CRUD operations for the **MihomeEnvSample** model. + * Example usage: + * ```ts + * // Fetch zero or more MihomeEnvSamples + * const mihomeEnvSamples = await prisma.mihomeEnvSample.findMany() + * ``` + */ + get mihomeEnvSample(): Prisma.MihomeEnvSampleDelegate; + + /** + * `prisma.mihomeEnvHour`: Exposes CRUD operations for the **MihomeEnvHour** model. + * Example usage: + * ```ts + * // Fetch zero or more MihomeEnvHours + * const mihomeEnvHours = await prisma.mihomeEnvHour.findMany() + * ``` + */ + get mihomeEnvHour(): Prisma.MihomeEnvHourDelegate; } export function getPrismaClientClass(): PrismaClientConstructor { diff --git a/generated/prisma/internal/prismaNamespace.ts b/generated/prisma/internal/prismaNamespace.ts index 61326f2..2a1166a 100644 --- a/generated/prisma/internal/prismaNamespace.ts +++ b/generated/prisma/internal/prismaNamespace.ts @@ -396,7 +396,12 @@ export const ModelName = { ServiceCheck: 'ServiceCheck', Econ_SowInventory: 'Econ_SowInventory', ScraperCache: 'ScraperCache', - OilPriceHistory: 'OilPriceHistory' + OilPriceHistory: 'OilPriceHistory', + MihomeAccount: 'MihomeAccount', + MihomeHome: 'MihomeHome', + MihomeDevice: 'MihomeDevice', + MihomeEnvSample: 'MihomeEnvSample', + MihomeEnvHour: 'MihomeEnvHour' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -412,7 +417,7 @@ export type TypeMap + fields: Prisma.MihomeAccountFieldRefs + operations: { + findUnique: { + args: Prisma.MihomeAccountFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.MihomeAccountFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.MihomeAccountFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.MihomeAccountFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.MihomeAccountFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.MihomeAccountCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.MihomeAccountCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.MihomeAccountDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.MihomeAccountUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.MihomeAccountDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.MihomeAccountUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.MihomeAccountUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.MihomeAccountAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.MihomeAccountGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.MihomeAccountCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + MihomeHome: { + payload: Prisma.$MihomeHomePayload + fields: Prisma.MihomeHomeFieldRefs + operations: { + findUnique: { + args: Prisma.MihomeHomeFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.MihomeHomeFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.MihomeHomeFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.MihomeHomeFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.MihomeHomeFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.MihomeHomeCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.MihomeHomeCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.MihomeHomeDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.MihomeHomeUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.MihomeHomeDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.MihomeHomeUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.MihomeHomeUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.MihomeHomeAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.MihomeHomeGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.MihomeHomeCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + MihomeDevice: { + payload: Prisma.$MihomeDevicePayload + fields: Prisma.MihomeDeviceFieldRefs + operations: { + findUnique: { + args: Prisma.MihomeDeviceFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.MihomeDeviceFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.MihomeDeviceFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.MihomeDeviceFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.MihomeDeviceFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.MihomeDeviceCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.MihomeDeviceCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.MihomeDeviceDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.MihomeDeviceUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.MihomeDeviceDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.MihomeDeviceUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.MihomeDeviceUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.MihomeDeviceAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.MihomeDeviceGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.MihomeDeviceCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + MihomeEnvSample: { + payload: Prisma.$MihomeEnvSamplePayload + fields: Prisma.MihomeEnvSampleFieldRefs + operations: { + findUnique: { + args: Prisma.MihomeEnvSampleFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.MihomeEnvSampleFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.MihomeEnvSampleFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.MihomeEnvSampleFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.MihomeEnvSampleFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.MihomeEnvSampleCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.MihomeEnvSampleCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.MihomeEnvSampleDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.MihomeEnvSampleUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.MihomeEnvSampleDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.MihomeEnvSampleUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.MihomeEnvSampleUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.MihomeEnvSampleAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.MihomeEnvSampleGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.MihomeEnvSampleCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + MihomeEnvHour: { + payload: Prisma.$MihomeEnvHourPayload + fields: Prisma.MihomeEnvHourFieldRefs + operations: { + findUnique: { + args: Prisma.MihomeEnvHourFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.MihomeEnvHourFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.MihomeEnvHourFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.MihomeEnvHourFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.MihomeEnvHourFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.MihomeEnvHourCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.MihomeEnvHourCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.MihomeEnvHourDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.MihomeEnvHourUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.MihomeEnvHourDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.MihomeEnvHourUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.MihomeEnvHourUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.MihomeEnvHourAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.MihomeEnvHourGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.MihomeEnvHourCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } } } & { other: { @@ -1510,6 +1845,85 @@ export const OilPriceHistoryScalarFieldEnum = { export type OilPriceHistoryScalarFieldEnum = (typeof OilPriceHistoryScalarFieldEnum)[keyof typeof OilPriceHistoryScalarFieldEnum] +export const MihomeAccountScalarFieldEnum = { + id: 'id', + key: 'key', + userId: 'userId', + status: 'status', + lastError: 'lastError', + updatedAt: 'updatedAt' +} as const + +export type MihomeAccountScalarFieldEnum = (typeof MihomeAccountScalarFieldEnum)[keyof typeof MihomeAccountScalarFieldEnum] + + +export const MihomeHomeScalarFieldEnum = { + id: 'id', + homeId: 'homeId', + name: 'name', + createdAt: 'createdAt' +} as const + +export type MihomeHomeScalarFieldEnum = (typeof MihomeHomeScalarFieldEnum)[keyof typeof MihomeHomeScalarFieldEnum] + + +export const MihomeDeviceScalarFieldEnum = { + id: 'id', + did: 'did', + homeId: 'homeId', + model: 'model', + name: 'name', + alias: 'alias', + tempSiid: 'tempSiid', + tempPiid: 'tempPiid', + humSiid: 'humSiid', + humPiid: 'humPiid', + battSiid: 'battSiid', + battPiid: 'battPiid', + battery: 'battery', + batteryAt: 'batteryAt', + enabled: 'enabled', + lastSyncAt: 'lastSyncAt', + createdAt: 'createdAt' +} as const + +export type MihomeDeviceScalarFieldEnum = (typeof MihomeDeviceScalarFieldEnum)[keyof typeof MihomeDeviceScalarFieldEnum] + + +export const MihomeEnvSampleScalarFieldEnum = { + id: 'id', + deviceId: 'deviceId', + date: 'date', + temperature: 'temperature', + humidity: 'humidity', + temperatureAvg: 'temperatureAvg', + humidityAvg: 'humidityAvg', + temperatureMin: 'temperatureMin', + temperatureMax: 'temperatureMax', + humidityMin: 'humidityMin', + humidityMax: 'humidityMax', + origin: 'origin', + sampledAt: 'sampledAt', + raw: 'raw', + createdAt: 'createdAt' +} as const + +export type MihomeEnvSampleScalarFieldEnum = (typeof MihomeEnvSampleScalarFieldEnum)[keyof typeof MihomeEnvSampleScalarFieldEnum] + + +export const MihomeEnvHourScalarFieldEnum = { + id: 'id', + deviceId: 'deviceId', + hour: 'hour', + temperatureAvg: 'temperatureAvg', + humidityAvg: 'humidityAvg', + raw: 'raw', + createdAt: 'createdAt' +} as const + +export type MihomeEnvHourScalarFieldEnum = (typeof MihomeEnvHourScalarFieldEnum)[keyof typeof MihomeEnvHourScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -1678,6 +2092,42 @@ export const OilPriceHistoryOrderByRelevanceFieldEnum = { export type OilPriceHistoryOrderByRelevanceFieldEnum = (typeof OilPriceHistoryOrderByRelevanceFieldEnum)[keyof typeof OilPriceHistoryOrderByRelevanceFieldEnum] +export const MihomeAccountOrderByRelevanceFieldEnum = { + key: 'key', + userId: 'userId', + status: 'status', + lastError: 'lastError' +} as const + +export type MihomeAccountOrderByRelevanceFieldEnum = (typeof MihomeAccountOrderByRelevanceFieldEnum)[keyof typeof MihomeAccountOrderByRelevanceFieldEnum] + + +export const MihomeHomeOrderByRelevanceFieldEnum = { + homeId: 'homeId', + name: 'name' +} as const + +export type MihomeHomeOrderByRelevanceFieldEnum = (typeof MihomeHomeOrderByRelevanceFieldEnum)[keyof typeof MihomeHomeOrderByRelevanceFieldEnum] + + +export const MihomeDeviceOrderByRelevanceFieldEnum = { + did: 'did', + homeId: 'homeId', + model: 'model', + name: 'name', + alias: 'alias' +} as const + +export type MihomeDeviceOrderByRelevanceFieldEnum = (typeof MihomeDeviceOrderByRelevanceFieldEnum)[keyof typeof MihomeDeviceOrderByRelevanceFieldEnum] + + +export const MihomeEnvSampleOrderByRelevanceFieldEnum = { + origin: 'origin' +} as const + +export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum] + + /** * Field references @@ -1847,6 +2297,11 @@ export type GlobalOmitConfig = { econ_SowInventory?: Prisma.Econ_SowInventoryOmit scraperCache?: Prisma.ScraperCacheOmit oilPriceHistory?: Prisma.OilPriceHistoryOmit + mihomeAccount?: Prisma.MihomeAccountOmit + mihomeHome?: Prisma.MihomeHomeOmit + mihomeDevice?: Prisma.MihomeDeviceOmit + mihomeEnvSample?: Prisma.MihomeEnvSampleOmit + mihomeEnvHour?: Prisma.MihomeEnvHourOmit } /* Types for Logging */ diff --git a/generated/prisma/internal/prismaNamespaceBrowser.ts b/generated/prisma/internal/prismaNamespaceBrowser.ts index 957cf8e..96969ba 100644 --- a/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -63,7 +63,12 @@ export const ModelName = { ServiceCheck: 'ServiceCheck', Econ_SowInventory: 'Econ_SowInventory', ScraperCache: 'ScraperCache', - OilPriceHistory: 'OilPriceHistory' + OilPriceHistory: 'OilPriceHistory', + MihomeAccount: 'MihomeAccount', + MihomeHome: 'MihomeHome', + MihomeDevice: 'MihomeDevice', + MihomeEnvSample: 'MihomeEnvSample', + MihomeEnvHour: 'MihomeEnvHour' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -279,6 +284,85 @@ export const OilPriceHistoryScalarFieldEnum = { export type OilPriceHistoryScalarFieldEnum = (typeof OilPriceHistoryScalarFieldEnum)[keyof typeof OilPriceHistoryScalarFieldEnum] +export const MihomeAccountScalarFieldEnum = { + id: 'id', + key: 'key', + userId: 'userId', + status: 'status', + lastError: 'lastError', + updatedAt: 'updatedAt' +} as const + +export type MihomeAccountScalarFieldEnum = (typeof MihomeAccountScalarFieldEnum)[keyof typeof MihomeAccountScalarFieldEnum] + + +export const MihomeHomeScalarFieldEnum = { + id: 'id', + homeId: 'homeId', + name: 'name', + createdAt: 'createdAt' +} as const + +export type MihomeHomeScalarFieldEnum = (typeof MihomeHomeScalarFieldEnum)[keyof typeof MihomeHomeScalarFieldEnum] + + +export const MihomeDeviceScalarFieldEnum = { + id: 'id', + did: 'did', + homeId: 'homeId', + model: 'model', + name: 'name', + alias: 'alias', + tempSiid: 'tempSiid', + tempPiid: 'tempPiid', + humSiid: 'humSiid', + humPiid: 'humPiid', + battSiid: 'battSiid', + battPiid: 'battPiid', + battery: 'battery', + batteryAt: 'batteryAt', + enabled: 'enabled', + lastSyncAt: 'lastSyncAt', + createdAt: 'createdAt' +} as const + +export type MihomeDeviceScalarFieldEnum = (typeof MihomeDeviceScalarFieldEnum)[keyof typeof MihomeDeviceScalarFieldEnum] + + +export const MihomeEnvSampleScalarFieldEnum = { + id: 'id', + deviceId: 'deviceId', + date: 'date', + temperature: 'temperature', + humidity: 'humidity', + temperatureAvg: 'temperatureAvg', + humidityAvg: 'humidityAvg', + temperatureMin: 'temperatureMin', + temperatureMax: 'temperatureMax', + humidityMin: 'humidityMin', + humidityMax: 'humidityMax', + origin: 'origin', + sampledAt: 'sampledAt', + raw: 'raw', + createdAt: 'createdAt' +} as const + +export type MihomeEnvSampleScalarFieldEnum = (typeof MihomeEnvSampleScalarFieldEnum)[keyof typeof MihomeEnvSampleScalarFieldEnum] + + +export const MihomeEnvHourScalarFieldEnum = { + id: 'id', + deviceId: 'deviceId', + hour: 'hour', + temperatureAvg: 'temperatureAvg', + humidityAvg: 'humidityAvg', + raw: 'raw', + createdAt: 'createdAt' +} as const + +export type MihomeEnvHourScalarFieldEnum = (typeof MihomeEnvHourScalarFieldEnum)[keyof typeof MihomeEnvHourScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -446,3 +530,39 @@ export const OilPriceHistoryOrderByRelevanceFieldEnum = { export type OilPriceHistoryOrderByRelevanceFieldEnum = (typeof OilPriceHistoryOrderByRelevanceFieldEnum)[keyof typeof OilPriceHistoryOrderByRelevanceFieldEnum] + +export const MihomeAccountOrderByRelevanceFieldEnum = { + key: 'key', + userId: 'userId', + status: 'status', + lastError: 'lastError' +} as const + +export type MihomeAccountOrderByRelevanceFieldEnum = (typeof MihomeAccountOrderByRelevanceFieldEnum)[keyof typeof MihomeAccountOrderByRelevanceFieldEnum] + + +export const MihomeHomeOrderByRelevanceFieldEnum = { + homeId: 'homeId', + name: 'name' +} as const + +export type MihomeHomeOrderByRelevanceFieldEnum = (typeof MihomeHomeOrderByRelevanceFieldEnum)[keyof typeof MihomeHomeOrderByRelevanceFieldEnum] + + +export const MihomeDeviceOrderByRelevanceFieldEnum = { + did: 'did', + homeId: 'homeId', + model: 'model', + name: 'name', + alias: 'alias' +} as const + +export type MihomeDeviceOrderByRelevanceFieldEnum = (typeof MihomeDeviceOrderByRelevanceFieldEnum)[keyof typeof MihomeDeviceOrderByRelevanceFieldEnum] + + +export const MihomeEnvSampleOrderByRelevanceFieldEnum = { + origin: 'origin' +} as const + +export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum] + diff --git a/generated/prisma/models.ts b/generated/prisma/models.ts index 2396f9c..05ae935 100644 --- a/generated/prisma/models.ts +++ b/generated/prisma/models.ts @@ -21,4 +21,9 @@ export type * from './models/ServiceCheck.ts' export type * from './models/Econ_SowInventory.ts' export type * from './models/ScraperCache.ts' export type * from './models/OilPriceHistory.ts' +export type * from './models/MihomeAccount.ts' +export type * from './models/MihomeHome.ts' +export type * from './models/MihomeDevice.ts' +export type * from './models/MihomeEnvSample.ts' +export type * from './models/MihomeEnvHour.ts' export type * from './commonInputTypes.ts' \ No newline at end of file diff --git a/generated/prisma/models/MihomeAccount.ts b/generated/prisma/models/MihomeAccount.ts new file mode 100644 index 0000000..e0452c3 --- /dev/null +++ b/generated/prisma/models/MihomeAccount.ts @@ -0,0 +1,1110 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `MihomeAccount` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model MihomeAccount + * + */ +export type MihomeAccountModel = runtime.Types.Result.DefaultSelection + +export type AggregateMihomeAccount = { + _count: MihomeAccountCountAggregateOutputType | null + _avg: MihomeAccountAvgAggregateOutputType | null + _sum: MihomeAccountSumAggregateOutputType | null + _min: MihomeAccountMinAggregateOutputType | null + _max: MihomeAccountMaxAggregateOutputType | null +} + +export type MihomeAccountAvgAggregateOutputType = { + id: number | null +} + +export type MihomeAccountSumAggregateOutputType = { + id: number | null +} + +export type MihomeAccountMinAggregateOutputType = { + id: number | null + key: string | null + userId: string | null + status: string | null + lastError: string | null + updatedAt: Date | null +} + +export type MihomeAccountMaxAggregateOutputType = { + id: number | null + key: string | null + userId: string | null + status: string | null + lastError: string | null + updatedAt: Date | null +} + +export type MihomeAccountCountAggregateOutputType = { + id: number + key: number + userId: number + status: number + lastError: number + updatedAt: number + _all: number +} + + +export type MihomeAccountAvgAggregateInputType = { + id?: true +} + +export type MihomeAccountSumAggregateInputType = { + id?: true +} + +export type MihomeAccountMinAggregateInputType = { + id?: true + key?: true + userId?: true + status?: true + lastError?: true + updatedAt?: true +} + +export type MihomeAccountMaxAggregateInputType = { + id?: true + key?: true + userId?: true + status?: true + lastError?: true + updatedAt?: true +} + +export type MihomeAccountCountAggregateInputType = { + id?: true + key?: true + userId?: true + status?: true + lastError?: true + updatedAt?: true + _all?: true +} + +export type MihomeAccountAggregateArgs = { + /** + * Filter which MihomeAccount to aggregate. + */ + where?: Prisma.MihomeAccountWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeAccounts to fetch. + */ + orderBy?: Prisma.MihomeAccountOrderByWithRelationInput | Prisma.MihomeAccountOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.MihomeAccountWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeAccounts from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeAccounts. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned MihomeAccounts + **/ + _count?: true | MihomeAccountCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: MihomeAccountAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: MihomeAccountSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: MihomeAccountMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: MihomeAccountMaxAggregateInputType +} + +export type GetMihomeAccountAggregateType = { + [P in keyof T & keyof AggregateMihomeAccount]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type MihomeAccountGroupByArgs = { + where?: Prisma.MihomeAccountWhereInput + orderBy?: Prisma.MihomeAccountOrderByWithAggregationInput | Prisma.MihomeAccountOrderByWithAggregationInput[] + by: Prisma.MihomeAccountScalarFieldEnum[] | Prisma.MihomeAccountScalarFieldEnum + having?: Prisma.MihomeAccountScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: MihomeAccountCountAggregateInputType | true + _avg?: MihomeAccountAvgAggregateInputType + _sum?: MihomeAccountSumAggregateInputType + _min?: MihomeAccountMinAggregateInputType + _max?: MihomeAccountMaxAggregateInputType +} + +export type MihomeAccountGroupByOutputType = { + id: number + key: string + userId: string + status: string + lastError: string + updatedAt: Date + _count: MihomeAccountCountAggregateOutputType | null + _avg: MihomeAccountAvgAggregateOutputType | null + _sum: MihomeAccountSumAggregateOutputType | null + _min: MihomeAccountMinAggregateOutputType | null + _max: MihomeAccountMaxAggregateOutputType | null +} + +export type GetMihomeAccountGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof MihomeAccountGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type MihomeAccountWhereInput = { + AND?: Prisma.MihomeAccountWhereInput | Prisma.MihomeAccountWhereInput[] + OR?: Prisma.MihomeAccountWhereInput[] + NOT?: Prisma.MihomeAccountWhereInput | Prisma.MihomeAccountWhereInput[] + id?: Prisma.IntFilter<"MihomeAccount"> | number + key?: Prisma.StringFilter<"MihomeAccount"> | string + userId?: Prisma.StringFilter<"MihomeAccount"> | string + status?: Prisma.StringFilter<"MihomeAccount"> | string + lastError?: Prisma.StringFilter<"MihomeAccount"> | string + updatedAt?: Prisma.DateTimeFilter<"MihomeAccount"> | Date | string +} + +export type MihomeAccountOrderByWithRelationInput = { + id?: Prisma.SortOrder + key?: Prisma.SortOrder + userId?: Prisma.SortOrder + status?: Prisma.SortOrder + lastError?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _relevance?: Prisma.MihomeAccountOrderByRelevanceInput +} + +export type MihomeAccountWhereUniqueInput = Prisma.AtLeast<{ + id?: number + key?: string + AND?: Prisma.MihomeAccountWhereInput | Prisma.MihomeAccountWhereInput[] + OR?: Prisma.MihomeAccountWhereInput[] + NOT?: Prisma.MihomeAccountWhereInput | Prisma.MihomeAccountWhereInput[] + userId?: Prisma.StringFilter<"MihomeAccount"> | string + status?: Prisma.StringFilter<"MihomeAccount"> | string + lastError?: Prisma.StringFilter<"MihomeAccount"> | string + updatedAt?: Prisma.DateTimeFilter<"MihomeAccount"> | Date | string +}, "id" | "key"> + +export type MihomeAccountOrderByWithAggregationInput = { + id?: Prisma.SortOrder + key?: Prisma.SortOrder + userId?: Prisma.SortOrder + status?: Prisma.SortOrder + lastError?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.MihomeAccountCountOrderByAggregateInput + _avg?: Prisma.MihomeAccountAvgOrderByAggregateInput + _max?: Prisma.MihomeAccountMaxOrderByAggregateInput + _min?: Prisma.MihomeAccountMinOrderByAggregateInput + _sum?: Prisma.MihomeAccountSumOrderByAggregateInput +} + +export type MihomeAccountScalarWhereWithAggregatesInput = { + AND?: Prisma.MihomeAccountScalarWhereWithAggregatesInput | Prisma.MihomeAccountScalarWhereWithAggregatesInput[] + OR?: Prisma.MihomeAccountScalarWhereWithAggregatesInput[] + NOT?: Prisma.MihomeAccountScalarWhereWithAggregatesInput | Prisma.MihomeAccountScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"MihomeAccount"> | number + key?: Prisma.StringWithAggregatesFilter<"MihomeAccount"> | string + userId?: Prisma.StringWithAggregatesFilter<"MihomeAccount"> | string + status?: Prisma.StringWithAggregatesFilter<"MihomeAccount"> | string + lastError?: Prisma.StringWithAggregatesFilter<"MihomeAccount"> | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"MihomeAccount"> | Date | string +} + +export type MihomeAccountCreateInput = { + key?: string + userId?: string + status?: string + lastError?: string + updatedAt?: Date | string +} + +export type MihomeAccountUncheckedCreateInput = { + id?: number + key?: string + userId?: string + status?: string + lastError?: string + updatedAt?: Date | string +} + +export type MihomeAccountUpdateInput = { + key?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + status?: Prisma.StringFieldUpdateOperationsInput | string + lastError?: Prisma.StringFieldUpdateOperationsInput | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeAccountUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + key?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + status?: Prisma.StringFieldUpdateOperationsInput | string + lastError?: Prisma.StringFieldUpdateOperationsInput | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeAccountCreateManyInput = { + id?: number + key?: string + userId?: string + status?: string + lastError?: string + updatedAt?: Date | string +} + +export type MihomeAccountUpdateManyMutationInput = { + key?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + status?: Prisma.StringFieldUpdateOperationsInput | string + lastError?: Prisma.StringFieldUpdateOperationsInput | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeAccountUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + key?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + status?: Prisma.StringFieldUpdateOperationsInput | string + lastError?: Prisma.StringFieldUpdateOperationsInput | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeAccountOrderByRelevanceInput = { + fields: Prisma.MihomeAccountOrderByRelevanceFieldEnum | Prisma.MihomeAccountOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type MihomeAccountCountOrderByAggregateInput = { + id?: Prisma.SortOrder + key?: Prisma.SortOrder + userId?: Prisma.SortOrder + status?: Prisma.SortOrder + lastError?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type MihomeAccountAvgOrderByAggregateInput = { + id?: Prisma.SortOrder +} + +export type MihomeAccountMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + key?: Prisma.SortOrder + userId?: Prisma.SortOrder + status?: Prisma.SortOrder + lastError?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type MihomeAccountMinOrderByAggregateInput = { + id?: Prisma.SortOrder + key?: Prisma.SortOrder + userId?: Prisma.SortOrder + status?: Prisma.SortOrder + lastError?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type MihomeAccountSumOrderByAggregateInput = { + id?: Prisma.SortOrder +} + + + +export type MihomeAccountSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + key?: boolean + userId?: boolean + status?: boolean + lastError?: boolean + updatedAt?: boolean +}, ExtArgs["result"]["mihomeAccount"]> + + + +export type MihomeAccountSelectScalar = { + id?: boolean + key?: boolean + userId?: boolean + status?: boolean + lastError?: boolean + updatedAt?: boolean +} + +export type MihomeAccountOmit = runtime.Types.Extensions.GetOmit<"id" | "key" | "userId" | "status" | "lastError" | "updatedAt", ExtArgs["result"]["mihomeAccount"]> + +export type $MihomeAccountPayload = { + name: "MihomeAccount" + objects: {} + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + key: string + userId: string + status: string + lastError: string + updatedAt: Date + }, ExtArgs["result"]["mihomeAccount"]> + composites: {} +} + +export type MihomeAccountGetPayload = runtime.Types.Result.GetResult + +export type MihomeAccountCountArgs = + Omit & { + select?: MihomeAccountCountAggregateInputType | true + } + +export interface MihomeAccountDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['MihomeAccount'], meta: { name: 'MihomeAccount' } } + /** + * Find zero or one MihomeAccount that matches the filter. + * @param {MihomeAccountFindUniqueArgs} args - Arguments to find a MihomeAccount + * @example + * // Get one MihomeAccount + * const mihomeAccount = await prisma.mihomeAccount.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one MihomeAccount that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {MihomeAccountFindUniqueOrThrowArgs} args - Arguments to find a MihomeAccount + * @example + * // Get one MihomeAccount + * const mihomeAccount = await prisma.mihomeAccount.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeAccount that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountFindFirstArgs} args - Arguments to find a MihomeAccount + * @example + * // Get one MihomeAccount + * const mihomeAccount = await prisma.mihomeAccount.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeAccount that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountFindFirstOrThrowArgs} args - Arguments to find a MihomeAccount + * @example + * // Get one MihomeAccount + * const mihomeAccount = await prisma.mihomeAccount.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more MihomeAccounts that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all MihomeAccounts + * const mihomeAccounts = await prisma.mihomeAccount.findMany() + * + * // Get first 10 MihomeAccounts + * const mihomeAccounts = await prisma.mihomeAccount.findMany({ take: 10 }) + * + * // Only select the `id` + * const mihomeAccountWithIdOnly = await prisma.mihomeAccount.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a MihomeAccount. + * @param {MihomeAccountCreateArgs} args - Arguments to create a MihomeAccount. + * @example + * // Create one MihomeAccount + * const MihomeAccount = await prisma.mihomeAccount.create({ + * data: { + * // ... data to create a MihomeAccount + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many MihomeAccounts. + * @param {MihomeAccountCreateManyArgs} args - Arguments to create many MihomeAccounts. + * @example + * // Create many MihomeAccounts + * const mihomeAccount = await prisma.mihomeAccount.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a MihomeAccount. + * @param {MihomeAccountDeleteArgs} args - Arguments to delete one MihomeAccount. + * @example + * // Delete one MihomeAccount + * const MihomeAccount = await prisma.mihomeAccount.delete({ + * where: { + * // ... filter to delete one MihomeAccount + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one MihomeAccount. + * @param {MihomeAccountUpdateArgs} args - Arguments to update one MihomeAccount. + * @example + * // Update one MihomeAccount + * const mihomeAccount = await prisma.mihomeAccount.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more MihomeAccounts. + * @param {MihomeAccountDeleteManyArgs} args - Arguments to filter MihomeAccounts to delete. + * @example + * // Delete a few MihomeAccounts + * const { count } = await prisma.mihomeAccount.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more MihomeAccounts. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many MihomeAccounts + * const mihomeAccount = await prisma.mihomeAccount.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one MihomeAccount. + * @param {MihomeAccountUpsertArgs} args - Arguments to update or create a MihomeAccount. + * @example + * // Update or create a MihomeAccount + * const mihomeAccount = await prisma.mihomeAccount.upsert({ + * create: { + * // ... data to create a MihomeAccount + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the MihomeAccount we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeAccountClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of MihomeAccounts. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountCountArgs} args - Arguments to filter MihomeAccounts to count. + * @example + * // Count the number of MihomeAccounts + * const count = await prisma.mihomeAccount.count({ + * where: { + * // ... the filter for the MihomeAccounts we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a MihomeAccount. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by MihomeAccount. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeAccountGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends MihomeAccountGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: MihomeAccountGroupByArgs['orderBy'] } + : { orderBy?: MihomeAccountGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetMihomeAccountGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the MihomeAccount model + */ +readonly fields: MihomeAccountFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for MihomeAccount. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__MihomeAccountClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the MihomeAccount model + */ +export interface MihomeAccountFieldRefs { + readonly id: Prisma.FieldRef<"MihomeAccount", 'Int'> + readonly key: Prisma.FieldRef<"MihomeAccount", 'String'> + readonly userId: Prisma.FieldRef<"MihomeAccount", 'String'> + readonly status: Prisma.FieldRef<"MihomeAccount", 'String'> + readonly lastError: Prisma.FieldRef<"MihomeAccount", 'String'> + readonly updatedAt: Prisma.FieldRef<"MihomeAccount", 'DateTime'> +} + + +// Custom InputTypes +/** + * MihomeAccount findUnique + */ +export type MihomeAccountFindUniqueArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * Filter, which MihomeAccount to fetch. + */ + where: Prisma.MihomeAccountWhereUniqueInput +} + +/** + * MihomeAccount findUniqueOrThrow + */ +export type MihomeAccountFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * Filter, which MihomeAccount to fetch. + */ + where: Prisma.MihomeAccountWhereUniqueInput +} + +/** + * MihomeAccount findFirst + */ +export type MihomeAccountFindFirstArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * Filter, which MihomeAccount to fetch. + */ + where?: Prisma.MihomeAccountWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeAccounts to fetch. + */ + orderBy?: Prisma.MihomeAccountOrderByWithRelationInput | Prisma.MihomeAccountOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeAccounts. + */ + cursor?: Prisma.MihomeAccountWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeAccounts from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeAccounts. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeAccounts. + */ + distinct?: Prisma.MihomeAccountScalarFieldEnum | Prisma.MihomeAccountScalarFieldEnum[] +} + +/** + * MihomeAccount findFirstOrThrow + */ +export type MihomeAccountFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * Filter, which MihomeAccount to fetch. + */ + where?: Prisma.MihomeAccountWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeAccounts to fetch. + */ + orderBy?: Prisma.MihomeAccountOrderByWithRelationInput | Prisma.MihomeAccountOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeAccounts. + */ + cursor?: Prisma.MihomeAccountWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeAccounts from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeAccounts. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeAccounts. + */ + distinct?: Prisma.MihomeAccountScalarFieldEnum | Prisma.MihomeAccountScalarFieldEnum[] +} + +/** + * MihomeAccount findMany + */ +export type MihomeAccountFindManyArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * Filter, which MihomeAccounts to fetch. + */ + where?: Prisma.MihomeAccountWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeAccounts to fetch. + */ + orderBy?: Prisma.MihomeAccountOrderByWithRelationInput | Prisma.MihomeAccountOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing MihomeAccounts. + */ + cursor?: Prisma.MihomeAccountWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeAccounts from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeAccounts. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeAccounts. + */ + distinct?: Prisma.MihomeAccountScalarFieldEnum | Prisma.MihomeAccountScalarFieldEnum[] +} + +/** + * MihomeAccount create + */ +export type MihomeAccountCreateArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * The data needed to create a MihomeAccount. + */ + data: Prisma.XOR +} + +/** + * MihomeAccount createMany + */ +export type MihomeAccountCreateManyArgs = { + /** + * The data used to create many MihomeAccounts. + */ + data: Prisma.MihomeAccountCreateManyInput | Prisma.MihomeAccountCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * MihomeAccount update + */ +export type MihomeAccountUpdateArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * The data needed to update a MihomeAccount. + */ + data: Prisma.XOR + /** + * Choose, which MihomeAccount to update. + */ + where: Prisma.MihomeAccountWhereUniqueInput +} + +/** + * MihomeAccount updateMany + */ +export type MihomeAccountUpdateManyArgs = { + /** + * The data used to update MihomeAccounts. + */ + data: Prisma.XOR + /** + * Filter which MihomeAccounts to update + */ + where?: Prisma.MihomeAccountWhereInput + /** + * Limit how many MihomeAccounts to update. + */ + limit?: number +} + +/** + * MihomeAccount upsert + */ +export type MihomeAccountUpsertArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * The filter to search for the MihomeAccount to update in case it exists. + */ + where: Prisma.MihomeAccountWhereUniqueInput + /** + * In case the MihomeAccount found by the `where` argument doesn't exist, create a new MihomeAccount with this data. + */ + create: Prisma.XOR + /** + * In case the MihomeAccount was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * MihomeAccount delete + */ +export type MihomeAccountDeleteArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null + /** + * Filter which MihomeAccount to delete. + */ + where: Prisma.MihomeAccountWhereUniqueInput +} + +/** + * MihomeAccount deleteMany + */ +export type MihomeAccountDeleteManyArgs = { + /** + * Filter which MihomeAccounts to delete + */ + where?: Prisma.MihomeAccountWhereInput + /** + * Limit how many MihomeAccounts to delete. + */ + limit?: number +} + +/** + * MihomeAccount without action + */ +export type MihomeAccountDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeAccount + */ + select?: Prisma.MihomeAccountSelect | null + /** + * Omit specific fields from the MihomeAccount + */ + omit?: Prisma.MihomeAccountOmit | null +} diff --git a/generated/prisma/models/MihomeDevice.ts b/generated/prisma/models/MihomeDevice.ts new file mode 100644 index 0000000..147f96b --- /dev/null +++ b/generated/prisma/models/MihomeDevice.ts @@ -0,0 +1,2059 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `MihomeDevice` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model MihomeDevice + * + */ +export type MihomeDeviceModel = runtime.Types.Result.DefaultSelection + +export type AggregateMihomeDevice = { + _count: MihomeDeviceCountAggregateOutputType | null + _avg: MihomeDeviceAvgAggregateOutputType | null + _sum: MihomeDeviceSumAggregateOutputType | null + _min: MihomeDeviceMinAggregateOutputType | null + _max: MihomeDeviceMaxAggregateOutputType | null +} + +export type MihomeDeviceAvgAggregateOutputType = { + id: number | null + tempSiid: number | null + tempPiid: number | null + humSiid: number | null + humPiid: number | null + battSiid: number | null + battPiid: number | null + battery: number | null +} + +export type MihomeDeviceSumAggregateOutputType = { + id: number | null + tempSiid: number | null + tempPiid: number | null + humSiid: number | null + humPiid: number | null + battSiid: number | null + battPiid: number | null + battery: number | null +} + +export type MihomeDeviceMinAggregateOutputType = { + id: number | null + did: string | null + homeId: string | null + model: string | null + name: string | null + alias: string | null + tempSiid: number | null + tempPiid: number | null + humSiid: number | null + humPiid: number | null + battSiid: number | null + battPiid: number | null + battery: number | null + batteryAt: Date | null + enabled: boolean | null + lastSyncAt: Date | null + createdAt: Date | null +} + +export type MihomeDeviceMaxAggregateOutputType = { + id: number | null + did: string | null + homeId: string | null + model: string | null + name: string | null + alias: string | null + tempSiid: number | null + tempPiid: number | null + humSiid: number | null + humPiid: number | null + battSiid: number | null + battPiid: number | null + battery: number | null + batteryAt: Date | null + enabled: boolean | null + lastSyncAt: Date | null + createdAt: Date | null +} + +export type MihomeDeviceCountAggregateOutputType = { + id: number + did: number + homeId: number + model: number + name: number + alias: number + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery: number + batteryAt: number + enabled: number + lastSyncAt: number + createdAt: number + _all: number +} + + +export type MihomeDeviceAvgAggregateInputType = { + id?: true + tempSiid?: true + tempPiid?: true + humSiid?: true + humPiid?: true + battSiid?: true + battPiid?: true + battery?: true +} + +export type MihomeDeviceSumAggregateInputType = { + id?: true + tempSiid?: true + tempPiid?: true + humSiid?: true + humPiid?: true + battSiid?: true + battPiid?: true + battery?: true +} + +export type MihomeDeviceMinAggregateInputType = { + id?: true + did?: true + homeId?: true + model?: true + name?: true + alias?: true + tempSiid?: true + tempPiid?: true + humSiid?: true + humPiid?: true + battSiid?: true + battPiid?: true + battery?: true + batteryAt?: true + enabled?: true + lastSyncAt?: true + createdAt?: true +} + +export type MihomeDeviceMaxAggregateInputType = { + id?: true + did?: true + homeId?: true + model?: true + name?: true + alias?: true + tempSiid?: true + tempPiid?: true + humSiid?: true + humPiid?: true + battSiid?: true + battPiid?: true + battery?: true + batteryAt?: true + enabled?: true + lastSyncAt?: true + createdAt?: true +} + +export type MihomeDeviceCountAggregateInputType = { + id?: true + did?: true + homeId?: true + model?: true + name?: true + alias?: true + tempSiid?: true + tempPiid?: true + humSiid?: true + humPiid?: true + battSiid?: true + battPiid?: true + battery?: true + batteryAt?: true + enabled?: true + lastSyncAt?: true + createdAt?: true + _all?: true +} + +export type MihomeDeviceAggregateArgs = { + /** + * Filter which MihomeDevice to aggregate. + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeDevices to fetch. + */ + orderBy?: Prisma.MihomeDeviceOrderByWithRelationInput | Prisma.MihomeDeviceOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.MihomeDeviceWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeDevices from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeDevices. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned MihomeDevices + **/ + _count?: true | MihomeDeviceCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: MihomeDeviceAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: MihomeDeviceSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: MihomeDeviceMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: MihomeDeviceMaxAggregateInputType +} + +export type GetMihomeDeviceAggregateType = { + [P in keyof T & keyof AggregateMihomeDevice]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type MihomeDeviceGroupByArgs = { + where?: Prisma.MihomeDeviceWhereInput + orderBy?: Prisma.MihomeDeviceOrderByWithAggregationInput | Prisma.MihomeDeviceOrderByWithAggregationInput[] + by: Prisma.MihomeDeviceScalarFieldEnum[] | Prisma.MihomeDeviceScalarFieldEnum + having?: Prisma.MihomeDeviceScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: MihomeDeviceCountAggregateInputType | true + _avg?: MihomeDeviceAvgAggregateInputType + _sum?: MihomeDeviceSumAggregateInputType + _min?: MihomeDeviceMinAggregateInputType + _max?: MihomeDeviceMaxAggregateInputType +} + +export type MihomeDeviceGroupByOutputType = { + id: number + did: string + homeId: string + model: string + name: string + alias: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery: number | null + batteryAt: Date | null + enabled: boolean + lastSyncAt: Date | null + createdAt: Date + _count: MihomeDeviceCountAggregateOutputType | null + _avg: MihomeDeviceAvgAggregateOutputType | null + _sum: MihomeDeviceSumAggregateOutputType | null + _min: MihomeDeviceMinAggregateOutputType | null + _max: MihomeDeviceMaxAggregateOutputType | null +} + +export type GetMihomeDeviceGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof MihomeDeviceGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type MihomeDeviceWhereInput = { + AND?: Prisma.MihomeDeviceWhereInput | Prisma.MihomeDeviceWhereInput[] + OR?: Prisma.MihomeDeviceWhereInput[] + NOT?: Prisma.MihomeDeviceWhereInput | Prisma.MihomeDeviceWhereInput[] + id?: Prisma.IntFilter<"MihomeDevice"> | number + did?: Prisma.StringFilter<"MihomeDevice"> | string + homeId?: Prisma.StringFilter<"MihomeDevice"> | string + model?: Prisma.StringFilter<"MihomeDevice"> | string + name?: Prisma.StringFilter<"MihomeDevice"> | string + alias?: Prisma.StringNullableFilter<"MihomeDevice"> | string | null + tempSiid?: Prisma.IntFilter<"MihomeDevice"> | number + tempPiid?: Prisma.IntFilter<"MihomeDevice"> | number + humSiid?: Prisma.IntFilter<"MihomeDevice"> | number + humPiid?: Prisma.IntFilter<"MihomeDevice"> | number + battSiid?: Prisma.IntFilter<"MihomeDevice"> | number + battPiid?: Prisma.IntFilter<"MihomeDevice"> | number + battery?: Prisma.IntNullableFilter<"MihomeDevice"> | number | null + batteryAt?: Prisma.DateTimeNullableFilter<"MihomeDevice"> | Date | string | null + enabled?: Prisma.BoolFilter<"MihomeDevice"> | boolean + lastSyncAt?: Prisma.DateTimeNullableFilter<"MihomeDevice"> | Date | string | null + createdAt?: Prisma.DateTimeFilter<"MihomeDevice"> | Date | string + home?: Prisma.XOR + samples?: Prisma.MihomeEnvSampleListRelationFilter + hours?: Prisma.MihomeEnvHourListRelationFilter +} + +export type MihomeDeviceOrderByWithRelationInput = { + id?: Prisma.SortOrder + did?: Prisma.SortOrder + homeId?: Prisma.SortOrder + model?: Prisma.SortOrder + name?: Prisma.SortOrder + alias?: Prisma.SortOrderInput | Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrderInput | Prisma.SortOrder + batteryAt?: Prisma.SortOrderInput | Prisma.SortOrder + enabled?: Prisma.SortOrder + lastSyncAt?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + home?: Prisma.MihomeHomeOrderByWithRelationInput + samples?: Prisma.MihomeEnvSampleOrderByRelationAggregateInput + hours?: Prisma.MihomeEnvHourOrderByRelationAggregateInput + _relevance?: Prisma.MihomeDeviceOrderByRelevanceInput +} + +export type MihomeDeviceWhereUniqueInput = Prisma.AtLeast<{ + id?: number + did?: string + AND?: Prisma.MihomeDeviceWhereInput | Prisma.MihomeDeviceWhereInput[] + OR?: Prisma.MihomeDeviceWhereInput[] + NOT?: Prisma.MihomeDeviceWhereInput | Prisma.MihomeDeviceWhereInput[] + homeId?: Prisma.StringFilter<"MihomeDevice"> | string + model?: Prisma.StringFilter<"MihomeDevice"> | string + name?: Prisma.StringFilter<"MihomeDevice"> | string + alias?: Prisma.StringNullableFilter<"MihomeDevice"> | string | null + tempSiid?: Prisma.IntFilter<"MihomeDevice"> | number + tempPiid?: Prisma.IntFilter<"MihomeDevice"> | number + humSiid?: Prisma.IntFilter<"MihomeDevice"> | number + humPiid?: Prisma.IntFilter<"MihomeDevice"> | number + battSiid?: Prisma.IntFilter<"MihomeDevice"> | number + battPiid?: Prisma.IntFilter<"MihomeDevice"> | number + battery?: Prisma.IntNullableFilter<"MihomeDevice"> | number | null + batteryAt?: Prisma.DateTimeNullableFilter<"MihomeDevice"> | Date | string | null + enabled?: Prisma.BoolFilter<"MihomeDevice"> | boolean + lastSyncAt?: Prisma.DateTimeNullableFilter<"MihomeDevice"> | Date | string | null + createdAt?: Prisma.DateTimeFilter<"MihomeDevice"> | Date | string + home?: Prisma.XOR + samples?: Prisma.MihomeEnvSampleListRelationFilter + hours?: Prisma.MihomeEnvHourListRelationFilter +}, "id" | "did"> + +export type MihomeDeviceOrderByWithAggregationInput = { + id?: Prisma.SortOrder + did?: Prisma.SortOrder + homeId?: Prisma.SortOrder + model?: Prisma.SortOrder + name?: Prisma.SortOrder + alias?: Prisma.SortOrderInput | Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrderInput | Prisma.SortOrder + batteryAt?: Prisma.SortOrderInput | Prisma.SortOrder + enabled?: Prisma.SortOrder + lastSyncAt?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.MihomeDeviceCountOrderByAggregateInput + _avg?: Prisma.MihomeDeviceAvgOrderByAggregateInput + _max?: Prisma.MihomeDeviceMaxOrderByAggregateInput + _min?: Prisma.MihomeDeviceMinOrderByAggregateInput + _sum?: Prisma.MihomeDeviceSumOrderByAggregateInput +} + +export type MihomeDeviceScalarWhereWithAggregatesInput = { + AND?: Prisma.MihomeDeviceScalarWhereWithAggregatesInput | Prisma.MihomeDeviceScalarWhereWithAggregatesInput[] + OR?: Prisma.MihomeDeviceScalarWhereWithAggregatesInput[] + NOT?: Prisma.MihomeDeviceScalarWhereWithAggregatesInput | Prisma.MihomeDeviceScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + did?: Prisma.StringWithAggregatesFilter<"MihomeDevice"> | string + homeId?: Prisma.StringWithAggregatesFilter<"MihomeDevice"> | string + model?: Prisma.StringWithAggregatesFilter<"MihomeDevice"> | string + name?: Prisma.StringWithAggregatesFilter<"MihomeDevice"> | string + alias?: Prisma.StringNullableWithAggregatesFilter<"MihomeDevice"> | string | null + tempSiid?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + tempPiid?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + humSiid?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + humPiid?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + battSiid?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + battPiid?: Prisma.IntWithAggregatesFilter<"MihomeDevice"> | number + battery?: Prisma.IntNullableWithAggregatesFilter<"MihomeDevice"> | number | null + batteryAt?: Prisma.DateTimeNullableWithAggregatesFilter<"MihomeDevice"> | Date | string | null + enabled?: Prisma.BoolWithAggregatesFilter<"MihomeDevice"> | boolean + lastSyncAt?: Prisma.DateTimeNullableWithAggregatesFilter<"MihomeDevice"> | Date | string | null + createdAt?: Prisma.DateTimeWithAggregatesFilter<"MihomeDevice"> | Date | string +} + +export type MihomeDeviceCreateInput = { + did: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + home: Prisma.MihomeHomeCreateNestedOneWithoutDevicesInput + samples?: Prisma.MihomeEnvSampleCreateNestedManyWithoutDeviceInput + hours?: Prisma.MihomeEnvHourCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceUncheckedCreateInput = { + id?: number + did: string + homeId: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + samples?: Prisma.MihomeEnvSampleUncheckedCreateNestedManyWithoutDeviceInput + hours?: Prisma.MihomeEnvHourUncheckedCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceUpdateInput = { + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + home?: Prisma.MihomeHomeUpdateOneRequiredWithoutDevicesNestedInput + samples?: Prisma.MihomeEnvSampleUpdateManyWithoutDeviceNestedInput + hours?: Prisma.MihomeEnvHourUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + did?: Prisma.StringFieldUpdateOperationsInput | string + homeId?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + samples?: Prisma.MihomeEnvSampleUncheckedUpdateManyWithoutDeviceNestedInput + hours?: Prisma.MihomeEnvHourUncheckedUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceCreateManyInput = { + id?: number + did: string + homeId: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string +} + +export type MihomeDeviceUpdateManyMutationInput = { + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeDeviceUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + did?: Prisma.StringFieldUpdateOperationsInput | string + homeId?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeDeviceListRelationFilter = { + every?: Prisma.MihomeDeviceWhereInput + some?: Prisma.MihomeDeviceWhereInput + none?: Prisma.MihomeDeviceWhereInput +} + +export type MihomeDeviceOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type MihomeDeviceOrderByRelevanceInput = { + fields: Prisma.MihomeDeviceOrderByRelevanceFieldEnum | Prisma.MihomeDeviceOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type MihomeDeviceCountOrderByAggregateInput = { + id?: Prisma.SortOrder + did?: Prisma.SortOrder + homeId?: Prisma.SortOrder + model?: Prisma.SortOrder + name?: Prisma.SortOrder + alias?: Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrder + batteryAt?: Prisma.SortOrder + enabled?: Prisma.SortOrder + lastSyncAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeDeviceAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrder +} + +export type MihomeDeviceMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + did?: Prisma.SortOrder + homeId?: Prisma.SortOrder + model?: Prisma.SortOrder + name?: Prisma.SortOrder + alias?: Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrder + batteryAt?: Prisma.SortOrder + enabled?: Prisma.SortOrder + lastSyncAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeDeviceMinOrderByAggregateInput = { + id?: Prisma.SortOrder + did?: Prisma.SortOrder + homeId?: Prisma.SortOrder + model?: Prisma.SortOrder + name?: Prisma.SortOrder + alias?: Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrder + batteryAt?: Prisma.SortOrder + enabled?: Prisma.SortOrder + lastSyncAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeDeviceSumOrderByAggregateInput = { + id?: Prisma.SortOrder + tempSiid?: Prisma.SortOrder + tempPiid?: Prisma.SortOrder + humSiid?: Prisma.SortOrder + humPiid?: Prisma.SortOrder + battSiid?: Prisma.SortOrder + battPiid?: Prisma.SortOrder + battery?: Prisma.SortOrder +} + +export type MihomeDeviceScalarRelationFilter = { + is?: Prisma.MihomeDeviceWhereInput + isNot?: Prisma.MihomeDeviceWhereInput +} + +export type MihomeDeviceCreateNestedManyWithoutHomeInput = { + create?: Prisma.XOR | Prisma.MihomeDeviceCreateWithoutHomeInput[] | Prisma.MihomeDeviceUncheckedCreateWithoutHomeInput[] + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput | Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput[] + createMany?: Prisma.MihomeDeviceCreateManyHomeInputEnvelope + connect?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] +} + +export type MihomeDeviceUncheckedCreateNestedManyWithoutHomeInput = { + create?: Prisma.XOR | Prisma.MihomeDeviceCreateWithoutHomeInput[] | Prisma.MihomeDeviceUncheckedCreateWithoutHomeInput[] + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput | Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput[] + createMany?: Prisma.MihomeDeviceCreateManyHomeInputEnvelope + connect?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] +} + +export type MihomeDeviceUpdateManyWithoutHomeNestedInput = { + create?: Prisma.XOR | Prisma.MihomeDeviceCreateWithoutHomeInput[] | Prisma.MihomeDeviceUncheckedCreateWithoutHomeInput[] + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput | Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput[] + upsert?: Prisma.MihomeDeviceUpsertWithWhereUniqueWithoutHomeInput | Prisma.MihomeDeviceUpsertWithWhereUniqueWithoutHomeInput[] + createMany?: Prisma.MihomeDeviceCreateManyHomeInputEnvelope + set?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + disconnect?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + delete?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + connect?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + update?: Prisma.MihomeDeviceUpdateWithWhereUniqueWithoutHomeInput | Prisma.MihomeDeviceUpdateWithWhereUniqueWithoutHomeInput[] + updateMany?: Prisma.MihomeDeviceUpdateManyWithWhereWithoutHomeInput | Prisma.MihomeDeviceUpdateManyWithWhereWithoutHomeInput[] + deleteMany?: Prisma.MihomeDeviceScalarWhereInput | Prisma.MihomeDeviceScalarWhereInput[] +} + +export type MihomeDeviceUncheckedUpdateManyWithoutHomeNestedInput = { + create?: Prisma.XOR | Prisma.MihomeDeviceCreateWithoutHomeInput[] | Prisma.MihomeDeviceUncheckedCreateWithoutHomeInput[] + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput | Prisma.MihomeDeviceCreateOrConnectWithoutHomeInput[] + upsert?: Prisma.MihomeDeviceUpsertWithWhereUniqueWithoutHomeInput | Prisma.MihomeDeviceUpsertWithWhereUniqueWithoutHomeInput[] + createMany?: Prisma.MihomeDeviceCreateManyHomeInputEnvelope + set?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + disconnect?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + delete?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + connect?: Prisma.MihomeDeviceWhereUniqueInput | Prisma.MihomeDeviceWhereUniqueInput[] + update?: Prisma.MihomeDeviceUpdateWithWhereUniqueWithoutHomeInput | Prisma.MihomeDeviceUpdateWithWhereUniqueWithoutHomeInput[] + updateMany?: Prisma.MihomeDeviceUpdateManyWithWhereWithoutHomeInput | Prisma.MihomeDeviceUpdateManyWithWhereWithoutHomeInput[] + deleteMany?: Prisma.MihomeDeviceScalarWhereInput | Prisma.MihomeDeviceScalarWhereInput[] +} + +export type NullableIntFieldUpdateOperationsInput = { + set?: number | null + increment?: number + decrement?: number + multiply?: number + divide?: number +} + +export type NullableDateTimeFieldUpdateOperationsInput = { + set?: Date | string | null +} + +export type MihomeDeviceCreateNestedOneWithoutSamplesInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutSamplesInput + connect?: Prisma.MihomeDeviceWhereUniqueInput +} + +export type MihomeDeviceUpdateOneRequiredWithoutSamplesNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutSamplesInput + upsert?: Prisma.MihomeDeviceUpsertWithoutSamplesInput + connect?: Prisma.MihomeDeviceWhereUniqueInput + update?: Prisma.XOR, Prisma.MihomeDeviceUncheckedUpdateWithoutSamplesInput> +} + +export type MihomeDeviceCreateNestedOneWithoutHoursInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutHoursInput + connect?: Prisma.MihomeDeviceWhereUniqueInput +} + +export type MihomeDeviceUpdateOneRequiredWithoutHoursNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.MihomeDeviceCreateOrConnectWithoutHoursInput + upsert?: Prisma.MihomeDeviceUpsertWithoutHoursInput + connect?: Prisma.MihomeDeviceWhereUniqueInput + update?: Prisma.XOR, Prisma.MihomeDeviceUncheckedUpdateWithoutHoursInput> +} + +export type MihomeDeviceCreateWithoutHomeInput = { + did: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + samples?: Prisma.MihomeEnvSampleCreateNestedManyWithoutDeviceInput + hours?: Prisma.MihomeEnvHourCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceUncheckedCreateWithoutHomeInput = { + id?: number + did: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + samples?: Prisma.MihomeEnvSampleUncheckedCreateNestedManyWithoutDeviceInput + hours?: Prisma.MihomeEnvHourUncheckedCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceCreateOrConnectWithoutHomeInput = { + where: Prisma.MihomeDeviceWhereUniqueInput + create: Prisma.XOR +} + +export type MihomeDeviceCreateManyHomeInputEnvelope = { + data: Prisma.MihomeDeviceCreateManyHomeInput | Prisma.MihomeDeviceCreateManyHomeInput[] + skipDuplicates?: boolean +} + +export type MihomeDeviceUpsertWithWhereUniqueWithoutHomeInput = { + where: Prisma.MihomeDeviceWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type MihomeDeviceUpdateWithWhereUniqueWithoutHomeInput = { + where: Prisma.MihomeDeviceWhereUniqueInput + data: Prisma.XOR +} + +export type MihomeDeviceUpdateManyWithWhereWithoutHomeInput = { + where: Prisma.MihomeDeviceScalarWhereInput + data: Prisma.XOR +} + +export type MihomeDeviceScalarWhereInput = { + AND?: Prisma.MihomeDeviceScalarWhereInput | Prisma.MihomeDeviceScalarWhereInput[] + OR?: Prisma.MihomeDeviceScalarWhereInput[] + NOT?: Prisma.MihomeDeviceScalarWhereInput | Prisma.MihomeDeviceScalarWhereInput[] + id?: Prisma.IntFilter<"MihomeDevice"> | number + did?: Prisma.StringFilter<"MihomeDevice"> | string + homeId?: Prisma.StringFilter<"MihomeDevice"> | string + model?: Prisma.StringFilter<"MihomeDevice"> | string + name?: Prisma.StringFilter<"MihomeDevice"> | string + alias?: Prisma.StringNullableFilter<"MihomeDevice"> | string | null + tempSiid?: Prisma.IntFilter<"MihomeDevice"> | number + tempPiid?: Prisma.IntFilter<"MihomeDevice"> | number + humSiid?: Prisma.IntFilter<"MihomeDevice"> | number + humPiid?: Prisma.IntFilter<"MihomeDevice"> | number + battSiid?: Prisma.IntFilter<"MihomeDevice"> | number + battPiid?: Prisma.IntFilter<"MihomeDevice"> | number + battery?: Prisma.IntNullableFilter<"MihomeDevice"> | number | null + batteryAt?: Prisma.DateTimeNullableFilter<"MihomeDevice"> | Date | string | null + enabled?: Prisma.BoolFilter<"MihomeDevice"> | boolean + lastSyncAt?: Prisma.DateTimeNullableFilter<"MihomeDevice"> | Date | string | null + createdAt?: Prisma.DateTimeFilter<"MihomeDevice"> | Date | string +} + +export type MihomeDeviceCreateWithoutSamplesInput = { + did: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + home: Prisma.MihomeHomeCreateNestedOneWithoutDevicesInput + hours?: Prisma.MihomeEnvHourCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceUncheckedCreateWithoutSamplesInput = { + id?: number + did: string + homeId: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + hours?: Prisma.MihomeEnvHourUncheckedCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceCreateOrConnectWithoutSamplesInput = { + where: Prisma.MihomeDeviceWhereUniqueInput + create: Prisma.XOR +} + +export type MihomeDeviceUpsertWithoutSamplesInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.MihomeDeviceWhereInput +} + +export type MihomeDeviceUpdateToOneWithWhereWithoutSamplesInput = { + where?: Prisma.MihomeDeviceWhereInput + data: Prisma.XOR +} + +export type MihomeDeviceUpdateWithoutSamplesInput = { + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + home?: Prisma.MihomeHomeUpdateOneRequiredWithoutDevicesNestedInput + hours?: Prisma.MihomeEnvHourUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceUncheckedUpdateWithoutSamplesInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + did?: Prisma.StringFieldUpdateOperationsInput | string + homeId?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + hours?: Prisma.MihomeEnvHourUncheckedUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceCreateWithoutHoursInput = { + did: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + home: Prisma.MihomeHomeCreateNestedOneWithoutDevicesInput + samples?: Prisma.MihomeEnvSampleCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceUncheckedCreateWithoutHoursInput = { + id?: number + did: string + homeId: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string + samples?: Prisma.MihomeEnvSampleUncheckedCreateNestedManyWithoutDeviceInput +} + +export type MihomeDeviceCreateOrConnectWithoutHoursInput = { + where: Prisma.MihomeDeviceWhereUniqueInput + create: Prisma.XOR +} + +export type MihomeDeviceUpsertWithoutHoursInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.MihomeDeviceWhereInput +} + +export type MihomeDeviceUpdateToOneWithWhereWithoutHoursInput = { + where?: Prisma.MihomeDeviceWhereInput + data: Prisma.XOR +} + +export type MihomeDeviceUpdateWithoutHoursInput = { + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + home?: Prisma.MihomeHomeUpdateOneRequiredWithoutDevicesNestedInput + samples?: Prisma.MihomeEnvSampleUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceUncheckedUpdateWithoutHoursInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + did?: Prisma.StringFieldUpdateOperationsInput | string + homeId?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + samples?: Prisma.MihomeEnvSampleUncheckedUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceCreateManyHomeInput = { + id?: number + did: string + model: string + name: string + alias?: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery?: number | null + batteryAt?: Date | string | null + enabled?: boolean + lastSyncAt?: Date | string | null + createdAt?: Date | string +} + +export type MihomeDeviceUpdateWithoutHomeInput = { + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + samples?: Prisma.MihomeEnvSampleUpdateManyWithoutDeviceNestedInput + hours?: Prisma.MihomeEnvHourUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceUncheckedUpdateWithoutHomeInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + samples?: Prisma.MihomeEnvSampleUncheckedUpdateManyWithoutDeviceNestedInput + hours?: Prisma.MihomeEnvHourUncheckedUpdateManyWithoutDeviceNestedInput +} + +export type MihomeDeviceUncheckedUpdateManyWithoutHomeInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + did?: Prisma.StringFieldUpdateOperationsInput | string + model?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + alias?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + tempSiid?: Prisma.IntFieldUpdateOperationsInput | number + tempPiid?: Prisma.IntFieldUpdateOperationsInput | number + humSiid?: Prisma.IntFieldUpdateOperationsInput | number + humPiid?: Prisma.IntFieldUpdateOperationsInput | number + battSiid?: Prisma.IntFieldUpdateOperationsInput | number + battPiid?: Prisma.IntFieldUpdateOperationsInput | number + battery?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + batteryAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + enabled?: Prisma.BoolFieldUpdateOperationsInput | boolean + lastSyncAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + +/** + * Count Type MihomeDeviceCountOutputType + */ + +export type MihomeDeviceCountOutputType = { + samples: number + hours: number +} + +export type MihomeDeviceCountOutputTypeSelect = { + samples?: boolean | MihomeDeviceCountOutputTypeCountSamplesArgs + hours?: boolean | MihomeDeviceCountOutputTypeCountHoursArgs +} + +/** + * MihomeDeviceCountOutputType without action + */ +export type MihomeDeviceCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeDeviceCountOutputType + */ + select?: Prisma.MihomeDeviceCountOutputTypeSelect | null +} + +/** + * MihomeDeviceCountOutputType without action + */ +export type MihomeDeviceCountOutputTypeCountSamplesArgs = { + where?: Prisma.MihomeEnvSampleWhereInput +} + +/** + * MihomeDeviceCountOutputType without action + */ +export type MihomeDeviceCountOutputTypeCountHoursArgs = { + where?: Prisma.MihomeEnvHourWhereInput +} + + +export type MihomeDeviceSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + did?: boolean + homeId?: boolean + model?: boolean + name?: boolean + alias?: boolean + tempSiid?: boolean + tempPiid?: boolean + humSiid?: boolean + humPiid?: boolean + battSiid?: boolean + battPiid?: boolean + battery?: boolean + batteryAt?: boolean + enabled?: boolean + lastSyncAt?: boolean + createdAt?: boolean + home?: boolean | Prisma.MihomeHomeDefaultArgs + samples?: boolean | Prisma.MihomeDevice$samplesArgs + hours?: boolean | Prisma.MihomeDevice$hoursArgs + _count?: boolean | Prisma.MihomeDeviceCountOutputTypeDefaultArgs +}, ExtArgs["result"]["mihomeDevice"]> + + + +export type MihomeDeviceSelectScalar = { + id?: boolean + did?: boolean + homeId?: boolean + model?: boolean + name?: boolean + alias?: boolean + tempSiid?: boolean + tempPiid?: boolean + humSiid?: boolean + humPiid?: boolean + battSiid?: boolean + battPiid?: boolean + battery?: boolean + batteryAt?: boolean + enabled?: boolean + lastSyncAt?: boolean + createdAt?: boolean +} + +export type MihomeDeviceOmit = runtime.Types.Extensions.GetOmit<"id" | "did" | "homeId" | "model" | "name" | "alias" | "tempSiid" | "tempPiid" | "humSiid" | "humPiid" | "battSiid" | "battPiid" | "battery" | "batteryAt" | "enabled" | "lastSyncAt" | "createdAt", ExtArgs["result"]["mihomeDevice"]> +export type MihomeDeviceInclude = { + home?: boolean | Prisma.MihomeHomeDefaultArgs + samples?: boolean | Prisma.MihomeDevice$samplesArgs + hours?: boolean | Prisma.MihomeDevice$hoursArgs + _count?: boolean | Prisma.MihomeDeviceCountOutputTypeDefaultArgs +} + +export type $MihomeDevicePayload = { + name: "MihomeDevice" + objects: { + home: Prisma.$MihomeHomePayload + samples: Prisma.$MihomeEnvSamplePayload[] + hours: Prisma.$MihomeEnvHourPayload[] + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + did: string + homeId: string + model: string + name: string + alias: string | null + tempSiid: number + tempPiid: number + humSiid: number + humPiid: number + battSiid: number + battPiid: number + battery: number | null + batteryAt: Date | null + enabled: boolean + lastSyncAt: Date | null + createdAt: Date + }, ExtArgs["result"]["mihomeDevice"]> + composites: {} +} + +export type MihomeDeviceGetPayload = runtime.Types.Result.GetResult + +export type MihomeDeviceCountArgs = + Omit & { + select?: MihomeDeviceCountAggregateInputType | true + } + +export interface MihomeDeviceDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['MihomeDevice'], meta: { name: 'MihomeDevice' } } + /** + * Find zero or one MihomeDevice that matches the filter. + * @param {MihomeDeviceFindUniqueArgs} args - Arguments to find a MihomeDevice + * @example + * // Get one MihomeDevice + * const mihomeDevice = await prisma.mihomeDevice.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one MihomeDevice that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {MihomeDeviceFindUniqueOrThrowArgs} args - Arguments to find a MihomeDevice + * @example + * // Get one MihomeDevice + * const mihomeDevice = await prisma.mihomeDevice.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeDevice that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceFindFirstArgs} args - Arguments to find a MihomeDevice + * @example + * // Get one MihomeDevice + * const mihomeDevice = await prisma.mihomeDevice.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeDevice that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceFindFirstOrThrowArgs} args - Arguments to find a MihomeDevice + * @example + * // Get one MihomeDevice + * const mihomeDevice = await prisma.mihomeDevice.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more MihomeDevices that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all MihomeDevices + * const mihomeDevices = await prisma.mihomeDevice.findMany() + * + * // Get first 10 MihomeDevices + * const mihomeDevices = await prisma.mihomeDevice.findMany({ take: 10 }) + * + * // Only select the `id` + * const mihomeDeviceWithIdOnly = await prisma.mihomeDevice.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a MihomeDevice. + * @param {MihomeDeviceCreateArgs} args - Arguments to create a MihomeDevice. + * @example + * // Create one MihomeDevice + * const MihomeDevice = await prisma.mihomeDevice.create({ + * data: { + * // ... data to create a MihomeDevice + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many MihomeDevices. + * @param {MihomeDeviceCreateManyArgs} args - Arguments to create many MihomeDevices. + * @example + * // Create many MihomeDevices + * const mihomeDevice = await prisma.mihomeDevice.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a MihomeDevice. + * @param {MihomeDeviceDeleteArgs} args - Arguments to delete one MihomeDevice. + * @example + * // Delete one MihomeDevice + * const MihomeDevice = await prisma.mihomeDevice.delete({ + * where: { + * // ... filter to delete one MihomeDevice + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one MihomeDevice. + * @param {MihomeDeviceUpdateArgs} args - Arguments to update one MihomeDevice. + * @example + * // Update one MihomeDevice + * const mihomeDevice = await prisma.mihomeDevice.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more MihomeDevices. + * @param {MihomeDeviceDeleteManyArgs} args - Arguments to filter MihomeDevices to delete. + * @example + * // Delete a few MihomeDevices + * const { count } = await prisma.mihomeDevice.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more MihomeDevices. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many MihomeDevices + * const mihomeDevice = await prisma.mihomeDevice.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one MihomeDevice. + * @param {MihomeDeviceUpsertArgs} args - Arguments to update or create a MihomeDevice. + * @example + * // Update or create a MihomeDevice + * const mihomeDevice = await prisma.mihomeDevice.upsert({ + * create: { + * // ... data to create a MihomeDevice + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the MihomeDevice we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeDeviceClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of MihomeDevices. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceCountArgs} args - Arguments to filter MihomeDevices to count. + * @example + * // Count the number of MihomeDevices + * const count = await prisma.mihomeDevice.count({ + * where: { + * // ... the filter for the MihomeDevices we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a MihomeDevice. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by MihomeDevice. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeDeviceGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends MihomeDeviceGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: MihomeDeviceGroupByArgs['orderBy'] } + : { orderBy?: MihomeDeviceGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetMihomeDeviceGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the MihomeDevice model + */ +readonly fields: MihomeDeviceFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for MihomeDevice. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__MihomeDeviceClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + home = {}>(args?: Prisma.Subset>): Prisma.Prisma__MihomeHomeClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + samples = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + hours = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the MihomeDevice model + */ +export interface MihomeDeviceFieldRefs { + readonly id: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly did: Prisma.FieldRef<"MihomeDevice", 'String'> + readonly homeId: Prisma.FieldRef<"MihomeDevice", 'String'> + readonly model: Prisma.FieldRef<"MihomeDevice", 'String'> + readonly name: Prisma.FieldRef<"MihomeDevice", 'String'> + readonly alias: Prisma.FieldRef<"MihomeDevice", 'String'> + readonly tempSiid: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly tempPiid: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly humSiid: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly humPiid: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly battSiid: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly battPiid: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly battery: Prisma.FieldRef<"MihomeDevice", 'Int'> + readonly batteryAt: Prisma.FieldRef<"MihomeDevice", 'DateTime'> + readonly enabled: Prisma.FieldRef<"MihomeDevice", 'Boolean'> + readonly lastSyncAt: Prisma.FieldRef<"MihomeDevice", 'DateTime'> + readonly createdAt: Prisma.FieldRef<"MihomeDevice", 'DateTime'> +} + + +// Custom InputTypes +/** + * MihomeDevice findUnique + */ +export type MihomeDeviceFindUniqueArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * Filter, which MihomeDevice to fetch. + */ + where: Prisma.MihomeDeviceWhereUniqueInput +} + +/** + * MihomeDevice findUniqueOrThrow + */ +export type MihomeDeviceFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * Filter, which MihomeDevice to fetch. + */ + where: Prisma.MihomeDeviceWhereUniqueInput +} + +/** + * MihomeDevice findFirst + */ +export type MihomeDeviceFindFirstArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * Filter, which MihomeDevice to fetch. + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeDevices to fetch. + */ + orderBy?: Prisma.MihomeDeviceOrderByWithRelationInput | Prisma.MihomeDeviceOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeDevices. + */ + cursor?: Prisma.MihomeDeviceWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeDevices from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeDevices. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeDevices. + */ + distinct?: Prisma.MihomeDeviceScalarFieldEnum | Prisma.MihomeDeviceScalarFieldEnum[] +} + +/** + * MihomeDevice findFirstOrThrow + */ +export type MihomeDeviceFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * Filter, which MihomeDevice to fetch. + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeDevices to fetch. + */ + orderBy?: Prisma.MihomeDeviceOrderByWithRelationInput | Prisma.MihomeDeviceOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeDevices. + */ + cursor?: Prisma.MihomeDeviceWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeDevices from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeDevices. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeDevices. + */ + distinct?: Prisma.MihomeDeviceScalarFieldEnum | Prisma.MihomeDeviceScalarFieldEnum[] +} + +/** + * MihomeDevice findMany + */ +export type MihomeDeviceFindManyArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * Filter, which MihomeDevices to fetch. + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeDevices to fetch. + */ + orderBy?: Prisma.MihomeDeviceOrderByWithRelationInput | Prisma.MihomeDeviceOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing MihomeDevices. + */ + cursor?: Prisma.MihomeDeviceWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeDevices from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeDevices. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeDevices. + */ + distinct?: Prisma.MihomeDeviceScalarFieldEnum | Prisma.MihomeDeviceScalarFieldEnum[] +} + +/** + * MihomeDevice create + */ +export type MihomeDeviceCreateArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * The data needed to create a MihomeDevice. + */ + data: Prisma.XOR +} + +/** + * MihomeDevice createMany + */ +export type MihomeDeviceCreateManyArgs = { + /** + * The data used to create many MihomeDevices. + */ + data: Prisma.MihomeDeviceCreateManyInput | Prisma.MihomeDeviceCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * MihomeDevice update + */ +export type MihomeDeviceUpdateArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * The data needed to update a MihomeDevice. + */ + data: Prisma.XOR + /** + * Choose, which MihomeDevice to update. + */ + where: Prisma.MihomeDeviceWhereUniqueInput +} + +/** + * MihomeDevice updateMany + */ +export type MihomeDeviceUpdateManyArgs = { + /** + * The data used to update MihomeDevices. + */ + data: Prisma.XOR + /** + * Filter which MihomeDevices to update + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * Limit how many MihomeDevices to update. + */ + limit?: number +} + +/** + * MihomeDevice upsert + */ +export type MihomeDeviceUpsertArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * The filter to search for the MihomeDevice to update in case it exists. + */ + where: Prisma.MihomeDeviceWhereUniqueInput + /** + * In case the MihomeDevice found by the `where` argument doesn't exist, create a new MihomeDevice with this data. + */ + create: Prisma.XOR + /** + * In case the MihomeDevice was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * MihomeDevice delete + */ +export type MihomeDeviceDeleteArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + /** + * Filter which MihomeDevice to delete. + */ + where: Prisma.MihomeDeviceWhereUniqueInput +} + +/** + * MihomeDevice deleteMany + */ +export type MihomeDeviceDeleteManyArgs = { + /** + * Filter which MihomeDevices to delete + */ + where?: Prisma.MihomeDeviceWhereInput + /** + * Limit how many MihomeDevices to delete. + */ + limit?: number +} + +/** + * MihomeDevice.samples + */ +export type MihomeDevice$samplesArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + where?: Prisma.MihomeEnvSampleWhereInput + orderBy?: Prisma.MihomeEnvSampleOrderByWithRelationInput | Prisma.MihomeEnvSampleOrderByWithRelationInput[] + cursor?: Prisma.MihomeEnvSampleWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.MihomeEnvSampleScalarFieldEnum | Prisma.MihomeEnvSampleScalarFieldEnum[] +} + +/** + * MihomeDevice.hours + */ +export type MihomeDevice$hoursArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + where?: Prisma.MihomeEnvHourWhereInput + orderBy?: Prisma.MihomeEnvHourOrderByWithRelationInput | Prisma.MihomeEnvHourOrderByWithRelationInput[] + cursor?: Prisma.MihomeEnvHourWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.MihomeEnvHourScalarFieldEnum | Prisma.MihomeEnvHourScalarFieldEnum[] +} + +/** + * MihomeDevice without action + */ +export type MihomeDeviceDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null +} diff --git a/generated/prisma/models/MihomeEnvHour.ts b/generated/prisma/models/MihomeEnvHour.ts new file mode 100644 index 0000000..caf5ddd --- /dev/null +++ b/generated/prisma/models/MihomeEnvHour.ts @@ -0,0 +1,1339 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `MihomeEnvHour` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model MihomeEnvHour + * + */ +export type MihomeEnvHourModel = runtime.Types.Result.DefaultSelection + +export type AggregateMihomeEnvHour = { + _count: MihomeEnvHourCountAggregateOutputType | null + _avg: MihomeEnvHourAvgAggregateOutputType | null + _sum: MihomeEnvHourSumAggregateOutputType | null + _min: MihomeEnvHourMinAggregateOutputType | null + _max: MihomeEnvHourMaxAggregateOutputType | null +} + +export type MihomeEnvHourAvgAggregateOutputType = { + id: number | null + deviceId: number | null + temperatureAvg: number | null + humidityAvg: number | null +} + +export type MihomeEnvHourSumAggregateOutputType = { + id: number | null + deviceId: number | null + temperatureAvg: number | null + humidityAvg: number | null +} + +export type MihomeEnvHourMinAggregateOutputType = { + id: number | null + deviceId: number | null + hour: Date | null + temperatureAvg: number | null + humidityAvg: number | null + createdAt: Date | null +} + +export type MihomeEnvHourMaxAggregateOutputType = { + id: number | null + deviceId: number | null + hour: Date | null + temperatureAvg: number | null + humidityAvg: number | null + createdAt: Date | null +} + +export type MihomeEnvHourCountAggregateOutputType = { + id: number + deviceId: number + hour: number + temperatureAvg: number + humidityAvg: number + raw: number + createdAt: number + _all: number +} + + +export type MihomeEnvHourAvgAggregateInputType = { + id?: true + deviceId?: true + temperatureAvg?: true + humidityAvg?: true +} + +export type MihomeEnvHourSumAggregateInputType = { + id?: true + deviceId?: true + temperatureAvg?: true + humidityAvg?: true +} + +export type MihomeEnvHourMinAggregateInputType = { + id?: true + deviceId?: true + hour?: true + temperatureAvg?: true + humidityAvg?: true + createdAt?: true +} + +export type MihomeEnvHourMaxAggregateInputType = { + id?: true + deviceId?: true + hour?: true + temperatureAvg?: true + humidityAvg?: true + createdAt?: true +} + +export type MihomeEnvHourCountAggregateInputType = { + id?: true + deviceId?: true + hour?: true + temperatureAvg?: true + humidityAvg?: true + raw?: true + createdAt?: true + _all?: true +} + +export type MihomeEnvHourAggregateArgs = { + /** + * Filter which MihomeEnvHour to aggregate. + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvHours to fetch. + */ + orderBy?: Prisma.MihomeEnvHourOrderByWithRelationInput | Prisma.MihomeEnvHourOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.MihomeEnvHourWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvHours from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvHours. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned MihomeEnvHours + **/ + _count?: true | MihomeEnvHourCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: MihomeEnvHourAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: MihomeEnvHourSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: MihomeEnvHourMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: MihomeEnvHourMaxAggregateInputType +} + +export type GetMihomeEnvHourAggregateType = { + [P in keyof T & keyof AggregateMihomeEnvHour]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type MihomeEnvHourGroupByArgs = { + where?: Prisma.MihomeEnvHourWhereInput + orderBy?: Prisma.MihomeEnvHourOrderByWithAggregationInput | Prisma.MihomeEnvHourOrderByWithAggregationInput[] + by: Prisma.MihomeEnvHourScalarFieldEnum[] | Prisma.MihomeEnvHourScalarFieldEnum + having?: Prisma.MihomeEnvHourScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: MihomeEnvHourCountAggregateInputType | true + _avg?: MihomeEnvHourAvgAggregateInputType + _sum?: MihomeEnvHourSumAggregateInputType + _min?: MihomeEnvHourMinAggregateInputType + _max?: MihomeEnvHourMaxAggregateInputType +} + +export type MihomeEnvHourGroupByOutputType = { + id: number + deviceId: number + hour: Date + temperatureAvg: number | null + humidityAvg: number | null + raw: runtime.JsonValue | null + createdAt: Date + _count: MihomeEnvHourCountAggregateOutputType | null + _avg: MihomeEnvHourAvgAggregateOutputType | null + _sum: MihomeEnvHourSumAggregateOutputType | null + _min: MihomeEnvHourMinAggregateOutputType | null + _max: MihomeEnvHourMaxAggregateOutputType | null +} + +export type GetMihomeEnvHourGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof MihomeEnvHourGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type MihomeEnvHourWhereInput = { + AND?: Prisma.MihomeEnvHourWhereInput | Prisma.MihomeEnvHourWhereInput[] + OR?: Prisma.MihomeEnvHourWhereInput[] + NOT?: Prisma.MihomeEnvHourWhereInput | Prisma.MihomeEnvHourWhereInput[] + id?: Prisma.IntFilter<"MihomeEnvHour"> | number + deviceId?: Prisma.IntFilter<"MihomeEnvHour"> | number + hour?: Prisma.DateTimeFilter<"MihomeEnvHour"> | Date | string + temperatureAvg?: Prisma.FloatNullableFilter<"MihomeEnvHour"> | number | null + humidityAvg?: Prisma.FloatNullableFilter<"MihomeEnvHour"> | number | null + raw?: Prisma.JsonNullableFilter<"MihomeEnvHour"> + createdAt?: Prisma.DateTimeFilter<"MihomeEnvHour"> | Date | string + device?: Prisma.XOR +} + +export type MihomeEnvHourOrderByWithRelationInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + hour?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrderInput | Prisma.SortOrder + humidityAvg?: Prisma.SortOrderInput | Prisma.SortOrder + raw?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + device?: Prisma.MihomeDeviceOrderByWithRelationInput +} + +export type MihomeEnvHourWhereUniqueInput = Prisma.AtLeast<{ + id?: number + deviceId_hour?: Prisma.MihomeEnvHourDeviceIdHourCompoundUniqueInput + AND?: Prisma.MihomeEnvHourWhereInput | Prisma.MihomeEnvHourWhereInput[] + OR?: Prisma.MihomeEnvHourWhereInput[] + NOT?: Prisma.MihomeEnvHourWhereInput | Prisma.MihomeEnvHourWhereInput[] + deviceId?: Prisma.IntFilter<"MihomeEnvHour"> | number + hour?: Prisma.DateTimeFilter<"MihomeEnvHour"> | Date | string + temperatureAvg?: Prisma.FloatNullableFilter<"MihomeEnvHour"> | number | null + humidityAvg?: Prisma.FloatNullableFilter<"MihomeEnvHour"> | number | null + raw?: Prisma.JsonNullableFilter<"MihomeEnvHour"> + createdAt?: Prisma.DateTimeFilter<"MihomeEnvHour"> | Date | string + device?: Prisma.XOR +}, "id" | "deviceId_hour"> + +export type MihomeEnvHourOrderByWithAggregationInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + hour?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrderInput | Prisma.SortOrder + humidityAvg?: Prisma.SortOrderInput | Prisma.SortOrder + raw?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.MihomeEnvHourCountOrderByAggregateInput + _avg?: Prisma.MihomeEnvHourAvgOrderByAggregateInput + _max?: Prisma.MihomeEnvHourMaxOrderByAggregateInput + _min?: Prisma.MihomeEnvHourMinOrderByAggregateInput + _sum?: Prisma.MihomeEnvHourSumOrderByAggregateInput +} + +export type MihomeEnvHourScalarWhereWithAggregatesInput = { + AND?: Prisma.MihomeEnvHourScalarWhereWithAggregatesInput | Prisma.MihomeEnvHourScalarWhereWithAggregatesInput[] + OR?: Prisma.MihomeEnvHourScalarWhereWithAggregatesInput[] + NOT?: Prisma.MihomeEnvHourScalarWhereWithAggregatesInput | Prisma.MihomeEnvHourScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"MihomeEnvHour"> | number + deviceId?: Prisma.IntWithAggregatesFilter<"MihomeEnvHour"> | number + hour?: Prisma.DateTimeWithAggregatesFilter<"MihomeEnvHour"> | Date | string + temperatureAvg?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvHour"> | number | null + humidityAvg?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvHour"> | number | null + raw?: Prisma.JsonNullableWithAggregatesFilter<"MihomeEnvHour"> + createdAt?: Prisma.DateTimeWithAggregatesFilter<"MihomeEnvHour"> | Date | string +} + +export type MihomeEnvHourCreateInput = { + hour: Date | string + temperatureAvg?: number | null + humidityAvg?: number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string + device: Prisma.MihomeDeviceCreateNestedOneWithoutHoursInput +} + +export type MihomeEnvHourUncheckedCreateInput = { + id?: number + deviceId: number + hour: Date | string + temperatureAvg?: number | null + humidityAvg?: number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvHourUpdateInput = { + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + device?: Prisma.MihomeDeviceUpdateOneRequiredWithoutHoursNestedInput +} + +export type MihomeEnvHourUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + deviceId?: Prisma.IntFieldUpdateOperationsInput | number + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvHourCreateManyInput = { + id?: number + deviceId: number + hour: Date | string + temperatureAvg?: number | null + humidityAvg?: number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvHourUpdateManyMutationInput = { + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvHourUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + deviceId?: Prisma.IntFieldUpdateOperationsInput | number + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvHourListRelationFilter = { + every?: Prisma.MihomeEnvHourWhereInput + some?: Prisma.MihomeEnvHourWhereInput + none?: Prisma.MihomeEnvHourWhereInput +} + +export type MihomeEnvHourOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type MihomeEnvHourDeviceIdHourCompoundUniqueInput = { + deviceId: number + hour: Date | string +} + +export type MihomeEnvHourCountOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + hour?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + raw?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeEnvHourAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder +} + +export type MihomeEnvHourMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + hour?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeEnvHourMinOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + hour?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeEnvHourSumOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder +} + +export type MihomeEnvHourCreateNestedManyWithoutDeviceInput = { + create?: Prisma.XOR | Prisma.MihomeEnvHourCreateWithoutDeviceInput[] | Prisma.MihomeEnvHourUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvHourCreateManyDeviceInputEnvelope + connect?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] +} + +export type MihomeEnvHourUncheckedCreateNestedManyWithoutDeviceInput = { + create?: Prisma.XOR | Prisma.MihomeEnvHourCreateWithoutDeviceInput[] | Prisma.MihomeEnvHourUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvHourCreateManyDeviceInputEnvelope + connect?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] +} + +export type MihomeEnvHourUpdateManyWithoutDeviceNestedInput = { + create?: Prisma.XOR | Prisma.MihomeEnvHourCreateWithoutDeviceInput[] | Prisma.MihomeEnvHourUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput[] + upsert?: Prisma.MihomeEnvHourUpsertWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvHourUpsertWithWhereUniqueWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvHourCreateManyDeviceInputEnvelope + set?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + disconnect?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + delete?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + connect?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + update?: Prisma.MihomeEnvHourUpdateWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvHourUpdateWithWhereUniqueWithoutDeviceInput[] + updateMany?: Prisma.MihomeEnvHourUpdateManyWithWhereWithoutDeviceInput | Prisma.MihomeEnvHourUpdateManyWithWhereWithoutDeviceInput[] + deleteMany?: Prisma.MihomeEnvHourScalarWhereInput | Prisma.MihomeEnvHourScalarWhereInput[] +} + +export type MihomeEnvHourUncheckedUpdateManyWithoutDeviceNestedInput = { + create?: Prisma.XOR | Prisma.MihomeEnvHourCreateWithoutDeviceInput[] | Prisma.MihomeEnvHourUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvHourCreateOrConnectWithoutDeviceInput[] + upsert?: Prisma.MihomeEnvHourUpsertWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvHourUpsertWithWhereUniqueWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvHourCreateManyDeviceInputEnvelope + set?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + disconnect?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + delete?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + connect?: Prisma.MihomeEnvHourWhereUniqueInput | Prisma.MihomeEnvHourWhereUniqueInput[] + update?: Prisma.MihomeEnvHourUpdateWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvHourUpdateWithWhereUniqueWithoutDeviceInput[] + updateMany?: Prisma.MihomeEnvHourUpdateManyWithWhereWithoutDeviceInput | Prisma.MihomeEnvHourUpdateManyWithWhereWithoutDeviceInput[] + deleteMany?: Prisma.MihomeEnvHourScalarWhereInput | Prisma.MihomeEnvHourScalarWhereInput[] +} + +export type MihomeEnvHourCreateWithoutDeviceInput = { + hour: Date | string + temperatureAvg?: number | null + humidityAvg?: number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvHourUncheckedCreateWithoutDeviceInput = { + id?: number + hour: Date | string + temperatureAvg?: number | null + humidityAvg?: number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvHourCreateOrConnectWithoutDeviceInput = { + where: Prisma.MihomeEnvHourWhereUniqueInput + create: Prisma.XOR +} + +export type MihomeEnvHourCreateManyDeviceInputEnvelope = { + data: Prisma.MihomeEnvHourCreateManyDeviceInput | Prisma.MihomeEnvHourCreateManyDeviceInput[] + skipDuplicates?: boolean +} + +export type MihomeEnvHourUpsertWithWhereUniqueWithoutDeviceInput = { + where: Prisma.MihomeEnvHourWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type MihomeEnvHourUpdateWithWhereUniqueWithoutDeviceInput = { + where: Prisma.MihomeEnvHourWhereUniqueInput + data: Prisma.XOR +} + +export type MihomeEnvHourUpdateManyWithWhereWithoutDeviceInput = { + where: Prisma.MihomeEnvHourScalarWhereInput + data: Prisma.XOR +} + +export type MihomeEnvHourScalarWhereInput = { + AND?: Prisma.MihomeEnvHourScalarWhereInput | Prisma.MihomeEnvHourScalarWhereInput[] + OR?: Prisma.MihomeEnvHourScalarWhereInput[] + NOT?: Prisma.MihomeEnvHourScalarWhereInput | Prisma.MihomeEnvHourScalarWhereInput[] + id?: Prisma.IntFilter<"MihomeEnvHour"> | number + deviceId?: Prisma.IntFilter<"MihomeEnvHour"> | number + hour?: Prisma.DateTimeFilter<"MihomeEnvHour"> | Date | string + temperatureAvg?: Prisma.FloatNullableFilter<"MihomeEnvHour"> | number | null + humidityAvg?: Prisma.FloatNullableFilter<"MihomeEnvHour"> | number | null + raw?: Prisma.JsonNullableFilter<"MihomeEnvHour"> + createdAt?: Prisma.DateTimeFilter<"MihomeEnvHour"> | Date | string +} + +export type MihomeEnvHourCreateManyDeviceInput = { + id?: number + hour: Date | string + temperatureAvg?: number | null + humidityAvg?: number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvHourUpdateWithoutDeviceInput = { + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvHourUncheckedUpdateWithoutDeviceInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvHourUncheckedUpdateManyWithoutDeviceInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + hour?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type MihomeEnvHourSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + deviceId?: boolean + hour?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + raw?: boolean + createdAt?: boolean + device?: boolean | Prisma.MihomeDeviceDefaultArgs +}, ExtArgs["result"]["mihomeEnvHour"]> + + + +export type MihomeEnvHourSelectScalar = { + id?: boolean + deviceId?: boolean + hour?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + raw?: boolean + createdAt?: boolean +} + +export type MihomeEnvHourOmit = runtime.Types.Extensions.GetOmit<"id" | "deviceId" | "hour" | "temperatureAvg" | "humidityAvg" | "raw" | "createdAt", ExtArgs["result"]["mihomeEnvHour"]> +export type MihomeEnvHourInclude = { + device?: boolean | Prisma.MihomeDeviceDefaultArgs +} + +export type $MihomeEnvHourPayload = { + name: "MihomeEnvHour" + objects: { + device: Prisma.$MihomeDevicePayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + deviceId: number + hour: Date + temperatureAvg: number | null + humidityAvg: number | null + raw: runtime.JsonValue | null + createdAt: Date + }, ExtArgs["result"]["mihomeEnvHour"]> + composites: {} +} + +export type MihomeEnvHourGetPayload = runtime.Types.Result.GetResult + +export type MihomeEnvHourCountArgs = + Omit & { + select?: MihomeEnvHourCountAggregateInputType | true + } + +export interface MihomeEnvHourDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['MihomeEnvHour'], meta: { name: 'MihomeEnvHour' } } + /** + * Find zero or one MihomeEnvHour that matches the filter. + * @param {MihomeEnvHourFindUniqueArgs} args - Arguments to find a MihomeEnvHour + * @example + * // Get one MihomeEnvHour + * const mihomeEnvHour = await prisma.mihomeEnvHour.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one MihomeEnvHour that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {MihomeEnvHourFindUniqueOrThrowArgs} args - Arguments to find a MihomeEnvHour + * @example + * // Get one MihomeEnvHour + * const mihomeEnvHour = await prisma.mihomeEnvHour.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeEnvHour that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourFindFirstArgs} args - Arguments to find a MihomeEnvHour + * @example + * // Get one MihomeEnvHour + * const mihomeEnvHour = await prisma.mihomeEnvHour.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeEnvHour that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourFindFirstOrThrowArgs} args - Arguments to find a MihomeEnvHour + * @example + * // Get one MihomeEnvHour + * const mihomeEnvHour = await prisma.mihomeEnvHour.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more MihomeEnvHours that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all MihomeEnvHours + * const mihomeEnvHours = await prisma.mihomeEnvHour.findMany() + * + * // Get first 10 MihomeEnvHours + * const mihomeEnvHours = await prisma.mihomeEnvHour.findMany({ take: 10 }) + * + * // Only select the `id` + * const mihomeEnvHourWithIdOnly = await prisma.mihomeEnvHour.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a MihomeEnvHour. + * @param {MihomeEnvHourCreateArgs} args - Arguments to create a MihomeEnvHour. + * @example + * // Create one MihomeEnvHour + * const MihomeEnvHour = await prisma.mihomeEnvHour.create({ + * data: { + * // ... data to create a MihomeEnvHour + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many MihomeEnvHours. + * @param {MihomeEnvHourCreateManyArgs} args - Arguments to create many MihomeEnvHours. + * @example + * // Create many MihomeEnvHours + * const mihomeEnvHour = await prisma.mihomeEnvHour.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a MihomeEnvHour. + * @param {MihomeEnvHourDeleteArgs} args - Arguments to delete one MihomeEnvHour. + * @example + * // Delete one MihomeEnvHour + * const MihomeEnvHour = await prisma.mihomeEnvHour.delete({ + * where: { + * // ... filter to delete one MihomeEnvHour + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one MihomeEnvHour. + * @param {MihomeEnvHourUpdateArgs} args - Arguments to update one MihomeEnvHour. + * @example + * // Update one MihomeEnvHour + * const mihomeEnvHour = await prisma.mihomeEnvHour.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more MihomeEnvHours. + * @param {MihomeEnvHourDeleteManyArgs} args - Arguments to filter MihomeEnvHours to delete. + * @example + * // Delete a few MihomeEnvHours + * const { count } = await prisma.mihomeEnvHour.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more MihomeEnvHours. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many MihomeEnvHours + * const mihomeEnvHour = await prisma.mihomeEnvHour.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one MihomeEnvHour. + * @param {MihomeEnvHourUpsertArgs} args - Arguments to update or create a MihomeEnvHour. + * @example + * // Update or create a MihomeEnvHour + * const mihomeEnvHour = await prisma.mihomeEnvHour.upsert({ + * create: { + * // ... data to create a MihomeEnvHour + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the MihomeEnvHour we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvHourClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of MihomeEnvHours. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourCountArgs} args - Arguments to filter MihomeEnvHours to count. + * @example + * // Count the number of MihomeEnvHours + * const count = await prisma.mihomeEnvHour.count({ + * where: { + * // ... the filter for the MihomeEnvHours we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a MihomeEnvHour. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by MihomeEnvHour. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvHourGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends MihomeEnvHourGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: MihomeEnvHourGroupByArgs['orderBy'] } + : { orderBy?: MihomeEnvHourGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetMihomeEnvHourGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the MihomeEnvHour model + */ +readonly fields: MihomeEnvHourFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for MihomeEnvHour. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__MihomeEnvHourClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + device = {}>(args?: Prisma.Subset>): Prisma.Prisma__MihomeDeviceClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the MihomeEnvHour model + */ +export interface MihomeEnvHourFieldRefs { + readonly id: Prisma.FieldRef<"MihomeEnvHour", 'Int'> + readonly deviceId: Prisma.FieldRef<"MihomeEnvHour", 'Int'> + readonly hour: Prisma.FieldRef<"MihomeEnvHour", 'DateTime'> + readonly temperatureAvg: Prisma.FieldRef<"MihomeEnvHour", 'Float'> + readonly humidityAvg: Prisma.FieldRef<"MihomeEnvHour", 'Float'> + readonly raw: Prisma.FieldRef<"MihomeEnvHour", 'Json'> + readonly createdAt: Prisma.FieldRef<"MihomeEnvHour", 'DateTime'> +} + + +// Custom InputTypes +/** + * MihomeEnvHour findUnique + */ +export type MihomeEnvHourFindUniqueArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * Filter, which MihomeEnvHour to fetch. + */ + where: Prisma.MihomeEnvHourWhereUniqueInput +} + +/** + * MihomeEnvHour findUniqueOrThrow + */ +export type MihomeEnvHourFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * Filter, which MihomeEnvHour to fetch. + */ + where: Prisma.MihomeEnvHourWhereUniqueInput +} + +/** + * MihomeEnvHour findFirst + */ +export type MihomeEnvHourFindFirstArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * Filter, which MihomeEnvHour to fetch. + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvHours to fetch. + */ + orderBy?: Prisma.MihomeEnvHourOrderByWithRelationInput | Prisma.MihomeEnvHourOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeEnvHours. + */ + cursor?: Prisma.MihomeEnvHourWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvHours from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvHours. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeEnvHours. + */ + distinct?: Prisma.MihomeEnvHourScalarFieldEnum | Prisma.MihomeEnvHourScalarFieldEnum[] +} + +/** + * MihomeEnvHour findFirstOrThrow + */ +export type MihomeEnvHourFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * Filter, which MihomeEnvHour to fetch. + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvHours to fetch. + */ + orderBy?: Prisma.MihomeEnvHourOrderByWithRelationInput | Prisma.MihomeEnvHourOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeEnvHours. + */ + cursor?: Prisma.MihomeEnvHourWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvHours from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvHours. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeEnvHours. + */ + distinct?: Prisma.MihomeEnvHourScalarFieldEnum | Prisma.MihomeEnvHourScalarFieldEnum[] +} + +/** + * MihomeEnvHour findMany + */ +export type MihomeEnvHourFindManyArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * Filter, which MihomeEnvHours to fetch. + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvHours to fetch. + */ + orderBy?: Prisma.MihomeEnvHourOrderByWithRelationInput | Prisma.MihomeEnvHourOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing MihomeEnvHours. + */ + cursor?: Prisma.MihomeEnvHourWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvHours from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvHours. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeEnvHours. + */ + distinct?: Prisma.MihomeEnvHourScalarFieldEnum | Prisma.MihomeEnvHourScalarFieldEnum[] +} + +/** + * MihomeEnvHour create + */ +export type MihomeEnvHourCreateArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * The data needed to create a MihomeEnvHour. + */ + data: Prisma.XOR +} + +/** + * MihomeEnvHour createMany + */ +export type MihomeEnvHourCreateManyArgs = { + /** + * The data used to create many MihomeEnvHours. + */ + data: Prisma.MihomeEnvHourCreateManyInput | Prisma.MihomeEnvHourCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * MihomeEnvHour update + */ +export type MihomeEnvHourUpdateArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * The data needed to update a MihomeEnvHour. + */ + data: Prisma.XOR + /** + * Choose, which MihomeEnvHour to update. + */ + where: Prisma.MihomeEnvHourWhereUniqueInput +} + +/** + * MihomeEnvHour updateMany + */ +export type MihomeEnvHourUpdateManyArgs = { + /** + * The data used to update MihomeEnvHours. + */ + data: Prisma.XOR + /** + * Filter which MihomeEnvHours to update + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * Limit how many MihomeEnvHours to update. + */ + limit?: number +} + +/** + * MihomeEnvHour upsert + */ +export type MihomeEnvHourUpsertArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * The filter to search for the MihomeEnvHour to update in case it exists. + */ + where: Prisma.MihomeEnvHourWhereUniqueInput + /** + * In case the MihomeEnvHour found by the `where` argument doesn't exist, create a new MihomeEnvHour with this data. + */ + create: Prisma.XOR + /** + * In case the MihomeEnvHour was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * MihomeEnvHour delete + */ +export type MihomeEnvHourDeleteArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null + /** + * Filter which MihomeEnvHour to delete. + */ + where: Prisma.MihomeEnvHourWhereUniqueInput +} + +/** + * MihomeEnvHour deleteMany + */ +export type MihomeEnvHourDeleteManyArgs = { + /** + * Filter which MihomeEnvHours to delete + */ + where?: Prisma.MihomeEnvHourWhereInput + /** + * Limit how many MihomeEnvHours to delete. + */ + limit?: number +} + +/** + * MihomeEnvHour without action + */ +export type MihomeEnvHourDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeEnvHour + */ + select?: Prisma.MihomeEnvHourSelect | null + /** + * Omit specific fields from the MihomeEnvHour + */ + omit?: Prisma.MihomeEnvHourOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvHourInclude | null +} diff --git a/generated/prisma/models/MihomeEnvSample.ts b/generated/prisma/models/MihomeEnvSample.ts new file mode 100644 index 0000000..3d6f41c --- /dev/null +++ b/generated/prisma/models/MihomeEnvSample.ts @@ -0,0 +1,1654 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `MihomeEnvSample` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model MihomeEnvSample + * + */ +export type MihomeEnvSampleModel = runtime.Types.Result.DefaultSelection + +export type AggregateMihomeEnvSample = { + _count: MihomeEnvSampleCountAggregateOutputType | null + _avg: MihomeEnvSampleAvgAggregateOutputType | null + _sum: MihomeEnvSampleSumAggregateOutputType | null + _min: MihomeEnvSampleMinAggregateOutputType | null + _max: MihomeEnvSampleMaxAggregateOutputType | null +} + +export type MihomeEnvSampleAvgAggregateOutputType = { + id: number | null + deviceId: number | null + temperature: number | null + humidity: number | null + temperatureAvg: number | null + humidityAvg: number | null + temperatureMin: number | null + temperatureMax: number | null + humidityMin: number | null + humidityMax: number | null +} + +export type MihomeEnvSampleSumAggregateOutputType = { + id: number | null + deviceId: number | null + temperature: number | null + humidity: number | null + temperatureAvg: number | null + humidityAvg: number | null + temperatureMin: number | null + temperatureMax: number | null + humidityMin: number | null + humidityMax: number | null +} + +export type MihomeEnvSampleMinAggregateOutputType = { + id: number | null + deviceId: number | null + date: Date | null + temperature: number | null + humidity: number | null + temperatureAvg: number | null + humidityAvg: number | null + temperatureMin: number | null + temperatureMax: number | null + humidityMin: number | null + humidityMax: number | null + origin: string | null + sampledAt: Date | null + createdAt: Date | null +} + +export type MihomeEnvSampleMaxAggregateOutputType = { + id: number | null + deviceId: number | null + date: Date | null + temperature: number | null + humidity: number | null + temperatureAvg: number | null + humidityAvg: number | null + temperatureMin: number | null + temperatureMax: number | null + humidityMin: number | null + humidityMax: number | null + origin: string | null + sampledAt: Date | null + createdAt: Date | null +} + +export type MihomeEnvSampleCountAggregateOutputType = { + id: number + deviceId: number + date: number + temperature: number + humidity: number + temperatureAvg: number + humidityAvg: number + temperatureMin: number + temperatureMax: number + humidityMin: number + humidityMax: number + origin: number + sampledAt: number + raw: number + createdAt: number + _all: number +} + + +export type MihomeEnvSampleAvgAggregateInputType = { + id?: true + deviceId?: true + temperature?: true + humidity?: true + temperatureAvg?: true + humidityAvg?: true + temperatureMin?: true + temperatureMax?: true + humidityMin?: true + humidityMax?: true +} + +export type MihomeEnvSampleSumAggregateInputType = { + id?: true + deviceId?: true + temperature?: true + humidity?: true + temperatureAvg?: true + humidityAvg?: true + temperatureMin?: true + temperatureMax?: true + humidityMin?: true + humidityMax?: true +} + +export type MihomeEnvSampleMinAggregateInputType = { + id?: true + deviceId?: true + date?: true + temperature?: true + humidity?: true + temperatureAvg?: true + humidityAvg?: true + temperatureMin?: true + temperatureMax?: true + humidityMin?: true + humidityMax?: true + origin?: true + sampledAt?: true + createdAt?: true +} + +export type MihomeEnvSampleMaxAggregateInputType = { + id?: true + deviceId?: true + date?: true + temperature?: true + humidity?: true + temperatureAvg?: true + humidityAvg?: true + temperatureMin?: true + temperatureMax?: true + humidityMin?: true + humidityMax?: true + origin?: true + sampledAt?: true + createdAt?: true +} + +export type MihomeEnvSampleCountAggregateInputType = { + id?: true + deviceId?: true + date?: true + temperature?: true + humidity?: true + temperatureAvg?: true + humidityAvg?: true + temperatureMin?: true + temperatureMax?: true + humidityMin?: true + humidityMax?: true + origin?: true + sampledAt?: true + raw?: true + createdAt?: true + _all?: true +} + +export type MihomeEnvSampleAggregateArgs = { + /** + * Filter which MihomeEnvSample to aggregate. + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvSamples to fetch. + */ + orderBy?: Prisma.MihomeEnvSampleOrderByWithRelationInput | Prisma.MihomeEnvSampleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.MihomeEnvSampleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvSamples from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvSamples. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned MihomeEnvSamples + **/ + _count?: true | MihomeEnvSampleCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: MihomeEnvSampleAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: MihomeEnvSampleSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: MihomeEnvSampleMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: MihomeEnvSampleMaxAggregateInputType +} + +export type GetMihomeEnvSampleAggregateType = { + [P in keyof T & keyof AggregateMihomeEnvSample]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type MihomeEnvSampleGroupByArgs = { + where?: Prisma.MihomeEnvSampleWhereInput + orderBy?: Prisma.MihomeEnvSampleOrderByWithAggregationInput | Prisma.MihomeEnvSampleOrderByWithAggregationInput[] + by: Prisma.MihomeEnvSampleScalarFieldEnum[] | Prisma.MihomeEnvSampleScalarFieldEnum + having?: Prisma.MihomeEnvSampleScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: MihomeEnvSampleCountAggregateInputType | true + _avg?: MihomeEnvSampleAvgAggregateInputType + _sum?: MihomeEnvSampleSumAggregateInputType + _min?: MihomeEnvSampleMinAggregateInputType + _max?: MihomeEnvSampleMaxAggregateInputType +} + +export type MihomeEnvSampleGroupByOutputType = { + id: number + deviceId: number + date: Date + temperature: number | null + humidity: number | null + temperatureAvg: number | null + humidityAvg: number | null + temperatureMin: number | null + temperatureMax: number | null + humidityMin: number | null + humidityMax: number | null + origin: string + sampledAt: Date | null + raw: runtime.JsonValue | null + createdAt: Date + _count: MihomeEnvSampleCountAggregateOutputType | null + _avg: MihomeEnvSampleAvgAggregateOutputType | null + _sum: MihomeEnvSampleSumAggregateOutputType | null + _min: MihomeEnvSampleMinAggregateOutputType | null + _max: MihomeEnvSampleMaxAggregateOutputType | null +} + +export type GetMihomeEnvSampleGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof MihomeEnvSampleGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type MihomeEnvSampleWhereInput = { + AND?: Prisma.MihomeEnvSampleWhereInput | Prisma.MihomeEnvSampleWhereInput[] + OR?: Prisma.MihomeEnvSampleWhereInput[] + NOT?: Prisma.MihomeEnvSampleWhereInput | Prisma.MihomeEnvSampleWhereInput[] + id?: Prisma.IntFilter<"MihomeEnvSample"> | number + deviceId?: Prisma.IntFilter<"MihomeEnvSample"> | number + date?: Prisma.DateTimeFilter<"MihomeEnvSample"> | Date | string + temperature?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidity?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureAvg?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityAvg?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureMin?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureMax?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityMin?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityMax?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + origin?: Prisma.StringFilter<"MihomeEnvSample"> | string + sampledAt?: Prisma.DateTimeNullableFilter<"MihomeEnvSample"> | Date | string | null + raw?: Prisma.JsonNullableFilter<"MihomeEnvSample"> + createdAt?: Prisma.DateTimeFilter<"MihomeEnvSample"> | Date | string + device?: Prisma.XOR +} + +export type MihomeEnvSampleOrderByWithRelationInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + date?: Prisma.SortOrder + temperature?: Prisma.SortOrderInput | Prisma.SortOrder + humidity?: Prisma.SortOrderInput | Prisma.SortOrder + temperatureAvg?: Prisma.SortOrderInput | Prisma.SortOrder + humidityAvg?: Prisma.SortOrderInput | Prisma.SortOrder + temperatureMin?: Prisma.SortOrderInput | Prisma.SortOrder + temperatureMax?: Prisma.SortOrderInput | Prisma.SortOrder + humidityMin?: Prisma.SortOrderInput | Prisma.SortOrder + humidityMax?: Prisma.SortOrderInput | Prisma.SortOrder + origin?: Prisma.SortOrder + sampledAt?: Prisma.SortOrderInput | Prisma.SortOrder + raw?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + device?: Prisma.MihomeDeviceOrderByWithRelationInput + _relevance?: Prisma.MihomeEnvSampleOrderByRelevanceInput +} + +export type MihomeEnvSampleWhereUniqueInput = Prisma.AtLeast<{ + id?: number + deviceId_date?: Prisma.MihomeEnvSampleDeviceIdDateCompoundUniqueInput + AND?: Prisma.MihomeEnvSampleWhereInput | Prisma.MihomeEnvSampleWhereInput[] + OR?: Prisma.MihomeEnvSampleWhereInput[] + NOT?: Prisma.MihomeEnvSampleWhereInput | Prisma.MihomeEnvSampleWhereInput[] + deviceId?: Prisma.IntFilter<"MihomeEnvSample"> | number + date?: Prisma.DateTimeFilter<"MihomeEnvSample"> | Date | string + temperature?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidity?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureAvg?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityAvg?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureMin?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureMax?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityMin?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityMax?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + origin?: Prisma.StringFilter<"MihomeEnvSample"> | string + sampledAt?: Prisma.DateTimeNullableFilter<"MihomeEnvSample"> | Date | string | null + raw?: Prisma.JsonNullableFilter<"MihomeEnvSample"> + createdAt?: Prisma.DateTimeFilter<"MihomeEnvSample"> | Date | string + device?: Prisma.XOR +}, "id" | "deviceId_date"> + +export type MihomeEnvSampleOrderByWithAggregationInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + date?: Prisma.SortOrder + temperature?: Prisma.SortOrderInput | Prisma.SortOrder + humidity?: Prisma.SortOrderInput | Prisma.SortOrder + temperatureAvg?: Prisma.SortOrderInput | Prisma.SortOrder + humidityAvg?: Prisma.SortOrderInput | Prisma.SortOrder + temperatureMin?: Prisma.SortOrderInput | Prisma.SortOrder + temperatureMax?: Prisma.SortOrderInput | Prisma.SortOrder + humidityMin?: Prisma.SortOrderInput | Prisma.SortOrder + humidityMax?: Prisma.SortOrderInput | Prisma.SortOrder + origin?: Prisma.SortOrder + sampledAt?: Prisma.SortOrderInput | Prisma.SortOrder + raw?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.MihomeEnvSampleCountOrderByAggregateInput + _avg?: Prisma.MihomeEnvSampleAvgOrderByAggregateInput + _max?: Prisma.MihomeEnvSampleMaxOrderByAggregateInput + _min?: Prisma.MihomeEnvSampleMinOrderByAggregateInput + _sum?: Prisma.MihomeEnvSampleSumOrderByAggregateInput +} + +export type MihomeEnvSampleScalarWhereWithAggregatesInput = { + AND?: Prisma.MihomeEnvSampleScalarWhereWithAggregatesInput | Prisma.MihomeEnvSampleScalarWhereWithAggregatesInput[] + OR?: Prisma.MihomeEnvSampleScalarWhereWithAggregatesInput[] + NOT?: Prisma.MihomeEnvSampleScalarWhereWithAggregatesInput | Prisma.MihomeEnvSampleScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"MihomeEnvSample"> | number + deviceId?: Prisma.IntWithAggregatesFilter<"MihomeEnvSample"> | number + date?: Prisma.DateTimeWithAggregatesFilter<"MihomeEnvSample"> | Date | string + temperature?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + humidity?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + temperatureAvg?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + humidityAvg?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + temperatureMin?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + temperatureMax?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + humidityMin?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + humidityMax?: Prisma.FloatNullableWithAggregatesFilter<"MihomeEnvSample"> | number | null + origin?: Prisma.StringWithAggregatesFilter<"MihomeEnvSample"> | string + sampledAt?: Prisma.DateTimeNullableWithAggregatesFilter<"MihomeEnvSample"> | Date | string | null + raw?: Prisma.JsonNullableWithAggregatesFilter<"MihomeEnvSample"> + createdAt?: Prisma.DateTimeWithAggregatesFilter<"MihomeEnvSample"> | Date | string +} + +export type MihomeEnvSampleCreateInput = { + date: Date | string + temperature?: number | null + humidity?: number | null + temperatureAvg?: number | null + humidityAvg?: number | null + temperatureMin?: number | null + temperatureMax?: number | null + humidityMin?: number | null + humidityMax?: number | null + origin?: string + sampledAt?: Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string + device: Prisma.MihomeDeviceCreateNestedOneWithoutSamplesInput +} + +export type MihomeEnvSampleUncheckedCreateInput = { + id?: number + deviceId: number + date: Date | string + temperature?: number | null + humidity?: number | null + temperatureAvg?: number | null + humidityAvg?: number | null + temperatureMin?: number | null + temperatureMax?: number | null + humidityMin?: number | null + humidityMax?: number | null + origin?: string + sampledAt?: Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvSampleUpdateInput = { + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + device?: Prisma.MihomeDeviceUpdateOneRequiredWithoutSamplesNestedInput +} + +export type MihomeEnvSampleUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + deviceId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvSampleCreateManyInput = { + id?: number + deviceId: number + date: Date | string + temperature?: number | null + humidity?: number | null + temperatureAvg?: number | null + humidityAvg?: number | null + temperatureMin?: number | null + temperatureMax?: number | null + humidityMin?: number | null + humidityMax?: number | null + origin?: string + sampledAt?: Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvSampleUpdateManyMutationInput = { + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvSampleUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + deviceId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvSampleListRelationFilter = { + every?: Prisma.MihomeEnvSampleWhereInput + some?: Prisma.MihomeEnvSampleWhereInput + none?: Prisma.MihomeEnvSampleWhereInput +} + +export type MihomeEnvSampleOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type MihomeEnvSampleOrderByRelevanceInput = { + fields: Prisma.MihomeEnvSampleOrderByRelevanceFieldEnum | Prisma.MihomeEnvSampleOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type MihomeEnvSampleDeviceIdDateCompoundUniqueInput = { + deviceId: number + date: Date | string +} + +export type MihomeEnvSampleCountOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + date?: Prisma.SortOrder + temperature?: Prisma.SortOrder + humidity?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + temperatureMin?: Prisma.SortOrder + temperatureMax?: Prisma.SortOrder + humidityMin?: Prisma.SortOrder + humidityMax?: Prisma.SortOrder + origin?: Prisma.SortOrder + sampledAt?: Prisma.SortOrder + raw?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeEnvSampleAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + temperature?: Prisma.SortOrder + humidity?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + temperatureMin?: Prisma.SortOrder + temperatureMax?: Prisma.SortOrder + humidityMin?: Prisma.SortOrder + humidityMax?: Prisma.SortOrder +} + +export type MihomeEnvSampleMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + date?: Prisma.SortOrder + temperature?: Prisma.SortOrder + humidity?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + temperatureMin?: Prisma.SortOrder + temperatureMax?: Prisma.SortOrder + humidityMin?: Prisma.SortOrder + humidityMax?: Prisma.SortOrder + origin?: Prisma.SortOrder + sampledAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeEnvSampleMinOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + date?: Prisma.SortOrder + temperature?: Prisma.SortOrder + humidity?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + temperatureMin?: Prisma.SortOrder + temperatureMax?: Prisma.SortOrder + humidityMin?: Prisma.SortOrder + humidityMax?: Prisma.SortOrder + origin?: Prisma.SortOrder + sampledAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeEnvSampleSumOrderByAggregateInput = { + id?: Prisma.SortOrder + deviceId?: Prisma.SortOrder + temperature?: Prisma.SortOrder + humidity?: Prisma.SortOrder + temperatureAvg?: Prisma.SortOrder + humidityAvg?: Prisma.SortOrder + temperatureMin?: Prisma.SortOrder + temperatureMax?: Prisma.SortOrder + humidityMin?: Prisma.SortOrder + humidityMax?: Prisma.SortOrder +} + +export type MihomeEnvSampleCreateNestedManyWithoutDeviceInput = { + create?: Prisma.XOR | Prisma.MihomeEnvSampleCreateWithoutDeviceInput[] | Prisma.MihomeEnvSampleUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvSampleCreateManyDeviceInputEnvelope + connect?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] +} + +export type MihomeEnvSampleUncheckedCreateNestedManyWithoutDeviceInput = { + create?: Prisma.XOR | Prisma.MihomeEnvSampleCreateWithoutDeviceInput[] | Prisma.MihomeEnvSampleUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvSampleCreateManyDeviceInputEnvelope + connect?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] +} + +export type MihomeEnvSampleUpdateManyWithoutDeviceNestedInput = { + create?: Prisma.XOR | Prisma.MihomeEnvSampleCreateWithoutDeviceInput[] | Prisma.MihomeEnvSampleUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput[] + upsert?: Prisma.MihomeEnvSampleUpsertWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvSampleUpsertWithWhereUniqueWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvSampleCreateManyDeviceInputEnvelope + set?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + disconnect?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + delete?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + connect?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + update?: Prisma.MihomeEnvSampleUpdateWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvSampleUpdateWithWhereUniqueWithoutDeviceInput[] + updateMany?: Prisma.MihomeEnvSampleUpdateManyWithWhereWithoutDeviceInput | Prisma.MihomeEnvSampleUpdateManyWithWhereWithoutDeviceInput[] + deleteMany?: Prisma.MihomeEnvSampleScalarWhereInput | Prisma.MihomeEnvSampleScalarWhereInput[] +} + +export type MihomeEnvSampleUncheckedUpdateManyWithoutDeviceNestedInput = { + create?: Prisma.XOR | Prisma.MihomeEnvSampleCreateWithoutDeviceInput[] | Prisma.MihomeEnvSampleUncheckedCreateWithoutDeviceInput[] + connectOrCreate?: Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput | Prisma.MihomeEnvSampleCreateOrConnectWithoutDeviceInput[] + upsert?: Prisma.MihomeEnvSampleUpsertWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvSampleUpsertWithWhereUniqueWithoutDeviceInput[] + createMany?: Prisma.MihomeEnvSampleCreateManyDeviceInputEnvelope + set?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + disconnect?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + delete?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + connect?: Prisma.MihomeEnvSampleWhereUniqueInput | Prisma.MihomeEnvSampleWhereUniqueInput[] + update?: Prisma.MihomeEnvSampleUpdateWithWhereUniqueWithoutDeviceInput | Prisma.MihomeEnvSampleUpdateWithWhereUniqueWithoutDeviceInput[] + updateMany?: Prisma.MihomeEnvSampleUpdateManyWithWhereWithoutDeviceInput | Prisma.MihomeEnvSampleUpdateManyWithWhereWithoutDeviceInput[] + deleteMany?: Prisma.MihomeEnvSampleScalarWhereInput | Prisma.MihomeEnvSampleScalarWhereInput[] +} + +export type NullableFloatFieldUpdateOperationsInput = { + set?: number | null + increment?: number + decrement?: number + multiply?: number + divide?: number +} + +export type MihomeEnvSampleCreateWithoutDeviceInput = { + date: Date | string + temperature?: number | null + humidity?: number | null + temperatureAvg?: number | null + humidityAvg?: number | null + temperatureMin?: number | null + temperatureMax?: number | null + humidityMin?: number | null + humidityMax?: number | null + origin?: string + sampledAt?: Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvSampleUncheckedCreateWithoutDeviceInput = { + id?: number + date: Date | string + temperature?: number | null + humidity?: number | null + temperatureAvg?: number | null + humidityAvg?: number | null + temperatureMin?: number | null + temperatureMax?: number | null + humidityMin?: number | null + humidityMax?: number | null + origin?: string + sampledAt?: Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvSampleCreateOrConnectWithoutDeviceInput = { + where: Prisma.MihomeEnvSampleWhereUniqueInput + create: Prisma.XOR +} + +export type MihomeEnvSampleCreateManyDeviceInputEnvelope = { + data: Prisma.MihomeEnvSampleCreateManyDeviceInput | Prisma.MihomeEnvSampleCreateManyDeviceInput[] + skipDuplicates?: boolean +} + +export type MihomeEnvSampleUpsertWithWhereUniqueWithoutDeviceInput = { + where: Prisma.MihomeEnvSampleWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type MihomeEnvSampleUpdateWithWhereUniqueWithoutDeviceInput = { + where: Prisma.MihomeEnvSampleWhereUniqueInput + data: Prisma.XOR +} + +export type MihomeEnvSampleUpdateManyWithWhereWithoutDeviceInput = { + where: Prisma.MihomeEnvSampleScalarWhereInput + data: Prisma.XOR +} + +export type MihomeEnvSampleScalarWhereInput = { + AND?: Prisma.MihomeEnvSampleScalarWhereInput | Prisma.MihomeEnvSampleScalarWhereInput[] + OR?: Prisma.MihomeEnvSampleScalarWhereInput[] + NOT?: Prisma.MihomeEnvSampleScalarWhereInput | Prisma.MihomeEnvSampleScalarWhereInput[] + id?: Prisma.IntFilter<"MihomeEnvSample"> | number + deviceId?: Prisma.IntFilter<"MihomeEnvSample"> | number + date?: Prisma.DateTimeFilter<"MihomeEnvSample"> | Date | string + temperature?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidity?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureAvg?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityAvg?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureMin?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + temperatureMax?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityMin?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + humidityMax?: Prisma.FloatNullableFilter<"MihomeEnvSample"> | number | null + origin?: Prisma.StringFilter<"MihomeEnvSample"> | string + sampledAt?: Prisma.DateTimeNullableFilter<"MihomeEnvSample"> | Date | string | null + raw?: Prisma.JsonNullableFilter<"MihomeEnvSample"> + createdAt?: Prisma.DateTimeFilter<"MihomeEnvSample"> | Date | string +} + +export type MihomeEnvSampleCreateManyDeviceInput = { + id?: number + date: Date | string + temperature?: number | null + humidity?: number | null + temperatureAvg?: number | null + humidityAvg?: number | null + temperatureMin?: number | null + temperatureMax?: number | null + humidityMin?: number | null + humidityMax?: number | null + origin?: string + sampledAt?: Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Date | string +} + +export type MihomeEnvSampleUpdateWithoutDeviceInput = { + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvSampleUncheckedUpdateWithoutDeviceInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeEnvSampleUncheckedUpdateManyWithoutDeviceInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + temperature?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidity?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityAvg?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + temperatureMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMin?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + humidityMax?: Prisma.NullableFloatFieldUpdateOperationsInput | number | null + origin?: Prisma.StringFieldUpdateOperationsInput | string + sampledAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + raw?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type MihomeEnvSampleSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + deviceId?: boolean + date?: boolean + temperature?: boolean + humidity?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + temperatureMin?: boolean + temperatureMax?: boolean + humidityMin?: boolean + humidityMax?: boolean + origin?: boolean + sampledAt?: boolean + raw?: boolean + createdAt?: boolean + device?: boolean | Prisma.MihomeDeviceDefaultArgs +}, ExtArgs["result"]["mihomeEnvSample"]> + + + +export type MihomeEnvSampleSelectScalar = { + id?: boolean + deviceId?: boolean + date?: boolean + temperature?: boolean + humidity?: boolean + temperatureAvg?: boolean + humidityAvg?: boolean + temperatureMin?: boolean + temperatureMax?: boolean + humidityMin?: boolean + humidityMax?: boolean + origin?: boolean + sampledAt?: boolean + raw?: boolean + createdAt?: boolean +} + +export type MihomeEnvSampleOmit = runtime.Types.Extensions.GetOmit<"id" | "deviceId" | "date" | "temperature" | "humidity" | "temperatureAvg" | "humidityAvg" | "temperatureMin" | "temperatureMax" | "humidityMin" | "humidityMax" | "origin" | "sampledAt" | "raw" | "createdAt", ExtArgs["result"]["mihomeEnvSample"]> +export type MihomeEnvSampleInclude = { + device?: boolean | Prisma.MihomeDeviceDefaultArgs +} + +export type $MihomeEnvSamplePayload = { + name: "MihomeEnvSample" + objects: { + device: Prisma.$MihomeDevicePayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + deviceId: number + date: Date + temperature: number | null + humidity: number | null + temperatureAvg: number | null + humidityAvg: number | null + temperatureMin: number | null + temperatureMax: number | null + humidityMin: number | null + humidityMax: number | null + origin: string + sampledAt: Date | null + raw: runtime.JsonValue | null + createdAt: Date + }, ExtArgs["result"]["mihomeEnvSample"]> + composites: {} +} + +export type MihomeEnvSampleGetPayload = runtime.Types.Result.GetResult + +export type MihomeEnvSampleCountArgs = + Omit & { + select?: MihomeEnvSampleCountAggregateInputType | true + } + +export interface MihomeEnvSampleDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['MihomeEnvSample'], meta: { name: 'MihomeEnvSample' } } + /** + * Find zero or one MihomeEnvSample that matches the filter. + * @param {MihomeEnvSampleFindUniqueArgs} args - Arguments to find a MihomeEnvSample + * @example + * // Get one MihomeEnvSample + * const mihomeEnvSample = await prisma.mihomeEnvSample.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one MihomeEnvSample that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {MihomeEnvSampleFindUniqueOrThrowArgs} args - Arguments to find a MihomeEnvSample + * @example + * // Get one MihomeEnvSample + * const mihomeEnvSample = await prisma.mihomeEnvSample.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeEnvSample that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleFindFirstArgs} args - Arguments to find a MihomeEnvSample + * @example + * // Get one MihomeEnvSample + * const mihomeEnvSample = await prisma.mihomeEnvSample.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeEnvSample that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleFindFirstOrThrowArgs} args - Arguments to find a MihomeEnvSample + * @example + * // Get one MihomeEnvSample + * const mihomeEnvSample = await prisma.mihomeEnvSample.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more MihomeEnvSamples that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all MihomeEnvSamples + * const mihomeEnvSamples = await prisma.mihomeEnvSample.findMany() + * + * // Get first 10 MihomeEnvSamples + * const mihomeEnvSamples = await prisma.mihomeEnvSample.findMany({ take: 10 }) + * + * // Only select the `id` + * const mihomeEnvSampleWithIdOnly = await prisma.mihomeEnvSample.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a MihomeEnvSample. + * @param {MihomeEnvSampleCreateArgs} args - Arguments to create a MihomeEnvSample. + * @example + * // Create one MihomeEnvSample + * const MihomeEnvSample = await prisma.mihomeEnvSample.create({ + * data: { + * // ... data to create a MihomeEnvSample + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many MihomeEnvSamples. + * @param {MihomeEnvSampleCreateManyArgs} args - Arguments to create many MihomeEnvSamples. + * @example + * // Create many MihomeEnvSamples + * const mihomeEnvSample = await prisma.mihomeEnvSample.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a MihomeEnvSample. + * @param {MihomeEnvSampleDeleteArgs} args - Arguments to delete one MihomeEnvSample. + * @example + * // Delete one MihomeEnvSample + * const MihomeEnvSample = await prisma.mihomeEnvSample.delete({ + * where: { + * // ... filter to delete one MihomeEnvSample + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one MihomeEnvSample. + * @param {MihomeEnvSampleUpdateArgs} args - Arguments to update one MihomeEnvSample. + * @example + * // Update one MihomeEnvSample + * const mihomeEnvSample = await prisma.mihomeEnvSample.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more MihomeEnvSamples. + * @param {MihomeEnvSampleDeleteManyArgs} args - Arguments to filter MihomeEnvSamples to delete. + * @example + * // Delete a few MihomeEnvSamples + * const { count } = await prisma.mihomeEnvSample.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more MihomeEnvSamples. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many MihomeEnvSamples + * const mihomeEnvSample = await prisma.mihomeEnvSample.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one MihomeEnvSample. + * @param {MihomeEnvSampleUpsertArgs} args - Arguments to update or create a MihomeEnvSample. + * @example + * // Update or create a MihomeEnvSample + * const mihomeEnvSample = await prisma.mihomeEnvSample.upsert({ + * create: { + * // ... data to create a MihomeEnvSample + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the MihomeEnvSample we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeEnvSampleClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of MihomeEnvSamples. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleCountArgs} args - Arguments to filter MihomeEnvSamples to count. + * @example + * // Count the number of MihomeEnvSamples + * const count = await prisma.mihomeEnvSample.count({ + * where: { + * // ... the filter for the MihomeEnvSamples we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a MihomeEnvSample. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by MihomeEnvSample. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeEnvSampleGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends MihomeEnvSampleGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: MihomeEnvSampleGroupByArgs['orderBy'] } + : { orderBy?: MihomeEnvSampleGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetMihomeEnvSampleGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the MihomeEnvSample model + */ +readonly fields: MihomeEnvSampleFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for MihomeEnvSample. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__MihomeEnvSampleClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + device = {}>(args?: Prisma.Subset>): Prisma.Prisma__MihomeDeviceClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the MihomeEnvSample model + */ +export interface MihomeEnvSampleFieldRefs { + readonly id: Prisma.FieldRef<"MihomeEnvSample", 'Int'> + readonly deviceId: Prisma.FieldRef<"MihomeEnvSample", 'Int'> + readonly date: Prisma.FieldRef<"MihomeEnvSample", 'DateTime'> + readonly temperature: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly humidity: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly temperatureAvg: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly humidityAvg: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly temperatureMin: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly temperatureMax: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly humidityMin: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly humidityMax: Prisma.FieldRef<"MihomeEnvSample", 'Float'> + readonly origin: Prisma.FieldRef<"MihomeEnvSample", 'String'> + readonly sampledAt: Prisma.FieldRef<"MihomeEnvSample", 'DateTime'> + readonly raw: Prisma.FieldRef<"MihomeEnvSample", 'Json'> + readonly createdAt: Prisma.FieldRef<"MihomeEnvSample", 'DateTime'> +} + + +// Custom InputTypes +/** + * MihomeEnvSample findUnique + */ +export type MihomeEnvSampleFindUniqueArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * Filter, which MihomeEnvSample to fetch. + */ + where: Prisma.MihomeEnvSampleWhereUniqueInput +} + +/** + * MihomeEnvSample findUniqueOrThrow + */ +export type MihomeEnvSampleFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * Filter, which MihomeEnvSample to fetch. + */ + where: Prisma.MihomeEnvSampleWhereUniqueInput +} + +/** + * MihomeEnvSample findFirst + */ +export type MihomeEnvSampleFindFirstArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * Filter, which MihomeEnvSample to fetch. + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvSamples to fetch. + */ + orderBy?: Prisma.MihomeEnvSampleOrderByWithRelationInput | Prisma.MihomeEnvSampleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeEnvSamples. + */ + cursor?: Prisma.MihomeEnvSampleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvSamples from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvSamples. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeEnvSamples. + */ + distinct?: Prisma.MihomeEnvSampleScalarFieldEnum | Prisma.MihomeEnvSampleScalarFieldEnum[] +} + +/** + * MihomeEnvSample findFirstOrThrow + */ +export type MihomeEnvSampleFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * Filter, which MihomeEnvSample to fetch. + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvSamples to fetch. + */ + orderBy?: Prisma.MihomeEnvSampleOrderByWithRelationInput | Prisma.MihomeEnvSampleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeEnvSamples. + */ + cursor?: Prisma.MihomeEnvSampleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvSamples from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvSamples. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeEnvSamples. + */ + distinct?: Prisma.MihomeEnvSampleScalarFieldEnum | Prisma.MihomeEnvSampleScalarFieldEnum[] +} + +/** + * MihomeEnvSample findMany + */ +export type MihomeEnvSampleFindManyArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * Filter, which MihomeEnvSamples to fetch. + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeEnvSamples to fetch. + */ + orderBy?: Prisma.MihomeEnvSampleOrderByWithRelationInput | Prisma.MihomeEnvSampleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing MihomeEnvSamples. + */ + cursor?: Prisma.MihomeEnvSampleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeEnvSamples from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeEnvSamples. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeEnvSamples. + */ + distinct?: Prisma.MihomeEnvSampleScalarFieldEnum | Prisma.MihomeEnvSampleScalarFieldEnum[] +} + +/** + * MihomeEnvSample create + */ +export type MihomeEnvSampleCreateArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * The data needed to create a MihomeEnvSample. + */ + data: Prisma.XOR +} + +/** + * MihomeEnvSample createMany + */ +export type MihomeEnvSampleCreateManyArgs = { + /** + * The data used to create many MihomeEnvSamples. + */ + data: Prisma.MihomeEnvSampleCreateManyInput | Prisma.MihomeEnvSampleCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * MihomeEnvSample update + */ +export type MihomeEnvSampleUpdateArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * The data needed to update a MihomeEnvSample. + */ + data: Prisma.XOR + /** + * Choose, which MihomeEnvSample to update. + */ + where: Prisma.MihomeEnvSampleWhereUniqueInput +} + +/** + * MihomeEnvSample updateMany + */ +export type MihomeEnvSampleUpdateManyArgs = { + /** + * The data used to update MihomeEnvSamples. + */ + data: Prisma.XOR + /** + * Filter which MihomeEnvSamples to update + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * Limit how many MihomeEnvSamples to update. + */ + limit?: number +} + +/** + * MihomeEnvSample upsert + */ +export type MihomeEnvSampleUpsertArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * The filter to search for the MihomeEnvSample to update in case it exists. + */ + where: Prisma.MihomeEnvSampleWhereUniqueInput + /** + * In case the MihomeEnvSample found by the `where` argument doesn't exist, create a new MihomeEnvSample with this data. + */ + create: Prisma.XOR + /** + * In case the MihomeEnvSample was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * MihomeEnvSample delete + */ +export type MihomeEnvSampleDeleteArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null + /** + * Filter which MihomeEnvSample to delete. + */ + where: Prisma.MihomeEnvSampleWhereUniqueInput +} + +/** + * MihomeEnvSample deleteMany + */ +export type MihomeEnvSampleDeleteManyArgs = { + /** + * Filter which MihomeEnvSamples to delete + */ + where?: Prisma.MihomeEnvSampleWhereInput + /** + * Limit how many MihomeEnvSamples to delete. + */ + limit?: number +} + +/** + * MihomeEnvSample without action + */ +export type MihomeEnvSampleDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeEnvSample + */ + select?: Prisma.MihomeEnvSampleSelect | null + /** + * Omit specific fields from the MihomeEnvSample + */ + omit?: Prisma.MihomeEnvSampleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeEnvSampleInclude | null +} diff --git a/generated/prisma/models/MihomeHome.ts b/generated/prisma/models/MihomeHome.ts new file mode 100644 index 0000000..86b93c0 --- /dev/null +++ b/generated/prisma/models/MihomeHome.ts @@ -0,0 +1,1228 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `MihomeHome` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model MihomeHome + * + */ +export type MihomeHomeModel = runtime.Types.Result.DefaultSelection + +export type AggregateMihomeHome = { + _count: MihomeHomeCountAggregateOutputType | null + _avg: MihomeHomeAvgAggregateOutputType | null + _sum: MihomeHomeSumAggregateOutputType | null + _min: MihomeHomeMinAggregateOutputType | null + _max: MihomeHomeMaxAggregateOutputType | null +} + +export type MihomeHomeAvgAggregateOutputType = { + id: number | null +} + +export type MihomeHomeSumAggregateOutputType = { + id: number | null +} + +export type MihomeHomeMinAggregateOutputType = { + id: number | null + homeId: string | null + name: string | null + createdAt: Date | null +} + +export type MihomeHomeMaxAggregateOutputType = { + id: number | null + homeId: string | null + name: string | null + createdAt: Date | null +} + +export type MihomeHomeCountAggregateOutputType = { + id: number + homeId: number + name: number + createdAt: number + _all: number +} + + +export type MihomeHomeAvgAggregateInputType = { + id?: true +} + +export type MihomeHomeSumAggregateInputType = { + id?: true +} + +export type MihomeHomeMinAggregateInputType = { + id?: true + homeId?: true + name?: true + createdAt?: true +} + +export type MihomeHomeMaxAggregateInputType = { + id?: true + homeId?: true + name?: true + createdAt?: true +} + +export type MihomeHomeCountAggregateInputType = { + id?: true + homeId?: true + name?: true + createdAt?: true + _all?: true +} + +export type MihomeHomeAggregateArgs = { + /** + * Filter which MihomeHome to aggregate. + */ + where?: Prisma.MihomeHomeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeHomes to fetch. + */ + orderBy?: Prisma.MihomeHomeOrderByWithRelationInput | Prisma.MihomeHomeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.MihomeHomeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeHomes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeHomes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned MihomeHomes + **/ + _count?: true | MihomeHomeCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: MihomeHomeAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: MihomeHomeSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: MihomeHomeMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: MihomeHomeMaxAggregateInputType +} + +export type GetMihomeHomeAggregateType = { + [P in keyof T & keyof AggregateMihomeHome]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type MihomeHomeGroupByArgs = { + where?: Prisma.MihomeHomeWhereInput + orderBy?: Prisma.MihomeHomeOrderByWithAggregationInput | Prisma.MihomeHomeOrderByWithAggregationInput[] + by: Prisma.MihomeHomeScalarFieldEnum[] | Prisma.MihomeHomeScalarFieldEnum + having?: Prisma.MihomeHomeScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: MihomeHomeCountAggregateInputType | true + _avg?: MihomeHomeAvgAggregateInputType + _sum?: MihomeHomeSumAggregateInputType + _min?: MihomeHomeMinAggregateInputType + _max?: MihomeHomeMaxAggregateInputType +} + +export type MihomeHomeGroupByOutputType = { + id: number + homeId: string + name: string + createdAt: Date + _count: MihomeHomeCountAggregateOutputType | null + _avg: MihomeHomeAvgAggregateOutputType | null + _sum: MihomeHomeSumAggregateOutputType | null + _min: MihomeHomeMinAggregateOutputType | null + _max: MihomeHomeMaxAggregateOutputType | null +} + +export type GetMihomeHomeGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof MihomeHomeGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type MihomeHomeWhereInput = { + AND?: Prisma.MihomeHomeWhereInput | Prisma.MihomeHomeWhereInput[] + OR?: Prisma.MihomeHomeWhereInput[] + NOT?: Prisma.MihomeHomeWhereInput | Prisma.MihomeHomeWhereInput[] + id?: Prisma.IntFilter<"MihomeHome"> | number + homeId?: Prisma.StringFilter<"MihomeHome"> | string + name?: Prisma.StringFilter<"MihomeHome"> | string + createdAt?: Prisma.DateTimeFilter<"MihomeHome"> | Date | string + devices?: Prisma.MihomeDeviceListRelationFilter +} + +export type MihomeHomeOrderByWithRelationInput = { + id?: Prisma.SortOrder + homeId?: Prisma.SortOrder + name?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + devices?: Prisma.MihomeDeviceOrderByRelationAggregateInput + _relevance?: Prisma.MihomeHomeOrderByRelevanceInput +} + +export type MihomeHomeWhereUniqueInput = Prisma.AtLeast<{ + id?: number + homeId?: string + AND?: Prisma.MihomeHomeWhereInput | Prisma.MihomeHomeWhereInput[] + OR?: Prisma.MihomeHomeWhereInput[] + NOT?: Prisma.MihomeHomeWhereInput | Prisma.MihomeHomeWhereInput[] + name?: Prisma.StringFilter<"MihomeHome"> | string + createdAt?: Prisma.DateTimeFilter<"MihomeHome"> | Date | string + devices?: Prisma.MihomeDeviceListRelationFilter +}, "id" | "homeId"> + +export type MihomeHomeOrderByWithAggregationInput = { + id?: Prisma.SortOrder + homeId?: Prisma.SortOrder + name?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.MihomeHomeCountOrderByAggregateInput + _avg?: Prisma.MihomeHomeAvgOrderByAggregateInput + _max?: Prisma.MihomeHomeMaxOrderByAggregateInput + _min?: Prisma.MihomeHomeMinOrderByAggregateInput + _sum?: Prisma.MihomeHomeSumOrderByAggregateInput +} + +export type MihomeHomeScalarWhereWithAggregatesInput = { + AND?: Prisma.MihomeHomeScalarWhereWithAggregatesInput | Prisma.MihomeHomeScalarWhereWithAggregatesInput[] + OR?: Prisma.MihomeHomeScalarWhereWithAggregatesInput[] + NOT?: Prisma.MihomeHomeScalarWhereWithAggregatesInput | Prisma.MihomeHomeScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"MihomeHome"> | number + homeId?: Prisma.StringWithAggregatesFilter<"MihomeHome"> | string + name?: Prisma.StringWithAggregatesFilter<"MihomeHome"> | string + createdAt?: Prisma.DateTimeWithAggregatesFilter<"MihomeHome"> | Date | string +} + +export type MihomeHomeCreateInput = { + homeId: string + name: string + createdAt?: Date | string + devices?: Prisma.MihomeDeviceCreateNestedManyWithoutHomeInput +} + +export type MihomeHomeUncheckedCreateInput = { + id?: number + homeId: string + name: string + createdAt?: Date | string + devices?: Prisma.MihomeDeviceUncheckedCreateNestedManyWithoutHomeInput +} + +export type MihomeHomeUpdateInput = { + homeId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + devices?: Prisma.MihomeDeviceUpdateManyWithoutHomeNestedInput +} + +export type MihomeHomeUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + homeId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + devices?: Prisma.MihomeDeviceUncheckedUpdateManyWithoutHomeNestedInput +} + +export type MihomeHomeCreateManyInput = { + id?: number + homeId: string + name: string + createdAt?: Date | string +} + +export type MihomeHomeUpdateManyMutationInput = { + homeId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeHomeUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + homeId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeHomeOrderByRelevanceInput = { + fields: Prisma.MihomeHomeOrderByRelevanceFieldEnum | Prisma.MihomeHomeOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type MihomeHomeCountOrderByAggregateInput = { + id?: Prisma.SortOrder + homeId?: Prisma.SortOrder + name?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeHomeAvgOrderByAggregateInput = { + id?: Prisma.SortOrder +} + +export type MihomeHomeMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + homeId?: Prisma.SortOrder + name?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeHomeMinOrderByAggregateInput = { + id?: Prisma.SortOrder + homeId?: Prisma.SortOrder + name?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type MihomeHomeSumOrderByAggregateInput = { + id?: Prisma.SortOrder +} + +export type MihomeHomeScalarRelationFilter = { + is?: Prisma.MihomeHomeWhereInput + isNot?: Prisma.MihomeHomeWhereInput +} + +export type MihomeHomeCreateNestedOneWithoutDevicesInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.MihomeHomeCreateOrConnectWithoutDevicesInput + connect?: Prisma.MihomeHomeWhereUniqueInput +} + +export type MihomeHomeUpdateOneRequiredWithoutDevicesNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.MihomeHomeCreateOrConnectWithoutDevicesInput + upsert?: Prisma.MihomeHomeUpsertWithoutDevicesInput + connect?: Prisma.MihomeHomeWhereUniqueInput + update?: Prisma.XOR, Prisma.MihomeHomeUncheckedUpdateWithoutDevicesInput> +} + +export type MihomeHomeCreateWithoutDevicesInput = { + homeId: string + name: string + createdAt?: Date | string +} + +export type MihomeHomeUncheckedCreateWithoutDevicesInput = { + id?: number + homeId: string + name: string + createdAt?: Date | string +} + +export type MihomeHomeCreateOrConnectWithoutDevicesInput = { + where: Prisma.MihomeHomeWhereUniqueInput + create: Prisma.XOR +} + +export type MihomeHomeUpsertWithoutDevicesInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.MihomeHomeWhereInput +} + +export type MihomeHomeUpdateToOneWithWhereWithoutDevicesInput = { + where?: Prisma.MihomeHomeWhereInput + data: Prisma.XOR +} + +export type MihomeHomeUpdateWithoutDevicesInput = { + homeId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type MihomeHomeUncheckedUpdateWithoutDevicesInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + homeId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + +/** + * Count Type MihomeHomeCountOutputType + */ + +export type MihomeHomeCountOutputType = { + devices: number +} + +export type MihomeHomeCountOutputTypeSelect = { + devices?: boolean | MihomeHomeCountOutputTypeCountDevicesArgs +} + +/** + * MihomeHomeCountOutputType without action + */ +export type MihomeHomeCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeHomeCountOutputType + */ + select?: Prisma.MihomeHomeCountOutputTypeSelect | null +} + +/** + * MihomeHomeCountOutputType without action + */ +export type MihomeHomeCountOutputTypeCountDevicesArgs = { + where?: Prisma.MihomeDeviceWhereInput +} + + +export type MihomeHomeSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + homeId?: boolean + name?: boolean + createdAt?: boolean + devices?: boolean | Prisma.MihomeHome$devicesArgs + _count?: boolean | Prisma.MihomeHomeCountOutputTypeDefaultArgs +}, ExtArgs["result"]["mihomeHome"]> + + + +export type MihomeHomeSelectScalar = { + id?: boolean + homeId?: boolean + name?: boolean + createdAt?: boolean +} + +export type MihomeHomeOmit = runtime.Types.Extensions.GetOmit<"id" | "homeId" | "name" | "createdAt", ExtArgs["result"]["mihomeHome"]> +export type MihomeHomeInclude = { + devices?: boolean | Prisma.MihomeHome$devicesArgs + _count?: boolean | Prisma.MihomeHomeCountOutputTypeDefaultArgs +} + +export type $MihomeHomePayload = { + name: "MihomeHome" + objects: { + devices: Prisma.$MihomeDevicePayload[] + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + homeId: string + name: string + createdAt: Date + }, ExtArgs["result"]["mihomeHome"]> + composites: {} +} + +export type MihomeHomeGetPayload = runtime.Types.Result.GetResult + +export type MihomeHomeCountArgs = + Omit & { + select?: MihomeHomeCountAggregateInputType | true + } + +export interface MihomeHomeDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['MihomeHome'], meta: { name: 'MihomeHome' } } + /** + * Find zero or one MihomeHome that matches the filter. + * @param {MihomeHomeFindUniqueArgs} args - Arguments to find a MihomeHome + * @example + * // Get one MihomeHome + * const mihomeHome = await prisma.mihomeHome.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one MihomeHome that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {MihomeHomeFindUniqueOrThrowArgs} args - Arguments to find a MihomeHome + * @example + * // Get one MihomeHome + * const mihomeHome = await prisma.mihomeHome.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeHome that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeFindFirstArgs} args - Arguments to find a MihomeHome + * @example + * // Get one MihomeHome + * const mihomeHome = await prisma.mihomeHome.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first MihomeHome that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeFindFirstOrThrowArgs} args - Arguments to find a MihomeHome + * @example + * // Get one MihomeHome + * const mihomeHome = await prisma.mihomeHome.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more MihomeHomes that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all MihomeHomes + * const mihomeHomes = await prisma.mihomeHome.findMany() + * + * // Get first 10 MihomeHomes + * const mihomeHomes = await prisma.mihomeHome.findMany({ take: 10 }) + * + * // Only select the `id` + * const mihomeHomeWithIdOnly = await prisma.mihomeHome.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a MihomeHome. + * @param {MihomeHomeCreateArgs} args - Arguments to create a MihomeHome. + * @example + * // Create one MihomeHome + * const MihomeHome = await prisma.mihomeHome.create({ + * data: { + * // ... data to create a MihomeHome + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many MihomeHomes. + * @param {MihomeHomeCreateManyArgs} args - Arguments to create many MihomeHomes. + * @example + * // Create many MihomeHomes + * const mihomeHome = await prisma.mihomeHome.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a MihomeHome. + * @param {MihomeHomeDeleteArgs} args - Arguments to delete one MihomeHome. + * @example + * // Delete one MihomeHome + * const MihomeHome = await prisma.mihomeHome.delete({ + * where: { + * // ... filter to delete one MihomeHome + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one MihomeHome. + * @param {MihomeHomeUpdateArgs} args - Arguments to update one MihomeHome. + * @example + * // Update one MihomeHome + * const mihomeHome = await prisma.mihomeHome.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more MihomeHomes. + * @param {MihomeHomeDeleteManyArgs} args - Arguments to filter MihomeHomes to delete. + * @example + * // Delete a few MihomeHomes + * const { count } = await prisma.mihomeHome.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more MihomeHomes. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many MihomeHomes + * const mihomeHome = await prisma.mihomeHome.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one MihomeHome. + * @param {MihomeHomeUpsertArgs} args - Arguments to update or create a MihomeHome. + * @example + * // Update or create a MihomeHome + * const mihomeHome = await prisma.mihomeHome.upsert({ + * create: { + * // ... data to create a MihomeHome + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the MihomeHome we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__MihomeHomeClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of MihomeHomes. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeCountArgs} args - Arguments to filter MihomeHomes to count. + * @example + * // Count the number of MihomeHomes + * const count = await prisma.mihomeHome.count({ + * where: { + * // ... the filter for the MihomeHomes we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a MihomeHome. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by MihomeHome. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {MihomeHomeGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends MihomeHomeGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: MihomeHomeGroupByArgs['orderBy'] } + : { orderBy?: MihomeHomeGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetMihomeHomeGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the MihomeHome model + */ +readonly fields: MihomeHomeFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for MihomeHome. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__MihomeHomeClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + devices = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the MihomeHome model + */ +export interface MihomeHomeFieldRefs { + readonly id: Prisma.FieldRef<"MihomeHome", 'Int'> + readonly homeId: Prisma.FieldRef<"MihomeHome", 'String'> + readonly name: Prisma.FieldRef<"MihomeHome", 'String'> + readonly createdAt: Prisma.FieldRef<"MihomeHome", 'DateTime'> +} + + +// Custom InputTypes +/** + * MihomeHome findUnique + */ +export type MihomeHomeFindUniqueArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * Filter, which MihomeHome to fetch. + */ + where: Prisma.MihomeHomeWhereUniqueInput +} + +/** + * MihomeHome findUniqueOrThrow + */ +export type MihomeHomeFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * Filter, which MihomeHome to fetch. + */ + where: Prisma.MihomeHomeWhereUniqueInput +} + +/** + * MihomeHome findFirst + */ +export type MihomeHomeFindFirstArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * Filter, which MihomeHome to fetch. + */ + where?: Prisma.MihomeHomeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeHomes to fetch. + */ + orderBy?: Prisma.MihomeHomeOrderByWithRelationInput | Prisma.MihomeHomeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeHomes. + */ + cursor?: Prisma.MihomeHomeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeHomes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeHomes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeHomes. + */ + distinct?: Prisma.MihomeHomeScalarFieldEnum | Prisma.MihomeHomeScalarFieldEnum[] +} + +/** + * MihomeHome findFirstOrThrow + */ +export type MihomeHomeFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * Filter, which MihomeHome to fetch. + */ + where?: Prisma.MihomeHomeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeHomes to fetch. + */ + orderBy?: Prisma.MihomeHomeOrderByWithRelationInput | Prisma.MihomeHomeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for MihomeHomes. + */ + cursor?: Prisma.MihomeHomeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeHomes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeHomes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeHomes. + */ + distinct?: Prisma.MihomeHomeScalarFieldEnum | Prisma.MihomeHomeScalarFieldEnum[] +} + +/** + * MihomeHome findMany + */ +export type MihomeHomeFindManyArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * Filter, which MihomeHomes to fetch. + */ + where?: Prisma.MihomeHomeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of MihomeHomes to fetch. + */ + orderBy?: Prisma.MihomeHomeOrderByWithRelationInput | Prisma.MihomeHomeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing MihomeHomes. + */ + cursor?: Prisma.MihomeHomeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` MihomeHomes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` MihomeHomes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of MihomeHomes. + */ + distinct?: Prisma.MihomeHomeScalarFieldEnum | Prisma.MihomeHomeScalarFieldEnum[] +} + +/** + * MihomeHome create + */ +export type MihomeHomeCreateArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * The data needed to create a MihomeHome. + */ + data: Prisma.XOR +} + +/** + * MihomeHome createMany + */ +export type MihomeHomeCreateManyArgs = { + /** + * The data used to create many MihomeHomes. + */ + data: Prisma.MihomeHomeCreateManyInput | Prisma.MihomeHomeCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * MihomeHome update + */ +export type MihomeHomeUpdateArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * The data needed to update a MihomeHome. + */ + data: Prisma.XOR + /** + * Choose, which MihomeHome to update. + */ + where: Prisma.MihomeHomeWhereUniqueInput +} + +/** + * MihomeHome updateMany + */ +export type MihomeHomeUpdateManyArgs = { + /** + * The data used to update MihomeHomes. + */ + data: Prisma.XOR + /** + * Filter which MihomeHomes to update + */ + where?: Prisma.MihomeHomeWhereInput + /** + * Limit how many MihomeHomes to update. + */ + limit?: number +} + +/** + * MihomeHome upsert + */ +export type MihomeHomeUpsertArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * The filter to search for the MihomeHome to update in case it exists. + */ + where: Prisma.MihomeHomeWhereUniqueInput + /** + * In case the MihomeHome found by the `where` argument doesn't exist, create a new MihomeHome with this data. + */ + create: Prisma.XOR + /** + * In case the MihomeHome was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * MihomeHome delete + */ +export type MihomeHomeDeleteArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null + /** + * Filter which MihomeHome to delete. + */ + where: Prisma.MihomeHomeWhereUniqueInput +} + +/** + * MihomeHome deleteMany + */ +export type MihomeHomeDeleteManyArgs = { + /** + * Filter which MihomeHomes to delete + */ + where?: Prisma.MihomeHomeWhereInput + /** + * Limit how many MihomeHomes to delete. + */ + limit?: number +} + +/** + * MihomeHome.devices + */ +export type MihomeHome$devicesArgs = { + /** + * Select specific fields to fetch from the MihomeDevice + */ + select?: Prisma.MihomeDeviceSelect | null + /** + * Omit specific fields from the MihomeDevice + */ + omit?: Prisma.MihomeDeviceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeDeviceInclude | null + where?: Prisma.MihomeDeviceWhereInput + orderBy?: Prisma.MihomeDeviceOrderByWithRelationInput | Prisma.MihomeDeviceOrderByWithRelationInput[] + cursor?: Prisma.MihomeDeviceWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.MihomeDeviceScalarFieldEnum | Prisma.MihomeDeviceScalarFieldEnum[] +} + +/** + * MihomeHome without action + */ +export type MihomeHomeDefaultArgs = { + /** + * Select specific fields to fetch from the MihomeHome + */ + select?: Prisma.MihomeHomeSelect | null + /** + * Omit specific fields from the MihomeHome + */ + omit?: Prisma.MihomeHomeOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.MihomeHomeInclude | null +} diff --git a/package-lock.json b/package-lock.json index 3919ad6..1531417 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,11 @@ "name": "iboard", "version": "1.0.0", "dependencies": { - "@huolala-tech/page-spy": "^1.5.7", "@prisma/adapter-mariadb": "^7.9.1", "@prisma/client": "^7.7.0", + "@zythum02/mijia-api": "^0.1.4", "antd-mobile": "^5.42.3", + "axios": "^1.15.0", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.0", @@ -32,7 +33,6 @@ "@tauri-apps/api": "^2.0.0", "@tauri-apps/cli": "^2.0.0", "@vitejs/plugin-react": "^4.3.1", - "axios": "^1.15.0", "cheerio": "^1.2.0", "concurrently": "^9.0.0", "csv-parser": "^3.2.0", @@ -42,7 +42,7 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", @@ -57,7 +57,7 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", @@ -67,7 +67,7 @@ }, "node_modules/@babel/core": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", @@ -98,7 +98,7 @@ }, "node_modules/@babel/generator": { "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.8.tgz", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", @@ -115,7 +115,7 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", @@ -132,7 +132,7 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -142,7 +142,7 @@ }, "node_modules/@babel/helper-globals": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", @@ -152,7 +152,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", @@ -166,7 +166,7 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", @@ -184,7 +184,7 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", @@ -194,7 +194,7 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", @@ -204,7 +204,7 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", @@ -214,7 +214,7 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", @@ -224,7 +224,7 @@ }, "node_modules/@babel/helpers": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", @@ -238,7 +238,7 @@ }, "node_modules/@babel/parser": { "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", @@ -254,7 +254,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", "dev": true, "license": "MIT", @@ -270,7 +270,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", "dev": true, "license": "MIT", @@ -286,7 +286,7 @@ }, "node_modules/@babel/runtime": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { @@ -295,7 +295,7 @@ }, "node_modules/@babel/template": { "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", @@ -310,7 +310,7 @@ }, "node_modules/@babel/traverse": { "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.8.tgz", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", @@ -329,7 +329,7 @@ }, "node_modules/@babel/types": { "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", @@ -343,13 +343,13 @@ }, "node_modules/@electric-sql/pglite": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/@electric-sql/pglite/-/pglite-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.1.tgz", "integrity": "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==", "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz", "integrity": "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==", "license": "Apache-2.0", "bin": { @@ -361,7 +361,7 @@ }, "node_modules/@electric-sql/pglite-tools": { "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz", "integrity": "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==", "license": "Apache-2.0", "peerDependencies": { @@ -381,7 +381,7 @@ }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" @@ -398,7 +398,7 @@ }, "node_modules/@esbuild/android-arm": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" @@ -415,7 +415,7 @@ }, "node_modules/@esbuild/android-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" @@ -432,7 +432,7 @@ }, "node_modules/@esbuild/android-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" @@ -449,7 +449,7 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" @@ -466,7 +466,7 @@ }, "node_modules/@esbuild/darwin-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" @@ -483,7 +483,7 @@ }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" @@ -500,7 +500,7 @@ }, "node_modules/@esbuild/freebsd-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" @@ -517,7 +517,7 @@ }, "node_modules/@esbuild/linux-arm": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" @@ -534,7 +534,7 @@ }, "node_modules/@esbuild/linux-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" @@ -551,7 +551,7 @@ }, "node_modules/@esbuild/linux-ia32": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" @@ -568,7 +568,7 @@ }, "node_modules/@esbuild/linux-loong64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" @@ -585,7 +585,7 @@ }, "node_modules/@esbuild/linux-mips64el": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" @@ -602,7 +602,7 @@ }, "node_modules/@esbuild/linux-ppc64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" @@ -619,7 +619,7 @@ }, "node_modules/@esbuild/linux-riscv64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" @@ -636,7 +636,7 @@ }, "node_modules/@esbuild/linux-s390x": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" @@ -653,7 +653,7 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" @@ -670,7 +670,7 @@ }, "node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" @@ -687,7 +687,7 @@ }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" @@ -704,7 +704,7 @@ }, "node_modules/@esbuild/sunos-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" @@ -721,7 +721,7 @@ }, "node_modules/@esbuild/win32-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" @@ -738,7 +738,7 @@ }, "node_modules/@esbuild/win32-ia32": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" @@ -755,7 +755,7 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" @@ -772,7 +772,7 @@ }, "node_modules/@floating-ui/core": { "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.8.0.tgz", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { @@ -781,7 +781,7 @@ }, "node_modules/@floating-ui/dom": { "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.8.0.tgz", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { @@ -791,13 +791,13 @@ }, "node_modules/@floating-ui/utils": { "version": "0.2.12", - "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.12.tgz", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@hono/node-server": { "version": "1.19.11", - "resolved": "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.11.tgz", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", "license": "MIT", "engines": { @@ -807,20 +807,6 @@ "hono": "^4" } }, - "node_modules/@huolala-tech/page-spy": { - "version": "1.5.7", - "resolved": "https://registry.npmmirror.com/@huolala-tech/page-spy/-/page-spy-1.5.7.tgz", - "integrity": "sha512-M19WkH6K2taPpdi7gZ9Tz6v0vY/yW4ziffPXdU+p9+pdSmu1s0OhfxjcsWgERAYsaRLZNloSWqJZyWT5zsYIwA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.0", - "copy-to-clipboard": "^3.3.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", @@ -1203,7 +1189,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", @@ -1214,7 +1200,7 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", @@ -1225,7 +1211,7 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", @@ -1235,14 +1221,14 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", @@ -1253,13 +1239,368 @@ }, "node_modules/@kurkle/color": { "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.4.tgz", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9 || ^2.0.5", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/@napi-rs/lzma-linux-x64-gnu": { "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", "cpu": [ "x64" @@ -1276,7 +1617,7 @@ }, "node_modules/@prisma/adapter-mariadb": { "version": "7.9.1", - "resolved": "https://registry.npmmirror.com/@prisma/adapter-mariadb/-/adapter-mariadb-7.9.1.tgz", + "resolved": "https://registry.npmjs.org/@prisma/adapter-mariadb/-/adapter-mariadb-7.9.1.tgz", "integrity": "sha512-4aZUbIg2av7XFSQyM9cQeAp9YP9HiPr8H7ehe2rDo375IZXILEzQrNXZ/zLetgRQ2ojlaUl/brArFdOVS3n1xA==", "license": "Apache-2.0", "dependencies": { @@ -1286,7 +1627,7 @@ }, "node_modules/@prisma/adapter-mariadb/node_modules/@types/node": { "version": "24.13.3", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.13.3.tgz", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", "dependencies": { @@ -1295,7 +1636,7 @@ }, "node_modules/@prisma/adapter-mariadb/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { @@ -1307,13 +1648,13 @@ }, "node_modules/@prisma/adapter-mariadb/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/@prisma/adapter-mariadb/node_modules/mariadb": { "version": "3.4.5", - "resolved": "https://registry.npmmirror.com/mariadb/-/mariadb-3.4.5.tgz", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.5.tgz", "integrity": "sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==", "license": "LGPL-2.1-or-later", "dependencies": { @@ -1329,13 +1670,13 @@ }, "node_modules/@prisma/adapter-mariadb/node_modules/undici-types": { "version": "7.18.2", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/@prisma/client": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/client/-/client-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.7.0.tgz", "integrity": "sha512-5Ar4OsZpJ54s21sy5oDNNW9gQtd4NuxCaiM7+JDTOU07D6VvlpLjYzAVCMB1+JzokN+08dAVomlx+b7bhJd3ww==", "license": "Apache-2.0", "dependencies": { @@ -1359,13 +1700,13 @@ }, "node_modules/@prisma/client-runtime-utils": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/client-runtime-utils/-/client-runtime-utils-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.7.0.tgz", "integrity": "sha512-BLyd0UpFYOtyJFTHm7jS9vesHW7P83abibodQMiIofqjBKzDHQ1VAsQkdfvXyYDkPlONPfOTz7/rv3x/+CQqvQ==", "license": "Apache-2.0" }, "node_modules/@prisma/config": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/config/-/config-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.7.0.tgz", "integrity": "sha512-hmPI3tKLO2aP0Y5vugbjcnA9qqlfJndiT6ds4tw28U5hNHLWg+mHJEWAhjsSPgxjtmxhJ/EDIeIlyh+3Us0OPg==", "license": "Apache-2.0", "dependencies": { @@ -1377,13 +1718,13 @@ }, "node_modules/@prisma/debug": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/debug/-/debug-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.7.0.tgz", "integrity": "sha512-12J62XdqCmpiwJHhHdQxZeY3ckVCWIFmcJP8hg5dPTceeiQ0wiojXGFYTluKqFQfu46fRLgb/rLALZMAx3+dTA==", "license": "Apache-2.0" }, "node_modules/@prisma/dev": { "version": "0.24.3", - "resolved": "https://registry.npmmirror.com/@prisma/dev/-/dev-0.24.3.tgz", + "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.24.3.tgz", "integrity": "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==", "license": "ISC", "dependencies": { @@ -1408,7 +1749,7 @@ }, "node_modules/@prisma/driver-adapter-utils": { "version": "7.9.1", - "resolved": "https://registry.npmmirror.com/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.9.1.tgz", + "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.9.1.tgz", "integrity": "sha512-vmHehG7nn/heW32DXXpp13DxxAxVVe6n250oEt3dOL2E/4bt3olktKZN0mzSuxMMronyMSkbeW2uCOn3F4g8RQ==", "license": "Apache-2.0", "dependencies": { @@ -1417,13 +1758,13 @@ }, "node_modules/@prisma/driver-adapter-utils/node_modules/@prisma/debug": { "version": "7.9.1", - "resolved": "https://registry.npmmirror.com/@prisma/debug/-/debug-7.9.1.tgz", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.9.1.tgz", "integrity": "sha512-/cpVZ4itxtcgB8GHBvZtcmuEjq+lWsLrRJxFMbwZrT1RIdtuKmUm7PPGo/wzfbYpBrk+9WmmBE8CHJw2rybKDQ==", "license": "Apache-2.0" }, "node_modules/@prisma/engines": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/engines/-/engines-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.7.0.tgz", "integrity": "sha512-7fmcbT7HHXBq/b+3h/dO1JI3fd8l8q7erf7xP7pRprh58hmSSnG8mg9K3yjW3h9WaHWUwngVFpSxxxivaitQ2w==", "hasInstallScript": true, "license": "Apache-2.0", @@ -1436,13 +1777,13 @@ }, "node_modules/@prisma/engines-version": { "version": "7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711", - "resolved": "https://registry.npmmirror.com/@prisma/engines-version/-/engines-version-7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711.tgz", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711.tgz", "integrity": "sha512-r51DLcJ8bDRSrBEJF3J4cinoWyGA7rfP2mG6lD90VqIbGNOkbfcLcXalSVjq5Y6brQS3vcjrq4GbyUb1Cb7vkw==", "license": "Apache-2.0" }, "node_modules/@prisma/engines/node_modules/@prisma/get-platform": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/get-platform/-/get-platform-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.7.0.tgz", "integrity": "sha512-MEUNzvKxvYnJ7kgvd6oNRnMmmiGNS9TYLB2weMeIXplnHdL/UWEGnvavYGnN7KLJ2n0iI4dDAyzSkHI3c7AscQ==", "license": "Apache-2.0", "dependencies": { @@ -1451,7 +1792,7 @@ }, "node_modules/@prisma/fetch-engine": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/fetch-engine/-/fetch-engine-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.7.0.tgz", "integrity": "sha512-TfyzveBQoK4xALzsTpVhB/0KG1N8zOK0ap+RnBMkzGUu3f98fnQ4QtXa2wlKPhsO2X8a3N5ugFQgcKNoHGmDfw==", "license": "Apache-2.0", "dependencies": { @@ -1462,7 +1803,7 @@ }, "node_modules/@prisma/fetch-engine/node_modules/@prisma/get-platform": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@prisma/get-platform/-/get-platform-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.7.0.tgz", "integrity": "sha512-MEUNzvKxvYnJ7kgvd6oNRnMmmiGNS9TYLB2weMeIXplnHdL/UWEGnvavYGnN7KLJ2n0iI4dDAyzSkHI3c7AscQ==", "license": "Apache-2.0", "dependencies": { @@ -1471,7 +1812,7 @@ }, "node_modules/@prisma/get-platform": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/@prisma/get-platform/-/get-platform-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", "license": "Apache-2.0", "dependencies": { @@ -1480,19 +1821,19 @@ }, "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/@prisma/debug/-/debug-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", "license": "Apache-2.0" }, "node_modules/@prisma/query-plan-executor": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", "integrity": "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==", "license": "Apache-2.0" }, "node_modules/@prisma/streams-local": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/@prisma/streams-local/-/streams-local-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.2.tgz", "integrity": "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==", "license": "Apache-2.0", "dependencies": { @@ -1508,7 +1849,7 @@ }, "node_modules/@prisma/studio-core": { "version": "0.27.3", - "resolved": "https://registry.npmmirror.com/@prisma/studio-core/-/studio-core-0.27.3.tgz", + "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.27.3.tgz", "integrity": "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==", "license": "Apache-2.0", "dependencies": { @@ -1527,13 +1868,13 @@ }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "license": "MIT" }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "license": "MIT", "peerDependencies": { @@ -1548,7 +1889,7 @@ }, "node_modules/@radix-ui/react-primitive": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { @@ -1571,7 +1912,7 @@ }, "node_modules/@radix-ui/react-slot": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { @@ -1589,7 +1930,7 @@ }, "node_modules/@radix-ui/react-toggle": { "version": "1.1.10", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", "license": "MIT", "dependencies": { @@ -1614,7 +1955,7 @@ }, "node_modules/@radix-ui/react-use-controllable-state": { "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", "dependencies": { @@ -1633,7 +1974,7 @@ }, "node_modules/@radix-ui/react-use-effect-event": { "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "license": "MIT", "dependencies": { @@ -1651,7 +1992,7 @@ }, "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", "peerDependencies": { @@ -1666,7 +2007,7 @@ }, "node_modules/@rc-component/mini-decimal": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.4.tgz", "integrity": "sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==", "license": "MIT", "dependencies": { @@ -1678,7 +2019,7 @@ }, "node_modules/@react-spring/animated": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/@react-spring/animated/-/animated-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", "license": "MIT", "dependencies": { @@ -1691,7 +2032,7 @@ }, "node_modules/@react-spring/core": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/@react-spring/core/-/core-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", "license": "MIT", "dependencies": { @@ -1710,13 +2051,13 @@ }, "node_modules/@react-spring/rafz": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/@react-spring/rafz/-/rafz-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==", "license": "MIT" }, "node_modules/@react-spring/shared": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/@react-spring/shared/-/shared-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", "license": "MIT", "dependencies": { @@ -1729,13 +2070,13 @@ }, "node_modules/@react-spring/types": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/@react-spring/types/-/types-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==", "license": "MIT" }, "node_modules/@react-spring/web": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/@react-spring/web/-/web-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.6.1.tgz", "integrity": "sha512-X2zR6q2Z+FjsWfGAmAXlQaoUHbPmfuCaXpuM6TcwXPpLE1ZD4A1eys/wpXboFQmDkjnrlTmKvpVna1MjWpZ5Hw==", "license": "MIT", "dependencies": { @@ -1787,7 +2128,7 @@ }, "node_modules/@remix-run/router": { "version": "1.23.3", - "resolved": "https://registry.npmmirror.com/@remix-run/router/-/router-1.23.3.tgz", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", "license": "MIT", "engines": { @@ -1796,14 +2137,14 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", - "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", "cpu": [ "arm" @@ -1817,7 +2158,7 @@ }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", "cpu": [ "arm64" @@ -1831,7 +2172,7 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", "cpu": [ "arm64" @@ -1845,7 +2186,7 @@ }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", "cpu": [ "x64" @@ -1859,7 +2200,7 @@ }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", "cpu": [ "arm64" @@ -1873,7 +2214,7 @@ }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", "cpu": [ "x64" @@ -1887,7 +2228,7 @@ }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", "cpu": [ "arm" @@ -1901,7 +2242,7 @@ }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", "cpu": [ "arm" @@ -1915,7 +2256,7 @@ }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", "cpu": [ "arm64" @@ -1929,7 +2270,7 @@ }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", "cpu": [ "arm64" @@ -1943,7 +2284,7 @@ }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", "cpu": [ "loong64" @@ -1957,7 +2298,7 @@ }, "node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", "cpu": [ "loong64" @@ -1971,7 +2312,7 @@ }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", "cpu": [ "ppc64" @@ -1985,7 +2326,7 @@ }, "node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", "cpu": [ "ppc64" @@ -1999,7 +2340,7 @@ }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", "cpu": [ "riscv64" @@ -2013,7 +2354,7 @@ }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", "cpu": [ "riscv64" @@ -2027,7 +2368,7 @@ }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", "cpu": [ "s390x" @@ -2041,7 +2382,7 @@ }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", "cpu": [ "x64" @@ -2055,7 +2396,7 @@ }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", "cpu": [ "x64" @@ -2069,7 +2410,7 @@ }, "node_modules/@rollup/rollup-openbsd-x64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", "cpu": [ "x64" @@ -2083,7 +2424,7 @@ }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", "cpu": [ "arm64" @@ -2097,7 +2438,7 @@ }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", "cpu": [ "arm64" @@ -2111,7 +2452,7 @@ }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", "cpu": [ "ia32" @@ -2125,7 +2466,7 @@ }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", "cpu": [ "x64" @@ -2139,7 +2480,7 @@ }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", "cpu": [ "x64" @@ -2165,7 +2506,7 @@ }, "node_modules/@tauri-apps/api": { "version": "2.11.1", - "resolved": "https://registry.npmmirror.com/@tauri-apps/api/-/api-2.11.1.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz", "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", "license": "Apache-2.0 OR MIT", "funding": { @@ -2175,7 +2516,7 @@ }, "node_modules/@tauri-apps/cli": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli/-/cli-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.11.4.tgz", "integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==", "dev": true, "license": "Apache-2.0 OR MIT", @@ -2205,7 +2546,7 @@ }, "node_modules/@tauri-apps/cli-darwin-arm64": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz", "integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==", "cpu": [ "arm64" @@ -2222,7 +2563,7 @@ }, "node_modules/@tauri-apps/cli-darwin-x64": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz", "integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==", "cpu": [ "x64" @@ -2239,7 +2580,7 @@ }, "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz", "integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==", "cpu": [ "arm" @@ -2256,7 +2597,7 @@ }, "node_modules/@tauri-apps/cli-linux-arm64-gnu": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz", "integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==", "cpu": [ "arm64" @@ -2273,7 +2614,7 @@ }, "node_modules/@tauri-apps/cli-linux-arm64-musl": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz", "integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==", "cpu": [ "arm64" @@ -2290,7 +2631,7 @@ }, "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz", "integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==", "cpu": [ "riscv64" @@ -2307,7 +2648,7 @@ }, "node_modules/@tauri-apps/cli-linux-x64-gnu": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz", "integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==", "cpu": [ "x64" @@ -2324,7 +2665,7 @@ }, "node_modules/@tauri-apps/cli-linux-x64-musl": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz", "integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==", "cpu": [ "x64" @@ -2341,7 +2682,7 @@ }, "node_modules/@tauri-apps/cli-win32-arm64-msvc": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz", "integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==", "cpu": [ "arm64" @@ -2358,7 +2699,7 @@ }, "node_modules/@tauri-apps/cli-win32-ia32-msvc": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz", "integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==", "cpu": [ "ia32" @@ -2375,7 +2716,7 @@ }, "node_modules/@tauri-apps/cli-win32-x64-msvc": { "version": "2.11.4", - "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz", "integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==", "cpu": [ "x64" @@ -2392,7 +2733,7 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", @@ -2406,7 +2747,7 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", @@ -2416,7 +2757,7 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", @@ -2427,7 +2768,7 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", @@ -2500,26 +2841,26 @@ }, "node_modules/@types/estree": { "version": "1.0.9", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { "version": "7946.0.16", - "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, "node_modules/@types/js-cookie": { "version": "3.0.6", - "resolved": "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", "license": "MIT" }, "node_modules/@types/node": { "version": "26.1.2", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-26.1.2.tgz", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", "license": "MIT", "dependencies": { @@ -2528,7 +2869,7 @@ }, "node_modules/@types/react": { "version": "19.2.14", - "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.14.tgz", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", "peer": true, @@ -2544,13 +2885,13 @@ }, "node_modules/@use-gesture/core": { "version": "10.3.0", - "resolved": "https://registry.npmmirror.com/@use-gesture/core/-/core-10.3.0.tgz", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.0.tgz", "integrity": "sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==", "license": "MIT" }, "node_modules/@use-gesture/react": { "version": "10.3.0", - "resolved": "https://registry.npmmirror.com/@use-gesture/react/-/react-10.3.0.tgz", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.0.tgz", "integrity": "sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==", "license": "MIT", "dependencies": { @@ -2562,7 +2903,7 @@ }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", @@ -2581,9 +2922,70 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@zythum02/mijia-api": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@zythum02/mijia-api/-/mijia-api-0.1.4.tgz", + "integrity": "sha512-B+wUdF1xtLH0j1g3Nz/AwbMqj1Ug+N2AJ8O49+3ZTWvpy1lW+OZUBs1Z/HVKdigmyG+BfcnjUk+/7Gt/Z2zccA==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.29.0", + "chalk": "^5.4.1", + "commander": "^13.1.0", + "js-yaml": "^4.1.1", + "pako": "^2.1.0", + "qrcode-terminal": "^0.12.0", + "zod": "^4.4.3" + }, + "bin": { + "mijia-api": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@zythum02/mijia-api/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@zythum02/mijia-api/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@zythum02/mijia-api/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { @@ -2596,7 +2998,7 @@ }, "node_modules/ahooks": { "version": "3.9.7", - "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.7.tgz", + "resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.9.7.tgz", "integrity": "sha512-S0lvzhbdlhK36RFBkGv+RbOM/dbbweym+BIHM/bwwuWVSVN5TuVErHPMWo4w0t1NDYg5KPp2iEf7Y7E5LASYiw==", "license": "MIT", "dependencies": { @@ -2618,7 +3020,7 @@ }, "node_modules/ajv": { "version": "8.18.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.18.0.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { @@ -2632,9 +3034,26 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", @@ -2644,7 +3063,7 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", @@ -2660,7 +3079,7 @@ }, "node_modules/antd-mobile": { "version": "5.42.3", - "resolved": "https://registry.npmmirror.com/antd-mobile/-/antd-mobile-5.42.3.tgz", + "resolved": "https://registry.npmjs.org/antd-mobile/-/antd-mobile-5.42.3.tgz", "integrity": "sha512-HLykA0Cr2am7dgEch/TRUnr4GHgTOM59rA9CVjgBJVVJ8dk2w8uUBz//Bji19sRH2leiUObWY7KQZpsWF+WQeg==", "license": "MIT", "dependencies": { @@ -2692,19 +3111,19 @@ }, "node_modules/antd-mobile-icons": { "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/antd-mobile-icons/-/antd-mobile-icons-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/antd-mobile-icons/-/antd-mobile-icons-0.3.0.tgz", "integrity": "sha512-rqINQpJWZWrva9moCd1Ye695MZYWmqLPE+bY8d2xLRy7iSQwPsinCdZYjpUPp2zL/LnKYSyXxP2ut2A+DC+whQ==", "license": "MIT" }, "node_modules/antd-mobile-v5-count": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/antd-mobile-v5-count/-/antd-mobile-v5-count-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/antd-mobile-v5-count/-/antd-mobile-v5-count-1.0.1.tgz", "integrity": "sha512-YGsiEDCPUDz3SzfXi6gLZn/HpeSMW+jgPc4qiYUr1fSopg3hkUie2TnooJdExgfiETHefH3Ggs58He0OVfegLA==", "license": "MIT" }, "node_modules/antd-mobile/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, @@ -2719,26 +3138,25 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/async-validator": { "version": "4.2.5", - "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, "license": "MIT" }, "node_modules/aws-ssl-profiles": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", "license": "MIT", "engines": { @@ -2747,9 +3165,8 @@ }, "node_modules/axios": { "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.15.0.tgz", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", - "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -2759,7 +3176,7 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.11.11", - "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.11.tgz", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.11.tgz", "integrity": "sha512-/yImnXwyTvgMkhgekLHok/Rx5vO6E0BmStWlSqKWMVm2a2ITuZ1Tn+9bgLS+gZRdZmWtd8nxuhHpdmCUOWsTQQ==", "dev": true, "license": "Apache-2.0", @@ -2772,13 +3189,13 @@ }, "node_modules/better-result": { "version": "2.8.2", - "resolved": "https://registry.npmmirror.com/better-result/-/better-result-2.8.2.tgz", + "resolved": "https://registry.npmjs.org/better-result/-/better-result-2.8.2.tgz", "integrity": "sha512-YOf0VSj5nUPI27doTtXF+BBnsiRq3qY7avHqfIWnppxTLGyvkLq1QV2RTxkwoZwJ60ywLfZ0raFF4J/G886i7A==", "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.6", - "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.6.tgz", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "license": "MIT", "dependencies": { @@ -2802,7 +3219,7 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { @@ -2811,7 +3228,7 @@ }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { @@ -2823,20 +3240,20 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, "license": "ISC" }, "node_modules/browserslist": { "version": "4.28.7", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.7.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ @@ -2870,13 +3287,13 @@ }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { @@ -2885,7 +3302,7 @@ }, "node_modules/c12": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/c12/-/c12-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", "license": "MIT", "dependencies": { @@ -2913,7 +3330,7 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { @@ -2926,7 +3343,7 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { @@ -2942,7 +3359,7 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001806", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ @@ -2963,7 +3380,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", @@ -2980,7 +3397,7 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", @@ -2993,7 +3410,7 @@ }, "node_modules/chart.js": { "version": "4.5.1", - "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.5.1.tgz", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { @@ -3005,7 +3422,7 @@ }, "node_modules/cheerio": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", "dev": true, "license": "MIT", @@ -3031,7 +3448,7 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, "license": "BSD-2-Clause", @@ -3049,7 +3466,7 @@ }, "node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { @@ -3064,7 +3481,7 @@ }, "node_modules/citty": { "version": "0.1.6", - "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "license": "MIT", "dependencies": { @@ -3073,13 +3490,13 @@ }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", @@ -3117,7 +3534,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", @@ -3130,7 +3547,7 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" @@ -3148,9 +3565,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -3159,9 +3575,18 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/concurrently": { "version": "9.2.4", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-9.2.4.tgz", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", "dev": true, "license": "MIT", @@ -3186,13 +3611,13 @@ }, "node_modules/confbox": { "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "license": "MIT" }, "node_modules/consola": { "version": "3.4.2", - "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { @@ -3201,7 +3626,7 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { @@ -3213,7 +3638,7 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { @@ -3222,14 +3647,14 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { @@ -3238,22 +3663,13 @@ }, "node_modules/cookie-signature": { "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.7.tgz", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, "node_modules/cors": { "version": "2.8.6", - "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.6.tgz", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { @@ -3270,7 +3686,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { @@ -3284,7 +3700,7 @@ }, "node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.2.2.tgz", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "license": "BSD-2-Clause", @@ -3301,7 +3717,7 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.2.2.tgz", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", @@ -3314,14 +3730,14 @@ }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT", "peer": true }, "node_modules/csv-parser": { "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/csv-parser/-/csv-parser-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.0.tgz", "integrity": "sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==", "dev": true, "license": "MIT", @@ -3455,15 +3871,14 @@ }, "node_modules/dayjs": { "version": "1.11.21", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.21.tgz", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3485,7 +3900,7 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { @@ -3494,7 +3909,7 @@ }, "node_modules/deepmerge-ts": { "version": "7.1.5", - "resolved": "https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", "license": "BSD-3-Clause", "engines": { @@ -3503,15 +3918,14 @@ }, "node_modules/defu": { "version": "6.1.7", - "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.7.tgz", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -3519,7 +3933,7 @@ }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "license": "Apache-2.0", "engines": { @@ -3528,7 +3942,7 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { @@ -3537,13 +3951,13 @@ }, "node_modules/destr": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", "license": "MIT" }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { @@ -3553,7 +3967,7 @@ }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", @@ -3563,7 +3977,7 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "license": "MIT", @@ -3578,7 +3992,7 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ @@ -3591,7 +4005,7 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "license": "BSD-2-Clause", @@ -3607,7 +4021,7 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", @@ -3622,7 +4036,7 @@ }, "node_modules/dotenv": { "version": "16.6.1", - "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { @@ -3634,7 +4048,7 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { @@ -3648,7 +4062,7 @@ }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "license": "Apache-2.0", "dependencies": { @@ -3657,13 +4071,13 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/effect": { "version": "3.20.0", - "resolved": "https://registry.npmmirror.com/effect/-/effect-3.20.0.tgz", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.20.0.tgz", "integrity": "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==", "license": "MIT", "dependencies": { @@ -3673,21 +4087,21 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.399", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/empathic": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/empathic/-/empathic-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", "license": "MIT", "engines": { @@ -3696,7 +4110,7 @@ }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { @@ -3705,7 +4119,7 @@ }, "node_modules/encoding-sniffer": { "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "dev": true, "license": "MIT", @@ -3719,7 +4133,7 @@ }, "node_modules/encoding-sniffer/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", @@ -3732,7 +4146,7 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", @@ -3745,7 +4159,7 @@ }, "node_modules/env-paths": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "license": "MIT", "engines": { @@ -3757,7 +4171,7 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { @@ -3766,7 +4180,7 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { @@ -3775,7 +4189,7 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { @@ -3787,9 +4201,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3813,7 +4226,7 @@ }, "node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, @@ -3852,7 +4265,7 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", @@ -3862,7 +4275,7 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, @@ -3881,7 +4294,7 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { @@ -3894,9 +4307,30 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/express": { "version": "4.22.2", - "resolved": "https://registry.npmmirror.com/express/-/express-4.22.2.tgz", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { @@ -3940,9 +4374,28 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.0.tgz", + "integrity": "sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { @@ -3951,13 +4404,13 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/exsolve": { "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", "license": "MIT" }, @@ -3975,7 +4428,7 @@ }, "node_modules/fast-check": { "version": "3.23.2", - "resolved": "https://registry.npmmirror.com/fast-check/-/fast-check-3.23.2.tgz", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", "funding": [ { @@ -3997,13 +4450,13 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { @@ -4019,7 +4472,7 @@ }, "node_modules/finalhandler": { "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { @@ -4037,7 +4490,7 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { @@ -4046,15 +4499,14 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.11", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "dev": true, "funding": [ { "type": "individual", @@ -4073,7 +4525,7 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { @@ -4089,9 +4541,8 @@ }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -4106,7 +4557,7 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { @@ -4115,7 +4566,7 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { @@ -4124,7 +4575,7 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -4139,7 +4590,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { @@ -4148,7 +4599,7 @@ }, "node_modules/generate-function": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "license": "MIT", "dependencies": { @@ -4157,7 +4608,7 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", @@ -4167,7 +4618,7 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", @@ -4177,7 +4628,7 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { @@ -4201,13 +4652,13 @@ }, "node_modules/get-port-please": { "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/get-port-please/-/get-port-please-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", "license": "MIT" }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { @@ -4220,7 +4671,7 @@ }, "node_modules/giget": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", "license": "MIT", "dependencies": { @@ -4237,7 +4688,7 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { @@ -4255,13 +4706,13 @@ }, "node_modules/grammex": { "version": "3.1.12", - "resolved": "https://registry.npmmirror.com/grammex/-/grammex-3.1.12.tgz", + "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz", "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", "license": "MIT" }, "node_modules/graphmatch": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/graphmatch/-/graphmatch-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz", "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", "license": "MIT" }, @@ -4282,7 +4733,7 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", @@ -4292,7 +4743,7 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { @@ -4304,9 +4755,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4320,7 +4770,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { @@ -4332,7 +4782,7 @@ }, "node_modules/hono": { "version": "4.12.12", - "resolved": "https://registry.npmmirror.com/hono/-/hono-4.12.12.tgz", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.12.tgz", "integrity": "sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==", "license": "MIT", "engines": { @@ -4341,7 +4791,7 @@ }, "node_modules/htmlparser2": { "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-10.1.0.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ @@ -4361,7 +4811,7 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, "license": "BSD-2-Clause", @@ -4374,7 +4824,7 @@ }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { @@ -4394,13 +4844,13 @@ }, "node_modules/http-status-codes": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/http-status-codes/-/http-status-codes-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", "license": "MIT" }, "node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { @@ -4426,7 +4876,7 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, @@ -4441,14 +4891,23 @@ }, "node_modules/intersection-observer": { "version": "0.12.2", - "resolved": "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.12.2.tgz", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==", "deprecated": "The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019.", "license": "Apache-2.0" }, + "node_modules/ip-address": { + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.2.tgz", + "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { @@ -4473,7 +4932,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", @@ -4481,30 +4940,45 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-property": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jose": { + "version": "6.2.12", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz", + "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-cookie": { "version": "3.0.8", - "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.8.tgz", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", "license": "MIT" }, @@ -4529,7 +5003,7 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", @@ -4542,13 +5016,19 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", @@ -4561,7 +5041,7 @@ }, "node_modules/jsonwebtoken": { "version": "9.0.3", - "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", "dependencies": { @@ -4583,7 +5063,7 @@ }, "node_modules/jsonwebtoken/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { @@ -4595,7 +5075,7 @@ }, "node_modules/jwa": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/jwa/-/jwa-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { @@ -4606,7 +5086,7 @@ }, "node_modules/jws": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/jws/-/jws-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", "dependencies": { @@ -4625,55 +5105,55 @@ }, "node_modules/lodash": { "version": "4.18.1", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/long/-/long-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, @@ -4691,7 +5171,7 @@ }, "node_modules/lru-cache": { "version": "11.5.2", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.5.2.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "license": "BlueOak-1.0.0", "engines": { @@ -4700,7 +5180,7 @@ }, "node_modules/lru.min": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/lru.min/-/lru.min-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", "license": "MIT", "engines": { @@ -4715,7 +5195,7 @@ }, "node_modules/mariadb": { "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/mariadb/-/mariadb-3.5.3.tgz", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.5.3.tgz", "integrity": "sha512-i053Kc0MgdUv/hu9mCyq67TYfPXFj3/MV8I7ZW5wvJNixIyXC0VztMPUjIVj/449nQo+BsxFD4Fdk/sA/uqKPQ==", "license": "LGPL-2.1-or-later", "dependencies": { @@ -4743,7 +5223,7 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { @@ -4752,7 +5232,7 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { @@ -4761,7 +5241,7 @@ }, "node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", "funding": { @@ -4770,7 +5250,7 @@ }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { @@ -4779,7 +5259,7 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { @@ -4791,7 +5271,7 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { @@ -4800,7 +5280,7 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { @@ -4812,13 +5292,13 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mysql2": { "version": "3.15.3", - "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-3.15.3.tgz", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", "license": "MIT", "dependencies": { @@ -4838,7 +5318,7 @@ }, "node_modules/named-placeholders": { "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.6.tgz", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", "license": "MIT", "dependencies": { @@ -4850,13 +5330,13 @@ }, "node_modules/nano-memoize": { "version": "3.0.16", - "resolved": "https://registry.npmmirror.com/nano-memoize/-/nano-memoize-3.0.16.tgz", + "resolved": "https://registry.npmjs.org/nano-memoize/-/nano-memoize-3.0.16.tgz", "integrity": "sha512-JyK96AKVGAwVeMj3MoMhaSXaUNqgMbCRSQB3trUV8tYZfWEzqUBKdK1qJpfuNXgKeHOx1jv/IEYTM659ly7zUA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.16", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.16.tgz", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ @@ -4875,7 +5355,7 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { @@ -4884,7 +5364,7 @@ }, "node_modules/node-cron": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/node-cron/-/node-cron-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", "license": "ISC", "dependencies": { @@ -4896,13 +5376,13 @@ }, "node_modules/node-fetch-native": { "version": "1.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.51", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.51.tgz", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, "license": "MIT", @@ -4912,7 +5392,7 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "license": "BSD-2-Clause", @@ -4925,7 +5405,7 @@ }, "node_modules/nypm": { "version": "0.6.5", - "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.6.5.tgz", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", "license": "MIT", "dependencies": { @@ -4942,13 +5422,13 @@ }, "node_modules/nypm/node_modules/citty": { "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/citty/-/citty-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { @@ -4957,7 +5437,7 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { @@ -4969,13 +5449,13 @@ }, "node_modules/ohash": { "version": "2.0.11", - "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { @@ -4985,9 +5465,34 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", @@ -5000,7 +5505,7 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dev": true, "license": "MIT", @@ -5014,7 +5519,7 @@ }, "node_modules/parse5-parser-stream": { "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "dev": true, "license": "MIT", @@ -5027,7 +5532,7 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", @@ -5040,7 +5545,7 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { @@ -5049,7 +5554,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { @@ -5058,19 +5563,19 @@ }, "node_modules/path-to-regexp": { "version": "0.1.13", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "license": "MIT" }, "node_modules/perfect-debounce": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "license": "MIT" }, @@ -5081,9 +5586,18 @@ "dev": true, "license": "ISC" }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-types": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "license": "MIT", "dependencies": { @@ -5094,7 +5608,7 @@ }, "node_modules/postgres": { "version": "3.4.7", - "resolved": "https://registry.npmmirror.com/postgres/-/postgres-3.4.7.tgz", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", "license": "Unlicense", "engines": { @@ -5107,7 +5621,7 @@ }, "node_modules/prisma": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/prisma/-/prisma-7.7.0.tgz", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.7.0.tgz", "integrity": "sha512-HlgwRBt1uEFB9LStHL4HLYDvoi4BNu1rYA0hPG0zCAEyK9SaZBqp7E5Rjpc3Qh8Lex/ye/svoHZ0OWoFNhWxuQ==", "hasInstallScript": true, "license": "Apache-2.0", @@ -5140,7 +5654,7 @@ }, "node_modules/proper-lockfile": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "license": "MIT", "dependencies": { @@ -5151,13 +5665,13 @@ }, "node_modules/proper-lockfile/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { @@ -5170,9 +5684,8 @@ }, "node_modules/proxy-from-env": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -5180,7 +5693,7 @@ }, "node_modules/pure-rand": { "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "funding": [ { @@ -5194,9 +5707,17 @@ ], "license": "MIT" }, + "node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, "node_modules/qs": { "version": "6.15.3", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.3.tgz", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { @@ -5212,7 +5733,7 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { @@ -5221,7 +5742,7 @@ }, "node_modules/raw-body": { "version": "2.5.3", - "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { @@ -5236,7 +5757,7 @@ }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { @@ -5248,7 +5769,7 @@ }, "node_modules/rc-field-form": { "version": "1.44.0", - "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.44.0.tgz", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.44.0.tgz", "integrity": "sha512-el7w87fyDUsca63Y/s8qJcq9kNkf/J5h+iTdqG5WsSHLH0e6Usl7QuYSmSVzJMgtp40mOVZIY/W/QP9zwrp1FA==", "license": "MIT", "dependencies": { @@ -5266,7 +5787,7 @@ }, "node_modules/rc-motion": { "version": "2.9.5", - "resolved": "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.5.tgz", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", "license": "MIT", "dependencies": { @@ -5281,7 +5802,7 @@ }, "node_modules/rc-segmented": { "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.4.1.tgz", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.4.1.tgz", "integrity": "sha512-KUi+JJFdKnumV9iXlm+BJ00O4NdVBp2TEexLCk6bK1x/RH83TvYKQMzIz/7m3UTRPD08RM/8VG/JNjWgWbd4cw==", "license": "MIT", "dependencies": { @@ -5297,7 +5818,7 @@ }, "node_modules/rc-util": { "version": "5.44.4", - "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", "license": "MIT", "dependencies": { @@ -5311,13 +5832,13 @@ }, "node_modules/rc-util/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/rc9": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", "license": "MIT", "dependencies": { @@ -5352,7 +5873,7 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmmirror.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, @@ -5388,7 +5909,7 @@ }, "node_modules/react-refresh": { "version": "0.17.0", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", @@ -5398,7 +5919,7 @@ }, "node_modules/react-router": { "version": "6.30.4", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-6.30.4.tgz", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", "license": "MIT", "dependencies": { @@ -5413,7 +5934,7 @@ }, "node_modules/react-router-dom": { "version": "6.30.4", - "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.30.4.tgz", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", "license": "MIT", "dependencies": { @@ -5430,7 +5951,7 @@ }, "node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", "engines": { @@ -5488,7 +6009,7 @@ }, "node_modules/remeda": { "version": "2.33.4", - "resolved": "https://registry.npmmirror.com/remeda/-/remeda-2.33.4.tgz", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz", "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", "license": "MIT", "funding": { @@ -5497,7 +6018,7 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", @@ -5507,7 +6028,7 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { @@ -5522,13 +6043,13 @@ }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", "license": "MIT" }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "license": "MIT", "engines": { @@ -5537,7 +6058,7 @@ }, "node_modules/rollup": { "version": "4.62.4", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.62.4.tgz", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", "dev": true, "license": "MIT", @@ -5581,15 +6102,41 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/runes2": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/runes2/-/runes2-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/runes2/-/runes2-1.1.4.tgz", "integrity": "sha512-LNPnEDPOOU4ehF71m5JoQyzT2yxwD6ZreFJ7MxZUAoMKNMY1XrAo60H1CUoX5ncSm0rIuKlqn9JZNRrRkNou2g==", "license": "MIT" }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", @@ -5599,7 +6146,7 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { @@ -5619,7 +6166,7 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, @@ -5634,7 +6181,7 @@ }, "node_modules/screenfull": { "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", "license": "MIT", "engines": { @@ -5659,7 +6206,7 @@ }, "node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", @@ -5669,7 +6216,7 @@ }, "node_modules/send": { "version": "0.19.2", - "resolved": "https://registry.npmmirror.com/send/-/send-0.19.2.tgz", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { @@ -5693,7 +6240,7 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { @@ -5702,18 +6249,18 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/seq-queue": { "version": "0.0.5", - "resolved": "https://registry.npmmirror.com/seq-queue/-/seq-queue-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/serve-static": { "version": "1.16.3", - "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.3.tgz", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { @@ -5728,7 +6275,7 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, @@ -5774,7 +6321,7 @@ }, "node_modules/sharp/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -5787,7 +6334,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { @@ -5799,7 +6346,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { @@ -5808,7 +6355,7 @@ }, "node_modules/shell-quote": { "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.9.0.tgz", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", "dev": true, "license": "MIT", @@ -5821,7 +6368,7 @@ }, "node_modules/side-channel": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { @@ -5840,7 +6387,7 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { @@ -5856,7 +6403,7 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { @@ -5874,7 +6421,7 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { @@ -5893,7 +6440,7 @@ }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", "engines": { @@ -5931,7 +6478,7 @@ }, "node_modules/sqlstring": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "license": "MIT", "engines": { @@ -5940,7 +6487,7 @@ }, "node_modules/staged-components": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/staged-components/-/staged-components-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/staged-components/-/staged-components-1.1.3.tgz", "integrity": "sha512-9EIswzDqjwlEu+ymkV09TTlJfzSbKgEnNteUnZSTxkpMgr5Wx2CzzA9WcMFWBNCldqVPsHVnRGGrApduq2Se5A==", "license": "MIT", "peerDependencies": { @@ -5949,7 +6496,7 @@ }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { @@ -5958,13 +6505,13 @@ }, "node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.10.0.tgz", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", @@ -5979,7 +6526,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", @@ -6001,7 +6548,7 @@ }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", @@ -6017,7 +6564,7 @@ }, "node_modules/tauri-plugin-hotswap-api": { "version": "0.0.4", - "resolved": "https://registry.npmmirror.com/tauri-plugin-hotswap-api/-/tauri-plugin-hotswap-api-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/tauri-plugin-hotswap-api/-/tauri-plugin-hotswap-api-0.0.4.tgz", "integrity": "sha512-uI+yR/BkCmAeT11VBCUFRKVlE5KUrb/EosPl86OXQfFhk02wdxauRtIZvU9QFzteH0j2EN5/IB/u66Fib8KvqQ==", "license": "MIT OR Apache-2.0", "peerDependencies": { @@ -6032,22 +6579,16 @@ }, "node_modules/tinyexec": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT" - }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { @@ -6056,7 +6597,7 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", @@ -6072,7 +6613,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { @@ -6085,7 +6626,7 @@ }, "node_modules/undici": { "version": "7.24.7", - "resolved": "https://registry.npmmirror.com/undici/-/undici-7.24.7.tgz", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==", "dev": true, "license": "MIT", @@ -6095,13 +6636,13 @@ }, "node_modules/undici-types": { "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-8.3.0.tgz", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { @@ -6110,7 +6651,7 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ @@ -6150,7 +6691,7 @@ }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { @@ -6159,7 +6700,7 @@ }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { @@ -6168,7 +6709,7 @@ }, "node_modules/valibot": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/valibot/-/valibot-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", "license": "MIT", "peerDependencies": { @@ -6182,7 +6723,7 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { @@ -6213,7 +6754,7 @@ }, "node_modules/vite": { "version": "5.4.21", - "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", @@ -6273,7 +6814,7 @@ }, "node_modules/vite/node_modules/postcss": { "version": "8.5.25", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.25.tgz", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "dev": true, "funding": [ @@ -6302,7 +6843,7 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, @@ -6316,7 +6857,7 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", @@ -6329,7 +6870,7 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", @@ -6339,7 +6880,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { @@ -6354,7 +6895,7 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", @@ -6370,9 +6911,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/ws": { "version": "8.21.2", - "resolved": "https://registry.npmmirror.com/ws/-/ws-8.21.2.tgz", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.2.tgz", "integrity": "sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==", "license": "MIT", "engines": { @@ -6393,7 +6940,7 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", @@ -6403,14 +6950,14 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", @@ -6429,7 +6976,7 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", @@ -6439,13 +6986,31 @@ }, "node_modules/zeptomatch": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/zeptomatch/-/zeptomatch-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz", "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", "license": "MIT", "dependencies": { "grammex": "^3.1.11", "graphmatch": "^1.1.0" } + }, + "node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } } } } diff --git a/package.json b/package.json index 2b1e238..6f6c6bd 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "start": "node --experimental-strip-types --no-warnings server/index.js", "db:migrate": "prisma migrate deploy", "db:seed": "node scripts/seed.cjs", + "registry:sync": "node scripts/sync-registry.mjs", "data:refresh": "node --no-warnings scripts/refresh-indicators.cjs", "data:discover": "node --no-warnings scripts/discover-mcp-tools.cjs", "icons": "node scripts/generate-icons.mjs", @@ -24,13 +25,16 @@ "tauri:android:apk": "tauri android build --apk", "test": "echo \"Error: no test specified\" && exit 1", "data:news": "node --no-warnings scripts/refresh-news.cjs", + "data:mihome": "node --experimental-strip-types --no-warnings scripts/mihome-cli.mjs", + "data:mihome:login": "node --experimental-strip-types --no-warnings scripts/mihome-login.mjs", "publish": "bash scripts/wsl/build-apk.sh release" }, "dependencies": { - "@huolala-tech/page-spy": "^1.5.7", "@prisma/adapter-mariadb": "^7.9.1", "@prisma/client": "^7.7.0", + "@zythum02/mijia-api": "^0.1.4", "antd-mobile": "^5.42.3", + "axios": "^1.15.0", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.0", @@ -51,7 +55,6 @@ "@tauri-apps/api": "^2.0.0", "@tauri-apps/cli": "^2.0.0", "@vitejs/plugin-react": "^4.3.1", - "axios": "^1.15.0", "cheerio": "^1.2.0", "concurrently": "^9.0.0", "csv-parser": "^3.2.0", diff --git a/prisma/migrations/20260920120000_add_mihome_env/migration.sql b/prisma/migrations/20260920120000_add_mihome_env/migration.sql new file mode 100644 index 0000000..bb64515 --- /dev/null +++ b/prisma/migrations/20260920120000_add_mihome_env/migration.sql @@ -0,0 +1,95 @@ +-- CreateTable +CREATE TABLE `MihomeAccount` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `key` VARCHAR(191) NOT NULL DEFAULT 'default', + `userId` VARCHAR(191) NOT NULL DEFAULT '', + `status` VARCHAR(191) NOT NULL DEFAULT 'unknown', + `lastError` VARCHAR(191) NOT NULL DEFAULT '', + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `MihomeAccount_key_key`(`key`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `MihomeHome` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `homeId` VARCHAR(191) NOT NULL, + `name` VARCHAR(191) NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `MihomeHome_homeId_key`(`homeId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `MihomeDevice` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `did` VARCHAR(191) NOT NULL, + `homeId` VARCHAR(191) NOT NULL, + `model` VARCHAR(191) NOT NULL, + `name` VARCHAR(191) NOT NULL, + `alias` VARCHAR(191) NULL, + `tempSiid` INTEGER NOT NULL, + `tempPiid` INTEGER NOT NULL, + `humSiid` INTEGER NOT NULL, + `humPiid` INTEGER NOT NULL, + `battSiid` INTEGER NOT NULL, + `battPiid` INTEGER NOT NULL, + `battery` INTEGER NULL, + `batteryAt` DATETIME(3) NULL, + `enabled` BOOLEAN NOT NULL DEFAULT true, + `lastSyncAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `MihomeDevice_did_key`(`did`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `MihomeEnvSample` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `deviceId` INTEGER NOT NULL, + `date` DATETIME(3) NOT NULL, + `temperature` DOUBLE NULL, + `humidity` DOUBLE NULL, + `temperatureAvg` DOUBLE NULL, + `humidityAvg` DOUBLE NULL, + `temperatureMin` DOUBLE NULL, + `temperatureMax` DOUBLE NULL, + `humidityMin` DOUBLE NULL, + `humidityMax` DOUBLE NULL, + `origin` VARCHAR(191) NOT NULL DEFAULT 'live', + `sampledAt` DATETIME(3) NULL, + `raw` JSON NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `MihomeEnvSample_deviceId_date_idx`(`deviceId`, `date`), + UNIQUE INDEX `MihomeEnvSample_deviceId_date_key`(`deviceId`, `date`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `MihomeEnvHour` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `deviceId` INTEGER NOT NULL, + `hour` DATETIME(3) NOT NULL, + `temperatureAvg` DOUBLE NULL, + `humidityAvg` DOUBLE NULL, + `raw` JSON NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `MihomeEnvHour_deviceId_hour_idx`(`deviceId`, `hour`), + UNIQUE INDEX `MihomeEnvHour_deviceId_hour_key`(`deviceId`, `hour`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `MihomeDevice` ADD CONSTRAINT `MihomeDevice_homeId_fkey` FOREIGN KEY (`homeId`) REFERENCES `MihomeHome`(`homeId`) ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `MihomeEnvSample` ADD CONSTRAINT `MihomeEnvSample_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `MihomeDevice`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `MihomeEnvHour` ADD CONSTRAINT `MihomeEnvHour_deviceId_fkey` FOREIGN KEY (`deviceId`) REFERENCES `MihomeDevice`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9834d92..c045dd1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -200,3 +200,85 @@ model OilPriceHistory { } +// ==================== 环境监控:米家 ==================== + +// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示) +model MihomeAccount { + id Int @id @default(autoincrement()) + key String @unique @default("default") + userId String @default("") + status String @default("unknown") // ok | pending | expired + lastError String @default("") + updatedAt DateTime @updatedAt +} + +model MihomeHome { + id Int @id @default(autoincrement()) + homeId String @unique + name String + createdAt DateTime @default(now()) + devices MihomeDevice[] +} + +model MihomeDevice { + id Int @id @default(autoincrement()) + did String @unique + homeId String + home MihomeHome @relation(fields: [homeId], references: [homeId]) + model String + name String + alias String? // 用户别名, 仅本应用展示 + tempSiid Int + tempPiid Int + humSiid Int + humPiid Int + battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3) + battPiid Int + battery Int? // 最近一次电量 (每天读一次, 标题展示用) + batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新) + enabled Boolean @default(true) + lastSyncAt DateTime? + createdAt DateTime @default(now()) + samples MihomeEnvSample[] + hours MihomeEnvHour[] +} + +// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重 +model MihomeEnvSample { + id Int @id @default(autoincrement()) + deviceId Int + device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade) + date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC) + temperature Float? // 当日最后一次实时值 (或 vendor hour 均值) + humidity Float? + temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour) + humidityAvg Float? + temperatureMin Float? // 当日最低 + temperatureMax Float? // 当日最高 + humidityMin Float? + humidityMax Float? + origin String @default("live") // live | vendor_history | backfill + sampledAt DateTime? + raw Json? + createdAt DateTime @default(now()) + + @@unique([deviceId, date]) + @@index([deviceId, date]) +} + +// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重 +model MihomeEnvHour { + id Int @id @default(autoincrement()) + deviceId Int + device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade) + hour DateTime // Asia/Shanghai 整点 (存 UTC) + temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour) + humidityAvg Float? + raw Json? + createdAt DateTime @default(now()) + + @@unique([deviceId, hour]) + @@index([deviceId, hour]) +} + + diff --git a/reasonix.toml b/reasonix.toml deleted file mode 100644 index 4063a83..0000000 --- a/reasonix.toml +++ /dev/null @@ -1,2 +0,0 @@ -[permissions] -allow = ["Bash=cd /d/workbench/iboard && node -e \"const y=require('js-yaml');try{y.load(require('fs').readFileSync('.gitea/workflows/android-build.yml','utf8'));console.log('YAML OK')}catch(e){console.error('YAML ERROR:',e.message);process.exit(1)}\""] diff --git a/scripts/mihome-cli.mjs b/scripts/mihome-cli.mjs new file mode 100644 index 0000000..3561c5c --- /dev/null +++ b/scripts/mihome-cli.mjs @@ -0,0 +1,29 @@ +// 手动跑一次米家采集 (备用): npm run data:mihome +// 带文件日志, 便于定位卡点 +import fs from 'node:fs' + +const LOG = 'D:\\workbench\\iboard\\server\\mihome\\.cache\\cli.log' +const log = (m) => fs.appendFileSync(LOG, new Date().toISOString() + ' ' + m + '\n') +process.on('uncaughtException', (e) => { log('uncaughtException: ' + (e.stack || e)); process.exit(1) }) +process.on('unhandledRejection', (e) => { log('unhandledRejection: ' + (e && e.stack ? e.stack : String(e))); process.exit(1) }) + +log('start') +const m = await import('../server/mihome/index.js') +log('imported; calling dailyMaintenance') +try { + const r = await m.dailyMaintenance() + log('done: ' + JSON.stringify(r)) + console.log('[data:mihome] 完成:', JSON.stringify(r)) +} catch (e) { + if (e instanceof m.MihomeAuthError) { + log('auth error: ' + e.message) + console.log('[data:mihome] 米家授权不可用: ' + e.message) + console.log('[data:mihome] 请运行 npm run data:mihome:login 扫码授权') + process.exit(2) + } + log('failed: ' + (e && e.stack ? e.stack : String(e))) + console.error('[data:mihome] 失败:', e.message) + process.exit(1) +} +log('exit(0)') +process.exit(0) \ No newline at end of file diff --git a/scripts/mihome-login.mjs b/scripts/mihome-login.mjs new file mode 100644 index 0000000..15463ea --- /dev/null +++ b/scripts/mihome-login.mjs @@ -0,0 +1,38 @@ +// 手动扫码授权: npm run data:mihome:login +// 启动后台 QRlogin, 轮询状态; 出二维码后打印地址, 扫码成功后自动结束. +import { startQrLogin, getQrState, checkAuth } from '../server/mihome/client.js' + +const auth = await checkAuth(true) +if (auth.status === 'ok') { + console.log('[米家] 已授权有效, 无需重扫 (本地 .cache 凭证可用)') + process.exit(0) +} + +await startQrLogin() +const started = Date.now() +console.log('[米家] 等待扫码... (120s 超时)') +for (;;) { + const s = getQrState() + if (s.qrImageUrl && s.state === 'waiting') { + console.log('[米家] 二维码(需米家 App 扫):') + console.log(' image: ' + s.qrImageUrl) + } + if (s.state === 'failed') { + console.log('[米家] 扫码失败: ' + (s.lastError || '未知')) + process.exit(2) + } + if (s.done) { + console.log('[米家] 扫码成功, 凭证已保存到 server/mihome/.cache/') + process.exit(0) + } + if (!s.running && !s.qrImageUrl) { + // 启动即失败(可能直接完成/或没权限) + console.log('[米家] 流程结束(无二维码产生), 请检查日志') + process.exit(2) + } + if (Date.now() - started > 150000) { + console.log('[米家] 超时, 已停止; 可重跑.') + process.exit(3) + } + await new Promise((r) => setTimeout(r, 2000)) +} \ No newline at end of file diff --git a/scripts/sync-registry.mjs b/scripts/sync-registry.mjs new file mode 100644 index 0000000..bfa01cb --- /dev/null +++ b/scripts/sync-registry.mjs @@ -0,0 +1,177 @@ +#!/usr/bin/env node +// 将 Gitea CI/CD secrets 明文写回注册中心 (Registry 配置管理中心) 的 MCP 服务 +// 传输层: MCP streamable HTTP (POST /mcp), 认证 Bearer +// 详见 workflow: .gitea/workflows/sync-registry.yml +// +// 用法: +// REGISTRY_MCP_URL=http://bh.vps.honor3.com:8008/mcp \ +// REGISTRY_MCP_TOKEN= \ +// REGISTRY_PROJECT_ID=proj-msid70ql-6xbq4w \ +// node scripts/sync-registry.mjs [--dry-run] +// +// 安全: 本脚本不会把任何 secret 的值打印到日志, 只输出 键名 + 结果。 +// 注意: 当前通过明文 http 传输, 请确保注册中心仅在内网可达 (或改用 https)。 + +const MCP_URL = process.env.REGISTRY_MCP_URL || 'http://bh.vps.honor3.com:8008/mcp' +const MCP_TOKEN = process.env.REGISTRY_MCP_TOKEN || '' +const PROJECT_ID = process.env.REGISTRY_PROJECT_ID || 'proj-msid70ql-6xbq4w' +const IDC = process.env.REGISTRY_IDC || '1' +const ENV = process.env.REGISTRY_ENVIRONMENT || '1' +const DRY_RUN = process.argv.includes('--dry-run') + +// CI 环境变量 -> 注册中心配置键 (key 支持 / 嵌套, 本项目分组映射为 path => group/key) +const SECRET_MAP = [ + { env: 'MINISIGN_PRIVATE_KEY', key: 'minisign.privateKey', group: 'secret', type: 'string', description: 'minisign 签名 OTA 升级包的私钥' }, + { env: 'DATABASE_URL', key: 'database.url', group: 'secret', type: 'string', description: 'MySQL 连接串' }, + { env: 'JWT_SECRET', key: 'jwt.secret', group: 'secret', type: 'string', description: 'JWT 签名密钥' }, + { env: 'ANDROID_KEYSTORE_B64', key: 'android.keystore.b64', group: 'secret', type: 'string', description: 'Android release keystore (base64)' }, + { env: 'ANDROID_KEY_ALIAS', key: 'android.key.alias', group: 'secret', type: 'string', description: 'Android keystore 别名' }, + { env: 'ANDROID_KEY_PASSWORD', key: 'android.key.password', group: 'secret', type: 'string', description: 'Android keystore 密码' }, + { env: 'PACKAGE_TOKEN', key: 'package.token', group: 'secret', type: 'string', description: 'Gitea Generic Package 写权限 token' }, +] + +if (!MCP_TOKEN) { + console.error('缺少 REGISTRY_MCP_TOKEN (MCP 访问令牌)') + process.exit(2) +} + +let sessionId = null +let nextId = 0 + +function parseSse(text) { + let data = '' + for (const line of text.split(/\r?\n/)) { + if (line.startsWith('data:')) data += line.slice(5).trim() + } + if (!data) throw new Error(`MCP 响应没有 data 字段: ${text.slice(0, 200)}`) + const obj = JSON.parse(data) + if (obj.error) { + const e = new Error(`${obj.error.code}: ${obj.error.message}`) + e.mcpError = obj.error + throw e + } + return obj +} + +async function rpc(method, params) { + const headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json, text/event-stream', + } + if (MCP_TOKEN) headers.Authorization = `Bearer ${MCP_TOKEN}` + if (sessionId) headers['mcp-session-id'] = sessionId + + const res = await fetch(MCP_URL, { + method: 'POST', + headers, + body: JSON.stringify({ jsonrpc: '2.0', id: ++nextId, method, params }), + }) + const sid = res.headers.get('mcp-session-id') + if (sid) sessionId = sid + const text = await res.text() + return parseSse(text) +} + +async function callTool(name, args) { + const payload = await rpc('tools/call', { name, arguments: args }) + if (payload.result?.isError) { + throw new Error(`工具 ${name} 执行失败: ${JSON.stringify(payload.result.content || {})}`) + } + const sc = payload.result?.structuredContent + if (sc !== undefined && sc !== null) return sc + const content = payload.result?.content || [] + const text = content.map((c) => c.text || '').join('\n').trim() + if (text) { + try { return JSON.parse(text) } catch { return { text } } + } + return payload.result || {} +} + +async function main() { + console.log(`== 同步 CI secrets -> 注册中心 (project=${PROJECT_ID})${DRY_RUN ? ' [dry-run]' : ''}`) + + // 1) initialize 拿 mcp-session-id (rpc 内部已缓存 header) + await rpc('initialize', { + protocolVersion: '2025-06-18', + capabilities: {}, + clientInfo: { name: 'iboard-ci', version: '1.0.0' }, + }) + + // 2) 记录当前模式, 非 edit 则临时切到 edit (写 value 需要), 结束后恢复 + const mode = (await callTool('get_mode', {})).mode + console.log(`当前模式: ${mode}`) + const needEdit = mode !== 'edit' + if (needEdit) { + if (DRY_RUN) { + console.log('(dry-run) 待切换到 edit 模式') + } else { + await callTool('set_mode', { mode: 'edit' }) + console.log('已临时切换为 edit 模式') + } + } + + try { + // 3) 拉取现有配置, 键为 group/idc/environment/key + const list = await callTool('list_configs', { projectId: PROJECT_ID }) + const configs = Array.isArray(list.configs) ? list.configs : list + const existing = new Map() + for (const c of configs || []) { + if (!c || !c.key) continue + existing.set(`${c.idc || ''}|${c.environment || ''}|${c.group || ''}|${c.key}`, c) + } + + // 4) 逐个 upsert + let updated = 0 + let created = 0 + let skipped = 0 + for (const { env, key, group, type, description } of SECRET_MAP) { + const value = process.env[env] + if (value === undefined || value === '') { + console.log(`- [skip] ${group}/${key} <- 环境变量 ${env} 未设置`) + skipped++ + continue + } + const found = existing.get(`${IDC}|${ENV}|${group}|${key}`) + const target = `${group}/${key}` + if (found) { + if (DRY_RUN) { + console.log(`- [dry-run] update ${target} (cfg ${found.id}) <- ${env}`) + } else { + await callTool('update_config', { projectId: PROJECT_ID, configId: found.id, value }) + console.log(`- [update] ${target} (cfg ${found.id}) <- ${env}`) + } + updated++ + } else { + if (DRY_RUN) { + console.log(`- [dry-run] create ${target} <- ${env}`) + } else { + await callTool('create_config', { + projectId: PROJECT_ID, + key, + value, + type, + description, + idc: IDC, + environment: ENV, + group, + }) + console.log(`- [create] ${target} <- ${env}`) + } + created++ + } + } + + console.log(`\n== 完成: ${DRY_RUN ? 'dry-run' : '写入'} ${updated} 更新 / ${created} 新建 / ${skipped} 跳过 (值不回显)`) + } finally { + // 5) 恢复原模式 (本次未实际切模式时无操作) + if (needEdit && !DRY_RUN) { + await callTool('set_mode', { mode }) + console.log(`已恢复模式: ${mode}`) + } + } +} + +main().catch((err) => { + console.error(`\n同步失败: ${err.message}`) + process.exit(1) +}) \ No newline at end of file diff --git a/server/cron.js b/server/cron.js index 8bc0bbd..c8f9a62 100644 --- a/server/cron.js +++ b/server/cron.js @@ -1,11 +1,25 @@ import cron from 'node-cron' import { prisma } from './db.js' import mysql from 'mysql2/promise' -import { fetchNewsList, persistNews } from '../scripts/fetchers/news.fetcher.js' import { checkAfterRefresh } from './alert-engine.js' -import { insertCronAlert } from '../scripts/lib/cron-alert.js' import { ApizeroError, oil, history } from './apizero/index.js' +// scripts/ 下的可选脚本模块 (部署容器可能缺失或依赖不全): 惰性加载, +// 单个 fetcher 缺失只降级对应任务, 不拖垮 cron 整体注册。 +async function importNewsFetcher() { + const mod = await import('../scripts/fetchers/news.fetcher.js') + return { fetchNewsList: mod.fetchNewsList, persistNews: mod.persistNews } +} + +async function alertError(taskName, message) { + try { + const { insertCronAlert } = await import('../scripts/lib/cron-alert.js') + await insertCronAlert(taskName, message) + } catch (e) { + console.error('[cron] 报警写入失败(忽略):', e.message) + } +} + function parseUrl(url) { const u = new URL(url) return { host: u.hostname, port: Number(u.port) || 3306, user: decodeURIComponent(u.username), password: decodeURIComponent(u.password), database: u.pathname.replace(/^\//, '') } @@ -20,6 +34,7 @@ function scheduleNews() { cron.schedule('0 6 * * *', async () => { console.log('[cron] 6:00 触发') try { + const { fetchNewsList, persistNews } = await importNewsFetcher() const list = await fetchNewsList() const r = await persistNews(list) console.log('[cron] 新闻入库: 新增 ' + r.inserted + ' / 跳过 ' + r.skipped) @@ -30,7 +45,7 @@ function scheduleNews() { } finally { await conn.end() } } catch (e) { console.error('[cron] 任务失败:', e.message) - await insertCronAlert('新闻拉取+报警检测', e.message) + await alertError('新闻拉取+报警检测', e.message) } }, { timezone: 'Asia/Shanghai' }) console.log('[cron] 已注册: 每天 06:00 拉取新闻 + 跨源报警检测') @@ -69,7 +84,7 @@ function scheduleOilHistory() { } else { console.error('[cron] 油价历史任务失败:', e.message) } - await insertCronAlert('浙江油价历史抓取', e.message) + await alertError('浙江油价历史抓取', e.message) } }, { timezone: 'Asia/Shanghai' }) console.log('[cron] 已注册: 每天 06:10 浙江油价历史抓取') diff --git a/server/index.js b/server/index.js index 8a96da0..60372a3 100644 --- a/server/index.js +++ b/server/index.js @@ -11,6 +11,7 @@ import articlesRouter from './routes/articles.js' import otaRouter from './routes/ota.js' import apizeroRouter from './routes/apizero.js' import monitorsRouter from './routes/monitors.js' +import mihomeRouter from './routes/mihome.js' const PORT = Number(process.env.PORT) || 3001 const DIST_DIR = path.join(process.cwd(), 'dist') @@ -34,6 +35,7 @@ app.use('/api', alertsRouter) app.use('/api', articlesRouter) app.use('/api', apizeroRouter) app.use('/api', monitorsRouter) +app.use('/api/mihome', mihomeRouter) // 静态资源 (Vite build 产物) if (HAS_DIST) { @@ -56,6 +58,9 @@ app.use((err, _req, res, _next) => { // 启动定时任务: 每天凌晨 3 点拉取新闻 import('./cron.js').catch((e) => console.error('[cron] 加载失败:', e.message)) +// 米家环境监控定时调度 (独立注册, 不与 cron.js 绑定, 见 server/mihome/scheduler.js) +import('./mihome/scheduler.js').catch((e) => console.error('[cron] 米家调度注册失败:', e.message)) + app.listen(PORT, () => { console.log(`[iboard-api] listening on http://127.0.0.1:${PORT}`) console.log(`[iboard-api] static dist: ${HAS_DIST ? DIST_DIR : '(not built, API only)'}`) diff --git a/server/mihome/cache.js b/server/mihome/cache.js new file mode 100644 index 0000000..d5b2431 --- /dev/null +++ b/server/mihome/cache.js @@ -0,0 +1,10 @@ +// 米家凭证缓存目录: 认证 token 只落本地磁盘, 不进库不进 git +// 环境变量: +// MIHOME_CACHE_DIR 覆盖 (默认 /server/mihome/.cache) +import path from 'node:path' + +export function cacheDir() { + return process.env.MIHOME_CACHE_DIR + ? path.resolve(process.env.MIHOME_CACHE_DIR) + : path.resolve(process.cwd(), 'server', 'mihome', '.cache') +} \ No newline at end of file diff --git a/server/mihome/client.js b/server/mihome/client.js new file mode 100644 index 0000000..201d9c0 --- /dev/null +++ b/server/mihome/client.js @@ -0,0 +1,145 @@ +// 米家客户端单例 + 认证状态 + 扫码流程状态机 +import { MijiaAPI } from '@zythum02/mijia-api' +import { DiskCache } from '@zythum02/mijia-api/cache/disk-cache' +import { prisma } from '../db.js' +import { cacheDir } from './cache.js' + +// 未授权/已过期 (模块内部错误, 路由层做 4xx 映射) +export class MihomeAuthError extends Error { + constructor(message = '米家未授权或已过期') { + super(message) + this.name = 'MihomeAuthError' + } +} + +let _api = null + +// 惰性单例: 首次调用时才构造并加载磁盘凭证 +export function getApi() { + if (!_api) _api = new MijiaAPI(new DiskCache(cacheDir())) + return _api +} + +// 认证状态内存缓存 (成功缓存 5 分钟; 失败只缓存 30 秒, 网络/服务恢复后能尽快自愈) +const TTL_OK = 5 * 60 * 1000 +const TTL_BAD = 30 * 1000 +let authCache = { status: 'unknown', lastError: '', checkedAt: 0 } +let probing = null // 并发合并: 页面首次渲染时 force 探测 + 可见性刷新可能同时进来 + +function persistAccount(status, lastError) { + return prisma.mihomeAccount + .upsert({ + where: { key: 'default' }, + create: { key: 'default', status, lastError: lastError || '' }, + update: { status, lastError: lastError || '' }, + }) + .catch((e) => { + console.warn('[mihome] 写入授权状态失败(忽略):', e.message) + }) +} + +// 校验米家是否可用: 有凭证 + 真打一次云接口确认 token 没失效 +// force=true 忽略 TTL 强查 +// +// 注意: 不能用 api.refreshToken() 当探针. 该库在本地凭证字段齐全时直接返回 +// { tokenRefreshed: false } (见 @zythum02/mijia-api 的 available getter), +// 根本不发请求 —— 于是 30 天 token 过期后它永远返回成功, 前端就永远看不到 +// 「授权已过期」横幅, 也就不会弹扫码. 必须发一次真实业务请求才算验证. +export async function checkAuth(force = false) { + const now = Date.now() + const ttl = authCache.status === 'ok' ? TTL_OK : TTL_BAD + if (!force && now - authCache.checkedAt < ttl) return authCache + if (probing) return probing + probing = (async () => { + const api = getApi() + let status = 'expired' + let lastError = '' + try { + if (!api.available) throw new Error('无授权凭证') + await api.refreshToken() // 凭证真过期时这里会自动走 passToken 刷新 + await api.getHomesList() // 真正打到米家云, token 失效会抛 APIError + status = 'ok' + } catch (e) { + status = 'expired' + lastError = e?.message || String(e) + } + const changed = authCache.status !== status || authCache.lastError !== lastError + authCache = { status, lastError, checkedAt: Date.now() } + // 状态没变就不写库, 避免 30 秒重试把 DB 刷爆 + if (changed) await persistAccount(status, lastError) + return authCache + })() + try { + return await probing + } finally { + probing = null + } +} + +// ==================== 扫码重授权流程 (模块级单例) ==================== +// state: idle | waiting(已出二维码等扫码) | failed +// done: 只有真正登录成功才置 true, 前端靠它判断「轮询结束 = 授权成功」 +// 扫码成功后 QRlogin 内部已保存凭证, 这里只置状态并回写 DB +const qrState = { running: false, done: false, state: 'idle', qrImageUrl: '', lastError: '', startedAt: 0 } + +export function getQrState() { + return { ...qrState } +} + +export function getQrImageUrl() { + return qrState.qrImageUrl || '' +} + +export async function startQrLogin() { + // 已有一轮在跑就直接复用: 同一张二维码继续有效, 不重复开 + if (qrState.running) return getQrState() + const api = getApi() + qrState.running = true + qrState.done = false + qrState.state = 'idle' + qrState.lastError = '' + qrState.qrImageUrl = '' + qrState.startedAt = Date.now() + ;(async () => { + // 二维码有效期 120s (库内长轮询 AbortSignal.timeout), 超时就重开一张, + // 否则用户扫码慢一点只会看到「扫码流程失败」, 还得手动点刷新 + const MAX_RETRY = 2 + try { + for (let attempt = 0; ; attempt++) { + try { + await api.QRlogin(async (info) => { + qrState.qrImageUrl = info.qrImageUrl || info.loginUrl || '' + qrState.state = 'waiting' + }) + // 这里不要因为「用户点了取消」就丢弃结果: 弹窗关了但二维码可能已经被扫, + // 凭证库内部已落盘, 丢掉会让前端继续显示已过期 + qrState.state = 'idle' + qrState.done = true + authCache = { status: 'ok', lastError: '', checkedAt: Date.now() } + await persistAccount('ok', '') + return + } catch (e) { + const msg = e?.message || String(e) + const timedOut = /abort|timeout|timed out/i.test(msg) + if (timedOut && attempt < MAX_RETRY) { + qrState.qrImageUrl = '' + qrState.state = 'idle' + continue + } + qrState.state = 'failed' + qrState.lastError = msg + return + } + } + } finally { + qrState.running = false + } + })() + return getQrState() +} + +export function cancelQrLogin() { + // 只影响前端是否继续轮询; 后台长轮询没法中断, 让它自然结束 (扫了也照样算成功) + if (!qrState.running && qrState.state !== 'failed') qrState.state = 'idle' + return getQrState() +} \ No newline at end of file diff --git a/server/mihome/collector.js b/server/mihome/collector.js new file mode 100644 index 0000000..6b743a7 --- /dev/null +++ b/server/mihome/collector.js @@ -0,0 +1,285 @@ +// 采集器: 家庭/设备发现 + 每小时采样 + 电量 + 日聚合 + vendor 补齐编排 +import { prisma } from '../db.js' +import { checkAuth, getApi, MihomeAuthError } from './client.js' +import { getSpec } from './specs.js' +import { dayStart, hourStart, addDays } from './time.js' +import * as vendorStats from './vendorStats.js' + +const BACKFILL_DAYS = 45 // 停机/首次接入时, 云端统计补齐窗口 + +const round2 = (n) => (Number.isFinite(n) ? Math.round(n * 100) / 100 : null) + +// 互斥锁: 同一时刻只允许一个同步在跑 (cron 与手动/启动触发并发时合并) +let runLock = null + +function withLock(fn) { + if (runLock) return runLock + runLock = Promise.resolve() + .then(fn) + .finally(() => { + runLock = null + }) + return runLock +} + +// ==================== 设备发现 ==================== + +async function syncHomes() { + const api = getApi() + const homes = await api.getHomesList() + for (const h of homes) { + const homeId = String(h.id) + await prisma.mihomeHome.upsert({ + where: { homeId }, + create: { homeId, name: h.name || homeId }, + update: { name: h.name || homeId }, + }) + } + return homes.length +} + +async function syncDevices() { + const api = getApi() + const list = await api.getDevicesList() + let kept = 0 + for (const d of list) { + const spec = getSpec(d.model) + if (!spec) continue // 非环境设备白名单, 跳过 + const homeId = String(d.home_id || '') + if (!homeId) continue + const data = { + homeId, + model: d.model, + name: String(d.name || d.did), + tempSiid: spec.temp[0], + tempPiid: spec.temp[1], + humSiid: spec.hum[0], + humPiid: spec.hum[1], + battSiid: spec.batt[0], + battPiid: spec.batt[1], + } + await prisma.mihomeDevice.upsert({ + where: { did: d.did }, + create: { did: d.did, ...data }, + update: data, + }) + kept++ + } + return kept +} + +async function listEnabledDevices() { + return prisma.mihomeDevice.findMany({ where: { enabled: true } }) +} + +// ==================== 采样 ==================== + +// 每小时采样: 批量读温湿度 -> upsert 小时档 +async function sampleHour(devices) { + const api = getApi() + const bucket = hourStart() + const props = [] + for (const d of devices) { + props.push({ did: d.did, siid: d.tempSiid, piid: d.tempPiid }) + props.push({ did: d.did, siid: d.humSiid, piid: d.humPiid }) + } + if (props.length === 0) return 0 + + const results = [] + try { + const res = await api.getDevicesProp(props) + results.push(...(Array.isArray(res) ? res : [res])) + } catch (e) { + // 整体失败: 不写入任何小时档, 缺档留给整点补采/vendor 补齐, 本次直接抛给上层记录 + throw e + } + + // did -> { temp, hum } + const byDevice = new Map(devices.map((d) => [d.did, d])) + const perDevice = new Map() + for (const r of results) { + if (!r || !r.did) continue + const ok = Number(r.code) === 0 && r.value !== undefined && r.value !== null + if (!ok) continue + const d = byDevice.get(r.did) + if (!d) continue + const cur = perDevice.get(r.did) || {} + if (r.siid === d.tempSiid && r.piid === d.tempPiid) { + cur.temperatureAvg = round2(r.value) + } else if (r.siid === d.humSiid && r.piid === d.humPiid) { + cur.humidityAvg = round2(r.value) + } + perDevice.set(r.did, cur) + } + + let written = 0 + for (const d of devices) { + const v = perDevice.get(d.did) + if (!v || (v.temperatureAvg === undefined && v.humidityAvg === undefined)) continue + await prisma.mihomeEnvHour.upsert({ + where: { deviceId_hour: { deviceId: d.id, hour: bucket } }, + create: { + deviceId: d.id, + hour: bucket, + temperatureAvg: v.temperatureAvg ?? null, + humidityAvg: v.humidityAvg ?? null, + raw: null, // 自采 + }, + update: { + temperatureAvg: v.temperatureAvg ?? null, + humidityAvg: v.humidityAvg ?? null, + raw: null, + }, + }) + await prisma.mihomeDevice.update({ + where: { id: d.id }, + data: { lastSyncAt: new Date() }, + }) + written++ + } + return written +} + +// 电量: 每天读一次 (batteryAt 不在今天就刷新), 标题展示用 +async function refreshBattery(devices) { + const api = getApi() + const today = dayStart() + for (const d of devices) { + const isFresh = d.batteryAt && d.batteryAt.getTime() >= today.getTime() + if (isFresh) continue + try { + const res = await api.getDevicesProp({ did: d.did, siid: d.battSiid, piid: d.battPiid }) + if (res && Number(res.code) === 0 && typeof res.value === 'number') { + await prisma.mihomeDevice.update({ + where: { id: d.id }, + data: { battery: Math.round(res.value), batteryAt: new Date() }, + }) + } + } catch (e) { + // 电量读不到不报错, 下次再试 + } + } +} + +// ==================== 日聚合 ==================== + +// 按日档重算: 读该上海日小时内档 -> avg/min/max + 最后一次值 +export async function aggregateDay(device, dayDate) { + const start = dayStart(dayDate.getTime()) + const end = addDays(start, 1) + const hours = await prisma.mihomeEnvHour.findMany({ + where: { deviceId: device.id, hour: { gte: start, lt: end } }, + orderBy: { hour: 'asc' }, + }) + if (hours.length === 0) return false + const temps = hours.filter((h) => h.temperatureAvg != null).map((h) => h.temperatureAvg) + const hums = hours.filter((h) => h.humidityAvg != null).map((h) => h.humidityAvg) + const last = hours[hours.length - 1] + const avg = (arr) => (arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : null) + const allVendor = hours.every((h) => h.raw && h.raw.vendor === true) + await prisma.mihomeEnvSample.upsert({ + where: { deviceId_date: { deviceId: device.id, date: start } }, + create: { + deviceId: device.id, + date: start, + temperature: temps.length ? temps[temps.length - 1] : null, + humidity: hums.length ? hums[hums.length - 1] : null, + temperatureAvg: round2(avg(temps)), + humidityAvg: round2(avg(hums)), + temperatureMin: round2(temps.length ? Math.min(...temps) : null), + temperatureMax: round2(temps.length ? Math.max(...temps) : null), + humidityMin: round2(hums.length ? Math.min(...hums) : null), + humidityMax: round2(hums.length ? Math.max(...hums) : null), + origin: allVendor ? 'vendor_history' : 'live', + sampledAt: last.hour, + raw: { bucketCount: hours.length }, + }, + update: { + temperature: temps.length ? temps[temps.length - 1] : null, + humidity: hums.length ? hums[hums.length - 1] : null, + temperatureAvg: round2(avg(temps)), + humidityAvg: round2(avg(hums)), + temperatureMin: round2(temps.length ? Math.min(...temps) : null), + temperatureMax: round2(temps.length ? Math.max(...temps) : null), + humidityMin: round2(hums.length ? Math.min(...hums) : null), + humidityMax: round2(hums.length ? Math.max(...hums) : null), + origin: allVendor ? 'vendor_history' : 'live', + sampledAt: last.hour, + }, + }) + return true +} + +// 补聚合缺口日: [since, today) 有小时档却没有日档的日子 +export async function aggregateGapDays(device, since) { + const today = dayStart() + const existing = await prisma.mihomeEnvSample.findMany({ + where: { deviceId: device.id, date: { gte: since, lt: today } }, + select: { date: true }, + }) + const have = new Set(existing.map((s) => s.date.getTime())) + let agg = 0 + for (let t = since.getTime(); t < today.getTime(); t += 86400000) { + if (!have.has(t)) { + const ok = await aggregateDay(device, new Date(t)) + if (ok) agg++ + } + } + return agg +} + +// ==================== 对外入口 ==================== + +// 每次同步: 发现 + 当前小时采样 + 今天/昨天聚合 + 电量 (轻量, 每小时跑) +// 注意: 单独不包 withLock, 由 syncNow/dailyMaintenance 统一加锁, 避免嵌套自锁 +async function syncLocked() { + const auth = await checkAuth() + if (auth.status !== 'ok') throw new MihomeAuthError(auth.lastError || '米家未授权或已过期') + const began = Date.now() + const homes = await syncHomes() + const devices = await syncDevices() + const kept = await listEnabledDevices() + const sampled = await sampleHour(kept) + await refreshBattery(kept) + // 今天 + 昨天都聚合 (保证 00 点边界不丢) + const nowMs = Date.now() + const today = dayStart(nowMs) + let agg = 0 + for (const d of kept) { + if (await aggregateDay(d, today)) agg++ + const y = addDays(today, -1) + if (await aggregateDay(d, y)) agg++ + } + return { + ok: true, + homes, + devices, + sampled, + aggregated: agg, + ms: Date.now() - began, + } +} + +export function syncNow() { + return withLock(syncLocked) +} + +// 每日维护: 轻量同步 + vendor 补齐历史缺口 (45 天窗口) + 缺口日聚合 +export function dailyMaintenance() { + return withLock(async () => { + const r = await syncLocked() + const auth = await checkAuth() + if (auth.status !== 'ok') throw new MihomeAuthError(auth.lastError || '米家未授权或已过期') + const since = addDays(dayStart(), -BACKFILL_DAYS) + const devices = await listEnabledDevices() + let hFilled = 0 + let dFilled = 0 + let agg = 0 + for (const d of devices) { + hFilled += await vendorStats.fillHourGaps(d, since) + dFilled += await vendorStats.fillDayGaps(d, since) + agg += await aggregateGapDays(d, since) + } + return { ...r, vendorHours: hFilled, vendorDays: dFilled, gapAggregated: agg } + }) +} \ No newline at end of file diff --git a/server/mihome/history.js b/server/mihome/history.js new file mode 100644 index 0000000..cf0d00d --- /dev/null +++ b/server/mihome/history.js @@ -0,0 +1,142 @@ +// 历史查询聚合: today(时) / month(天) / year(周) +// 响应统一: [{ t(桶起始 ms, Asia/Shanghai), temperature, temperatureAvg, temperatureMin, temperatureMax, +// humidity, humidityAvg, humidityMin, humidityMax, sampleCount?, missing? }] +import { prisma } from '../db.js' +import { dayStart, hourStart, monthStart, yearStart, weekStart, addDays, addHours, cnDateStr } from './time.js' + +// 设备是否存在 (路由层校验) +export async function getDevice(did) { + return prisma.mihomeDevice.findUnique({ where: { did } }) +} + +// ---------- 当天逐小时 ---------- +export async function todayBuckets(device) { + const start = dayStart() + const now = hourStart() + const rows = await prisma.mihomeEnvHour.findMany({ + where: { deviceId: device.id, hour: { gte: start, lt: addDays(start, 1) } }, + orderBy: { hour: 'asc' }, + }) + const byHour = new Map(rows.map((r) => [r.hour.getTime(), r])) + const out = [] + for (let t = start.getTime(); t <= now.getTime(); t += 3600000) { + const r = byHour.get(t) + out.push({ + t, + temperature: r?.temperatureAvg ?? null, + humidity: r?.humidityAvg ?? null, + sampleCount: r ? 1 : 0, + }) + } + return out +} + +// ---------- 当前月逐日 ---------- +export async function monthBuckets(device) { + const start = monthStart() + const today = dayStart() + const end = addDays(today, 1) + const rows = await prisma.mihomeEnvSample.findMany({ + where: { deviceId: device.id, date: { gte: start, lt: end } }, + orderBy: { date: 'asc' }, + }) + const byDay = new Map(rows.map((r) => [r.date.getTime(), r])) + const out = [] + for (let t = start.getTime(); t < end.getTime(); t += 86400000) { + const r = byDay.get(t) + out.push(r + ? { + t, + temperature: r.temperature, + temperatureAvg: r.temperatureAvg, + temperatureMin: r.temperatureMin, + temperatureMax: r.temperatureMax, + humidity: r.humidity, + humidityAvg: r.humidityAvg, + humidityMin: r.humidityMin, + humidityMax: r.humidityMax, + origin: r.origin, + sampleCount: 1, + } + : { t, sampleCount: 0, missing: true }) + } + return out +} + +// ---------- 当前年逐周 (按日档现场聚合, 不落库) ---------- +export async function yearBuckets(device) { + const start = yearStart() + const today = dayStart() + const end = addDays(today, 1) + const rows = await prisma.mihomeEnvSample.findMany({ + where: { deviceId: device.id, date: { gte: start, lt: end } }, + orderBy: { date: 'asc' }, + }) + // 日 -> 周 (上海周一为一周起点) + const weekOf = (dayStartMs) => weekStart(new Date(dayStartMs)).getTime() + const weeks = new Map() // weekStartMs -> { tempA: [], tempMin: [], tempMax: [], humA: [], humMin: [], humMax: [], days: [] } + for (const r of rows) { + const k = weekOf(r.date.getTime()) + if (!weeks.has(k)) { + weeks.set(k, { tempA: [], tempMin: [], tempMax: [], humA: [], humMin: [], humMax: [], days: [] }) + } + const w = weeks.get(k) + if (r.temperatureAvg != null) w.tempA.push(r.temperatureAvg) + if (r.temperatureMin != null) w.tempMin.push(r.temperatureMin) + if (r.temperatureMax != null) w.tempMax.push(r.temperatureMax) + if (r.humidityAvg != null) w.humA.push(r.humidityAvg) + if (r.humidityMin != null) w.humMin.push(r.humidityMin) + if (r.humidityMax != null) w.humMax.push(r.humidityMax) + w.days.push(r.date) + } + const avg = (a) => (a.length ? a.reduce((x, y) => x + y, 0) / a.length : null) + const out = [] + for (const [k, w] of [...weeks.entries()].sort((a, b) => a[0] - b[0])) { + // 补齐周内缺的天数 (统计无数据的日算缺失) + const wkStart = new Date(k) + const missing = addDays(wkStart, 7) + const haveMap = new Set(w.days.map((d) => d.getTime())) + let missingDays = 0 + for (let t = k; t < missing.getTime(); t += 86400000) { + // 只统计当年/到今天的日 + if (t >= start.getTime() && t < end.getTime() && !haveMap.has(t)) missingDays++ + } + out.push({ + t: k, + label: cnDateStr(wkStart).slice(5) + '~' + cnDateStr(addDays(wkStart, 6)).slice(5), + temperatureAvg: avg(w.tempA), + temperatureMin: w.tempMin.length ? Math.min(...w.tempMin) : null, + temperatureMax: w.tempMax.length ? Math.max(...w.tempMax) : null, + humidityAvg: avg(w.humA), + humidityMin: w.humMin.length ? Math.min(...w.humMin) : null, + humidityMax: w.humMax.length ? Math.max(...w.humMax) : null, + sampleCount: w.days.length, + missingDays, + }) + } + return out +} + +// ---------- 设备概览 (状态页用): 最新样本 + 近 30 天缺日列表 ---------- +export async function deviceOverview(device) { + const latest = await prisma.mihomeEnvSample.findFirst({ + where: { deviceId: device.id }, + orderBy: { date: 'desc' }, + }) + // 近 30 天 (含今天) 缺少样本的上海日 + const start = addDays(dayStart(), -29) + const end = addDays(dayStart(), 1) + const have = await prisma.mihomeEnvSample.findMany({ + where: { deviceId: device.id, date: { gte: start, lt: end } }, + select: { date: true }, + }) + const haveSet = new Set(have.map((h) => h.date.getTime())) + const missingDays = [] + for (let t = start.getTime(); t < end.getTime(); t += 86400000) { + if (!haveSet.has(t)) missingDays.push(cnDateStr(new Date(t))) + } + return { + latest, + missingDays, + } +} \ No newline at end of file diff --git a/server/mihome/index.js b/server/mihome/index.js new file mode 100644 index 0000000..db6fa36 --- /dev/null +++ b/server/mihome/index.js @@ -0,0 +1,72 @@ +// server/mihome 模块入口: 汇总导出采集/认证/查询, 并提供 /status 聚合 +import { prisma } from '../db.js' +import * as vendorStats from './vendorStats.js' +import * as history from './history.js' +import * as auth from './client.js' + +export { checkAuth, startQrLogin, cancelQrLogin, getQrState, getQrImageUrl, MihomeAuthError } from './client.js' +export { syncNow, dailyMaintenance } from './collector.js' +export { getDevice, todayBuckets, monthBuckets, yearBuckets, deviceOverview } from './history.js' +export { getSpec, ENV_MODELS } from './specs.js' + +// GET /api/mihome/status 聚合: 授权 + 家庭(设备) + 统计可用性 + 每设备概览(电量/最新/缺日) +// force=true 跳过 5 分钟认证缓存强查一次 (用户主动打开页面/刷新时用) +export async function getStatus(force = false) { + const authState = await auth.checkAuth(force) + const [homes, devices, account] = await Promise.all([ + prisma.mihomeHome.findMany({ orderBy: { id: 'asc' } }), + prisma.mihomeDevice.findMany({ orderBy: { id: 'asc' } }), + prisma.mihomeAccount.findUnique({ where: { key: 'default' } }), + ]) + + const overviews = await Promise.all( + devices.map(async (d) => { + const ov = await history.deviceOverview(d) + return { + did: d.did, + latest: ov.latest, + missingDays: ov.missingDays, + } + }) + ) + const perDevice = new Map(overviews.map((o) => [o.did, o])) + + // 统计可用性 (探测过的型号才有值, 未探测 undefined) + const capability = {} + for (const d of devices) { + const v = vendorStats.capabilityOf(d.model) + if (v !== undefined) capability[d.model] = v + } + + const homeList = homes.map((h) => ({ + homeId: h.homeId, + name: h.name, + devices: devices + .filter((d) => d.homeId === h.homeId) + .map((d) => ({ + did: d.did, + model: d.model, + name: d.name, + alias: d.alias, + title: d.alias || d.name, + battery: d.battery, + batteryAt: d.batteryAt, + lastSyncAt: d.lastSyncAt, + latest: perDevice.get(d.did)?.latest ?? null, + missingDays: perDevice.get(d.did)?.missingDays ?? [], + })), + })) + + // 以实时探测结果为准: DB 里的 status 只在实时探测还是 unknown 时兜底, + // 否则过期后残留的 ok 会把「已失效」遮掉, 前端永远不出重新授权横幅. + const liveUnknown = !authState.status || authState.status === 'unknown' + return { + auth: { + status: liveUnknown ? account?.status || 'unknown' : authState.status, + lastError: (liveUnknown ? account?.lastError : authState.lastError) || '', + checkedAt: authState.checkedAt, + }, + capability, + homes: homeList, + } +} \ No newline at end of file diff --git a/server/mihome/scheduler.js b/server/mihome/scheduler.js new file mode 100644 index 0000000..11d7d4a --- /dev/null +++ b/server/mihome/scheduler.js @@ -0,0 +1,38 @@ +// 米家环境监控定时调度 +// 独立于 server/cron.js 注册: 容器镜像不含 scripts/, 旧 cron.js 顶层 import 脚本模块会整体加载失败, +// 故米家节拍不依赖它, 由 server/index.js 单独加载本模块, 确保采样/聚合在部署环境一定生效。 +import cron from 'node-cron' +import * as mihome from './index.js' + +export function registerMihomeScheduler() { + cron.schedule('5 * * * *', async () => { + console.log('[cron] 米家小时采样触发 @ 上海 xx:05') + try { + const r = await mihome.syncNow() + console.log('[cron] 米家采样完成: 家庭=' + r.homes + ' 设备=' + r.devices + ' 采样=' + r.sampled + ' 聚合=' + r.aggregated + ' (' + r.ms + 'ms)') + } catch (e) { + console.error('[cron] 米家小时采样失败:', e.message) + } + }, { timezone: 'Asia/Shanghai' }) + console.log('[cron] 已注册: 每小时 xx:05 米家温湿度采样') + + cron.schedule('5 0,3 * * *', async () => { + console.log('[cron] 米家每日维护触发 (00:05 / 03:05)') + try { + const r = await mihome.dailyMaintenance() + console.log('[cron] 米家聚合完成: 采样=' + r.sampled + ' 聚合=' + r.aggregated + + ' vendor小时=' + r.vendorHours + ' vendor天=' + r.vendorDays + ' 缺口聚合=' + r.gapAggregated) + } catch (e) { + console.error('[cron] 米家每日维护失败:', e.message) + } + }, { timezone: 'Asia/Shanghai' }) + console.log('[cron] 已注册: 每天 00:05/03:05 米家日聚合 + vendor 补齐') + + // 启动追赶: 服务重启/停机恢复后立即补一次 (不打断 5 分钟内的整点采样) + setTimeout(() => { + mihome.dailyMaintenance().catch((e) => console.error('[cron] 米家启动追赶失败:', e.message)) + }, 8000) + console.log('[cron] 已注册: 启动后 8s 执行米家追赶同步') +} + +registerMihomeScheduler() \ No newline at end of file diff --git a/server/mihome/specs.js b/server/mihome/specs.js new file mode 100644 index 0000000..74a54c1 --- /dev/null +++ b/server/mihome/specs.js @@ -0,0 +1,26 @@ +// 环境设备白名单: 型号 -> 属性定义 (siid.piid), 均为调研阶段实测确认 +// - temp/hum: 采集用; batt: 电量 (每天读一次, 标题展示) +// - vendorStats: 是否已实测该型号支持 /v2/user/statistics 云端聚合历史 +export const ENV_MODELS = { + // 炎米智能温湿度计: 实测 stat_hour_v3/stat_day_v3 可用, 回溯到接入米家日 + 'ym001.sensor_ht.ymwsdj': { + temp: [2, 1001], + hum: [2, 1002], + batt: [3, 1003], + vendorStats: true, + }, + // 青萍蓝牙闹钟: 云端统计返回 -8 invalid params (未开通), 只走实时采样 + 'cgllc.clock.dove': { + temp: [2, 1], + hum: [2, 2], + batt: [2, 3], + vendorStats: false, + }, +} + +export function getSpec(model) { + return ENV_MODELS[model] || null +} + +export const XIAOMI_APP_UA = + 'APP/com.xiaomi.mihome APPV/6.0.89 Channel/MI-COM-BD-00059-00 OSVersion/MIUI-12.0.1 Android/28' \ No newline at end of file diff --git a/server/mihome/time.js b/server/mihome/time.js new file mode 100644 index 0000000..84666eb --- /dev/null +++ b/server/mihome/time.js @@ -0,0 +1,78 @@ +// Asia/Shanghai 时区工具 (中国无夏令时, 固定 +08:00) +// 桶语义: 小时档/日档桶的 \"边界时刻\" 都按上海时区对齐, 存储统一存 UTC (Date) +const OFFSET_MS = 8 * 3600 * 1000 + +// 把时刻按上海时区拆成 \"假装 UTC 的本地部件\" +function cnParts(ts) { + const d = new Date(ts + OFFSET_MS) + return { + y: d.getUTCFullYear(), + mo: d.getUTCMonth() + 1, + da: d.getUTCDate(), + h: d.getUTCHours(), + min: d.getUTCMinutes(), + sec: d.getUTCSeconds(), + dow: d.getUTCDay(), // 0=Sun + } +} + +// 上海当日 00:00 (返回对应 UTC 时刻的 Date) +export function dayStart(ts = Date.now()) { + const p = cnParts(ts) + return new Date(Date.UTC(p.y, p.mo - 1, p.da) - OFFSET_MS) +} + +// 上海整点 (返回对应 UTC 时刻的 Date) +export function hourStart(ts = Date.now()) { + const p = cnParts(ts) + return new Date(Date.UTC(p.y, p.mo - 1, p.da, p.h) - OFFSET_MS) +} + +// 上海当周起始 (周一 00:00) +export function weekStart(date) { + const dow = cnParts(date.getTime()).dow + const diff = dow === 0 ? 6 : dow - 1 // 距周一的天数 + return addDays(dayStart(date.getTime()), -diff) +} + +export function addDays(date, n) { + return new Date(date.getTime() + n * 86400000) +} + +// 上海当月 1 号 00:00 +export function monthStart(ts = Date.now()) { + const p = cnParts(ts) + return new Date(Date.UTC(p.y, p.mo - 1, 1) - OFFSET_MS) +} + +// 上海当年 1 月 1 日 00:00 +export function yearStart(ts = Date.now()) { + const p = cnParts(ts) + return new Date(Date.UTC(p.y, 0, 1) - OFFSET_MS) +} + +export function addHours(date, n) { + return new Date(date.getTime() + n * 3600000) +} + +// 上海本地 \"YYYY-MM-DD\" +export function cnDateStr(date) { + const p = cnParts(date.getTime()) + return `${p.y}-${String(p.mo).padStart(2, '0')}-${String(p.da).padStart(2, '0')}` +} + +// 上海本地 \"HH:mm\" +export function cnTimeStr(date) { + const p = cnParts(date.getTime()) + return `${String(p.h).padStart(2, '0')}:${String(p.min).padStart(2, '0')}` +} + +// 上海本地 \"YYYY-MM-DD HH:mm\" (用于日志) +export function cnFullStr(date) { + return `${cnDateStr(date)} ${cnTimeStr(date)}` +} + +// 判断两个日期是否同一上海日 +export function sameCnDay(a, b) { + return dayStart(a.getTime()).getTime() === dayStart(b.getTime()).getTime() +} \ No newline at end of file diff --git a/server/mihome/vendorStats.js b/server/mihome/vendorStats.js new file mode 100644 index 0000000..23709c9 --- /dev/null +++ b/server/mihome/vendorStats.js @@ -0,0 +1,179 @@ +// /v2/user/statistics 云端聚合历史: 探测可用性 + 小时/日缺口回填 +// 实测: 炎米 ym001 可用 (stat_hour_v3/stat_day_v3/stat_month_v3); 青萍/VRF 返回 -8 invalid params +import { prisma } from '../db.js' +import { getApi } from './client.js' +import { dayStart, hourStart, addDays, addHours } from './time.js' +import { getSpec } from './specs.js' + +// 型号 -> 是否支持统计 (探测一次后缓存; undefined=未探测) +const capabilityCache = new Map() + +export function capabilityOf(model) { + if (capabilityCache.has(model)) return capabilityCache.get(model) + return undefined +} + +// 用同型号任一设备探测该型号统计可用性 +async function ensureCapability(device) { + if (capabilityCache.has(device.model)) return capabilityCache.get(device.model) + let supported = false + try { + const api = getApi() + const res = await api.getStatistics({ + did: device.did, + key: `${device.tempSiid}.${device.tempPiid}`, + data_type: 'stat_day_v3', + limit: 1, + time_start: Math.floor(Date.now() / 1000) - 86400, + time_end: Math.floor(Date.now() / 1000), + }) + supported = Array.isArray(res) + } catch (e) { + supported = false + } + capabilityCache.set(device.model, supported) + console.log(`[mihome] 统计探测 ${device.model}: ${supported ? '可用' : '不可用'}`) + return supported +} + +// 解析 "[28.8]" / "[28.1,29.200001]" -> [28.8, 29.2] +function parseStatValue(value) { + if (typeof value !== 'string') return [] + const m = value.match(/\[([^\]]*)\]/) + if (!m) return [] + return m[1] + .split(',') + .map((s) => parseFloat(s.trim())) + .filter((n) => Number.isFinite(n)) +} + +// 拉某设备某属性的小时均值序列 (stat_hour_v3), 默认带排序 +async function fetchStatHours(device, key, fromTs, toTs) { + const api = getApi() + const res = await api.getStatistics({ + did: device.did, + key, + data_type: 'stat_hour_v3', + limit: 2000, + time_start: fromTs, + time_end: toTs, + }) + if (!Array.isArray(res)) return [] + return res + .filter((r) => r && r.time) + .sort((a, b) => a.time - b.time) + .map((r) => ({ time: new Date(r.time * 1000), values: parseStatValue(r.value) })) +} + +// 回填小时缺口: 查 [since, now) 内缺失的整点桶, 从云端补齐 (origin 标记 raw.vendor=true) +// 返回新增小时桶数量 +export async function fillHourGaps(device, since) { + if (!(await ensureCapability(device))) return 0 + const now = hourStart() + if (since >= now) return 0 + + const existing = await prisma.mihomeEnvHour.findMany({ + where: { + deviceId: device.id, + hour: { gte: since, lte: addHours(now, -1) }, + }, + select: { hour: true }, + }) + const have = new Set(existing.map((h) => h.hour.getTime())) + + // 实际缺失桶数 + let missingCount = 0 + for (let t = since.getTime(); t <= addHours(now, -1).getTime(); t += 3600000) { + if (!have.has(t)) missingCount++ + } + if (missingCount === 0) return 0 + + const fromTs = Math.floor(since.getTime() / 1000) + const toTs = Math.floor(now.getTime() / 1000) + let filled = 0 + + for (const [siid, piid, col, num] of [ + [device.tempSiid, device.tempPiid, 'temperatureAvg', 0], + [device.humSiid, device.humPiid, 'humidityAvg', 1], + ]) { + const rows = await fetchStatHours(device, `${siid}.${piid}`, fromTs, toTs) + for (const r of rows) { + const bucket = r.time.getTime() + if (r.values.length <= num || have.has(bucket) || bucket > now.getTime()) continue + // 只补严格已过去的整点 + have.add(bucket) + try { + await prisma.mihomeEnvHour.upsert({ + where: { deviceId_hour: { deviceId: device.id, hour: r.time } }, + create: { deviceId: device.id, hour: r.time, [col]: r.values[num], raw: { vendor: true } }, + update: { [col]: r.values[num], raw: { vendor: true } }, + }) + filled++ + } catch (e) { + if (e?.code !== 'P2002') throw e + } + } + } + if (filled > 0) console.log(`[mihome] vendor 补齐小时档 ${device.did}: +${filled}`) + return filled +} + +// 回填日缺口: 对仍无日档的日子, 若云端有日 [min,max] 则补一条 vendor_history +export async function fillDayGaps(device, since) { + if (!(await ensureCapability(device))) return 0 + const today = dayStart() + const existingSamples = await prisma.mihomeEnvSample.findMany({ + where: { deviceId: device.id, date: { gte: since, lt: today } }, + select: { date: true }, + }) + const haveDay = new Set(existingSamples.map((s) => s.date.getTime())) + + const fromTs = Math.floor(since.getTime() / 1000) + const toTs = Math.floor(Date.now() / 1000) + let filled = 0 + + for (const [siid, piid] of [ + [device.tempSiid, device.tempPiid], + [device.humSiid, device.humPiid], + ]) { + const api = getApi() + const res = await api.getStatistics({ + did: device.did, + key: `${siid}.${piid}`, + data_type: 'stat_day_v3', + limit: 120, + time_start: fromTs, + time_end: toTs, + }) + if (!Array.isArray(res)) continue + const isTemp = siid === device.tempSiid && piid === device.tempPiid + for (const r of res) { + if (!r || !r.time) continue + const day = new Date(r.time * 1000) + const vals = parseStatValue(r.value) + const bucket = dayStart(day.getTime()).getTime() + if (haveDay.has(bucket) || bucket >= today.getTime() || vals.length < 2) continue + haveDay.add(bucket) + const data = isTemp + ? { temperatureMin: vals[0], temperatureMax: vals[1] } + : { humidityMin: vals[0], humidityMax: vals[1] } + try { + await prisma.mihomeEnvSample.upsert({ + where: { deviceId_date: { deviceId: device.id, date: dayStart(day.getTime()) } }, + create: { + deviceId: device.id, + date: dayStart(day.getTime()), + origin: 'vendor_history', + ...data, + }, + update: { origin: 'vendor_history', ...data }, + }) + filled++ + } catch (e) { + if (e?.code !== 'P2002') throw e + } + } + } + if (filled > 0) console.log(`[mihome] vendor 补齐日档 ${device.did}: +${filled}`) + return filled +} \ No newline at end of file diff --git a/server/routes/mihome.js b/server/routes/mihome.js new file mode 100644 index 0000000..00dcca1 --- /dev/null +++ b/server/routes/mihome.js @@ -0,0 +1,94 @@ +// 环境监控 REST 路由: /api/mihome/* (authRequired) +import { Router } from 'express' +import { prisma } from '../db.js' +import { authRequired } from '../middleware.js' +import { + getStatus, + getDevice, + todayBuckets, + monthBuckets, + yearBuckets, + syncNow, + startQrLogin, + cancelQrLogin, + getQrState, + getQrImageUrl, + MihomeAuthError, +} from '../mihome/index.js' +import { XIAOMI_APP_UA } from '../mihome/specs.js' + +const router = Router() +router.use(authRequired) + +// 统一错误边界: 米家授权错误映射为 401, 其余走 500 +function guard(handler) { + return async (req, res, next) => { + try { + return await handler(req, res, next) + } catch (e) { + if (e instanceof MihomeAuthError) return res.status(401).json({ error: e.message }) + return next(e) + } + } +} + +// 授权状态 + 家庭/设备 + 概览 (电量/最新样本/缺失天数) +// force=1: 跳过后端 5 分钟认证缓存强查 (前端打开页面时用, 保证会话失效能立刻发现) +router.get('/status', guard(async (req, res) => { + res.json(await getStatus(req.query.force === '1')) +})) + +// 历史: range = today(默认) | month | year +router.get('/device/:did/history', guard(async (req, res) => { + const device = await getDevice(req.params.did) + if (!device) return res.status(404).json({ error: '设备不存在' }) + const range = req.query.range || 'today' + let buckets + if (range === 'month') buckets = await monthBuckets(device) + else if (range === 'year') buckets = await yearBuckets(device) + else buckets = await todayBuckets(device) + res.json({ did: device.did, range: range === 'today' ? 'today' : range, buckets }) +})) + +// 改别名 (可清空); alias 最长 24 字符 +router.put('/device/:did', guard(async (req, res) => { + const device = await getDevice(req.params.did) + if (!device) return res.status(404).json({ error: '设备不存在' }) + const alias = typeof req.body?.alias === 'string' ? req.body.alias.trim().slice(0, 24) : '' + const updated = await prisma.mihomeDevice.update({ where: { id: device.id }, data: { alias: alias || null } }) + res.json({ did: updated.did, alias: updated.alias || '' }) +})) + +// 立即同步一次 (小时采样 + 日聚合), 首页「立即同步」 +router.post('/sync', guard(async (_req, res) => { + res.json(await syncNow()) +})) + +// 重授权: 启动扫码 (幂等; 已在跑则返回当前状态) +router.post('/reauthorize', guard(async (_req, res) => { + res.json(await startQrLogin()) +})) + +// 扫码状态轮询 +router.get('/reauthorize/status', guard(async (_req, res) => { + res.json(getQrState()) +})) + +// 取消扫码 +router.post('/reauthorize/cancel', guard(async (_req, res) => { + res.json(cancelQrLogin()) +})) + +// 代理二维码图片 (带小米 UA, 避免被 CDN 拒) +router.get('/reauthorize/qr-image', guard(async (_req, res) => { + const url = getQrImageUrl() + if (!url) return res.status(404).json({ error: '暂无二维码' }) + const r = await fetch(url, { headers: { 'User-Agent': XIAOMI_APP_UA } }) + if (!r.ok) throw new Error('二维码拉取失败 ' + r.status) + const buf = Buffer.from(await r.arrayBuffer()) + res.set('Content-Type', r.headers.get('content-type') || 'image/png') + res.set('Cache-Control', 'no-store') + res.send(buf) +})) + +export default router \ No newline at end of file diff --git a/src/api/mihome.js b/src/api/mihome.js new file mode 100644 index 0000000..e7f58ef --- /dev/null +++ b/src/api/mihome.js @@ -0,0 +1,50 @@ +// 环境监控 API: 走后端 /api/mihome/* (凭证/token 不出前端) +import { api, getApiBase, getToken } from './client.js' + +// 状态: 授权 + 家庭(设备) + 电量 + 最新样本 + 缺日 + 统计可用性 +// force=true 让后端跳过 5 分钟认证缓存, 立刻回真实授权状态 +export async function getMihomeStatus(force) { + return api('/mihome/status' + (force ? '?force=1' : '')) +} + +// 历史: range = today | month | year +export async function getMihomeHistory(did, range) { + return api('/mihome/device/' + encodeURIComponent(did) + '/history?range=' + encodeURIComponent(range)) +} + +// 改别名 (alias 传空串 = 清空) +export async function setMihomeAlias(did, alias) { + return api('/mihome/device/' + encodeURIComponent(did), { method: 'PUT', body: { alias } }) +} + +// 立即同步 +export async function syncMihome() { + return api('/mihome/sync', { method: 'POST' }) +} + +// 重授权 +export async function startMihomeAuth() { + return api('/mihome/reauthorize', { method: 'POST' }) +} +export async function getMihomeAuthStatus() { + return api('/mihome/reauthorize/status') +} +export async function cancelMihomeAuth() { + return api('/mihome/reauthorize/cancel', { method: 'POST' }) +} + +// 二维码图片: 后端接口在 authRequired 后面, 而 无法带 Authorization 头, +// 直接塞地址会 401 (二维码位置一片空白). 这里用 fetch 带 JWT 取回二进制, 再转 blob URL 给 . +export async function fetchMihomeQrImage() { + const token = getToken() + const res = await fetch(getApiBase() + '/api/mihome/reauthorize/qr-image', { + headers: token ? { Authorization: 'Bearer ' + token } : {}, + cache: 'no-store', + }) + if (!res.ok) { + const data = await res.json().catch(() => ({})) + throw new Error(data.error || '二维码加载失败 (' + res.status + ')') + } + const blob = await res.blob() + return URL.createObjectURL(blob) +} \ No newline at end of file diff --git a/src/api/ota.js b/src/api/ota.js index f645a12..a6d2601 100644 --- a/src/api/ota.js +++ b/src/api/ota.js @@ -8,7 +8,7 @@ import { getApiBase, getToken } from './client.js' import { APP_VERSION, BUILD_ID } from '../version.js' -// 判断是否在 Tauri WebView 内 (与 src/debug/pagespy.js 同样的判定) +// 判断是否在 Tauri WebView 内 (有 __TAURI_INTERNALS__ 即 Tauri 环境) const inTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window // 拼接绝对 URL: 在 Tauri (VITE_API_BASE 有值) 时直连, 否则同源 diff --git a/src/debug/pagespy.js b/src/debug/pagespy.js deleted file mode 100644 index c30b7ca..0000000 --- a/src/debug/pagespy.js +++ /dev/null @@ -1,21 +0,0 @@ -// 仅在 Tauri WebView 内启用 PageSpy, 用于生产环境远程调试. -// web 模式 (Vite dev / 浏览器) 通过检测 window.__TAURI_INTERNALS__ 直接跳过, -// 配合 dynamic import 让 page-spy 这个 chunk 在 web 模式下完全不下载. -// VITE_PAGESPY_API 留空可关闭连接 (例如本地调试不想连远端 PageSpy 服务时). -// 加载失败不阻塞应用启动, 仅 console.warn 提示. - -const PAGESPY_API = import.meta.env.VITE_PAGESPY_API || 'http://bh.vps.honor3.com:6752' -const inTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window - -if (inTauri && PAGESPY_API) { - // 动态 import: 仅在 Tauri 内才下载 page-spy chunk - import('@huolala-tech/page-spy') - .then(({ default: PageSpy }) => { - // PageSpy 默认会 hook fetch / XMLHttpRequest, 自动抓取网络请求和错误 - const instance = new PageSpy({ api: PAGESPY_API }) - window.__IBOARD_PAGESPY__ = instance - }) - .catch((err) => { - console.warn('[PageSpy] init failed:', err) - }) -} \ No newline at end of file diff --git a/src/main.jsx b/src/main.jsx index 3d75afe..9c168f4 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,28 +1,25 @@ -// 远程调试: 仅在 Tauri WebView 内启用, web 模式自动跳过 -import './debug/pagespy.js' - -// 移动端 UI 框架: 全局样式 + 主题 (antd-mobile 5) -import 'antd-mobile/es/global' - -import React from 'react' -import ReactDOM from 'react-dom/client' -import { BrowserRouter } from 'react-router-dom' -import App from './App.jsx' -import { AuthProvider } from './auth/AuthContext.jsx' -import { initOta } from './api/ota.js' -import './styles/globals.css' - -// OTA 启动: 仅 Tauri 内生效 -// - notifyReady: 确认当前资源可用, 否则下次启动自动回滚 (hotswap 插件行为) -// - 异步执行, 不阻塞 React 挂载 -initOta() - -ReactDOM.createRoot(document.getElementById('root')).render( - - - - - - - , +// 移动端 UI 框架: 全局样式 + 主题 (antd-mobile 5) +import 'antd-mobile/es/global' + +import React from 'react' +import ReactDOM from 'react-dom/client' +import { BrowserRouter } from 'react-router-dom' +import App from './App.jsx' +import { AuthProvider } from './auth/AuthContext.jsx' +import { initOta } from './api/ota.js' +import './styles/globals.css' + +// OTA 启动: 仅 Tauri 内生效 +// - notifyReady: 确认当前资源可用, 否则下次启动自动回滚 (hotswap 插件行为) +// - 异步执行, 不阻塞 React 挂载 +initOta() + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + + + + , ) diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index 4d15280..387e587 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -45,7 +45,7 @@ export default function HomePage() { return (
- 首页 +
diff --git a/src/pages/MacroPage.jsx b/src/pages/MacroPage.jsx index de329b6..7bdc27b 100644 --- a/src/pages/MacroPage.jsx +++ b/src/pages/MacroPage.jsx @@ -1,5 +1,6 @@ import { useState } from 'react' import { useNavigate, useLocation, Routes, Route, Navigate } from 'react-router-dom' +import { NavBar } from 'antd-mobile' import SwipeTabs from '../components/SwipeTabs.jsx' import DataView from './macro/DataView.jsx' import StrategyView from './macro/StrategyView.jsx' @@ -64,7 +65,8 @@ export default function MacroPage() { } return ( -
+
+
) diff --git a/src/pages/MePage.jsx b/src/pages/MePage.jsx index 2cd49c3..b393c50 100644 --- a/src/pages/MePage.jsx +++ b/src/pages/MePage.jsx @@ -111,7 +111,7 @@ export default function MePage() { return (
- 我的 +
}, { key: 'services', label: '服务监控', render: () => }, + { key: 'env', label: '环境监控', render: () => }, ] return (
- 监控 +
diff --git a/src/pages/monitor/EnvView.jsx b/src/pages/monitor/EnvView.jsx new file mode 100644 index 0000000..eb42649 --- /dev/null +++ b/src/pages/monitor/EnvView.jsx @@ -0,0 +1,369 @@ +// 环境监控: 米家温湿度长期记录 +// - 顶部: 授权横幅(重新授权弹窗) + 立即同步 +// - 家庭: Collapse 手风琴, 一次只展开一个家庭 +// - 设备卡片: 标题=别名+电量, 概览+缺N天, Segmented 今天/月/年 图表 +import { useEffect, useState, useRef, useCallback } from 'react' +import { + Collapse, Popup, Dialog, Toast, Empty, DotLoading, Segmented, Button, Card, Input, +} from 'antd-mobile' +import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts' +import { + getMihomeStatus, getMihomeHistory, setMihomeAlias, syncMihome, + startMihomeAuth, getMihomeAuthStatus, cancelMihomeAuth, fetchMihomeQrImage, +} from '../../api/mihome.js' +import useRefreshOnVisible from '../../hooks/useRefreshOnVisible.js' + +const RANGE_OPTIONS = [ + { label: '今天', value: 'today' }, + { label: '月', value: 'month' }, + { label: '年', value: 'year' }, +] + +const round1 = (v) => (v === null || v === undefined ? null : Math.round(Number(v) * 10) / 10) +const pad = (n) => String(n).padStart(2, '0') +// 网络类失败: 不能据此断定米家授权失效 +const NETWORK_ERR_RE = /fetch failed|network|ECONN|ETIMEDOUT|timeout|socket|getaddrinfo|ENOTFOUND|aborted/i + +export default function EnvView() { + const [status, setStatus] = useState(null) + const [err, setErr] = useState('') + const [syncing, setSyncing] = useState(false) + const [refreshTick, setRefreshTick] = useState(0) + const [qrOpen, setQrOpen] = useState(false) + const autoPromptedRef = useRef(false) + + // 依赖必须为空: 之前依赖 [status] 而成功回调又 setStatus(...), 每次响应都会换掉 load, + // 触发 effect 重新执行 -> 无限重复请求 /status. 首屏/重试用 force 强查, 定时轮询走缓存. + const load = useCallback((silent) => { + if (!silent) setErr('') + getMihomeStatus(!silent) + .then((d) => { setStatus(d); setErr('') }) + .catch((e) => { + if (silent) return + setErr(e.message) + setStatus((prev) => prev || { auth: { status: 'expired' }, homes: [] }) + }) + }, []) + + useEffect(() => { + load(false) + const timer = setInterval(() => load(true), 60000) + return () => clearInterval(timer) + }, [load]) + useRefreshOnVisible(() => load(true)) + + // 会话失效时直接把扫码弹窗弹出来 (每次挂载只自动弹一次, 用户取消后不再骚扰). + // 网络抖动也会让后端判成 expired, 这类错误不自动弹, 只留横幅提示, 避免误弹. + useEffect(() => { + if (autoPromptedRef.current) return + if (status?.auth?.status !== 'expired') return + if (NETWORK_ERR_RE.test(status.auth.lastError || '')) return + autoPromptedRef.current = true + setQrOpen(true) + }, [status]) + + const doSync = async () => { + setSyncing(true) + try { + await syncMihome() + Toast.show({ icon: 'success', content: '已同步' }) + setRefreshTick((x) => x + 1) + load(true) + } catch (e) { + Toast.show({ content: e.message }) + } finally { + setSyncing(false) + } + } + + const authOk = status?.auth?.status === 'ok' + const homes = status?.homes || [] + + return ( +
+ {!authOk && status && ( +
+ 米家授权{status.auth.status === 'expired' ? '已过期' : '待授权'},部分历史待补齐 + setQrOpen(true)}>重新授权 +
+ )} +
+ 每小时采样 · 数据永久保留 + +
+ {!status && !err &&
加载中...
} + {err && ( +
+ {err} + load(false)}>重试 +
+ )} + {status && homes.length === 0 && authOk && } + {status && homes.length > 0 && ( +
+ + {homes.map((h) => ( + + {h.name} + {h.devices.length ? h.devices.length + ' 台设备' : '无环境设备'} + + } + > + {h.devices.length === 0 ? ( + + ) : ( +
+ {h.devices.map((d) => ( + load(true)} /> + ))} +
+ )} +
+ ))} +
+
+ )} + + setQrOpen(false)} onOk={() => { setQrOpen(false); setRefreshTick((x) => x + 1); load(true) }} /> +
+ ) +} + +// 设备卡片: 标题=别名+电量 / 概览+缺N天 / 今天·月·年图表 +function DeviceCard({ device, refreshTick, onChanged }) { + const [range, setRange] = useState('today') + const [buckets, setBuckets] = useState(null) + const [loading, setLoading] = useState(false) + const [cerr, setCerr] = useState('') + + const load = useCallback((r) => { + setLoading(true); setCerr('') + getMihomeHistory(device.did, r) + .then((d) => { setBuckets(d.buckets || []); setCerr('') }) + .catch((e) => setCerr(e.message)) + .finally(() => setLoading(false)) + }, [device.did]) + + useEffect(() => { load(range) }, [range, refreshTick, load]) + + const missing = device.missingDays?.length || 0 + const latest = device.latest + const title = device.title || device.name + const batt = device.battery != null ? device.battery + '%' : null + + const editAlias = () => { + const input = { current: null } + const onOk = async () => { + const val = (input.current && input.current.nativeElement) ? input.current.nativeElement.value : '' + try { + await setMihomeAlias(device.did, val.trim()) + Toast.show({ icon: 'success', content: '已保存' }) + onChanged() + } catch (e) { + Toast.show({ content: e.message }) + } + } + let v = device.alias || device.name + Dialog.show({ + title: '编辑别名', + content: { input.current = el }} defaultValue={v} placeholder="别名(仅本应用展示)" />, + closeOnAction: true, + actions: [ + { key: 'cancel', text: '取消' }, + { key: 'ok', text: '保存', onClick: () => { onOk(); } }, + ], + }) + } + + return ( + +
+
+ {title} + {batt && 电量 {batt}} + 改别名 +
+ {missing > 0 && 缺 {missing} 天} +
+
+ {latest ? ( + <> + 温度 {latest.temperature != null ? round1(latest.temperature) + '℃' : '—'} + {latest.temperatureMin != null && {round1(latest.temperatureMin)}~{round1(latest.temperatureMax)}℃} + 湿度 {latest.humidity != null ? round1(latest.humidity) + '%' : '—'} + {latest.humidityMin != null && {round1(latest.humidityMin)}~{round1(latest.humidityMax)}%} + + ) : ( + 暂无样本(今天 {pad(new Date().getHours())}:00 起每小时采样) + )} +
+
+ setRange(v)} + /> +
+ {cerr &&
{cerr}
} + {!cerr && loading && buckets === null &&
} + {!cerr && buckets !== null && } +
+ ) +} + +// 图表: 温度/湿度双轴; 月/年加 min/max 淡虚线 +function EnvChart({ range, buckets }) { + if (!buckets.length) return
该视图暂无数据
+ const rows = buckets.map((b) => { + let x + let temp = round1(b.temperatureAvg ?? b.temperature) + let hum = round1(b.humidityAvg ?? b.humidity) + if (range === 'today') { + const d = new Date(b.t) + x = pad(d.getHours()) + ':00' + } else if (range === 'month') { + const d = new Date(b.t) + x = (d.getMonth() + 1) + '/' + d.getDate() + } else { + x = b.label || '' + } + return { + x, + temp, + hum, + tempMin: round1(b.temperatureMin), + tempMax: round1(b.temperatureMax), + humMin: round1(b.humidityMin), + humMax: round1(b.humidityMax), + sampleCount: b.sampleCount, + } + }) + const showBand = range === 'month' || range === 'year' + return ( +
+ + + + + + + + + + + {showBand && ( + <> + + + + + + )} + + +
+ ) +} + +// 重新授权弹窗: 服务端生成二维码, 3s 轮询直到 ok/failed +function AuthPopup({ open, onClose, onOk }) { + const [state, setState] = useState(null) + const timerRef = useRef(null) + const [imgUrl, setImgUrl] = useState('') + const imgSigRef = useRef('') + const imgUrlRef = useRef('') + + const stopPoll = () => { if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null } } + + const start = async () => { + stopPoll() + setState(null) + try { + await startMihomeAuth() + } catch (e) { + setState({ state: 'failed', lastError: e.message }) + return + } + const poll = () => { + getMihomeAuthStatus() + .then((s) => { + setState(s) + if (s.state === 'failed') { stopPoll(); return } + // done 只由真正登录成功置位; 轮询结束但没 done(用户取消/超时) 不能当成功 + if (!s.running && s.done) { stopPoll(); onOk() } + }) + .catch((e) => { stopPoll(); setState({ state: 'failed', lastError: e.message }) }) + } + poll() + timerRef.current = setInterval(poll, 3000) + } + + useEffect(() => { + if (open) start() + else { stopPoll(); setState(null) } + return stopPoll + }, [open]) + + // 二维码变化时才重新拉图 (轮询 3s 一次, 用字符串签名去重, 避免每轮都请求图片) + const qrSig = state?.state === 'waiting' ? state.qrImageUrl || '' : '' + useEffect(() => { + if (!qrSig) { + imgSigRef.current = '' + setImgUrl('') + return + } + if (qrSig === imgSigRef.current) return + imgSigRef.current = qrSig + let alive = true + setImgUrl('') + fetchMihomeQrImage() + .then((url) => { + if (!alive) { URL.revokeObjectURL(url); return } + if (imgUrlRef.current) URL.revokeObjectURL(imgUrlRef.current) + imgUrlRef.current = url + setImgUrl(url) + }) + .catch((e) => { + if (!alive) return + // 图片拉取失败就停轮询, 让用户点「刷新二维码」重来, 否则下一轮状态会把错误盖掉 + stopPoll() + setState({ state: 'failed', lastError: e.message }) + }) + return () => { alive = false } + }, [qrSig]) + + // 卸载时释放 blob, 防止内存泄漏 + useEffect(() => () => { if (imgUrlRef.current) URL.revokeObjectURL(imgUrlRef.current) }, []) + + const cancel = async () => { + try { await cancelMihomeAuth() } catch { /* ignore */ } + stopPoll() + onClose() + } + + const waiting = state?.state === 'waiting' && !!imgUrl + const loading = state?.state === 'waiting' && !imgUrl + const failed = state?.state === 'failed' + + return ( + +
+
米家扫码授权
+ {waiting ? ( + 扫码授权 + ) : ( +
{failed ? '扫码流程失败' : '正在生成二维码...'}
+ )} + {failed && state?.lastError &&
{state.lastError}
} +
打开米家 App → 我的 → 扫码登录,扫码后自动恢复
+
+ + +
+
+
+ ) +} \ No newline at end of file diff --git a/src/styles/globals.css b/src/styles/globals.css index dc61b04..a778ea9 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -67,8 +67,10 @@ input, textarea, select { font: inherit; } to { opacity: 1; transform: translateY(0); } } -/* 带有 antd-mobile NavBar 的页面 (Home/Monitor/Me/Article) */ -.page-with-navbar { display: flex; flex-direction: column; min-height: 100%; } +/* 带有 antd-mobile NavBar 的页面 (Home/Monitor/Macro/Article) */ +/* height:100% 让页面占满 app-main 高度, 内部 tab-content 独立滚动, + 头部 NavBar 与分类 tab 固定在顶部不上滚 */ +.page-with-navbar { display: flex; flex-direction: column; height: 100%; min-height: 0; } .page-with-navbar .adm-error-block { flex: 1; } /* 底部 antd-mobile TabBar 定位 */ @@ -92,7 +94,7 @@ input, textarea, select { font: inherit; } .swipe-tabs-wrap { display: flex; flex-direction: column; - height: 100%; + flex: 1 1 auto; min-height: 0; } .tab-content { @@ -209,7 +211,7 @@ input, textarea, select { font: inherit; } .me-logout { color: var(--color-danger); } .me-version { text-align: center; font-size: 12px; color: var(--color-muted); padding: 18px 0 8px; } /* 首页模块: 报警 + 新闻 */ -.home-content { padding: 0 0 16px; } +.home-content { padding: 0 0 16px; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; } .home-content .adm-tabs-content { --content-padding: 0; } .home-content .tab-label { display: inline-flex; align-items: center; gap: 4px; } .home-section { padding: 0 12px 16px; } @@ -238,7 +240,7 @@ input, textarea, select { font: inherit; } .news-content { font-size: 15px; line-height: 1.75; color: #333; white-space: pre-wrap; word-break: break-word; } .news-content-empty { margin-top: 12px; font-size: 12px; color: var(--color-muted); } /* ================== 监控页 ================== */ -.monitor-content { padding: 0 0 16px; } +.monitor-content { padding: 0 0 16px; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; } .monitor-content .adm-tabs-content { --content-padding: 0; } .monitor-tip { font-size: 11px; color: var(--color-muted); padding: 8px 14px 2px; } .monitor-loading { padding: 40px 0; text-align: center; color: var(--color-muted); font-size: 13px; } @@ -269,6 +271,42 @@ input, textarea, select { font: inherit; } .chart-title { font-size: 13px; font-weight: 600; color: var(--color-text); padding: 0 4px 6px; } .scroll-sentinel { text-align: center; padding: 14px 0 4px; color: var(--color-muted); font-size: 12px; } +/* ===== 环境监控 (米家温湿度) ===== */ +.env-view { padding-bottom: 16px; } +.env-auth-banner { + display: flex; justify-content: space-between; align-items: center; gap: 10px; + margin: 10px 12px 0; padding: 10px 14px; border-radius: 8px; + background: #fff7e6; color: #ad6800; font-size: 13px; +} +.env-auth-btn { color: var(--color-primary); font-weight: 600; cursor: pointer; flex-shrink: 0; } +.env-toolbar { display: flex; justify-content: space-between; align-items: center; gap: 8px; } +.env-homes { padding: 4px 12px 0; } +.env-homes .adm-collapse-panel-header { font-size: 14px; font-weight: 600; } +.env-home-title { display: inline-flex; align-items: center; gap: 8px; } +.env-home-count { font-size: 11px; font-weight: 400; color: var(--color-muted); } +.env-devices { display: flex; flex-direction: column; gap: 10px; padding-top: 2px; } +.env-device-card.adm-card { border-radius: 10px; margin: 0; } +.env-device-card .adm-card-body { padding: 12px; } +.env-device-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px; } +.env-device-title { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; } +.env-device-name { font-weight: 600; font-size: 15px; color: var(--color-text); } +.env-device-batt { font-size: 11px; color: var(--color-muted); border: 1px solid var(--color-border); padding: 1px 6px; border-radius: 10px; } +.env-device-edit { font-size: 11px; color: var(--color-primary); cursor: pointer; } +.env-missing-badge { flex-shrink: 0; font-size: 11px; color: #fff; background: #c0392b; border-radius: 10px; padding: 2px 8px; } +.env-device-meta { display: flex; flex-wrap: wrap; gap: 4px 14px; margin: 8px 0 10px; font-size: 13px; color: var(--color-text); } +.env-device-meta em { font-style: normal; color: var(--color-muted); font-size: 11px; } +.env-muted { color: var(--color-muted); font-size: 12px; } +.env-range { margin: 0 0 6px; } +.env-chart-loading, .env-chart-empty { padding: 30px 0; text-align: center; color: var(--color-muted); font-size: 12px; } +.env-chart-err { color: var(--color-danger); font-size: 12px; padding: 10px; } +.env-qr { text-align: center; } +.env-qr-title { font-size: 15px; font-weight: 600; margin-bottom: 12px; } +.env-qr-img { width: 200px; height: 200px; border-radius: 8px; border: 1px solid var(--color-border); } +.env-qr-wait { height: 200px; line-height: 200px; color: var(--color-muted); font-size: 13px; } +.env-qr-err { color: var(--color-danger); font-size: 12px; margin-top: 8px; } +.env-qr-tip { font-size: 12px; color: var(--color-muted); margin: 10px 0 14px; } +.env-qr-actions { display: flex; justify-content: center; gap: 12px; } + /* ================== OTA 升级区 (MePage) ================== */ .me-ota-actions {